Address Details
contract
proxy

0x4Bb7b74d7E6B03862Dba0785E54E687C01ECffC8

Contract Name
MoolaGovernorBravoDelegate
Creator
0x007e71–f37016 at 0x91fc5c–f7c617
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
13842373
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MoolaGovernorBravoDelegate




Optimization enabled
true
Compiler version
v0.8.17+commit.8df45f5f




Optimization runs
200
EVM Version
london




Verified at
2022-09-30T02:37:21.033803Z

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 = 10000e18; // 10,000 = 0.1% 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

0x608060405234801561001057600080fd5b50613fe9806100206000396000f3fe6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a5214610889578063e48083fe146108d9578063e9c714f2146108ee578063f851a44014610903578063fc4eee4214610923578063fe0d94c11461093957600080fd5b8063d13f90b4146107bf578063d33219b4146107df578063da35c664146107ff578063da95691a14610815578063ddf0b00914610835578063deaaa7cc1461085557600080fd5b80639953336511610113578063995333651461071c578063a64e024a1461073c578063b112626314610753578063b58131b014610769578063b71d1a0c1461077f578063c5a8425d1461079f57600080fd5b806363cd99cb14610695578063791f5d23146106b55780637b3c71d3146106d25780637bdbe4d0146106f2578063878f14821461070757600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c85780633e4f49e6146105e857806340e58ee5146106155780634d6733d21461063557806356781388146106555780635c60da1b1461067557600080fd5b806326782247146104d5578063328dd9821461050d57806338bd0dda1461053d5780633932abb11461056a5780633af32abf1461058057600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b757600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c6565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b604051610347919061342f565b3480156103cd57600080fd5b506103e16103dc3660046133c6565b61094c565b005b3480156103ef57600080fd5b506103666103fe36600461345e565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c6565b610a84565b34801561043c57600080fd5b506103e161044b3660046133c6565b610bcc565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b5061036669021e19e0c9bab240000081565b3480156104c357600080fd5b5061036669152d02c7e14af680000081565b3480156104e157600080fd5b506001546104f5906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051957600080fd5b5061052d6105283660046133c6565b610cf3565b6040516103479493929190613542565b34801561054957600080fd5b5061036661055836600461345e565b600c6020526000908152604090205481565b34801561057657600080fd5b5061036660035481565b34801561058c57600080fd5b506105b861059b36600461345e565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d457600080fd5b506103e16105e33660046135ab565b610f84565b3480156105f457600080fd5b506106086106033660046133c6565b6111fe565b604051610347919061360f565b34801561062157600080fd5b506103e16106303660046133c6565b6113b7565b34801561064157600080fd5b506103e1610650366004613637565b611806565b34801561066157600080fd5b506103e1610670366004613661565b6118ec565b34801561068157600080fd5b506002546104f5906001600160a01b031681565b3480156106a157600080fd5b506009546104f5906001600160a01b031681565b3480156106c157600080fd5b50610366683635c9adc5dea0000081565b3480156106de57600080fd5b506103e16106ed36600461368d565b611957565b3480156106fe57600080fd5b50610366600a81565b34801561071357600080fd5b506103e16119a7565b34801561072857600080fd5b506103e161073736600461345e565b611ae0565b34801561074857600080fd5b5061036662013b0081565b34801561075f57600080fd5b50610366619d8081565b34801561077557600080fd5b5061036660055481565b34801561078b57600080fd5b506103e161079a36600461345e565b611bad565b3480156107ab57600080fd5b50600d546104f5906001600160a01b031681565b3480156107cb57600080fd5b506103e16107da366004613714565b611c74565b3480156107eb57600080fd5b506008546104f5906001600160a01b031681565b34801561080b57600080fd5b5061036660075481565b34801561082157600080fd5b50610366610830366004613a2f565b611f91565b34801561084157600080fd5b506103e16108503660046133c6565b6125c6565b34801561086157600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089557600080fd5b506108a96108a4366004613b01565b6128d2565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e557600080fd5b50610366600181565b3480156108fa57600080fd5b506103e161294a565b34801561090f57600080fd5b506000546104f5906001600160a01b031681565b34801561092f57600080fd5b5061036660065481565b6103e16109473660046133c6565b612a74565b6000546001600160a01b031633146109bf5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c881101580156109d3575062013b008111155b610a3e5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b6565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af75760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b6565b683635c9adc5dea000008110158015610b1a575069152d02c7e14af68000008111155b610b8e576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b6565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a78565b6000546001600160a01b03163314610c395760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b6565b60018110158015610c4c5750619d808111155b610cb55760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b6565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a78565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d57575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9b578382906000526020600020018054610e0e90613b24565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613b24565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081526020019060010190610def565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f6e578382906000526020600020018054610ee190613b24565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d90613b24565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b505050505081526020019060010190610ec2565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611108573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111835760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b6565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bb858e8e612cb1565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611213575060065482115b6112715760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b6565b6000828152600a60205260409020600c81015460ff16156112955750600292915050565b806007015443116112a95750600092915050565b806008015443116112bd5750600192915050565b80600a015481600901541115806112e1575069021e19e0c9bab24000008160090154105b156112ef5750600392915050565b80600201546000036113045750600492915050565b600c810154610100900460ff161561131f5750600792915050565b6002810154600854604080516360d143f160e11b8152905161139993926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113949190613b58565b612f91565b42106113a85750600692915050565b50600592915050565b50919050565b60076113c2826111fe565b60078111156113d3576113d36135f9565b0361143f5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b6565b6000818152600a6020526040902060018101546001600160a01b031633146116aa5760018101546001600160a01b03166000908152600c60205260409020544210156115a3576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b1904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e9190613b71565b6001600160601b031610801561153e5750600d546001600160a01b031633145b61159e5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b6565b6116aa565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115cf904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190613b71565b6001600160601b0316106116aa5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b6565b600c8101805460ff1916600117905560005b60038201548110156117d5576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f4576116f4613b9a565b6000918252602090912001546004850180546001600160a01b03909216918590811061172257611722613b9a565b906000526020600020015485600501858154811061174257611742613b9a565b9060005260206000200186600601868154811061176157611761613b9a565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611790959493929190613c2d565b600060405180830381600087803b1580156117aa57600080fd5b505af11580156117be573d6000803e3d6000fd5b5050505080806117cd90613c8f565b9150506116bc565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a78565b6000546001600160a01b03163314806118295750600d546001600160a01b031633145b61189b5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b6565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a78565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191b848383612cb1565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611986848383612cb1565b8686604051611999959493929190613ca8565b60405180910390a250505050565b6000546001600160a01b03163314611a0d5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b6565b60065415611a765760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b6565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac657600080fd5b505af1158015611ada573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b535760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b6565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a78565b6000546001600160a01b03163314611c1a5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b6565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a78565b6008546001600160a01b031615611ce95760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b6565b6000546001600160a01b03163314611d515760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b6565b6001600160a01b038516611db15760405162461bcd60e51b81526020600482015260336024820152600080516020613f9483398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b6565b6001600160a01b038416611e0c5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9483398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b6565b60c88310158015611e20575062013b008311155b611e735760405162461bcd60e51b81526020600482015260306024820152600080516020613f9483398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b6565b60018210158015611e865750619d808211155b611ed85760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9483398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b6565b683635c9adc5dea000008110158015611efb575069152d02c7e14af68000008111155b611f535760405162461bcd60e51b81526020600482015260356024820152600080516020613f948339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b6565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb5436001612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120229190613b71565b6001600160601b031611806120455750336000908152600c602052604090205442105b6120b75760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b6565b845186511480156120c9575083518651145b80156120d6575082518651145b6121565760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b6565b85516000036121bc5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b6565b600a8651111561221f5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b6565b336000908152600b6020526040902054801561239e576000612240826111fe565b90506001816007811115612256576122566135f9565b036122ef5760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b6565b6000816007811115612303576123036135f9565b0361239c5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b6565b505b60006123ac43600354612f91565b905060006123bc82600454612f91565b6007805491925060006123ce83613c8f565b90915550506007546000818152600a602052604090208054156124475760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b6565b8181556001810180546001600160a01b03191633179055600060028201558a5161247a90600383019060208e01906131f6565b50895161249090600483019060208d019061325b565b5088516124a690600583019060208c0190613296565b5087516124bc90600683019060208b01906132e8565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125af99989796959493929190613cf8565b60405180910390a1549a9950505050505050505050565b60046125d1826111fe565b60078111156125e2576125e26135f9565b146126635760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b6565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c29342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611370573d6000803e3d6000fd5b905060005b600383015481101561288c5761287a8360030182815481106126eb576126eb613b9a565b6000918252602090912001546004850180546001600160a01b03909216918490811061271957612719613b9a565b906000526020600020015485600501848154811061273957612739613b9a565b90600052602060002001805461274e90613b24565b80601f016020809104026020016040519081016040528092919081815260200182805461277a90613b24565b80156127c75780601f1061279c576101008083540402835291602001916127c7565b820191906000526020600020905b8154815290600101906020018083116127aa57829003601f168201915b50505050508660060185815481106127e1576127e1613b9a565b9060005260206000200180546127f690613b24565b80601f016020809104026020016040519081016040528092919081815260200182805461282290613b24565b801561286f5780601f106128445761010080835404028352916020019161286f565b820191906000526020600020905b81548152906001019060200180831161285257829003601f168201915b50505050508661303f565b8061288481613c8f565b9150506126c7565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296357503315155b6129c65760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b6565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a78565b6005612a7f826111fe565b6007811115612a9057612a906135f9565b14612b115760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b6565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c80576008546004830180546001600160a01b0390921691630825f38f919084908110612b6a57612b6a613b9a565b9060005260206000200154846003018481548110612b8a57612b8a613b9a565b6000918252602090912001546004860180546001600160a01b039092169186908110612bb857612bb8613b9a565b9060005260206000200154866005018681548110612bd857612bd8613b9a565b90600052602060002001876006018781548110612bf757612bf7613b9a565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c26959493929190613c2d565b60006040518083038185885af1158015612c44573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6d9190810190613d90565b5080612c7881613c8f565b915050612b32565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a78565b60006001612cbe846111fe565b6007811115612ccf57612ccf6135f9565b14612d365760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b6565b60028260ff161115612da55760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b6565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3b5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b6565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e85918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec69190613b71565b90508460ff16600003612ef457612eea83600a0154826001600160601b0316612f91565b600a840155612f48565b8460ff16600103612f2057612f168360090154826001600160601b0316612f91565b6009840155612f48565b8460ff16600203612f4857612f4283600b0154826001600160601b0316612f91565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612f9e8385613e07565b905083811015612fe45760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b6565b9392505050565b6000828211156130355760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b6565b612fe48284613e1a565b6008546040516001600160a01b039091169063f2b065379061306d9088908890889088908890602001613e2d565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a191815260200190565b602060405180830381865afa1580156130be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e29190613e66565b156131735760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b6565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ab9088908890889088908890600401613e2d565b6020604051808303816000875af11580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee9190613b58565b505050505050565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613216565b5061325792915061333a565b5090565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182559160200191906001019061327b565b8280548282559060005260206000209081019282156132dc579160200282015b828111156132dc57825182906132cc9082613ed3565b50916020019190600101906132b6565b5061325792915061334f565b82805482825590600052602060002090810192821561332e579160200282015b8281111561332e578251829061331e9082613ed3565b5091602001919060010190613308565b5061325792915061336c565b5b80821115613257576000815560010161333b565b808211156132575760006133638282613389565b5060010161334f565b808211156132575760006133808282613389565b5060010161336c565b50805461339590613b24565b6000825580601f106133a5575050565b601f0160209004906000526020600020908101906133c3919061333a565b50565b6000602082840312156133d857600080fd5b5035919050565b60005b838110156133fa5781810151838201526020016133e2565b50506000910152565b6000815180845261341b8160208601602086016133df565b601f01601f19169290920160200192915050565b602081526000612fe46020830184613403565b80356001600160a01b038116811461345957600080fd5b919050565b60006020828403121561347057600080fd5b612fe482613442565b600081518084526020808501945080840160005b838110156134b25781516001600160a01b03168752958201959082019060010161348d565b509495945050505050565b600081518084526020808501945080840160005b838110156134b2578151875295820195908201906001016134d1565b600081518084526020808501808196508360051b8101915082860160005b85811015613535578284038952613523848351613403565b9885019893509084019060010161350b565b5091979650505050505050565b6080815260006135556080830187613479565b828103602084015261356781876134bd565b9050828103604084015261357b81866134ed565b9050828103606084015261358f81856134ed565b979650505050505050565b803560ff8116811461345957600080fd5b600080600080600060a086880312156135c357600080fd5b853594506135d36020870161359a565b93506135e16040870161359a565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363157634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364a57600080fd5b61365383613442565b946020939093013593505050565b6000806040838503121561367457600080fd5b823591506136846020840161359a565b90509250929050565b600080600080606085870312156136a357600080fd5b843593506136b36020860161359a565b9250604085013567ffffffffffffffff808211156136d057600080fd5b818701915087601f8301126136e457600080fd5b8135818111156136f357600080fd5b88602082850101111561370557600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372c57600080fd5b61373586613442565b945061374360208701613442565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a0576137a0613761565b604052919050565b600067ffffffffffffffff8211156137c2576137c2613761565b5060051b60200190565b600082601f8301126137dd57600080fd5b813560206137f26137ed836137a8565b613777565b82815260059290921b8401810191818101908684111561381157600080fd5b8286015b848110156138335761382681613442565b8352918301918301613815565b509695505050505050565b600082601f83011261384f57600080fd5b8135602061385f6137ed836137a8565b82815260059290921b8401810191818101908684111561387e57600080fd5b8286015b848110156138335780358352918301918301613882565b600067ffffffffffffffff8211156138b3576138b3613761565b50601f01601f191660200190565b60006138cf6137ed84613899565b90508281528383830111156138e357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390b57600080fd5b612fe4838335602085016138c1565b600082601f83011261392b57600080fd5b8135602061393b6137ed836137a8565b82815260059290921b8401810191818101908684111561395a57600080fd5b8286015b8481101561383357803567ffffffffffffffff81111561397e5760008081fd5b61398c8986838b01016138fa565b84525091830191830161395e565b600082601f8301126139ab57600080fd5b813560206139bb6137ed836137a8565b82815260059290921b840181019181810190868411156139da57600080fd5b8286015b8481101561383357803567ffffffffffffffff8111156139fe5760008081fd5b8701603f81018913613a105760008081fd5b613a218986830135604084016138c1565b8452509183019183016139de565b600080600080600060a08688031215613a4757600080fd5b853567ffffffffffffffff80821115613a5f57600080fd5b613a6b89838a016137cc565b96506020880135915080821115613a8157600080fd5b613a8d89838a0161383e565b95506040880135915080821115613aa357600080fd5b613aaf89838a0161391a565b94506060880135915080821115613ac557600080fd5b613ad189838a0161399a565b93506080880135915080821115613ae757600080fd5b50613af4888289016138fa565b9150509295509295909350565b60008060408385031215613b1457600080fd5b8235915061368460208401613442565b600181811c90821680613b3857607f821691505b6020821081036113b157634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6a57600080fd5b5051919050565b600060208284031215613b8357600080fd5b81516001600160601b0381168114612fe457600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bbd81613b24565b808552602060018381168015613bda5760018114613bf457613c22565b60ff1985168884015283151560051b880183019550613c22565b866000528260002060005b85811015613c1a5781548a8201860152908301908401613bff565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5460a0830186613bb0565b8281036060840152613c668186613bb0565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca157613ca1613c79565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d238382018b613479565b90508281036060840152613d37818a6134bd565b90508281036080840152613d4b81896134ed565b905082810360a0840152613d5f81886134ed565b90508560c08401528460e0840152828103610100840152613d808185613403565b9c9b505050505050505050505050565b600060208284031215613da257600080fd5b815167ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b8051613dd86137ed82613899565b818152856020838501011115613ded57600080fd5b613dfe8260208301602086016133df565b95945050505050565b8082018082111561294457612944613c79565b8181038181111561294457612944613c79565b60018060a01b038616815284602082015260a060408201526000613e5460a0830186613403565b8281036060840152613c668186613403565b600060208284031215613e7857600080fd5b81518015158114612fe457600080fd5b601f821115613ece57600081815260208120601f850160051c81016020861015613eaf5750805b601f850160051c820191505b818110156131ee57828155600101613ebb565b505050565b815167ffffffffffffffff811115613eed57613eed613761565b613f0181613efb8454613b24565b84613e88565b602080601f831160018114613f365760008415613f1e5750858301515b600019600386901b1c1916600185901b1785556131ee565b600085815260208120601f198616915b82811015613f6557888601518255948401946001909101908401613f46565b5085821015613f835787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca2646970667358221220085371a408c3fdd6d81ee5e24cc212330de9edf27df69a3b858e0aa663fde50664736f6c63430008110033

Deployed ByteCode

0x6080604052600436106102725760003560e01c806363cd99cb1161014f578063d13f90b4116100c1578063e23a9a521161007a578063e23a9a5214610889578063e48083fe146108d9578063e9c714f2146108ee578063f851a44014610903578063fc4eee4214610923578063fe0d94c11461093957600080fd5b8063d13f90b4146107bf578063d33219b4146107df578063da35c664146107ff578063da95691a14610815578063ddf0b00914610835578063deaaa7cc1461085557600080fd5b80639953336511610113578063995333651461071c578063a64e024a1461073c578063b112626314610753578063b58131b014610769578063b71d1a0c1461077f578063c5a8425d1461079f57600080fd5b806363cd99cb14610695578063791f5d23146106b55780637b3c71d3146106d25780637bdbe4d0146106f2578063878f14821461070757600080fd5b806326782247116101e85780633bccf4fd116101ac5780633bccf4fd146105c85780633e4f49e6146105e857806340e58ee5146106155780634d6733d21461063557806356781388146106555780635c60da1b1461067557600080fd5b806326782247146104d5578063328dd9821461050d57806338bd0dda1461053d5780633932abb11461056a5780633af32abf1461058057600080fd5b806317ba1b8b1161023a57806317ba1b8b146104105780631dfb1b5a1461043057806320606b7014610450578063215809ca1461048457806324bc1a641461049957806325fd935a146104b757600080fd5b8063013cf08b1461027757806302a251a31461035057806306fdde03146103745780630ea2d98c146103c157806317977c61146103e3575b600080fd5b34801561028357600080fd5b506102f56102923660046133c6565b600a60208190526000918252604090912080546001820154600283015460078401546008850154600986015496860154600b870154600c9097015495976001600160a01b0390951696939592949193919290919060ff808216916101009004168a565b604080519a8b526001600160a01b0390991660208b0152978901969096526060880194909452608087019290925260a086015260c085015260e084015215156101008301521515610120820152610140015b60405180910390f35b34801561035c57600080fd5b5061036660045481565b604051908152602001610347565b34801561038057600080fd5b506103b4604051806040016040528060148152602001734d6f6f6c6120476f7665726e6f7220427261766f60601b81525081565b604051610347919061342f565b3480156103cd57600080fd5b506103e16103dc3660046133c6565b61094c565b005b3480156103ef57600080fd5b506103666103fe36600461345e565b600b6020526000908152604090205481565b34801561041c57600080fd5b506103e161042b3660046133c6565b610a84565b34801561043c57600080fd5b506103e161044b3660046133c6565b610bcc565b34801561045c57600080fd5b506103667f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049057600080fd5b5061036660c881565b3480156104a557600080fd5b5061036669021e19e0c9bab240000081565b3480156104c357600080fd5b5061036669152d02c7e14af680000081565b3480156104e157600080fd5b506001546104f5906001600160a01b031681565b6040516001600160a01b039091168152602001610347565b34801561051957600080fd5b5061052d6105283660046133c6565b610cf3565b6040516103479493929190613542565b34801561054957600080fd5b5061036661055836600461345e565b600c6020526000908152604090205481565b34801561057657600080fd5b5061036660035481565b34801561058c57600080fd5b506105b861059b36600461345e565b6001600160a01b03166000908152600c6020526040902054421090565b6040519015158152602001610347565b3480156105d457600080fd5b506103e16105e33660046135ab565b610f84565b3480156105f457600080fd5b506106086106033660046133c6565b6111fe565b604051610347919061360f565b34801561062157600080fd5b506103e16106303660046133c6565b6113b7565b34801561064157600080fd5b506103e1610650366004613637565b611806565b34801561066157600080fd5b506103e1610670366004613661565b6118ec565b34801561068157600080fd5b506002546104f5906001600160a01b031681565b3480156106a157600080fd5b506009546104f5906001600160a01b031681565b3480156106c157600080fd5b50610366683635c9adc5dea0000081565b3480156106de57600080fd5b506103e16106ed36600461368d565b611957565b3480156106fe57600080fd5b50610366600a81565b34801561071357600080fd5b506103e16119a7565b34801561072857600080fd5b506103e161073736600461345e565b611ae0565b34801561074857600080fd5b5061036662013b0081565b34801561075f57600080fd5b50610366619d8081565b34801561077557600080fd5b5061036660055481565b34801561078b57600080fd5b506103e161079a36600461345e565b611bad565b3480156107ab57600080fd5b50600d546104f5906001600160a01b031681565b3480156107cb57600080fd5b506103e16107da366004613714565b611c74565b3480156107eb57600080fd5b506008546104f5906001600160a01b031681565b34801561080b57600080fd5b5061036660075481565b34801561082157600080fd5b50610366610830366004613a2f565b611f91565b34801561084157600080fd5b506103e16108503660046133c6565b6125c6565b34801561086157600080fd5b506103667f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b34801561089557600080fd5b506108a96108a4366004613b01565b6128d2565b6040805182511515815260208084015160ff1690820152918101516001600160601b031690820152606001610347565b3480156108e557600080fd5b50610366600181565b3480156108fa57600080fd5b506103e161294a565b34801561090f57600080fd5b506000546104f5906001600160a01b031681565b34801561092f57600080fd5b5061036660065481565b6103e16109473660046133c6565b612a74565b6000546001600160a01b031633146109bf5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a60448201526a2061646d696e206f6e6c7960a81b60648201526084015b60405180910390fd5b60c881101580156109d3575062013b008111155b610a3e5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e67506572696f643a604482015275081a5b9d985b1a59081d9bdd1a5b99c81c195c9a5bd960521b60648201526084016109b6565b600480549082905560408051828152602081018490527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e882891015b60405180910390a15050565b6000546001600160a01b03163314610af75760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201526f686f6c643a2061646d696e206f6e6c7960801b60648201526084016109b6565b683635c9adc5dea000008110158015610b1a575069152d02c7e14af68000008111155b610b8e576040805162461bcd60e51b81526020600482015260248101919091527f476f7665726e6f72427261766f3a3a5f73657450726f706f73616c546872657360448201527f686f6c643a20696e76616c69642070726f706f73616c207468726573686f6c6460648201526084016109b6565b600580549082905560408051828152602081018490527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc054619101610a78565b6000546001600160a01b03163314610c395760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b6565b60018110158015610c4c5750619d808111155b610cb55760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a5f736574566f74696e6744656c61793a20604482015273696e76616c696420766f74696e672064656c617960601b60648201526084016109b6565b600380549082905560408051828152602081018490527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a939101610a78565b6060806060806000600a600087815260200190815260200160002090508060030181600401826005018360060183805480602002602001604051908101604052809291908181526020018280548015610d7557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d57575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610dc757602002820191906000526020600020905b815481526020019060010190808311610db3575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610e9b578382906000526020600020018054610e0e90613b24565b80601f0160208091040260200160405190810160405280929190818152602001828054610e3a90613b24565b8015610e875780601f10610e5c57610100808354040283529160200191610e87565b820191906000526020600020905b815481529060010190602001808311610e6a57829003601f168201915b505050505081526020019060010190610def565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610f6e578382906000526020600020018054610ee190613b24565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0d90613b24565b8015610f5a5780601f10610f2f57610100808354040283529160200191610f5a565b820191906000526020600020905b815481529060010190602001808311610f3d57829003601f168201915b505050505081526020019060010190610ec2565b5050505090509450945094509450509193509193565b60408051808201825260148152734d6f6f6c6120476f7665726e6f7220427261766f60601b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527f3120cbbfab38c57ca23a5a6a87898b8764fccd7065340837e0d25ef137dc55d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f60c083015260e0820189905260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611108573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166111835760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63617374566f746542795369673a20696e60448201526e76616c6964207369676e617475726560881b60648201526084016109b6565b806001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48a8a6111bb858e8e612cb1565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a2505050505050505050565b60008160075410158015611213575060065482115b6112715760405162461bcd60e51b815260206004820152602960248201527f476f7665726e6f72427261766f3a3a73746174653a20696e76616c69642070726044820152681bdc1bdcd85b081a5960ba1b60648201526084016109b6565b6000828152600a60205260409020600c81015460ff16156112955750600292915050565b806007015443116112a95750600092915050565b806008015443116112bd5750600192915050565b80600a015481600901541115806112e1575069021e19e0c9bab24000008160090154105b156112ef5750600392915050565b80600201546000036113045750600492915050565b600c810154610100900460ff161561131f5750600792915050565b6002810154600854604080516360d143f160e11b8152905161139993926001600160a01b03169163c1a287e29160048083019260209291908290030181865afa158015611370573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113949190613b58565b612f91565b42106113a85750600692915050565b50600592915050565b50919050565b60076113c2826111fe565b60078111156113d3576113d36135f9565b0361143f5760405162461bcd60e51b815260206004820152603660248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2063616e6e6f742063616044820152751b98d95b08195e1958dd5d1959081c1c9bdc1bdcd85b60521b60648201526084016109b6565b6000818152600a6020526040902060018101546001600160a01b031633146116aa5760018101546001600160a01b03166000908152600c60205260409020544210156115a3576005546009546001838101546001600160a01b039283169263782d6fe1929116906114b1904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa1580156114fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151e9190613b71565b6001600160601b031610801561153e5750600d546001600160a01b031633145b61159e5760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2077686974656c69737460448201526a32b210383937b837b9b2b960a91b60648201526084016109b6565b6116aa565b6005546009546001838101546001600160a01b039283169263782d6fe1929116906115cf904390612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611618573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163c9190613b71565b6001600160601b0316106116aa5760405162461bcd60e51b815260206004820152602f60248201527f476f7665726e6f72427261766f3a3a63616e63656c3a2070726f706f7365722060448201526e18589bdd99481d1a1c995cda1bdb19608a1b60648201526084016109b6565b600c8101805460ff1916600117905560005b60038201548110156117d5576008546003830180546001600160a01b039092169163591fcdfe9190849081106116f4576116f4613b9a565b6000918252602090912001546004850180546001600160a01b03909216918590811061172257611722613b9a565b906000526020600020015485600501858154811061174257611742613b9a565b9060005260206000200186600601868154811061176157611761613b9a565b9060005260206000200187600201546040518663ffffffff1660e01b8152600401611790959493929190613c2d565b600060405180830381600087803b1580156117aa57600080fd5b505af11580156117be573d6000803e3d6000fd5b5050505080806117cd90613c8f565b9150506116bc565b506040518281527f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c90602001610a78565b6000546001600160a01b03163314806118295750600d546001600160a01b031633145b61189b5760405162461bcd60e51b815260206004820152603960248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744163636f60448201527f756e7445787069726174696f6e3a2061646d696e206f6e6c790000000000000060648201526084016109b6565b6001600160a01b0382166000818152600c6020908152604091829020849055815192835282018390527f4e7b7545bc5744d0e30425959f4687475774b6c7edad77d24cb51c7d967d45159101610a78565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4838361191b848383612cb1565b6040805193845260ff90921660208401526001600160601b03169082015260806060820181905260009082015260a00160405180910390a25050565b337fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda48585611986848383612cb1565b8686604051611999959493929190613ca8565b60405180910390a250505050565b6000546001600160a01b03163314611a0d5760405162461bcd60e51b8152602060048201526024808201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2061646d696e206044820152636f6e6c7960e01b60648201526084016109b6565b60065415611a765760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f696e6974696174653a2063616e206f6e60448201526f6c7920696e697469617465206f6e636560801b60648201526084016109b6565b600860009054906101000a90046001600160a01b03166001600160a01b0316630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611ac657600080fd5b505af1158015611ada573d6000803e3d6000fd5b50505050565b6000546001600160a01b03163314611b535760405162461bcd60e51b815260206004820152603060248201527f476f7665726e6f72427261766f3a3a5f73657457686974656c6973744775617260448201526f6469616e3a2061646d696e206f6e6c7960801b60648201526084016109b6565b600d80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f80a07e73e552148844a9c216d9724212d609cfa54e9c1a2e97203bdd2c4ad3419101610a78565b6000546001600160a01b03163314611c1a5760405162461bcd60e51b815260206004820152602a60248201527f476f7665726e6f72427261766f3a5f73657450656e64696e6741646d696e3a2060448201526961646d696e206f6e6c7960b01b60648201526084016109b6565b600180546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a78565b6008546001600160a01b031615611ce95760405162461bcd60e51b815260206004820152603360248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2063616e206f6044820152726e6c7920696e697469616c697a65206f6e636560681b60648201526084016109b6565b6000546001600160a01b03163314611d515760405162461bcd60e51b815260206004820152602560248201527f476f7665726e6f72427261766f3a3a696e697469616c697a653a2061646d696e604482015264206f6e6c7960d81b60648201526084016109b6565b6001600160a01b038516611db15760405162461bcd60e51b81526020600482015260336024820152600080516020613f9483398151915260448201527269642074696d656c6f636b206164647265737360681b60648201526084016109b6565b6001600160a01b038416611e0c5760405162461bcd60e51b815260206004820152602e6024820152600080516020613f9483398151915260448201526d6964206d6f6f206164647265737360901b60648201526084016109b6565b60c88310158015611e20575062013b008311155b611e735760405162461bcd60e51b81526020600482015260306024820152600080516020613f9483398151915260448201526f1a59081d9bdd1a5b99c81c195c9a5bd960821b60648201526084016109b6565b60018210158015611e865750619d808211155b611ed85760405162461bcd60e51b815260206004820152602f6024820152600080516020613f9483398151915260448201526e696420766f74696e672064656c617960881b60648201526084016109b6565b683635c9adc5dea000008110158015611efb575069152d02c7e14af68000008111155b611f535760405162461bcd60e51b81526020600482015260356024820152600080516020613f948339815191526044820152741a59081c1c9bdc1bdcd85b081d1a1c995cda1bdb19605a1b60648201526084016109b6565b600880546001600160a01b039687166001600160a01b0319918216179091556009805495909616941693909317909355600455600391909155600555565b600554600954600091906001600160a01b031663782d6fe133611fb5436001612feb565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381865afa158015611ffe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120229190613b71565b6001600160601b031611806120455750336000908152600c602052604090205442105b6120b75760405162461bcd60e51b815260206004820152603f60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73657260448201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c640060648201526084016109b6565b845186511480156120c9575083518651145b80156120d6575082518651145b6121565760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a70726f706f73653a2070726f706f73616c908201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d6064820152630c2e8c6d60e31b608482015260a4016109b6565b85516000036121bc5760405162461bcd60e51b815260206004820152602c60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206d7573742070726f60448201526b7669646520616374696f6e7360a01b60648201526084016109b6565b600a8651111561221f5760405162461bcd60e51b815260206004820152602860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a20746f6f206d616e7960448201526720616374696f6e7360c01b60648201526084016109b6565b336000908152600b6020526040902054801561239e576000612240826111fe565b90506001816007811115612256576122566135f9565b036122ef5760405162461bcd60e51b815260206004820152605860248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c7265616479206163746976652070726f706f73616c0000000000000000608482015260a4016109b6565b6000816007811115612303576123036135f9565b0361239c5760405162461bcd60e51b815260206004820152605960248201527f476f7665726e6f72427261766f3a3a70726f706f73653a206f6e65206c69766560448201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60648201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000608482015260a4016109b6565b505b60006123ac43600354612f91565b905060006123bc82600454612f91565b6007805491925060006123ce83613c8f565b90915550506007546000818152600a602052604090208054156124475760405162461bcd60e51b815260206004820152602b60248201527f476f7665726e6f72427261766f3a3a70726f706f73653a2050726f706f73616c60448201526a24a21031b7b63639b4b7b760a91b60648201526084016109b6565b8181556001810180546001600160a01b03191633179055600060028201558a5161247a90600383019060208e01906131f6565b50895161249090600483019060208d019061325b565b5088516124a690600583019060208c0190613296565b5087516124bc90600683019060208b01906132e8565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0181905550600081600c0160006101000a81548160ff021916908315150217905550600081600c0160016101000a81548160ff0219169083151502179055508060000154600b60008360010160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f6040516125af99989796959493929190613cf8565b60405180910390a1549a9950505050505050505050565b60046125d1826111fe565b60078111156125e2576125e26135f9565b146126635760405162461bcd60e51b8152602060048201526044602482018190527f476f7665726e6f72427261766f3a3a71756575653a2070726f706f73616c2063908201527f616e206f6e6c79206265207175657565642069662069742069732073756363656064820152631959195960e21b608482015260a4016109b6565b6000818152600a602090815260408083206008548251630d48571f60e31b815292519194936126c29342936001600160a01b0390931692636a42b8f8926004808401939192918290030181865afa158015611370573d6000803e3d6000fd5b905060005b600383015481101561288c5761287a8360030182815481106126eb576126eb613b9a565b6000918252602090912001546004850180546001600160a01b03909216918490811061271957612719613b9a565b906000526020600020015485600501848154811061273957612739613b9a565b90600052602060002001805461274e90613b24565b80601f016020809104026020016040519081016040528092919081815260200182805461277a90613b24565b80156127c75780601f1061279c576101008083540402835291602001916127c7565b820191906000526020600020905b8154815290600101906020018083116127aa57829003601f168201915b50505050508660060185815481106127e1576127e1613b9a565b9060005260206000200180546127f690613b24565b80601f016020809104026020016040519081016040528092919081815260200182805461282290613b24565b801561286f5780601f106128445761010080835404028352916020019161286f565b820191906000526020600020905b81548152906001019060200180831161285257829003601f168201915b50505050508661303f565b8061288481613c8f565b9150506126c7565b506002820181905560408051848152602081018390527f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892910160405180910390a1505050565b604080516060808201835260008083526020808401829052928401819052858152600a83528381206001600160a01b0386168252600d018352839020835191820184525460ff8082161515835261010082041692820192909252620100009091046001600160601b0316918101919091525b92915050565b6001546001600160a01b03163314801561296357503315155b6129c65760405162461bcd60e51b815260206004820152602e60248201527f476f7665726e6f72427261766f3a5f61636365707441646d696e3a2070656e6460448201526d696e672061646d696e206f6e6c7960901b60648201526084016109b6565b60008054600180546001600160a01b038082166001600160a01b031980861682179096559490911690915560408051919092168082526020820184905292917ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc910160405180910390a1600154604080516001600160a01b03808516825290921660208301527fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a99101610a78565b6005612a7f826111fe565b6007811115612a9057612a906135f9565b14612b115760405162461bcd60e51b815260206004820152604560248201527f476f7665726e6f72427261766f3a3a657865637574653a2070726f706f73616c60448201527f2063616e206f6e6c7920626520657865637574656420696620697420697320716064820152641d595d595960da1b608482015260a4016109b6565b6000818152600a60205260408120600c8101805461ff001916610100179055905b6003820154811015612c80576008546004830180546001600160a01b0390921691630825f38f919084908110612b6a57612b6a613b9a565b9060005260206000200154846003018481548110612b8a57612b8a613b9a565b6000918252602090912001546004860180546001600160a01b039092169186908110612bb857612bb8613b9a565b9060005260206000200154866005018681548110612bd857612bd8613b9a565b90600052602060002001876006018781548110612bf757612bf7613b9a565b9060005260206000200188600201546040518763ffffffff1660e01b8152600401612c26959493929190613c2d565b60006040518083038185885af1158015612c44573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052612c6d9190810190613d90565b5080612c7881613c8f565b915050612b32565b506040518281527f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f90602001610a78565b60006001612cbe846111fe565b6007811115612ccf57612ccf6135f9565b14612d365760405162461bcd60e51b815260206004820152603160248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015270081d9bdd1a5b99c81a5cc818db1bdcd959607a1b60648201526084016109b6565b60028260ff161115612da55760405162461bcd60e51b815260206004820152603260248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a60448201527120696e76616c696420766f7465207479706560701b60648201526084016109b6565b6000838152600a602090815260408083206001600160a01b0388168452600d8101909252909120805460ff1615612e3b5760405162461bcd60e51b815260206004820152603460248201527f476f7665726e6f72427261766f3a3a63617374566f7465496e7465726e616c3a604482015273081d9bdd195c88185b1c9958591e481d9bdd195960621b60648201526084016109b6565b600954600783015460405163782d6fe160e01b81526000926001600160a01b03169163782d6fe191612e85918b916004016001600160a01b03929092168252602082015260400190565b602060405180830381865afa158015612ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ec69190613b71565b90508460ff16600003612ef457612eea83600a0154826001600160601b0316612f91565b600a840155612f48565b8460ff16600103612f2057612f168360090154826001600160601b0316612f91565b6009840155612f48565b8460ff16600203612f4857612f4283600b0154826001600160601b0316612f91565b600b8401555b81546001600160601b03821662010000026dffffffffffffffffffffffff00001960ff88166101000261ffff199093169290921760011791909116179091559150509392505050565b600080612f9e8385613e07565b905083811015612fe45760405162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b60448201526064016109b6565b9392505050565b6000828211156130355760405162461bcd60e51b81526020600482015260156024820152747375627472616374696f6e20756e646572666c6f7760581b60448201526064016109b6565b612fe48284613e1a565b6008546040516001600160a01b039091169063f2b065379061306d9088908890889088908890602001613e2d565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016130a191815260200190565b602060405180830381865afa1580156130be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e29190613e66565b156131735760405162461bcd60e51b815260206004820152605560248201527f476f7665726e6f72427261766f3a3a71756575654f72526576657274496e746560448201527f726e616c3a206964656e746963616c2070726f706f73616c20616374696f6e20606482015274616c7265616479207175657565642061742065746160581b608482015260a4016109b6565b600854604051633a66f90160e01b81526001600160a01b0390911690633a66f901906131ab9088908890889088908890600401613e2d565b6020604051808303816000875af11580156131ca573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ee9190613b58565b505050505050565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613216565b5061325792915061333a565b5090565b82805482825590600052602060002090810192821561324b579160200282015b8281111561324b57825182559160200191906001019061327b565b8280548282559060005260206000209081019282156132dc579160200282015b828111156132dc57825182906132cc9082613ed3565b50916020019190600101906132b6565b5061325792915061334f565b82805482825590600052602060002090810192821561332e579160200282015b8281111561332e578251829061331e9082613ed3565b5091602001919060010190613308565b5061325792915061336c565b5b80821115613257576000815560010161333b565b808211156132575760006133638282613389565b5060010161334f565b808211156132575760006133808282613389565b5060010161336c565b50805461339590613b24565b6000825580601f106133a5575050565b601f0160209004906000526020600020908101906133c3919061333a565b50565b6000602082840312156133d857600080fd5b5035919050565b60005b838110156133fa5781810151838201526020016133e2565b50506000910152565b6000815180845261341b8160208601602086016133df565b601f01601f19169290920160200192915050565b602081526000612fe46020830184613403565b80356001600160a01b038116811461345957600080fd5b919050565b60006020828403121561347057600080fd5b612fe482613442565b600081518084526020808501945080840160005b838110156134b25781516001600160a01b03168752958201959082019060010161348d565b509495945050505050565b600081518084526020808501945080840160005b838110156134b2578151875295820195908201906001016134d1565b600081518084526020808501808196508360051b8101915082860160005b85811015613535578284038952613523848351613403565b9885019893509084019060010161350b565b5091979650505050505050565b6080815260006135556080830187613479565b828103602084015261356781876134bd565b9050828103604084015261357b81866134ed565b9050828103606084015261358f81856134ed565b979650505050505050565b803560ff8116811461345957600080fd5b600080600080600060a086880312156135c357600080fd5b853594506135d36020870161359a565b93506135e16040870161359a565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b602081016008831061363157634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561364a57600080fd5b61365383613442565b946020939093013593505050565b6000806040838503121561367457600080fd5b823591506136846020840161359a565b90509250929050565b600080600080606085870312156136a357600080fd5b843593506136b36020860161359a565b9250604085013567ffffffffffffffff808211156136d057600080fd5b818701915087601f8301126136e457600080fd5b8135818111156136f357600080fd5b88602082850101111561370557600080fd5b95989497505060200194505050565b600080600080600060a0868803121561372c57600080fd5b61373586613442565b945061374360208701613442565b94979496505050506040830135926060810135926080909101359150565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156137a0576137a0613761565b604052919050565b600067ffffffffffffffff8211156137c2576137c2613761565b5060051b60200190565b600082601f8301126137dd57600080fd5b813560206137f26137ed836137a8565b613777565b82815260059290921b8401810191818101908684111561381157600080fd5b8286015b848110156138335761382681613442565b8352918301918301613815565b509695505050505050565b600082601f83011261384f57600080fd5b8135602061385f6137ed836137a8565b82815260059290921b8401810191818101908684111561387e57600080fd5b8286015b848110156138335780358352918301918301613882565b600067ffffffffffffffff8211156138b3576138b3613761565b50601f01601f191660200190565b60006138cf6137ed84613899565b90508281528383830111156138e357600080fd5b828260208301376000602084830101529392505050565b600082601f83011261390b57600080fd5b612fe4838335602085016138c1565b600082601f83011261392b57600080fd5b8135602061393b6137ed836137a8565b82815260059290921b8401810191818101908684111561395a57600080fd5b8286015b8481101561383357803567ffffffffffffffff81111561397e5760008081fd5b61398c8986838b01016138fa565b84525091830191830161395e565b600082601f8301126139ab57600080fd5b813560206139bb6137ed836137a8565b82815260059290921b840181019181810190868411156139da57600080fd5b8286015b8481101561383357803567ffffffffffffffff8111156139fe5760008081fd5b8701603f81018913613a105760008081fd5b613a218986830135604084016138c1565b8452509183019183016139de565b600080600080600060a08688031215613a4757600080fd5b853567ffffffffffffffff80821115613a5f57600080fd5b613a6b89838a016137cc565b96506020880135915080821115613a8157600080fd5b613a8d89838a0161383e565b95506040880135915080821115613aa357600080fd5b613aaf89838a0161391a565b94506060880135915080821115613ac557600080fd5b613ad189838a0161399a565b93506080880135915080821115613ae757600080fd5b50613af4888289016138fa565b9150509295509295909350565b60008060408385031215613b1457600080fd5b8235915061368460208401613442565b600181811c90821680613b3857607f821691505b6020821081036113b157634e487b7160e01b600052602260045260246000fd5b600060208284031215613b6a57600080fd5b5051919050565b600060208284031215613b8357600080fd5b81516001600160601b0381168114612fe457600080fd5b634e487b7160e01b600052603260045260246000fd5b60008154613bbd81613b24565b808552602060018381168015613bda5760018114613bf457613c22565b60ff1985168884015283151560051b880183019550613c22565b866000528260002060005b85811015613c1a5781548a8201860152908301908401613bff565b890184019650505b505050505092915050565b60018060a01b038616815284602082015260a060408201526000613c5460a0830186613bb0565b8281036060840152613c668186613bb0565b9150508260808301529695505050505050565b634e487b7160e01b600052601160045260246000fd5b600060018201613ca157613ca1613c79565b5060010190565b85815260ff851660208201526001600160601b038416604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b8981526001600160a01b038916602082015261012060408201819052600090613d238382018b613479565b90508281036060840152613d37818a6134bd565b90508281036080840152613d4b81896134ed565b905082810360a0840152613d5f81886134ed565b90508560c08401528460e0840152828103610100840152613d808185613403565b9c9b505050505050505050505050565b600060208284031215613da257600080fd5b815167ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b8051613dd86137ed82613899565b818152856020838501011115613ded57600080fd5b613dfe8260208301602086016133df565b95945050505050565b8082018082111561294457612944613c79565b8181038181111561294457612944613c79565b60018060a01b038616815284602082015260a060408201526000613e5460a0830186613403565b8281036060840152613c668186613403565b600060208284031215613e7857600080fd5b81518015158114612fe457600080fd5b601f821115613ece57600081815260208120601f850160051c81016020861015613eaf5750805b601f850160051c820191505b818110156131ee57828155600101613ebb565b505050565b815167ffffffffffffffff811115613eed57613eed613761565b613f0181613efb8454613b24565b84613e88565b602080601f831160018114613f365760008415613f1e5750858301515b600019600386901b1c1916600185901b1785556131ee565b600085815260208120601f198616915b82811015613f6557888601518255948401946001909101908401613f46565b5085821015613f835787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fe476f7665726e6f72427261766f3a3a696e697469616c697a653a20696e76616ca2646970667358221220085371a408c3fdd6d81ee5e24cc212330de9edf27df69a3b858e0aa663fde50664736f6c63430008110033