ETH Price: $3,038.65 (+3.00%)

Contract

0x04Aa51bbcB46541455cCF1B8bef2ebc5d3787EC9
 
Transaction Hash
Method
Block
From
To
Withdraw209797922024-10-16 18:03:4723 days ago1729101827IN
Yearn: yWTBC Token
0 ETH0.0036690318.45182004
Approve209393802024-10-11 2:24:5929 days ago1728613499IN
Yearn: yWTBC Token
0 ETH0.0008866318.74300818
Approve208128732024-09-23 11:06:3547 days ago1727089595IN
Yearn: yWTBC Token
0 ETH0.0009223619.49824121
Approve207201302024-09-10 12:11:2360 days ago1725970283IN
Yearn: yWTBC Token
0 ETH0.000368987.80015353
Approve207201082024-09-10 12:06:4760 days ago1725970007IN
Yearn: yWTBC Token
0 ETH0.000433469.16324677
Approve207189702024-09-10 8:18:1160 days ago1725956291IN
Yearn: yWTBC Token
0 ETH0.000137642.90973839
Approve207189632024-09-10 8:16:4760 days ago1725956207IN
Yearn: yWTBC Token
0 ETH0.000154153.25871214
Approve207189602024-09-10 8:16:1160 days ago1725956171IN
Yearn: yWTBC Token
0 ETH0.000148423.13762809
Approve207189372024-09-10 8:11:3560 days ago1725955895IN
Yearn: yWTBC Token
0 ETH0.000154613.26844674
Approve207189352024-09-10 8:11:1160 days ago1725955871IN
Yearn: yWTBC Token
0 ETH0.000142213.00637923
Approve207189322024-09-10 8:10:3560 days ago1725955835IN
Yearn: yWTBC Token
0 ETH0.000141752.99660094
Approve207189282024-09-10 8:09:4760 days ago1725955787IN
Yearn: yWTBC Token
0 ETH0.000162433.43383409
Approve207188672024-09-10 7:57:3560 days ago1725955055IN
Yearn: yWTBC Token
0 ETH0.000159153.36434163
Approve207188612024-09-10 7:56:2360 days ago1725954983IN
Yearn: yWTBC Token
0 ETH0.000151583.20439817
Approve207188532024-09-10 7:54:4760 days ago1725954887IN
Yearn: yWTBC Token
0 ETH0.00016063.39511865
Approve207188072024-09-10 7:45:1160 days ago1725954311IN
Yearn: yWTBC Token
0 ETH0.000176133.72338243
Approve207188072024-09-10 7:45:1160 days ago1725954311IN
Yearn: yWTBC Token
0 ETH0.000176133.72338243
Approve207188002024-09-10 7:43:4760 days ago1725954227IN
Yearn: yWTBC Token
0 ETH0.000162093.42666037
Approve207055462024-09-08 11:18:2362 days ago1725794303IN
Yearn: yWTBC Token
0 ETH0.000041650.88065505
Approve207055442024-09-08 11:17:5962 days ago1725794279IN
Yearn: yWTBC Token
0 ETH0.000041150.86994777
Approve207055062024-09-08 11:10:1162 days ago1725793811IN
Yearn: yWTBC Token
0 ETH0.000044970.95075713
Approve207054852024-09-08 11:05:5962 days ago1725793559IN
Yearn: yWTBC Token
0 ETH0.000047311.00017641
Approve207054162024-09-08 10:51:5962 days ago1725792719IN
Yearn: yWTBC Token
0 ETH0.00004020.84994348
Approve207053382024-09-08 10:36:2362 days ago1725791783IN
Yearn: yWTBC Token
0 ETH0.000041350.87412703
Approve207053132024-09-08 10:31:2362 days ago1725791483IN
Yearn: yWTBC Token
0 ETH0.000046110.97476378
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
yWBTC

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-12
*/

pragma solidity ^0.5.0;
pragma experimental ABIEncoderV2;

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Context {
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        _owner = _msgSender();
        emit OwnershipTransferred(address(0), _owner);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 _totalSupply;
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }
    function name() public view returns (string memory) {
        return _name;
    }
    function symbol() public view returns (string memory) {
        return _symbol;
    }
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

contract ReentrancyGuard {
    uint256 private _guardCounter;

    constructor () internal {
        _guardCounter = 1;
    }

    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter, "ReentrancyGuard: reentrant call");
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != 0x0 && codehash != accountHash);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface Compound {
    function mint ( uint256 mintAmount ) external returns ( uint256 );
    function redeem(uint256 redeemTokens) external returns (uint256);
    function exchangeRateStored() external view returns (uint);
}

interface Fulcrum {
    function mint(address receiver, uint256 amount) external payable returns (uint256 mintAmount);
    function burn(address receiver, uint256 burnAmount) external returns (uint256 loanAmountPaid);
    function assetBalanceOf(address _owner) external view returns (uint256 balance);
}

interface ILendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
}

interface Aave {
    function deposit(address _reserve, uint256 _amount, uint16 _referralCode) external;
}

interface AToken {
    function redeem(uint256 amount) external;
}

interface IIEarnManager {
    function recommend(address _token) external view returns (
      string memory choice,
      uint256 capr,
      uint256 iapr,
      uint256 aapr,
      uint256 dapr
    );
}

contract Structs {
    struct Val {
        uint256 value;
    }

    enum ActionType {
        Deposit,   // supply tokens
        Withdraw  // borrow tokens
    }

    enum AssetDenomination {
        Wei // the amount is denominated in wei
    }

    enum AssetReference {
        Delta // the amount is given as a delta from the current value
    }

    struct AssetAmount {
        bool sign; // true if positive
        AssetDenomination denomination;
        AssetReference ref;
        uint256 value;
    }

    struct ActionArgs {
        ActionType actionType;
        uint256 accountId;
        AssetAmount amount;
        uint256 primaryMarketId;
        uint256 secondaryMarketId;
        address otherAddress;
        uint256 otherAccountId;
        bytes data;
    }

    struct Info {
        address owner;  // The address that owns the account
        uint256 number; // A nonce that allows a single address to control many accounts
    }

    struct Wei {
        bool sign; // true if positive
        uint256 value;
    }
}

contract DyDx is Structs {
    function getAccountWei(Info memory account, uint256 marketId) public view returns (Wei memory);
    function operate(Info[] memory, ActionArgs[] memory) public;
}

interface LendingPoolAddressesProvider {
    function getLendingPool() external view returns (address);
    function getLendingPoolCore() external view returns (address);
}

contract yWBTC is ERC20, ERC20Detailed, ReentrancyGuard, Ownable, Structs {
  using SafeERC20 for IERC20;
  using Address for address;
  using SafeMath for uint256;

  uint256 public pool;
  address public token;
  address public compound;
  address public fulcrum;
  address public aave;
  address public aaveToken;
  address public dydx;
  uint256 public dToken;
  address public apr;

  enum Lender {
      NONE,
      DYDX,
      COMPOUND,
      AAVE,
      FULCRUM
  }

  Lender public provider = Lender.NONE;

  constructor () public ERC20Detailed("iearn wBTC", "yWTBC", 8) {
    token = address(0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599);
    apr = address(0xdD6d648C991f7d47454354f4Ef326b04025a48A8);
    dydx = address(0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e);
    aave = address(0x24a42fD28C976A61Df5D00D0599C34c4f90748c8);
    fulcrum = address(0xBA9262578EFef8b3aFf7F60Cd629d6CC8859C8b5);
    aaveToken = address(0xFC4B8ED459e00e5400be803A9BB3954234FD50e3);
    compound = address(0xC11b1268C1A384e55C48c2391d8d480264A3A7F4);
    dToken = 0;
    approveToken();
  } 

  // Ownable setters incase of support in future for these systems
  function set_new_APR(address _new_APR) public onlyOwner {
      apr = _new_APR;
  }
  function set_new_COMPOUND(address _new_COMPOUND) public onlyOwner {
      compound = _new_COMPOUND;
  }
  function set_new_DTOKEN(uint256 _new_DTOKEN) public onlyOwner {
      dToken = _new_DTOKEN;
  }

  // Quick swap low gas method for pool swaps
  function deposit(uint256 _amount)
      external
      nonReentrant
  {
      require(_amount > 0, "deposit must be greater than 0");
      pool = _calcPoolValueInToken();

      IERC20(token).safeTransferFrom(msg.sender, address(this), _amount);

      // Calculate pool shares
      uint256 shares = 0;
      if (pool == 0) {
        shares = _amount;
        pool = _amount;
      } else {
        shares = (_amount.mul(_totalSupply)).div(pool);
      }
      pool = _calcPoolValueInToken();
      _mint(msg.sender, shares);
  }

  // No rebalance implementation for lower fees and faster swaps
  function withdraw(uint256 _shares)
      external
      nonReentrant
  {
      require(_shares > 0, "withdraw must be greater than 0");

      uint256 ibalance = balanceOf(msg.sender);
      require(_shares <= ibalance, "insufficient balance");

      // Could have over value from cTokens
      pool = _calcPoolValueInToken();
      // Calc to redeem before updating balances
      uint256 r = (pool.mul(_shares)).div(_totalSupply);


      _balances[msg.sender] = _balances[msg.sender].sub(_shares, "redeem amount exceeds balance");
      _totalSupply = _totalSupply.sub(_shares);

      emit Transfer(msg.sender, address(0), _shares);

      // Check balance
      uint256 b = IERC20(token).balanceOf(address(this));
      if (b < r) {
        _withdrawSome(r.sub(b));
      }

      IERC20(token).safeTransfer(msg.sender, r);
      pool = _calcPoolValueInToken();
  }

  function() external payable {

  }

  function recommend() public view returns (Lender) {
    (,uint256 capr,uint256 iapr,uint256 aapr,uint256 dapr) = IIEarnManager(apr).recommend(token);
    uint256 max = 0;
    if (capr > max) {
      max = capr;
    }
    if (iapr > max) {
      max = iapr;
    }
    if (aapr > max) {
      max = aapr;
    }
    if (dapr > max) {
      max = dapr;
    }

    Lender newProvider = Lender.NONE;
    if (max == capr) {
      newProvider = Lender.COMPOUND;
    } else if (max == iapr) {
      newProvider = Lender.FULCRUM;
    } else if (max == aapr) {
      newProvider = Lender.AAVE;
    } else if (max == dapr) {
      newProvider = Lender.DYDX;
    }
    return newProvider;
  }

  function supplyDydx(uint256 amount) public returns(uint) {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(true, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Deposit;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function _withdrawDydx(uint256 amount) internal {
      Info[] memory infos = new Info[](1);
      infos[0] = Info(address(this), 0);

      AssetAmount memory amt = AssetAmount(false, AssetDenomination.Wei, AssetReference.Delta, amount);
      ActionArgs memory act;
      act.actionType = ActionType.Withdraw;
      act.accountId = 0;
      act.amount = amt;
      act.primaryMarketId = dToken;
      act.otherAddress = address(this);

      ActionArgs[] memory args = new ActionArgs[](1);
      args[0] = act;

      DyDx(dydx).operate(infos, args);
  }

  function getAave() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPool();
  }
  function getAaveCore() public view returns (address) {
    return LendingPoolAddressesProvider(aave).getLendingPoolCore();
  }

  function approveToken() public {
      IERC20(token).safeApprove(compound, uint(-1)); //also add to constructor
      IERC20(token).safeApprove(dydx, uint(-1));
      IERC20(token).safeApprove(getAaveCore(), uint(-1));
      IERC20(token).safeApprove(fulcrum, uint(-1));
  }

  function balance() public view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function balanceDydx() public view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function balanceCompound() public view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function balanceCompoundInToken() public view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function balanceFulcrumInToken() public view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function balanceFulcrum() public view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function balanceAave() public view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _balance() internal view returns (uint256) {
    return IERC20(token).balanceOf(address(this));
  }

  function _balanceDydx() internal view returns (uint256) {
      Wei memory bal = DyDx(dydx).getAccountWei(Info(address(this), 0), dToken);
      return bal.value;
  }
  function _balanceCompound() internal view returns (uint256) {
      return IERC20(compound).balanceOf(address(this));
  }
  function _balanceCompoundInToken() internal view returns (uint256) {
    // Mantisa 1e18 to decimals
    uint256 b = balanceCompound();
    if (b > 0) {
      b = b.mul(Compound(compound).exchangeRateStored()).div(1e18);
    }
    return b;
  }
  function _balanceFulcrumInToken() internal view returns (uint256) {
    uint256 b = balanceFulcrum();
    if (b > 0) {
      b = Fulcrum(fulcrum).assetBalanceOf(address(this));
    }
    return b;
  }
  function _balanceFulcrum() internal view returns (uint256) {
    return IERC20(fulcrum).balanceOf(address(this));
  }
  function _balanceAave() internal view returns (uint256) {
    return IERC20(aaveToken).balanceOf(address(this));
  }

  function _withdrawAll() internal {
    uint256 amount = _balanceCompound();
    if (amount > 0) {
      _withdrawCompound(amount);
    }
    amount = _balanceDydx();
    if (amount > 0) {
      _withdrawDydx(amount);
    }
    amount = _balanceFulcrum();
    if (amount > 0) {
      _withdrawFulcrum(amount);
    }
    amount = _balanceAave();
    if (amount > 0) {
      _withdrawAave(amount);
    }
  }

  function _withdrawSomeCompound(uint256 _amount) internal {
    uint256 b = balanceCompound();
    uint256 bT = balanceCompoundInToken();
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawCompound(amount);
  }

  // 1999999614570950845
  function _withdrawSomeFulcrum(uint256 _amount) internal {
    // Balance of fulcrum tokens, 1 iDAI = 1.00x DAI
    uint256 b = balanceFulcrum(); // 1970469086655766652
    // Balance of token in fulcrum
    uint256 bT = balanceFulcrumInToken(); // 2000000803224344406
    require(bT >= _amount, "insufficient funds");
    // can have unintentional rounding errors
    uint256 amount = (b.mul(_amount)).div(bT).add(1);
    _withdrawFulcrum(amount);
  }

  function _withdrawSome(uint256 _amount) internal {
    if (provider == Lender.COMPOUND) {
      _withdrawSomeCompound(_amount);
    }
    if (provider == Lender.AAVE) {
      require(balanceAave() >= _amount, "insufficient funds");
      _withdrawAave(_amount);
    }
    if (provider == Lender.DYDX) {
      require(balanceDydx() >= _amount, "insufficient funds");
      _withdrawDydx(_amount);
    }
    if (provider == Lender.FULCRUM) {
      _withdrawSomeFulcrum(_amount);
    }
  }

  function rebalance() public {
    Lender newProvider = recommend();

    if (newProvider != provider) {
      _withdrawAll();
    }

    if (balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(balance());
      }
    }

    provider = newProvider;
  }

  // Internal only rebalance for better gas in redeem
  function _rebalance(Lender newProvider) internal {
    if (_balance() > 0) {
      if (newProvider == Lender.DYDX) {
        supplyDydx(_balance());
      } else if (newProvider == Lender.FULCRUM) {
        supplyFulcrum(_balance());
      } else if (newProvider == Lender.COMPOUND) {
        supplyCompound(_balance());
      } else if (newProvider == Lender.AAVE) {
        supplyAave(_balance());
      }
    }
    provider = newProvider;
  }

  function supplyAave(uint amount) public {
      Aave(getAave()).deposit(token, amount, 0);
  }
  function supplyFulcrum(uint amount) public {
      require(Fulcrum(fulcrum).mint(address(this), amount) > 0, "FULCRUM: supply failed");
  }
  function supplyCompound(uint amount) public {
      require(Compound(compound).mint(amount) == 0, "COMPOUND: supply failed");
  }
  function _withdrawAave(uint amount) internal {
      AToken(aaveToken).redeem(amount);
  }
  function _withdrawFulcrum(uint amount) internal {
      require(Fulcrum(fulcrum).burn(address(this), amount) > 0, "FULCRUM: withdraw failed");
  }
  function _withdrawCompound(uint amount) internal {
      require(Compound(compound).redeem(amount) == 0, "COMPOUND: withdraw failed");
  }

  function _calcPoolValueInToken() internal view returns (uint) {
    return _balanceCompoundInToken()
      .add(_balanceFulcrumInToken())
      .add(_balanceDydx())
      .add(_balanceAave())
      .add(_balance());
  }

  function calcPoolValueInToken() public view returns (uint) {
    return balanceCompoundInToken()
      .add(balanceFulcrumInToken())
      .add(balanceDydx())
      .add(balanceAave())
      .add(balance());
  }

  function getPricePerFullShare() public view returns (uint) {
    uint _pool = calcPoolValueInToken();
    return _pool.mul(1e18).div(_totalSupply);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"aave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"aaveToken","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"apr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceAave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceCompoundInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"balanceFulcrumInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"calcPoolValueInToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"compound","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"dydx","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fulcrum","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAave","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAaveCore","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provider","outputs":[{"internalType":"enum yWBTC.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rebalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"recommend","outputs":[{"internalType":"enum yWBTC.Lender","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_APR","type":"address"}],"name":"set_new_APR","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_COMPOUND","type":"address"}],"name":"set_new_COMPOUND","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_new_DTOKEN","type":"uint256"}],"name":"set_new_DTOKEN","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyAave","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyCompound","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyDydx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplyFulcrum","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000601060146101000a81548160ff021916908360048111156200002457fe5b02179055503480156200003657600080fd5b506040518060400160405280600a81526020017f696561726e2077425443000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f795754424300000000000000000000000000000000000000000000000000000081525060088260039080519060200190620000bd92919062000a9b565b508160049080519060200190620000d692919062000a9b565b5080600560006101000a81548160ff021916908360ff16021790555050505060016006819055506200010d6200043b60201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3732260fac5e5542a773aa44fbcfedf7c193bc2c599600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073dd6d648c991f7d47454354f4ef326b04025a48a8601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731e0447b19bb6ecfdae1e4ae1694b0c3659614e4e600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507324a42fd28c976a61df5d00d0599c34c4f90748c8600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ba9262578efef8b3aff7f60cd629d6cc8859c8b5600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073fc4b8ed459e00e5400be803a9bb3954234fd50e3600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073c11b1268c1a384e55c48c2391d8d480264a3a7f4600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600f81905550620004356200044360201b60201c565b62000fb0565b600033905090565b620004d9600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200068a60201b6200334c179092919060201c565b6200056f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200068a60201b6200334c179092919060201c565b620005f2620005836200081560201b60201c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200068a60201b6200334c179092919060201c565b62000688600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166200068a60201b6200334c179092919060201c565b565b60008114806200072a575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401620006d492919062000dd9565b60206040518083038186803b158015620006ed57600080fd5b505afa15801562000702573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000728919081019062000be7565b145b6200076c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007639062000e77565b60405180910390fd5b62000810838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b8484604051602401620007a792919062000e06565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620008c060201b60201c565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156200088057600080fd5b505afa15801562000895573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620008bb919081019062000b8f565b905090565b620008ec8273ffffffffffffffffffffffffffffffffffffffff1662000a4f60201b6200455b1760201c565b6200092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009259062000e99565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff168360405162000959919062000dc0565b6000604051808303816000865af19150503d806000811462000998576040519150601f19603f3d011682016040523d82523d6000602084013e6200099d565b606091505b509150915081620009e5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009dc9062000e33565b60405180910390fd5b60008151111562000a49578080602001905162000a06919081019062000bbb565b62000a48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a3f9062000e55565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801562000a925750808214155b92505050919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000ade57805160ff191683800117855562000b0f565b8280016001018555821562000b0f579182015b8281111562000b0e57825182559160200191906001019062000af1565b5b50905062000b1e919062000b22565b5090565b62000b4791905b8082111562000b4357600081600090555060010162000b29565b5090565b90565b60008151905062000b5b8162000f62565b92915050565b60008151905062000b728162000f7c565b92915050565b60008151905062000b898162000f96565b92915050565b60006020828403121562000ba257600080fd5b600062000bb28482850162000b4a565b91505092915050565b60006020828403121562000bce57600080fd5b600062000bde8482850162000b61565b91505092915050565b60006020828403121562000bfa57600080fd5b600062000c0a8482850162000b78565b91505092915050565b62000c1e8162000ee2565b82525050565b600062000c318262000ebb565b62000c3d818562000ec6565b935062000c4f81856020860162000f2c565b80840191505092915050565b600062000c6a60208362000ed1565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b600062000cac602a8362000ed1565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600062000d1460368362000ed1565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600062000d7c601f8362000ed1565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b62000dba8162000f22565b82525050565b600062000dce828462000c24565b915081905092915050565b600060408201905062000df0600083018562000c13565b62000dff602083018462000c13565b9392505050565b600060408201905062000e1d600083018562000c13565b62000e2c602083018462000daf565b9392505050565b6000602082019050818103600083015262000e4e8162000c5b565b9050919050565b6000602082019050818103600083015262000e708162000c9d565b9050919050565b6000602082019050818103600083015262000e928162000d05565b9050919050565b6000602082019050818103600083015262000eb48162000d6d565b9050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600062000eef8262000f02565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000f4c57808201518184015260208101905062000f2f565b8381111562000f5c576000848401525b50505050565b62000f6d8162000ee2565b811462000f7957600080fd5b50565b62000f878162000ef6565b811462000f9357600080fd5b50565b62000fa18162000f22565b811462000fad57600080fd5b50565b615dc58062000fc06000396000f3fe6080604052600436106102935760003560e01c8063819faf7b1161015a578063b6b55f25116100c1578063f5a41dea1161007a578063f5a41dea146109e7578063f5ff191614610a12578063f69e204614610a3b578063f7c1ec7714610a66578063f82ce27d14610a91578063fc0c546a14610abc57610293565b8063b6b55f25146108d9578063cf8ca42614610902578063d9d7858a1461092d578063dd62ed3e14610958578063e849d65914610995578063f2fde38b146109be57610293565b80639ff011b9116101135780639ff011b9146107b5578063a160176d146107de578063a457c2d714610809578063a728797114610846578063a9059cbb14610871578063b69ef8a8146108ae57610293565b8063819faf7b146106c75780638da5cb5b146106f25780638e4ec6ef1461071d5780638f32d59b1461074857806395d89b411461077357806399b71d5c1461079e57610293565b806339c0a7e1116101fe57806370a08231116101b757806370a08231146105dd5780637137ef991461061a578063715018a61461064557806377c7b8fc1461065c5780637d7c2a1c146106875780638124955c1461069e57610293565b806339c0a7e1146104df578063463574731461050a57806357ded9c91461053357806358782c211461055e57806361c1ec551461058957806365aab749146105b457610293565b806316f0115b1161025057806316f0115b146103bb57806318160ddd146103e657806323b872dd146104115780632e1a7d4d1461044e578063313ce5671461047757806339509351146104a257610293565b806306636c1c1461029557806306a3fe59146102d257806306fdde03146102fd578063085d488314610328578063095ea7b3146103535780630eb2a26714610390575b005b3480156102a157600080fd5b506102bc60048036036102b79190810190614a49565b610ae7565b6040516102c991906159c4565b60405180910390f35b3480156102de57600080fd5b506102e7610d25565b6040516102f4919061552d565b60405180910390f35b34801561030957600080fd5b50610312610d4b565b60405161031f91906156b9565b60405180910390f35b34801561033457600080fd5b5061033d610ded565b60405161034a919061569e565b60405180910390f35b34801561035f57600080fd5b5061037a6004803603610375919081019061492c565b610e00565b6040516103879190615683565b60405180910390f35b34801561039c57600080fd5b506103a5610e1e565b6040516103b291906159c4565b60405180910390f35b3480156103c757600080fd5b506103d0610ed0565b6040516103dd91906159c4565b60405180910390f35b3480156103f257600080fd5b506103fb610ed6565b60405161040891906159c4565b60405180910390f35b34801561041d57600080fd5b50610438600480360361043391908101906148dd565b610ee0565b6040516104459190615683565b60405180910390f35b34801561045a57600080fd5b5061047560048036036104709190810190614a49565b610fb9565b005b34801561048357600080fd5b5061048c611363565b60405161049991906159df565b60405180910390f35b3480156104ae57600080fd5b506104c960048036036104c4919081019061492c565b61137a565b6040516104d69190615683565b60405180910390f35b3480156104eb57600080fd5b506104f461142d565b60405161050191906159c4565b60405180910390f35b34801561051657600080fd5b50610531600480360361052c919081019061484f565b61151d565b005b34801561053f57600080fd5b506105486115a8565b604051610555919061552d565b60405180910390f35b34801561056a57600080fd5b506105736115ce565b604051610580919061552d565b60405180910390f35b34801561059557600080fd5b5061059e6115f4565b6040516105ab91906159c4565b60405180910390f35b3480156105c057600080fd5b506105db60048036036105d69190810190614a49565b6116a6565b005b3480156105e957600080fd5b5061060460048036036105ff919081019061484f565b611742565b60405161061191906159c4565b60405180910390f35b34801561062657600080fd5b5061062f61178a565b60405161063c91906159c4565b60405180910390f35b34801561065157600080fd5b5061065a6117fd565b005b34801561066857600080fd5b50610671611905565b60405161067e91906159c4565b60405180910390f35b34801561069357600080fd5b5061069c611947565b005b3480156106aa57600080fd5b506106c560048036036106c09190810190614a49565b611a8e565b005b3480156106d357600080fd5b506106dc611b82565b6040516106e9919061552d565b60405180910390f35b3480156106fe57600080fd5b50610707611ba8565b604051610714919061552d565b60405180910390f35b34801561072957600080fd5b50610732611bd2565b60405161073f919061552d565b60405180910390f35b34801561075457600080fd5b5061075d611bf8565b60405161076a9190615683565b60405180910390f35b34801561077f57600080fd5b50610788611c57565b60405161079591906156b9565b60405180910390f35b3480156107aa57600080fd5b506107b3611cf9565b005b3480156107c157600080fd5b506107dc60048036036107d79190810190614a49565b611f1c565b005b3480156107ea57600080fd5b506107f3611f6d565b604051610800919061569e565b60405180910390f35b34801561081557600080fd5b50610830600480360361082b919081019061492c565b6120d9565b60405161083d9190615683565b60405180910390f35b34801561085257600080fd5b5061085b6121a6565b60405161086891906159c4565b60405180910390f35b34801561087d57600080fd5b506108986004803603610893919081019061492c565b612292565b6040516108a59190615683565b60405180910390f35b3480156108ba57600080fd5b506108c36122b0565b6040516108d091906159c4565b60405180910390f35b3480156108e557600080fd5b5061090060048036036108fb9190810190614a49565b612362565b005b34801561090e57600080fd5b506109176124c6565b60405161092491906159c4565b60405180910390f35b34801561093957600080fd5b50610942612578565b60405161094f91906159c4565b60405180910390f35b34801561096457600080fd5b5061097f600480360361097a91908101906148a1565b61257e565b60405161098c91906159c4565b60405180910390f35b3480156109a157600080fd5b506109bc60048036036109b79190810190614a49565b612605565b005b3480156109ca57600080fd5b506109e560048036036109e0919081019061484f565b6126f7565b005b3480156109f357600080fd5b506109fc61274a565b604051610a0991906159c4565b60405180910390f35b348015610a1e57600080fd5b50610a396004803603610a34919081019061484f565b612815565b005b348015610a4757600080fd5b50610a506128a0565b604051610a5d919061552d565b60405180910390f35b348015610a7257600080fd5b50610a7b6128c6565b604051610a88919061552d565b60405180910390f35b348015610a9d57600080fd5b50610aa661296d565b604051610ab3919061552d565b60405180910390f35b348015610ac857600080fd5b50610ad1612a14565b604051610ade919061552d565b60405180910390f35b600060606001604051908082528060200260200182016040528015610b2657816020015b610b136145a6565b815260200190600190039081610b0b5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610b6257fe5b6020026020010181905250610b756145d6565b6040518060800160405280600115158152602001600080811115610b9557fe5b8152602001600080811115610ba657fe5b8152602001858152509050610bb9614614565b600081600001906001811115610bcb57fe5b90816001811115610bd857fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610c7157816020015b610c5e614680565b815260200190600190039081610c565790505b5090508181600081518110610c8257fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610cea92919061564c565b600060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b5050505050505050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b5050505050905090565b601060149054906101000a900460ff1681565b6000610e14610e0d612a3a565b8484612a42565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e7b9190615548565b60206040518083038186803b158015610e9357600080fd5b505afa158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ecb9190810190614a72565b905090565b60085481565b6000600254905090565b6000610eed848484612c0d565b610fae84610ef9612a3a565b610fa985604051806060016040528060288152602001615d3660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f5f612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b612a42565b600190509392505050565b60016006600082825401925050819055506000600654905060008211611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b9061583b565b60405180910390fd5b600061101f33611742565b905080831115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061581b565b60405180910390fd5b61106c612ef2565b600881905550600061109d60025461108f86600854612f6590919063ffffffff16565b612fd590919063ffffffff16565b9050611127846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061117e8460025461301f90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516111e291906159c4565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112479190615548565b60206040518083038186803b15801561125f57600080fd5b505afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112979190810190614a72565b9050818110156112bd576112bc6112b7828461301f90919063ffffffff16565b613069565b5b61130a3383600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131df9092919063ffffffff16565b611312612ef2565b600881905550505050600654811461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061591b565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b6000611423611387612a3a565b8461141e8560016000611398612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b612a42565b6001905092915050565b60006114376146ec565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b81526004016114c192919061599b565b604080518083038186803b1580156114d857600080fd5b505afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115109190810190614a20565b9050806020015191505090565b611525611bf8565b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906157fb565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116519190615548565b60206040518083038186803b15801561166957600080fd5b505afa15801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116a19190810190614a72565b905090565b6116ae6128c6565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b815260040161170d93929190615615565b600060405180830381600087803b15801561172757600080fd5b505af115801561173b573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006117f86117976122b0565b6117ea6117a26124c6565b6117dc6117ad61142d565b6117ce6117b861274a565b6117c06121a6565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b905090565b611805611bf8565b611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b906157fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061191061178a565b9050611941600254611933670de0b6b3a764000084612f6590919063ffffffff16565b612fd590919063ffffffff16565b91505090565b6000611951611f6d565b9050601060149054906101000a900460ff16600481111561196e57fe5b81600481111561197a57fe5b14611988576119876132d3565b5b60006119926122b0565b1115611a6857600160048111156119a557fe5b8160048111156119b157fe5b14156119cd576119c76119c26122b0565b610ae7565b50611a67565b6004808111156119d957fe5b8160048111156119e557fe5b1415611a00576119fb6119f66122b0565b611a8e565b611a66565b60026004811115611a0d57fe5b816004811115611a1957fe5b1415611a3457611a2f611a2a6122b0565b612605565b611a65565b60036004811115611a4157fe5b816004811115611a4d57fe5b1415611a6457611a63611a5e6122b0565b6116a6565b5b5b5b5b5b80601060146101000a81548160ff02191690836004811115611a8657fe5b021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611aed929190615563565b602060405180830381600087803b158015611b0757600080fd5b505af1158015611b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b3f9190810190614a72565b11611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906158db565b60405180910390fd5b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c3b612a3a565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b611d88600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611e17600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611e8b611e2261296d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611f1a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b565b611f24611bf8565b611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906157fb565b60405180910390fd5b80600f8190555050565b6000806000806000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611ff2919061552d565b60006040518083038186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506120479190810190614991565b945094509450945050600080905080851115612061578490505b8084111561206d578390505b80831115612079578290505b80821115612085578190505b60008090508582141561209b57600290506120cd565b848214156120ac57600490506120cc565b838214156120bd57600390506120cb565b828214156120ca57600190505b5b5b5b80965050505050505090565b600061219c6120e6612a3a565b8461219785604051806060016040528060258152602001615d5e6025913960016000612110612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b612a42565b6001905092915050565b6000806121b16115f4565b9050600081111561228b57612288670de0b6b3a764000061227a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061226b9190810190614a72565b84612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b8091505090565b60006122a661229f612a3a565b8484612c0d565b6001905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161230d9190615548565b60206040518083038186803b15801561232557600080fd5b505afa158015612339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061235d9190810190614a72565b905090565b600160066000828254019250508190555060006006549050600082116123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906158bb565b60405180910390fd5b6123c5612ef2565b60088190555061241a333084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c3909392919063ffffffff16565b6000809050600060085414156124395782905082600881905550612465565b61246260085461245460025486612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b61246d612ef2565b60088190555061247d3382613565565b5060065481146124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99061591b565b60405180910390fd5b5050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125239190615548565b60206040518083038186803b15801561253b57600080fd5b505afa15801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125739190810190614a72565b905090565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040161266291906159c4565b602060405180830381600087803b15801561267c57600080fd5b505af1158015612690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b49190810190614a72565b146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb9061575b565b60405180910390fd5b50565b6126ff611bf8565b61273e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612735906157fb565b60405180910390fd5b612747816136ed565b50565b600080612755610e1e565b9050600081111561280e57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b81526004016127bb9190615548565b60206040518083038186803b1580156127d357600080fd5b505afa1580156127e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061280b9190810190614a72565b90505b8091505090565b61281d611bf8565b61285c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612853906157fb565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129689190810190614878565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156129d757600080fd5b505afa1580156129eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a0f9190810190614878565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa99061589b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b199061573b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c0091906159c4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c749061585b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906156db565b60405180910390fd5b612d5881604051806060016040528060268152602001615d10602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612deb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e8a91906159c4565b60405180910390a3505050565b6000838311158290612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed691906156b9565b60405180910390fd5b5060008385039050809150509392505050565b6000612f60612eff61381d565b612f52612f0a6138cf565b612f44612f15613981565b612f36612f20613a71565b612f28613b3c565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b905090565b600080831415612f785760009050612fcf565b6000828402905082848281612f8957fe5b0414612fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc1906157bb565b60405180910390fd5b809150505b92915050565b600061301783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c28565b905092915050565b600061306183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e97565b905092915050565b6002600481111561307657fe5b601060149054906101000a900460ff16600481111561309157fe5b14156130a1576130a081613c89565b5b600360048111156130ae57fe5b601060149054906101000a900460ff1660048111156130c957fe5b141561312357806130d86124c6565b1015613119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131109061587b565b60405180910390fd5b61312281613d2f565b5b6001600481111561313057fe5b601060149054906101000a900460ff16600481111561314b57fe5b14156131a5578061315a61142d565b101561319b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131929061587b565b60405180910390fd5b6131a481613dbf565b5b6004808111156131b157fe5b601060149054906101000a900460ff1660048111156131cc57fe5b14156131dc576131db81613ff9565b5b50565b613279838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b84846040516024016132179291906155ec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b505050565b6000808284019050838110156132c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c09061577b565b60405180910390fd5b8091505092915050565b60006132dd614211565b905060008111156132f2576132f1816142c3565b5b6132fa613981565b9050600081111561330f5761330e81613dbf565b5b6133176143b5565b9050600081111561332c5761332b81614467565b5b6133346138cf565b905060008111156133495761334881613d2f565b5b50565b60008114806133e5575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161339392919061558c565b60206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133e39190810190614a72565b145b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061593b565b60405180910390fd5b6134be838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b848460405160240161345c9291906155ec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b505050565b61355f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016134fd939291906155b5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cc9061597b565b60405180910390fd5b6135ea8160025461327e90919063ffffffff16565b600281905550613641816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136e191906159c4565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561375d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137549061571b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161387a9190615548565b60206040518083038186803b15801561389257600080fd5b505afa1580156138a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138ca9190810190614a72565b905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161392c9190615548565b60206040518083038186803b15801561394457600080fd5b505afa158015613958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061397c9190810190614a72565b905090565b600061398b6146ec565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b8152600401613a1592919061599b565b604080518083038186803b158015613a2c57600080fd5b505afa158015613a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613a649190810190614a20565b9050806020015191505090565b600080613a7c610e1e565b90506000811115613b3557600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401613ae29190615548565b60206040518083038186803b158015613afa57600080fd5b505afa158015613b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b329190810190614a72565b90505b8091505090565b600080613b476115f4565b90506000811115613c2157613c1e670de0b6b3a7640000613c10600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bc957600080fd5b505afa158015613bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c019190810190614a72565b84612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b8091505090565b60008083118290613c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6691906156b9565b60405180910390fd5b506000838581613c7b57fe5b049050809150509392505050565b6000613c936115f4565b90506000613c9f6121a6565b905082811015613ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdb9061587b565b60405180910390fd5b6000613d1e6001613d1084613d028888612f6590919063ffffffff16565b612fd590919063ffffffff16565b61327e90919063ffffffff16565b9050613d29816142c3565b50505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401613d8a91906159c4565b600060405180830381600087803b158015613da457600080fd5b505af1158015613db8573d6000803e3d6000fd5b5050505050565b60606001604051908082528060200260200182016040528015613dfc57816020015b613de96145a6565b815260200190600190039081613de15790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110613e3857fe5b6020026020010181905250613e4b6145d6565b6040518060800160405280600015158152602001600080811115613e6b57fe5b8152602001600080811115613e7c57fe5b8152602001848152509050613e8f614614565b600181600001906001811115613ea157fe5b90816001811115613eae57fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015613f4757816020015b613f34614680565b815260200190600190039081613f2c5790505b5090508181600081518110613f5857fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401613fc092919061564c565b600060405180830381600087803b158015613fda57600080fd5b505af1158015613fee573d6000803e3d6000fd5b505050505050505050565b6000614003610e1e565b9050600061400f61274a565b905082811015614054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404b9061587b565b60405180910390fd5b600061408e6001614080846140728888612f6590919063ffffffff16565b612fd590919063ffffffff16565b61327e90919063ffffffff16565b905061409981614467565b50505050565b6140be8273ffffffffffffffffffffffffffffffffffffffff1661455b565b6140fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f49061595b565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516141269190615516565b6000604051808303816000865af19150503d8060008114614163576040519150601f19603f3d011682016040523d82523d6000602084013e614168565b606091505b5091509150816141ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141a49061579b565b60405180910390fd5b60008151111561420b57808060200190516141cb9190810190614968565b61420a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614201906158fb565b60405180910390fd5b5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161426e9190615548565b60206040518083038186803b15801561428657600080fd5b505afa15801561429a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142be9190810190614a72565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b815260040161432091906159c4565b602060405180830381600087803b15801561433a57600080fd5b505af115801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506143729190810190614a72565b146143b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143a9906156fb565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016144129190615548565b60206040518083038186803b15801561442a57600080fd5b505afa15801561443e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144629190810190614a72565b905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b81526004016144c6929190615563565b602060405180830381600087803b1580156144e057600080fd5b505af11580156144f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506145189190810190614a72565b11614558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454f906157db565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561459d5750808214155b92505050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b60405180608001604052806000151581526020016000808111156145f657fe5b815260200160008081111561460757fe5b8152602001600081525090565b6040518061010001604052806000600181111561462d57fe5b815260200160008152602001614641614708565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561469957fe5b8152602001600081526020016146ad614708565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b604051806080016040528060001515815260200160008081111561472857fe5b815260200160008081111561473957fe5b8152602001600081525090565b60008135905061475581615cca565b92915050565b60008151905061476a81615cca565b92915050565b60008151905061477f81615ce1565b92915050565b600082601f83011261479657600080fd5b81516147a96147a482615a27565b6159fa565b915080825260208301602083018583830111156147c557600080fd5b6147d0838284615c52565b50505092915050565b6000604082840312156147eb57600080fd5b6147f560406159fa565b9050600061480584828501614770565b60008301525060206148198482850161483a565b60208301525092915050565b60008135905061483481615cf8565b92915050565b60008151905061484981615cf8565b92915050565b60006020828403121561486157600080fd5b600061486f84828501614746565b91505092915050565b60006020828403121561488a57600080fd5b60006148988482850161475b565b91505092915050565b600080604083850312156148b457600080fd5b60006148c285828601614746565b92505060206148d385828601614746565b9150509250929050565b6000806000606084860312156148f257600080fd5b600061490086828701614746565b935050602061491186828701614746565b925050604061492286828701614825565b9150509250925092565b6000806040838503121561493f57600080fd5b600061494d85828601614746565b925050602061495e85828601614825565b9150509250929050565b60006020828403121561497a57600080fd5b600061498884828501614770565b91505092915050565b600080600080600060a086880312156149a957600080fd5b600086015167ffffffffffffffff8111156149c357600080fd5b6149cf88828901614785565b95505060206149e08882890161483a565b94505060406149f18882890161483a565b9350506060614a028882890161483a565b9250506080614a138882890161483a565b9150509295509295909350565b600060408284031215614a3257600080fd5b6000614a40848285016147d9565b91505092915050565b600060208284031215614a5b57600080fd5b6000614a6984828501614825565b91505092915050565b600060208284031215614a8457600080fd5b6000614a928482850161483a565b91505092915050565b6000614aa78383615383565b905092915050565b6000614abb838361548b565b60408301905092915050565b614ad081615bc2565b82525050565b614adf81615b13565b82525050565b614aee81615b13565b82525050565b6000614aff82615a73565b614b098185615ac4565b935083602082028501614b1b85615a53565b8060005b85811015614b575784840389528151614b388582614a9b565b9450614b4383615aaa565b925060208a01995050600181019050614b1f565b50829750879550505050505092915050565b6000614b7482615a7e565b614b7e8185615ad5565b9350614b8983615a63565b8060005b83811015614bba578151614ba18882614aaf565b9750614bac83615ab7565b925050600181019050614b8d565b5085935050505092915050565b614bd081615b25565b82525050565b614bdf81615b25565b82525050565b6000614bf082615a94565b614bfa8185615af7565b9350614c0a818560208601615c52565b80840191505092915050565b6000614c2182615a89565b614c2b8185615ae6565b9350614c3b818560208601615c52565b614c4481615c85565b840191505092915050565b614c5881615bd4565b82525050565b614c6781615be6565b82525050565b614c7681615bf8565b82525050565b614c8581615c0a565b82525050565b614c9481615c1c565b82525050565b6000614ca582615a9f565b614caf8185615b02565b9350614cbf818560208601615c52565b614cc881615c85565b840191505092915050565b6000614ce0602383615b02565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d46601983615b02565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614d86602683615b02565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614dec602283615b02565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e52601783615b02565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614e92601b83615b02565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614ed2602083615b02565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000614f12602183615b02565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f78601883615b02565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000614fb8602083615b02565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614ff8601483615b02565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000615038601f83615b02565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b6000615078602583615b02565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150de601283615b02565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061511e602483615b02565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615184601e83615b02565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006151c4601683615b02565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615204602a83615b02565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061526a601f83615b02565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006152aa603683615b02565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000615310601f83615b02565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000615350601f83615b02565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b60006101608301600083015161539c6000860182614c4f565b5060208301516153af60208601826154e9565b5060408301516153c26040860182615436565b5060608301516153d560c08601826154e9565b5060808301516153e860e08601826154e9565b5060a08301516153fc610100860182614ad6565b5060c08301516154106101208601826154e9565b5060e08301518482036101408601526154298282614c16565b9150508091505092915050565b60808201600082015161544c6000850182614bc7565b50602082015161545f6020850182614c5e565b5060408201516154726040850182614c6d565b50606082015161548560608501826154e9565b50505050565b6040820160008201516154a16000850182614ad6565b5060208201516154b460208501826154e9565b50505050565b6040820160008201516154d06000850182614ad6565b5060208201516154e360208501826154e9565b50505050565b6154f281615bab565b82525050565b61550181615bab565b82525050565b61551081615bb5565b82525050565b60006155228284614be5565b915081905092915050565b60006020820190506155426000830184614ae5565b92915050565b600060208201905061555d6000830184614ac7565b92915050565b60006040820190506155786000830185614ac7565b61558560208301846154f8565b9392505050565b60006040820190506155a16000830185614ae5565b6155ae6020830184614ae5565b9392505050565b60006060820190506155ca6000830186614ae5565b6155d76020830185614ae5565b6155e460408301846154f8565b949350505050565b60006040820190506156016000830185614ae5565b61560e60208301846154f8565b9392505050565b600060608201905061562a6000830186614ae5565b61563760208301856154f8565b6156446040830184614c8b565b949350505050565b600060408201905081810360008301526156668185614b69565b9050818103602083015261567a8184614af4565b90509392505050565b60006020820190506156986000830184614bd6565b92915050565b60006020820190506156b36000830184614c7c565b92915050565b600060208201905081810360008301526156d38184614c9a565b905092915050565b600060208201905081810360008301526156f481614cd3565b9050919050565b6000602082019050818103600083015261571481614d39565b9050919050565b6000602082019050818103600083015261573481614d79565b9050919050565b6000602082019050818103600083015261575481614ddf565b9050919050565b6000602082019050818103600083015261577481614e45565b9050919050565b6000602082019050818103600083015261579481614e85565b9050919050565b600060208201905081810360008301526157b481614ec5565b9050919050565b600060208201905081810360008301526157d481614f05565b9050919050565b600060208201905081810360008301526157f481614f6b565b9050919050565b6000602082019050818103600083015261581481614fab565b9050919050565b6000602082019050818103600083015261583481614feb565b9050919050565b600060208201905081810360008301526158548161502b565b9050919050565b600060208201905081810360008301526158748161506b565b9050919050565b60006020820190508181036000830152615894816150d1565b9050919050565b600060208201905081810360008301526158b481615111565b9050919050565b600060208201905081810360008301526158d481615177565b9050919050565b600060208201905081810360008301526158f4816151b7565b9050919050565b60006020820190508181036000830152615914816151f7565b9050919050565b600060208201905081810360008301526159348161525d565b9050919050565b600060208201905081810360008301526159548161529d565b9050919050565b6000602082019050818103600083015261597481615303565b9050919050565b6000602082019050818103600083015261599481615343565b9050919050565b60006060820190506159b060008301856154ba565b6159bd60408301846154f8565b9392505050565b60006020820190506159d960008301846154f8565b92915050565b60006020820190506159f46000830184615507565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615a1d57600080fd5b8060405250919050565b600067ffffffffffffffff821115615a3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615b1e82615b8b565b9050919050565b60008115159050919050565b6000819050615b3f82615c96565b919050565b6000819050615b5282615ca3565b919050565b6000819050615b6582615cb0565b919050565b6000819050615b7882615cbd565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615bcd82615c2e565b9050919050565b6000615bdf82615b31565b9050919050565b6000615bf182615b44565b9050919050565b6000615c0382615b57565b9050919050565b6000615c1582615b6a565b9050919050565b6000615c2782615b7d565b9050919050565b6000615c3982615c40565b9050919050565b6000615c4b82615b8b565b9050919050565b60005b83811015615c70578082015181840152602081019050615c55565b83811115615c7f576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615ca057fe5b50565b60018110615cad57fe5b50565b60018110615cba57fe5b50565b60058110615cc757fe5b50565b615cd381615b13565b8114615cde57600080fd5b50565b615cea81615b25565b8114615cf557600080fd5b50565b615d0181615bab565b8114615d0c57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a7231582055bee44e7aa14c2d3237d301b8e87c361a89b41feac67dd19c5b0edffcf81f246c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063819faf7b1161015a578063b6b55f25116100c1578063f5a41dea1161007a578063f5a41dea146109e7578063f5ff191614610a12578063f69e204614610a3b578063f7c1ec7714610a66578063f82ce27d14610a91578063fc0c546a14610abc57610293565b8063b6b55f25146108d9578063cf8ca42614610902578063d9d7858a1461092d578063dd62ed3e14610958578063e849d65914610995578063f2fde38b146109be57610293565b80639ff011b9116101135780639ff011b9146107b5578063a160176d146107de578063a457c2d714610809578063a728797114610846578063a9059cbb14610871578063b69ef8a8146108ae57610293565b8063819faf7b146106c75780638da5cb5b146106f25780638e4ec6ef1461071d5780638f32d59b1461074857806395d89b411461077357806399b71d5c1461079e57610293565b806339c0a7e1116101fe57806370a08231116101b757806370a08231146105dd5780637137ef991461061a578063715018a61461064557806377c7b8fc1461065c5780637d7c2a1c146106875780638124955c1461069e57610293565b806339c0a7e1146104df578063463574731461050a57806357ded9c91461053357806358782c211461055e57806361c1ec551461058957806365aab749146105b457610293565b806316f0115b1161025057806316f0115b146103bb57806318160ddd146103e657806323b872dd146104115780632e1a7d4d1461044e578063313ce5671461047757806339509351146104a257610293565b806306636c1c1461029557806306a3fe59146102d257806306fdde03146102fd578063085d488314610328578063095ea7b3146103535780630eb2a26714610390575b005b3480156102a157600080fd5b506102bc60048036036102b79190810190614a49565b610ae7565b6040516102c991906159c4565b60405180910390f35b3480156102de57600080fd5b506102e7610d25565b6040516102f4919061552d565b60405180910390f35b34801561030957600080fd5b50610312610d4b565b60405161031f91906156b9565b60405180910390f35b34801561033457600080fd5b5061033d610ded565b60405161034a919061569e565b60405180910390f35b34801561035f57600080fd5b5061037a6004803603610375919081019061492c565b610e00565b6040516103879190615683565b60405180910390f35b34801561039c57600080fd5b506103a5610e1e565b6040516103b291906159c4565b60405180910390f35b3480156103c757600080fd5b506103d0610ed0565b6040516103dd91906159c4565b60405180910390f35b3480156103f257600080fd5b506103fb610ed6565b60405161040891906159c4565b60405180910390f35b34801561041d57600080fd5b50610438600480360361043391908101906148dd565b610ee0565b6040516104459190615683565b60405180910390f35b34801561045a57600080fd5b5061047560048036036104709190810190614a49565b610fb9565b005b34801561048357600080fd5b5061048c611363565b60405161049991906159df565b60405180910390f35b3480156104ae57600080fd5b506104c960048036036104c4919081019061492c565b61137a565b6040516104d69190615683565b60405180910390f35b3480156104eb57600080fd5b506104f461142d565b60405161050191906159c4565b60405180910390f35b34801561051657600080fd5b50610531600480360361052c919081019061484f565b61151d565b005b34801561053f57600080fd5b506105486115a8565b604051610555919061552d565b60405180910390f35b34801561056a57600080fd5b506105736115ce565b604051610580919061552d565b60405180910390f35b34801561059557600080fd5b5061059e6115f4565b6040516105ab91906159c4565b60405180910390f35b3480156105c057600080fd5b506105db60048036036105d69190810190614a49565b6116a6565b005b3480156105e957600080fd5b5061060460048036036105ff919081019061484f565b611742565b60405161061191906159c4565b60405180910390f35b34801561062657600080fd5b5061062f61178a565b60405161063c91906159c4565b60405180910390f35b34801561065157600080fd5b5061065a6117fd565b005b34801561066857600080fd5b50610671611905565b60405161067e91906159c4565b60405180910390f35b34801561069357600080fd5b5061069c611947565b005b3480156106aa57600080fd5b506106c560048036036106c09190810190614a49565b611a8e565b005b3480156106d357600080fd5b506106dc611b82565b6040516106e9919061552d565b60405180910390f35b3480156106fe57600080fd5b50610707611ba8565b604051610714919061552d565b60405180910390f35b34801561072957600080fd5b50610732611bd2565b60405161073f919061552d565b60405180910390f35b34801561075457600080fd5b5061075d611bf8565b60405161076a9190615683565b60405180910390f35b34801561077f57600080fd5b50610788611c57565b60405161079591906156b9565b60405180910390f35b3480156107aa57600080fd5b506107b3611cf9565b005b3480156107c157600080fd5b506107dc60048036036107d79190810190614a49565b611f1c565b005b3480156107ea57600080fd5b506107f3611f6d565b604051610800919061569e565b60405180910390f35b34801561081557600080fd5b50610830600480360361082b919081019061492c565b6120d9565b60405161083d9190615683565b60405180910390f35b34801561085257600080fd5b5061085b6121a6565b60405161086891906159c4565b60405180910390f35b34801561087d57600080fd5b506108986004803603610893919081019061492c565b612292565b6040516108a59190615683565b60405180910390f35b3480156108ba57600080fd5b506108c36122b0565b6040516108d091906159c4565b60405180910390f35b3480156108e557600080fd5b5061090060048036036108fb9190810190614a49565b612362565b005b34801561090e57600080fd5b506109176124c6565b60405161092491906159c4565b60405180910390f35b34801561093957600080fd5b50610942612578565b60405161094f91906159c4565b60405180910390f35b34801561096457600080fd5b5061097f600480360361097a91908101906148a1565b61257e565b60405161098c91906159c4565b60405180910390f35b3480156109a157600080fd5b506109bc60048036036109b79190810190614a49565b612605565b005b3480156109ca57600080fd5b506109e560048036036109e0919081019061484f565b6126f7565b005b3480156109f357600080fd5b506109fc61274a565b604051610a0991906159c4565b60405180910390f35b348015610a1e57600080fd5b50610a396004803603610a34919081019061484f565b612815565b005b348015610a4757600080fd5b50610a506128a0565b604051610a5d919061552d565b60405180910390f35b348015610a7257600080fd5b50610a7b6128c6565b604051610a88919061552d565b60405180910390f35b348015610a9d57600080fd5b50610aa661296d565b604051610ab3919061552d565b60405180910390f35b348015610ac857600080fd5b50610ad1612a14565b604051610ade919061552d565b60405180910390f35b600060606001604051908082528060200260200182016040528015610b2657816020015b610b136145a6565b815260200190600190039081610b0b5790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110610b6257fe5b6020026020010181905250610b756145d6565b6040518060800160405280600115158152602001600080811115610b9557fe5b8152602001600080811115610ba657fe5b8152602001858152509050610bb9614614565b600081600001906001811115610bcb57fe5b90816001811115610bd857fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015610c7157816020015b610c5e614680565b815260200190600190039081610c565790505b5090508181600081518110610c8257fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401610cea92919061564c565b600060405180830381600087803b158015610d0457600080fd5b505af1158015610d18573d6000803e3d6000fd5b5050505050505050919050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610de35780601f10610db857610100808354040283529160200191610de3565b820191906000526020600020905b815481529060010190602001808311610dc657829003601f168201915b5050505050905090565b601060149054906101000a900460ff1681565b6000610e14610e0d612a3a565b8484612a42565b6001905092915050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e7b9190615548565b60206040518083038186803b158015610e9357600080fd5b505afa158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610ecb9190810190614a72565b905090565b60085481565b6000600254905090565b6000610eed848484612c0d565b610fae84610ef9612a3a565b610fa985604051806060016040528060288152602001615d3660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610f5f612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b612a42565b600190509392505050565b60016006600082825401925050819055506000600654905060008211611014576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100b9061583b565b60405180910390fd5b600061101f33611742565b905080831115611064576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105b9061581b565b60405180910390fd5b61106c612ef2565b600881905550600061109d60025461108f86600854612f6590919063ffffffff16565b612fd590919063ffffffff16565b9050611127846040518060400160405280601d81526020017f72656465656d20616d6f756e7420657863656564732062616c616e63650000008152506000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061117e8460025461301f90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516111e291906159c4565b60405180910390a36000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112479190615548565b60206040518083038186803b15801561125f57600080fd5b505afa158015611273573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506112979190810190614a72565b9050818110156112bd576112bc6112b7828461301f90919063ffffffff16565b613069565b5b61130a3383600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131df9092919063ffffffff16565b611312612ef2565b600881905550505050600654811461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113569061591b565b60405180910390fd5b5050565b6000600560009054906101000a900460ff16905090565b6000611423611387612a3a565b8461141e8560016000611398612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b612a42565b6001905092915050565b60006114376146ec565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b81526004016114c192919061599b565b604080518083038186803b1580156114d857600080fd5b505afa1580156114ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506115109190810190614a20565b9050806020015191505090565b611525611bf8565b611564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155b906157fb565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116519190615548565b60206040518083038186803b15801561166957600080fd5b505afa15801561167d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506116a19190810190614a72565b905090565b6116ae6128c6565b73ffffffffffffffffffffffffffffffffffffffff1663d2d0e066600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168360006040518463ffffffff1660e01b815260040161170d93929190615615565b600060405180830381600087803b15801561172757600080fd5b505af115801561173b573d6000803e3d6000fd5b5050505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006117f86117976122b0565b6117ea6117a26124c6565b6117dc6117ad61142d565b6117ce6117b861274a565b6117c06121a6565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b905090565b611805611bf8565b611844576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183b906157fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008061191061178a565b9050611941600254611933670de0b6b3a764000084612f6590919063ffffffff16565b612fd590919063ffffffff16565b91505090565b6000611951611f6d565b9050601060149054906101000a900460ff16600481111561196e57fe5b81600481111561197a57fe5b14611988576119876132d3565b5b60006119926122b0565b1115611a6857600160048111156119a557fe5b8160048111156119b157fe5b14156119cd576119c76119c26122b0565b610ae7565b50611a67565b6004808111156119d957fe5b8160048111156119e557fe5b1415611a00576119fb6119f66122b0565b611a8e565b611a66565b60026004811115611a0d57fe5b816004811115611a1957fe5b1415611a3457611a2f611a2a6122b0565b612605565b611a65565b60036004811115611a4157fe5b816004811115611a4d57fe5b1415611a6457611a63611a5e6122b0565b6116a6565b5b5b5b5b5b80601060146101000a81548160ff02191690836004811115611a8657fe5b021790555050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1930846040518363ffffffff1660e01b8152600401611aed929190615563565b602060405180830381600087803b158015611b0757600080fd5b505af1158015611b1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b3f9190810190614a72565b11611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906158db565b60405180910390fd5b50565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c3b612a3a565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611cef5780601f10611cc457610100808354040283529160200191611cef565b820191906000526020600020905b815481529060010190602001808311611cd257829003601f168201915b5050505050905090565b611d88600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611e17600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611e8b611e2261296d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b611f1a600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661334c9092919063ffffffff16565b565b611f24611bf8565b611f63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5a906157fb565b60405180910390fd5b80600f8190555050565b6000806000806000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d88be3c0600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401611ff2919061552d565b60006040518083038186803b15801561200a57600080fd5b505afa15801561201e573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506120479190810190614991565b945094509450945050600080905080851115612061578490505b8084111561206d578390505b80831115612079578290505b80821115612085578190505b60008090508582141561209b57600290506120cd565b848214156120ac57600490506120cc565b838214156120bd57600390506120cb565b828214156120ca57600190505b5b5b5b80965050505050505090565b600061219c6120e6612a3a565b8461219785604051806060016040528060258152602001615d5e6025913960016000612110612a3a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b612a42565b6001905092915050565b6000806121b16115f4565b9050600081111561228b57612288670de0b6b3a764000061227a600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061226b9190810190614a72565b84612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b8091505090565b60006122a661229f612a3a565b8484612c0d565b6001905092915050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161230d9190615548565b60206040518083038186803b15801561232557600080fd5b505afa158015612339573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061235d9190810190614a72565b905090565b600160066000828254019250508190555060006006549050600082116123bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b4906158bb565b60405180910390fd5b6123c5612ef2565b60088190555061241a333084600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c3909392919063ffffffff16565b6000809050600060085414156124395782905082600881905550612465565b61246260085461245460025486612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b61246d612ef2565b60088190555061247d3382613565565b5060065481146124c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b99061591b565b60405180910390fd5b5050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016125239190615548565b60206040518083038186803b15801561253b57600080fd5b505afa15801561254f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506125739190810190614a72565b905090565b600f5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0712d68836040518263ffffffff1660e01b815260040161266291906159c4565b602060405180830381600087803b15801561267c57600080fd5b505af1158015612690573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506126b49190810190614a72565b146126f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126eb9061575b565b60405180910390fd5b50565b6126ff611bf8565b61273e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612735906157fb565b60405180910390fd5b612747816136ed565b50565b600080612755610e1e565b9050600081111561280e57600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b81526004016127bb9190615548565b60206040518083038186803b1580156127d357600080fd5b505afa1580156127e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061280b9190810190614a72565b90505b8091505090565b61281d611bf8565b61285c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612853906157fb565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630261bf8b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561293057600080fd5b505afa158015612944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129689190810190614878565b905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ed6ff7606040518163ffffffff1660e01b815260040160206040518083038186803b1580156129d757600080fd5b505afa1580156129eb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a0f9190810190614878565b905090565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa99061589b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b199061573b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612c0091906159c4565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c749061585b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce4906156db565b60405180910390fd5b612d5881604051806060016040528060268152602001615d10602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612e979092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612deb816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e8a91906159c4565b60405180910390a3505050565b6000838311158290612edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed691906156b9565b60405180910390fd5b5060008385039050809150509392505050565b6000612f60612eff61381d565b612f52612f0a6138cf565b612f44612f15613981565b612f36612f20613a71565b612f28613b3c565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b61327e90919063ffffffff16565b905090565b600080831415612f785760009050612fcf565b6000828402905082848281612f8957fe5b0414612fca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc1906157bb565b60405180910390fd5b809150505b92915050565b600061301783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613c28565b905092915050565b600061306183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e97565b905092915050565b6002600481111561307657fe5b601060149054906101000a900460ff16600481111561309157fe5b14156130a1576130a081613c89565b5b600360048111156130ae57fe5b601060149054906101000a900460ff1660048111156130c957fe5b141561312357806130d86124c6565b1015613119576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131109061587b565b60405180910390fd5b61312281613d2f565b5b6001600481111561313057fe5b601060149054906101000a900460ff16600481111561314b57fe5b14156131a5578061315a61142d565b101561319b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131929061587b565b60405180910390fd5b6131a481613dbf565b5b6004808111156131b157fe5b601060149054906101000a900460ff1660048111156131cc57fe5b14156131dc576131db81613ff9565b5b50565b613279838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb905060e01b84846040516024016132179291906155ec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b505050565b6000808284019050838110156132c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132c09061577b565b60405180910390fd5b8091505092915050565b60006132dd614211565b905060008111156132f2576132f1816142c3565b5b6132fa613981565b9050600081111561330f5761330e81613dbf565b5b6133176143b5565b9050600081111561332c5761332b81614467565b5b6133346138cf565b905060008111156133495761334881613d2f565b5b50565b60008114806133e5575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161339392919061558c565b60206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133e39190810190614a72565b145b613424576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341b9061593b565b60405180910390fd5b6134be838473ffffffffffffffffffffffffffffffffffffffff1663095ea7b3905060e01b848460405160240161345c9291906155ec565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b505050565b61355f848573ffffffffffffffffffffffffffffffffffffffff166323b872dd905060e01b8585856040516024016134fd939291906155b5565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505061409f565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156135d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135cc9061597b565b60405180910390fd5b6135ea8160025461327e90919063ffffffff16565b600281905550613641816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461327e90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516136e191906159c4565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561375d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137549061571b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161387a9190615548565b60206040518083038186803b15801561389257600080fd5b505afa1580156138a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138ca9190810190614a72565b905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161392c9190615548565b60206040518083038186803b15801561394457600080fd5b505afa158015613958573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061397c9190810190614a72565b905090565b600061398b6146ec565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c190c2ec60405180604001604052803073ffffffffffffffffffffffffffffffffffffffff1681526020016000815250600f546040518363ffffffff1660e01b8152600401613a1592919061599b565b604080518083038186803b158015613a2c57600080fd5b505afa158015613a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613a649190810190614a20565b9050806020015191505090565b600080613a7c610e1e565b90506000811115613b3557600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306b3efd6306040518263ffffffff1660e01b8152600401613ae29190615548565b60206040518083038186803b158015613afa57600080fd5b505afa158015613b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613b329190810190614a72565b90505b8091505090565b600080613b476115f4565b90506000811115613c2157613c1e670de0b6b3a7640000613c10600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015613bc957600080fd5b505afa158015613bdd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613c019190810190614a72565b84612f6590919063ffffffff16565b612fd590919063ffffffff16565b90505b8091505090565b60008083118290613c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c6691906156b9565b60405180910390fd5b506000838581613c7b57fe5b049050809150509392505050565b6000613c936115f4565b90506000613c9f6121a6565b905082811015613ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cdb9061587b565b60405180910390fd5b6000613d1e6001613d1084613d028888612f6590919063ffffffff16565b612fd590919063ffffffff16565b61327e90919063ffffffff16565b9050613d29816142c3565b50505050565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75826040518263ffffffff1660e01b8152600401613d8a91906159c4565b600060405180830381600087803b158015613da457600080fd5b505af1158015613db8573d6000803e3d6000fd5b5050505050565b60606001604051908082528060200260200182016040528015613dfc57816020015b613de96145a6565b815260200190600190039081613de15790505b50905060405180604001604052803073ffffffffffffffffffffffffffffffffffffffff168152602001600081525081600081518110613e3857fe5b6020026020010181905250613e4b6145d6565b6040518060800160405280600015158152602001600080811115613e6b57fe5b8152602001600080811115613e7c57fe5b8152602001848152509050613e8f614614565b600181600001906001811115613ea157fe5b90816001811115613eae57fe5b815250506000816020018181525050818160400181905250600f54816060018181525050308160a0019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060606001604051908082528060200260200182016040528015613f4757816020015b613f34614680565b815260200190600190039081613f2c5790505b5090508181600081518110613f5857fe5b6020026020010181905250600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a67a6a4585836040518363ffffffff1660e01b8152600401613fc092919061564c565b600060405180830381600087803b158015613fda57600080fd5b505af1158015613fee573d6000803e3d6000fd5b505050505050505050565b6000614003610e1e565b9050600061400f61274a565b905082811015614054576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161404b9061587b565b60405180910390fd5b600061408e6001614080846140728888612f6590919063ffffffff16565b612fd590919063ffffffff16565b61327e90919063ffffffff16565b905061409981614467565b50505050565b6140be8273ffffffffffffffffffffffffffffffffffffffff1661455b565b6140fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140f49061595b565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff16836040516141269190615516565b6000604051808303816000865af19150503d8060008114614163576040519150601f19603f3d011682016040523d82523d6000602084013e614168565b606091505b5091509150816141ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016141a49061579b565b60405180910390fd5b60008151111561420b57808060200190516141cb9190810190614968565b61420a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401614201906158fb565b60405180910390fd5b5b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161426e9190615548565b60206040518083038186803b15801561428657600080fd5b505afa15801561429a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506142be9190810190614a72565b905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663db006a75836040518263ffffffff1660e01b815260040161432091906159c4565b602060405180830381600087803b15801561433a57600080fd5b505af115801561434e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506143729190810190614a72565b146143b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016143a9906156fb565b60405180910390fd5b50565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016144129190615548565b60206040518083038186803b15801561442a57600080fd5b505afa15801561443e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506144629190810190614a72565b905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac30846040518363ffffffff1660e01b81526004016144c6929190615563565b602060405180830381600087803b1580156144e057600080fd5b505af11580156144f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506145189190810190614a72565b11614558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161454f906157db565b60405180910390fd5b50565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91506000801b821415801561459d5750808214155b92505050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b60405180608001604052806000151581526020016000808111156145f657fe5b815260200160008081111561460757fe5b8152602001600081525090565b6040518061010001604052806000600181111561462d57fe5b815260200160008152602001614641614708565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518061010001604052806000600181111561469957fe5b8152602001600081526020016146ad614708565b81526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081525090565b6040518060400160405280600015158152602001600081525090565b604051806080016040528060001515815260200160008081111561472857fe5b815260200160008081111561473957fe5b8152602001600081525090565b60008135905061475581615cca565b92915050565b60008151905061476a81615cca565b92915050565b60008151905061477f81615ce1565b92915050565b600082601f83011261479657600080fd5b81516147a96147a482615a27565b6159fa565b915080825260208301602083018583830111156147c557600080fd5b6147d0838284615c52565b50505092915050565b6000604082840312156147eb57600080fd5b6147f560406159fa565b9050600061480584828501614770565b60008301525060206148198482850161483a565b60208301525092915050565b60008135905061483481615cf8565b92915050565b60008151905061484981615cf8565b92915050565b60006020828403121561486157600080fd5b600061486f84828501614746565b91505092915050565b60006020828403121561488a57600080fd5b60006148988482850161475b565b91505092915050565b600080604083850312156148b457600080fd5b60006148c285828601614746565b92505060206148d385828601614746565b9150509250929050565b6000806000606084860312156148f257600080fd5b600061490086828701614746565b935050602061491186828701614746565b925050604061492286828701614825565b9150509250925092565b6000806040838503121561493f57600080fd5b600061494d85828601614746565b925050602061495e85828601614825565b9150509250929050565b60006020828403121561497a57600080fd5b600061498884828501614770565b91505092915050565b600080600080600060a086880312156149a957600080fd5b600086015167ffffffffffffffff8111156149c357600080fd5b6149cf88828901614785565b95505060206149e08882890161483a565b94505060406149f18882890161483a565b9350506060614a028882890161483a565b9250506080614a138882890161483a565b9150509295509295909350565b600060408284031215614a3257600080fd5b6000614a40848285016147d9565b91505092915050565b600060208284031215614a5b57600080fd5b6000614a6984828501614825565b91505092915050565b600060208284031215614a8457600080fd5b6000614a928482850161483a565b91505092915050565b6000614aa78383615383565b905092915050565b6000614abb838361548b565b60408301905092915050565b614ad081615bc2565b82525050565b614adf81615b13565b82525050565b614aee81615b13565b82525050565b6000614aff82615a73565b614b098185615ac4565b935083602082028501614b1b85615a53565b8060005b85811015614b575784840389528151614b388582614a9b565b9450614b4383615aaa565b925060208a01995050600181019050614b1f565b50829750879550505050505092915050565b6000614b7482615a7e565b614b7e8185615ad5565b9350614b8983615a63565b8060005b83811015614bba578151614ba18882614aaf565b9750614bac83615ab7565b925050600181019050614b8d565b5085935050505092915050565b614bd081615b25565b82525050565b614bdf81615b25565b82525050565b6000614bf082615a94565b614bfa8185615af7565b9350614c0a818560208601615c52565b80840191505092915050565b6000614c2182615a89565b614c2b8185615ae6565b9350614c3b818560208601615c52565b614c4481615c85565b840191505092915050565b614c5881615bd4565b82525050565b614c6781615be6565b82525050565b614c7681615bf8565b82525050565b614c8581615c0a565b82525050565b614c9481615c1c565b82525050565b6000614ca582615a9f565b614caf8185615b02565b9350614cbf818560208601615c52565b614cc881615c85565b840191505092915050565b6000614ce0602383615b02565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d46601983615b02565b91507f434f4d504f554e443a207769746864726177206661696c6564000000000000006000830152602082019050919050565b6000614d86602683615b02565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614dec602283615b02565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614e52601783615b02565b91507f434f4d504f554e443a20737570706c79206661696c65640000000000000000006000830152602082019050919050565b6000614e92601b83615b02565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000614ed2602083615b02565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b6000614f12602183615b02565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f78601883615b02565b91507f46554c4352554d3a207769746864726177206661696c656400000000000000006000830152602082019050919050565b6000614fb8602083615b02565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614ff8601483615b02565b91507f696e73756666696369656e742062616c616e63650000000000000000000000006000830152602082019050919050565b6000615038601f83615b02565b91507f7769746864726177206d7573742062652067726561746572207468616e2030006000830152602082019050919050565b6000615078602583615b02565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006150de601283615b02565b91507f696e73756666696369656e742066756e647300000000000000000000000000006000830152602082019050919050565b600061511e602483615b02565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615184601e83615b02565b91507f6465706f736974206d7573742062652067726561746572207468616e203000006000830152602082019050919050565b60006151c4601683615b02565b91507f46554c4352554d3a20737570706c79206661696c6564000000000000000000006000830152602082019050919050565b6000615204602a83615b02565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b600061526a601f83615b02565b91507f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006000830152602082019050919050565b60006152aa603683615b02565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b6000615310601f83615b02565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000615350601f83615b02565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b60006101608301600083015161539c6000860182614c4f565b5060208301516153af60208601826154e9565b5060408301516153c26040860182615436565b5060608301516153d560c08601826154e9565b5060808301516153e860e08601826154e9565b5060a08301516153fc610100860182614ad6565b5060c08301516154106101208601826154e9565b5060e08301518482036101408601526154298282614c16565b9150508091505092915050565b60808201600082015161544c6000850182614bc7565b50602082015161545f6020850182614c5e565b5060408201516154726040850182614c6d565b50606082015161548560608501826154e9565b50505050565b6040820160008201516154a16000850182614ad6565b5060208201516154b460208501826154e9565b50505050565b6040820160008201516154d06000850182614ad6565b5060208201516154e360208501826154e9565b50505050565b6154f281615bab565b82525050565b61550181615bab565b82525050565b61551081615bb5565b82525050565b60006155228284614be5565b915081905092915050565b60006020820190506155426000830184614ae5565b92915050565b600060208201905061555d6000830184614ac7565b92915050565b60006040820190506155786000830185614ac7565b61558560208301846154f8565b9392505050565b60006040820190506155a16000830185614ae5565b6155ae6020830184614ae5565b9392505050565b60006060820190506155ca6000830186614ae5565b6155d76020830185614ae5565b6155e460408301846154f8565b949350505050565b60006040820190506156016000830185614ae5565b61560e60208301846154f8565b9392505050565b600060608201905061562a6000830186614ae5565b61563760208301856154f8565b6156446040830184614c8b565b949350505050565b600060408201905081810360008301526156668185614b69565b9050818103602083015261567a8184614af4565b90509392505050565b60006020820190506156986000830184614bd6565b92915050565b60006020820190506156b36000830184614c7c565b92915050565b600060208201905081810360008301526156d38184614c9a565b905092915050565b600060208201905081810360008301526156f481614cd3565b9050919050565b6000602082019050818103600083015261571481614d39565b9050919050565b6000602082019050818103600083015261573481614d79565b9050919050565b6000602082019050818103600083015261575481614ddf565b9050919050565b6000602082019050818103600083015261577481614e45565b9050919050565b6000602082019050818103600083015261579481614e85565b9050919050565b600060208201905081810360008301526157b481614ec5565b9050919050565b600060208201905081810360008301526157d481614f05565b9050919050565b600060208201905081810360008301526157f481614f6b565b9050919050565b6000602082019050818103600083015261581481614fab565b9050919050565b6000602082019050818103600083015261583481614feb565b9050919050565b600060208201905081810360008301526158548161502b565b9050919050565b600060208201905081810360008301526158748161506b565b9050919050565b60006020820190508181036000830152615894816150d1565b9050919050565b600060208201905081810360008301526158b481615111565b9050919050565b600060208201905081810360008301526158d481615177565b9050919050565b600060208201905081810360008301526158f4816151b7565b9050919050565b60006020820190508181036000830152615914816151f7565b9050919050565b600060208201905081810360008301526159348161525d565b9050919050565b600060208201905081810360008301526159548161529d565b9050919050565b6000602082019050818103600083015261597481615303565b9050919050565b6000602082019050818103600083015261599481615343565b9050919050565b60006060820190506159b060008301856154ba565b6159bd60408301846154f8565b9392505050565b60006020820190506159d960008301846154f8565b92915050565b60006020820190506159f46000830184615507565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615a1d57600080fd5b8060405250919050565b600067ffffffffffffffff821115615a3e57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000615b1e82615b8b565b9050919050565b60008115159050919050565b6000819050615b3f82615c96565b919050565b6000819050615b5282615ca3565b919050565b6000819050615b6582615cb0565b919050565b6000819050615b7882615cbd565b919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b6000615bcd82615c2e565b9050919050565b6000615bdf82615b31565b9050919050565b6000615bf182615b44565b9050919050565b6000615c0382615b57565b9050919050565b6000615c1582615b6a565b9050919050565b6000615c2782615b7d565b9050919050565b6000615c3982615c40565b9050919050565b6000615c4b82615b8b565b9050919050565b60005b83811015615c70578082015181840152602081019050615c55565b83811115615c7f576000848401525b50505050565b6000601f19601f8301169050919050565b60028110615ca057fe5b50565b60018110615cad57fe5b50565b60018110615cba57fe5b50565b60058110615cc757fe5b50565b615cd381615b13565b8114615cde57600080fd5b50565b615cea81615b25565b8114615cf557600080fd5b50565b615d0181615bab565b8114615d0c57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa365627a7a7231582055bee44e7aa14c2d3237d301b8e87c361a89b41feac67dd19c5b0edffcf81f246c6578706572696d656e74616cf564736f6c634300050c0040

Deployed Bytecode Sourcemap

13652:11974:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17472:579;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17472:579:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13953:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13953:24:0;;;:::i;:::-;;;;;;;;;;;;;;;;5991:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5991:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;14152:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14152:36:0;;;:::i;:::-;;;;;;;;;;;;;;;;3011:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3011:152:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20044:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20044:116:0;;;:::i;:::-;;;;;;;;;;;;;;;;13825:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13825:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;2494:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2494:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;3169:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3169:304:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;15813:899;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15813:899:0;;;;;;;;;;;;;;;;:::i;:::-;;6173:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6173:83:0;;;:::i;:::-;;;;;;;;;;;;;;;;3479:210;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3479:210:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19291:166;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19291:166:0;;;:::i;:::-;;;;;;;;;;;;;;;;14843:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14843:85:0;;;;;;;;;;;;;;;;:::i;:::-;;14032:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14032:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;13902:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13902:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;19461:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19461:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;24241:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24241:96:0;;;;;;;;;;;;;;;;:::i;:::-;;2591:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2591:110:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25246:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25246:217:0;;;:::i;:::-;;;;;;;;;;;;;;;;1769:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1769:140:0;;;:::i;:::-;;25469:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25469:154:0;;;:::i;:::-;;;;;;;;;;;;;;;;23173:543;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23173:543:0;;;:::i;:::-;;24341:141;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24341:141:0;;;;;;;;;;;;;;;;:::i;:::-;;13929:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13929:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;1472:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1472:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;13982:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13982:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;1669:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1669:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;6080:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6080:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;18893:279;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18893:279:0;;;:::i;:::-;;15041:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15041:97:0;;;;;;;;;;;;;;;;:::i;:::-;;16760:706;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16760:706:0;;;:::i;:::-;;;;;;;;;;;;;;;;3695:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3695:261:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19585:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19585:248:0;;;:::i;:::-;;;;;;;;;;;;;;;;2707:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2707:158:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19178:107;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19178:107:0;;;:::i;:::-;;;;;;;;;;;;;;;;15191:550;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15191:550:0;;;;;;;;;;;;;;;;:::i;:::-;;20164:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20164:115:0;;;:::i;:::-;;;;;;;;;;;;;;;;14006:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14006:21:0;;;:::i;:::-;;;;;;;;;;;;;;;;2871:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2871:134:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24486:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24486:131:0;;;;;;;;;;;;;;;;:::i;:::-;;1915:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1915:109:0;;;;;;;;;;;;;;;;:::i;:::-;;19837:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19837:203:0;;;:::i;:::-;;;;;;;;;;;;;;;;14932:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14932:105:0;;;;;;;;;;;;;;;;:::i;:::-;;13874:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13874:23:0;;;:::i;:::-;;;;;;;;;;;;;;;;18635:120;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18635:120:0;;;:::i;:::-;;;;;;;;;;;;;;;;18759:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18759:128:0;;;:::i;:::-;;;;;;;;;;;;;;;;13849:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13849:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;17472:579;17523:4;17538:19;17571:1;17560:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17538:35;;17593:22;;;;;;;;17606:4;17593:22;;;;;;17613:1;17593:22;;;17582:5;17588:1;17582:8;;;;;;;;;;;;;:33;;;;17626:22;;:::i;:::-;17651:70;;;;;;;;17663:4;17651:70;;;;;;17669:21;17651:70;;;;;;;;;;;;17692:20;17651:70;;;;;;;;;;;;17714:6;17651:70;;;17626:95;;17730:21;;:::i;:::-;17777:18;17760:3;:14;;:35;;;;;;;;;;;;;;;;;;;;;;;17820:1;17804:3;:13;;:17;;;;;17843:3;17830;:10;;:16;;;;17877:6;;17855:3;:19;;:28;;;;;17919:4;17892:3;:16;;:32;;;;;;;;;;;17935:24;17979:1;17962:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;17935:46;;18000:3;17990:4;17995:1;17990:7;;;;;;;;;;;;;:13;;;;18019:4;;;;;;;;;;;18014:18;;;18033:5;18040:4;18014:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18014:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18014:31:0;;;;17472:579;;;;;;;:::o;13953:24::-;;;;;;;;;;;;;:::o;5991:83::-;6028:13;6061:5;6054:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5991:83;:::o;14152:36::-;;;;;;;;;;;;;:::o;3011:152::-;3077:4;3094:39;3103:12;:10;:12::i;:::-;3117:7;3126:6;3094:8;:39::i;:::-;3151:4;3144:11;;3011:152;;;;:::o;20044:116::-;20091:7;20121;;;;;;;;;;;20114:25;;;20148:4;20114:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20114:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20114:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20114:40:0;;;;;;;;;20107:47;;20044:116;:::o;13825:19::-;;;;:::o;2494:91::-;2538:7;2565:12;;2558:19;;2494:91;:::o;3169:304::-;3258:4;3275:36;3285:6;3293:9;3304:6;3275:9;:36::i;:::-;3322:121;3331:6;3339:12;:10;:12::i;:::-;3353:89;3391:6;3353:89;;;;;;;;;;;;;;;;;:11;:19;3365:6;3353:19;;;;;;;;;;;;;;;:33;3373:12;:10;:12::i;:::-;3353:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;3322:8;:121::i;:::-;3461:4;3454:11;;3169:304;;;;;:::o;15813:899::-;6453:1;6436:13;;:18;;;;;;;;;;;6465:20;6488:13;;6465:36;;15914:1;15904:7;:11;15896:55;;;;;;;;;;;;;;;;;;;;;;15962:16;15981:21;15991:10;15981:9;:21::i;:::-;15962:40;;16030:8;16019:7;:19;;16011:52;;;;;;;;;;;;;;;;;;;;;;16126:23;:21;:23::i;:::-;16119:4;:30;;;;16208:9;16220:37;16244:12;;16221:17;16230:7;16221:4;;:8;;:17;;;;:::i;:::-;16220:23;;:37;;;;:::i;:::-;16208:49;;16294:67;16320:7;16294:67;;;;;;;;;;;;;;;;;:9;:21;16304:10;16294:21;;;;;;;;;;;;;;;;:25;;:67;;;;;:::i;:::-;16270:9;:21;16280:10;16270:21;;;;;;;;;;;;;;;:91;;;;16385:25;16402:7;16385:12;;:16;;:25;;;;:::i;:::-;16370:12;:40;;;;16455:1;16426:41;;16435:10;16426:41;;;16459:7;16426:41;;;;;;;;;;;;;;;16502:9;16521:5;;;;;;;;;;;16514:23;;;16546:4;16514:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16514:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16514:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16514:38:0;;;;;;;;;16502:50;;16569:1;16565;:5;16561:55;;;16583:23;16597:8;16603:1;16597;:5;;:8;;;;:::i;:::-;16583:13;:23::i;:::-;16561:55;16626:41;16653:10;16665:1;16633:5;;;;;;;;;;;16626:26;;;;:41;;;;;:::i;:::-;16683:23;:21;:23::i;:::-;16676:4;:30;;;;6512:1;;;6548:13;;6532:12;:29;6524:73;;;;;;;;;;;;;;;;;;;;;;15813:899;;:::o;6173:83::-;6214:5;6239:9;;;;;;;;;;;6232:16;;6173:83;:::o;3479:210::-;3559:4;3576:83;3585:12;:10;:12::i;:::-;3599:7;3608:50;3647:10;3608:11;:25;3620:12;:10;:12::i;:::-;3608:25;;;;;;;;;;;;;;;:34;3634:7;3608:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;3576:8;:83::i;:::-;3677:4;3670:11;;3479:210;;;;:::o;19291:166::-;19335:7;19353:14;;:::i;:::-;19375:4;;;;;;;;;;;19370:24;;;19395:22;;;;;;;;19408:4;19395:22;;;;;;19415:1;19395:22;;;19419:6;;19370:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19370:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19370:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19370:56:0;;;;;;;;;19353:73;;19442:3;:9;;;19435:16;;;19291:166;:::o;14843:85::-;1597:9;:7;:9::i;:::-;1589:54;;;;;;;;;;;;;;;;;;;;;;14914:8;14908:3;;:14;;;;;;;;;;;;;;;;;;14843:85;:::o;14032:18::-;;;;;;;;;;;;;:::o;13902:22::-;;;;;;;;;;;;;:::o;19461:120::-;19509:7;19541:8;;;;;;;;;;;19534:26;;;19569:4;19534:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19534:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19534:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19534:41:0;;;;;;;;;19527:48;;19461:120;:::o;24241:96::-;24295:9;:7;:9::i;:::-;24290:23;;;24314:5;;;;;;;;;;;24321:6;24329:1;24290:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24290:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24290:41:0;;;;24241:96;:::o;2591:110::-;2648:7;2675:9;:18;2685:7;2675:18;;;;;;;;;;;;;;;;2668:25;;2591:110;;;:::o;25246:217::-;25299:4;25319:138;25447:9;:7;:9::i;:::-;25319:115;25420:13;:11;:13::i;:::-;25319:88;25393:13;:11;:13::i;:::-;25319:61;25356:23;:21;:23::i;:::-;25319:24;:22;:24::i;:::-;:36;;:61;;;;:::i;:::-;:73;;:88;;;;:::i;:::-;:100;;:115;;;;:::i;:::-;:127;;:138;;;;:::i;:::-;25312:145;;25246:217;:::o;1769:140::-;1597:9;:7;:9::i;:::-;1589:54;;;;;;;;;;;;;;;;;;;;;;1868:1;1831:40;;1852:6;;;;;;;;;;;1831:40;;;;;;;;;;;;1899:1;1882:6;;:19;;;;;;;;;;;;;;;;;;1769:140::o;25469:154::-;25522:4;25535:10;25548:22;:20;:22::i;:::-;25535:35;;25584:33;25604:12;;25584:15;25594:4;25584:5;:9;;:15;;;;:::i;:::-;:19;;:33;;;;:::i;:::-;25577:40;;;25469:154;:::o;23173:543::-;23208:18;23229:11;:9;:11::i;:::-;23208:32;;23268:8;;;;;;;;;;;23253:23;;;;;;;;:11;:23;;;;;;;;;23249:60;;23287:14;:12;:14::i;:::-;23249:60;23333:1;23321:9;:7;:9::i;:::-;:13;23317:363;;;23364:11;23349:26;;;;;;;;:11;:26;;;;;;;;;23345:328;;;23388:21;23399:9;:7;:9::i;:::-;23388:10;:21::i;:::-;;23345:328;;;23444:14;23429:29;;;;;;;;:11;:29;;;;;;;;;23425:248;;;23471:24;23485:9;:7;:9::i;:::-;23471:13;:24::i;:::-;23425:248;;;23530:15;23515:30;;;;;;;;:11;:30;;;;;;;;;23511:162;;;23558:25;23573:9;:7;:9::i;:::-;23558:14;:25::i;:::-;23511:162;;;23618:11;23603:26;;;;;;;;:11;:26;;;;;;;;;23599:74;;;23642:21;23653:9;:7;:9::i;:::-;23642:10;:21::i;:::-;23599:74;23511:162;23425:248;23345:328;23317:363;23699:11;23688:8;;:22;;;;;;;;;;;;;;;;;;;;;;;;23173:543;:::o;24341:141::-;24448:1;24409:7;;;;;;;;;;;24401:21;;;24431:4;24438:6;24401:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24401:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24401:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24401:44:0;;;;;;;;;:48;24393:83;;;;;;;;;;;;;;;;;;;;;;24341:141;:::o;13929:19::-;;;;;;;;;;;;;:::o;1472:79::-;1510:7;1537:6;;;;;;;;;;;1530:13;;1472:79;:::o;13982:19::-;;;;;;;;;;;;;:::o;1669:94::-;1709:4;1749:6;;;;;;;;;;;1733:22;;:12;:10;:12::i;:::-;:22;;;1726:29;;1669:94;:::o;6080:87::-;6119:13;6152:7;6145:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6080:87;:::o;18893:279::-;18933:45;18959:8;;;;;;;;;;;18974:2;18940:5;;;;;;;;;;;18933:25;;;;:45;;;;;:::i;:::-;19013:41;19039:4;;;;;;;;;;;19050:2;19020:5;;;;;;;;;;;19013:25;;;;:41;;;;;:::i;:::-;19063:50;19089:13;:11;:13::i;:::-;19109:2;19070:5;;;;;;;;;;;19063:25;;;;:50;;;;;:::i;:::-;19122:44;19148:7;;;;;;;;;;;19162:2;19129:5;;;;;;;;;;;19122:25;;;;:44;;;;;:::i;:::-;18893:279::o;15041:97::-;1597:9;:7;:9::i;:::-;1589:54;;;;;;;;;;;;;;;;;;;;;;15121:11;15112:6;:20;;;;15041:97;:::o;16760:706::-;16802:6;16819:12;16832;16845;16858;16888:3;;;;;;;;;;;16874:28;;;16903:5;;;;;;;;;;;16874:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16874:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16874:35:0;;;;;;39:16:-1;36:1;17:17;2:54;16874:35:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;16874:35:0;;;;;;;;;16817:92;;;;;;;;;16916:11;16930:1;16916:15;;16949:3;16942:4;:10;16938:43;;;16969:4;16963:10;;16938:43;16998:3;16991:4;:10;16987:43;;;17018:4;17012:10;;16987:43;17047:3;17040:4;:10;17036:43;;;17067:4;17061:10;;17036:43;17096:3;17089:4;:10;17085:43;;;17116:4;17110:10;;17085:43;17136:18;17157:11;17136:32;;17186:4;17179:3;:11;17175:261;;;17215:15;17201:29;;17175:261;;;17255:4;17248:3;:11;17244:192;;;17284:14;17270:28;;17244:192;;;17323:4;17316:3;:11;17312:124;;;17352:11;17338:25;;17312:124;;;17388:4;17381:3;:11;17377:59;;;17417:11;17403:25;;17377:59;17312:124;17244:192;17175:261;17449:11;17442:18;;;;;;;;16760:706;:::o;3695:261::-;3780:4;3797:129;3806:12;:10;:12::i;:::-;3820:7;3829:96;3868:15;3829:96;;;;;;;;;;;;;;;;;:11;:25;3841:12;:10;:12::i;:::-;3829:25;;;;;;;;;;;;;;;:34;3855:7;3829:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;3797:8;:129::i;:::-;3944:4;3937:11;;3695:261;;;;:::o;19585:248::-;19640:7;19689:9;19701:17;:15;:17::i;:::-;19689:29;;19733:1;19729;:5;19725:88;;;19749:56;19800:4;19749:46;19764:8;;;;;;;;;;;19755:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19755:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19755:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19755:39:0;;;;;;;;;19749:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;19745:60;;19725:88;19826:1;19819:8;;;19585:248;:::o;2707:158::-;2776:4;2793:42;2803:12;:10;:12::i;:::-;2817:9;2828:6;2793:9;:42::i;:::-;2853:4;2846:11;;2707:158;;;;:::o;19178:107::-;19218:7;19248:5;;;;;;;;;;;19241:23;;;19273:4;19241:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19241:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19241:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19241:38:0;;;;;;;;;19234:45;;19178:107;:::o;15191:550::-;6453:1;6436:13;;:18;;;;;;;;;;;6465:20;6488:13;;6465:36;;15291:1;15281:7;:11;15273:54;;;;;;;;;;;;;;;;;;;;;;15343:23;:21;:23::i;:::-;15336:4;:30;;;;15377:66;15408:10;15428:4;15435:7;15384:5;;;;;;;;;;;15377:30;;;;:66;;;;;;:::i;:::-;15486:14;15503:1;15486:18;;15525:1;15517:4;;:9;15513:150;;;15548:7;15539:16;;15573:7;15566:4;:14;;;;15513:150;;;15616:37;15648:4;;15617:25;15629:12;;15617:7;:11;;:25;;;;:::i;:::-;15616:31;;:37;;;;:::i;:::-;15607:46;;15513:150;15678:23;:21;:23::i;:::-;15671:4;:30;;;;15710:25;15716:10;15728:6;15710:5;:25::i;:::-;6512:1;6548:13;;6532:12;:29;6524:73;;;;;;;;;;;;;;;;;;;;;;15191:550;;:::o;20164:115::-;20208:7;20238:9;;;;;;;;;;;20231:27;;;20267:4;20231:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20231:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20231:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20231:42:0;;;;;;;;;20224:49;;20164:115;:::o;14006:21::-;;;;:::o;2871:134::-;2943:7;2970:11;:18;2982:5;2970:18;;;;;;;;;;;;;;;:27;2989:7;2970:27;;;;;;;;;;;;;;;;2963:34;;2871:134;;;;:::o;24486:131::-;24582:1;24556:8;;;;;;;;;;;24547:23;;;24571:6;24547:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24547:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24547:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24547:31:0;;;;;;;;;:36;24539:72;;;;;;;;;;;;;;;;;;;;;;24486:131;:::o;1915:109::-;1597:9;:7;:9::i;:::-;1589:54;;;;;;;;;;;;;;;;;;;;;;1988:28;2007:8;1988:18;:28::i;:::-;1915:109;:::o;19837:203::-;19891:7;19907:9;19919:16;:14;:16::i;:::-;19907:28;;19950:1;19946;:5;19942:78;;;19974:7;;;;;;;;;;;19966:31;;;20006:4;19966:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19966:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19966:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19966:46:0;;;;;;;;;19962:50;;19942:78;20033:1;20026:8;;;19837:203;:::o;14932:105::-;1597:9;:7;:9::i;:::-;1589:54;;;;;;;;;;;;;;;;;;;;;;15018:13;15007:8;;:24;;;;;;;;;;;;;;;;;;14932:105;:::o;13874:23::-;;;;;;;;;;;;;:::o;18635:120::-;18675:7;18727:4;;;;;;;;;;;18698:49;;;:51;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18698:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18698:51:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18698:51:0;;;;;;;;;18691:58;;18635:120;:::o;18759:128::-;18803:7;18855:4;;;;;;;;;;;18826:53;;;:55;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18826:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18826:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18826:55:0;;;;;;;;;18819:62;;18759:128;:::o;13849:20::-;;;;;;;;;;;;;:::o;852:98::-;897:15;932:10;925:17;;852:98;:::o;5107:338::-;5218:1;5201:19;;:5;:19;;;;5193:68;;;;;;;;;;;;;;;;;;;;;;5299:1;5280:21;;:7;:21;;;;5272:68;;;;;;;;;;;;;;;;;;;;;;5383:6;5353:11;:18;5365:5;5353:18;;;;;;;;;;;;;;;:27;5372:7;5353:27;;;;;;;;;;;;;;;:36;;;;5421:7;5405:32;;5414:5;5405:32;;;5430:6;5405:32;;;;;;;;;;;;;;;5107:338;;;:::o;3962:471::-;4078:1;4060:20;;:6;:20;;;;4052:70;;;;;;;;;;;;;;;;;;;;;;4162:1;4141:23;;:9;:23;;;;4133:71;;;;;;;;;;;;;;;;;;;;;;4237;4259:6;4237:71;;;;;;;;;;;;;;;;;:9;:17;4247:6;4237:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;4217:9;:17;4227:6;4217:17;;;;;;;;;;;;;;;:91;;;;4342:32;4367:6;4342:9;:20;4352:9;4342:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;4319:9;:20;4329:9;4319:20;;;;;;;;;;;;;;;:55;;;;4407:9;4390:35;;4399:6;4390:35;;;4418:6;4390:35;;;;;;;;;;;;;;;3962:471;;;:::o;6965:192::-;7051:7;7084:1;7079;:6;;7087:12;7071:29;;;;;;;;;;;;;;;;;;;;;;;;;7111:9;7127:1;7123;:5;7111:17;;7148:1;7141:8;;;6965:192;;;;;:::o;25015:225::-;25071:4;25091:143;25223:10;:8;:10::i;:::-;25091:119;25195:14;:12;:14::i;:::-;25091:91;25167:14;:12;:14::i;:::-;25091:63;25129:24;:22;:24::i;:::-;25091:25;:23;:25::i;:::-;:37;;:63;;;;:::i;:::-;:75;;:91;;;;:::i;:::-;:103;;:119;;;;:::i;:::-;:131;;:143;;;;:::i;:::-;25084:150;;25015:225;:::o;7163:250::-;7221:7;7250:1;7245;:6;7241:47;;;7275:1;7268:8;;;;7241:47;7300:9;7316:1;7312;:5;7300:17;;7345:1;7340;7336;:5;;;;;;:10;7328:56;;;;;;;;;;;;;;;;;;;;;;7404:1;7397:8;;;7163:250;;;;;:::o;7419:132::-;7477:7;7504:39;7508:1;7511;7504:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;7497:46;;7419:132;;;;:::o;6823:136::-;6881:7;6908:43;6912:1;6915;6908:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6901:50;;6823:136;;;;:::o;22666:501::-;22738:15;22726:27;;;;;;;;:8;;;;;;;;;;;:27;;;;;;;;;22722:80;;;22764:30;22786:7;22764:21;:30::i;:::-;22722:80;22824:11;22812:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;22808:132;;;22871:7;22854:13;:11;:13::i;:::-;:24;;22846:55;;;;;;;;;;;;;;;;;;;;;;22910:22;22924:7;22910:13;:22::i;:::-;22808:132;22962:11;22950:23;;;;;;;;:8;;;;;;;;;;;:23;;;;;;;;;22946:132;;;23009:7;22992:13;:11;:13::i;:::-;:24;;22984:55;;;;;;;;;;;;;;;;;;;;;;23048:22;23062:7;23048:13;:22::i;:::-;22946:132;23100:14;23088:26;;;;;;;;:8;;;;;;;;;;;:26;;;;;;;;;23084:78;;;23125:29;23146:7;23125:20;:29::i;:::-;23084:78;22666:501;:::o;9136:176::-;9219:85;9238:5;9268;:14;;;:23;;;;9293:2;9297:5;9245:58;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9245:58:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9245:58:0;9219:18;:85::i;:::-;9136:176;;;:::o;6636:181::-;6694:7;6714:9;6730:1;6726;:5;6714:17;;6755:1;6750;:6;;6742:46;;;;;;;;;;;;;;;;;;;;;;6808:1;6801:8;;;6636:181;;;;:::o;21413:421::-;21453:14;21470:18;:16;:18::i;:::-;21453:35;;21508:1;21499:6;:10;21495:58;;;21520:25;21538:6;21520:17;:25::i;:::-;21495:58;21568:14;:12;:14::i;:::-;21559:23;;21602:1;21593:6;:10;21589:54;;;21614:21;21628:6;21614:13;:21::i;:::-;21589:54;21658:17;:15;:17::i;:::-;21649:26;;21695:1;21686:6;:10;21682:57;;;21707:24;21724:6;21707:16;:24::i;:::-;21682:57;21754:14;:12;:14::i;:::-;21745:23;;21788:1;21779:6;:10;21775:54;;;21800:21;21814:6;21800:13;:21::i;:::-;21775:54;21413:421;:::o;9532:347::-;9637:1;9628:5;:10;9627:62;;;;9687:1;9644:5;:15;;;9668:4;9675:7;9644:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9644:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9644:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;9644:39:0;;;;;;;;;:44;9627:62;9619:152;;;;;;;;;;;;;;;;;;;;;;9782:89;9801:5;9831;:13;;;:22;;;;9855:7;9864:5;9808:62;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9808:62:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9808:62:0;9782:18;:89::i;:::-;9532:347;;;:::o;9320:204::-;9421:95;9440:5;9470;:18;;;:27;;;;9499:4;9505:2;9509:5;9447:68;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;9447:68:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;9447:68:0;9421:18;:95::i;:::-;9320:204;;;;:::o;4439:308::-;4534:1;4515:21;;:7;:21;;;;4507:65;;;;;;;;;;;;;;;;;;;;;;4600:24;4617:6;4600:12;;:16;;:24;;;;:::i;:::-;4585:12;:39;;;;4656:30;4679:6;4656:9;:18;4666:7;4656:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;4635:9;:18;4645:7;4635:18;;;;;;;;;;;;;;;:51;;;;4723:7;4702:37;;4719:1;4702:37;;;4732:6;4702:37;;;;;;;;;;;;;;;4439:308;;:::o;2030:229::-;2124:1;2104:22;;:8;:22;;;;2096:73;;;;;;;;;;;;;;;;;;;;;;2214:8;2185:38;;2206:6;;;;;;;;;;;2185:38;;;;;;;;;;;;2243:8;2234:6;;:17;;;;;;;;;;;;;;;;;;2030:229;:::o;20285:110::-;20328:7;20358:5;;;;;;;;;;;20351:23;;;20383:4;20351:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20351:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20351:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20351:38:0;;;;;;;;;20344:45;;20285:110;:::o;21289:118::-;21336:7;21366:9;;;;;;;;;;;21359:27;;;21395:4;21359:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21359:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21359:42:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21359:42:0;;;;;;;;;21352:49;;21289:118;:::o;20401:169::-;20448:7;20466:14;;:::i;:::-;20488:4;;;;;;;;;;;20483:24;;;20508:22;;;;;;;;20521:4;20508:22;;;;;;20528:1;20508:22;;;20532:6;;20483:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20483:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20483:56:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20483:56:0;;;;;;;;;20466:73;;20555:3;:9;;;20548:16;;;20401:169;:::o;20956:206::-;21013:7;21029:9;21041:16;:14;:16::i;:::-;21029:28;;21072:1;21068;:5;21064:78;;;21096:7;;;;;;;;;;;21088:31;;;21128:4;21088:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21088:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21088:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21088:46:0;;;;;;;;;21084:50;;21064:78;21155:1;21148:8;;;20956:206;:::o;20701:251::-;20759:7;20808:9;20820:17;:15;:17::i;:::-;20808:29;;20852:1;20848;:5;20844:88;;;20868:56;20919:4;20868:46;20883:8;;;;;;;;;;;20874:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20874:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20874:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20874:39:0;;;;;;;;;20868:1;:5;;:46;;;;:::i;:::-;:50;;:56;;;;:::i;:::-;20864:60;;20844:88;20945:1;20938:8;;;20701:251;:::o;7557:258::-;7643:7;7742:1;7738;:5;7745:12;7730:28;;;;;;;;;;;;;;;;;;;;;;;;;7769:9;7785:1;7781;:5;;;;;;7769:17;;7806:1;7799:8;;;7557:258;;;;;:::o;21840:328::-;21904:9;21916:17;:15;:17::i;:::-;21904:29;;21940:10;21953:24;:22;:24::i;:::-;21940:37;;21998:7;21992:2;:13;;21984:44;;;;;;;;;;;;;;;;;;;;;;22082:14;22099:31;22128:1;22099:24;22120:2;22100:14;22106:7;22100:1;:5;;:14;;;;:::i;:::-;22099:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;22082:48;;22137:25;22155:6;22137:17;:25::i;:::-;21840:328;;;;:::o;24621:92::-;24682:9;;;;;;;;;;;24675:24;;;24700:6;24675:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24675:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24675:32:0;;;;24621:92;:::o;18057:572::-;18114:19;18147:1;18136:13;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18114:35;;18169:22;;;;;;;;18182:4;18169:22;;;;;;18189:1;18169:22;;;18158:5;18164:1;18158:8;;;;;;;;;;;;;:33;;;;18202:22;;:::i;:::-;18227:71;;;;;;;;18239:5;18227:71;;;;;;18246:21;18227:71;;;;;;;;;;;;18269:20;18227:71;;;;;;;;;;;;18291:6;18227:71;;;18202:96;;18307:21;;:::i;:::-;18354:19;18337:3;:14;;:36;;;;;;;;;;;;;;;;;;;;;;;18398:1;18382:3;:13;;:17;;;;;18421:3;18408;:10;;:16;;;;18455:6;;18433:3;:19;;:28;;;;;18497:4;18470:3;:16;;:32;;;;;;;;;;;18513:24;18557:1;18540:19;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;18513:46;;18578:3;18568:4;18573:1;18568:7;;;;;;;;;;;;;:13;;;;18597:4;;;;;;;;;;;18592:18;;;18611:5;18618:4;18592:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18592:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18592:31:0;;;;18057:572;;;;;:::o;22200:460::-;22317:9;22329:16;:14;:16::i;:::-;22317:28;;22411:10;22424:23;:21;:23::i;:::-;22411:36;;22491:7;22485:2;:13;;22477:44;;;;;;;;;;;;;;;;;;;;;;22575:14;22592:31;22621:1;22592:24;22613:2;22593:14;22599:7;22593:1;:5;;:14;;;;:::i;:::-;22592:20;;:24;;;;:::i;:::-;:28;;:31;;;;:::i;:::-;22575:48;;22630:24;22647:6;22630:16;:24::i;:::-;22200:460;;;;:::o;10516:598::-;10604:27;10612:5;10604:25;;;:27::i;:::-;10596:71;;;;;;;;;;;;;;;;;;;;;;10741:12;10755:23;10790:5;10782:19;;10802:4;10782:25;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10740:67:0;;;;10826:7;10818:52;;;;;;;;;;;;;;;;;;;;;;10907:1;10887:10;:17;:21;10883:224;;;11029:10;11018:30;;;;;;;;;;;;;;11010:85;;;;;;;;;;;;;;;;;;;;;;10883:224;10516:598;;;;:::o;20574:123::-;20625:7;20657:8;;;;;;;;;;;20650:26;;;20685:4;20650:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20650:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20650:41:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20650:41:0;;;;;;;;;20643:48;;20574:123;:::o;24869:140::-;24972:1;24944:8;;;;;;;;;;;24935:25;;;24961:6;24935:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24935:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24935:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24935:33:0;;;;;;;;;:38;24927:76;;;;;;;;;;;;;;;;;;;;;;24869:140;:::o;21166:119::-;21216:7;21246;;;;;;;;;;;21239:25;;;21273:4;21239:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21239:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21239:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;21239:40:0;;;;;;;;;21232:47;;21166:119;:::o;24717:148::-;24829:1;24790:7;;;;;;;;;;;24782:21;;;24812:4;24819:6;24782:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24782:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24782:44:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;24782:44:0;;;;;;;;;:48;24774:85;;;;;;;;;;;;;;;;;;;;;;24717:148;:::o;8153:374::-;8213:4;8230:16;8257:19;8279:66;8257:88;;;;8448:7;8436:20;8424:32;;8488:3;8476:15;;:8;:15;;:42;;;;;8507:11;8495:8;:23;;8476:42;8468:51;;;;8153:374;;;:::o;13652:11974::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;283:128;;364:6;358:13;349:22;;376:30;400:5;376:30;;;343:68;;;;;419:444;;532:3;525:4;517:6;513:17;509:27;499:2;;550:1;547;540:12;499:2;580:6;574:13;602:65;617:49;659:6;617:49;;;602:65;;;593:74;;687:6;680:5;673:21;723:4;715:6;711:17;756:4;749:5;745:16;791:3;782:6;777:3;773:16;770:25;767:2;;;808:1;805;798:12;767:2;818:39;850:6;845:3;840;818:39;;;492:371;;;;;;;;896:493;;1017:4;1005:9;1000:3;996:19;992:30;989:2;;;1035:1;1032;1025:12;989:2;1053:20;1068:4;1053:20;;;1044:29;;1123:1;1154:57;1207:3;1198:6;1187:9;1183:22;1154:57;;;1148:3;1141:5;1137:15;1130:82;1083:140;1274:2;1307:60;1363:3;1354:6;1343:9;1339:22;1307:60;;;1300:4;1293:5;1289:16;1282:86;1233:146;983:406;;;;;1396:130;;1476:6;1463:20;1454:29;;1488:33;1515:5;1488:33;;;1448:78;;;;;1533:134;;1617:6;1611:13;1602:22;;1629:33;1656:5;1629:33;;;1596:71;;;;;1674:241;;1778:2;1766:9;1757:7;1753:23;1749:32;1746:2;;;1794:1;1791;1784:12;1746:2;1829:1;1846:53;1891:7;1882:6;1871:9;1867:22;1846:53;;;1836:63;;1808:97;1740:175;;;;;1922:263;;2037:2;2025:9;2016:7;2012:23;2008:32;2005:2;;;2053:1;2050;2043:12;2005:2;2088:1;2105:64;2161:7;2152:6;2141:9;2137:22;2105:64;;;2095:74;;2067:108;1999:186;;;;;2192:366;;;2313:2;2301:9;2292:7;2288:23;2284:32;2281:2;;;2329:1;2326;2319:12;2281:2;2364:1;2381:53;2426:7;2417:6;2406:9;2402:22;2381:53;;;2371:63;;2343:97;2471:2;2489:53;2534:7;2525:6;2514:9;2510:22;2489:53;;;2479:63;;2450:98;2275:283;;;;;;2565:491;;;;2703:2;2691:9;2682:7;2678:23;2674:32;2671:2;;;2719:1;2716;2709:12;2671:2;2754:1;2771:53;2816:7;2807:6;2796:9;2792:22;2771:53;;;2761:63;;2733:97;2861:2;2879:53;2924:7;2915:6;2904:9;2900:22;2879:53;;;2869:63;;2840:98;2969:2;2987:53;3032:7;3023:6;3012:9;3008:22;2987:53;;;2977:63;;2948:98;2665:391;;;;;;3063:366;;;3184:2;3172:9;3163:7;3159:23;3155:32;3152:2;;;3200:1;3197;3190:12;3152:2;3235:1;3252:53;3297:7;3288:6;3277:9;3273:22;3252:53;;;3242:63;;3214:97;3342:2;3360:53;3405:7;3396:6;3385:9;3381:22;3360:53;;;3350:63;;3321:98;3146:283;;;;;;3436:257;;3548:2;3536:9;3527:7;3523:23;3519:32;3516:2;;;3564:1;3561;3554:12;3516:2;3599:1;3616:61;3669:7;3660:6;3649:9;3645:22;3616:61;;;3606:71;;3578:105;3510:183;;;;;3700:908;;;;;;3893:3;3881:9;3872:7;3868:23;3864:33;3861:2;;;3910:1;3907;3900:12;3861:2;3966:1;3955:9;3951:17;3945:24;3989:18;3981:6;3978:30;3975:2;;;4021:1;4018;4011:12;3975:2;4041:74;4107:7;4098:6;4087:9;4083:22;4041:74;;;4031:84;;3924:197;4152:2;4170:64;4226:7;4217:6;4206:9;4202:22;4170:64;;;4160:74;;4131:109;4271:2;4289:64;4345:7;4336:6;4325:9;4321:22;4289:64;;;4279:74;;4250:109;4390:2;4408:64;4464:7;4455:6;4444:9;4440:22;4408:64;;;4398:74;;4369:109;4509:3;4528:64;4584:7;4575:6;4564:9;4560:22;4528:64;;;4518:74;;4488:110;3855:753;;;;;;;;;4615:305;;4751:2;4739:9;4730:7;4726:23;4722:32;4719:2;;;4767:1;4764;4757:12;4719:2;4802:1;4819:85;4896:7;4887:6;4876:9;4872:22;4819:85;;;4809:95;;4781:129;4713:207;;;;;4927:241;;5031:2;5019:9;5010:7;5006:23;5002:32;4999:2;;;5047:1;5044;5037:12;4999:2;5082:1;5099:53;5144:7;5135:6;5124:9;5120:22;5099:53;;;5089:63;;5061:97;4993:175;;;;;5175:263;;5290:2;5278:9;5269:7;5265:23;5261:32;5258:2;;;5306:1;5303;5296:12;5258:2;5341:1;5358:64;5414:7;5405:6;5394:9;5390:22;5358:64;;;5348:74;;5320:108;5252:186;;;;;5446:253;;5595:98;5689:3;5681:6;5595:98;;;5581:112;;5574:125;;;;;5708:249;;5831:86;5913:3;5905:6;5831:86;;;5946:4;5941:3;5937:14;5923:28;;5824:133;;;;;5965:142;6056:45;6095:5;6056:45;;;6051:3;6044:58;6038:69;;;6114:103;6187:24;6205:5;6187:24;;;6182:3;6175:37;6169:48;;;6224:113;6307:24;6325:5;6307:24;;;6302:3;6295:37;6289:48;;;6411:1040;;6604:78;6676:5;6604:78;;;6695:110;6798:6;6793:3;6695:110;;;6688:117;;6828:3;6870:4;6862:6;6858:17;6853:3;6849:27;6897:80;6971:5;6897:80;;;6997:7;7025:1;7010:402;7035:6;7032:1;7029:13;7010:402;;;7097:9;7091:4;7087:20;7082:3;7075:33;7142:6;7136:13;7164:112;7271:4;7256:13;7164:112;;;7156:120;;7293:84;7370:6;7293:84;;;7283:94;;7400:4;7395:3;7391:14;7384:21;;7067:345;7057:1;7054;7050:9;7045:14;;7010:402;;;7014:14;7425:4;7418:11;;7442:3;7435:10;;6583:868;;;;;;;;;;7514:834;;7695:72;7761:5;7695:72;;;7780:104;7877:6;7872:3;7780:104;;;7773:111;;7905:74;7973:5;7905:74;;;7999:7;8027:1;8012:314;8037:6;8034:1;8031:13;8012:314;;;8104:6;8098:13;8125:99;8220:3;8205:13;8125:99;;;8118:106;;8241:78;8312:6;8241:78;;;8231:88;;8069:257;8059:1;8056;8052:9;8047:14;;8012:314;;;8016:14;8339:3;8332:10;;7674:674;;;;;;;;8356:94;8423:21;8438:5;8423:21;;;8418:3;8411:34;8405:45;;;8457:104;8534:21;8549:5;8534:21;;;8529:3;8522:34;8516:45;;;8568:356;;8696:38;8728:5;8696:38;;;8746:88;8827:6;8822:3;8746:88;;;8739:95;;8839:52;8884:6;8879:3;8872:4;8865:5;8861:16;8839:52;;;8912:6;8907:3;8903:16;8896:23;;8676:248;;;;;;8931:315;;9027:34;9055:5;9027:34;;;9073:60;9126:6;9121:3;9073:60;;;9066:67;;9138:52;9183:6;9178:3;9171:4;9164:5;9160:16;9138:52;;;9211:29;9233:6;9211:29;;;9206:3;9202:39;9195:46;;9007:239;;;;;;9253:142;9339:50;9383:5;9339:50;;;9334:3;9327:63;9321:74;;;9402:156;9495:57;9546:5;9495:57;;;9490:3;9483:70;9477:81;;;9565:150;9655:54;9703:5;9655:54;;;9650:3;9643:67;9637:78;;;9722:144;9814:46;9854:5;9814:46;;;9809:3;9802:59;9796:70;;;9873:140;9963:44;10001:5;9963:44;;;9958:3;9951:57;9945:68;;;10020:347;;10132:39;10165:5;10132:39;;;10183:71;10247:6;10242:3;10183:71;;;10176:78;;10259:52;10304:6;10299:3;10292:4;10285:5;10281:16;10259:52;;;10332:29;10354:6;10332:29;;;10327:3;10323:39;10316:46;;10112:255;;;;;;10375:465;;10535:67;10599:2;10594:3;10535:67;;;10528:74;;10635:66;10631:1;10626:3;10622:11;10615:87;10736:66;10731:2;10726:3;10722:12;10715:88;10831:2;10826:3;10822:12;10815:19;;10521:319;;;;10849:364;;11009:67;11073:2;11068:3;11009:67;;;11002:74;;11109:66;11105:1;11100:3;11096:11;11089:87;11204:2;11199:3;11195:12;11188:19;;10995:218;;;;11222:465;;11382:67;11446:2;11441:3;11382:67;;;11375:74;;11482:66;11478:1;11473:3;11469:11;11462:87;11583:66;11578:2;11573:3;11569:12;11562:88;11678:2;11673:3;11669:12;11662:19;;11368:319;;;;11696:465;;11856:67;11920:2;11915:3;11856:67;;;11849:74;;11956:66;11952:1;11947:3;11943:11;11936:87;12057:66;12052:2;12047:3;12043:12;12036:88;12152:2;12147:3;12143:12;12136:19;;11842:319;;;;12170:364;;12330:67;12394:2;12389:3;12330:67;;;12323:74;;12430:66;12426:1;12421:3;12417:11;12410:87;12525:2;12520:3;12516:12;12509:19;;12316:218;;;;12543:364;;12703:67;12767:2;12762:3;12703:67;;;12696:74;;12803:66;12799:1;12794:3;12790:11;12783:87;12898:2;12893:3;12889:12;12882:19;;12689:218;;;;12916:364;;13076:67;13140:2;13135:3;13076:67;;;13069:74;;13176:66;13172:1;13167:3;13163:11;13156:87;13271:2;13266:3;13262:12;13255:19;;13062:218;;;;13289:465;;13449:67;13513:2;13508:3;13449:67;;;13442:74;;13549:66;13545:1;13540:3;13536:11;13529:87;13650:66;13645:2;13640:3;13636:12;13629:88;13745:2;13740:3;13736:12;13729:19;;13435:319;;;;13763:364;;13923:67;13987:2;13982:3;13923:67;;;13916:74;;14023:66;14019:1;14014:3;14010:11;14003:87;14118:2;14113:3;14109:12;14102:19;;13909:218;;;;14136:364;;14296:67;14360:2;14355:3;14296:67;;;14289:74;;14396:66;14392:1;14387:3;14383:11;14376:87;14491:2;14486:3;14482:12;14475:19;;14282:218;;;;14509:364;;14669:67;14733:2;14728:3;14669:67;;;14662:74;;14769:66;14765:1;14760:3;14756:11;14749:87;14864:2;14859:3;14855:12;14848:19;;14655:218;;;;14882:364;;15042:67;15106:2;15101:3;15042:67;;;15035:74;;15142:66;15138:1;15133:3;15129:11;15122:87;15237:2;15232:3;15228:12;15221:19;;15028:218;;;;15255:465;;15415:67;15479:2;15474:3;15415:67;;;15408:74;;15515:66;15511:1;15506:3;15502:11;15495:87;15616:66;15611:2;15606:3;15602:12;15595:88;15711:2;15706:3;15702:12;15695:19;;15401:319;;;;15729:364;;15889:67;15953:2;15948:3;15889:67;;;15882:74;;15989:66;15985:1;15980:3;15976:11;15969:87;16084:2;16079:3;16075:12;16068:19;;15875:218;;;;16102:465;;16262:67;16326:2;16321:3;16262:67;;;16255:74;;16362:66;16358:1;16353:3;16349:11;16342:87;16463:66;16458:2;16453:3;16449:12;16442:88;16558:2;16553:3;16549:12;16542:19;;16248:319;;;;16576:364;;16736:67;16800:2;16795:3;16736:67;;;16729:74;;16836:66;16832:1;16827:3;16823:11;16816:87;16931:2;16926:3;16922:12;16915:19;;16722:218;;;;16949:364;;17109:67;17173:2;17168:3;17109:67;;;17102:74;;17209:66;17205:1;17200:3;17196:11;17189:87;17304:2;17299:3;17295:12;17288:19;;17095:218;;;;17322:465;;17482:67;17546:2;17541:3;17482:67;;;17475:74;;17582:66;17578:1;17573:3;17569:11;17562:87;17683:66;17678:2;17673:3;17669:12;17662:88;17778:2;17773:3;17769:12;17762:19;;17468:319;;;;17796:364;;17956:67;18020:2;18015:3;17956:67;;;17949:74;;18056:66;18052:1;18047:3;18043:11;18036:87;18151:2;18146:3;18142:12;18135:19;;17942:218;;;;18169:465;;18329:67;18393:2;18388:3;18329:67;;;18322:74;;18429:66;18425:1;18420:3;18416:11;18409:87;18530:66;18525:2;18520:3;18516:12;18509:88;18625:2;18620:3;18616:12;18609:19;;18315:319;;;;18643:364;;18803:67;18867:2;18862:3;18803:67;;;18796:74;;18903:66;18899:1;18894:3;18890:11;18883:87;18998:2;18993:3;18989:12;18982:19;;18789:218;;;;19016:364;;19176:67;19240:2;19235:3;19176:67;;;19169:74;;19276:66;19272:1;19267:3;19263:11;19256:87;19371:2;19366:3;19362:12;19355:19;;19162:218;;;;19449:1605;;19592:5;19587:3;19583:15;19682:3;19675:5;19671:15;19665:22;19693:75;19763:3;19758;19754:13;19740:12;19693:75;;;19613:161;19852:4;19845:5;19841:16;19835:23;19864:63;19921:4;19916:3;19912:14;19898:12;19864:63;;;19784:149;20008:4;20001:5;19997:16;19991:23;20020:117;20131:4;20126:3;20122:14;20108:12;20020:117;;;19943:200;20227:4;20220:5;20216:16;20210:23;20239:63;20296:4;20291:3;20287:14;20273:12;20239:63;;;20153:155;20394:4;20387:5;20383:16;20377:23;20406:63;20463:4;20458:3;20454:14;20440:12;20406:63;;;20318:157;20556:4;20549:5;20545:16;20539:23;20568:64;20625:5;20620:3;20616:15;20602:12;20568:64;;;20485:153;20721:4;20714:5;20710:16;20704:23;20733:64;20790:5;20785:3;20781:15;20767:12;20733:64;;;20648:155;20876:4;20869:5;20865:16;20859:23;20929:3;20923:4;20919:14;20911:5;20906:3;20902:15;20895:39;20949:67;21011:4;20997:12;20949:67;;;20941:75;;20813:215;21045:4;21038:11;;19565:1489;;;;;;21124:815;21261:4;21256:3;21252:14;21344:3;21337:5;21333:15;21327:22;21355:56;21406:3;21401;21397:13;21383:12;21355:56;;;21281:136;21498:4;21491:5;21487:16;21481:23;21510:83;21587:4;21582:3;21578:14;21564:12;21510:83;;;21427:172;21671:4;21664:5;21660:16;21654:23;21683:80;21757:4;21752:3;21748:14;21734:12;21683:80;;;21609:160;21843:4;21836:5;21832:16;21826:23;21855:63;21912:4;21907:3;21903:14;21889:12;21855:63;;;21779:145;21234:705;;;;21995:457;22118:4;22113:3;22109:14;22202:3;22195:5;22191:15;22185:22;22213:62;22270:3;22265;22261:13;22247:12;22213:62;;;22138:143;22356:4;22349:5;22345:16;22339:23;22368:63;22425:4;22420:3;22416:14;22402:12;22368:63;;;22291:146;22091:361;;;;22508:467;22641:4;22636:3;22632:14;22725:3;22718:5;22714:15;22708:22;22736:62;22793:3;22788;22784:13;22770:12;22736:62;;;22661:143;22879:4;22872:5;22868:16;22862:23;22891:63;22948:4;22943:3;22939:14;22925:12;22891:63;;;22814:146;22614:361;;;;22982:103;23055:24;23073:5;23055:24;;;23050:3;23043:37;23037:48;;;23092:113;23175:24;23193:5;23175:24;;;23170:3;23163:37;23157:48;;;23212:107;23291:22;23307:5;23291:22;;;23286:3;23279:35;23273:46;;;23326:262;;23470:93;23559:3;23550:6;23470:93;;;23463:100;;23580:3;23573:10;;23451:137;;;;;23595:213;;23713:2;23702:9;23698:18;23690:26;;23727:71;23795:1;23784:9;23780:17;23771:6;23727:71;;;23684:124;;;;;23815:229;;23941:2;23930:9;23926:18;23918:26;;23955:79;24031:1;24020:9;24016:17;24007:6;23955:79;;;23912:132;;;;;24051:340;;24205:2;24194:9;24190:18;24182:26;;24219:79;24295:1;24284:9;24280:17;24271:6;24219:79;;;24309:72;24377:2;24366:9;24362:18;24353:6;24309:72;;;24176:215;;;;;;24398:324;;24544:2;24533:9;24529:18;24521:26;;24558:71;24626:1;24615:9;24611:17;24602:6;24558:71;;;24640:72;24708:2;24697:9;24693:18;24684:6;24640:72;;;24515:207;;;;;;24729:435;;24903:2;24892:9;24888:18;24880:26;;24917:71;24985:1;24974:9;24970:17;24961:6;24917:71;;;24999:72;25067:2;25056:9;25052:18;25043:6;24999:72;;;25082;25150:2;25139:9;25135:18;25126:6;25082:72;;;24874:290;;;;;;;25171:324;;25317:2;25306:9;25302:18;25294:26;;25331:71;25399:1;25388:9;25384:17;25375:6;25331:71;;;25413:72;25481:2;25470:9;25466:18;25457:6;25413:72;;;25288:207;;;;;;25502:449;;25683:2;25672:9;25668:18;25660:26;;25697:71;25765:1;25754:9;25750:17;25741:6;25697:71;;;25779:72;25847:2;25836:9;25832:18;25823:6;25779:72;;;25862:79;25937:2;25926:9;25922:18;25913:6;25862:79;;;25654:297;;;;;;;25958:788;;26288:2;26277:9;26273:18;26265:26;;26338:9;26332:4;26328:20;26324:1;26313:9;26309:17;26302:47;26363:144;26502:4;26493:6;26363:144;;;26355:152;;26555:9;26549:4;26545:20;26540:2;26529:9;26525:18;26518:48;26580:156;26731:4;26722:6;26580:156;;;26572:164;;26259:487;;;;;;26753:201;;26865:2;26854:9;26850:18;26842:26;;26879:65;26941:1;26930:9;26926:17;26917:6;26879:65;;;26836:118;;;;;26961:231;;27088:2;27077:9;27073:18;27065:26;;27102:80;27179:1;27168:9;27164:17;27155:6;27102:80;;;27059:133;;;;;27199:301;;27337:2;27326:9;27322:18;27314:26;;27387:9;27381:4;27377:20;27373:1;27362:9;27358:17;27351:47;27412:78;27485:4;27476:6;27412:78;;;27404:86;;27308:192;;;;;27507:407;;27698:2;27687:9;27683:18;27675:26;;27748:9;27742:4;27738:20;27734:1;27723:9;27719:17;27712:47;27773:131;27899:4;27773:131;;;27765:139;;27669:245;;;;27921:407;;28112:2;28101:9;28097:18;28089:26;;28162:9;28156:4;28152:20;28148:1;28137:9;28133:17;28126:47;28187:131;28313:4;28187:131;;;28179:139;;28083:245;;;;28335:407;;28526:2;28515:9;28511:18;28503:26;;28576:9;28570:4;28566:20;28562:1;28551:9;28547:17;28540:47;28601:131;28727:4;28601:131;;;28593:139;;28497:245;;;;28749:407;;28940:2;28929:9;28925:18;28917:26;;28990:9;28984:4;28980:20;28976:1;28965:9;28961:17;28954:47;29015:131;29141:4;29015:131;;;29007:139;;28911:245;;;;29163:407;;29354:2;29343:9;29339:18;29331:26;;29404:9;29398:4;29394:20;29390:1;29379:9;29375:17;29368:47;29429:131;29555:4;29429:131;;;29421:139;;29325:245;;;;29577:407;;29768:2;29757:9;29753:18;29745:26;;29818:9;29812:4;29808:20;29804:1;29793:9;29789:17;29782:47;29843:131;29969:4;29843:131;;;29835:139;;29739:245;;;;29991:407;;30182:2;30171:9;30167:18;30159:26;;30232:9;30226:4;30222:20;30218:1;30207:9;30203:17;30196:47;30257:131;30383:4;30257:131;;;30249:139;;30153:245;;;;30405:407;;30596:2;30585:9;30581:18;30573:26;;30646:9;30640:4;30636:20;30632:1;30621:9;30617:17;30610:47;30671:131;30797:4;30671:131;;;30663:139;;30567:245;;;;30819:407;;31010:2;30999:9;30995:18;30987:26;;31060:9;31054:4;31050:20;31046:1;31035:9;31031:17;31024:47;31085:131;31211:4;31085:131;;;31077:139;;30981:245;;;;31233:407;;31424:2;31413:9;31409:18;31401:26;;31474:9;31468:4;31464:20;31460:1;31449:9;31445:17;31438:47;31499:131;31625:4;31499:131;;;31491:139;;31395:245;;;;31647:407;;31838:2;31827:9;31823:18;31815:26;;31888:9;31882:4;31878:20;31874:1;31863:9;31859:17;31852:47;31913:131;32039:4;31913:131;;;31905:139;;31809:245;;;;32061:407;;32252:2;32241:9;32237:18;32229:26;;32302:9;32296:4;32292:20;32288:1;32277:9;32273:17;32266:47;32327:131;32453:4;32327:131;;;32319:139;;32223:245;;;;32475:407;;32666:2;32655:9;32651:18;32643:26;;32716:9;32710:4;32706:20;32702:1;32691:9;32687:17;32680:47;32741:131;32867:4;32741:131;;;32733:139;;32637:245;;;;32889:407;;33080:2;33069:9;33065:18;33057:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33155:131;33281:4;33155:131;;;33147:139;;33051:245;;;;33303:407;;33494:2;33483:9;33479:18;33471:26;;33544:9;33538:4;33534:20;33530:1;33519:9;33515:17;33508:47;33569:131;33695:4;33569:131;;;33561:139;;33465:245;;;;33717:407;;33908:2;33897:9;33893:18;33885:26;;33958:9;33952:4;33948:20;33944:1;33933:9;33929:17;33922:47;33983:131;34109:4;33983:131;;;33975:139;;33879:245;;;;34131:407;;34322:2;34311:9;34307:18;34299:26;;34372:9;34366:4;34362:20;34358:1;34347:9;34343:17;34336:47;34397:131;34523:4;34397:131;;;34389:139;;34293:245;;;;34545:407;;34736:2;34725:9;34721:18;34713:26;;34786:9;34780:4;34776:20;34772:1;34761:9;34757:17;34750:47;34811:131;34937:4;34811:131;;;34803:139;;34707:245;;;;34959:407;;35150:2;35139:9;35135:18;35127:26;;35200:9;35194:4;35190:20;35186:1;35175:9;35171:17;35164:47;35225:131;35351:4;35225:131;;;35217:139;;35121:245;;;;35373:407;;35564:2;35553:9;35549:18;35541:26;;35614:9;35608:4;35604:20;35600:1;35589:9;35585:17;35578:47;35639:131;35765:4;35639:131;;;35631:139;;35535:245;;;;35787:407;;35978:2;35967:9;35963:18;35955:26;;36028:9;36022:4;36018:20;36014:1;36003:9;35999:17;35992:47;36053:131;36179:4;36053:131;;;36045:139;;35949:245;;;;36201:407;;36392:2;36381:9;36377:18;36369:26;;36442:9;36436:4;36432:20;36428:1;36417:9;36413:17;36406:47;36467:131;36593:4;36467:131;;;36459:139;;36363:245;;;;36615:404;;36801:2;36790:9;36786:18;36778:26;;36815:111;36923:1;36912:9;36908:17;36899:6;36815:111;;;36937:72;37005:2;36994:9;36990:18;36981:6;36937:72;;;36772:247;;;;;;37026:213;;37144:2;37133:9;37129:18;37121:26;;37158:71;37226:1;37215:9;37211:17;37202:6;37158:71;;;37115:124;;;;;37246:205;;37360:2;37349:9;37345:18;37337:26;;37374:67;37438:1;37427:9;37423:17;37414:6;37374:67;;;37331:120;;;;;37458:256;;37520:2;37514:9;37504:19;;37558:4;37550:6;37546:17;37657:6;37645:10;37642:22;37621:18;37609:10;37606:34;37603:62;37600:2;;;37678:1;37675;37668:12;37600:2;37698:10;37694:2;37687:22;37498:216;;;;;37721:322;;37865:18;37857:6;37854:30;37851:2;;;37897:1;37894;37887:12;37851:2;37964:4;37960:9;37953:4;37945:6;37941:17;37937:33;37929:41;;38028:4;38022;38018:15;38010:23;;37788:255;;;;38050:175;;38160:3;38152:11;;38198:4;38193:3;38189:14;38181:22;;38146:79;;;;38232:169;;38336:3;38328:11;;38374:4;38369:3;38365:14;38357:22;;38322:79;;;;38408:161;;38541:5;38535:12;38525:22;;38506:63;;;;38576:155;;38703:5;38697:12;38687:22;;38668:63;;;;38738:117;;38827:5;38821:12;38811:22;;38792:63;;;;38862:121;;38955:5;38949:12;38939:22;;38920:63;;;;38990:122;;39084:5;39078:12;39068:22;;39049:63;;;;39119:132;;39241:4;39236:3;39232:14;39224:22;;39218:33;;;;39258:126;;39374:4;39369:3;39365:14;39357:22;;39351:33;;;;39392:202;;39546:6;39541:3;39534:19;39583:4;39578:3;39574:14;39559:29;;39527:67;;;;;39603:196;;39751:6;39746:3;39739:19;39788:4;39783:3;39779:14;39764:29;;39732:67;;;;;39808:152;;39912:6;39907:3;39900:19;39949:4;39944:3;39940:14;39925:29;;39893:67;;;;;39969:144;;40104:3;40089:18;;40082:31;;;;;40122:163;;40237:6;40232:3;40225:19;40274:4;40269:3;40265:14;40250:29;;40218:67;;;;;40293:91;;40355:24;40373:5;40355:24;;;40344:35;;40338:46;;;;40391:85;;40464:5;40457:13;40450:21;40439:32;;40433:43;;;;40483:136;;40560:5;40549:16;;40566:48;40608:5;40566:48;;;40543:76;;;;40626:150;;40710:5;40699:16;;40716:55;40765:5;40716:55;;;40693:83;;;;40783:144;;40864:5;40853:16;;40870:52;40916:5;40870:52;;;40847:80;;;;40934:128;;41007:5;40996:16;;41013:44;41051:5;41013:44;;;40990:72;;;;41069:84;;41141:6;41134:5;41130:18;41119:29;;41113:40;;;;41160:121;;41233:42;41226:5;41222:54;41211:65;;41205:76;;;;41288:72;;41350:5;41339:16;;41333:27;;;;41367:81;;41438:4;41431:5;41427:16;41416:27;;41410:38;;;;41455:129;;41542:37;41573:5;41542:37;;;41529:50;;41523:61;;;;41591:136;;41683:39;41716:5;41683:39;;;41670:52;;41664:63;;;;41734:150;;41833:46;41873:5;41833:46;;;41820:59;;41814:70;;;;41891:144;;41987:43;42024:5;41987:43;;;41974:56;;41968:67;;;;42042:128;;42130:35;42159:5;42130:35;;;42117:48;;42111:59;;;;42177:114;;42263:23;42280:5;42263:23;;;42250:36;;42244:47;;;;42298:121;;42377:37;42408:5;42377:37;;;42364:50;;42358:61;;;;42426:108;;42505:24;42523:5;42505:24;;;42492:37;;42486:48;;;;42542:268;42607:1;42614:101;42628:6;42625:1;42622:13;42614:101;;;42704:1;42699:3;42695:11;42689:18;42685:1;42680:3;42676:11;42669:39;42650:2;42647:1;42643:10;42638:15;;42614:101;;;42730:6;42727:1;42724:13;42721:2;;;42795:1;42786:6;42781:3;42777:16;42770:27;42721:2;42591:219;;;;;42818:97;;42906:2;42902:7;42897:2;42890:5;42886:14;42882:28;42872:38;;42866:49;;;;42923:106;43007:1;43000:5;42997:12;42987:2;;43013:9;42987:2;42981:48;;43036:113;43127:1;43120:5;43117:12;43107:2;;43133:9;43107:2;43101:48;;43156:110;43244:1;43237:5;43234:12;43224:2;;43250:9;43224:2;43218:48;;43273:102;43353:1;43346:5;43343:12;43333:2;;43359:9;43333:2;43327:48;;43382:117;43451:24;43469:5;43451:24;;;43444:5;43441:35;43431:2;;43490:1;43487;43480:12;43431:2;43425:74;;43506:111;43572:21;43587:5;43572:21;;;43565:5;43562:32;43552:2;;43608:1;43605;43598:12;43552:2;43546:71;;43624:117;43693:24;43711:5;43693:24;;;43686:5;43683:35;43673:2;;43732:1;43729;43722:12;43673:2;43667:74;

Swarm Source

bzzr://55bee44e7aa14c2d3237d301b8e87c361a89b41feac67dd19c5b0edffcf81f24

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.