ETH Price: $3,341.03 (-1.08%)
Gas: 7.15 Gwei

Token

Silvertoken (SLVT)
 

Overview

Max Total Supply

1,000,249.55162043 SLVT

Holders

248 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
Binance 10
Balance
10.75932962 SLVT

Value
$0.00
0x85b931a32a0725be14285b66f1a22178c672d69b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Vaulted Silver Ownership. 1 SilverToken = 1 Oz. of fine Silver + Growth from transaction fees. Instant Buy Back at Spot Price.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SilverToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-09-07
*/

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

pragma solidity ^0.4.24;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC20/BasicToken.sol

pragma solidity ^0.4.24;




/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) internal balances;

  uint256 internal totalSupply_;

  /**
  * @dev Total number of tokens in existence
  */
  function totalSupply() public view returns (uint256) {
    return totalSupply_;
  }

  /**
  * @dev Transfer token for a specified address
  * @param _to The address to transfer to.
  * @param _value The amount to be transferred.
  */
  function transfer(address _to, uint256 _value) public returns (bool) {
    require(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the the balance of.
  * @return An uint256 representing the amount owned by the passed address.
  */
  function balanceOf(address _owner) public view returns (uint256) {
    return balances[_owner];
  }

}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.4.24;



/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

// File: openzeppelin-solidity/contracts/token/ERC20/StandardToken.sol

pragma solidity ^0.4.24;




/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @param _from address The address which you want to send tokens from
   * @param _to address The address which you want to transfer to
   * @param _value uint256 the amount of tokens to be transferred
   */
  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  )
    public
    returns (bool)
  {
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _to, _value);
    return true;
  }

  /**
   * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
   * Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   * @param _spender The address which will spend the funds.
   * @param _value The amount of tokens to be spent.
   */
  function approve(address _spender, uint256 _value) public returns (bool) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @dev Function to check the amount of tokens that an owner allowed to a spender.
   * @param _owner address The address which owns the funds.
   * @param _spender address The address which will spend the funds.
   * @return A uint256 specifying the amount of tokens still available for the spender.
   */
  function allowance(
    address _owner,
    address _spender
   )
    public
    view
    returns (uint256)
  {
    return allowed[_owner][_spender];
  }

  /**
   * @dev Increase the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To increment
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    allowed[msg.sender][_spender] = (
      allowed[msg.sender][_spender].add(_addedValue));
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  /**
   * @dev Decrease the amount of tokens that an owner allowed to a spender.
   * approve should be called when allowed[_spender] == 0. To decrement
   * allowed value is better to use this function to avoid 2 calls (and wait until
   * the first transaction is mined)
   * From MonolithDAO Token.sol
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue >= oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.4.24;


/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

// File: contracts/base/MintableToken.sol

pragma solidity ^0.4.24;



/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  modifier hasMintPermission() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    public
    hasMintPermission
    canMint
    returns (bool)
  {
    return _mint(_to, _amount);
  }

   /**
   * @dev Internal Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function _mint(
    address _to,
    uint256 _amount
  ) 
    internal
    returns (bool) 
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() public onlyOwner canMint returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

// File: openzeppelin-solidity/contracts/lifecycle/Destructible.sol

pragma solidity ^0.4.24;



/**
 * @title Destructible
 * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner.
 */
contract Destructible is Ownable {
  /**
   * @dev Transfers the current balance to the owner and terminates the contract.
   */
  function destroy() public onlyOwner {
    selfdestruct(owner);
  }

  function destroyAndSend(address _recipient) public onlyOwner {
    selfdestruct(_recipient);
  }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.4.24;



/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}

// File: openzeppelin-solidity/contracts/token/ERC20/BurnableToken.sol

pragma solidity ^0.4.24;



/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is BasicToken {

  event Burn(address indexed burner, uint256 value);

  /**
   * @dev Burns a specific amount of tokens.
   * @param _value The amount of token to be burned.
   */
  function burn(uint256 _value) public {
    _burn(msg.sender, _value);
  }

  function _burn(address _who, uint256 _value) internal {
    require(_value <= balances[_who]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_who] = balances[_who].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    emit Burn(_who, _value);
    emit Transfer(_who, address(0), _value);
  }
}

// File: openzeppelin-solidity/contracts/token/ERC20/DetailedERC20.sol

pragma solidity ^0.4.24;



/**
 * @title DetailedERC20 token
 * @dev The decimals are only for visualization purposes.
 * All the operations are done using the smallest and indivisible token unit,
 * just as on Ethereum all the operations are done in wei.
 */
contract DetailedERC20 is ERC20 {
  string public name;
  string public symbol;
  uint8 public decimals;

  constructor(string _name, string _symbol, uint8 _decimals) public {
    name = _name;
    symbol = _symbol;
    decimals = _decimals;
  }
}

// File: openzeppelin-solidity/contracts/access/rbac/Roles.sol

pragma solidity ^0.4.24;


/**
 * @title Roles
 * @author Francisco Giordano (@frangio)
 * @dev Library for managing addresses assigned to a Role.
 * See RBAC.sol for example usage.
 */
library Roles {
  struct Role {
    mapping (address => bool) bearer;
  }

  /**
   * @dev give an address access to this role
   */
  function add(Role storage _role, address _addr)
    internal
  {
    _role.bearer[_addr] = true;
  }

  /**
   * @dev remove an address' access to this role
   */
  function remove(Role storage _role, address _addr)
    internal
  {
    _role.bearer[_addr] = false;
  }

  /**
   * @dev check if an address has this role
   * // reverts
   */
  function check(Role storage _role, address _addr)
    internal
    view
  {
    require(has(_role, _addr));
  }

  /**
   * @dev check if an address has this role
   * @return bool
   */
  function has(Role storage _role, address _addr)
    internal
    view
    returns (bool)
  {
    return _role.bearer[_addr];
  }
}

// File: openzeppelin-solidity/contracts/access/rbac/RBAC.sol

pragma solidity ^0.4.24;



/**
 * @title RBAC (Role-Based Access Control)
 * @author Matt Condon (@Shrugs)
 * @dev Stores and provides setters and getters for roles and addresses.
 * Supports unlimited numbers of roles and addresses.
 * See //contracts/mocks/RBACMock.sol for an example of usage.
 * This RBAC method uses strings to key roles. It may be beneficial
 * for you to write your own implementation of this interface using Enums or similar.
 */
contract RBAC {
  using Roles for Roles.Role;

  mapping (string => Roles.Role) private roles;

  event RoleAdded(address indexed operator, string role);
  event RoleRemoved(address indexed operator, string role);

  /**
   * @dev reverts if addr does not have role
   * @param _operator address
   * @param _role the name of the role
   * // reverts
   */
  function checkRole(address _operator, string _role)
    public
    view
  {
    roles[_role].check(_operator);
  }

  /**
   * @dev determine if addr has role
   * @param _operator address
   * @param _role the name of the role
   * @return bool
   */
  function hasRole(address _operator, string _role)
    public
    view
    returns (bool)
  {
    return roles[_role].has(_operator);
  }

  /**
   * @dev add a role to an address
   * @param _operator address
   * @param _role the name of the role
   */
  function addRole(address _operator, string _role)
    internal
  {
    roles[_role].add(_operator);
    emit RoleAdded(_operator, _role);
  }

  /**
   * @dev remove a role from an address
   * @param _operator address
   * @param _role the name of the role
   */
  function removeRole(address _operator, string _role)
    internal
  {
    roles[_role].remove(_operator);
    emit RoleRemoved(_operator, _role);
  }

  /**
   * @dev modifier to scope access to a single role (uses msg.sender as addr)
   * @param _role the name of the role
   * // reverts
   */
  modifier onlyRole(string _role)
  {
    checkRole(msg.sender, _role);
    _;
  }

  /**
   * @dev modifier to scope access to a set of roles (uses msg.sender as addr)
   * @param _roles the names of the roles to scope access to
   * // reverts
   *
   * @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
   *  see: https://github.com/ethereum/solidity/issues/2467
   */
  // modifier onlyRoles(string[] _roles) {
  //     bool hasAnyRole = false;
  //     for (uint8 i = 0; i < _roles.length; i++) {
  //         if (hasRole(msg.sender, _roles[i])) {
  //             hasAnyRole = true;
  //             break;
  //         }
  //     }

  //     require(hasAnyRole);

  //     _;
  // }
}

// File: openzeppelin-solidity/contracts/access/Whitelist.sol

pragma solidity ^0.4.24;




/**
 * @title Whitelist
 * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
 * This simplifies the implementation of "user permissions".
 */
contract Whitelist is Ownable, RBAC {
  string public constant ROLE_WHITELISTED = "whitelist";

  /**
   * @dev Throws if operator is not whitelisted.
   * @param _operator address
   */
  modifier onlyIfWhitelisted(address _operator) {
    checkRole(_operator, ROLE_WHITELISTED);
    _;
  }

  /**
   * @dev add an address to the whitelist
   * @param _operator address
   * @return true if the address was added to the whitelist, false if the address was already in the whitelist
   */
  function addAddressToWhitelist(address _operator)
    public
    onlyOwner
  {
    addRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev getter to determine if address is in whitelist
   */
  function whitelist(address _operator)
    public
    view
    returns (bool)
  {
    return hasRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev add addresses to the whitelist
   * @param _operators addresses
   * @return true if at least one address was added to the whitelist,
   * false if all addresses were already in the whitelist
   */
  function addAddressesToWhitelist(address[] _operators)
    public
    onlyOwner
  {
    for (uint256 i = 0; i < _operators.length; i++) {
      addAddressToWhitelist(_operators[i]);
    }
  }

  /**
   * @dev remove an address from the whitelist
   * @param _operator address
   * @return true if the address was removed from the whitelist,
   * false if the address wasn't in the whitelist in the first place
   */
  function removeAddressFromWhitelist(address _operator)
    public
    onlyOwner
  {
    removeRole(_operator, ROLE_WHITELISTED);
  }

  /**
   * @dev remove addresses from the whitelist
   * @param _operators addresses
   * @return true if at least one address was removed from the whitelist,
   * false if all addresses weren't in the whitelist in the first place
   */
  function removeAddressesFromWhitelist(address[] _operators)
    public
    onlyOwner
  {
    for (uint256 i = 0; i < _operators.length; i++) {
      removeAddressFromWhitelist(_operators[i]);
    }
  }

}

// File: openzeppelin-solidity/contracts/ECRecovery.sol

pragma solidity ^0.4.24;


/**
 * @title Elliptic curve signature operations
 * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
 * TODO Remove this library once solidity supports passing a signature to ecrecover.
 * See https://github.com/ethereum/solidity/issues/864
 */

library ECRecovery {

  /**
   * @dev Recover signer address from a message by using their signature
   * @param _hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
   * @param _sig bytes signature, the signature is generated using web3.eth.sign()
   */
  function recover(bytes32 _hash, bytes _sig)
    internal
    pure
    returns (address)
  {
    bytes32 r;
    bytes32 s;
    uint8 v;

    // Check the signature length
    if (_sig.length != 65) {
      return (address(0));
    }

    // Divide the signature in r, s and v variables
    // ecrecover takes the signature parameters, and the only way to get them
    // currently is to use assembly.
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      r := mload(add(_sig, 32))
      s := mload(add(_sig, 64))
      v := byte(0, mload(add(_sig, 96)))
    }

    // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
    if (v < 27) {
      v += 27;
    }

    // If the version is correct return the signer address
    if (v != 27 && v != 28) {
      return (address(0));
    } else {
      // solium-disable-next-line arg-overflow
      return ecrecover(_hash, v, r, s);
    }
  }

  /**
   * toEthSignedMessageHash
   * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
   * and hash the result
   */
  function toEthSignedMessageHash(bytes32 _hash)
    internal
    pure
    returns (bytes32)
  {
    // 32 is the length in bytes of hash,
    // enforced by the type signature above
    return keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", _hash)
    );
  }
}

// File: contracts/SilverToken.sol

pragma solidity ^0.4.24;








interface ASilverDollar {
  function purchaseWithSilverToken(address, uint256) external returns(bool);
}

contract SilverToken is Destructible, Pausable, MintableToken, BurnableToken, DetailedERC20("Silvertoken", "SLVT", 8), Whitelist {
  using SafeMath for uint256;
  using ECRecovery for bytes32;

  uint256 public transferFee = 10;//1%
  uint256 public transferDiscountFee = 8;//0.8%
  uint256 public redemptionFee = 40;//4%
  uint256 public convertFee = 10;//1%
  address public feeReturnAddress = 0xE34f13B2dadC938f44eCbC38A8dBe94B8bdB2109;
  uint256 public transferFreeAmount;
  uint256 public transferDiscountAmount;
  address public silverDollarAddress;
  address public SLVTReserve = 0x900122447a2Eaeb1655C99A91E20f506D509711B;
  bool    public canPurchase = true;
  bool    public canConvert = true;

  // Internal features

  uint256 internal multiplier;
  uint256 internal percentage = 1000;

  //ce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f
  event TokenRedeemed(address from, uint256 amount);
  //3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617
  event TokenPurchased(address addr, uint256 amount, uint256 tokens);
  //5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52
  event FeeApplied(string name, address addr, uint256 amount);
  event Converted(address indexed sender, uint256 amountSLVT, uint256 amountSLVD, uint256 amountFee);

  modifier purchasable() {
    require(canPurchase == true, "can't purchase");
    _;
  }

  modifier onlySilverDollar() {
    require(msg.sender == silverDollarAddress, "not silverDollar");
    _;
  }
  
  modifier isConvertible() {
    require(canConvert == true, "SLVT conversion disabled");
    _;
  }


  constructor () public {
    multiplier = 10 ** uint256(decimals);
    transferFreeAmount = 2 * multiplier;
    transferDiscountAmount = 500 * multiplier;
    owner = msg.sender;
    super.mint(msg.sender, 1 * 1000 * 1000 * multiplier);
  }

  // Settings begin

  function setTransferFreeAmount(uint256 value) public onlyOwner      { transferFreeAmount = value; }
  function setTransferDiscountAmount(uint256 value) public onlyOwner  { transferDiscountAmount = value; }
  function setRedemptionFee(uint256 value) public onlyOwner           { redemptionFee = value; }
  function setFeeReturnAddress(address value) public onlyOwner        { feeReturnAddress = value; }
  function setCanPurchase(bool value) public onlyOwner                { canPurchase = value; }
  function setSilverDollarAddress(address value) public onlyOwner     { silverDollarAddress = value; }
  function setCanConvert(bool value) public onlyOwner                 { canConvert = value; }
  function setConvertFee(uint256 value) public onlyOwner              { convertFee = value; }


  function increaseTotalSupply(uint256 value) public onlyOwner returns (uint256) {
    super.mint(owner, value);
    return totalSupply_;
  }

  // Settings end

  // ERC20 re-implementation methods begin

  function transfer(address to, uint256 amount) public whenNotPaused returns (bool) {
    uint256 feesPaid = payFees(address(0), to, amount);
    require(super.transfer(to, amount.sub(feesPaid)), "failed transfer");

    return true;
  }

  function transferFrom(address from, address to, uint256 amount) public whenNotPaused returns (bool) {
    uint256 feesPaid = payFees(from, to, amount);
    require(super.transferFrom(from, to, amount.sub(feesPaid)), "failed transferFrom");

    return true;
  }

  // ERC20 re-implementation methods end

  // Silvertoken methods end

  function payFees(address from, address to, uint256 amount) private returns (uint256 fees) {
    if (msg.sender == owner || hasRole(from, ROLE_WHITELISTED) || hasRole(msg.sender, ROLE_WHITELISTED) || hasRole(to, ROLE_WHITELISTED))
        return 0;
    fees = getTransferFee(amount);
    if (from == address(0)) {
      require(super.transfer(feeReturnAddress, fees), "transfer fee payment failed");
    }
    else {
      require(super.transferFrom(from, feeReturnAddress, fees), "transferFrom fee payment failed");
    }
    emit FeeApplied("Transfer", to, fees);
  }

  function getTransferFee(uint256 amount) internal view returns(uint256) {
    if (transferFreeAmount > 0 && amount <= transferFreeAmount) return 0;
    if (transferDiscountAmount > 0 && amount >= transferDiscountAmount) return amount.mul(transferDiscountFee).div(percentage);
    return amount.mul(transferFee).div(percentage);
  }

  function transferTokens(address from, address to, uint256 amount) internal returns (bool) {
    require(balances[from] >= amount, "balance insufficient");

    balances[from] = balances[from].sub(amount);
    balances[to] = balances[to].add(amount);

    emit Transfer(from, to, amount);

    return true;
  }

  function purchase(uint256 tokens, uint256 fee, uint256 timestamp, bytes signature) public payable purchasable whenNotPaused {
    require(
      isSignatureValid(
        msg.sender, msg.value, tokens, fee, timestamp, signature
      ),
      "invalid signature"
    );
    require(tokens > 0, "invalid number of tokens");
    
    emit TokenPurchased(msg.sender, msg.value, tokens);
    transferTokens(owner, msg.sender, tokens);

    feeReturnAddress.transfer(msg.value);
    if (fee > 0) {
      emit FeeApplied("Purchase", msg.sender, fee);
    }       
  }

  function purchasedSilverDollar(uint256 amount) public onlySilverDollar purchasable whenNotPaused returns (bool) {
    require(super._mint(SLVTReserve, amount), "minting of slvT failed");
    
    return true;
  }

  function purchaseWithSilverDollar(address to, uint256 amount) public onlySilverDollar purchasable whenNotPaused returns (bool) {
    require(transferTokens(SLVTReserve, to, amount), "failed transfer of slvT from reserve");

    return true;
  }

  function redeem(uint256 tokens) public whenNotPaused {
    require(tokens > 0, "amount of tokens redeemed must be > 0");

    uint256 fee = tokens.mul(redemptionFee).div(percentage);

    _burn(msg.sender, tokens.sub(fee));
    if (fee > 0) {
      require(super.transfer(feeReturnAddress, fee), "token transfer failed");
      emit FeeApplied("Redeem", msg.sender, fee);
    }
    emit TokenRedeemed(msg.sender, tokens);
  }

  function isSignatureValid(
    address sender, uint256 amount, uint256 tokens, 
    uint256 fee, uint256 timestamp, bytes signature
  ) public view returns (bool) 
  {
    if (block.timestamp > timestamp + 10 minutes) return false;
    bytes32 hash = keccak256(
      abi.encodePacked(
        address(this),
        sender, 
        amount, 
        tokens,
        fee,
        timestamp
      )
    );
    return hash.toEthSignedMessageHash().recover(signature) == owner;
  }

  function isConvertSignatureValid(
    address sender, uint256 amountSLVT, uint256 amountSLVD, 
    uint256 timestamp, bytes signature
  ) public view returns (bool) 
  {
    if (block.timestamp > timestamp + 10 minutes) return false;
    bytes32 hash = keccak256(
      abi.encodePacked(
        address(this),
        sender, 
        amountSLVT, 
        amountSLVD,
        timestamp
      )
    );
    return hash.toEthSignedMessageHash().recover(signature) == owner;
  }

  function convertToSLVD(
    uint256 amountSLVT, uint256 amountSLVD,
    uint256 timestamp, bytes signature
  ) public isConvertible whenNotPaused returns (bool) {
    require(
      isConvertSignatureValid(
        msg.sender, amountSLVT, 
        amountSLVD, timestamp, signature
      ), 
      "convert failed, invalid signature"
    );

    uint256 fees = amountSLVT.mul(convertFee).div(percentage);
    if (whitelist(msg.sender) && Whitelist(silverDollarAddress).whitelist(msg.sender))
      fees = 0;

    super.transfer(SLVTReserve, amountSLVT.sub(fees));
    require(super.transfer(feeReturnAddress, fees), "transfer fee payment failed");
    require(
      ASilverDollar(silverDollarAddress).purchaseWithSilverToken(msg.sender, amountSLVD), 
      "failed purchase of silverdollar with silvertoken"
    );
    
    emit Converted(msg.sender, amountSLVD, amountSLVD, fees);
    return true;
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_WHITELISTED","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"increaseTotalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_role","type":"string"}],"name":"hasRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setCanConvert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"convertFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"redemptionFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"canConvert","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"purchase","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"address"}],"name":"setFeeReturnAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"silverDollarAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"purchaseWithSilverDollar","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferDiscountFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"SLVTReserve","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"purchasedSilverDollar","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"addAddressToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setRedemptionFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setConvertFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setTransferDiscountAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"address"}],"name":"setSilverDollarAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"amountSLVT","type":"uint256"},{"name":"amountSLVD","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"isConvertSignatureValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"}],"name":"setTransferFreeAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"sender","type":"address"},{"name":"amount","type":"uint256"},{"name":"tokens","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"isSignatureValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amountSLVT","type":"uint256"},{"name":"amountSLVD","type":"uint256"},{"name":"timestamp","type":"uint256"},{"name":"signature","type":"bytes"}],"name":"convertToSLVD","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeReturnAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokens","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferDiscountAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferFreeAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operators","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"bool"}],"name":"setCanPurchase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokenRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"tokens","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"FeeApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"amountSLVT","type":"uint256"},{"indexed":false,"name":"amountSLVD","type":"uint256"},{"indexed":false,"name":"amountFee","type":"uint256"}],"name":"Converted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"role","type":"string"}],"name":"RoleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526000600360146101000a81548160ff0219169083151502179055506000600360156101000a81548160ff021916908315150217905550600a60085560086009556028600a55600a600b5573e34f13b2dadc938f44ecbc38a8dbe94b8bdb2109600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073900122447a2eaeb1655c99a91e20f506d509711b601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601060146101000a81548160ff0219169083151502179055506001601060156101000a81548160ff0219169083151502179055506103e86012553480156200014157600080fd5b506040805190810160405280600b81526020017f53696c766572746f6b656e0000000000000000000000000000000000000000008152506040805190810160405280600481526020017f534c565400000000000000000000000000000000000000000000000000000000815250600833600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260049080519060200190620002099291906200052f565b508160059080519060200190620002229291906200052f565b5080600660006101000a81548160ff021916908360ff160217905550505050600660009054906101000a900460ff1660ff16600a0a601181905550601154600202600d819055506011546101f402600e8190555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002de33601154620f424002620002e56401000000000262001b7d176401000000009004565b50620005de565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200034457600080fd5b600360159054906101000a900460ff161515156200036157600080fd5b6200037c838362000384640100000000026401000000009004565b905092915050565b6000620003ab82600154620005126401000000000262005384179091906401000000009004565b60018190555062000412826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620005126401000000000262005384179091906401000000009004565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600081830190508281101515156200052657fe5b80905092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200057257805160ff1916838001178555620005a3565b82800160010185558215620005a3579182015b82811115620005a257825182559160200191906001019062000585565b5b509050620005b29190620005b6565b5090565b620005db91905b80821115620005d7576000816000905550600101620005bd565b5090565b90565b61562180620005ee6000396000f3006080604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146102b957806306fdde03146102e8578063095ea7b3146103785780630988ca8c146103dd57806318160ddd1461046657806318b919e9146104915780631d43cc9814610521578063217fe6c61461056257806323b872dd1461060357806324953eaa14610688578063286dd3f5146106ee5780632b45bfde146107315780632fd1db2514610760578063313ce5671461078b57806334a6d832146107bc5780633f4ba83a146107eb57806340c10f191461080257806342966c6814610867578063458f5815146108945780634b68bb9a146108bf5780634c474434146108ee57806352ae7cd5146109685780635c975abb146109ab578063611d48f2146109da5780636291556414610a3157806364df1a9314610a965780636618846314610ac157806369ae54fc14610b265780636aca22bf14610b7d57806370a0823114610bc2578063715018a614610c195780637b9417c814610c305780637d64bcb414610c735780637dbc1df014610ca257806383197ef014610ccf5780638456cb5914610ce65780638da5cb5b14610cfd57806390caaeaf14610d545780639121d9b514610d8157806395d89b4114610dae5780639b19251a14610e3e578063a9059cbb14610e99578063acb2ad6f14610efe578063b0a8faaa14610f29578063b60c5b2c14610f6c578063bb1f3e3a1461102b578063bd22250914611058578063c405637a14611121578063c7801cc1146111c0578063d73dd62314611217578063db006a751461127c578063dd62ed3e146112a9578063debe16f914611320578063e1ef1ebe1461134b578063e2ec6ec314611376578063f2fde38b146113dc578063f5074f411461141f578063fa398ddd14611462575b600080fd5b3480156102c557600080fd5b506102ce611491565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd6114a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033d578082015181840152602081019050610322565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506103c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b604051808215151515815260200191505060405180910390f35b3480156103e957600080fd5b50610464600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611634565b005b34801561047257600080fd5b5061047b6116b5565b6040518082815260200191505060405180910390f35b34801561049d57600080fd5b506104a66116bf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104e65780820151818401526020810190506104cb565b50505050905090810190601f1680156105135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052d57600080fd5b5061054c600480360381019080803590602001909291905050506116f8565b6040518082815260200191505060405180910390f35b34801561056e57600080fd5b506105e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061178d565b604051808215151515815260200191505060405180910390f35b34801561060f57600080fd5b5061066e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611814565b604051808215151515815260200191505060405180910390f35b34801561069457600080fd5b506106ec600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192905050506118dd565b005b3480156106fa57600080fd5b5061072f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197a565b005b34801561073d57600080fd5b5061075e600480360381019080803515159060200190929190505050611a18565b005b34801561076c57600080fd5b50610775611a91565b6040518082815260200191505060405180910390f35b34801561079757600080fd5b506107a0611a97565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107c857600080fd5b506107d1611aaa565b604051808215151515815260200191505060405180910390f35b3480156107f757600080fd5b50610800611abd565b005b34801561080e57600080fd5b5061084d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7d565b604051808215151515815260200191505060405180910390f35b34801561087357600080fd5b5061089260048036038101908080359060200190929190505050611c09565b005b3480156108a057600080fd5b506108a9611c16565b6040518082815260200191505060405180910390f35b3480156108cb57600080fd5b506108d4611c1c565b604051808215151515815260200191505060405180910390f35b610966600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611c2f565b005b34801561097457600080fd5b506109a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f8e565b005b3480156109b757600080fd5b506109c061202e565b604051808215151515815260200191505060405180910390f35b3480156109e657600080fd5b506109ef612041565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3d57600080fd5b50610a7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612067565b604051808215151515815260200191505060405180910390f35b348015610aa257600080fd5b50610aab6122a6565b6040518082815260200191505060405180910390f35b348015610acd57600080fd5b50610b0c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ac565b604051808215151515815260200191505060405180910390f35b348015610b3257600080fd5b50610b3b61253e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8957600080fd5b50610ba860048036038101908080359060200190929190505050612564565b604051808215151515815260200191505060405180910390f35b348015610bce57600080fd5b50610c03600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061277b565b6040518082815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e6127c3565b005b348015610c3c57600080fd5b50610c71600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c8565b005b348015610c7f57600080fd5b50610c88612966565b604051808215151515815260200191505060405180910390f35b348015610cae57600080fd5b50610ccd60048036038101908080359060200190929190505050612a2e565b005b348015610cdb57600080fd5b50610ce4612a94565b005b348015610cf257600080fd5b50610cfb612b2b565b005b348015610d0957600080fd5b50610d12612bec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6057600080fd5b50610d7f60048036038101908080359060200190929190505050612c12565b005b348015610d8d57600080fd5b50610dac60048036038101908080359060200190929190505050612c78565b005b348015610dba57600080fd5b50610dc3612cde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e03578082015181840152602081019050610de8565b50505050905090810190601f168015610e305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e4a57600080fd5b50610e7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7c565b604051808215151515815260200191505060405180910390f35b348015610ea557600080fd5b50610ee4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dc4565b604051808215151515815260200191505060405180910390f35b348015610f0a57600080fd5b50610f13612e8c565b6040518082815260200191505060405180910390f35b348015610f3557600080fd5b50610f6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e92565b005b348015610f7857600080fd5b50611011600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f32565b604051808215151515815260200191505060405180910390f35b34801561103757600080fd5b50611056600480360381019080803590602001909291905050506130e4565b005b34801561106457600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061314a565b604051808215151515815260200191505060405180910390f35b34801561112d57600080fd5b506111a6600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613305565b604051808215151515815260200191505060405180910390f35b3480156111cc57600080fd5b506111d5613878565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561122357600080fd5b50611262600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061389e565b604051808215151515815260200191505060405180910390f35b34801561128857600080fd5b506112a760048036038101908080359060200190929190505050613a9a565b005b3480156112b557600080fd5b5061130a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d5a565b6040518082815260200191505060405180910390f35b34801561132c57600080fd5b50611335613de1565b6040518082815260200191505060405180910390f35b34801561135757600080fd5b50611360613de7565b6040518082815260200191505060405180910390f35b34801561138257600080fd5b506113da60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613ded565b005b3480156113e857600080fd5b5061141d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e8a565b005b34801561142b57600080fd5b50611460600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ef2565b005b34801561146e57600080fd5b5061148f600480360381019080803515159060200190929190505050613f67565b005b600360159054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153a5780601f1061150f5761010080835404028352916020019161153a565b820191906000526020600020905b81548152906001019060200180831161151d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6116b1826007836040518082805190602001908083835b602083101515611670578051825260208201915060208101905060208303925061164b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613fe090919063ffffffff16565b5050565b6000600154905090565b6040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561175657600080fd5b611782600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611b7d565b506001549050919050565b600061180c836007846040518082805190602001908083835b6020831015156117cb57805182526020820191506020810190506020830392506117a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613ff990919063ffffffff16565b905092915050565b600080600360149054906101000a900460ff1615151561183357600080fd5b61183e858585614052565b905061185d858561185884876143b890919063ffffffff16565b6143d1565b15156118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6661696c6564207472616e7366657246726f6d0000000000000000000000000081525060200191505060405180910390fd5b60019150509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193b57600080fd5b600090505b815181101561197657611969828281518110151561195a57fe5b9060200190602002015161197a565b8080600101915050611940565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d657600080fd5b611a15816040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061478c565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a7457600080fd5b80601060156101000a81548160ff02191690831515021790555050565b600b5481565b600660009054906101000a900460ff1681565b601060149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1957600080fd5b600360149054906101000a900460ff161515611b3457600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bdb57600080fd5b600360159054906101000a900460ff16151515611bf757600080fd5b611c0183836148c0565b905092915050565b611c133382614a2e565b50565b600a5481565b601060159054906101000a900460ff1681565b60011515601060149054906101000a900460ff161515141515611cba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611cd657600080fd5b611ce433348686868661314a565b1515611d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b600084111515611dd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206e756d626572206f6620746f6b656e73000000000000000081525060200191505060405180910390fd5b7f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617333486604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611e70600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614be1565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ed9573d6000803e3d6000fd5b506000831115611f88577f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338460405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5075726368617365000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fea57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360149054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156121d557600080fd5b612202601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484614be1565b151561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f6661696c6564207472616e73666572206f6620736c76542066726f6d2072657381526020017f657276650000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001905092915050565b60095481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831015156123be576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612452565b6123d183826143b890919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561262b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156126d257600080fd5b6126fe601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836148c0565b1515612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d696e74696e67206f6620736c7654206661696c65640000000000000000000081525060200191505060405180910390fd5b60019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561281f57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b612963816040805190810160405280600981526020017f77686974656c6973740000000000000000000000000000000000000000000000815250614e2f565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129c457600080fd5b600360159054906101000a900460ff161515156129e057600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a8a57600080fd5b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612af057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b8757600080fd5b600360149054906101000a900460ff16151515612ba357600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c6e57600080fd5b80600b8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd457600080fd5b80600e8190555050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d745780601f10612d4957610100808354040283529160200191612d74565b820191906000526020600020905b815481529060010190602001808311612d5757829003601f168201915b505050505081565b6000612dbd826040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b9050919050565b600080600360149054906101000a900460ff16151515612de357600080fd5b612def60008585614052565b9050612e0d84612e0883866143b890919063ffffffff16565b614f63565b1515612e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6661696c6564207472616e73666572000000000000000000000000000000000081525060200191505060405180910390fd5b600191505092915050565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612eee57600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806102588401421115612f4a57600091506130da565b3087878787604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401848152602001838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156130355780518252602082019150602081019050602083039250613010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130c0846130ae8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b5095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314057600080fd5b80600d8190555050565b600080610258840142111561316257600091506132fa565b308888888888604051602001808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156132555780518252602082019150602081019050602083039250613230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132e0846132ce8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b509695505050505050565b60008060011515601060159054906101000a900460ff161515141515613393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f534c565420636f6e76657273696f6e2064697361626c6564000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156133af57600080fd5b6133bc3387878787612f32565b1515613456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f636f6e76657274206661696c65642c20696e76616c6964207369676e6174757281526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61347f601254613471600b548961533690919063ffffffff16565b61536e90919063ffffffff16565b905061348a33612d7c565b801561358a5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b19251a336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b81019080805190602001909291905050505b1561359457600090505b6135d2601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135cd83896143b890919063ffffffff16565b614f63565b506135ff600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa8e518e33876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561373857600080fd5b505af115801561374c573d6000803e3d6000fd5b505050506040513d602081101561376257600080fd5b8101908080519060200190929190505050151561380d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f6661696c6564207075726368617365206f662073696c766572646f6c6c61722081526020017f776974682073696c766572746f6b656e0000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe8e327a81bf019d3af2e7baa0c6f3dcb5231127e9a5f3448d9819d7faef21f9d86878460405180848152602001838152602001828152602001935050505060405180910390a26001915050949350505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061392f82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600360149054906101000a900460ff16151515613ab857600080fd5b600082111515613b56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f616d6f756e74206f6620746f6b656e732072656465656d6564206d757374206281526020017f65203e203000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613b7f601254613b71600a548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050613b9d33613b9883856143b890919063ffffffff16565b614a2e565b6000811115613ceb57613bd2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260068152602001807f52656465656d0000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f3383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b600d5481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e4b57600080fd5b600090505b8151811015613e8657613e798282815181101515613e6a57fe5b906020019060200201516128c8565b8080600101915050613e50565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ee657600080fd5b613eef816153a0565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc357600080fd5b80601060146101000a81548160ff02191690831515021790555050565b613fea8282613ff9565b1515613ff557600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806140eb57506140ea846040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141315750614130336040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141775750614176836040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b1561418557600090506143b1565b61418e8261549c565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561426a576141f1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b61430c565b61429784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836143d1565b151561430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7472616e7366657246726f6d20666565207061796d656e74206661696c65640081525060200191505060405180910390fd5b5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52838260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5472616e73666572000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b9392505050565b60008282111515156143c657fe5b818303905092915050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561442057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144ab57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144e757600080fd5b614538826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145cb826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061469c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614809826007836040518082805190602001908083835b6020831015156147c857805182526020820191506020810190506020830392506147a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061553990919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614882578082015181840152602081019050614867565b50505050905090810190601f1680156148af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60006148d78260015461538490919063ffffffff16565b60018190555061492e826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515614a7b57600080fd5b614acc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b23816001546143b890919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515614c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f62616c616e636520696e73756666696369656e7400000000000000000000000081525060200191505060405180910390fd5b614cea826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d7d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614eac826007836040518082805190602001908083835b602083101515614e6b5780518252602082019150602081019050602083039250614e46565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061559790919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614f25578082015181840152602081019050614f0a565b50505050905090810190601f168015614f525780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fb257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fee57600080fd5b61503f826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561520a57805182526020820191506020810190506020830392506151e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b60008060008060418551141515615258576000935061532d565b6020850151925060408501519150606085015160001a9050601b8160ff16101561528357601b810190505b601b8160ff161415801561529b5750601c8160ff1614155b156152a9576000935061532d565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015615320573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b6000808314156153495760009050615368565b818302905081838281151561535a57fe5b0414151561536457fe5b8090505b92915050565b6000818381151561537b57fe5b04905092915050565b6000818301905082811015151561539757fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153dc57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600d541180156154b15750600d548211155b156154bf5760009050615534565b6000600e541180156154d35750600e548210155b15615508576155016012546154f36009548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050615534565b6155316012546155236008548561533690919063ffffffff16565b61536e90919063ffffffff16565b90505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505600a165627a7a723058202b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc480029

Deployed Bytecode

0x6080604052600436106102b4576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305d2035b146102b957806306fdde03146102e8578063095ea7b3146103785780630988ca8c146103dd57806318160ddd1461046657806318b919e9146104915780631d43cc9814610521578063217fe6c61461056257806323b872dd1461060357806324953eaa14610688578063286dd3f5146106ee5780632b45bfde146107315780632fd1db2514610760578063313ce5671461078b57806334a6d832146107bc5780633f4ba83a146107eb57806340c10f191461080257806342966c6814610867578063458f5815146108945780634b68bb9a146108bf5780634c474434146108ee57806352ae7cd5146109685780635c975abb146109ab578063611d48f2146109da5780636291556414610a3157806364df1a9314610a965780636618846314610ac157806369ae54fc14610b265780636aca22bf14610b7d57806370a0823114610bc2578063715018a614610c195780637b9417c814610c305780637d64bcb414610c735780637dbc1df014610ca257806383197ef014610ccf5780638456cb5914610ce65780638da5cb5b14610cfd57806390caaeaf14610d545780639121d9b514610d8157806395d89b4114610dae5780639b19251a14610e3e578063a9059cbb14610e99578063acb2ad6f14610efe578063b0a8faaa14610f29578063b60c5b2c14610f6c578063bb1f3e3a1461102b578063bd22250914611058578063c405637a14611121578063c7801cc1146111c0578063d73dd62314611217578063db006a751461127c578063dd62ed3e146112a9578063debe16f914611320578063e1ef1ebe1461134b578063e2ec6ec314611376578063f2fde38b146113dc578063f5074f411461141f578063fa398ddd14611462575b600080fd5b3480156102c557600080fd5b506102ce611491565b604051808215151515815260200191505060405180910390f35b3480156102f457600080fd5b506102fd6114a4565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033d578082015181840152602081019050610322565b50505050905090810190601f16801561036a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561038457600080fd5b506103c3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611542565b604051808215151515815260200191505060405180910390f35b3480156103e957600080fd5b50610464600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611634565b005b34801561047257600080fd5b5061047b6116b5565b6040518082815260200191505060405180910390f35b34801561049d57600080fd5b506104a66116bf565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156104e65780820151818401526020810190506104cb565b50505050905090810190601f1680156105135780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561052d57600080fd5b5061054c600480360381019080803590602001909291905050506116f8565b6040518082815260200191505060405180910390f35b34801561056e57600080fd5b506105e9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061178d565b604051808215151515815260200191505060405180910390f35b34801561060f57600080fd5b5061066e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611814565b604051808215151515815260200191505060405180910390f35b34801561069457600080fd5b506106ec600480360381019080803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192905050506118dd565b005b3480156106fa57600080fd5b5061072f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061197a565b005b34801561073d57600080fd5b5061075e600480360381019080803515159060200190929190505050611a18565b005b34801561076c57600080fd5b50610775611a91565b6040518082815260200191505060405180910390f35b34801561079757600080fd5b506107a0611a97565b604051808260ff1660ff16815260200191505060405180910390f35b3480156107c857600080fd5b506107d1611aaa565b604051808215151515815260200191505060405180910390f35b3480156107f757600080fd5b50610800611abd565b005b34801561080e57600080fd5b5061084d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b7d565b604051808215151515815260200191505060405180910390f35b34801561087357600080fd5b5061089260048036038101908080359060200190929190505050611c09565b005b3480156108a057600080fd5b506108a9611c16565b6040518082815260200191505060405180910390f35b3480156108cb57600080fd5b506108d4611c1c565b604051808215151515815260200191505060405180910390f35b610966600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050611c2f565b005b34801561097457600080fd5b506109a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f8e565b005b3480156109b757600080fd5b506109c061202e565b604051808215151515815260200191505060405180910390f35b3480156109e657600080fd5b506109ef612041565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610a3d57600080fd5b50610a7c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612067565b604051808215151515815260200191505060405180910390f35b348015610aa257600080fd5b50610aab6122a6565b6040518082815260200191505060405180910390f35b348015610acd57600080fd5b50610b0c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ac565b604051808215151515815260200191505060405180910390f35b348015610b3257600080fd5b50610b3b61253e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b8957600080fd5b50610ba860048036038101908080359060200190929190505050612564565b604051808215151515815260200191505060405180910390f35b348015610bce57600080fd5b50610c03600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061277b565b6040518082815260200191505060405180910390f35b348015610c2557600080fd5b50610c2e6127c3565b005b348015610c3c57600080fd5b50610c71600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506128c8565b005b348015610c7f57600080fd5b50610c88612966565b604051808215151515815260200191505060405180910390f35b348015610cae57600080fd5b50610ccd60048036038101908080359060200190929190505050612a2e565b005b348015610cdb57600080fd5b50610ce4612a94565b005b348015610cf257600080fd5b50610cfb612b2b565b005b348015610d0957600080fd5b50610d12612bec565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610d6057600080fd5b50610d7f60048036038101908080359060200190929190505050612c12565b005b348015610d8d57600080fd5b50610dac60048036038101908080359060200190929190505050612c78565b005b348015610dba57600080fd5b50610dc3612cde565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e03578082015181840152602081019050610de8565b50505050905090810190601f168015610e305780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e4a57600080fd5b50610e7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d7c565b604051808215151515815260200191505060405180910390f35b348015610ea557600080fd5b50610ee4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612dc4565b604051808215151515815260200191505060405180910390f35b348015610f0a57600080fd5b50610f13612e8c565b6040518082815260200191505060405180910390f35b348015610f3557600080fd5b50610f6a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e92565b005b348015610f7857600080fd5b50611011600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050612f32565b604051808215151515815260200191505060405180910390f35b34801561103757600080fd5b50611056600480360381019080803590602001909291905050506130e4565b005b34801561106457600080fd5b50611107600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919291929050505061314a565b604051808215151515815260200191505060405180910390f35b34801561112d57600080fd5b506111a6600480360381019080803590602001909291908035906020019092919080359060200190929190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509192919290505050613305565b604051808215151515815260200191505060405180910390f35b3480156111cc57600080fd5b506111d5613878565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561122357600080fd5b50611262600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061389e565b604051808215151515815260200191505060405180910390f35b34801561128857600080fd5b506112a760048036038101908080359060200190929190505050613a9a565b005b3480156112b557600080fd5b5061130a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d5a565b6040518082815260200191505060405180910390f35b34801561132c57600080fd5b50611335613de1565b6040518082815260200191505060405180910390f35b34801561135757600080fd5b50611360613de7565b6040518082815260200191505060405180910390f35b34801561138257600080fd5b506113da60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050613ded565b005b3480156113e857600080fd5b5061141d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613e8a565b005b34801561142b57600080fd5b50611460600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ef2565b005b34801561146e57600080fd5b5061148f600480360381019080803515159060200190929190505050613f67565b005b600360159054906101000a900460ff1681565b60048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561153a5780601f1061150f5761010080835404028352916020019161153a565b820191906000526020600020905b81548152906001019060200180831161151d57829003601f168201915b505050505081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b6116b1826007836040518082805190602001908083835b602083101515611670578051825260208201915060208101905060208303925061164b565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613fe090919063ffffffff16565b5050565b6000600154905090565b6040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561175657600080fd5b611782600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683611b7d565b506001549050919050565b600061180c836007846040518082805190602001908083835b6020831015156117cb57805182526020820191506020810190506020830392506117a6565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020613ff990919063ffffffff16565b905092915050565b600080600360149054906101000a900460ff1615151561183357600080fd5b61183e858585614052565b905061185d858561185884876143b890919063ffffffff16565b6143d1565b15156118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f6661696c6564207472616e7366657246726f6d0000000000000000000000000081525060200191505060405180910390fd5b60019150509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561193b57600080fd5b600090505b815181101561197657611969828281518110151561195a57fe5b9060200190602002015161197a565b8080600101915050611940565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156119d657600080fd5b611a15816040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061478c565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611a7457600080fd5b80601060156101000a81548160ff02191690831515021790555050565b600b5481565b600660009054906101000a900460ff1681565b601060149054906101000a900460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1957600080fd5b600360149054906101000a900460ff161515611b3457600080fd5b6000600360146101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611bdb57600080fd5b600360159054906101000a900460ff16151515611bf757600080fd5b611c0183836148c0565b905092915050565b611c133382614a2e565b50565b600a5481565b601060159054906101000a900460ff1681565b60011515601060149054906101000a900460ff161515141515611cba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff16151515611cd657600080fd5b611ce433348686868661314a565b1515611d58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f696e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b600084111515611dd0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f696e76616c6964206e756d626572206f6620746f6b656e73000000000000000081525060200191505060405180910390fd5b7f3ceffd410054fdaed44f598ff5c1fb450658778e2241892da4aa646979dee617333486604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a1611e70600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff163386614be1565b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611ed9573d6000803e3d6000fd5b506000831115611f88577f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338460405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5075726368617365000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b50505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fea57600080fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360149054906101000a900460ff1681565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561212e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156121b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156121d557600080fd5b612202601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168484614be1565b151561229c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001807f6661696c6564207472616e73666572206f6620736c76542066726f6d2072657381526020017f657276650000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001905092915050565b60095481565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905080831015156123be576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612452565b6123d183826143b890919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561262b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f6e6f742073696c766572446f6c6c61720000000000000000000000000000000081525060200191505060405180910390fd5b60011515601060149054906101000a900460ff1615151415156126b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f63616e277420707572636861736500000000000000000000000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156126d257600080fd5b6126fe601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836148c0565b1515612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f6d696e74696e67206f6620736c7654206661696c65640000000000000000000081525060200191505060405180910390fd5b60019050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561281f57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561292457600080fd5b612963816040805190810160405280600981526020017f77686974656c6973740000000000000000000000000000000000000000000000815250614e2f565b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156129c457600080fd5b600360159054906101000a900460ff161515156129e057600080fd5b6001600360156101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612a8a57600080fd5b80600a8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612af057600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612b8757600080fd5b600360149054906101000a900460ff16151515612ba357600080fd5b6001600360146101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612c6e57600080fd5b80600b8190555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612cd457600080fd5b80600e8190555050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612d745780601f10612d4957610100808354040283529160200191612d74565b820191906000526020600020905b815481529060010190602001808311612d5757829003601f168201915b505050505081565b6000612dbd826040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b9050919050565b600080600360149054906101000a900460ff16151515612de357600080fd5b612def60008585614052565b9050612e0d84612e0883866143b890919063ffffffff16565b614f63565b1515612e81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f6661696c6564207472616e73666572000000000000000000000000000000000081525060200191505060405180910390fd5b600191505092915050565b60085481565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612eee57600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806102588401421115612f4a57600091506130da565b3087878787604051602001808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401848152602001838152602001828152602001955050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156130355780518252602082019150602081019050602083039250613010565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166130c0846130ae8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b5095945050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561314057600080fd5b80600d8190555050565b600080610258840142111561316257600091506132fa565b308888888888604051602001808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140185815260200184815260200183815260200182815260200196505050505050506040516020818303038152906040526040518082805190602001908083835b6020831015156132555780518252602082019150602081019050602083039250613230565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166132e0846132ce8460001916615183565b6000191661523e90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161491505b509695505050505050565b60008060011515601060159054906101000a900460ff161515141515613393576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f534c565420636f6e76657273696f6e2064697361626c6564000000000000000081525060200191505060405180910390fd5b600360149054906101000a900460ff161515156133af57600080fd5b6133bc3387878787612f32565b1515613456576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f636f6e76657274206661696c65642c20696e76616c6964207369676e6174757281526020017f650000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61347f601254613471600b548961533690919063ffffffff16565b61536e90919063ffffffff16565b905061348a33612d7c565b801561358a5750600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b19251a336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561354e57600080fd5b505af1158015613562573d6000803e3d6000fd5b505050506040513d602081101561357857600080fd5b81019080805190602001909291905050505b1561359457600090505b6135d2601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166135cd83896143b890919063ffffffff16565b614f63565b506135ff600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fa8e518e33876040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561373857600080fd5b505af115801561374c573d6000803e3d6000fd5b505050506040513d602081101561376257600080fd5b8101908080519060200190929190505050151561380d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f6661696c6564207075726368617365206f662073696c766572646f6c6c61722081526020017f776974682073696c766572746f6b656e0000000000000000000000000000000081525060400191505060405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167fe8e327a81bf019d3af2e7baa0c6f3dcb5231127e9a5f3448d9819d7faef21f9d86878460405180848152602001838152602001828152602001935050505060405180910390a26001915050949350505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061392f82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b6000600360149054906101000a900460ff16151515613ab857600080fd5b600082111515613b56576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001807f616d6f756e74206f6620746f6b656e732072656465656d6564206d757374206281526020017f65203e203000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b613b7f601254613b71600a548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050613b9d33613b9883856143b890919063ffffffff16565b614a2e565b6000811115613ceb57613bd2600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515613c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f746f6b656e207472616e73666572206661696c6564000000000000000000000081525060200191505060405180910390fd5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52338260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260068152602001807f52656465656d0000000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b7fce4385affa8ad2cbec45b1660c6f6afcb691bf0a7a73ebda096ee1dfb670fe6f3383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600e5481565b600d5481565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613e4b57600080fd5b600090505b8151811015613e8657613e798282815181101515613e6a57fe5b906020019060200201516128c8565b8080600101915050613e50565b5050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613ee657600080fd5b613eef816153a0565b50565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613f4e57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515613fc357600080fd5b80601060146101000a81548160ff02191690831515021790555050565b613fea8282613ff9565b1515613ff557600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806140eb57506140ea846040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141315750614130336040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b806141775750614176836040805190810160405280600981526020017f77686974656c697374000000000000000000000000000000000000000000000081525061178d565b5b1561418557600090506143b1565b61418e8261549c565b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561426a576141f1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682614f63565b1515614265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f7472616e7366657220666565207061796d656e74206661696c6564000000000081525060200191505060405180910390fd5b61430c565b61429784600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836143d1565b151561430b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7472616e7366657246726f6d20666565207061796d656e74206661696c65640081525060200191505060405180910390fd5b5b7f5a56a31cc0c9ebf5d0626c5189b951fe367d953afc1824a8bb82bf168713cc52838260405180806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825260088152602001807f5472616e73666572000000000000000000000000000000000000000000000000815250602001935050505060405180910390a15b9392505050565b60008282111515156143c657fe5b818303905092915050565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054821115151561442057600080fd5b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482111515156144ab57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141515156144e757600080fd5b614538826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506145cb826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061469c82600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614809826007836040518082805190602001908083835b6020831015156147c857805182526020820191506020810190506020830392506147a3565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061553990919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614882578082015181840152602081019050614867565b50505050905090810190601f1680156148af5780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60006148d78260015461538490919063ffffffff16565b60018190555061492e826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515614a7b57600080fd5b614acc816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614b23816001546143b890919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6000816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515614c99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f62616c616e636520696e73756666696369656e7400000000000000000000000081525060200191505060405180910390fd5b614cea826000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614d7d826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b614eac826007836040518082805190602001908083835b602083101515614e6b5780518252602082019150602081019050602083039250614e46565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061559790919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b700489826040518080602001828103825283818151815260200191508051906020019080838360005b83811015614f25578082015181840152602081019050614f0a565b50505050905090810190601f168015614f525780820380516001836020036101000a031916815260200191505b509250505060405180910390a25050565b60008060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515614fb257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515614fee57600080fd5b61503f826000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546143b890919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150d2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461538490919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c0182600019166000191681526020019150506040516020818303038152906040526040518082805190602001908083835b60208310151561520a57805182526020820191506020810190506020830392506151e5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209050919050565b60008060008060418551141515615258576000935061532d565b6020850151925060408501519150606085015160001a9050601b8160ff16101561528357601b810190505b601b8160ff161415801561529b5750601c8160ff1614155b156152a9576000935061532d565b600186828585604051600081526020016040526040518085600019166000191681526020018460ff1660ff1681526020018360001916600019168152602001826000191660001916815260200194505050505060206040516020810390808403906000865af1158015615320573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b6000808314156153495760009050615368565b818302905081838281151561535a57fe5b0414151561536457fe5b8090505b92915050565b6000818381151561537b57fe5b04905092915050565b6000818301905082811015151561539757fe5b80905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515156153dc57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600d541180156154b15750600d548211155b156154bf5760009050615534565b6000600e541180156154d35750600e548210155b15615508576155016012546154f36009548561533690919063ffffffff16565b61536e90919063ffffffff16565b9050615534565b6155316012546155236008548561533690919063ffffffff16565b61536e90919063ffffffff16565b90505b919050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050505600a165627a7a723058202b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc480029

Deployed Bytecode Sourcemap

23588:8214:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10437:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10437:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14764:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14764:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14764:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5818:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5818:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17004:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17004:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2433:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2433:85:0;;;;;;;;;;;;;;;;;;;;;;;19231:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19231:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;19231:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26315:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26315:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17271;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17271:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26776:266;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26776:266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21088:208;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21088:208:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20702:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20702:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26121:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26121:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23919:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23919:30:0;;;;;;;;;;;;;;;;;;;;;;;14812:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14812:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24234:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24234:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13329:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13329:95:0;;;;;;10874:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10874:169:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13847:75;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13847:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;23877:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23877:33:0;;;;;;;;;;;;;;;;;;;;;;;24272:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24272:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28373:577;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25820:97;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25820:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12708:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12708:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24119:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24119:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29178:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29178:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23828:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23828:38:0;;;;;;;;;;;;;;;;;;;;;;;7737:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7737:447:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24158:71;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24158:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;28956:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28956:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3217:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3217:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9301:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9301:114:0;;;;;;19697:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19697:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11712:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11712:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25722:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25722:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;12239:68;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12239:68:0;;;;;;13149:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13149:93:0;;;;;;8506:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8506:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26216:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26216:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;25615:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25615:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;14787:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14787:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;14787:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19904:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19904:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26530:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26530:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23788:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23788:31:0;;;;;;;;;;;;;;;;;;;;;;;26017:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26017:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30375:491;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30375:491:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25512:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25512:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;29874:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29874:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30872:927;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30872:927:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23958:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23958:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6962:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6962:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29432:436;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29432:436:0;;;;;;;;;;;;;;;;;;;;;;;;;;6337:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6337:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24077:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24077:37:0;;;;;;;;;;;;;;;;;;;;;;;24039:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24039:33:0;;;;;;;;;;;;;;;;;;;;;;;20269:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20269:198:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9583:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9583:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12313:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12313:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25921:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25921:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10437:35;;;;;;;;;;;;;:::o;14764:18::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5818:192::-;5885:4;5930:6;5898:7;:19;5906:10;5898:19;;;;;;;;;;;;;;;:29;5918:8;5898:29;;;;;;;;;;;;;;;:38;;;;5969:8;5948:38;;5957:10;5948:38;;;5979:6;5948:38;;;;;;;;;;;;;;;;;;6000:4;5993:11;;5818:192;;;;:::o;17004:119::-;17088:29;17107:9;17088:5;17094;17088:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17088:12:0;;;;;;;;;;;;;;;;;;;;;:18;;:29;;;;:::i;:::-;17004:119;;:::o;2433:85::-;2477:7;2500:12;;2493:19;;2433:85;:::o;19231:53::-;;;;;;;;;;;;;;;;;;;;:::o;26315:142::-;26385:7;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26401:24;26412:5;;;;;;;;;;;26419;26401:10;:24::i;:::-;;26439:12;;26432:19;;26315:142;;;:::o;17271:::-;17357:4;17380:27;17397:9;17380:5;17386;17380:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17380:12:0;;;;;;;;;;;;;;;;;;;;;:16;;:27;;;;:::i;:::-;17373:34;;17271:142;;;;:::o;26776:266::-;26870:4;26883:16;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;26902:25;26910:4;26916:2;26920:6;26902:7;:25::i;:::-;26883:44;;26942:50;26961:4;26967:2;26971:20;26982:8;26971:6;:10;;:20;;;;:::i;:::-;26942:18;:50::i;:::-;26934:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27032:4;27025:11;;26776:266;;;;;;:::o;21088:208::-;21190:9;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;21202:1;21190:13;;21185:106;21209:10;:17;21205:1;:21;21185:106;;;21242:41;21269:10;21280:1;21269:13;;;;;;;;;;;;;;;;;;21242:26;:41::i;:::-;21228:3;;;;;;;21185:106;;;21088:208;;:::o;20702:137::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;20794:39;20805:9;20816:16;;;;;;;;;;;;;;;;;;20794:10;:39::i;:::-;20702:137;:::o;26121:91::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26204:5;26191:10;;:18;;;;;;;;;;;;;;;;;;26121:91;:::o;23919:30::-;;;;:::o;14812:21::-;;;;;;;;;;;;;:::o;24234:33::-;;;;;;;;;;;;;:::o;13329:95::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;13044:6;;;;;;;;;;;13036:15;;;;;;;;13392:5;13383:6;;:14;;;;;;;;;;;;;;;;;;13409:9;;;;;;;;;;13329:95::o;10874:169::-;10995:4;10610:5;;;;;;;;;;;10596:19;;:10;:19;;;10588:28;;;;;;;;10516:15;;;;;;;;;;;10515:16;10507:25;;;;;;;;11018:19;11024:3;11029:7;11018:5;:19::i;:::-;11011:26;;10874:169;;;;:::o;13847:75::-;13891:25;13897:10;13909:6;13891:5;:25::i;:::-;13847:75;:::o;23877:33::-;;;;:::o;24272:32::-;;;;;;;;;;;;;:::o;28373:577::-;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;28520:92;28547:10;28559:9;28570:6;28578:3;28583:9;28594;28520:16;:92::i;:::-;28504:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28671:1;28662:6;:10;28654:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28719:45;28734:10;28746:9;28757:6;28719:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:41;28786:5;;;;;;;;;;;28793:10;28805:6;28771:14;:41::i;:::-;;28821:16;;;;;;;;;;;:25;;:36;28847:9;28821:36;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28821:36:0;28874:1;28868:3;:7;28864:74;;;28891:39;28914:10;28926:3;28891:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28864:74;28373:577;;;;:::o;25820:97::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25909:5;25890:16;;:24;;;;;;;;;;;;;;;;;;25820:97;:::o;12708:26::-;;;;;;;;;;;;;:::o;24119:34::-;;;;;;;;;;;;;:::o;29178:248::-;29299:4;25067:19;;;;;;;;;;;25053:33;;:10;:33;;;25045:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29320:39;29335:11;;;;;;;;;;;29348:2;29352:6;29320:14;:39::i;:::-;29312:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29416:4;29409:11;;29178:248;;;;:::o;23828:38::-;;;;:::o;7737:447::-;7848:4;7864:16;7883:7;:19;7891:10;7883:19;;;;;;;;;;;;;;;:29;7903:8;7883:29;;;;;;;;;;;;;;;;7864:48;;7943:8;7923:16;:28;;7919:169;;;7994:1;7962:7;:19;7970:10;7962:19;;;;;;;;;;;;;;;:29;7982:8;7962:29;;;;;;;;;;;;;;;:33;;;;7919:169;;;8050:30;8063:16;8050:8;:12;;:30;;;;:::i;:::-;8018:7;:19;8026:10;8018:19;;;;;;;;;;;;;;;:29;8038:8;8018:29;;;;;;;;;;;;;;;:62;;;;7919:169;8120:8;8099:61;;8108:10;8099:61;;;8130:7;:19;8138:10;8130:19;;;;;;;;;;;;;;;:29;8150:8;8130:29;;;;;;;;;;;;;;;;8099:61;;;;;;;;;;;;;;;;;;8174:4;8167:11;;7737:447;;;;;:::o;24158:71::-;;;;;;;;;;;;;:::o;28956:216::-;29062:4;25067:19;;;;;;;;;;;25053:33;;:10;:33;;;25045:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24967:4;24952:19;;:11;;;;;;;;;;;:19;;;24944:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29083:32;29095:11;;;;;;;;;;;29108:6;29083:11;:32::i;:::-;29075:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29162:4;29155:11;;28956:216;;;:::o;3217:101::-;3273:7;3296:8;:16;3305:6;3296:16;;;;;;;;;;;;;;;;3289:23;;3217:101;;;:::o;9301:114::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;9378:5;;;;;;;;;;;9359:25;;;;;;;;;;;;9407:1;9391:5;;:18;;;;;;;;;;;;;;;;;;9301:114::o;19697:129::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;19784:36;19792:9;19803:16;;;;;;;;;;;;;;;;;;19784:7;:36::i;:::-;19697:129;:::o;11712:144::-;11771:4;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;10516:15;;;;;;;;;;;10515:16;10507:25;;;;;;;;11802:4;11784:15;;:22;;;;;;;;;;;;;;;;;;11818:14;;;;;;;;;;11846:4;11839:11;;11712:144;:::o;25722:94::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25808:5;25792:13;:21;;;;25722:94;:::o;12239:68::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12295:5;;;;;;;;;;;12282:19;;;13149:93;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;13213:4;13204:6;;:13;;;;;;;;;;;;;;;;;;13229:7;;;;;;;;;;13149:93::o;8506:20::-;;;;;;;;;;;;;:::o;26216:91::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26299:5;26286:10;:18;;;;26216:91;:::o;25615:103::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25710:5;25685:22;:30;;;;25615:103;:::o;14787:20::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19904:139::-;19978:4;20001:36;20009:9;20020:16;;;;;;;;;;;;;;;;;;20001:7;:36::i;:::-;19994:43;;19904:139;;;:::o;26530:240::-;26606:4;26619:16;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;26638:31;26654:1;26658:2;26662:6;26638:7;:31::i;:::-;26619:50;;26684:40;26699:2;26703:20;26714:8;26703:6;:10;;:20;;;;:::i;:::-;26684:14;:40::i;:::-;26676:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26760:4;26753:11;;26530:240;;;;;:::o;23788:31::-;;;;:::o;26017:100::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26109:5;26087:19;;:27;;;;;;;;;;;;;;;;;;26017:100;:::o;30375:491::-;30537:4;30619:12;30588:10;30576:9;:22;30558:15;:40;30554:58;;;30607:5;30600:12;;;;30554:58;30687:4;30703:6;30721:10;30743;30764:9;30652:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30652:130:0;;;30634:155;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30634:155:0;;;;;;;;;;;;;;;;30619:170;;30855:5;;;;;;;;;;;30803:57;;:48;30841:9;30803:29;:4;:27;;;;:29::i;:::-;:37;;;;;:48;;;;:::i;:::-;:57;;;30796:64;;30375:491;;;;;;;;;:::o;25512:99::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;25603:5;25582:18;:26;;;;25512:99;:::o;29874:495::-;30034:4;30116:12;30085:10;30073:9;:22;30055:15;:40;30051:58;;;30104:5;30097:12;;;;30051:58;30184:4;30200:6;30218;30236;30253:3;30267:9;30149:136;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30149:136:0;;;30131:161;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;30131:161:0;;;;;;;;;;;;;;;;30116:176;;30358:5;;;;;;;;;;;30306:57;;:48;30344:9;30306:29;:4;:27;;;;:29::i;:::-;:37;;;;;:48;;;;:::i;:::-;:57;;;30299:64;;29874:495;;;;;;;;;;:::o;30872:927::-;31030:4;31229:12;25183:4;25169:18;;:10;;;;;;;;;;;:18;;;25161:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;31059:109;31093:10;31105;31127;31139:9;31150;31059:23;:109::i;:::-;31043:177;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31244:42;31275:10;;31244:26;31259:10;;31244;:14;;:26;;;;:::i;:::-;:30;;:42;;;;:::i;:::-;31229:57;;31297:21;31307:10;31297:9;:21::i;:::-;:77;;;;;31332:19;;;;;;;;;;;31322:40;;;31363:10;31322:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31322:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31322:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31322:52:0;;;;;;;;;;;;;;;;31297:77;31293:98;;;31390:1;31383:8;;31293:98;31400:49;31415:11;;;;;;;;;;;31428:20;31443:4;31428:10;:14;;:20;;;;:::i;:::-;31400:14;:49::i;:::-;;31464:38;31479:16;;;;;;;;;;;31497:4;31464:14;:38::i;:::-;31456:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31571:19;;;;;;;;;;;31557:58;;;31616:10;31628;31557:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31557:82:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31557:82:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31557:82:0;;;;;;;;;;;;;;;;31541:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31734:10;31724:51;;;31746:10;31758;31770:4;31724:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:4;31782:11;;30872:927;;;;;;;:::o;23958:76::-;;;;;;;;;;;;;:::o;6962:307::-;7068:4;7125:46;7159:11;7125:7;:19;7133:10;7125:19;;;;;;;;;;;;;;;:29;7145:8;7125:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;7084:7;:19;7092:10;7084:19;;;;;;;;;;;;;;;:29;7104:8;7084:29;;;;;;;;;;;;;;;:88;;;;7205:8;7184:61;;7193:10;7184:61;;;7215:7;:19;7223:10;7215:19;;;;;;;;;;;;;;;:29;7235:8;7215:29;;;;;;;;;;;;;;;;7184:61;;;;;;;;;;;;;;;;;;7259:4;7252:11;;6962:307;;;;:::o;29432:436::-;29561:11;12884:6;;;;;;;;;;;12883:7;12875:16;;;;;;;;29509:1;29500:6;:10;29492:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29575:41;29605:10;;29575:25;29586:13;;29575:6;:10;;:25;;;;:::i;:::-;:29;;:41;;;;:::i;:::-;29561:55;;29625:34;29631:10;29643:15;29654:3;29643:6;:10;;:15;;;;:::i;:::-;29625:5;:34::i;:::-;29676:1;29670:3;:7;29666:152;;;29696:37;29711:16;;;;;;;;;;;29729:3;29696:14;:37::i;:::-;29688:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29773:37;29794:10;29806:3;29773:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29666:152;29829:33;29843:10;29855:6;29829:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;29432:436;;:::o;6337:162::-;6442:7;6468;:15;6476:6;6468:15;;;;;;;;;;;;;;;:25;6484:8;6468:25;;;;;;;;;;;;;;;;6461:32;;6337:162;;;;:::o;24077:37::-;;;;:::o;24039:33::-;;;;:::o;20269:198::-;20366:9;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;20378:1;20366:13;;20361:101;20385:10;:17;20381:1;:21;20361:101;;;20418:36;20440:10;20451:1;20440:13;;;;;;;;;;;;;;;;;;20418:21;:36::i;:::-;20404:3;;;;;;;20361:101;;;20269:198;;:::o;9583:105::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;9653:29;9672:9;9653:18;:29::i;:::-;9583:105;:::o;12313:98::-;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;12394:10;12381:24;;;25921:92;9009:5;;;;;;;;;;;8995:19;;:10;:19;;;8987:28;;;;;;;;26005:5;25991:11;;:19;;;;;;;;;;;;;;;;;;25921:92;:::o;15756:116::-;15848:17;15852:5;15859;15848:3;:17::i;:::-;15840:26;;;;;;;;15756:116;;:::o;15956:134::-;16042:4;16065:5;:12;;:19;16078:5;16065:19;;;;;;;;;;;;;;;;;;;;;;;;;16058:26;;15956:134;;;;:::o;27124:579::-;27200:12;27239:5;;;;;;;;;;;27225:19;;:10;:19;;;:54;;;;27248:31;27256:4;27262:16;;;;;;;;;;;;;;;;;;27248:7;:31::i;:::-;27225:54;:95;;;;27283:37;27291:10;27303:16;;;;;;;;;;;;;;;;;;27283:7;:37::i;:::-;27225:95;:128;;;;27324:29;27332:2;27336:16;;;;;;;;;;;;;;;;;;27324:7;:29::i;:::-;27225:128;27221:151;;;27371:1;27364:8;;;;27221:151;27386:22;27401:6;27386:14;:22::i;:::-;27379:29;;27435:1;27419:18;;:4;:18;;;27415:239;;;27456:38;27471:16;;;;;;;;;;;27489:4;27456:14;:38::i;:::-;27448:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27415:239;;;27562:48;27581:4;27587:16;;;;;;;;;;;27605:4;27562:18;:48::i;:::-;27554:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27415:239;27665:32;27688:2;27692:4;27665:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27124:579;;;;;;:::o;1690:119::-;1750:7;1779:2;1773;:8;;1766:16;;;;;;1801:2;1796;:7;1789:14;;1690:119;;;;:::o;4702:487::-;4814:4;4848:8;:15;4857:5;4848:15;;;;;;;;;;;;;;;;4838:6;:25;;4830:34;;;;;;;;4889:7;:14;4897:5;4889:14;;;;;;;;;;;;;;;:26;4904:10;4889:26;;;;;;;;;;;;;;;;4879:6;:36;;4871:45;;;;;;;;4946:1;4931:17;;:3;:17;;;;4923:26;;;;;;;;4976:27;4996:6;4976:8;:15;4985:5;4976:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;4958:8;:15;4967:5;4958:15;;;;;;;;;;;;;;;:45;;;;5026:25;5044:6;5026:8;:13;5035:3;5026:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;5010:8;:13;5019:3;5010:13;;;;;;;;;;;;;;;:41;;;;5087:38;5118:6;5087:7;:14;5095:5;5087:14;;;;;;;;;;;;;;;:26;5102:10;5087:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;5058:7;:14;5066:5;5058:14;;;;;;;;;;;;;;;:26;5073:10;5058:26;;;;;;;;;;;;;;;:67;;;;5153:3;5137:28;;5146:5;5137:28;;;5158:6;5137:28;;;;;;;;;;;;;;;;;;5179:4;5172:11;;4702:487;;;;;:::o;17818:154::-;17895:30;17915:9;17895:5;17901;17895:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17895:12:0;;;;;;;;;;;;;;;;;;;;;:19;;:30;;;;:::i;:::-;17949:9;17937:29;;;17960:5;17937:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17937:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17818:154;;:::o;11297:295::-;11386:4;11418:25;11435:7;11418:12;;:16;;:25;;;;:::i;:::-;11403:12;:40;;;;11466:26;11484:7;11466:8;:13;11475:3;11466:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;11450:8;:13;11459:3;11450:13;;;;;;;;;;;;;;;:42;;;;11509:3;11504:18;;;11514:7;11504:18;;;;;;;;;;;;;;;;;;11555:3;11534:34;;11551:1;11534:34;;;11560:7;11534:34;;;;;;;;;;;;;;;;;;11582:4;11575:11;;11297:295;;;;:::o;13928:447::-;14007:8;:14;14016:4;14007:14;;;;;;;;;;;;;;;;13997:6;:24;;13989:33;;;;;;;;14221:26;14240:6;14221:8;:14;14230:4;14221:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;14204:8;:14;14213:4;14204:14;;;;;;;;;;;;;;;:43;;;;14269:24;14286:6;14269:12;;:16;;:24;;;;:::i;:::-;14254:12;:39;;;;14310:4;14305:18;;;14316:6;14305:18;;;;;;;;;;;;;;;;;;14358:1;14335:34;;14344:4;14335:34;;;14362:6;14335:34;;;;;;;;;;;;;;;;;;13928:447;;:::o;28049:318::-;28133:4;28172:6;28154:8;:14;28163:4;28154:14;;;;;;;;;;;;;;;;:24;;28146:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28229:26;28248:6;28229:8;:14;28238:4;28229:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;28212:8;:14;28221:4;28212:14;;;;;;;;;;;;;;;:43;;;;28277:24;28294:6;28277:8;:12;28286:2;28277:12;;;;;;;;;;;;;;;;:16;;:24;;;;:::i;:::-;28262:8;:12;28271:2;28262:12;;;;;;;;;;;;;;;:39;;;;28330:2;28315:26;;28324:4;28315:26;;;28334:6;28315:26;;;;;;;;;;;;;;;;;;28357:4;28350:11;;28049:318;;;;;:::o;17540:146::-;17614:27;17631:9;17614:5;17620;17614:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;17614:12:0;;;;;;;;;;;;;;;;;;;;;:16;;:27;;;;:::i;:::-;17663:9;17653:27;;;17674:5;17653:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;17653:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17540:146;;:::o;2679:329::-;2742:4;2773:8;:20;2782:10;2773:20;;;;;;;;;;;;;;;;2763:6;:30;;2755:39;;;;;;;;2824:1;2809:17;;:3;:17;;;;2801:26;;;;;;;;2859:32;2884:6;2859:8;:20;2868:10;2859:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;2836:8;:20;2845:10;2836:20;;;;;;;;;;;;;;;:55;;;;2914:25;2932:6;2914:8;:13;2923:3;2914:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;2898:8;:13;2907:3;2898:13;;;;;;;;;;;;;;;:41;;;;2972:3;2951:33;;2960:10;2951:33;;;2977:6;2951:33;;;;;;;;;;;;;;;;;;2998:4;2991:11;;2679:329;;;;:::o;23102:289::-;23187:7;23372:5;23319:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;23319:59:0;;;23301:84;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;51:19;36:153;;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;23301:84:0;;;;;;;;;;;;;;;;23294:91;;23102:289;;;:::o;21982:975::-;22064:7;22083:9;22099;22115:7;22185:2;22170:4;:11;:17;;22166:59;;;22214:1;22198:19;;;;22166:59;22503:2;22497:4;22493:13;22487:20;22482:25;;22536:2;22530:4;22526:13;22520:20;22515:25;;22577:2;22571:4;22567:13;22561:20;22558:1;22553:29;22548:34;;22693:2;22689:1;:6;;;22685:36;;;22711:2;22706:7;;;;22685:36;22798:2;22793:1;:7;;;;:18;;;;;22809:2;22804:1;:7;;;;22793:18;22789:163;;;22838:1;22822:19;;;;22789:163;22919:25;22929:5;22936:1;22939;22942;22919:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;22919:25:0;;;;;;;;22912:32;;21982:975;;;;;;;;:::o;807:391::-;867:9;1103:1;1097:2;:7;1093:38;;;1122:1;1115:8;;;;1093:38;1148:2;1143;:7;1139:11;;1174:2;1168;1164:1;:6;;;;;;;;:12;1157:20;;;;;;1191:1;1184:8;;807:391;;;;;:::o;1285:288::-;1345:7;1565:2;1560;:7;;;;;;;;1553:14;;1285:288;;;;:::o;1876:132::-;1936:9;1963:2;1958;:7;1954:11;;1984:2;1979:1;:7;;1972:15;;;;;;2001:1;1994:8;;1876:132;;;;:::o;9829:175::-;9921:1;9900:23;;:9;:23;;;;9892:32;;;;;;;;9964:9;9936:38;;9957:5;;;;;;;;;;;9936:38;;;;;;;;;;;;9989:9;9981:5;;:17;;;;;;;;;;;;;;;;;;9829:175;:::o;27709:334::-;27771:7;27812:1;27791:18;;:22;:54;;;;;27827:18;;27817:6;:28;;27791:54;27787:68;;;27854:1;27847:8;;;;27787:68;27891:1;27866:22;;:26;:62;;;;;27906:22;;27896:6;:32;;27866:62;27862:122;;;27937:47;27973:10;;27937:31;27948:19;;27937:6;:10;;:31;;;;:::i;:::-;:35;;:47;;;;:::i;:::-;27930:54;;;;27862:122;27998:39;28026:10;;27998:23;28009:11;;27998:6;:10;;:23;;;;:::i;:::-;:27;;:39;;;;:::i;:::-;27991:46;;27709:334;;;;:::o;15566:108::-;15663:5;15641;:12;;:19;15654:5;15641:19;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;15566:108;;:::o;15392:104::-;15486:4;15464:5;:12;;:19;15477:5;15464:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;15392:104;;:::o

Swarm Source

bzzr://2b7fff343e6368a9403b9c2bf816d02821fa8a8e1c18fc55935320866cc5dc48
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.