Address Details
contract
proxy

0x4a68eF30D695b722808c126db01730095Cf1c92b

Contract Name
MoolaGovernorBravoDelegate
Creator
0x007e71–f37016 at 0xf46f29–b3bfaa
Implementation
0x0000000000000000000000000000000000000000
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
15236726
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MoolaGovernorBravoDelegate




Optimization enabled
true
Compiler version
v0.8.11+commit.d7f03943




Optimization runs
200
EVM Version
london




Verified at
2022-09-21T15:47:08.818591Z

contracts/governance/MoolaGovernorBravoDelegate.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

import "./interfaces/GovernorBravoInterfaces.sol";

contract MoolaGovernorBravoDelegate is
  GovernorBravoDelegateStorageV2,
  GovernorBravoEvents
{
  /// @notice The name of this contract
  string public constant name = "Moola Governor Bravo";

  /// @notice The minimum setable proposal threshold
  uint256 public constant MIN_PROPOSAL_THRESHOLD = 1000e18; // 1,000 MOO

  /// @notice The maximum setable proposal threshold
  uint256 public constant MAX_PROPOSAL_THRESHOLD = 100000e18; //100,000 MOO

  /// @notice The minimum setable voting period
  uint256 public constant MIN_VOTING_PERIOD = 200; // About 24 hours

  /// @notice The max setable voting period
  uint256 public constant MAX_VOTING_PERIOD = 80640; // About 2 weeks

  /// @notice The min setable voting delay
  uint256 public constant MIN_VOTING_DELAY = 1;

  /// @notice The max setable voting delay
  uint256 public constant MAX_VOTING_DELAY = 40320; // About 1 week

  /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
  uint256 public constant quorumVotes = 4000000e18; // 400,000 = 4% of MOO

  /// @notice The maximum number of actions that can be included in a proposal
  uint256 public constant proposalMaxOperations = 10; // 10 actions

  /// @notice The EIP-712 typehash for the contract's domain
  bytes32 public constant DOMAIN_TYPEHASH =
    keccak256(
      "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
    );

  /// @notice The EIP-712 typehash for the ballot struct used by the contract
  bytes32 public constant BALLOT_TYPEHASH =
    keccak256("Ballot(uint256 proposalId,uint8 support)");

  /**
   * @notice Used to initialize the contract during delegator constructor
   * @param timelock_ The address of the Timelock
   * @param moo_ The address of the MOO token
   * @param votingPeriod_ The initial voting period
   * @param votingDelay_ The initial voting delay
   * @param proposalThreshold_ The initial proposal threshold
   */
  function initialize(
    address timelock_,
    address moo_,
    uint256 votingPeriod_,
    uint256 votingDelay_,
    uint256 proposalThreshold_
  ) public virtual {
    require(
      address(timelock) == address(0),
      "GovernorBravo::initialize: can only initialize once"
    );
    require(msg.sender == admin, "GovernorBravo::initialize: admin only");
    require(
      timelock_ != address(0),
      "GovernorBravo::initialize: invalid timelock address"
    );
    require(
      moo_ != address(0),
      "GovernorBravo::initialize: invalid moo address"
    );
    require(
      votingPeriod_ >= MIN_VOTING_PERIOD && votingPeriod_ <= MAX_VOTING_PERIOD,
      "GovernorBravo::initialize: invalid voting period"
    );
    require(
      votingDelay_ >= MIN_VOTING_DELAY && votingDelay_ <= MAX_VOTING_DELAY,
      "GovernorBravo::initialize: invalid voting delay"
    );
    require(
      proposalThreshold_ >= MIN_PROPOSAL_THRESHOLD &&
        proposalThreshold_ <= MAX_PROPOSAL_THRESHOLD,
      "GovernorBravo::initialize: invalid proposal threshold"
    );

    timelock = TimelockInterface(timelock_);
    moo = CompInterface(moo_);
    votingPeriod = votingPeriod_;
    votingDelay = votingDelay_;
    proposalThreshold = proposalThreshold_;
  }

  /**
   * @notice Function used to propose a new proposal. Sender must have delegates above the proposal threshold
   * @param targets Target addresses for proposal calls
   * @param values Eth values for proposal calls
   * @param signatures Function signatures for proposal calls
   * @param calldatas Calldatas for proposal calls
   * @param description String description of the proposal
   * @return Proposal id of new proposal
   */
  function propose(
    address[] memory targets,
    uint256[] memory values,
    string[] memory signatures,
    bytes[] memory calldatas,
    string memory description
  ) public returns (uint256) {
    //

    // Allow addresses above proposal threshold and whitelisted addresses to propose
    require(
      moo.getPriorVotes(msg.sender, sub256(block.number, 1)) >
        proposalThreshold ||
        isWhitelisted(msg.sender),
      "GovernorBravo::propose: proposer votes below proposal threshold"
    );
    require(
      targets.length == values.length &&
        targets.length == signatures.length &&
        targets.length == calldatas.length,
      "GovernorBravo::propose: proposal function information arity mismatch"
    );
    require(
      targets.length != 0,
      "GovernorBravo::propose: must provide actions"
    );
    require(
      targets.length <= proposalMaxOperations,
      "GovernorBravo::propose: too many actions"
    );

    uint256 latestProposalId = latestProposalIds[msg.sender];
    if (latestProposalId != 0) {
      ProposalState proposersLatestProposalState = state(latestProposalId);
      require(
        proposersLatestProposalState != ProposalState.Active,
        "GovernorBravo::propose: one live proposal per proposer, found an already active proposal"
      );
      require(
        proposersLatestProposalState != ProposalState.Pending,
        "GovernorBravo::propose: one live proposal per proposer, found an already pending proposal"
      );
    }

    uint256 startBlock = add256(block.number, votingDelay);
    uint256 endBlock = add256(startBlock, votingPeriod);

    proposalCount++;
    uint256 newProposalID = proposalCount;
    Proposal storage newProposal = proposals[newProposalID];
    // This should never happen but add a check in case.
    require(newProposal.id == 0, "GovernorBravo::propose: ProposalID collsion");
    newProposal.id = newProposalID;
    newProposal.proposer = msg.sender;
    newProposal.eta = 0;
    newProposal.targets = targets;
    newProposal.values = values;
    newProposal.signatures = signatures;
    newProposal.calldatas = calldatas;
    newProposal.startBlock = startBlock;
    newProposal.endBlock = endBlock;
    newProposal.forVotes = 0;
    newProposal.againstVotes = 0;
    newProposal.abstainVotes = 0;
    newProposal.canceled = false;
    newProposal.executed = false;

    latestProposalIds[newProposal.proposer] = newProposal.id;

    emit ProposalCreated(
      newProposal.id,
      msg.sender,
      targets,
      values,
      signatures,
      calldatas,
      startBlock,
      endBlock,
      description
    );
    return newProposal.id;
  }

  /**
   * @notice Queues a proposal of state succeeded
   * @param proposalId The id of the proposal to queue
   */
  function queue(uint256 proposalId) external {
    require(
      state(proposalId) == ProposalState.Succeeded,
      "GovernorBravo::queue: proposal can only be queued if it is succeeded"
    );
    Proposal storage proposal = proposals[proposalId];
    uint256 eta = add256(block.timestamp, timelock.delay());
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      queueOrRevertInternal(
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        eta
      );
    }
    proposal.eta = eta;
    emit ProposalQueued(proposalId, eta);
  }

  function queueOrRevertInternal(
    address target,
    uint256 value,
    string memory signature,
    bytes memory data,
    uint256 eta
  ) internal {
    require(
      !timelock.queuedTransactions(
        keccak256(abi.encode(target, value, signature, data, eta))
      ),
      "GovernorBravo::queueOrRevertInternal: identical proposal action already queued at eta"
    );
    timelock.queueTransaction(target, value, signature, data, eta);
  }

  /**
   * @notice Executes a queued proposal if eta has passed
   * @param proposalId The id of the proposal to execute
   */
  function execute(uint256 proposalId) external payable {
    require(
      state(proposalId) == ProposalState.Queued,
      "GovernorBravo::execute: proposal can only be executed if it is queued"
    );
    Proposal storage proposal = proposals[proposalId];
    proposal.executed = true;
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      timelock.executeTransaction{value: proposal.values[i]}(
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        proposal.eta
      );
    }
    emit ProposalExecuted(proposalId);
  }

  /**
   * @notice Cancels a proposal only if sender is the proposer, or proposer delegates dropped below proposal threshold
   * @param proposalId The id of the proposal to cancel
   */
  function cancel(uint256 proposalId) external {
    require(
      state(proposalId) != ProposalState.Executed,
      "GovernorBravo::cancel: cannot cancel executed proposal"
    );

    Proposal storage proposal = proposals[proposalId];

    // Proposer can cancel
    if (msg.sender != proposal.proposer) {
      // Whitelisted proposers can't be canceled for falling below proposal threshold
      if (isWhitelisted(proposal.proposer)) {
        require(
          (moo.getPriorVotes(proposal.proposer, sub256(block.number, 1)) <
            proposalThreshold) && msg.sender == whitelistGuardian,
          "GovernorBravo::cancel: whitelisted proposer"
        );
      } else {
        require(
          (moo.getPriorVotes(proposal.proposer, sub256(block.number, 1)) <
            proposalThreshold),
          "GovernorBravo::cancel: proposer above threshold"
        );
      }
    }

    proposal.canceled = true;
    for (uint256 i = 0; i < proposal.targets.length; i++) {
      timelock.cancelTransaction(
        proposal.targets[i],
        proposal.values[i],
        proposal.signatures[i],
        proposal.calldatas[i],
        proposal.eta
      );
    }

    emit ProposalCanceled(proposalId);
  }

  /**
   * @notice Gets actions of a proposal
   * @param proposalId the id of the proposal
   * @return targets of the proposal actions
   * @return values of the proposal actions
   * @return signatures of the proposal actions
   * @return calldatas of the proposal actions
   */
  function getActions(uint256 proposalId)
    external
    view
    returns (
      address[] memory targets,
      uint256[] memory values,
      string[] memory signatures,
      bytes[] memory calldatas
    )
  {
    Proposal storage p = proposals[proposalId];
    return (p.targets, p.values, p.signatures, p.calldatas);
  }

  /**
   * @notice Gets the receipt for a voter on a given proposal
   * @param proposalId the id of proposal
   * @param voter The address of the voter
   * @return The voting receipt
   */
  function getReceipt(uint256 proposalId, address voter)
    external
    view
    returns (Receipt memory)
  {
    return proposals[proposalId].receipts[voter];
  }

  /**
   * @notice Gets the state of a proposal
   * @param proposalId The id of the proposal
   * @return Proposal state
   */
  function state(uint256 proposalId) public view returns (ProposalState) {
    require(
      proposalCount >= proposalId && proposalId > initialProposalId,
      "GovernorBravo::state: invalid proposal id"
    );
    Proposal storage proposal = proposals[proposalId];
    if (proposal.canceled) {
      return ProposalState.Canceled;
    } else if (block.number <= proposal.startBlock) {
      return ProposalState.Pending;
    } else if (block.number <= proposal.endBlock) {
      return ProposalState.Active;
    } else if (
      proposal.forVotes <= proposal.againstVotes ||
      proposal.forVotes < quorumVotes
    ) {
      return ProposalState.Defeated;
    } else if (proposal.eta == 0) {
      return ProposalState.Succeeded;
    } else if (proposal.executed) {
      return ProposalState.Executed;
    } else if (
      block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())
    ) {
      return ProposalState.Expired;
    } else {
      return ProposalState.Queued;
    }
  }

  /**
   * @notice Cast a vote for a proposal
   * @param proposalId The id of the proposal to vote on
   * @param support The support value for the vote. 0=against, 1=for, 2=abstain
   */
  function castVote(uint256 proposalId, uint8 support) external {
    emit VoteCast(
      msg.sender,
      proposalId,
      support,
      castVoteInternal(msg.sender, proposalId, support),
      ""
    );
  }

  /**
   * @notice Cast a vote for a proposal with a reason
   * @param proposalId The id of the proposal to vote on
   * @param support The support value for the vote. 0=against, 1=for, 2=abstain
   * @param reason The reason given for the vote by the voter
   */
  function castVoteWithReason(
    uint256 proposalId,
    uint8 support,
    string calldata reason
  ) external {
    emit VoteCast(
      msg.sender,
      proposalId,
      support,
      castVoteInternal(msg.sender, proposalId, support),
      reason
    );
  }

  /**
   * @notice Cast a vote for a proposal by signature
   * @dev External function that accepts EIP-712 signatures for voting on proposals.
   */
  function castVoteBySig(
    uint256 proposalId,
    uint8 support,
    uint8 v,
    bytes32 r,
    bytes32 s
  ) external {
    bytes32 domainSeparator = keccak256(
      abi.encode(
        DOMAIN_TYPEHASH,
        keccak256(bytes(name)),
        getChainIdInternal(),
        address(this)
      )
    );
    bytes32 structHash = keccak256(
      abi.encode(BALLOT_TYPEHASH, proposalId, support)
    );
    bytes32 digest = keccak256(
      abi.encodePacked("\x19\x01", domainSeparator, structHash)
    );
    address signatory = ecrecover(digest, v, r, s);
    require(
      signatory != address(0),
      "GovernorBravo::castVoteBySig: invalid signature"
    );
    emit VoteCast(
      signatory,
      proposalId,
      support,
      castVoteInternal(signatory, proposalId, support),
      ""
    );
  }

  /**
   * @notice Internal function that caries out voting logic
   * @param voter The voter that is casting their vote
   * @param proposalId The id of the proposal to vote on
   * @param support The support value for the vote. 0=against, 1=for, 2=abstain
   * @return The number of votes cast
   */
  function castVoteInternal(
    address voter,
    uint256 proposalId,
    uint8 support
  ) internal returns (uint96) {
    require(
      state(proposalId) == ProposalState.Active,
      "GovernorBravo::castVoteInternal: voting is closed"
    );
    require(support <= 2, "GovernorBravo::castVoteInternal: invalid vote type");
    Proposal storage proposal = proposals[proposalId];
    Receipt storage receipt = proposal.receipts[voter];
    require(
      receipt.hasVoted == false,
      "GovernorBravo::castVoteInternal: voter already voted"
    );
    uint96 votes = moo.getPriorVotes(voter, proposal.startBlock);

    if (support == 0) {
      proposal.againstVotes = add256(proposal.againstVotes, votes);
    } else if (support == 1) {
      proposal.forVotes = add256(proposal.forVotes, votes);
    } else if (support == 2) {
      proposal.abstainVotes = add256(proposal.abstainVotes, votes);
    }

    receipt.hasVoted = true;
    receipt.support = support;
    receipt.votes = votes;

    return votes;
  }

  /**
   * @notice View function which returns if an account is whitelisted
   * @param account Account to check white list status of
   * @return If the account is whitelisted
   */
  function isWhitelisted(address account) public view returns (bool) {
    return (whitelistAccountExpirations[account] > block.timestamp);
  }

  /**
   * @notice Admin function for setting the voting delay
   * @param newVotingDelay new voting delay, in blocks
   */
  function _setVotingDelay(uint256 newVotingDelay) external {
    require(msg.sender == admin, "GovernorBravo::_setVotingDelay: admin only");
    require(
      newVotingDelay >= MIN_VOTING_DELAY && newVotingDelay <= MAX_VOTING_DELAY,
      "GovernorBravo::_setVotingDelay: invalid voting delay"
    );
    uint256 oldVotingDelay = votingDelay;
    votingDelay = newVotingDelay;

    emit VotingDelaySet(oldVotingDelay, votingDelay);
  }

  /**
   * @notice Admin function for setting the voting period
   * @param newVotingPeriod new voting period, in blocks
   */
  function _setVotingPeriod(uint256 newVotingPeriod) external {
    require(msg.sender == admin, "GovernorBravo::_setVotingPeriod: admin only");
    require(
      newVotingPeriod >= MIN_VOTING_PERIOD &&
        newVotingPeriod <= MAX_VOTING_PERIOD,
      "GovernorBravo::_setVotingPeriod: invalid voting period"
    );
    uint256 oldVotingPeriod = votingPeriod;
    votingPeriod = newVotingPeriod;

    emit VotingPeriodSet(oldVotingPeriod, votingPeriod);
  }

  /**
   * @notice Admin function for setting the proposal threshold
   * @dev newProposalThreshold must be greater than the hardcoded min
   * @param newProposalThreshold new proposal threshold
   */
  function _setProposalThreshold(uint256 newProposalThreshold) external {
    require(
      msg.sender == admin,
      "GovernorBravo::_setProposalThreshold: admin only"
    );
    require(
      newProposalThreshold >= MIN_PROPOSAL_THRESHOLD &&
        newProposalThreshold <= MAX_PROPOSAL_THRESHOLD,
      "GovernorBravo::_setProposalThreshold: invalid proposal threshold"
    );
    uint256 oldProposalThreshold = proposalThreshold;
    proposalThreshold = newProposalThreshold;

    emit ProposalThresholdSet(oldProposalThreshold, proposalThreshold);
  }

  /**
   * @notice Admin function for setting the whitelist expiration as a timestamp for an account. Whitelist status allows accounts to propose without meeting threshold
   * @param account Account address to set whitelist expiration for
   * @param expiration Expiration for account whitelist status as timestamp (if now < expiration, whitelisted)
   */
  function _setWhitelistAccountExpiration(address account, uint256 expiration)
    external
  {
    require(
      msg.sender == admin || msg.sender == whitelistGuardian,
      "GovernorBravo::_setWhitelistAccountExpiration: admin only"
    );
    whitelistAccountExpirations[account] = expiration;

    emit WhitelistAccountExpirationSet(account, expiration);
  }

  /**
   * @notice Admin function for setting the whitelistGuardian. WhitelistGuardian can cancel proposals from whitelisted addresses
   * @param account Account to set whitelistGuardian to (0x0 to remove whitelistGuardian)
   */
  function _setWhitelistGuardian(address account) external {
    require(
      msg.sender == admin,
      "GovernorBravo::_setWhitelistGuardian: admin only"
    );
    address oldGuardian = whitelistGuardian;
    whitelistGuardian = account;

    emit WhitelistGuardianSet(oldGuardian, whitelistGuardian);
  }

  /**
   * @notice Initiate the GovernorBravo contract
   * @dev Admin only.
   * Sets admin role for timelock
   */
  function _initiate() external {
    require(msg.sender == admin, "GovernorBravo::_initiate: admin only");
    require(
      initialProposalId == 0,
      "GovernorBravo::_initiate: can only initiate once"
    );

    // Accept admin role
    timelock.acceptAdmin();
  }

  /**
   * @notice Begins transfer of admin rights. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.
   * @dev Admin function to begin change of admin. The newPendingAdmin must call `_acceptAdmin` to finalize the transfer.
   * @param newPendingAdmin New pending admin.
   */
  function _setPendingAdmin(address newPendingAdmin) external {
    // Check caller = admin
    require(msg.sender == admin, "GovernorBravo:_setPendingAdmin: admin only");

    // Save current value, if any, for inclusion in log
    address oldPendingAdmin = pendingAdmin;

    // Store pendingAdmin with value newPendingAdmin
    pendingAdmin = newPendingAdmin;

    // Emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin)
    emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);
  }

  /**
   * @notice Accepts transfer of admin rights. msg.sender must be pendingAdmin
   * @dev Admin function for pending admin to accept role and update admin
   */
  function _acceptAdmin() external {
    // Check caller is pendingAdmin and pendingAdmin ≠ address(0)
    require(
      msg.sender == pendingAdmin && msg.sender != address(0),
      "GovernorBravo:_acceptAdmin: pending admin only"
    );

    // Save current values for inclusion in log
    address oldAdmin = admin;
    address oldPendingAdmin = pendingAdmin;

    // Store admin with value pendingAdmin
    admin = pendingAdmin;

    // Clear the pending value
    pendingAdmin = address(0);

    emit NewAdmin(oldAdmin, admin);
    emit NewPendingAdmin(oldPendingAdmin, pendingAdmin);
  }

  function add256(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, "addition overflow");
    return c;
  }

  function sub256(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a, "subtraction underflow");
    return a - b;
  }

  function getChainIdInternal() internal view returns (uint256) {
    uint256 chainId;
    assembly {
      chainId := chainid()
    }
    return chainId;
  }
}
        

/contracts/governance/interfaces/GovernorBravoInterfaces.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

contract GovernorBravoEvents {
  /// @notice An event emitted when a new proposal is created
  event ProposalCreated(
    uint256 id,
    address proposer,
    address[] targets,
    uint256[] values,
    string[] signatures,
    bytes[] calldatas,
    uint256 startBlock,
    uint256 endBlock,
    string description
  );

  /// @notice An event emitted when a vote has been cast on a proposal
  /// @param voter The address which casted a vote
  /// @param proposalId The proposal id which was voted on
  /// @param support Support value for the vote. 0=against, 1=for, 2=abstain
  /// @param votes Number of votes which were cast by the voter
  /// @param reason The reason given for the vote by the voter
  event VoteCast(
    address indexed voter,
    uint256 proposalId,
    uint8 support,
    uint256 votes,
    string reason
  );

  /// @notice An event emitted when a proposal has been canceled
  event ProposalCanceled(uint256 id);

  /// @notice An event emitted when a proposal has been queued in the Timelock
  event ProposalQueued(uint256 id, uint256 eta);

  /// @notice An event emitted when a proposal has been executed in the Timelock
  event ProposalExecuted(uint256 id);

  /// @notice An event emitted when the voting delay is set
  event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);

  /// @notice An event emitted when the voting period is set
  event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);

  /// @notice Emitted when implementation is changed
  event NewImplementation(address oldImplementation, address newImplementation);

  /// @notice Emitted when proposal threshold is set
  event ProposalThresholdSet(
    uint256 oldProposalThreshold,
    uint256 newProposalThreshold
  );

  /// @notice Emitted when pendingAdmin is changed
  event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);

  /// @notice Emitted when pendingAdmin is accepted, which means admin is updated
  event NewAdmin(address oldAdmin, address newAdmin);

  /// @notice Emitted when whitelist account expiration is set
  event WhitelistAccountExpirationSet(address account, uint256 expiration);

  /// @notice Emitted when the whitelistGuardian is set
  event WhitelistGuardianSet(address oldGuardian, address newGuardian);
}

contract GovernorBravoDelegatorStorage {
  /// @notice Administrator for this contract
  address public admin;

  /// @notice Pending administrator for this contract
  address public pendingAdmin;

  /// @notice Active brains of Governor
  address public implementation;
}

/**
 * @title Storage for Governor Bravo Delegate
 * @notice For future upgrades, do not change GovernorBravoDelegateStorageV1. Create a new
 * contract which implements GovernorBravoDelegateStorageV1 and following the naming convention
 * GovernorBravoDelegateStorageVX.
 */
contract GovernorBravoDelegateStorageV1 is GovernorBravoDelegatorStorage {
  /// @notice The delay before voting on a proposal may take place, once proposed, in blocks
  uint256 public votingDelay;

  /// @notice The duration of voting on a proposal, in blocks
  uint256 public votingPeriod;

  /// @notice The number of votes required in order for a voter to become a proposer
  uint256 public proposalThreshold;

  /// @notice Initial proposal id set at become
  uint256 public initialProposalId;

  /// @notice The total number of proposals
  uint256 public proposalCount;

  /// @notice The address of the Moola Protocol Timelock
  TimelockInterface public timelock;

  /// @notice The address of the Moola governance token
  CompInterface public moo;

  /// @notice The official record of all proposals ever proposed
  mapping(uint256 => Proposal) public proposals;

  /// @notice The latest proposal for each proposer
  mapping(address => uint256) public latestProposalIds;

  struct Proposal {
    /// @notice Unique id for looking up a proposal
    uint256 id;
    /// @notice Creator of the proposal
    address proposer;
    /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
    uint256 eta;
    /// @notice the ordered list of target addresses for calls to be made
    address[] targets;
    /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made
    uint256[] values;
    /// @notice The ordered list of function signatures to be called
    string[] signatures;
    /// @notice The ordered list of calldata to be passed to each call
    bytes[] calldatas;
    /// @notice The block at which voting begins: holders must delegate their votes prior to this block
    uint256 startBlock;
    /// @notice The block at which voting ends: votes must be cast prior to this block
    uint256 endBlock;
    /// @notice Current number of votes in favor of this proposal
    uint256 forVotes;
    /// @notice Current number of votes in opposition to this proposal
    uint256 againstVotes;
    /// @notice Current number of votes for abstaining for this proposal
    uint256 abstainVotes;
    /// @notice Flag marking whether the proposal has been canceled
    bool canceled;
    /// @notice Flag marking whether the proposal has been executed
    bool executed;
    /// @notice Receipts of ballots for the entire set of voters
    mapping(address => Receipt) receipts;
  }

  /// @notice Ballot receipt record for a voter
  struct Receipt {
    /// @notice Whether or not a vote has been cast
    bool hasVoted;
    /// @notice Whether or not the voter supports the proposal or abstains
    uint8 support;
    /// @notice The number of votes the voter had, which were cast
    uint96 votes;
  }

  /// @notice Possible states that a proposal may be in
  enum ProposalState {
    Pending,
    Active,
    Canceled,
    Defeated,
    Succeeded,
    Queued,
    Expired,
    Executed
  }
}

contract GovernorBravoDelegateStorageV2 is GovernorBravoDelegateStorageV1 {
  /// @notice Stores the expiration of account whitelist status as a timestamp
  mapping(address => uint256) public whitelistAccountExpirations;

  /// @notice Address which manages whitelisted proposals and whitelist accounts
  address public whitelistGuardian;
}

interface TimelockInterface {
  function delay() external view returns (uint256);

  function GRACE_PERIOD() external view returns (uint256);

  function acceptAdmin() external;

  function queuedTransactions(bytes32 hash) external view returns (bool);

  function queueTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external returns (bytes32);

  function cancelTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external;

  function executeTransaction(
    address target,
    uint256 value,
    string calldata signature,
    bytes calldata data,
    uint256 eta
  ) external payable returns (bytes memory);
}

interface CompInterface {
  function getPriorVotes(address account, uint256 blockNumber)
    external
    view
    returns (uint96);
}

interface GovernorAlpha {
  /// @notice The total number of proposals
  function proposalCount() external returns (uint256);
}
          

Contract ABI

[{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewImplementation","inputs":[{"type":"address","name":"oldImplementation","internalType":"address","indexed":false},{"type":"address","name":"newImplementation","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"oldPendingAdmin","internalType":"address","indexed":false},{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalQueued","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalThresholdSet","inputs":[{"type":"uint256","name":"oldProposalThreshold","internalType":"uint256","indexed":false},{"type":"uint256","name":"newProposalThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":true},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"uint8","name":"support","internalType":"uint8","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","indexed":false},{"type":"string","name":"reason","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"VotingDelaySet","inputs":[{"type":"uint256","name":"oldVotingDelay","internalType":"uint256","indexed":false},{"type":"uint256","name":"newVotingDelay","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VotingPeriodSet","inputs":[{"type":"uint256","name":"oldVotingPeriod","internalType":"uint256","indexed":false},{"type":"uint256","name":"newVotingPeriod","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistAccountExpirationSet","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false},{"type":"uint256","name":"expiration","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"WhitelistGuardianSet","inputs":[{"type":"address","name":"oldGuardian","internalType":"address","indexed":false},{"type":"address","name":"newGuardian","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BALLOT_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_PROPOSAL_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_VOTING_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAX_VOTING_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_PROPOSAL_THRESHOLD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_VOTING_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_VOTING_PERIOD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_initiate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setProposalThreshold","inputs":[{"type":"uint256","name":"newProposalThreshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setVotingDelay","inputs":[{"type":"uint256","name":"newVotingDelay","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setVotingPeriod","inputs":[{"type":"uint256","name":"newVotingPeriod","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setWhitelistAccountExpiration","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"expiration","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_setWhitelistGuardian","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVote","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteWithReason","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"string","name":"reason","internalType":"string"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernorBravoDelegateStorageV1.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"uint8","name":"support","internalType":"uint8"},{"type":"uint96","name":"votes","internalType":"uint96"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"initialProposalId","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"initialize","inputs":[{"type":"address","name":"timelock_","internalType":"address"},{"type":"address","name":"moo_","internalType":"address"},{"type":"uint256","name":"votingPeriod_","internalType":"uint256"},{"type":"uint256","name":"votingDelay_","internalType":"uint256"},{"type":"uint256","name":"proposalThreshold_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWhitelisted","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract CompInterface"}],"name":"moo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalMaxOperations","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"uint256","name":"abstainVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queue","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum GovernorBravoDelegateStorageV1.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TimelockInterface"}],"name":"timelock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingDelay","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingPeriod","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"whitelistAccountExpirations","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"whitelistGuardian","inputs":[]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b50613f97806100206000396000f3fe6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe14610954578063e9c714f214610969578063f851a4401461097e578063fc4eee421461099e578063fe0d94c1146109b457600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f5610292366004613447565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b60405161034791906134b8565b3480156103cd57600080fd5b506103e16103dc366004613447565b6109c7565b005b3480156103ef57600080fd5b506103666103fe3660046134e7565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b366004613447565b610aff565b34801561043c57600080fd5b506103e161044b366004613447565b610c47565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b506103666a034f086f3b33b68400000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e610529366004613447565b610d6e565b60405161034794939291906135cb565b34801561054a57600080fd5b506103666105593660046134e7565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c3660046134e7565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e4366004613634565b610fff565b3480156105f557600080fd5b50610609610604366004613447565b611279565b6040516103479190613698565b34801561062257600080fd5b506103e1610631366004613447565b611430565b34801561064257600080fd5b506103e16106513660046136c0565b611880565b34801561066257600080fd5b506103e16106713660046136ea565b611966565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee366004613716565b6119d1565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e1611a21565b34801561072957600080fd5b506103e16107383660046134e7565b611b5a565b34801561074957600080fd5b5061036662013b0081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b3660046134e7565b611c27565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db36600461379d565b611cee565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613ab8565b61200b565b34801561084257600080fd5b506103e1610851366004613447565b61263f565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506109246108a5366004613b8a565b6040805160608101825260008082526020820181905291810191909152506000918252600a602090815260408084206001600160a01b03939093168452600d9092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b34801561096057600080fd5b50610366600181565b34801561097557600080fd5b506103e161294b565b34801561098a57600080fd5b506000546104f6906001600160a01b031681565b3480156109aa57600080fd5b5061036660065481565b6103e16109c2366004613447565b612a75565b6000546001600160a01b03163314610a3a5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c88110158015610a4e575062013b008111155b610ab95760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b6064820152608401610a31565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610b725760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b6064820152608401610a31565b683635c9adc5dea000008110158015610b95575069152d02c7e14af68000008111155b610c09576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c646064820152608401610a31565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610af3565b6000546001600160a01b03163314610cb45760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b6064820152608401610a31565b60018110158015610cc75750619d808111155b610d305760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b6064820152608401610a31565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610af3565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610df057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dd2575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610e4257602002820191906000526020600020905b815481526020019060010190808311610e2e575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610f16578382906000526020600020018054610e8990613bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb590613bad565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b505050505081526020019060010190610e6a565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610fe9578382906000526020600020018054610f5c90613bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8890613bad565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b505050505081526020019060010190610f3d565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611183573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111fe5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b6064820152608401610a31565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611236858e8e612cb2565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000816007541015801561128e575060065482115b6112ec5760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b6064820152608401610a31565b6000828152600a60205260409020600c81015460ff16156113105750600292915050565b806007015443116113245750600092915050565b806008015443116113385750600192915050565b80600a0154816009015411158061135d57506a034f086f3b33b6840000008160090154105b1561136b5750600392915050565b600281015461137d5750600492915050565b600c810154610100900460ff16156113985750600792915050565b6002810154600854604080516360d143f160e11b8152905161141293926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d9190613be2565b612f91565b42106114215750600692915050565b50600592915050565b50919050565b600761143b82611279565b600781111561144c5761144c613682565b14156114b95760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b6064820152608401610a31565b6000818152600a6020526040902060018101546001600160a01b031633146117245760018101546001600160a01b03166000908152600c602052604090205442101561161d576005546009546001838101546001600160a01b039283169263782d6fe19291169061152b904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190613bfb565b6001600160601b03161080156115b85750600d546001600160a01b031633145b6116185760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b6064820152608401610a31565b611724565b6005546009546001838101546001600160a01b039283169263782d6fe192911690611649904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b69190613bfb565b6001600160601b0316106117245760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b6064820152608401610a31565b600c8101805460ff1916600117905560005b600382015481101561184f576008546003830180546001600160a01b039092169163591fcdfe91908490811061176e5761176e613c24565b6000918252602090912001546004850180546001600160a01b03909216918590811061179c5761179c613c24565b90600052602060002001548560050185815481106117bc576117bc613c24565b906000526020600020018660060186815481106117db576117db613c24565b9060005260206000200187600201546040518663ffffffff1660e01b815260040161180a959493929190613cdb565b600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b50505050808061184790613d3d565b915050611736565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610af3565b6000546001600160a01b03163314806118a35750600d546001600160a01b031633145b6119155760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c79000000000000006064820152608401610a31565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610af3565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48383611995848383612cb2565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611a00848383612cb2565b8686604051611a13959493929190613d58565b60405180910390a250505050565b6000546001600160a01b03163314611a875760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b6064820152608401610a31565b60065415611af05760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b6064820152608401610a31565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4057600080fd5b505af1158015611b54573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611bcd5760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b6064820152608401610a31565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610af3565b6000546001600160a01b03163314611c945760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b6064820152608401610a31565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610af3565b6008546001600160a01b031615611d635760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b6064820152608401610a31565b6000546001600160a01b03163314611dcb5760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b6064820152608401610a31565b6001600160a01b038516611e2b5760405162461bcd60e51b81526020600482015260336024820152600080516020613f4283398151915260448201527269642074696d656c6f636b206164647265737360681b6064820152608401610a31565b6001600160a01b038416611e865760405162461bcd60e51b815260206004820152602e6024820152600080516020613f4283398151915260448201526d6964206d6f6f206164647265737360901b6064820152608401610a31565b60c88310158015611e9a575062013b008311155b611eed5760405162461bcd60e51b81526020600482015260306024820152600080516020613f4283398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b6064820152608401610a31565b60018210158015611f005750619d808211155b611f525760405162461bcd60e51b815260206004820152602f6024820152600080516020613f4283398151915260448201526e696420766f74696e672064656c617960881b6064820152608401610a31565b683635c9adc5dea000008110158015611f75575069152d02c7e14af68000008111155b611fcd5760405162461bcd60e51b81526020600482015260356024820152600080516020613f428339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b6064820152608401610a31565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe13361202f436001612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190613bfb565b6001600160601b031611806120bf5750336000908152600c602052604090205442105b6121315760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c64006064820152608401610a31565b84518651148015612143575083518651145b8015612150575082518651145b6121d05760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a401610a31565b85516122335760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b6064820152608401610a31565b600a865111156122965760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b6064820152608401610a31565b336000908152600b602052604090205480156124175760006122b782611279565b905060018160078111156122cd576122cd613682565b14156123675760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a401610a31565b600081600781111561237b5761237b613682565b14156124155760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a401610a31565b505b600061242543600354612f91565b9050600061243582600454612f91565b60078054919250600061244783613d3d565b90915550506007546000818152600a602052604090208054156124c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b6064820152608401610a31565b8181556001810180546001600160a01b03191633179055600060028201558a516124f390600383019060208e01906131f6565b50895161250990600483019060208d019061325b565b50885161251f90600583019060208c0190613296565b50875161253590600683019060208b01906132ef565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f60405161262899989796959493929190613da8565b60405180910390a1549a9950505050505050505050565b600461264a82611279565b600781111561265b5761265b613682565b146126dc5760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a401610a31565b6000818152600a602090815260408083206008548251630d48571f60e31b8152925191949361273b9342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa1580156113e9573d6000803e3d6000fd5b905060005b6003830154811015612905576128f383600301828154811061276457612764613c24565b6000918252602090912001546004850180546001600160a01b03909216918490811061279257612792613c24565b90600052602060002001548560050184815481106127b2576127b2613c24565b9060005260206000200180546127c790613bad565b80601f01602080910402602001604051908101604052809291908181526020018280546127f390613bad565b80156128405780601f1061281557610100808354040283529160200191612840565b820191906000526020600020905b81548152906001019060200180831161282357829003601f168201915b505050505086600601858154811061285a5761285a613c24565b90600052602060002001805461286f90613bad565b80601f016020809104026020016040519081016040528092919081815260200182805461289b90613bad565b80156128e85780601f106128bd576101008083540402835291602001916128e8565b820191906000526020600020905b8154815290600101906020018083116128cb57829003601f168201915b50505050508661303f565b806128fd81613d3d565b915050612740565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b6001546001600160a01b03163314801561296457503315155b6129c75760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b6064820152608401610a31565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610af3565b6005612a8082611279565b6007811115612a9157612a91613682565b14612b125760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a401610a31565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c81576008546004830180546001600160a01b0390921691630825f38f919084908110612b6b57612b6b613c24565b9060005260206000200154846003018481548110612b8b57612b8b613c24565b6000918252602090912001546004860180546001600160a01b039092169186908110612bb957612bb9613c24565b9060005260206000200154866005018681548110612bd957612bd9613c24565b90600052602060002001876006018781548110612bf857612bf8613c24565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c27959493929190613cdb565b60006040518083038185885af1158015612c45573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6e9190810190613e40565b5080612c7981613d3d565b915050612b33565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610af3565b60006001612cbf84611279565b6007811115612cd057612cd0613682565b14612d375760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b6064820152608401610a31565b60028260ff161115612da65760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b6064820152608401610a31565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3c5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b6064820152608401610a31565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e86918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613bfb565b905060ff8516612ef257612ee883600a0154826001600160601b0316612f91565b600a840155612f48565b8460ff1660011415612f1f57612f158360090154826001600160601b0316612f91565b6009840155612f48565b8460ff1660021415612f4857612f4283600b0154826001600160601b0316612f91565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612f9e8385613eb7565b905083811015612fe45760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401610a31565b9392505050565b6000828211156130355760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b6044820152606401610a31565b612fe48284613ecf565b6008546040516001600160a01b039091169063f2b065379061306d9088908890889088908890602001613ee6565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a191815260200190565b602060405180830381865afa1580156130be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e29190613f1f565b156131735760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a401610a31565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ab9088908890889088908890600401613ee6565b6020604051808303816000875af11580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee9190613be2565b505050505050565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613216565b50613257929150613348565b5090565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182559160200191906001019061327b565b8280548282559060005260206000209081019282156132e3579160200282015b828111156132e357825180516132d391849160209091019061335d565b50916020019190600101906132b6565b506132579291506133d0565b82805482825590600052602060002090810192821561333c579160200282015b8281111561333c578251805161332c91849160209091019061335d565b509160200191906001019061330f565b506132579291506133ed565b5b808211156132575760008155600101613349565b82805461336990613bad565b90600052602060002090601f01602090048101928261338b576000855561324b565b82601f106133a457805160ff191683800117855561324b565b8280016001018555821561324b579182018281111561324b57825182559160200191906001019061327b565b808211156132575760006133e4828261340a565b506001016133d0565b80821115613257576000613401828261340a565b506001016133ed565b50805461341690613bad565b6000825580601f10613426575050565b601f0160209004906000526020600020908101906134449190613348565b50565b60006020828403121561345957600080fd5b5035919050565b60005b8381101561347b578181015183820152602001613463565b83811115611b545750506000910152565b600081518084526134a4816020860160208601613460565b601f01601f19169290920160200192915050565b602081526000612fe4602083018461348c565b80356001600160a01b03811681146134e257600080fd5b919050565b6000602082840312156134f957600080fd5b612fe4826134cb565b600081518084526020808501945080840160005b8381101561353b5781516001600160a01b031687529582019590820190600101613516565b509495945050505050565b600081518084526020808501945080840160005b8381101561353b5781518752958201959082019060010161355a565b600081518084526020808501808196508360051b8101915082860160005b858110156135be5782840389526135ac84835161348c565b98850198935090840190600101613594565b5091979650505050505050565b6080815260006135de6080830187613502565b82810360208401526135f08187613546565b905082810360408401526136048186613576565b905082810360608401526136188185613576565b979650505050505050565b803560ff811681146134e257600080fd5b600080600080600060a0868803121561364c57600080fd5b8535945061365c60208701613623565b935061366a60408701613623565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106136ba57634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156136d357600080fd5b6136dc836134cb565b946020939093013593505050565b600080604083850312156136fd57600080fd5b8235915061370d60208401613623565b90509250929050565b6000806000806060858703121561372c57600080fd5b8435935061373c60208601613623565b9250604085013567ffffffffffffffff8082111561375957600080fd5b818701915087601f83011261376d57600080fd5b81358181111561377c57600080fd5b88602082850101111561378e57600080fd5b95989497505060200194505050565b600080600080600060a086880312156137b557600080fd5b6137be866134cb565b94506137cc602087016134cb565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613829576138296137ea565b604052919050565b600067ffffffffffffffff82111561384b5761384b6137ea565b5060051b60200190565b600082601f83011261386657600080fd5b8135602061387b61387683613831565b613800565b82815260059290921b8401810191818101908684111561389a57600080fd5b8286015b848110156138bc576138af816134cb565b835291830191830161389e565b509695505050505050565b600082601f8301126138d857600080fd5b813560206138e861387683613831565b82815260059290921b8401810191818101908684111561390757600080fd5b8286015b848110156138bc578035835291830191830161390b565b600067ffffffffffffffff82111561393c5761393c6137ea565b50601f01601f191660200190565b600061395861387684613922565b905082815283838301111561396c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261399457600080fd5b612fe48383356020850161394a565b600082601f8301126139b457600080fd5b813560206139c461387683613831565b82815260059290921b840181019181810190868411156139e357600080fd5b8286015b848110156138bc57803567ffffffffffffffff811115613a075760008081fd5b613a158986838b0101613983565b8452509183019183016139e7565b600082601f830112613a3457600080fd5b81356020613a4461387683613831565b82815260059290921b84018101918181019086841115613a6357600080fd5b8286015b848110156138bc57803567ffffffffffffffff811115613a875760008081fd5b8701603f81018913613a995760008081fd5b613aaa89868301356040840161394a565b845250918301918301613a67565b600080600080600060a08688031215613ad057600080fd5b853567ffffffffffffffff80821115613ae857600080fd5b613af489838a01613855565b96506020880135915080821115613b0a57600080fd5b613b1689838a016138c7565b95506040880135915080821115613b2c57600080fd5b613b3889838a016139a3565b94506060880135915080821115613b4e57600080fd5b613b5a89838a01613a23565b93506080880135915080821115613b7057600080fd5b50613b7d88828901613983565b9150509295509295909350565b60008060408385031215613b9d57600080fd5b8235915061370d602084016134cb565b600181811c90821680613bc157607f821691505b6020821081141561142a57634e487b7160e01b600052602260045260246000fd5b600060208284031215613bf457600080fd5b5051919050565b600060208284031215613c0d57600080fd5b81516001600160601b0381168114612fe457600080fd5b634e487b7160e01b600052603260045260246000fd5b8054600090600181811c9080831680613c5457607f831692505b6020808410821415613c7657634e487b7160e01b600052602260045260246000fd5b838852818015613c8d5760018114613ca157613ccf565b60ff19861689830152604089019650613ccf565b876000528160002060005b86811015613cc75781548b8201850152908501908301613cac565b8a0183019750505b50505050505092915050565b60018060a01b038616815284602082015260a060408201526000613d0260a0830186613c3a565b8281036060840152613d148186613c3a565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d5157613d51613d27565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613dd38382018b613502565b90508281036060840152613de7818a613546565b90508281036080840152613dfb8189613576565b905082810360a0840152613e0f8188613576565b90508560c08401528460e0840152828103610100840152613e30818561348c565b9c9b505050505050505050505050565b600060208284031215613e5257600080fd5b815167ffffffffffffffff811115613e6957600080fd5b8201601f81018413613e7a57600080fd5b8051613e8861387682613922565b818152856020838501011115613e9d57600080fd5b613eae826020830160208601613460565b95945050505050565b60008219821115613eca57613eca613d27565b500190565b600082821015613ee157613ee1613d27565b500390565b60018060a01b038616815284602082015260a060408201526000613f0d60a083018661348c565b8281036060840152613d14818661348c565b600060208284031215613f3157600080fd5b81518015158114612fe457600080fdfe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca264697066735822122067a48c2e21d7589703adfeddb0ac1ce65388aa22d166b52711b9d48fd5075e5a64736f6c634300080b0033

Deployed ByteCode

0x6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a521461088a578063e48083fe14610954578063e9c714f214610969578063f851a4401461097e578063fc4eee421461099e578063fe0d94c1146109b457600080fd5b8063d13f90b4146107c0578063d33219b4146107e0578063da35c66414610800578063da95691a14610816578063ddf0b00914610836578063deaaa7cc1461085657600080fd5b80639953336511610113578063995333651461071d578063a64e024a1461073d578063b112626314610754578063b58131b01461076a578063b71d1a0c14610780578063c5a8425d146107a057600080fd5b806363cd99cb14610696578063791f5d23146106b65780637b3c71d3146106d35780637bdbe4d0146106f3578063878f14821461070857600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c95780633e4f49e6146105e957806340e58ee5146106165780634d6733d21461063657806356781388146106565780635c60da1b1461067657600080fd5b806326782247146104d6578063328dd9821461050e57806338bd0dda1461053e5780633932abb11461056b5780633af32abf1461058157600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b857600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f5610292366004613447565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b60405161034791906134b8565b3480156103cd57600080fd5b506103e16103dc366004613447565b6109c7565b005b3480156103ef57600080fd5b506103666103fe3660046134e7565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b366004613447565b610aff565b34801561043c57600080fd5b506103e161044b366004613447565b610c47565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b506103666a034f086f3b33b68400000081565b3480156104c457600080fd5b5061036669152d02c7e14af680000081565b3480156104e257600080fd5b506001546104f6906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051a57600080fd5b5061052e610529366004613447565b610d6e565b60405161034794939291906135cb565b34801561054a57600080fd5b506103666105593660046134e7565b600c6020526000908152604090205481565b34801561057757600080fd5b5061036660035481565b34801561058d57600080fd5b506105b961059c3660046134e7565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d557600080fd5b506103e16105e4366004613634565b610fff565b3480156105f557600080fd5b50610609610604366004613447565b611279565b6040516103479190613698565b34801561062257600080fd5b506103e1610631366004613447565b611430565b34801561064257600080fd5b506103e16106513660046136c0565b611880565b34801561066257600080fd5b506103e16106713660046136ea565b611966565b34801561068257600080fd5b506002546104f6906001600160a01b031681565b3480156106a257600080fd5b506009546104f6906001600160a01b031681565b3480156106c257600080fd5b50610366683635c9adc5dea0000081565b3480156106df57600080fd5b506103e16106ee366004613716565b6119d1565b3480156106ff57600080fd5b50610366600a81565b34801561071457600080fd5b506103e1611a21565b34801561072957600080fd5b506103e16107383660046134e7565b611b5a565b34801561074957600080fd5b5061036662013b0081565b34801561076057600080fd5b50610366619d8081565b34801561077657600080fd5b5061036660055481565b34801561078c57600080fd5b506103e161079b3660046134e7565b611c27565b3480156107ac57600080fd5b50600d546104f6906001600160a01b031681565b3480156107cc57600080fd5b506103e16107db36600461379d565b611cee565b3480156107ec57600080fd5b506008546104f6906001600160a01b031681565b34801561080c57600080fd5b5061036660075481565b34801561082257600080fd5b50610366610831366004613ab8565b61200b565b34801561084257600080fd5b506103e1610851366004613447565b61263f565b34801561086257600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089657600080fd5b506109246108a5366004613b8a565b6040805160608101825260008082526020820181905291810191909152506000918252600a602090815260408084206001600160a01b03939093168452600d9092018152918190208151606081018352905460ff8082161515835261010082041693820193909352620100009092046001600160601b03169082015290565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b34801561096057600080fd5b50610366600181565b34801561097557600080fd5b506103e161294b565b34801561098a57600080fd5b506000546104f6906001600160a01b031681565b3480156109aa57600080fd5b5061036660065481565b6103e16109c2366004613447565b612a75565b6000546001600160a01b03163314610a3a5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c88110158015610a4e575062013b008111155b610ab95760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b6064820152608401610a31565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610b725760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b6064820152608401610a31565b683635c9adc5dea000008110158015610b95575069152d02c7e14af68000008111155b610c09576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c646064820152608401610a31565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610af3565b6000546001600160a01b03163314610cb45760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b6064820152608401610a31565b60018110158015610cc75750619d808111155b610d305760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b6064820152608401610a31565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610af3565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610df057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610dd2575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610e4257602002820191906000526020600020905b815481526020019060010190808311610e2e575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610f16578382906000526020600020018054610e8990613bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610eb590613bad565b8015610f025780601f10610ed757610100808354040283529160200191610f02565b820191906000526020600020905b815481529060010190602001808311610ee557829003601f168201915b505050505081526020019060010190610e6a565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610fe9578382906000526020600020018054610f5c90613bad565b80601f0160208091040260200160405190810160405280929190818152602001828054610f8890613bad565b8015610fd55780601f10610faa57610100808354040283529160200191610fd5565b820191906000526020600020905b815481529060010190602001808311610fb857829003601f168201915b505050505081526020019060010190610f3d565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611183573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111fe5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b6064820152608401610a31565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a611236858e8e612cb2565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b6000816007541015801561128e575060065482115b6112ec5760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b6064820152608401610a31565b6000828152600a60205260409020600c81015460ff16156113105750600292915050565b806007015443116113245750600092915050565b806008015443116113385750600192915050565b80600a0154816009015411158061135d57506a034f086f3b33b6840000008160090154105b1561136b5750600392915050565b600281015461137d5750600492915050565b600c810154610100900460ff16156113985750600792915050565b6002810154600854604080516360d143f160e11b8152905161141293926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa1580156113e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140d9190613be2565b612f91565b42106114215750600692915050565b50600592915050565b50919050565b600761143b82611279565b600781111561144c5761144c613682565b14156114b95760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b6064820152608401610a31565b6000818152600a6020526040902060018101546001600160a01b031633146117245760018101546001600160a01b03166000908152600c602052604090205442101561161d576005546009546001838101546001600160a01b039283169263782d6fe19291169061152b904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115989190613bfb565b6001600160601b03161080156115b85750600d546001600160a01b031633145b6116185760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b6064820152608401610a31565b611724565b6005546009546001838101546001600160a01b039283169263782d6fe192911690611649904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b69190613bfb565b6001600160601b0316106117245760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b6064820152608401610a31565b600c8101805460ff1916600117905560005b600382015481101561184f576008546003830180546001600160a01b039092169163591fcdfe91908490811061176e5761176e613c24565b6000918252602090912001546004850180546001600160a01b03909216918590811061179c5761179c613c24565b90600052602060002001548560050185815481106117bc576117bc613c24565b906000526020600020018660060186815481106117db576117db613c24565b9060005260206000200187600201546040518663ffffffff1660e01b815260040161180a959493929190613cdb565b600060405180830381600087803b15801561182457600080fd5b505af1158015611838573d6000803e3d6000fd5b50505050808061184790613d3d565b915050611736565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610af3565b6000546001600160a01b03163314806118a35750600d546001600160a01b031633145b6119155760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c79000000000000006064820152608401610a31565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610af3565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48383611995848383612cb2565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611a00848383612cb2565b8686604051611a13959493929190613d58565b60405180910390a250505050565b6000546001600160a01b03163314611a875760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b6064820152608401610a31565b60065415611af05760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b6064820152608401610a31565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611b4057600080fd5b505af1158015611b54573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611bcd5760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b6064820152608401610a31565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610af3565b6000546001600160a01b03163314611c945760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b6064820152608401610a31565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610af3565b6008546001600160a01b031615611d635760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b6064820152608401610a31565b6000546001600160a01b03163314611dcb5760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b6064820152608401610a31565b6001600160a01b038516611e2b5760405162461bcd60e51b81526020600482015260336024820152600080516020613f4283398151915260448201527269642074696d656c6f636b206164647265737360681b6064820152608401610a31565b6001600160a01b038416611e865760405162461bcd60e51b815260206004820152602e6024820152600080516020613f4283398151915260448201526d6964206d6f6f206164647265737360901b6064820152608401610a31565b60c88310158015611e9a575062013b008311155b611eed5760405162461bcd60e51b81526020600482015260306024820152600080516020613f4283398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b6064820152608401610a31565b60018210158015611f005750619d808211155b611f525760405162461bcd60e51b815260206004820152602f6024820152600080516020613f4283398151915260448201526e696420766f74696e672064656c617960881b6064820152608401610a31565b683635c9adc5dea000008110158015611f75575069152d02c7e14af68000008111155b611fcd5760405162461bcd60e51b81526020600482015260356024820152600080516020613f428339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b6064820152608401610a31565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe13361202f436001612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190613bfb565b6001600160601b031611806120bf5750336000908152600c602052604090205442105b6121315760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c64006064820152608401610a31565b84518651148015612143575083518651145b8015612150575082518651145b6121d05760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a401610a31565b85516122335760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b6064820152608401610a31565b600a865111156122965760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b6064820152608401610a31565b336000908152600b602052604090205480156124175760006122b782611279565b905060018160078111156122cd576122cd613682565b14156123675760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a401610a31565b600081600781111561237b5761237b613682565b14156124155760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a401610a31565b505b600061242543600354612f91565b9050600061243582600454612f91565b60078054919250600061244783613d3d565b90915550506007546000818152600a602052604090208054156124c05760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b6064820152608401610a31565b8181556001810180546001600160a01b03191633179055600060028201558a516124f390600383019060208e01906131f6565b50895161250990600483019060208d019061325b565b50885161251f90600583019060208c0190613296565b50875161253590600683019060208b01906132ef565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f60405161262899989796959493929190613da8565b60405180910390a1549a9950505050505050505050565b600461264a82611279565b600781111561265b5761265b613682565b146126dc5760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a401610a31565b6000818152600a602090815260408083206008548251630d48571f60e31b8152925191949361273b9342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa1580156113e9573d6000803e3d6000fd5b905060005b6003830154811015612905576128f383600301828154811061276457612764613c24565b6000918252602090912001546004850180546001600160a01b03909216918490811061279257612792613c24565b90600052602060002001548560050184815481106127b2576127b2613c24565b9060005260206000200180546127c790613bad565b80601f01602080910402602001604051908101604052809291908181526020018280546127f390613bad565b80156128405780601f1061281557610100808354040283529160200191612840565b820191906000526020600020905b81548152906001019060200180831161282357829003601f168201915b505050505086600601858154811061285a5761285a613c24565b90600052602060002001805461286f90613bad565b80601f016020809104026020016040519081016040528092919081815260200182805461289b90613bad565b80156128e85780601f106128bd576101008083540402835291602001916128e8565b820191906000526020600020905b8154815290600101906020018083116128cb57829003601f168201915b50505050508661303f565b806128fd81613d3d565b915050612740565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b6001546001600160a01b03163314801561296457503315155b6129c75760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b6064820152608401610a31565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610af3565b6005612a8082611279565b6007811115612a9157612a91613682565b14612b125760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a401610a31565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c81576008546004830180546001600160a01b0390921691630825f38f919084908110612b6b57612b6b613c24565b9060005260206000200154846003018481548110612b8b57612b8b613c24565b6000918252602090912001546004860180546001600160a01b039092169186908110612bb957612bb9613c24565b9060005260206000200154866005018681548110612bd957612bd9613c24565b90600052602060002001876006018781548110612bf857612bf8613c24565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c27959493929190613cdb565b60006040518083038185885af1158015612c45573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6e9190810190613e40565b5080612c7981613d3d565b915050612b33565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610af3565b60006001612cbf84611279565b6007811115612cd057612cd0613682565b14612d375760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b6064820152608401610a31565b60028260ff161115612da65760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b6064820152608401610a31565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3c5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b6064820152608401610a31565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e86918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec79190613bfb565b905060ff8516612ef257612ee883600a0154826001600160601b0316612f91565b600a840155612f48565b8460ff1660011415612f1f57612f158360090154826001600160601b0316612f91565b6009840155612f48565b8460ff1660021415612f4857612f4283600b0154826001600160601b0316612f91565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612f9e8385613eb7565b905083811015612fe45760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b6044820152606401610a31565b9392505050565b6000828211156130355760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b6044820152606401610a31565b612fe48284613ecf565b6008546040516001600160a01b039091169063f2b065379061306d9088908890889088908890602001613ee6565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a191815260200190565b602060405180830381865afa1580156130be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e29190613f1f565b156131735760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a401610a31565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ab9088908890889088908890600401613ee6565b6020604051808303816000875af11580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee9190613be2565b505050505050565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613216565b50613257929150613348565b5090565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182559160200191906001019061327b565b8280548282559060005260206000209081019282156132e3579160200282015b828111156132e357825180516132d391849160209091019061335d565b50916020019190600101906132b6565b506132579291506133d0565b82805482825590600052602060002090810192821561333c579160200282015b8281111561333c578251805161332c91849160209091019061335d565b509160200191906001019061330f565b506132579291506133ed565b5b808211156132575760008155600101613349565b82805461336990613bad565b90600052602060002090601f01602090048101928261338b576000855561324b565b82601f106133a457805160ff191683800117855561324b565b8280016001018555821561324b579182018281111561324b57825182559160200191906001019061327b565b808211156132575760006133e4828261340a565b506001016133d0565b80821115613257576000613401828261340a565b506001016133ed565b50805461341690613bad565b6000825580601f10613426575050565b601f0160209004906000526020600020908101906134449190613348565b50565b60006020828403121561345957600080fd5b5035919050565b60005b8381101561347b578181015183820152602001613463565b83811115611b545750506000910152565b600081518084526134a4816020860160208601613460565b601f01601f19169290920160200192915050565b602081526000612fe4602083018461348c565b80356001600160a01b03811681146134e257600080fd5b919050565b6000602082840312156134f957600080fd5b612fe4826134cb565b600081518084526020808501945080840160005b8381101561353b5781516001600160a01b031687529582019590820190600101613516565b509495945050505050565b600081518084526020808501945080840160005b8381101561353b5781518752958201959082019060010161355a565b600081518084526020808501808196508360051b8101915082860160005b858110156135be5782840389526135ac84835161348c565b98850198935090840190600101613594565b5091979650505050505050565b6080815260006135de6080830187613502565b82810360208401526135f08187613546565b905082810360408401526136048186613576565b905082810360608401526136188185613576565b979650505050505050565b803560ff811681146134e257600080fd5b600080600080600060a0868803121561364c57600080fd5b8535945061365c60208701613623565b935061366a60408701613623565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b60208101600883106136ba57634e487b7160e01b600052602160045260246000fd5b91905290565b600080604083850312156136d357600080fd5b6136dc836134cb565b946020939093013593505050565b600080604083850312156136fd57600080fd5b8235915061370d60208401613623565b90509250929050565b6000806000806060858703121561372c57600080fd5b8435935061373c60208601613623565b9250604085013567ffffffffffffffff8082111561375957600080fd5b818701915087601f83011261376d57600080fd5b81358181111561377c57600080fd5b88602082850101111561378e57600080fd5b95989497505060200194505050565b600080600080600060a086880312156137b557600080fd5b6137be866134cb565b94506137cc602087016134cb565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613829576138296137ea565b604052919050565b600067ffffffffffffffff82111561384b5761384b6137ea565b5060051b60200190565b600082601f83011261386657600080fd5b8135602061387b61387683613831565b613800565b82815260059290921b8401810191818101908684111561389a57600080fd5b8286015b848110156138bc576138af816134cb565b835291830191830161389e565b509695505050505050565b600082601f8301126138d857600080fd5b813560206138e861387683613831565b82815260059290921b8401810191818101908684111561390757600080fd5b8286015b848110156138bc578035835291830191830161390b565b600067ffffffffffffffff82111561393c5761393c6137ea565b50601f01601f191660200190565b600061395861387684613922565b905082815283838301111561396c57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261399457600080fd5b612fe48383356020850161394a565b600082601f8301126139b457600080fd5b813560206139c461387683613831565b82815260059290921b840181019181810190868411156139e357600080fd5b8286015b848110156138bc57803567ffffffffffffffff811115613a075760008081fd5b613a158986838b0101613983565b8452509183019183016139e7565b600082601f830112613a3457600080fd5b81356020613a4461387683613831565b82815260059290921b84018101918181019086841115613a6357600080fd5b8286015b848110156138bc57803567ffffffffffffffff811115613a875760008081fd5b8701603f81018913613a995760008081fd5b613aaa89868301356040840161394a565b845250918301918301613a67565b600080600080600060a08688031215613ad057600080fd5b853567ffffffffffffffff80821115613ae857600080fd5b613af489838a01613855565b96506020880135915080821115613b0a57600080fd5b613b1689838a016138c7565b95506040880135915080821115613b2c57600080fd5b613b3889838a016139a3565b94506060880135915080821115613b4e57600080fd5b613b5a89838a01613a23565b93506080880135915080821115613b7057600080fd5b50613b7d88828901613983565b9150509295509295909350565b60008060408385031215613b9d57600080fd5b8235915061370d602084016134cb565b600181811c90821680613bc157607f821691505b6020821081141561142a57634e487b7160e01b600052602260045260246000fd5b600060208284031215613bf457600080fd5b5051919050565b600060208284031215613c0d57600080fd5b81516001600160601b0381168114612fe457600080fd5b634e487b7160e01b600052603260045260246000fd5b8054600090600181811c9080831680613c5457607f831692505b6020808410821415613c7657634e487b7160e01b600052602260045260246000fd5b838852818015613c8d5760018114613ca157613ccf565b60ff19861689830152604089019650613ccf565b876000528160002060005b86811015613cc75781548b8201850152908501908301613cac565b8a0183019750505b50505050505092915050565b60018060a01b038616815284602082015260a060408201526000613d0260a0830186613c3a565b8281036060840152613d148186613c3a565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415613d5157613d51613d27565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613dd38382018b613502565b90508281036060840152613de7818a613546565b90508281036080840152613dfb8189613576565b905082810360a0840152613e0f8188613576565b90508560c08401528460e0840152828103610100840152613e30818561348c565b9c9b505050505050505050505050565b600060208284031215613e5257600080fd5b815167ffffffffffffffff811115613e6957600080fd5b8201601f81018413613e7a57600080fd5b8051613e8861387682613922565b818152856020838501011115613e9d57600080fd5b613eae826020830160208601613460565b95945050505050565b60008219821115613eca57613eca613d27565b500190565b600082821015613ee157613ee1613d27565b500390565b60018060a01b038616815284602082015260a060408201526000613f0d60a083018661348c565b8281036060840152613d14818661348c565b600060208284031215613f3157600080fd5b81518015158114612fe457600080fdfe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca264697066735822122067a48c2e21d7589703adfeddb0ac1ce65388aa22d166b52711b9d48fd5075e5a64736f6c634300080b0033