Contract 0x6d506b2847df0c6f04d2628da1adaf4d8fb2e81b 1

 
Txn Hash Method
Index
From
To
Value
0x3b44f953c8ed1c09a6f94a0d052adec9ea23e23abeb48d8c4ee59c0a6262e29aExecute Transact...101246702022-06-02 0:42:28120 days 21 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0002709409880.001
0xa036a43ccdf2f9241625b2d2add47079c47ae9b7d7e41d2daee0de61d54d04acExecute Transact...101244382022-06-02 0:41:28120 days 21 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0003330069840.001
0x858ca039aed9b8a0b962f117214a38d834124b96e63aaeb2563c3df11eb9af92Confirm Transact...90008562022-05-25 22:54:28127 days 22 hrs ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0001919942550.001
0xef6acfb744b3a25650da96682a5129fcc5198f9dfd59bc94103e1ce66027fe67Confirm Transact...90008532022-05-25 22:54:11127 days 22 hrs ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0001919942550.001
0xdf6bc4d29d0082e415105b0f2f5d84b4b7f4b85fd85ffb8ab761a2339dce6ef8Submit Transacti...89471732022-05-25 2:58:28128 days 18 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0001653700450.001
0xed9881710f43ec6d2a5a7d3fa2de8dbefe195b26fbc76335f87abf30766e7ae1Submit Transacti...74262292022-05-09 2:32:28144 days 19 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0003716380510.001
0x067b88a4b780910434e1ab472656b6d3cb46a9d563f52bbc77690b01c24fb753Execute Transact...42149812022-03-07 19:51:52207 days 1 hr ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0002391885710.001
0xe907841da0ea725ec9ebea0aef021e96eaabe81b51d0af482cb284679dab0247Confirm Transact...40755792022-03-03 3:20:35211 days 18 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.00016654550.001
0x0fa08bcf80a63882ae9e429f1236574d94ac61e42cdac5dcf82e378103e64b87Submit Transacti...40695732022-03-02 21:36:17212 days 13 mins ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0009623474970.001
0x1974ba03c70b7c4f688a55814c3c402605419726d4c55a35347d049a86943f1aExecute Transact...39977442022-02-28 18:47:37214 days 3 hrs ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0003307732750.001
0x315d2cf81451f353676620cca576c21f1cf7c3f69963468dfd92aae8294bc36bConfirm Transact...38221982022-02-24 8:36:33218 days 13 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0002904423780.001
0x010206a921128b6ddd72b4bb08d72acfcea38f1b6dad5da2609c17dc22a28fc3Submit Transacti...38015132022-02-24 0:32:09218 days 21 hrs ago0x01ba2d1fc567074f18e75fe34b4fcda7330499e1 IN  0x: Exchange Proxy Governor0 Ether0.0007162830930.001
0xa697305ca75c6b57f595f4c1e3240cf659869a66a418874d620e6edd8be866c8Execute Transact...22102782022-01-11 9:26:13262 days 12 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0006952785440.001
0x5b85bb93bdaf804cc65dfacec0012e0889df49497e28d1b84ce11d504868434aSubmit Transacti...22102752022-01-11 9:20:58262 days 12 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0022336769350.001
0x4d194db63ca4b871eef16d6b7d650a6431d9d2a0abddb085b2d901fbda5e01f7Execute Transact...22098492022-01-11 9:02:00262 days 12 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0006581631650.001
0xc6c401290a1e0d3c7b9eaaf7de65e9b61dce3d18f2c0d309cd8fb1d6e47ad60eSubmit Transacti...22098002022-01-11 8:56:34262 days 12 hrs ago0x5a9d540a07a96a2bfc8a8dfd638359778c72526f IN  0x: Exchange Proxy Governor0 Ether0.0014739047750.001
0xe5820dc32928d5455f5335006a0f3f6212e890b875c401a85ac44d81a6a703b90x6080604014514622021-12-22 18:41:47282 days 3 hrs ago0x60908c4037cbb8f3aa040d9fb668ab36280eb871 IN  Create: ZeroExGovernor0 Ether0.0299942354240.001
[ Download CSV Export 
Latest 5 internal transactions
Parent Txn Hash Block From To Value
0x3b44f953c8ed1c09a6f94a0d052adec9ea23e23abeb48d8c4ee59c0a6262e29a101246702022-06-02 0:42:28120 days 21 hrs ago 0x: Exchange Proxy Governor 0x: Transformer Deployer0 Ether
0xa036a43ccdf2f9241625b2d2add47079c47ae9b7d7e41d2daee0de61d54d04ac101244382022-06-02 0:41:28120 days 21 hrs ago 0x: Exchange Proxy Governor 0x: Exchange Proxy Governor0 Ether
0xa036a43ccdf2f9241625b2d2add47079c47ae9b7d7e41d2daee0de61d54d04ac101244382022-06-02 0:41:28120 days 21 hrs ago 0x: Exchange Proxy Governor 0x: Transformer Deployer0 Ether
0xa036a43ccdf2f9241625b2d2add47079c47ae9b7d7e41d2daee0de61d54d04ac101244382022-06-02 0:41:28120 days 21 hrs ago 0x: Exchange Proxy Governor 0x: Transformer Deployer0 Ether
0xa036a43ccdf2f9241625b2d2add47079c47ae9b7d7e41d2daee0de61d54d04ac101244382022-06-02 0:41:28120 days 21 hrs ago 0x: Exchange Proxy Governor 0x: Transformer Deployer0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ZeroExGovernor

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
istanbul EvmVersion, Apache-2.0 license
File 1 of 11 : MultiSigWallet.sol
// solhint-disable
pragma solidity ^0.5.9;


/// @title Multisignature wallet - Allows multiple parties to agree on transactions before execution.
/// @author Stefan George - <[email protected]>
contract MultiSigWallet {

    /*
     *  Events
     */
    event Confirmation(address indexed sender, uint256 indexed transactionId);
    event Revocation(address indexed sender, uint256 indexed transactionId);
    event Submission(uint256 indexed transactionId);
    event Execution(uint256 indexed transactionId);
    event ExecutionFailure(uint256 indexed transactionId);
    event Deposit(address indexed sender, uint256 value);
    event OwnerAddition(address indexed owner);
    event OwnerRemoval(address indexed owner);
    event RequirementChange(uint256 required);

    /*
     *  Constants
     */
    uint256 constant public MAX_OWNER_COUNT = 50;

    /*
     *  Storage
     */
    mapping (uint256 => Transaction) public transactions;
    mapping (uint256 => mapping (address => bool)) public confirmations;
    mapping (address => bool) public isOwner;
    address[] public owners;
    uint256 public required;
    uint256 public transactionCount;

    struct Transaction {
        address destination;
        uint256 value;
        bytes data;
        bool executed;
    }

    /*
     *  Modifiers
     */
    modifier onlyWallet() {
        require(
            msg.sender == address(this),
            "ONLY_CALLABLE_BY_WALLET"
        );
        _;
    }

    modifier ownerDoesNotExist(address owner) {
        require(
            !isOwner[owner],
            "OWNER_EXISTS"
        );
        _;
    }

    modifier ownerExists(address owner) {
        require(
            isOwner[owner],
            "OWNER_DOESNT_EXIST"
        );
        _;
    }

    modifier transactionExists(uint256 transactionId) {
        require(
            transactions[transactionId].destination != address(0),
            "TX_DOESNT_EXIST"
        );
        _;
    }

    modifier confirmed(uint256 transactionId, address owner) {
        require(
            confirmations[transactionId][owner],
            "TX_NOT_CONFIRMED"
        );
        _;
    }

    modifier notConfirmed(uint256 transactionId, address owner) {
        require(
            !confirmations[transactionId][owner],
            "TX_ALREADY_CONFIRMED"
        );
        _;
    }

    modifier notExecuted(uint256 transactionId) {
        require(
            !transactions[transactionId].executed,
            "TX_ALREADY_EXECUTED"
        );
        _;
    }

    modifier notNull(address _address) {
        require(
            _address != address(0),
            "NULL_ADDRESS"
        );
        _;
    }

    modifier validRequirement(uint256 ownerCount, uint256 _required) {
        require(
            ownerCount <= MAX_OWNER_COUNT
            && _required <= ownerCount
            && _required != 0
            && ownerCount != 0,
            "INVALID_REQUIREMENTS"
        );
        _;
    }

    /// @dev Fallback function allows to deposit ether.
    function()
        external
        payable
    {
        if (msg.value > 0) {
            emit Deposit(msg.sender, msg.value);
        }
    }

    /*
     * Public functions
     */
    /// @dev Contract constructor sets initial owners and required number of confirmations.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    constructor(
        address[] memory _owners,
        uint256 _required
    )
        public
        validRequirement(_owners.length, _required)
    {
        for (uint256 i = 0; i < _owners.length; i++) {
            require(
                !isOwner[_owners[i]] && _owners[i] != address(0),
                "DUPLICATE_OR_NULL_OWNER"
            );
            isOwner[_owners[i]] = true;
        }
        owners = _owners;
        required = _required;
    }

    /// @dev Allows to add a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of new owner.
    function addOwner(address owner)
        public
        onlyWallet
        ownerDoesNotExist(owner)
        notNull(owner)
        validRequirement(owners.length + 1, required)
    {
        isOwner[owner] = true;
        owners.push(owner);
        emit OwnerAddition(owner);
    }

    /// @dev Allows to remove an owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner.
    function removeOwner(address owner)
        public
        onlyWallet
        ownerExists(owner)
    {
        isOwner[owner] = false;
        for (uint256 i = 0; i < owners.length - 1; i++) {
            if (owners[i] == owner) {
                owners[i] = owners[owners.length - 1];
                break;
            }
        }
        owners.length -= 1;
        if (required > owners.length) {
            changeRequirement(owners.length);
        }
        emit OwnerRemoval(owner);
    }

    /// @dev Allows to replace an owner with a new owner. Transaction has to be sent by wallet.
    /// @param owner Address of owner to be replaced.
    /// @param newOwner Address of new owner.
    function replaceOwner(address owner, address newOwner)
        public
        onlyWallet
        ownerExists(owner)
        ownerDoesNotExist(newOwner)
    {
        for (uint256 i = 0; i < owners.length; i++) {
            if (owners[i] == owner) {
                owners[i] = newOwner;
                break;
            }
        }
        isOwner[owner] = false;
        isOwner[newOwner] = true;
        emit OwnerRemoval(owner);
        emit OwnerAddition(newOwner);
    }

    /// @dev Allows to change the number of required confirmations. Transaction has to be sent by wallet.
    /// @param _required Number of required confirmations.
    function changeRequirement(uint256 _required)
        public
        onlyWallet
        validRequirement(owners.length, _required)
    {
        required = _required;
        emit RequirementChange(_required);
    }

    /// @dev Allows an owner to submit and confirm a transaction.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function submitTransaction(address destination, uint256 value, bytes memory data)
        public
        returns (uint256 transactionId)
    {
        transactionId = _addTransaction(destination, value, data);
        confirmTransaction(transactionId);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint256 transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        confirmations[transactionId][msg.sender] = true;
        emit Confirmation(msg.sender, transactionId);
        executeTransaction(transactionId);
    }

    /// @dev Allows an owner to revoke a confirmation for a transaction.
    /// @param transactionId Transaction ID.
    function revokeConfirmation(uint256 transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        confirmations[transactionId][msg.sender] = false;
        emit Revocation(msg.sender, transactionId);
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint256 transactionId)
        public
        ownerExists(msg.sender)
        confirmed(transactionId, msg.sender)
        notExecuted(transactionId)
    {
        if (isConfirmed(transactionId)) {
            Transaction storage txn = transactions[transactionId];
            txn.executed = true;
            if (
                _externalCall(
                    txn.destination,
                    txn.value,
                    txn.data.length,
                    txn.data
                )
            ) {
                emit Execution(transactionId);
            } else {
                emit ExecutionFailure(transactionId);
                txn.executed = false;
            }
        }
    }

    // call has been separated into its own function in order to take advantage
    // of the Solidity's code generator to produce a loop that copies tx.data into memory.
    function _externalCall(
        address destination,
        uint256 value,
        uint256 dataLength,
        bytes memory data
    )
        internal
        returns (bool)
    {
        bool result;
        assembly {
            let x := mload(0x40)   // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention)
            let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that
            result := call(
                sub(gas, 34710),   // 34710 is the value that solidity is currently emitting
                                   // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) +
                                   // callNewAccountGas (25000, in case the destination address does not exist and needs creating)
                destination,
                value,
                d,
                dataLength,        // Size of the input (in bytes) - this is what fixes the padding problem
                x,
                0                  // Output is ignored, therefore the output size is zero
            )
        }
        return result;
    }

    /// @dev Returns the confirmation status of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Confirmation status.
    function isConfirmed(uint256 transactionId)
        public
        view
        returns (bool)
    {
        uint256 count = 0;
        for (uint256 i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) {
                count += 1;
            }
            if (count == required) {
                return true;
            }
        }
    }

    /*
     * Internal functions
     */
    /// @dev Adds a new transaction to the transaction mapping, if transaction does not exist yet.
    /// @param destination Transaction target address.
    /// @param value Transaction ether value.
    /// @param data Transaction data payload.
    /// @return Returns transaction ID.
    function _addTransaction(
        address destination,
        uint256 value,
        bytes memory data
    )
        internal
        notNull(destination)
        returns (uint256 transactionId)
    {
        transactionId = transactionCount;
        transactions[transactionId] = Transaction({
            destination: destination,
            value: value,
            data: data,
            executed: false
        });
        transactionCount += 1;
        emit Submission(transactionId);
    }

    /*
     * Web3 call functions
     */
    /// @dev Returns number of confirmations of a transaction.
    /// @param transactionId Transaction ID.
    /// @return Number of confirmations.
    function getConfirmationCount(uint256 transactionId)
        public
        view
        returns (uint256 count)
    {
        for (uint256 i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) {
                count += 1;
            }
        }
    }

    /// @dev Returns total number of transactions after filers are applied.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Total number of transactions after filters are applied.
    function getTransactionCount(bool pending, bool executed)
        public
        view
        returns (uint256 count)
    {
        for (uint256 i = 0; i < transactionCount; i++) {
            if (pending && !transactions[i].executed || executed && transactions[i].executed) {
                count += 1;
            }
        }
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners()
        public
        view
        returns (address[] memory)
    {
        return owners;
    }

    /// @dev Returns array with owner addresses, which confirmed transaction.
    /// @param transactionId Transaction ID.
    /// @return Returns array of owner addresses.
    function getConfirmations(uint256 transactionId)
        public
        view
        returns (address[] memory _confirmations)
    {
        address[] memory confirmationsTemp = new address[](owners.length);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < owners.length; i++) {
            if (confirmations[transactionId][owners[i]]) {
                confirmationsTemp[count] = owners[i];
                count += 1;
            }
        }
        _confirmations = new address[](count);
        for (i = 0; i < count; i++) {
            _confirmations[i] = confirmationsTemp[i];
        }
    }

    /// @dev Returns list of transaction IDs in defined range.
    /// @param from Index start position of transaction array.
    /// @param to Index end position of transaction array.
    /// @param pending Include pending transactions.
    /// @param executed Include executed transactions.
    /// @return Returns array of transaction IDs.
    function getTransactionIds(
        uint256 from,
        uint256 to,
        bool pending,
        bool executed
    )
        public
        view
        returns (uint256[] memory _transactionIds)
    {
        uint256[] memory transactionIdsTemp = new uint256[](transactionCount);
        uint256 count = 0;
        uint256 i;
        for (i = 0; i < transactionCount; i++) {
            if (pending && !transactions[i].executed || executed && transactions[i].executed) {
                transactionIdsTemp[count] = i;
                count += 1;
            }
        }
        _transactionIds = new uint256[](to - from);
        for (i = from; i < to; i++) {
            _transactionIds[i - from] = transactionIdsTemp[i];
        }
    }
}

File 2 of 11 : MultiSigWalletWithTimeLock.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;

import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";
import "./MultiSigWallet.sol";


/// @title Multisignature wallet with time lock- Allows multiple parties to execute a transaction after a time lock has passed.
/// @author Amir Bandeali - <[email protected]>
// solhint-disable not-rely-on-time
contract MultiSigWalletWithTimeLock is
    MultiSigWallet
{
    using LibSafeMath for uint256;

    event ConfirmationTimeSet(uint256 indexed transactionId, uint256 confirmationTime);
    event TimeLockChange(uint256 secondsTimeLocked);

    uint256 public secondsTimeLocked;

    mapping (uint256 => uint256) public confirmationTimes;

    modifier fullyConfirmed(uint256 transactionId) {
        require(
            isConfirmed(transactionId),
            "TX_NOT_FULLY_CONFIRMED"
        );
        _;
    }

    modifier pastTimeLock(uint256 transactionId) {
        require(
            block.timestamp >= confirmationTimes[transactionId].safeAdd(secondsTimeLocked),
            "TIME_LOCK_INCOMPLETE"
        );
        _;
    }

    /// @dev Contract constructor sets initial owners, required number of confirmations, and time lock.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
    constructor (
        address[] memory _owners,
        uint256 _required,
        uint256 _secondsTimeLocked
    )
        public
        MultiSigWallet(_owners, _required)
    {
        secondsTimeLocked = _secondsTimeLocked;
    }

    /// @dev Changes the duration of the time lock for transactions.
    /// @param _secondsTimeLocked Duration needed after a transaction is confirmed and before it becomes executable, in seconds.
    function changeTimeLock(uint256 _secondsTimeLocked)
        public
        onlyWallet
    {
        secondsTimeLocked = _secondsTimeLocked;
        emit TimeLockChange(_secondsTimeLocked);
    }

    /// @dev Allows an owner to confirm a transaction.
    /// @param transactionId Transaction ID.
    function confirmTransaction(uint256 transactionId)
        public
        ownerExists(msg.sender)
        transactionExists(transactionId)
        notConfirmed(transactionId, msg.sender)
    {
        bool isTxFullyConfirmedBeforeConfirmation = isConfirmed(transactionId);

        confirmations[transactionId][msg.sender] = true;
        emit Confirmation(msg.sender, transactionId);

        if (!isTxFullyConfirmedBeforeConfirmation && isConfirmed(transactionId)) {
            _setConfirmationTime(transactionId, block.timestamp);
        }
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint256 transactionId)
        public
        notExecuted(transactionId)
        fullyConfirmed(transactionId)
        pastTimeLock(transactionId)
    {
        Transaction storage txn = transactions[transactionId];
        txn.executed = true;
        if (_externalCall(txn.destination, txn.value, txn.data.length, txn.data)) {
            emit Execution(transactionId);
        } else {
            emit ExecutionFailure(transactionId);
            txn.executed = false;
        }
    }

    /// @dev Sets the time of when a submission first passed.
    function _setConfirmationTime(uint256 transactionId, uint256 confirmationTime)
        internal
    {
        confirmationTimes[transactionId] = confirmationTime;
        emit ConfirmationTimeSet(transactionId, confirmationTime);
    }
}

File 3 of 11 : LibSafeMath.sol
pragma solidity ^0.5.9;

import "./LibRichErrors.sol";
import "./LibSafeMathRichErrors.sol";


library LibSafeMath {

    function safeMul(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        if (c / a != b) {
            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(
                LibSafeMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
                a,
                b
            ));
        }
        return c;
    }

    function safeDiv(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        if (b == 0) {
            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(
                LibSafeMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,
                a,
                b
            ));
        }
        uint256 c = a / b;
        return c;
    }

    function safeSub(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        if (b > a) {
            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(
                LibSafeMathRichErrors.BinOpErrorCodes.SUBTRACTION_UNDERFLOW,
                a,
                b
            ));
        }
        return a - b;
    }

    function safeAdd(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        uint256 c = a + b;
        if (c < a) {
            LibRichErrors.rrevert(LibSafeMathRichErrors.Uint256BinOpError(
                LibSafeMathRichErrors.BinOpErrorCodes.ADDITION_OVERFLOW,
                a,
                b
            ));
        }
        return c;
    }

    function max256(uint256 a, uint256 b)
        internal
        pure
        returns (uint256)
    {
        return a >= b ? a : b;
    }

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

File 4 of 11 : LibRichErrors.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;


library LibRichErrors {

    // bytes4(keccak256("Error(string)"))
    bytes4 internal constant STANDARD_ERROR_SELECTOR =
        0x08c379a0;

    // solhint-disable func-name-mixedcase
    /// @dev ABI encode a standard, string revert error payload.
    ///      This is the same payload that would be included by a `revert(string)`
    ///      solidity statement. It has the function signature `Error(string)`.
    /// @param message The error string.
    /// @return The ABI encoded error.
    function StandardError(
        string memory message
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            STANDARD_ERROR_SELECTOR,
            bytes(message)
        );
    }
    // solhint-enable func-name-mixedcase

    /// @dev Reverts an encoded rich revert reason `errorData`.
    /// @param errorData ABI encoded error data.
    function rrevert(bytes memory errorData)
        internal
        pure
    {
        assembly {
            revert(add(errorData, 0x20), mload(errorData))
        }
    }
}

File 5 of 11 : LibSafeMathRichErrors.sol
pragma solidity ^0.5.9;


library LibSafeMathRichErrors {

    // bytes4(keccak256("Uint256BinOpError(uint8,uint256,uint256)"))
    bytes4 internal constant UINT256_BINOP_ERROR_SELECTOR =
        0xe946c1bb;

    // bytes4(keccak256("Uint256DowncastError(uint8,uint256)"))
    bytes4 internal constant UINT256_DOWNCAST_ERROR_SELECTOR =
        0xc996af7b;

    enum BinOpErrorCodes {
        ADDITION_OVERFLOW,
        MULTIPLICATION_OVERFLOW,
        SUBTRACTION_UNDERFLOW,
        DIVISION_BY_ZERO
    }

    enum DowncastErrorCodes {
        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT32,
        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT64,
        VALUE_TOO_LARGE_TO_DOWNCAST_TO_UINT96
    }

    // solhint-disable func-name-mixedcase
    function Uint256BinOpError(
        BinOpErrorCodes errorCode,
        uint256 a,
        uint256 b
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            UINT256_BINOP_ERROR_SELECTOR,
            errorCode,
            a,
            b
        );
    }

    function Uint256DowncastError(
        DowncastErrorCodes errorCode,
        uint256 a
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            UINT256_DOWNCAST_ERROR_SELECTOR,
            errorCode,
            a
        );
    }
}

File 6 of 11 : ZeroExGovernor.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;
pragma experimental ABIEncoderV2;

import "./MultiSigWalletWithTimeLock.sol";
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
import "@0x/contracts-utils/contracts/src/LibSafeMath.sol";


contract ZeroExGovernor is
    MultiSigWalletWithTimeLock
{
    using LibBytes for bytes;
    using LibSafeMath for uint256;

    struct TimeLock {
        bool hasCustomTimeLock;
        uint128 secondsTimeLocked;
    }

    event FunctionCallTimeLockRegistration(
        bytes4 functionSelector,
        address destination,
        bool hasCustomTimeLock,
        uint128 newSecondsTimeLocked
    );

    // Function selector => destination => seconds timelocked
    mapping (bytes4 => mapping (address => TimeLock)) public functionCallTimeLocks;

    /// @dev Contract constructor sets initial owners, required number of confirmations, and default time lock
    ///      It will also register unique timelocks for each passed in function selector / destination combo.
    /// @param _functionSelectors Array of function selectors for registered functions.
    /// @param _destinations Array of destinations for registered function calls.
    /// @param _functionCallTimeLockSeconds Array of seconds that each registered function call will be timelocked.
    /// @param _owners List of initial owners.
    /// @param _required Number of required confirmations.
    /// @param _defaultSecondsTimeLocked Default duration in seconds needed after a transaction is confirmed to become executable.
    constructor (
        bytes4[] memory _functionSelectors,
        address[] memory _destinations,
        uint128[] memory _functionCallTimeLockSeconds,
        address[] memory _owners,
        uint256 _required,
        uint256 _defaultSecondsTimeLocked
    )
        public
        MultiSigWalletWithTimeLock(
            _owners,
            _required,
            _defaultSecondsTimeLocked
        )
    {
        uint256 length = _functionSelectors.length;
        require(
            length == _destinations.length && length == _functionCallTimeLockSeconds.length,
            "EQUAL_LENGTHS_REQUIRED"
        );

        // Register function timelocks
        for (uint256 i = 0; i != length; i++) {
            _registerFunctionCall(
                true,  // all functions registered in constructor are assumed to have a custom timelock
                _functionSelectors[i],
                _destinations[i],
                _functionCallTimeLockSeconds[i]
            );
        }
    }

    /// @dev Registers a custom timelock to a specific function selector / destination combo
    /// @param hasCustomTimeLock True if timelock is custom.
    /// @param functionSelector 4 byte selector of registered function.
    /// @param destination Address of destination where function will be called.
    /// @param newSecondsTimeLocked Duration in seconds needed after a transaction is confirmed to become executable.
    function registerFunctionCall(
        bool hasCustomTimeLock,
        bytes4 functionSelector,
        address destination,
        uint128 newSecondsTimeLocked
    )
        external
        onlyWallet
    {
        _registerFunctionCall(
            hasCustomTimeLock,
            functionSelector,
            destination,
            newSecondsTimeLocked
        );
    }

    /// @dev Allows anyone to execute a confirmed transaction.
    ///      Transactions *must* encode the values with the signature "bytes[] data, address[] destinations, uint256[] values"
    ///      The `destination` and `value` fields of the transaction in storage are ignored.
    ///      All function calls must be successful or the entire call will revert.
    /// @param transactionId Transaction ID.
    function executeTransaction(uint256 transactionId)
        public
        notExecuted(transactionId)
        fullyConfirmed(transactionId)
    {
        Transaction storage transaction = transactions[transactionId];
        transaction.executed = true;

        // Decode batch transaction data from transaction.data
        // `destination` and `value` fields of transaction are ignored
        // Note that `destination` must be non-0, or the transaction cannot be submitted
        // solhint-disable
        (
            bytes[] memory data,
            address[] memory destinations,
            uint256[] memory values
        ) = abi.decode(
            transaction.data,
            (bytes[], address[], uint256[])
        );
        // solhint-enable

        // Ensure lengths of array properties are equal
        uint256 length = data.length;
        require(
            length == destinations.length && length == values.length,
            "EQUAL_LENGTHS_REQUIRED"
        );

        uint256 transactionConfirmationTime = confirmationTimes[transactionId];
        for (uint i = 0; i != length; i++) {
            // Ensure that each function call is past its timelock
            _assertValidFunctionCall(
                transactionConfirmationTime,
                data[i],
                destinations[i]
            );
            // Call each function
            // solhint-disable-next-line avoid-call-value
            (bool didSucceed,) = destinations[i].call.value(values[i])(data[i]);
            // Ensure that function call was successful
            require(
                didSucceed,
                "FAILED_EXECUTION"
            );
        }
        emit Execution(transactionId);
    }

    /// @dev Registers a custom timelock to a specific function selector / destination combo
    /// @param hasCustomTimeLock True if timelock is custom.
    /// @param functionSelector 4 byte selector of registered function.
    /// @param destination Address of destination where function will be called.
    /// @param newSecondsTimeLocked Duration in seconds needed after a transaction is confirmed to become executable.
    function _registerFunctionCall(
        bool hasCustomTimeLock,
        bytes4 functionSelector,
        address destination,
        uint128 newSecondsTimeLocked
    )
        internal
    {
        // Clear the previous secondsTimeLocked if custom timelock not used
        uint128 _secondsTimeLocked = hasCustomTimeLock ? newSecondsTimeLocked : 0;
        TimeLock memory timeLock = TimeLock({
            hasCustomTimeLock: hasCustomTimeLock,
            secondsTimeLocked: _secondsTimeLocked
        });
        functionCallTimeLocks[functionSelector][destination] = timeLock;
        emit FunctionCallTimeLockRegistration(
            functionSelector,
            destination,
            hasCustomTimeLock,
            _secondsTimeLocked
        );
    }

    /// @dev Ensures that the function call has past its timelock.
    /// @param transactionConfirmationTime Timestamp at which transaction was fully confirmed.
    /// @param data Function calldata.
    /// @param destination Address to call function on.
    function _assertValidFunctionCall(
        uint256 transactionConfirmationTime,
        bytes memory data,
        address destination
    )
        internal
        view
    {
        bytes4 functionSelector = data.readBytes4(0);
        TimeLock memory timeLock = functionCallTimeLocks[functionSelector][destination];
        // solhint-disable not-rely-on-time
        if (timeLock.hasCustomTimeLock) {
            require(
                block.timestamp >= transactionConfirmationTime.safeAdd(timeLock.secondsTimeLocked),
                "CUSTOM_TIME_LOCK_INCOMPLETE"
            );
        } else {
            require(
                block.timestamp >= transactionConfirmationTime.safeAdd(secondsTimeLocked),
                "DEFAULT_TIME_LOCK_INCOMPLETE"
            );
        }
        // solhint-enable not-rely-on-time
    }
}

File 7 of 11 : LibBytes.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;

import "./LibBytesRichErrors.sol";
import "./LibRichErrors.sol";


library LibBytes {

    using LibBytes for bytes;

    /// @dev Gets the memory address for a byte array.
    /// @param input Byte array to lookup.
    /// @return memoryAddress Memory address of byte array. This
    ///         points to the header of the byte array which contains
    ///         the length.
    function rawAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := input
        }
        return memoryAddress;
    }

    /// @dev Gets the memory address for the contents of a byte array.
    /// @param input Byte array to lookup.
    /// @return memoryAddress Memory address of the contents of the byte array.
    function contentAddress(bytes memory input)
        internal
        pure
        returns (uint256 memoryAddress)
    {
        assembly {
            memoryAddress := add(input, 32)
        }
        return memoryAddress;
    }

    /// @dev Copies `length` bytes from memory location `source` to `dest`.
    /// @param dest memory address to copy bytes to.
    /// @param source memory address to copy bytes from.
    /// @param length number of bytes to copy.
    function memCopy(
        uint256 dest,
        uint256 source,
        uint256 length
    )
        internal
        pure
    {
        if (length < 32) {
            // Handle a partial word by reading destination and masking
            // off the bits we are interested in.
            // This correctly handles overlap, zero lengths and source == dest
            assembly {
                let mask := sub(exp(256, sub(32, length)), 1)
                let s := and(mload(source), not(mask))
                let d := and(mload(dest), mask)
                mstore(dest, or(s, d))
            }
        } else {
            // Skip the O(length) loop when source == dest.
            if (source == dest) {
                return;
            }

            // For large copies we copy whole words at a time. The final
            // word is aligned to the end of the range (instead of after the
            // previous) to handle partial words. So a copy will look like this:
            //
            //  ####
            //      ####
            //          ####
            //            ####
            //
            // We handle overlap in the source and destination range by
            // changing the copying direction. This prevents us from
            // overwriting parts of source that we still need to copy.
            //
            // This correctly handles source == dest
            //
            if (source > dest) {
                assembly {
                    // We subtract 32 from `sEnd` and `dEnd` because it
                    // is easier to compare with in the loop, and these
                    // are also the addresses we need for copying the
                    // last bytes.
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    // Remember the last 32 bytes of source
                    // This needs to be done here and not after the loop
                    // because we may have overwritten the last bytes in
                    // source already due to overlap.
                    let last := mload(sEnd)

                    // Copy whole words front to back
                    // Note: the first check is always true,
                    // this could have been a do-while loop.
                    // solhint-disable-next-line no-empty-blocks
                    for {} lt(source, sEnd) {} {
                        mstore(dest, mload(source))
                        source := add(source, 32)
                        dest := add(dest, 32)
                    }

                    // Write the last 32 bytes
                    mstore(dEnd, last)
                }
            } else {
                assembly {
                    // We subtract 32 from `sEnd` and `dEnd` because those
                    // are the starting points when copying a word at the end.
                    length := sub(length, 32)
                    let sEnd := add(source, length)
                    let dEnd := add(dest, length)

                    // Remember the first 32 bytes of source
                    // This needs to be done here and not after the loop
                    // because we may have overwritten the first bytes in
                    // source already due to overlap.
                    let first := mload(source)

                    // Copy whole words back to front
                    // We use a signed comparisson here to allow dEnd to become
                    // negative (happens when source and dest < 32). Valid
                    // addresses in local memory will never be larger than
                    // 2**255, so they can be safely re-interpreted as signed.
                    // Note: the first check is always true,
                    // this could have been a do-while loop.
                    // solhint-disable-next-line no-empty-blocks
                    for {} slt(dest, dEnd) {} {
                        mstore(dEnd, mload(sEnd))
                        sEnd := sub(sEnd, 32)
                        dEnd := sub(dEnd, 32)
                    }

                    // Write the first 32 bytes
                    mstore(dest, first)
                }
            }
        }
    }

    /// @dev Returns a slices from a byte array.
    /// @param b The byte array to take a slice from.
    /// @param from The starting index for the slice (inclusive).
    /// @param to The final index for the slice (exclusive).
    /// @return result The slice containing bytes at indices [from, to)
    function slice(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        // Ensure that the from and to positions are valid positions for a slice within
        // the byte array that is being used.
        if (from > to) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        // Create a new bytes structure and copy contents
        result = new bytes(to - from);
        memCopy(
            result.contentAddress(),
            b.contentAddress() + from,
            result.length
        );
        return result;
    }

    /// @dev Returns a slice from a byte array without preserving the input.
    /// @param b The byte array to take a slice from. Will be destroyed in the process.
    /// @param from The starting index for the slice (inclusive).
    /// @param to The final index for the slice (exclusive).
    /// @return result The slice containing bytes at indices [from, to)
    /// @dev When `from == 0`, the original array will match the slice. In other cases its state will be corrupted.
    function sliceDestructive(
        bytes memory b,
        uint256 from,
        uint256 to
    )
        internal
        pure
        returns (bytes memory result)
    {
        // Ensure that the from and to positions are valid positions for a slice within
        // the byte array that is being used.
        if (from > to) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.FromLessThanOrEqualsToRequired,
                from,
                to
            ));
        }
        if (to > b.length) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.ToLessThanOrEqualsLengthRequired,
                to,
                b.length
            ));
        }

        // Create a new bytes structure around [from, to) in-place.
        assembly {
            result := add(b, from)
            mstore(result, sub(to, from))
        }
        return result;
    }

    /// @dev Pops the last byte off of a byte array by modifying its length.
    /// @param b Byte array that will be modified.
    /// @return The byte that was popped off.
    function popLastByte(bytes memory b)
        internal
        pure
        returns (bytes1 result)
    {
        if (b.length == 0) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanZeroRequired,
                b.length,
                0
            ));
        }

        // Store last byte.
        result = b[b.length - 1];

        assembly {
            // Decrement length of byte array.
            let newLen := sub(mload(b), 1)
            mstore(b, newLen)
        }
        return result;
    }

    /// @dev Tests equality of two byte arrays.
    /// @param lhs First byte array to compare.
    /// @param rhs Second byte array to compare.
    /// @return True if arrays are the same. False otherwise.
    function equals(
        bytes memory lhs,
        bytes memory rhs
    )
        internal
        pure
        returns (bool equal)
    {
        // Keccak gas cost is 30 + numWords * 6. This is a cheap way to compare.
        // We early exit on unequal lengths, but keccak would also correctly
        // handle this.
        return lhs.length == rhs.length && keccak256(lhs) == keccak256(rhs);
    }

    /// @dev Reads an address from a position in a byte array.
    /// @param b Byte array containing an address.
    /// @param index Index in byte array of address.
    /// @return address from byte array.
    function readAddress(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (address result)
    {
        if (b.length < index + 20) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 // 20 is length of address
            ));
        }

        // Add offset to index:
        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
        index += 20;

        // Read address from array memory
        assembly {
            // 1. Add index to address of bytes array
            // 2. Load 32-byte word from memory
            // 3. Apply 20-byte mask to obtain address
            result := and(mload(add(b, index)), 0xffffffffffffffffffffffffffffffffffffffff)
        }
        return result;
    }

    /// @dev Writes an address into a specific position in a byte array.
    /// @param b Byte array to insert address into.
    /// @param index Index in byte array of address.
    /// @param input Address to put into byte array.
    function writeAddress(
        bytes memory b,
        uint256 index,
        address input
    )
        internal
        pure
    {
        if (b.length < index + 20) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsTwentyRequired,
                b.length,
                index + 20 // 20 is length of address
            ));
        }

        // Add offset to index:
        // 1. Arrays are prefixed by 32-byte length parameter (add 32 to index)
        // 2. Account for size difference between address length and 32-byte storage word (subtract 12 from index)
        index += 20;

        // Store address into array memory
        assembly {
            // The address occupies 20 bytes and mstore stores 32 bytes.
            // First fetch the 32-byte word where we'll be storing the address, then
            // apply a mask so we have only the bytes in the word that the address will not occupy.
            // Then combine these bytes with the address and store the 32 bytes back to memory with mstore.

            // 1. Add index to address of bytes array
            // 2. Load 32-byte word from memory
            // 3. Apply 12-byte mask to obtain extra bytes occupying word of memory where we'll store the address
            let neighbors := and(
                mload(add(b, index)),
                0xffffffffffffffffffffffff0000000000000000000000000000000000000000
            )

            // Make sure input address is clean.
            // (Solidity does not guarantee this)
            input := and(input, 0xffffffffffffffffffffffffffffffffffffffff)

            // Store the neighbors and address into memory
            mstore(add(b, index), xor(input, neighbors))
        }
    }

    /// @dev Reads a bytes32 value from a position in a byte array.
    /// @param b Byte array containing a bytes32 value.
    /// @param index Index in byte array of bytes32 value.
    /// @return bytes32 value from byte array.
    function readBytes32(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes32 result)
    {
        if (b.length < index + 32) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        // Arrays are prefixed by a 256 bit length parameter
        index += 32;

        // Read the bytes32 from array memory
        assembly {
            result := mload(add(b, index))
        }
        return result;
    }

    /// @dev Writes a bytes32 into a specific position in a byte array.
    /// @param b Byte array to insert <input> into.
    /// @param index Index in byte array of <input>.
    /// @param input bytes32 to put into byte array.
    function writeBytes32(
        bytes memory b,
        uint256 index,
        bytes32 input
    )
        internal
        pure
    {
        if (b.length < index + 32) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsThirtyTwoRequired,
                b.length,
                index + 32
            ));
        }

        // Arrays are prefixed by a 256 bit length parameter
        index += 32;

        // Read the bytes32 from array memory
        assembly {
            mstore(add(b, index), input)
        }
    }

    /// @dev Reads a uint256 value from a position in a byte array.
    /// @param b Byte array containing a uint256 value.
    /// @param index Index in byte array of uint256 value.
    /// @return uint256 value from byte array.
    function readUint256(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (uint256 result)
    {
        result = uint256(readBytes32(b, index));
        return result;
    }

    /// @dev Writes a uint256 into a specific position in a byte array.
    /// @param b Byte array to insert <input> into.
    /// @param index Index in byte array of <input>.
    /// @param input uint256 to put into byte array.
    function writeUint256(
        bytes memory b,
        uint256 index,
        uint256 input
    )
        internal
        pure
    {
        writeBytes32(b, index, bytes32(input));
    }

    /// @dev Reads an unpadded bytes4 value from a position in a byte array.
    /// @param b Byte array containing a bytes4 value.
    /// @param index Index in byte array of bytes4 value.
    /// @return bytes4 value from byte array.
    function readBytes4(
        bytes memory b,
        uint256 index
    )
        internal
        pure
        returns (bytes4 result)
    {
        if (b.length < index + 4) {
            LibRichErrors.rrevert(LibBytesRichErrors.InvalidByteOperationError(
                LibBytesRichErrors.InvalidByteOperationErrorCodes.LengthGreaterThanOrEqualsFourRequired,
                b.length,
                index + 4
            ));
        }

        // Arrays are prefixed by a 32 byte length field
        index += 32;

        // Read the bytes4 from array memory
        assembly {
            result := mload(add(b, index))
            // Solidity does not require us to clean the trailing bytes.
            // We do it anyway
            result := and(result, 0xFFFFFFFF00000000000000000000000000000000000000000000000000000000)
        }
        return result;
    }

    /// @dev Writes a new length to a byte array.
    ///      Decreasing length will lead to removing the corresponding lower order bytes from the byte array.
    ///      Increasing length may lead to appending adjacent in-memory bytes to the end of the byte array.
    /// @param b Bytes array to write new length to.
    /// @param length New length of byte array.
    function writeLength(bytes memory b, uint256 length)
        internal
        pure
    {
        assembly {
            mstore(b, length)
        }
    }
}

File 8 of 11 : LibBytesRichErrors.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;


library LibBytesRichErrors {

    enum InvalidByteOperationErrorCodes {
        FromLessThanOrEqualsToRequired,
        ToLessThanOrEqualsLengthRequired,
        LengthGreaterThanZeroRequired,
        LengthGreaterThanOrEqualsFourRequired,
        LengthGreaterThanOrEqualsTwentyRequired,
        LengthGreaterThanOrEqualsThirtyTwoRequired,
        LengthGreaterThanOrEqualsNestedBytesLengthRequired,
        DestinationLengthGreaterThanOrEqualSourceLengthRequired
    }

    // bytes4(keccak256("InvalidByteOperationError(uint8,uint256,uint256)"))
    bytes4 internal constant INVALID_BYTE_OPERATION_ERROR_SELECTOR =
        0x28006595;

    // solhint-disable func-name-mixedcase
    function InvalidByteOperationError(
        InvalidByteOperationErrorCodes errorCode,
        uint256 offset,
        uint256 required
    )
        internal
        pure
        returns (bytes memory)
    {
        return abi.encodeWithSelector(
            INVALID_BYTE_OPERATION_ERROR_SELECTOR,
            errorCode,
            offset,
            required
        );
    }
}

File 9 of 11 : ContractCallReceiver.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;

import "@0x/contracts-utils/contracts/src/LibBytes.sol";


contract ContractCallReceiver {

    using LibBytes for bytes;

    event ContractCall(
        bytes4 functionSelector,
        bytes data,
        uint256 value
    );

    bytes4 constant internal ALWAYS_REVERT_SELECTOR = 0xF1F2F3F4;

    function ()
        external
        payable
    {
        bytes4 selector = msg.data.readBytes4(0);
        if (selector == ALWAYS_REVERT_SELECTOR) {
            revert();
        }

        emit ContractCall(
            selector,
            msg.data,
            msg.value
        );
    }
}

File 10 of 11 : TestRejectEther.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;


// solhint-disable no-empty-blocks
contract TestRejectEther {}

File 11 of 11 : TestZeroExGovernor.sol
/*

  Copyright 2019 ZeroEx Intl.

  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.5.9;
pragma experimental ABIEncoderV2;

import "../src/ZeroExGovernor.sol";


// solhint-disable no-empty-blocks
contract TestZeroExGovernor is
    ZeroExGovernor
{
    constructor (
        bytes4[] memory _functionSelectors,
        address[] memory _destinations,
        uint128[] memory _functionCallTimeLockSeconds,
        address[] memory _owners,
        uint256 _required,
        uint256 _defaultSecondsTimeLocked
    )
        public
        ZeroExGovernor(
            _functionSelectors,
            _destinations,
            _functionCallTimeLockSeconds,
            _owners,
            _required,
            _defaultSecondsTimeLocked
        )
    {}
    
    function registerFunctionCallBypassWallet(
        bool hasCustomTimeLock,
        bytes4 functionSelector,
        address destination,
        uint128 newSecondsTimeLocked
    )
        external
    {
        _registerFunctionCall(
            hasCustomTimeLock,
            functionSelector,
            destination,
            newSecondsTimeLocked
        );
    }

    function assertValidFunctionCall(
        uint256 transactionConfirmationTime,
        bytes calldata data,
        address destination
    )
        external
        view
    {
        _assertValidFunctionCall(
            transactionConfirmationTime,
            data,
            destination
        );
    }
}

Settings
{
  "remappings": [
    "@0x/contracts-utils=/home/runner/protocol/contracts/multisig/node_modules/@0x/contracts-utils"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000,
    "details": {
      "yul": true,
      "deduplicate": true,
      "cse": true,
      "constantOptimizer": true
    }
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "istanbul"
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes4[]","name":"_functionSelectors","type":"bytes4[]"},{"internalType":"address[]","name":"_destinations","type":"address[]"},{"internalType":"uint128[]","name":"_functionCallTimeLockSeconds","type":"uint128[]"},{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256","name":"_required","type":"uint256"},{"internalType":"uint256","name":"_defaultSecondsTimeLocked","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"confirmationTime","type":"uint256"}],"name":"ConfirmationTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Execution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"ExecutionFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":false,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"indexed":false,"internalType":"uint128","name":"newSecondsTimeLocked","type":"uint128"}],"name":"FunctionCallTimeLockRegistration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"required","type":"uint256"}],"name":"RequirementChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Revocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"Submission","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"secondsTimeLocked","type":"uint256"}],"name":"TimeLockChange","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"MAX_OWNER_COUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_required","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_secondsTimeLocked","type":"uint256"}],"name":"changeTimeLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"confirmTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"confirmationTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"confirmations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"executeTransaction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"},{"internalType":"address","name":"","type":"address"}],"name":"functionCallTimeLocks","outputs":[{"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"internalType":"uint128","name":"secondsTimeLocked","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmationCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"getConfirmations","outputs":[{"internalType":"address[]","name":"_confirmations","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"bool","name":"pending","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"}],"name":"getTransactionIds","outputs":[{"internalType":"uint256[]","name":"_transactionIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"isConfirmed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"hasCustomTimeLock","type":"bool"},{"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint128","name":"newSecondsTimeLocked","type":"uint128"}],"name":"registerFunctionCall","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"replaceOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"required","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"name":"revokeConfirmation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"secondsTimeLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"submitTransaction","outputs":[{"internalType":"uint256","name":"transactionId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transactionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transactions","outputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bool","name":"executed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200338938038062003389833981016040819052620000349162000545565b8282828282815181603282111580156200004e5750818111155b80156200005a57508015155b80156200006657508115155b6200008e5760405162461bcd60e51b81526004016200008590620006b4565b60405180910390fd5b60005b8451811015620001755760026000868381518110620000ac57fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205460ff1615801562000108575060006001600160a01b0316858281518110620000f457fe5b60200260200101516001600160a01b031614155b620001275760405162461bcd60e51b8152600401620000859062000646565b6001600260008784815181106200013a57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905560010162000091565b5083516200018b90600390602087019062000317565b5050506004555060065550508551855181148015620001aa5750845181145b620001c95760405162461bcd60e51b815260040162000085906200067d565b60005b8181146200022e57620002256001898381518110620001e757fe5b6020026020010151898481518110620001fc57fe5b60200260200101518985815181106200021157fe5b60200260200101516200023c60201b60201c565b600101620001cc565b505050505050505062000732565b6000846200024c5760006200024e565b815b90506200025a62000381565b5060408051808201825286151581526001600160801b0380841660208084019182526001600160e01b031989166000908152600882528581206001600160a01b038a16825290915284902083518154925190931661010002610100600160881b031993151560ff19909316929092179290921617905590517f694405724de467488eda192d814f39ffe7f6503fe0b1eefd4ea332f9c611c5ec906200030790879087908a9087906200060b565b60405180910390a1505050505050565b8280548282559060005260206000209081019282156200036f579160200282015b828111156200036f57825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000338565b506200037d92915062000398565b5090565b604080518082019091526000808252602082015290565b620003bf91905b808211156200037d5780546001600160a01b03191681556001016200039f565b90565b600082601f830112620003d3578081fd5b8151620003ea620003e48262000712565b620006eb565b8181529150602080830190848101818402860182018710156200040c57600080fd5b60005b84811015620004435781516001600160a01b03811681146200043057600080fd5b845292820192908201906001016200040f565b505050505092915050565b600082601f8301126200045f578081fd5b815162000470620003e48262000712565b8181529150602080830190848101818402860182018710156200049257600080fd5b60005b84811015620004435781516001600160e01b031981168114620004b757600080fd5b8452928201929082019060010162000495565b600082601f830112620004db578081fd5b8151620004ec620003e48262000712565b8181529150602080830190848101818402860182018710156200050e57600080fd5b60005b84811015620004435781516001600160801b03811681146200053257600080fd5b8452928201929082019060010162000511565b60008060008060008060c087890312156200055e578182fd5b86516001600160401b038082111562000575578384fd5b620005838a838b016200044e565b9750602089015191508082111562000599578384fd5b620005a78a838b01620003c2565b96506040890151915080821115620005bd578384fd5b620005cb8a838b01620004ca565b95506060890151915080821115620005e1578384fd5b50620005f089828a01620003c2565b9350506080870151915060a087015190509295509295509295565b6001600160e01b03199490941684526001600160a01b03929092166020840152151560408301526001600160801b0316606082015260800190565b60208082526017908201527f4455504c49434154455f4f525f4e554c4c5f4f574e4552000000000000000000604082015260600190565b60208082526016908201527f455155414c5f4c454e475448535f524551554952454400000000000000000000604082015260600190565b60208082526014908201527f494e56414c49445f524551554952454d454e5453000000000000000000000000604082015260600190565b6040518181016001600160401b03811182821017156200070a57600080fd5b604052919050565b60006001600160401b0382111562000728578081fd5b5060209081020190565b612c4780620007426000396000f3fe6080604052600436106101a15760003560e01c80639ace38c2116100e1578063c01a8c841161008a578063d74f8edd11610064578063d74f8edd146104ff578063dc8452cd14610514578063e20056e614610529578063ee22610b14610549576101a1565b8063c01a8c841461049f578063c6427474146104bf578063d38f2d82146104df576101a1565b8063b5dc40c3116100bb578063b5dc40c31461044a578063b77bf6001461046a578063ba51a6df1461047f576101a1565b80639ace38c2146103cb578063a0e67e2b146103fb578063a8abe69a1461041d576101a1565b8063547415251161014e578063784547a711610128578063784547a71461033d5780637ad28c511461035d5780637f05c8b61461037d5780638b51d13f146103ab576101a1565b806354741525146102dd5780637065cb48146102fd578063751ad5601461031d576101a1565b80632f54bf6e1161017f5780632f54bf6e1461026e5780633411c81c1461029b57806337bd78a0146102bb576101a1565b8063025e7c27146101f8578063173825d91461022e57806320ea8d861461024e575b34156101f6573373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516101ed9190612ae5565b60405180910390a25b005b34801561020457600080fd5b50610218610213366004612558565b610569565b60405161022591906125ee565b60405180910390f35b34801561023a57600080fd5b506101f66102493660046122db565b61059d565b34801561025a57600080fd5b506101f6610269366004612558565b61084c565b34801561027a57600080fd5b5061028e6102893660046122db565b6109a7565b604051610225919061271d565b3480156102a757600080fd5b5061028e6102b6366004612570565b6109bc565b3480156102c757600080fd5b506102d06109dc565b6040516102259190612ae5565b3480156102e957600080fd5b506102d06102f8366004612498565b6109e2565b34801561030957600080fd5b506101f66103183660046122db565b610a4e565b34801561032957600080fd5b506101f66103383660046124cc565b610c73565b34801561034957600080fd5b5061028e610358366004612558565b610cbe565b34801561036957600080fd5b506101f6610378366004612558565b610d52565b34801561038957600080fd5b5061039d61039836600461253b565b610dcb565b604051610225929190612728565b3480156103b757600080fd5b506102d06103c6366004612558565b610e04565b3480156103d757600080fd5b506103eb6103e6366004612558565b610e80565b604051610225949392919061260f565b34801561040757600080fd5b50610410610f69565b604051610225919061268c565b34801561042957600080fd5b5061043d610438366004612594565b610fd9565b60405161022591906126e5565b34801561045657600080fd5b50610410610465366004612558565b611104565b34801561047657600080fd5b506102d06112bc565b34801561048b57600080fd5b506101f661049a366004612558565b6112c2565b3480156104ab57600080fd5b506101f66104ba366004612558565b61139e565b3480156104cb57600080fd5b506102d06104da36600461232f565b611540565b3480156104eb57600080fd5b506102d06104fa366004612558565b61155f565b34801561050b57600080fd5b506102d0611571565b34801561052057600080fd5b506102d0611576565b34801561053557600080fd5b506101f66105443660046122f7565b61157c565b34801561055557600080fd5b506101f6610564366004612558565b611806565b6003818154811061057657fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3330146105df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff16610640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b6003547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff018110156107bc578273ffffffffffffffffffffffffffffffffffffffff16600382815481106106dc57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614156107b457600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810190811061073457fe5b6000918252602090912001546003805473ffffffffffffffffffffffffffffffffffffffff909216918390811061076757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506107bc565b60010161068c565b50600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01906107ee90826120d8565b50600354600454111561080757600354610807906112c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9090600090a25050565b3360008181526002602052604090205460ff16610895576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b60008281526001602090815260408083203380855292529091205483919060ff166108ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061292d565b600084815260208190526040902060030154849060ff161561093a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b600085815260016020908152604080832033808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555187927ff6a317157440607f36269043eb55f1287a5a19ba2216afeab88cd46cbcfb88e991a35050505050565b60026020526000908152604090205460ff1681565b600160209081526000928352604080842090915290825290205460ff1681565b60065481565b6000805b600554811015610a4757838015610a0f575060008181526020819052604090206003015460ff16155b80610a335750828015610a33575060008181526020819052604090206003015460ff165b15610a3f576001820191505b6001016109e6565b5092915050565b333014610a87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260026020526040902054819060ff1615610ae9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b8173ffffffffffffffffffffffffffffffffffffffff8116610b37576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b60038054905060010160045460328211158015610b545750818111155b8015610b5f57508015155b8015610b6a57508115155b610ba0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b73ffffffffffffffffffffffffffffffffffffffff851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915560038054918201815583527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001684179055517ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d9190a25050505050565b333014610cac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b610cb884848484611b51565b50505050565b600080805b600354811015610d4a5760008481526001602052604081206003805491929184908110610cec57fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610d2d576001820191505b600454821415610d4257600192505050610d4d565b600101610cc3565b50505b919050565b333014610d8b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60068190556040517fd1c9101a34feff75cccef14a28785a0279cb0b49c1f321f21f5f422e746b437790610dc0908390612ae5565b60405180910390a150565b600860209081526000928352604080842090915290825290205460ff81169061010090046fffffffffffffffffffffffffffffffff1682565b6000805b600354811015610e7a5760008381526001602052604081206003805491929184908110610e3157fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff1615610e72576001820191505b600101610e08565b50919050565b60006020818152918152604090819020805460018083015460028085018054875161010095821615959095027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f810188900488028401880190965285835273ffffffffffffffffffffffffffffffffffffffff90931695909491929190830182828015610f565780601f10610f2b57610100808354040283529160200191610f56565b820191906000526020600020905b815481529060010190602001808311610f3957829003601f168201915b5050506003909301549192505060ff1684565b60606003805480602002602001604051908101604052809291908181526020018280548015610fce57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610fa3575b505050505090505b90565b606080600554604051908082528060200260200182016040528015611008578160200160208202803883390190505b5090506000805b60055481101561108957858015611038575060008181526020819052604090206003015460ff16155b8061105c575084801561105c575060008181526020819052604090206003015460ff165b15611081578083838151811061106e57fe5b6020026020010181815250506001820191505b60010161100f565b8787036040519080825280602002602001820160405280156110b5578160200160208202803883390190505b5093508790505b868110156110f9578281815181106110d057fe5b602002602001015184898303815181106110e657fe5b60209081029190910101526001016110bc565b505050949350505050565b606080600380549050604051908082528060200260200182016040528015611136578160200160208202803883390190505b5090506000805b60035481101561122d576000858152600160205260408120600380549192918490811061116657fe5b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205460ff161561122557600381815481106111ad57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168383815181106111e457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506001820191505b60010161113d565b81604051908082528060200260200182016040528015611257578160200160208202803883390190505b509350600090505b818110156112b45782818151811061127357fe5b602002602001015184828151811061128757fe5b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161125f565b505050919050565b60055481565b3330146112fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b60035481603282118015906113105750818111155b801561131b57508015155b801561132657508115155b61135c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612aae565b60048390556040517fa3f1ee9126a074d9326c682f561767f710e927faa811f7a99829d49dc421797a90611391908590612ae5565b60405180910390a1505050565b3360008181526002602052604090205460ff166113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b600082815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff16611444576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128f6565b60008381526001602090815260408083203380855292529091205484919060ff161561149c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612888565b60006114a786610cbe565b600087815260016020818152604080842033808652925280842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169093179092559051929350889290917f4a504a94899432a9846e1aa406dceb1bcfd538bb839071d49d1e5e23f5be30ef91a380158015611529575061152986610cbe565b15611538576115388642611c89565b505050505050565b600061154d848484611cd8565b90506115588161139e565b9392505050565b60076020526000908152604090205481565b603281565b60045481565b3330146115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a40565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff16611616576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906129d2565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260026020526040902054829060ff1615611678576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612851565b60005b600354811015611734578473ffffffffffffffffffffffffffffffffffffffff16600382815481106116a957fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16141561172c5783600382815481106116df57fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611734565b60010161167b565b5073ffffffffffffffffffffffffffffffffffffffff80851660008181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090811690915593871682528082208054909416600117909355915190917f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9091a260405173ffffffffffffffffffffffffffffffffffffffff8416907ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d90600090a250505050565b600081815260208190526040902060030154819060ff1615611854576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a77565b8161185e81610cbe565b611894576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906128bf565b6000838152602081815260409182902060038101805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909116811790915560028083018054865161010094821615949094027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff011691909104601f81018590048502830185019095528482529193606093849384939290918301828280156119805780601f1061195557610100808354040283529160200191611980565b820191906000526020600020905b81548152906001019060200180831161196357829003601f168201915b505050505080602001905161199891908101906123c4565b9250925092506000835190508251811480156119b45750815181145b6119ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612964565b600088815260076020526040812054905b828114611b1a57611a3382878381518110611a1257fe5b6020026020010151878481518110611a2657fe5b6020026020010151611e36565b6000858281518110611a4157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16858381518110611a6b57fe5b6020026020010151888481518110611a7f57fe5b6020026020010151604051611a9491906125d2565b60006040518083038185875af1925050503d8060008114611ad1576040519150601f19603f3d011682016040523d82523d6000602084013e611ad6565b606091505b5050905080611b11576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061299b565b506001016119fb565b5060405189907f33e13ecb54c3076d8e8bb8c2881800a4d972b792045ffae98fdf46df365fed7590600090a2505050505050505050565b600084611b5f576000611b61565b815b9050611b6b612101565b5060408051808201825286151581526fffffffffffffffffffffffffffffffff80841660208084019182527fffffffff00000000000000000000000000000000000000000000000000000000891660009081526008825285812073ffffffffffffffffffffffffffffffffffffffff8a168252909152849020835181549251909316610100027fffffffffffffffffffffffffffffff00000000000000000000000000000000ff9315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179290921617905590517f694405724de467488eda192d814f39ffe7f6503fe0b1eefd4ea332f9c611c5ec90611c7990879087908a90879061274a565b60405180910390a1505050505050565b600082815260076020526040908190208290555182907f0b237afe65f1514fd7ea3f923ea4fe792bdd07000a912b6cd1602a8e7f573c8d90611ccc908490612ae5565b60405180910390a25050565b60008373ffffffffffffffffffffffffffffffffffffffff8116611d28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d6906127e3565b6005546040805160808101825273ffffffffffffffffffffffffffffffffffffffff8881168252602080830189815283850189815260006060860181905287815280845295909520845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001694169390931783555160018301559251805194965091939092611dc0926002850192910190612118565b5060609190910151600390910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560058054600101905560405182907fc0ba8fe4b176c1714197d43b9cc6bcf797a4a7461c5fe8d0ef6e184ae7601e5190600090a2509392505050565b6000611e48838263ffffffff611f9516565b9050611e52612101565b507fffffffff000000000000000000000000000000000000000000000000000000008116600090815260086020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845282529182902082518084019093525460ff811615801584526101009091046fffffffffffffffffffffffffffffffff1691830191909152611f41576020810151611f039086906fffffffffffffffffffffffffffffffff1663ffffffff611ff016565b421015611f3c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d690612a09565b611f8e565b600654611f5590869063ffffffff611ff016565b421015611f8e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d69061281a565b5050505050565b60008160040183511015611fbb57611fbb611fb6600385518560040161200c565b6120b1565b5060208183018101519101907fffffffff00000000000000000000000000000000000000000000000000000000165b92915050565b60008282018381101561155857611558611fb6600086866120b9565b6060632800659560e01b84848460405160240161202b939291906127d5565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290509392505050565b805160208201fd5b606063e946c1bb60e01b84848460405160240161202b939291906127b3565b8154818355818111156120fc576000838152602090206120fc918101908301612196565b505050565b604080518082019091526000808252602082015290565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061215957805160ff1916838001178555612186565b82800160010185558215612186579182015b8281111561218657825182559160200191906001019061216b565b50612192929150612196565b5090565b610fd691905b80821115612192576000815560010161219c565b600082601f8301126121c0578081fd5b81516121d36121ce82612b15565b612aee565b8181529150602080830190848101818402860182018710156121f457600080fd5b60005b8481101561221c57815161220a81612ba3565b845292820192908201906001016121f7565b505050505092915050565b600082601f830112612237578081fd5b81516122456121ce82612b15565b81815291506020808301908481018184028601820187101561226657600080fd5b60005b8481101561221c57815184529282019290820190600101612269565b80358015158114611fea57600080fd5b600082601f8301126122a5578081fd5b81516122b36121ce82612b35565b91508082528360208285010111156122ca57600080fd5b610a47816020840160208601612b77565b6000602082840312156122ec578081fd5b813561155881612ba3565b60008060408385031215612309578081fd5b823561231481612ba3565b9150602083013561232481612ba3565b809150509250929050565b600080600060608486031215612343578081fd5b833561234e81612ba3565b925060208401359150604084013567ffffffffffffffff811115612370578182fd5b80850186601f820112612381578283fd5b803591506123916121ce83612b35565b8281528760208484010111156123a5578384fd5b8260208301602083013783602084830101528093505050509250925092565b6000806000606084860312156123d8578283fd5b835167ffffffffffffffff808211156123ef578485fd5b81860187601f820112612400578586fd5b805192506124106121ce84612b15565b83815260208082019190838101895b87811015612448576124368d848451890101612295565b8552938201939082019060010161241f565b50508901519097509350505080821115612460578384fd5b61246c878388016121b0565b93506040860151915080821115612481578283fd5b5061248e86828701612227565b9150509250925092565b600080604083850312156124aa578182fd5b6124b48484612285565b91506124c38460208501612285565b90509250929050565b600080600080608085870312156124e1578081fd5b84356124ec81612bc8565b935060208501356124fc81612bd6565b9250604085013561250c81612ba3565b915060608501356fffffffffffffffffffffffffffffffff81168114612530578182fd5b939692955090935050565b6000806040838503121561254d578182fd5b823561231481612bd6565b600060208284031215612569578081fd5b5035919050565b60008060408385031215612582578182fd5b82359150602083013561232481612ba3565b600080600080608085870312156125a9578182fd5b843593506020850135925060408501356125c281612bc8565b9150606085013561253081612bc8565b600082516125e4818460208701612b77565b9190910192915050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff861682528460208301526080604083015283518060808401526126508160a0850160208801612b77565b921515606083015250601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160160a0019392505050565b602080825282518282018190526000918401906040840190835b818110156126da57835173ffffffffffffffffffffffffffffffffffffffff168352602093840193909201916001016126a6565b509095945050505050565b602080825282518282018190526000918401906040840190835b818110156126da5783518352602093840193909201916001016126ff565b901515815260200190565b91151582526fffffffffffffffffffffffffffffffff16602082015260400190565b7fffffffff0000000000000000000000000000000000000000000000000000000094909416845273ffffffffffffffffffffffffffffffffffffffff929092166020840152151560408301526fffffffffffffffffffffffffffffffff16606082015260800190565b60608101600485106127c157fe5b938152602081019290925260409091015290565b60608101600885106127c157fe5b6020808252600c908201527f4e554c4c5f414444524553530000000000000000000000000000000000000000604082015260600190565b6020808252601c908201527f44454641554c545f54494d455f4c4f434b5f494e434f4d504c45544500000000604082015260600190565b6020808252600c908201527f4f574e45525f4558495354530000000000000000000000000000000000000000604082015260600190565b60208082526014908201527f54585f414c52454144595f434f4e4649524d4544000000000000000000000000604082015260600190565b60208082526016908201527f54585f4e4f545f46554c4c595f434f4e4649524d454400000000000000000000604082015260600190565b6020808252600f908201527f54585f444f45534e545f45584953540000000000000000000000000000000000604082015260600190565b60208082526010908201527f54585f4e4f545f434f4e4649524d454400000000000000000000000000000000604082015260600190565b60208082526016908201527f455155414c5f4c454e475448535f524551554952454400000000000000000000604082015260600190565b60208082526010908201527f4641494c45445f455845435554494f4e00000000000000000000000000000000604082015260600190565b60208082526012908201527f4f574e45525f444f45534e545f45584953540000000000000000000000000000604082015260600190565b6020808252601b908201527f435553544f4d5f54494d455f4c4f434b5f494e434f4d504c4554450000000000604082015260600190565b60208082526017908201527f4f4e4c595f43414c4c41424c455f42595f57414c4c4554000000000000000000604082015260600190565b60208082526013908201527f54585f414c52454144595f455845435554454400000000000000000000000000604082015260600190565b60208082526014908201527f494e56414c49445f524551554952454d454e5453000000000000000000000000604082015260600190565b90815260200190565b60405181810167ffffffffffffffff81118282101715612b0d57600080fd5b604052919050565b600067ffffffffffffffff821115612b2b578081fd5b5060209081020190565b600067ffffffffffffffff821115612b4b578081fd5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015612b92578181015183820152602001612b7a565b83811115610cb85750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114612bc557600080fd5b50565b8015158114612bc557600080fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081168114612bc557600080fdfea365627a7a72315820eb641e70c38ba100ed9bcb2a7474c02d26a057115596c1e9b72ae145a7d540a26c6578706572696d656e74616cf564736f6c6343000511004000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0000000000000000000000000d00d21405a4c25bd563a54f826ff552fe0349d8b0000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1

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

00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0000000000000000000000000d00d21405a4c25bd563a54f826ff552fe0349d8b0000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1

-----Decoded View---------------

-----Encoded View---------------
15 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 0000000000000000000000009e4496ade6096b000c856219c27734f4f89a5210
Arg [11] : 000000000000000000000000257619b7155d247e43c8b6d90c8c17278ae481f0
Arg [12] : 000000000000000000000000d00d21405a4c25bd563a54f826ff552fe0349d8b
Arg [13] : 0000000000000000000000005a9d540a07a96a2bfc8a8dfd638359778c72526f
Arg [14] : 00000000000000000000000001ba2d1fc567074f18e75fe34b4fcda7330499e1


Deployed ByteCode Sourcemap

801:7539:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3116:9:0;:13;3112:79;;3158:10;3150:30;;;3170:9;3150:30;;;;;;;;;;;;;;;3112:79;801:7539:2;1079:23:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1079:23:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4434:496;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4434:496:0;;;;;;;;:::i;7095:299::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7095:299:0;;;;;;;;:::i;1033:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1033:40:0;;;;;;;;:::i;:::-;;;;;;;;960:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;960:67:0;;;;;;;;:::i;1153:32:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1153:32:1;;;:::i;:::-;;;;;;;;11700:334:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11700:334:0;;;;;;;;:::i;4029:282::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4029:282:0;;;;;;;;:::i;3531:376:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3531:376:2;;;;;;;;:::i;9741:378:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9741:378:0;;;;;;;;:::i;2428:194:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2428:194:1;;;;;;;;:::i;1272:78:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1272:78:2;;;;;;;;:::i;:::-;;;;;;;;;11149:289:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11149:289:0;;;;;;;;:::i;902:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;902:52:0;;;;;;;;:::i;:::-;;;;;;;;;;;12118:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12118:118:0;;;:::i;:::-;;;;;;;;13383:742;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13383:742:0;;;;;;;;:::i;:::-;;;;;;;;12415:619;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12415:619:0;;;;;;;;:::i;1137:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1137:31:0;;;:::i;5781:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5781:215:0;;;;;;;;:::i;2728:550:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2728:550:1;;;;;;;;:::i;6255:258:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6255:258:0;;;;;;;;:::i;1192:53:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1192:53:1;;;;;;;;:::i;820:44:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:44:0;;;:::i;1108:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1108:23:0;;;:::i;5132:478::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5132:478:0;;;;;;;;:::i;4324:1721:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4324:1721:2;;;;;;;;:::i;1079:23:0:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1079:23:0;:::o;4434:496::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;;;;;;;;;1705:14;;;;;;;:7;:14;;;;;;4524:5;;1705:14;;1684:79;;;;;;;;;;;;;;4545:14;;;4562:5;4545:14;;;:7;:14;;;;;:22;;;;;;4577:189;4601:6;:13;:17;;4597:21;;4577:189;;;4656:5;4643:18;;:6;4650:1;4643:9;;;;;;;;;;;;;;;;;;;;:18;4639:117;;;4693:6;4700:13;;:17;;;;4693:25;;;;;;;;;;;;;;;;4681:6;:9;;4693:25;;;;;4688:1;;4681:9;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4736:5;;4639:117;4620:3;;4577:189;;;-1:-1:-1;4775:6:0;:18;;;;;;;;;:::i;:::-;-1:-1:-1;4818:6:0;:13;4807:8;;:24;4803:87;;;4865:6;:13;4847:32;;:17;:32::i;:::-;4904:19;;;;;;;;;;;1474:1;4434:496;:::o;7095:299::-;7181:10;1705:14;;;;:7;:14;;;;;;;;1684:79;;;;;;;;;;;;;;2074:28;;;;:13;:28;;;;;;;;7226:10;2074:35;;;;;;;;;7211:13;;7226:10;2074:35;;2053:98;;;;;;;;;;;;;;2448:12;:27;;;;;;;;;;:36;;;7258:13;;2448:36;;2447:37;2426:103;;;;;;;;;;;;;;7330:5;7287:28;;;:13;:28;;;;;;;;7316:10;7287:40;;;;;;;;:48;;;;;;7350:37;7301:13;;7350:37;;;2161:1;1773;;7095:299;;:::o;1033:40::-;;;;;;;;;;;;;;;:::o;960:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1153:32:1:-;;;;:::o;11700:334:0:-;11803:13;;11832:196;11856:16;;11852:1;:20;11832:196;;;11897:7;:36;;;;-1:-1:-1;11909:12:0;:15;;;;;;;;;;:24;;;;;11908:25;11897:36;:76;;;;11937:8;:36;;;;-1:-1:-1;11949:12:0;:15;;;;;;;;;;:24;;;;;11937:36;11893:125;;;12002:1;11993:10;;;;11893:125;11874:3;;11832:196;;;;11700:334;;;;:::o;4029:282::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;1562:14;;;;;;;:7;:14;;;;;;4122:5;;1562:14;;1561:15;1540:74;;;;;;;;;;;;;;4145:5;2619:22;;;2598:81;;;;;;;;;;;;;;4177:6;:13;;;;4193:1;4177:17;4196:8;;862:2;2799:10;:29;;:68;;;;;2857:10;2844:9;:23;;2799:68;:98;;;;-1:-1:-1;2883:14:0;;;2799:98;:129;;;;-1:-1:-1;2913:15:0;;;2799:129;2778:196;;;;;;;;;;;;;;4220:14;;;;;;;:7;:14;;;;;;:21;;;;4237:4;4220:21;;;;;;4251:6;27:10:-1;;23:18;;;45:23;;4251:18:0;;;;;;;;;;;;4284:20;;;4220:14;4284:20;2689:1;;1624;1474;4029:282;:::o;3531:376:2:-;1388:10:0;1410:4;1388:27;1367:97;;;;;;;;;;;;;;3749:151:2;3784:17;3815:16;3845:11;3870:20;3749:21;:151::i;:::-;3531:376;;;;:::o;9741:378:0:-;9830:4;;;9877:236;9901:6;:13;9897:17;;9877:236;;;9939:28;;;;:13;:28;;;;;9968:6;:9;;9939:28;;;9975:1;;9968:9;;;;;;;;;;;;;;;;;;;;9939:39;;;;;;;;;;;;;;;9935:88;;;10007:1;9998:10;;;;9935:88;10049:8;;10040:5;:17;10036:67;;;10084:4;10077:11;;;;;;10036:67;9916:3;;9877:236;;;;9741:378;;;;;:::o;2428:194:1:-;1388:10:0;1410:4;1388:27;1367:97;;;;;;;;;;;;;;2528:17:1;:38;;;2581:34;;;;;;2548:18;;2581:34;;;;;;;;;;2428:194;:::o;1272:78:2:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11149:289:0:-;11247:13;;11276:156;11300:6;:13;11296:17;;11276:156;;;11338:28;;;;:13;:28;;;;;11367:6;:9;;11338:28;;;11374:1;;11367:9;;;;;;;;;;;;;;;;;;;;11338:39;;;;;;;;;;;;;;;11334:88;;;11406:1;11397:10;;;;11334:88;11315:3;;11276:156;;;;11149:289;;;:::o;902:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;902:52:0;;;;;;;-1:-1:-1;;902:52:0;;;:::o;12118:118::-;12184:16;12223:6;12216:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12118:118;;:::o;13383:742::-;13548:32;13596:35;13648:16;;13634:31;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13634:31:0;-1:-1:-1;13596:69:0;-1:-1:-1;13675:13:0;;13721:235;13737:16;;13733:1;:20;13721:235;;;13778:7;:36;;;;-1:-1:-1;13790:12:0;:15;;;;;;;;;;:24;;;;;13789:25;13778:36;:76;;;;13818:8;:36;;;;-1:-1:-1;13830:12:0;:15;;;;;;;;;;:24;;;;;13818:36;13774:172;;;13902:1;13874:18;13893:5;13874:25;;;;;;;;;;;;;:29;;;;;13930:1;13921:10;;;;13774:172;13755:3;;13721:235;;;14002:4;13997:2;:9;13983:24;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;13983:24:0;;13965:42;;14026:4;14022:8;;14017:102;14036:2;14032:1;:6;14017:102;;;14087:18;14106:1;14087:21;;;;;;;;;;;;;;14059:15;14079:4;14075:1;:8;14059:25;;;;;;;;;;;;;;;;;:49;14040:3;;14017:102;;;13383:742;;;;;;;;;:::o;12415:619::-;12509:31;12556:34;12607:6;:13;;;;12593:28;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;12593:28:0;-1:-1:-1;12556:65:0;-1:-1:-1;12631:13:0;;12677:202;12693:6;:13;12689:17;;12677:202;;;12731:28;;;;:13;:28;;;;;12760:6;:9;;12731:28;;;12767:1;;12760:9;;;;;;;;;;;;;;;;;;;;12731:39;;;;;;;;;;;;;;;12727:142;;;12817:6;12824:1;12817:9;;;;;;;;;;;;;;;;;;;;;;;;;12790:17;12808:5;12790:24;;;;;;;;;;;;;:36;;;;;;;;;;;12853:1;12844:10;;;;12727:142;12708:3;;12677:202;;;12919:5;12905:20;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;12905:20:0;;12888:37;;12944:1;12940:5;;12935:93;12951:5;12947:1;:9;12935:93;;;12997:17;13015:1;12997:20;;;;;;;;;;;;;;12977:14;12992:1;12977:17;;;;;;;;:40;;;;:17;;;;;;;;;;;:40;12958:3;;12935:93;;;12415:619;;;;;;:::o;1137:31::-;;;;:::o;5781:215::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;5886:6;:13;5901:9;862:2;2799:29;;;;;:68;;;2857:10;2844:9;:23;;2799:68;:98;;;;-1:-1:-1;2883:14:0;;;2799:98;:129;;;;-1:-1:-1;2913:15:0;;;2799:129;2778:196;;;;;;;;;;;;;;5926:8;:20;;;5961:28;;;;;;5937:9;;5961:28;;;;;;;;;;1474:1;;5781:215;:::o;2728:550:1:-;2814:10;1705:14:0;;;;:7;:14;;;;;;;;1684:79;;;;;;;;;;;;;;1919:1;1868:27;;;;;;;;;;:39;2852:13:1;;1868:53:0;:39;1847:115;;;;;;;;;;;;;;2267:28;;;;:13;:28;;;;;;;;2903:10:1;2267:35:0;;;;;;;;;2888:13:1;;2903:10;2267:35:0;;2266:36;2245:103;;;;;;;;;;;;;;2929:41:1;2973:26;2985:13;2973:11;:26::i;:::-;3010:28;;;;3053:4;3010:28;;;;;;;;3039:10;3010:40;;;;;;;;:47;;;;;;;;;;3072:39;;2929:70;;-1:-1:-1;3024:13:1;;3039:10;;3072:39;;;3127:36;3126:37;:67;;;;;3167:26;3179:13;3167:11;:26::i;:::-;3122:150;;;3209:52;3230:13;3245:15;3209:20;:52::i;:::-;2358:1:0;1972;;1773;2728:550:1;;:::o;6255:258:0:-;6369:21;6422:41;6438:11;6451:5;6458:4;6422:15;:41::i;:::-;6406:57;;6473:33;6492:13;6473:18;:33::i;:::-;6255:258;;;;;:::o;1192:53:1:-;;;;;;;;;;;;;:::o;820:44:0:-;862:2;820:44;:::o;1108:23::-;;;;:::o;5132:478::-;1388:10;1410:4;1388:27;1367:97;;;;;;;;;;;;;;1705:14;;;;;;;:7;:14;;;;;;5241:5;;1705:14;;1684:79;;;;;;;;;;;;;;1562:14;;;;;;;:7;:14;;;;;;5274:8;;1562:14;;1561:15;1540:74;;;;;;;;;;;;;;5303:9;5298:168;5322:6;:13;5318:17;;5298:168;;;5373:5;5360:18;;:6;5367:1;5360:9;;;;;;;;;;;;;;;;;;;;:18;5356:100;;;5410:8;5398:6;5405:1;5398:9;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;5436:5;;5356:100;5337:3;;5298:168;;;-1:-1:-1;5475:14:0;;;;5492:5;5475:14;;;:7;:14;;;;;;:22;;;;;;;;;5507:17;;;;;;;;:24;;;;;5475:22;5507:24;;;;5546:19;;5475:14;;5546:19;;;5580:23;;;;;;;;;;;1773:1;1474;5132:478;;:::o;4324:1721:2:-;2448:12:0;:27;;;;;;;;;;:36;;;4410:13:2;;2448:36:0;;2447:37;2426:103;;;;;;;;;;;;;;4448:13:2;1330:26:1;1342:13;1330:11;:26::i;:::-;1309:95;;;;;;;;;;;;;;4477:31:2;4511:27;;;;;;;;;;;;4548:20;;;:27;;4571:4;4548:27;;;;;;;;;4986:16;;;;4962:95;;;;4548:27;4962:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4511:27;;4850:19;;;;;;4962:95;4986:16;;4962:95;;4986:16;4962:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4836:221;;;;;;5150:14;5167:4;:11;5150:28;;5219:12;:19;5209:6;:29;:56;;;;;5252:6;:13;5242:6;:23;5209:56;5188:125;;;;;;;;;;;;;;5324:35;5362:32;;;:17;:32;;;;;;;5404:596;5426:6;5421:1;:11;5404:596;;5520:141;5562:27;5607:4;5612:1;5607:7;;;;;;;;;;;;;;5632:12;5645:1;5632:15;;;;;;;;;;;;;;5520:24;:141::i;:::-;5768:15;5788:12;5801:1;5788:15;;;;;;;;;;;;;;:20;;5815:6;5822:1;5815:9;;;;;;;;;;;;;;5826:4;5831:1;5826:7;;;;;;;;;;;;;;5788:46;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;5767:67:2;;;5929:10;5904:85;;;;;;;;;;;;;;-1:-1:-1;5434:3:2;;5404:596;;;-1:-1:-1;6014:24:2;;6024:13;;6014:24;;;;;1414:1:1;;;;;;2539::0;4324:1721:2;;:::o;6476:762::-;6752:26;6781:17;:44;;6824:1;6781:44;;;6801:20;6781:44;6752:73;;6835:24;;:::i;:::-;-1:-1:-1;6862:121:2;;;;;;;;;;;;;;;;;;;;;;;;6993:39;;;-1:-1:-1;6993:39:2;;;:21;:39;;;;;:52;;;;;;;;;;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7071:160;;;;;;7015:16;;7033:11;;6904:17;;6954:18;;7071:160;;;;;;;;;;6476:762;;;;;;:::o;3976:235:1:-;4086:32;;;;:17;:32;;;;;;;:51;;;4152:52;4104:13;;4152:52;;;;4121:16;;4152:52;;;;;;;;;;3976:235;;:::o;10452:500:0:-;10625:21;10595:11;2619:22;;;2598:81;;;;;;;;;;;;;;10678:16;;10734:140;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10734:140:0;;;;;;10704:27;;;;;;;;;;:170;;;;;;;;;;;;;;;-1:-1:-1;10704:170:0;;;;;;;10678:16;;-1:-1:-1;10734:140:0;;10704:27;;:170;;;;;;;;;;:::i;:::-;-1:-1:-1;10704:170:0;;;;;;;;;;;;;;;;;;;;;;;10884:16;:21;;-1:-1:-1;10884:21:0;;;10920:25;;10931:13;;10920:25;;-1:-1:-1;;10920:25:0;10452:500;;;;;;:::o;7501:837:2:-;7686:23;7712:18;:4;7686:23;7712:18;:15;:18;:::i;:::-;7686:44;;7740:24;;:::i;:::-;-1:-1:-1;7767:39:2;;;;;;;:21;:39;;;;;;;;:52;;;;;;;;;;;7740:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7873:416;;7999:26;;;;7963:63;;:27;;:63;;;:35;:63;:::i;:::-;7944:15;:82;;7919:168;;;;;;;;;;;;;;7873:416;;;8198:17;;8162:54;;:27;;:54;:35;:54;:::i;:::-;8143:15;:73;;8118:160;;;;;;;;;;;;;;7501:837;;;;;:::o;16814:871:6:-;16934:13;16978:5;16986:1;16978:9;16967:1;:8;:20;16963:290;;;17003:239;17025:216;17087:87;17192:1;:8;17218:5;17226:1;17218:9;17025:44;:216::i;:::-;17003:21;:239::i;:::-;-1:-1:-1;17329:2:6;17426:13;;;;;17420:20;17320:11;;;17579:66;17567:79;16814:871;;;;;:::o;1335:383:9:-;1421:7;1456:5;;;1475;;;1471:223;;;1496:187;1518:164;1575:55;1648:1;1667;1518:39;:164::i;1292:378:7:-;1480:12;1232:10;1551:37;;1602:9;1625:6;1645:8;1515:148;;;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;1515:148:7;;;49:4:-1;25:18;;61:17;;1515:148:7;182:15:-1;1515:148:7;;;;179:29:-1;;;;160:49;;;1515:148:7;-1:-1:-1;1292:378:7;;;;;:::o;1511:170:8:-;1654:9;1648:16;1641:4;1630:9;1626:20;1619:46;731:322:10;884:12;196:10;955:28;;997:9;1020:1;1035;919:127;;;;;;;;;;;801:7539:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;801:7539:2;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;801:7539:2;;;-1:-1:-1;801:7539:2;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;301:714:-1;;425:3;418:4;410:6;406:17;402:27;392:2;;-1:-1;;433:12;392:2;473:6;467:13;495:76;510:60;563:6;510:60;;;495:76;;;599:21;;;486:85;-1:-1;643:4;656:14;;;;631:17;;;745;;;736:27;;;;733:36;-1:-1;730:2;;;782:1;;772:12;730:2;807:1;792:217;817:6;814:1;811:13;792:217;;;226:6;220:13;238:33;265:5;238:33;;;885:61;;960:14;;;;988;;;;839:1;832:9;792:217;;;796:14;;;;;385:630;;;;;1758:714;;1882:3;1875:4;1867:6;1863:17;1859:27;1849:2;;-1:-1;;1890:12;1849:2;1930:6;1924:13;1952:76;1967:60;2020:6;1967:60;;1952:76;2056:21;;;1943:85;-1:-1;2100:4;2113:14;;;;2088:17;;;2202;;;2193:27;;;;2190:36;-1:-1;2187:2;;;2239:1;;2229:12;2187:2;2264:1;2249:217;2274:6;2271:1;2268:13;2249:217;;;3990:13;;2342:61;;2417:14;;;;2445;;;;2296:1;2289:9;2249:217;;2480:124;2544:20;;30798:13;;30791:21;32941:32;;32931:2;;32987:1;;32977:12;2747:434;;2855:3;2848:4;2840:6;2836:17;2832:27;2822:2;;-1:-1;;2863:12;2822:2;2903:6;2897:13;2925:60;2940:44;2977:6;2940:44;;2925:60;2916:69;;3005:6;2998:5;2991:21;3109:3;3041:4;3100:6;3033;3091:16;;3088:25;3085:2;;;3126:1;;3116:12;3085:2;3136:39;3168:6;3041:4;3067:5;3063:16;3041:4;3033:6;3029:17;3136:39;;4053:241;;4157:2;4145:9;4136:7;4132:23;4128:32;4125:2;;;-1:-1;;4163:12;4125:2;85:6;72:20;97:33;124:5;97:33;;4301:366;;;4422:2;4410:9;4401:7;4397:23;4393:32;4390:2;;;-1:-1;;4428:12;4390:2;85:6;72:20;97:33;124:5;97:33;;;4480:63;-1:-1;4580:2;4619:22;;72:20;97:33;72:20;97:33;;;4588:63;;;;4384:283;;;;;;4674:595;;;;4821:2;4809:9;4800:7;4796:23;4792:32;4789:2;;;-1:-1;;4827:12;4789:2;85:6;72:20;97:33;124:5;97:33;;;4879:63;-1:-1;4979:2;5018:22;;3842:20;;-1:-1;5115:2;5100:18;;5087:32;5139:18;5128:30;;5125:2;;;-1:-1;;5161:12;5125:2;5236:6;5225:9;5221:22;3291:3;3284:4;3276:6;3272:17;3268:27;3258:2;;-1:-1;;3299:12;3258:2;3346:6;3333:20;3319:34;;3368:64;3383:48;3424:6;3383:48;;3368:64;3452:6;3445:5;3438:21;3556:3;4979:2;3547:6;3480;3538:16;;3535:25;3532:2;;;-1:-1;;3563:12;3532:2;32056:6;4979:2;3480:6;3476:17;4979:2;3514:5;3510:16;32033:30;-1:-1;4979:2;32103:6;3514:5;32094:16;;32087:27;5181:72;;;;;;4783:486;;;;;;5276:908;;;;5493:2;5481:9;5472:7;5468:23;5464:32;5461:2;;;-1:-1;;5499:12;5461:2;5550:17;5544:24;5588:18;;5580:6;5577:30;5574:2;;;-1:-1;;5610:12;5574:2;5713:6;5702:9;5698:22;1168:3;1161:4;1153:6;1149:17;1145:27;1135:2;;-1:-1;;1176:12;1135:2;1216:6;1210:13;1196:27;;1238:81;1253:65;1311:6;1253:65;;1238:81;1347:21;;;1391:4;1404:14;;;;1325:16;1379:17;;;-1:-1;1484:242;1509:6;1506:1;1503:13;1484:242;;;1609:53;1658:3;1391:4;1585:3;1579:10;1383:6;1567:23;;1609:53;;;1597:66;;1677:14;;;;1705;;;;1531:1;1524:9;1484:242;;;-1:-1;;5773:18;;5767:25;5630:100;;-1:-1;5767:25;-1:-1;;;5801:30;;;5798:2;;;-1:-1;;5834:12;5798:2;5864:85;5941:7;5932:6;5921:9;5917:22;5864:85;;;5854:95;;6007:2;5996:9;5992:18;5986:25;5972:39;;5588:18;6023:6;6020:30;6017:2;;;-1:-1;;6053:12;6017:2;;6083:85;6160:7;6151:6;6140:9;6136:22;6083:85;;;6073:95;;;5455:729;;;;;;6191:354;;;6306:2;6294:9;6285:7;6281:23;6277:32;6274:2;;;-1:-1;;6312:12;6274:2;6374:50;6416:7;6392:22;6374:50;;;6364:60;;6479:50;6521:7;6461:2;6501:9;6497:22;6479:50;;;6469:60;;6268:277;;;;;;6552:609;;;;;6703:3;6691:9;6682:7;6678:23;6674:33;6671:2;;;-1:-1;;6710:12;6671:2;2557:6;2544:20;2569:30;2593:5;2569:30;;;6762:60;-1:-1;6859:2;6897:22;;2677:20;2702:32;2677:20;2702:32;;;6867:62;-1:-1;6966:2;7005:22;;72:20;97:33;72:20;97:33;;;6974:63;-1:-1;7074:2;7113:22;;3705:20;31384:34;31373:46;;33184:35;;33174:2;;-1:-1;;33223:12;33174:2;6665:496;;;;-1:-1;6665:496;;-1:-1;;6665:496;7168:364;;;7288:2;7276:9;7267:7;7263:23;7259:32;7256:2;;;-1:-1;;7294:12;7256:2;2690:6;2677:20;2702:32;2728:5;2702:32;;7539:241;;7643:2;7631:9;7622:7;7618:23;7614:32;7611:2;;;-1:-1;;7649:12;7611:2;-1:-1;3842:20;;7605:175;-1:-1;7605:175;7787:366;;;7908:2;7896:9;7887:7;7883:23;7879:32;7876:2;;;-1:-1;;7914:12;7876:2;3855:6;3842:20;7966:63;;8066:2;8109:9;8105:22;72:20;97:33;124:5;97:33;;8160:605;;;;;8309:3;8297:9;8288:7;8284:23;8280:33;8277:2;;;-1:-1;;8316:12;8277:2;3855:6;3842:20;8368:63;;8468:2;8511:9;8507:22;3842:20;8476:63;;8576:2;8616:9;8612:22;2544:20;2569:30;2593:5;2569:30;;;8584:60;-1:-1;8681:2;8717:22;;2544:20;2569:30;2544:20;2569:30;;17063:254;;11546:5;29225:12;11657:52;11702:6;11697:3;11690:4;11683:5;11679:16;11657:52;;;11721:16;;;;;17184:133;-1:-1;;17184:133;17324:213;31504:42;31493:54;;;;9197:37;;17442:2;17427:18;;17413:124;17544:611;;31504:42;9227:5;31493:54;9204:3;9197:37;16924:5;17919:2;17908:9;17904:18;16894:37;17754:3;17956:2;17945:9;17941:18;17934:48;11186:5;29225:12;29895:6;17754:3;17743:9;17739:19;29883;11279:52;11324:6;29923:14;17743:9;29923:14;17919:2;11305:5;11301:16;11279:52;;;30798:13;;30791:21;18141:2;18126:18;;10889:34;-1:-1;32493:2;32473:14;;;;32489:7;32469:28;11343:39;29923:14;11343:39;;17725:430;-1:-1;;;17725:430;18162:361;18330:2;18344:47;;;29225:12;;18315:18;;;29883:19;;;18162:361;;28921:14;;;29923;;;;18162:361;9805:260;9830:6;9827:1;9824:13;9805:260;;;9891:13;;31504:42;31493:54;9197:37;;18330:2;29623:14;;;;8926;;;;9852:1;9845:9;9805:260;;;-1:-1;18397:116;;18301:222;-1:-1;;;;;18301:222;18530:361;18698:2;18712:47;;;29225:12;;18683:18;;;29883:19;;;18530:361;;28921:14;;;29923;;;;18530:361;10534:260;10559:6;10556:1;10553:13;10534:260;;;10620:13;;16894:37;;18698:2;29623:14;;;;9108;;;;10581:1;10574:9;10534:260;;18898:201;30798:13;;30791:21;10889:34;;19010:2;18995:18;;18981:118;19106:312;30798:13;;30791:21;10889:34;;31384;31373:46;19404:2;19389:18;;16784:37;19246:2;19231:18;;19217:201;19425:531;30896:66;30885:78;;;;11004:36;;31504:42;31493:54;;;;19782:2;19767:18;;9197:37;30798:13;30791:21;19859:2;19844:18;;10889:34;31384;31373:46;19942:2;19927:18;;16784:37;19619:3;19604:19;;19590:366;19963:471;20155:2;20140:18;;32599:1;32589:12;;32579:2;;32605:9;32579:2;11838:68;;;20337:2;20322:18;;16894:37;;;;20420:2;20405:18;;;16894:37;20126:308;;20441:501;20648:2;20633:18;;32732:1;32722:12;;32712:2;;32738:9;20949:407;21140:2;21154:47;;;12342:2;21125:18;;;29883:19;12378:14;29923;;;12358:35;12412:12;;;21111:245;21363:407;21554:2;21568:47;;;12663:2;21539:18;;;29883:19;12699:30;29923:14;;;12679:51;12749:12;;;21525:245;21777:407;21968:2;21982:47;;;13000:2;21953:18;;;29883:19;13036:14;29923;;;13016:35;13070:12;;;21939:245;22191:407;22382:2;22396:47;;;13321:2;22367:18;;;29883:19;13357:22;29923:14;;;13337:43;13399:12;;;22353:245;22605:407;22796:2;22810:47;;;13650:2;22781:18;;;29883:19;13686:24;29923:14;;;13666:45;13730:12;;;22767:245;23019:407;23210:2;23224:47;;;13981:2;23195:18;;;29883:19;14017:17;29923:14;;;13997:38;14054:12;;;23181:245;23433:407;23624:2;23638:47;;;14305:2;23609:18;;;29883:19;14341:18;29923:14;;;14321:39;14379:12;;;23595:245;23847:407;24038:2;24052:47;;;14630:2;24023:18;;;29883:19;14666:24;29923:14;;;14646:45;14710:12;;;24009:245;24261:407;24452:2;24466:47;;;14961:2;24437:18;;;29883:19;14997:18;29923:14;;;14977:39;15035:12;;;24423:245;24675:407;24866:2;24880:47;;;15286:2;24851:18;;;29883:19;15322:20;29923:14;;;15302:41;15362:12;;;24837:245;25089:407;25280:2;25294:47;;;15613:2;25265:18;;;29883:19;15649:29;29923:14;;;15629:50;15698:12;;;25251:245;25503:407;25694:2;25708:47;;;15949:2;25679:18;;;29883:19;15985:25;29923:14;;;15965:46;16030:12;;;25665:245;25917:407;26108:2;26122:47;;;16281:2;26093:18;;;29883:19;16317:21;29923:14;;;16297:42;16358:12;;;26079:245;26331:407;26522:2;26536:47;;;16609:2;26507:18;;;29883:19;16645:22;29923:14;;;16625:43;16687:12;;;26493:245;26745:213;16894:37;;;26863:2;26848:18;;26834:124;26965:256;27027:2;27021:9;27053:17;;;27128:18;27113:34;;27149:22;;;27110:62;27107:2;;;27185:1;;27175:12;27107:2;27027;27194:22;27005:216;;-1:-1;27005:216;27228:300;;27383:18;27375:6;27372:30;27369:2;;;-1:-1;;27405:12;27369:2;-1:-1;27450:4;27438:17;;;27503:15;;27306:222;28154:317;;28293:18;28285:6;28282:30;28279:2;;;-1:-1;;28315:12;28279:2;-1:-1;28392:4;28369:17;28388:9;28365:33;28456:4;28446:15;;28216:255;32129:268;32194:1;32201:101;32215:6;32212:1;32209:13;32201:101;;;32282:11;;;32276:18;32263:11;;;32256:39;32237:2;32230:10;32201:101;;;32317:6;32314:1;32311:13;32308:2;;;-1:-1;;32194:1;32364:16;;32357:27;32178:219;32761:117;31504:42;32848:5;31493:54;32823:5;32820:35;32810:2;;32869:1;;32859:12;32810:2;32804:74;;32885:111;32966:5;30798:13;30791:21;32944:5;32941:32;32931:2;;32987:1;;32977:12;33003:115;30896:66;33088:5;30885:78;33064:5;33061:34;33051:2;;33109:1;;33099:12

Swarm Source

bzzr://eb641e70c38ba100ed9bcb2a7474c02d26a057115596c1e9b72ae145a7d540a2
Block Transaction Difficulty Gas Used Reward
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.