ETH Price: $2,789.34 (-0.64%)
 

Overview

Max Total Supply

22,894,339.55599 CRT

Holders

1,427

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 5 Decimals)

Balance
10,283.58564 CRT

Value
$0.00
0x97aa9cec64ee41732474f646446f54d91166c827
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CrowdliToken

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 2 of 8: CrowdliToken.sol
pragma solidity 0.5.17;

import "./IERC20.sol";
import "./SafeMath.sol";
import "./Roles.sol";
import "./Ownable.sol";
import "./IERC1404.sol";

contract CrowdliToken is IERC20, IERC1404, Ownable {
    /**
     * Arithmetic operations in Solidity wrap on overflow. This can easily result
     * in bugs, because programmers usually assume that an overflow raises an
     * error, which is the standard behavior in high level programming languages.
     * `SafeMath` restores this intuition by reverting the transaction when an
     * operation overflows.
     *
     * Using this library instead of the unchecked operations eliminates an entire
     * class of bugs, so it's recommended to use it always.
     */
    using SafeMath for uint256;

    /**
     * Library for managing addresses assigned to a Role.
     */
    using Roles for Roles.Role;

    Roles.Role _transferblock;
    Roles.Role _kyc;

    mapping (address => uint256) private _balances;
    mapping (address => uint256) private _allocated;
    mapping (uint8 => string) private _restrictionCodes;
    mapping (uint8 => string) private _burnCodes;
    mapping (uint8 => string) private _mintCodes;
    mapping (uint8 => string) private _blockCodes;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => mapping (bytes32 => uint256)) private _propertyAmountLocks;

    uint256 private _totalSupply;
    string private _name = "CROWDLITOKEN";
    string private _symbol = "CRT";
    uint8 private _decimals = 5;

    uint8 private constant CODE_TYPE_RESTRICTION = 1;
    uint8 private constant CODE_TYPE_BURN = 2;
    uint8 private constant CODE_TYPE_MINT = 3;
    uint8 private constant CODE_TYPE_BLOCK = 4;

    uint8 private constant NO_RESTRICTIONS = 0;
    uint8 private constant FROM_NOT_IN_KYC_ROLE = 1;
    uint8 private constant TO_NOT_IN_KYC_ROLE = 2;
    uint8 private constant FROM_IN_TRANSFERBLOCK_ROLE = 3;
    uint8 private constant TO_IN_TRANSFERBLOCK_ROLE = 4;
    uint8 private constant NOT_ENOUGH_FUNDS = 5;
    uint8 private constant NOT_ENOUGH_UNALLOCATED_FUNDS = 6;

    constructor() public {
        _restrictionCodes[0] = "NO_RESTRICTIONS";
        _restrictionCodes[1] = "FROM_NOT_IN_KYC_ROLE";
        _restrictionCodes[2] = "TO_NOT_IN_KYC_ROLE";
        _restrictionCodes[3] = "FROM_IN_TRANSFERBLOCK_ROLE";
        _restrictionCodes[4] = "TO_IN_TRANSFERBLOCK_ROLE";
        _restrictionCodes[5] = "NOT_ENOUGH_FUNDS";
        _restrictionCodes[6] = "NOT_ENOUGH_UNALLOCATED_FUNDS";

        _mintCodes[0] = "CRT_SALE";
        _mintCodes[1] = "ANNUAL_ISSUANCE_FEE";
        _mintCodes[2] = "QUARTERLY_ISSUANCE_FEE";
        _mintCodes[3] = "REPLACE_TOKENS";
        _mintCodes[4] = "OTHER";

        _burnCodes[0] = "KYC_ISSUE";
        _burnCodes[1] = "REFUND_EXIT";
        _burnCodes[2] = "REPLACE_TOKENS";
        _burnCodes[3] = "OTHER";

        _blockCodes[0] = "KYC_ISSUE";
        _blockCodes[1] = "KYT_ISSUE";
        _blockCodes[2] = "LOST_TOKENS";
        _blockCodes[3] = "MAINTENANCE";
        _blockCodes[4] = "OTHER";
    }

    /**
     * Returns the name of the token
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * Returns the symbol of the token
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * Returns the number of decimals the token uses
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256) {
        return _totalSupply;
    }

    /**
     * Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256) {
        return _balances[account];
    }

    /**
     * Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * Atomically increases the allowance granted to `spender` by the caller.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * Atomically decreases the allowance granted to `spender` by the caller.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * Moves tokens `amount` from `sender` to `recipient`.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(detectTransferRestriction(sender,recipient,amount) == NO_RESTRICTIONS, "CROWDLITOKEN: Transferrestriction detected please call detectTransferRestriction(address from, address to, uint256 value) for detailed information");
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /**
     * Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal onlyOwner {
        require(account != address(0), "ERC20: mint to the zero address");
        require(_kyc.has(account), "CROWDLITOKEN: address is not in kyc list");
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal onlyOwner {
        require(account != address(0), "ERC20: burn from the zero address");
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * Destroys `amount` tokens from `account`.
     *
     * See {_burn}.
     */
    function burn(address account, uint256 amount, uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_BURN), "CROWDLITOKEN: The code does not exist");
        require(allocatedTokens(account) == 0, "CROWDLITOKEN: There are token allocations, its not allowed to burn tokens if there are token allocations");
        _burn(account, amount);
        emit Burn(account, amount, code);
    }

    /**
     * Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Mint} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function mintTo(address account, uint256 amount, uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_MINT), "CROWDLITOKEN: The code does not exist");
        _mint(account, amount);
        emit Mint(account, amount, code);
    }

    /**
     * Returns a human-readable message for a given restrictioncode
     */
    function messageForTransferRestriction(uint8 restrictionCode) external view returns (string memory){
        require(codeExist(restrictionCode,CODE_TYPE_RESTRICTION), "CROWDLITOKEN: The code does not exist");
        return _restrictionCodes[restrictionCode];
    }

    /**
     * Returns a human-readable message for a given burncode
     */
    function messageForBurnCode(uint8 burnCode) external view returns (string memory){
        require(codeExist(burnCode,CODE_TYPE_BURN), "CROWDLITOKEN: The code does not exist");
        return _burnCodes[burnCode];
    }

    /**
     * Returns a human-readable message for a given mintcode
     */
    function messageForMintCode(uint8 mintCode) external view returns (string memory){
        require(codeExist(mintCode,CODE_TYPE_MINT), "CROWDLITOKEN: The code does not exist");
        return _mintCodes[mintCode];
    }

    /**
     * Returns a human-readable message for a given blockcode
     */
    function messageForBlockCode(uint8 blockCode) external view returns (string memory){
        require(codeExist(blockCode,CODE_TYPE_BLOCK), "CROWDLITOKEN: The code does not exist");
        return _blockCodes[blockCode];
    }

    /**
     * Detects if a transfer will be reverted and if so returns an appropriate reference code
     */
    function detectTransferRestriction(address from, address to, uint256 value) public view returns (uint8){
        if(!_kyc.has(from)){
            return FROM_NOT_IN_KYC_ROLE;
        } else if(!_kyc.has(to)){
            return TO_NOT_IN_KYC_ROLE;
        } else if(_transferblock.has(from)){
            return FROM_IN_TRANSFERBLOCK_ROLE;
        } else if(_transferblock.has(to)){
            return TO_IN_TRANSFERBLOCK_ROLE;
        } else if(_balances[from] < value){
            return NOT_ENOUGH_FUNDS;
        } else if(_balances[from].sub(_allocated[from]) < value){
            return NOT_ENOUGH_UNALLOCATED_FUNDS;
        } else {
            return NO_RESTRICTIONS;
        }
    }

    /**
     * Mark a List of `address` with the kyc Role
     */
    function addUserListToKycRole(address[] calldata whitelistedAddresses) external onlyOwner {
        for(uint i=0; i< whitelistedAddresses.length; i++){
            _kyc.add(whitelistedAddresses[i]);
        }
    }

    /**
     * Remove the Role kyc from an `address`
     */
    function removeUserFromKycRole(address whitelistedAddress) external onlyOwner {
        require(_balances[whitelistedAddress] == 0, "CROWDLITOKEN: To remove someone from the whitelist the balance have to be 0");
        _kyc.remove(whitelistedAddress);
    }

    /**
     * Add the Role `transferblock` to an `address`
     */
    function addTransferBlock(address blockedAddress, uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_BLOCK), "CROWDLITOKEN: The code does not exist");
        _transferblock.add(blockedAddress);
        emit Block(blockedAddress, code);
    }

    /**
     * Remove the Role `transferblock` from an `address`
     */
    function removeTransferblock(address unblockAddress, uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_BLOCK), "CROWDLITOKEN: The code does not exist");
        _transferblock.remove(unblockAddress);
        emit Unblock(unblockAddress, code);
    }

    /**
     * Get the total amount of allocated tokens for a specific `owner`
     */
    function allocatedTokens(address owner) public view returns (uint256){
	    return _allocated[owner];
    }

    /**
     * Get the amount of allocated tokens for a specific `owner` for a specific `property`
     */
    function propertyLock(address owner, bytes32 propertyAddress) public view returns (uint256) {
        return _propertyAmountLocks[owner][propertyAddress];
    }

    /**
     * Add a new `restrictionCode` with a related `codeText` to the available `_restrictionCodes`
     */
    function setRestrictionCode(uint8 code, string calldata codeText) external onlyOwner {
        require(!codeExist(code,CODE_TYPE_RESTRICTION), "CROWDLITOKEN: The code already exists");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        _restrictionCodes[code] = codeText;
    }

    /**
     * Add a new `burncode` with a related `codeText` to the available `_burnCodes`
     */
    function setBurnCode(uint8 code, string calldata codeText) external onlyOwner {
        require(!codeExist(code,CODE_TYPE_BURN), "CROWDLITOKEN: The code already exists");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        _burnCodes[code] = codeText;
    }

    /**
     * Add a new `mintcode` with a related `codeText` to the available `_mintCodes`
     */
    function setMintCode(uint8 code, string calldata codeText) external onlyOwner {
        require(!codeExist(code,CODE_TYPE_MINT), "CROWDLITOKEN: The code already exists");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        _mintCodes[code] = codeText;
    }

    /**
     * Add a new `blockcode` with a related `codeText` to the available `_blockCodes`
     */
    function setBlockCode(uint8 code, string calldata codeText) external onlyOwner {
        require(!codeExist(code,CODE_TYPE_BLOCK), "CROWDLITOKEN: The code already exists");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        _blockCodes[code] = codeText;
    }

    /**
     * Remove a `restrictioncode` from the available `_restrictionCodes`
     */
    function removeRestrictionCode(uint8 restrictionCode) external onlyOwner {
        require(codeExist(restrictionCode,CODE_TYPE_RESTRICTION), "CROWDLITOKEN: The code does not exist");
        require(restrictionCode > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        delete _restrictionCodes[restrictionCode];
    }

    /**
     * Remove a `burncode` from the available `_burnCodes`
     */
    function removeBurnCode(uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_BURN), "CROWDLITOKEN: The code does not exist");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        delete _burnCodes[code];
    }

    /**
     * Remove a `mintcode` from the available `_mintCodes`
     */
    function removeMintCode(uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_MINT), "CROWDLITOKEN: The code does not exist");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        delete _mintCodes[code];
    }

    /**
     * Remove a `blockcode` from the available `_blockCodes`
     */
    function removeBlockCode(uint8 code) external onlyOwner {
        require(codeExist(code,CODE_TYPE_BLOCK), "CROWDLITOKEN: The code does not exist");
        require(code > 100, "ERC1404: Codes till 100 are reserverd for the SmartContract internals");
        delete _blockCodes[code];
    }

    /**
     * Allocate a specific `amount` of tokens for a specific `property` for a specific `owner` address
     *
     * Requirements:
     *
     * - `owner` needs enough unallocated funds
     */
    function allocateAmountFromAddressForProperty(address owner, bytes32 propertyAddress, uint256 amount) external onlyOwner {
        require(_balances[owner] - allocatedTokens(owner) >= amount, "CrowdliToken: Not enough unallocated tokens to allocate the requested amount");
        _allocated[owner] = _allocated[owner].add(amount);
	    _propertyAmountLocks[owner][propertyAddress] = _propertyAmountLocks[owner][propertyAddress].add(amount);
        emit Allocate(owner, propertyAddress, amount);
    }

    /**
     * Unallocate a specific `amount` of tokens for a specific `property` for a specific `owner` address
     *
     * Requirements:
     *
     * - `owner` needs enough unallocated funds
     */
    function unallocatePropertyFromAddress(address owner, bytes32 propertyAddress, uint256 amount) external onlyOwner {
        require(propertyLock(owner,propertyAddress) > 0, "CROWDLITOKEN: The property has no allocated tokens for that address");
        require(amount <= propertyLock(owner,propertyAddress), "CROWDLITOKEN: There are not enough allocated tokens to unallocate the requested amount");
        _allocated[owner] = _allocated[owner].sub(amount);
        _propertyAmountLocks[owner][propertyAddress] = _propertyAmountLocks[owner][propertyAddress].sub(amount);
        emit Unallocate(owner, propertyAddress, amount);
    }

    /**
     * Check if the given Code exists
     */
    function codeExist(uint8 code,uint8 codeType) internal view returns (bool){
        bytes memory memString;
        if(codeType == CODE_TYPE_RESTRICTION){
            memString = bytes(_restrictionCodes[code]);
        } else if(codeType == CODE_TYPE_BURN){
            memString = bytes(_burnCodes[code]);
        } else if(codeType == CODE_TYPE_MINT){
            memString = bytes(_mintCodes[code]);
        } else if(codeType == CODE_TYPE_BLOCK){
            memString = bytes(_blockCodes[code]);
        }
        if (memString.length == 0) {
            return false;
        } else {
            return true;
        }
    }

    /**
     * Emitted when `tokens` are allocated to a specific property
     */
    event Allocate(address indexed owner, bytes32 indexed propertyAddress, uint256 amount);

    /**
     * Emitted when `tokens` are unallocated from a specific property
     */
    event Unallocate(address indexed owner, bytes32 indexed propertyAddress, uint256 amount);

    /**
     * Emitted when `value` tokens are burned from one account (`from`)
     */
    event Burn(address indexed from, uint256 value, uint8 code);

    /**
     * Emitted when `value` tokens are minted to a account (`to`)
     */
    event Mint(address indexed to, uint256 value, uint8 code);

    /**
     * Emitted when `blockAddress` is blocked for transfers for a reason (`code`)
     */
    event Block(address indexed blockAddress, uint8 code);

    /**
     * Emitted when `unblockAddress` is no more blocked for transfers for a reason (`code`)
     */
    event Unblock(address indexed unblockAddress, uint8 code);
}

File 1 of 8: Context.sol
pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

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

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

File 3 of 8: IERC1404.sol
pragma solidity 0.5.17;

interface IERC1404 {
    /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
    /// @param from Sending address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    function detectTransferRestriction (address from, address to, uint256 value) external view returns (uint8);

    /// @notice Returns a human-readable message for a given restriction code
    /// @param restrictionCode Identifier for looking up a message
    /// @return Text showing the restriction's reasoning
    function messageForTransferRestriction (uint8 restrictionCode) external view returns (string memory);
}

File 4 of 8: IERC20.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: 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
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 8: Migrations.sol
pragma solidity 0.5.17;

contract Migrations {
  address public owner;
  uint public last_completed_migration;

  modifier restricted() {
    if (msg.sender == owner) _;
  }

  constructor() public {
    owner = msg.sender;
  }

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }
}

File 6 of 8: Ownable.sol
pragma solidity ^0.5.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 7 of 8: Roles.sol
pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

File 8 of 8: SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"propertyAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Allocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"blockAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Block","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"bytes32","name":"propertyAddress","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unallocate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"unblockAddress","type":"address"},{"indexed":false,"internalType":"uint8","name":"code","type":"uint8"}],"name":"Unblock","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"blockedAddress","type":"address"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"addTransferBlock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"whitelistedAddresses","type":"address[]"}],"name":"addUserListToKycRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"propertyAddress","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"allocateAmountFromAddressForProperty","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allocatedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"blockCode","type":"uint8"}],"name":"messageForBlockCode","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"burnCode","type":"uint8"}],"name":"messageForBurnCode","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"mintCode","type":"uint8"}],"name":"messageForMintCode","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"mintTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"propertyAddress","type":"bytes32"}],"name":"propertyLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeBlockCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeBurnCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeMintCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"removeRestrictionCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"unblockAddress","type":"address"},{"internalType":"uint8","name":"code","type":"uint8"}],"name":"removeTransferblock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"whitelistedAddress","type":"address"}],"name":"removeUserFromKycRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setBlockCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setBurnCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setMintCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"code","type":"uint8"},{"internalType":"string","name":"codeText","type":"string"}],"name":"setRestrictionCode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bytes32","name":"propertyAddress","type":"bytes32"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unallocatePropertyFromAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60c0604052600c60808190526b21a927aba22624aa27a5a2a760a11b60a09081526200002d919081620008f9565b506040805180820190915260038082526210d49560ea1b60209092019182526200005a91600d91620008f9565b50600e805460ff191660051790553480156200007557600080fd5b5060006200008b6001600160e01b03620008f416565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152600f81526e4e4f5f5245535452494354494f4e5360881b60208083019182526000805260059052905162000135917f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc91620008f9565b5060408051808201909152601481527f46524f4d5f4e4f545f494e5f4b59435f524f4c4500000000000000000000000060208083019182526001600052600590529051620001a5917f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b91620008f9565b50604080518082019091526012815271544f5f4e4f545f494e5f4b59435f524f4c4560701b602080830191825260026000526005905290516200020a917f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a91620008f9565b5060408051808201909152601a81527f46524f4d5f494e5f5452414e53464552424c4f434b5f524f4c45000000000000602080830191825260036000526005905290516200027a917fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc091620008f9565b5060408051808201909152601881527f544f5f494e5f5452414e53464552424c4f434b5f524f4c45000000000000000060208083019182526004600052600590529051620002ea917f3eec716f11ba9e820c81ca75eb978ffb45831ef8b7a53e5e422c26008e1ca6d591620008f9565b5060408051808201909152601081526f4e4f545f454e4f5547485f46554e445360801b602080830191825260056000819052905290516200034d917f458b30c2d72bfd2c6317304a4594ecbafe5f729d3111b65fdc3a33bd48e5432d91620008f9565b5060408051808201909152601c81527f4e4f545f454e4f5547485f554e414c4c4f43415445445f46554e44530000000060208083019182526006600052600590529051620003bd917f069400f22b28c6c362558d92f66163cec5671cba50b61abd2eecfcd0eaeac51891620008f9565b506040805180820190915260088152674352545f53414c4560c01b60208083019182526000805260079052905162000417917f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df91620008f9565b5060408051808201909152601381527f414e4e55414c5f49535355414e43455f464545000000000000000000000000006020808301918252600160005260079052905162000487917fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b82891620008f9565b5060408051808201909152601681527f515541525445524c595f49535355414e43455f4645450000000000000000000060208083019182526002600052600790529051620004f7917fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d91620008f9565b5060408051808201909152600e81526d5245504c4143455f544f4b454e5360901b6020808301918252600360005260079052905162000558917f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c691620008f9565b5060408051808201909152600581526427aa2422a960d91b60208083019182526004600052600790529051620005b0917fb805995a7ec585a251200611a61d179cfd7fb105e1ab17dc415a7336783786f791620008f9565b506040805180820190915260098152684b59435f495353554560b81b6020808301918252600080526006905290516200060b917f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f891620008f9565b5060408051808201909152600b81526a14915195539117d156125560aa1b6020808301918252600160005260069052905162000669917f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a3191620008f9565b5060408051808201909152600e81526d5245504c4143455f544f4b454e5360901b60208083019182526002600052600690529051620006ca917f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace2991620008f9565b5060408051808201909152600581526427aa2422a960d91b6020808301918252600360005260069052905162000722917f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d291620008f9565b506040805180820190915260098152684b59435f495353554560b81b6020808301918252600080526008905290516200077d917f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c791620008f9565b506040805180820190915260098152684b59545f495353554560b81b60208083019182526001600052600890529051620007d9917fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f91620008f9565b5060408051808201909152600b81526a4c4f53545f544f4b454e5360a81b6020808301918252600260005260089052905162000837917f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea904191620008f9565b5060408051808201909152600b81526a4d41494e54454e414e434560a81b6020808301918252600360005260089052905162000895917f625b35f5e76f098dd7c3a05b10e2e5e78a4a01228d60c3b143426cdf36d2645591620008f9565b5060408051808201909152600581526427aa2422a960d91b60208083019182526004600052600890529051620008ed917f9321edea6e3be4df59a344b401fab4f888b556fda1f954244cff9204bad624b891620008f9565b506200099b565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200093c57805160ff19168380011785556200096c565b828001600101855582156200096c579182015b828111156200096c5782518255916020019190600101906200094f565b506200097a9291506200097e565b5090565b620008f691905b808211156200097a576000815560010162000985565b6131ff80620009ab6000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063857e6d9011610130578063af92fe5d116100b8578063dd62ed3e1161007c578063dd62ed3e146108ee578063e81890ce1461091c578063f2fde38b1461093c578063f4f411e314610962578063fd20cfdd1461099157610232565b8063af92fe5d146107c9578063c5c4d3a2146107f8578063d46ac2d514610818578063d4ce14151461084a578063db78c53a1461088057610232565b8063991697dd116100ff578063991697dd146106615780639bfe0351146106d9578063a457c2d714610751578063a9059cbb1461077d578063aaf7881e146107a957610232565b8063857e6d90146105b55780638da5cb5b1461062d5780638f32d59b1461065157806395d89b411461065957610232565b80632241328b116101be57806355a3a81b1161018257806355a3a81b146105275780635a41aad21461054757806370a0823114610567578063715018a61461058d5780637f4ab1dd1461059557610232565b80632241328b1461044057806323b872dd1461047557806326ab373e146104ab578063313ce567146104dd57806339509351146104fb57610232565b8063095ea7b311610205578063095ea7b31461039257806313a5854e146103d257806313f84a45146103f257806318160ddd146104125780631b20d9cb1461041a57610232565b806303b4bfcb1461023757806306fdde031461027557806308118fd4146102f25780630881bbb91461031a575b600080fd5b6102636004803603604081101561024d57600080fd5b506001600160a01b0381351690602001356109c6565b60408051918252519081900360200190f35b61027d6109f1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b757818101518382015260200161029f565b50505050905090810190601f1680156102e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103186004803603602081101561030857600080fd5b50356001600160a01b0316610a88565b005b6103186004803603604081101561033057600080fd5b60ff8235169190810190604081016020820135600160201b81111561035457600080fd5b82018360208201111561036657600080fd5b803590602001918460018302840111600160201b8311171561038757600080fd5b509092509050610b38565b6103be600480360360408110156103a857600080fd5b506001600160a01b038135169060200135610c2b565b604080519115158252519081900360200190f35b610318600480360360208110156103e857600080fd5b503560ff16610c48565b61027d6004803603602081101561040857600080fd5b503560ff16610d32565b610263610e1d565b6102636004803603602081101561043057600080fd5b50356001600160a01b0316610e23565b6103186004803603606081101561045657600080fd5b5080356001600160a01b0316906020810135906040013560ff16610e3e565b6103be6004803603606081101561048b57600080fd5b506001600160a01b03813581169160208101359091169060400135610f64565b610318600480360360608110156104c157600080fd5b506001600160a01b038135169060208101359060400135610ff2565b6104e561115e565b6040805160ff9092168252519081900360200190f35b6103be6004803603604081101561051157600080fd5b506001600160a01b038135169060200135611167565b6103186004803603602081101561053d57600080fd5b503560ff166111bb565b61027d6004803603602081101561055d57600080fd5b503560ff166112a5565b6102636004803603602081101561057d57600080fd5b50356001600160a01b0316611359565b610318611374565b61027d600480360360208110156105ab57600080fd5b503560ff16611405565b610318600480360360408110156105cb57600080fd5b60ff8235169190810190604081016020820135600160201b8111156105ef57600080fd5b82018360208201111561060157600080fd5b803590602001918460018302840111600160201b8311171561062257600080fd5b5090925090506114b9565b6106356115a6565b604080516001600160a01b039092168252519081900360200190f35b6103be6115b5565b61027d6115d9565b6103186004803603604081101561067757600080fd5b60ff8235169190810190604081016020820135600160201b81111561069b57600080fd5b8201836020820111156106ad57600080fd5b803590602001918460018302840111600160201b831117156106ce57600080fd5b50909250905061163a565b610318600480360360408110156106ef57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071357600080fd5b82018360208201111561072557600080fd5b803590602001918460018302840111600160201b8311171561074657600080fd5b509092509050611727565b6103be6004803603604081101561076757600080fd5b506001600160a01b038135169060200135611814565b6103be6004803603604081101561079357600080fd5b506001600160a01b038135169060200135611882565b61027d600480360360208110156107bf57600080fd5b503560ff16611896565b610318600480360360408110156107df57600080fd5b5080356001600160a01b0316906020013560ff1661194a565b6103186004803603602081101561080e57600080fd5b503560ff16611a2e565b6103186004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135611b18565b6104e56004803603606081101561086057600080fd5b506001600160a01b03813581169160208101359091169060400135611cb3565b6103186004803603602081101561089657600080fd5b810190602081018135600160201b8111156108b057600080fd5b8201836020820111156108c257600080fd5b803590602001918460208302840111600160201b831117156108e357600080fd5b509092509050611da0565b6102636004803603604081101561090457600080fd5b506001600160a01b0381358116916020013516611e2e565b6103186004803603602081101561093257600080fd5b503560ff16611e59565b6103186004803603602081101561095257600080fd5b50356001600160a01b0316611f43565b6103186004803603604081101561097857600080fd5b5080356001600160a01b0316906020013560ff16611f93565b610318600480360360608110156109a757600080fd5b5080356001600160a01b0316906020810135906040013560ff16612077565b6001600160a01b0382166000908152600a602090815260408083208484529091529020545b92915050565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7d5780601f10610a5257610100808354040283529160200191610a7d565b820191906000526020600020905b815481529060010190602001808311610a6057829003601f168201915b505050505090505b90565b610a906115b5565b610acf576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415610b245760405162461bcd60e51b815260040180806020018281038252604b815260200180612e69604b913960600191505060405180910390fd5b610b3560028263ffffffff61215816565b50565b610b406115b5565b610b7f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610b8a8360036121bf565b15610bc65760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff1611610c085760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600760205260409020610c25908383612c44565b50505050565b6000610c3f610c38612427565b848461242b565b50600192915050565b610c506115b5565b610c8f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610c9a8160046121bf565b610cd55760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611610d175760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600860205260408120610b3591612cc2565b6060610d3f8260036121bf565b610d7a5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526007602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b50505050509050919050565b600b5490565b6001600160a01b031660009081526004602052604090205490565b610e466115b5565b610e85576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610e908160026121bf565b610ecb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b610ed483610e23565b15610f105760405162461bcd60e51b81526004018080602001828103825260688152602001806130e86068913960800191505060405180910390fd5b610f1a8383612517565b6040805183815260ff8316602082015281516001600160a01b038616927f55eee3060c5b26cb8b25640c0ac7284dca63b649106677825a2c7e9566fdc16e928290030190a2505050565b6000610f7184848461265a565b610fe784610f7d612427565b610fe285604051806060016040528060288152602001612ed5602891396001600160a01b038a16600090815260096020526040812090610fbb612427565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61280416565b61242b565b5060015b9392505050565b610ffa6115b5565b611039576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b8061104384610e23565b6001600160a01b03851660009081526003602052604090205403101561109a5760405162461bcd60e51b815260040180806020018281038252604c815260200180612e1d604c913960600191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546110c3908263ffffffff61289b16565b6001600160a01b038416600090815260046020908152604080832093909355600a815282822085835290522054611100908263ffffffff61289b16565b6001600160a01b0384166000818152600a60209081526040808320878452825291829020939093558051848152905185937f851fd644069b5bcff4f0e5692106aeceb1bbaa3b843a7472d7fa41ee39b5df75928290030190a3505050565b600e5460ff1690565b6000610c3f611174612427565b84610fe28560096000611185612427565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61289b16565b6111c36115b5565b611202576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61120d8160016121bf565b6112485760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff161161128a5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600560205260408120610b3591612cc2565b60606112b28260026121bf565b6112ed5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526006602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6001600160a01b031660009081526003602052604090205490565b61137c6115b5565b6113bb576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60606114128260016121bf565b61144d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6114c16115b5565b611500576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61150b8360016121bf565b156115475760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff16116115895760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600560205260409020610c25908383612c44565b6000546001600160a01b031690565b600080546001600160a01b03166115ca612427565b6001600160a01b031614905090565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7d5780601f10610a5257610100808354040283529160200191610a7d565b6116426115b5565b611681576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61168c8360026121bf565b156116c85760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff161161170a5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600660205260409020610c25908383612c44565b61172f6115b5565b61176e576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6117798360046121bf565b156117b55760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff16116117f75760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600860205260409020610c25908383612c44565b6000610c3f611821612427565b84610fe2856040518060600160405280602581526020016131a6602591396009600061184b612427565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61280416565b6000610c3f61188f612427565b848461265a565b60606118a38260046121bf565b6118de5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526008602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6119526115b5565b611991576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61199c8160046121bf565b6119d75760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b6119e860018363ffffffff61215816565b6040805160ff8316815290516001600160a01b038416917f1c4ad7034997b7148ba9f710932d46d6d6efff4afd21e9731abf4451be902bf2919081900360200190a25050565b611a366115b5565b611a75576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611a808160036121bf565b611abb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611611afd5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600760205260408120610b3591612cc2565b611b206115b5565b611b5f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6000611b6b84846109c6565b11611ba75760405162461bcd60e51b8152600401808060200182810382526043815260200180612f606043913960600191505060405180910390fd5b611bb183836109c6565b811115611bef5760405162461bcd60e51b81526004018080602001828103825260568152602001806131506056913960600191505060405180910390fd5b6001600160a01b038316600090815260046020526040902054611c18908263ffffffff6128f516565b6001600160a01b038416600090815260046020908152604080832093909355600a815282822085835290522054611c55908263ffffffff6128f516565b6001600160a01b0384166000818152600a60209081526040808320878452825291829020939093558051848152905185937fadb6c9055c0feacb02aa9190148cd10258a450e92de62f92d0137b0e1bfe00bd928290030190a3505050565b6000611cc660028563ffffffff61293716565b611cd257506001610feb565b611ce360028463ffffffff61293716565b611cef57506002610feb565b611d0060018563ffffffff61293716565b15611d0d57506003610feb565b611d1e60018463ffffffff61293716565b15611d2b57506004610feb565b6001600160a01b038416600090815260036020526040902054821115611d5357506005610feb565b6001600160a01b0384166000908152600460209081526040808320546003909252909120548391611d8a919063ffffffff6128f516565b1015611d9857506006610feb565b506000610feb565b611da86115b5565b611de7576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b60005b81811015611e2957611e21838383818110611e0157fe5b905060200201356001600160a01b0316600261299e90919063ffffffff16565b600101611dea565b505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b611e616115b5565b611ea0576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611eab8160026121bf565b611ee65760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611611f285760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600660205260408120610b3591612cc2565b611f4b6115b5565b611f8a576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610b3581612a1f565b611f9b6115b5565b611fda576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611fe58160046121bf565b6120205760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b61203160018363ffffffff61299e16565b6040805160ff8316815290516001600160a01b038416917f919e3dd5d3bfd72e817c243f80bc0a74ddf1f953a7c97b1d6298aaa4a8e3de64919081900360200190a25050565b61207f6115b5565b6120be576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6120c98160036121bf565b6121045760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b61210e8383612abf565b6040805183815260ff8316602082015281516001600160a01b038616927f29600984795369456176b31dad545cb35585021faea93dcc568a467a737ad425928290030190a2505050565b6121628282612937565b61219d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612eb46021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000606060ff8316600114156122725760ff841660009081526005602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b820191906000526020600020905b81548152906001019060200180831161224957829003601f168201915b5050505050905061240d565b60ff8316600214156122ea5760ff841660009081526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b60ff8316600314156123625760ff841660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b60ff83166004141561240d5760ff841660009081526008602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156124055780601f106123da57610100808354040283529160200191612405565b820191906000526020600020905b8154815290600101906020018083116123e857829003601f168201915b505050505090505b805161241d5760009150506109eb565b60019150506109eb565b3390565b6001600160a01b0383166124705760405162461bcd60e51b81526004018080602001828103825260248152602001806130326024913960400191505060405180910390fd5b6001600160a01b0382166124b55760405162461bcd60e51b8152600401808060200182810382526022815260200180612db06022913960400191505060405180910390fd5b6001600160a01b03808416600081815260096020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b61251f6115b5565b61255e576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b0382166125a35760405162461bcd60e51b8152600401808060200182810382526021815260200180612f3f6021913960400191505060405180910390fd5b6125e681604051806060016040528060228152602001612d40602291396001600160a01b038516600090815260036020526040902054919063ffffffff61280416565b6001600160a01b038316600090815260036020526040902055600b54612612908263ffffffff6128f516565b600b556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03831661269f5760405162461bcd60e51b8152600401808060200182810382526025815260200180612fa36025913960400191505060405180910390fd5b6001600160a01b0382166126e45760405162461bcd60e51b8152600401808060200182810382526023815260200180612d1d6023913960400191505060405180910390fd5b60006126f1848484611cb3565b60ff16146127305760405162461bcd60e51b81526004018080602001828103825260928152602001806130566092913960a00191505060405180910390fd5b61277381604051806060016040528060268152602001612dd2602691396001600160a01b038616600090815260036020526040902054919063ffffffff61280416565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546127a8908263ffffffff61289b16565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156128935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612858578181015183820152602001612840565b50505050905090810190601f1680156128855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610feb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000610feb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612804565b60006001600160a01b03821661297e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f1d6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6129a88282612937565b156129fa576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038116612a645760405162461bcd60e51b8152600401808060200182810382526026815260200180612d8a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612ac76115b5565b612b06576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b038216612b61576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612b7260028363ffffffff61293716565b612bad5760405162461bcd60e51b8152600401808060200182810382526028815260200180612d626028913960400191505060405180910390fd5b600b54612bc0908263ffffffff61289b16565b600b556001600160a01b038216600090815260036020526040902054612bec908263ffffffff61289b16565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c855782800160ff19823516178555612cb2565b82800160010185558215612cb2579182015b82811115612cb2578235825591602001919060010190612c97565b50612cbe929150612d02565b5090565b50805460018160011615610100020316600290046000825580601f10612ce85750610b35565b601f016020900490600052602060002090810190610b3591905b610a8591905b80821115612cbe5760008155600101612d0856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636543524f57444c49544f4b454e3a2061646472657373206973206e6f7420696e206b7963206c6973744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636543524f57444c49544f4b454e3a2054686520636f646520646f6573206e6f7420657869737443726f77646c69546f6b656e3a204e6f7420656e6f75676820756e616c6c6f636174656420746f6b656e7320746f20616c6c6f63617465207468652072657175657374656420616d6f756e7443524f57444c49544f4b454e3a20546f2072656d6f766520736f6d656f6e652066726f6d207468652077686974656c697374207468652062616c616e6365206861766520746f2062652030526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737343524f57444c49544f4b454e3a205468652070726f706572747920686173206e6f20616c6c6f636174656420746f6b656e7320666f722074686174206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373455243313430343a20436f6465732074696c6c20313030206172652072657365727665726420666f722074686520536d617274436f6e747261637420696e7465726e616c7343524f57444c49544f4b454e3a2054686520636f646520616c72656164792065786973747345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343524f57444c49544f4b454e3a205472616e736665727265737472696374696f6e20646574656374656420706c656173652063616c6c206465746563745472616e736665725265737472696374696f6e28616464726573732066726f6d2c206164647265737320746f2c2075696e743235362076616c75652920666f722064657461696c656420696e666f726d6174696f6e43524f57444c49544f4b454e3a2054686572652061726520746f6b656e20616c6c6f636174696f6e732c20697473206e6f7420616c6c6f77656420746f206275726e20746f6b656e732069662074686572652061726520746f6b656e20616c6c6f636174696f6e7343524f57444c49544f4b454e3a20546865726520617265206e6f7420656e6f75676820616c6c6f636174656420746f6b656e7320746f20756e616c6c6f63617465207468652072657175657374656420616d6f756e7445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202f59b9c85a0f9be9e5f094fa513032354613b182c9bfd66b21bbd373cf044a9764736f6c63430005110032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c8063857e6d9011610130578063af92fe5d116100b8578063dd62ed3e1161007c578063dd62ed3e146108ee578063e81890ce1461091c578063f2fde38b1461093c578063f4f411e314610962578063fd20cfdd1461099157610232565b8063af92fe5d146107c9578063c5c4d3a2146107f8578063d46ac2d514610818578063d4ce14151461084a578063db78c53a1461088057610232565b8063991697dd116100ff578063991697dd146106615780639bfe0351146106d9578063a457c2d714610751578063a9059cbb1461077d578063aaf7881e146107a957610232565b8063857e6d90146105b55780638da5cb5b1461062d5780638f32d59b1461065157806395d89b411461065957610232565b80632241328b116101be57806355a3a81b1161018257806355a3a81b146105275780635a41aad21461054757806370a0823114610567578063715018a61461058d5780637f4ab1dd1461059557610232565b80632241328b1461044057806323b872dd1461047557806326ab373e146104ab578063313ce567146104dd57806339509351146104fb57610232565b8063095ea7b311610205578063095ea7b31461039257806313a5854e146103d257806313f84a45146103f257806318160ddd146104125780631b20d9cb1461041a57610232565b806303b4bfcb1461023757806306fdde031461027557806308118fd4146102f25780630881bbb91461031a575b600080fd5b6102636004803603604081101561024d57600080fd5b506001600160a01b0381351690602001356109c6565b60408051918252519081900360200190f35b61027d6109f1565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b757818101518382015260200161029f565b50505050905090810190601f1680156102e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103186004803603602081101561030857600080fd5b50356001600160a01b0316610a88565b005b6103186004803603604081101561033057600080fd5b60ff8235169190810190604081016020820135600160201b81111561035457600080fd5b82018360208201111561036657600080fd5b803590602001918460018302840111600160201b8311171561038757600080fd5b509092509050610b38565b6103be600480360360408110156103a857600080fd5b506001600160a01b038135169060200135610c2b565b604080519115158252519081900360200190f35b610318600480360360208110156103e857600080fd5b503560ff16610c48565b61027d6004803603602081101561040857600080fd5b503560ff16610d32565b610263610e1d565b6102636004803603602081101561043057600080fd5b50356001600160a01b0316610e23565b6103186004803603606081101561045657600080fd5b5080356001600160a01b0316906020810135906040013560ff16610e3e565b6103be6004803603606081101561048b57600080fd5b506001600160a01b03813581169160208101359091169060400135610f64565b610318600480360360608110156104c157600080fd5b506001600160a01b038135169060208101359060400135610ff2565b6104e561115e565b6040805160ff9092168252519081900360200190f35b6103be6004803603604081101561051157600080fd5b506001600160a01b038135169060200135611167565b6103186004803603602081101561053d57600080fd5b503560ff166111bb565b61027d6004803603602081101561055d57600080fd5b503560ff166112a5565b6102636004803603602081101561057d57600080fd5b50356001600160a01b0316611359565b610318611374565b61027d600480360360208110156105ab57600080fd5b503560ff16611405565b610318600480360360408110156105cb57600080fd5b60ff8235169190810190604081016020820135600160201b8111156105ef57600080fd5b82018360208201111561060157600080fd5b803590602001918460018302840111600160201b8311171561062257600080fd5b5090925090506114b9565b6106356115a6565b604080516001600160a01b039092168252519081900360200190f35b6103be6115b5565b61027d6115d9565b6103186004803603604081101561067757600080fd5b60ff8235169190810190604081016020820135600160201b81111561069b57600080fd5b8201836020820111156106ad57600080fd5b803590602001918460018302840111600160201b831117156106ce57600080fd5b50909250905061163a565b610318600480360360408110156106ef57600080fd5b60ff8235169190810190604081016020820135600160201b81111561071357600080fd5b82018360208201111561072557600080fd5b803590602001918460018302840111600160201b8311171561074657600080fd5b509092509050611727565b6103be6004803603604081101561076757600080fd5b506001600160a01b038135169060200135611814565b6103be6004803603604081101561079357600080fd5b506001600160a01b038135169060200135611882565b61027d600480360360208110156107bf57600080fd5b503560ff16611896565b610318600480360360408110156107df57600080fd5b5080356001600160a01b0316906020013560ff1661194a565b6103186004803603602081101561080e57600080fd5b503560ff16611a2e565b6103186004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135611b18565b6104e56004803603606081101561086057600080fd5b506001600160a01b03813581169160208101359091169060400135611cb3565b6103186004803603602081101561089657600080fd5b810190602081018135600160201b8111156108b057600080fd5b8201836020820111156108c257600080fd5b803590602001918460208302840111600160201b831117156108e357600080fd5b509092509050611da0565b6102636004803603604081101561090457600080fd5b506001600160a01b0381358116916020013516611e2e565b6103186004803603602081101561093257600080fd5b503560ff16611e59565b6103186004803603602081101561095257600080fd5b50356001600160a01b0316611f43565b6103186004803603604081101561097857600080fd5b5080356001600160a01b0316906020013560ff16611f93565b610318600480360360608110156109a757600080fd5b5080356001600160a01b0316906020810135906040013560ff16612077565b6001600160a01b0382166000908152600a602090815260408083208484529091529020545b92915050565b600c8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7d5780601f10610a5257610100808354040283529160200191610a7d565b820191906000526020600020905b815481529060010190602001808311610a6057829003601f168201915b505050505090505b90565b610a906115b5565b610acf576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415610b245760405162461bcd60e51b815260040180806020018281038252604b815260200180612e69604b913960600191505060405180910390fd5b610b3560028263ffffffff61215816565b50565b610b406115b5565b610b7f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610b8a8360036121bf565b15610bc65760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff1611610c085760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600760205260409020610c25908383612c44565b50505050565b6000610c3f610c38612427565b848461242b565b50600192915050565b610c506115b5565b610c8f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610c9a8160046121bf565b610cd55760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611610d175760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600860205260408120610b3591612cc2565b6060610d3f8260036121bf565b610d7a5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526007602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b50505050509050919050565b600b5490565b6001600160a01b031660009081526004602052604090205490565b610e466115b5565b610e85576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610e908160026121bf565b610ecb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b610ed483610e23565b15610f105760405162461bcd60e51b81526004018080602001828103825260688152602001806130e86068913960800191505060405180910390fd5b610f1a8383612517565b6040805183815260ff8316602082015281516001600160a01b038616927f55eee3060c5b26cb8b25640c0ac7284dca63b649106677825a2c7e9566fdc16e928290030190a2505050565b6000610f7184848461265a565b610fe784610f7d612427565b610fe285604051806060016040528060288152602001612ed5602891396001600160a01b038a16600090815260096020526040812090610fbb612427565b6001600160a01b03168152602081019190915260400160002054919063ffffffff61280416565b61242b565b5060015b9392505050565b610ffa6115b5565b611039576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b8061104384610e23565b6001600160a01b03851660009081526003602052604090205403101561109a5760405162461bcd60e51b815260040180806020018281038252604c815260200180612e1d604c913960600191505060405180910390fd5b6001600160a01b0383166000908152600460205260409020546110c3908263ffffffff61289b16565b6001600160a01b038416600090815260046020908152604080832093909355600a815282822085835290522054611100908263ffffffff61289b16565b6001600160a01b0384166000818152600a60209081526040808320878452825291829020939093558051848152905185937f851fd644069b5bcff4f0e5692106aeceb1bbaa3b843a7472d7fa41ee39b5df75928290030190a3505050565b600e5460ff1690565b6000610c3f611174612427565b84610fe28560096000611185612427565b6001600160a01b03908116825260208083019390935260409182016000908120918c16815292529020549063ffffffff61289b16565b6111c36115b5565b611202576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61120d8160016121bf565b6112485760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff161161128a5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600560205260408120610b3591612cc2565b60606112b28260026121bf565b6112ed5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526006602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6001600160a01b031660009081526003602052604090205490565b61137c6115b5565b6113bb576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60606114128260016121bf565b61144d5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526005602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6114c16115b5565b611500576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61150b8360016121bf565b156115475760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff16116115895760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600560205260409020610c25908383612c44565b6000546001600160a01b031690565b600080546001600160a01b03166115ca612427565b6001600160a01b031614905090565b600d8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a7d5780601f10610a5257610100808354040283529160200191610a7d565b6116426115b5565b611681576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61168c8360026121bf565b156116c85760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff161161170a5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600660205260409020610c25908383612c44565b61172f6115b5565b61176e576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6117798360046121bf565b156117b55760405162461bcd60e51b815260040180806020018281038252602581526020018061300d6025913960400191505060405180910390fd5b60648360ff16116117f75760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff83166000908152600860205260409020610c25908383612c44565b6000610c3f611821612427565b84610fe2856040518060600160405280602581526020016131a6602591396009600061184b612427565b6001600160a01b03908116825260208083019390935260409182016000908120918d1681529252902054919063ffffffff61280416565b6000610c3f61188f612427565b848461265a565b60606118a38260046121bf565b6118de5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60ff821660009081526008602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610e115780601f10610de657610100808354040283529160200191610e11565b6119526115b5565b611991576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b61199c8160046121bf565b6119d75760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b6119e860018363ffffffff61215816565b6040805160ff8316815290516001600160a01b038416917f1c4ad7034997b7148ba9f710932d46d6d6efff4afd21e9731abf4451be902bf2919081900360200190a25050565b611a366115b5565b611a75576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611a808160036121bf565b611abb5760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611611afd5760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600760205260408120610b3591612cc2565b611b206115b5565b611b5f576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6000611b6b84846109c6565b11611ba75760405162461bcd60e51b8152600401808060200182810382526043815260200180612f606043913960600191505060405180910390fd5b611bb183836109c6565b811115611bef5760405162461bcd60e51b81526004018080602001828103825260568152602001806131506056913960600191505060405180910390fd5b6001600160a01b038316600090815260046020526040902054611c18908263ffffffff6128f516565b6001600160a01b038416600090815260046020908152604080832093909355600a815282822085835290522054611c55908263ffffffff6128f516565b6001600160a01b0384166000818152600a60209081526040808320878452825291829020939093558051848152905185937fadb6c9055c0feacb02aa9190148cd10258a450e92de62f92d0137b0e1bfe00bd928290030190a3505050565b6000611cc660028563ffffffff61293716565b611cd257506001610feb565b611ce360028463ffffffff61293716565b611cef57506002610feb565b611d0060018563ffffffff61293716565b15611d0d57506003610feb565b611d1e60018463ffffffff61293716565b15611d2b57506004610feb565b6001600160a01b038416600090815260036020526040902054821115611d5357506005610feb565b6001600160a01b0384166000908152600460209081526040808320546003909252909120548391611d8a919063ffffffff6128f516565b1015611d9857506006610feb565b506000610feb565b611da86115b5565b611de7576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b60005b81811015611e2957611e21838383818110611e0157fe5b905060200201356001600160a01b0316600261299e90919063ffffffff16565b600101611dea565b505050565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205490565b611e616115b5565b611ea0576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611eab8160026121bf565b611ee65760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b60648160ff1611611f285760405162461bcd60e51b8152600401808060200182810382526045815260200180612fc86045913960600191505060405180910390fd5b60ff81166000908152600660205260408120610b3591612cc2565b611f4b6115b5565b611f8a576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b610b3581612a1f565b611f9b6115b5565b611fda576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b611fe58160046121bf565b6120205760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b61203160018363ffffffff61299e16565b6040805160ff8316815290516001600160a01b038416917f919e3dd5d3bfd72e817c243f80bc0a74ddf1f953a7c97b1d6298aaa4a8e3de64919081900360200190a25050565b61207f6115b5565b6120be576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6120c98160036121bf565b6121045760405162461bcd60e51b8152600401808060200182810382526025815260200180612df86025913960400191505060405180910390fd5b61210e8383612abf565b6040805183815260ff8316602082015281516001600160a01b038616927f29600984795369456176b31dad545cb35585021faea93dcc568a467a737ad425928290030190a2505050565b6121628282612937565b61219d5760405162461bcd60e51b8152600401808060200182810382526021815260200180612eb46021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6000606060ff8316600114156122725760ff841660009081526005602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b820191906000526020600020905b81548152906001019060200180831161224957829003601f168201915b5050505050905061240d565b60ff8316600214156122ea5760ff841660009081526006602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b60ff8316600314156123625760ff841660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156122665780601f1061223b57610100808354040283529160200191612266565b60ff83166004141561240d5760ff841660009081526008602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156124055780601f106123da57610100808354040283529160200191612405565b820191906000526020600020905b8154815290600101906020018083116123e857829003601f168201915b505050505090505b805161241d5760009150506109eb565b60019150506109eb565b3390565b6001600160a01b0383166124705760405162461bcd60e51b81526004018080602001828103825260248152602001806130326024913960400191505060405180910390fd5b6001600160a01b0382166124b55760405162461bcd60e51b8152600401808060200182810382526022815260200180612db06022913960400191505060405180910390fd5b6001600160a01b03808416600081815260096020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b61251f6115b5565b61255e576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b0382166125a35760405162461bcd60e51b8152600401808060200182810382526021815260200180612f3f6021913960400191505060405180910390fd5b6125e681604051806060016040528060228152602001612d40602291396001600160a01b038516600090815260036020526040902054919063ffffffff61280416565b6001600160a01b038316600090815260036020526040902055600b54612612908263ffffffff6128f516565b600b556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6001600160a01b03831661269f5760405162461bcd60e51b8152600401808060200182810382526025815260200180612fa36025913960400191505060405180910390fd5b6001600160a01b0382166126e45760405162461bcd60e51b8152600401808060200182810382526023815260200180612d1d6023913960400191505060405180910390fd5b60006126f1848484611cb3565b60ff16146127305760405162461bcd60e51b81526004018080602001828103825260928152602001806130566092913960a00191505060405180910390fd5b61277381604051806060016040528060268152602001612dd2602691396001600160a01b038616600090815260036020526040902054919063ffffffff61280416565b6001600160a01b0380851660009081526003602052604080822093909355908416815220546127a8908263ffffffff61289b16565b6001600160a01b0380841660008181526003602090815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b600081848411156128935760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612858578181015183820152602001612840565b50505050905090810190601f1680156128855780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610feb576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000610feb83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612804565b60006001600160a01b03821661297e5760405162461bcd60e51b8152600401808060200182810382526022815260200180612f1d6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6129a88282612937565b156129fa576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038116612a645760405162461bcd60e51b8152600401808060200182810382526026815260200180612d8a6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612ac76115b5565b612b06576040805162461bcd60e51b81526020600482018190526024820152600080516020612efd833981519152604482015290519081900360640190fd5b6001600160a01b038216612b61576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b612b7260028363ffffffff61293716565b612bad5760405162461bcd60e51b8152600401808060200182810382526028815260200180612d626028913960400191505060405180910390fd5b600b54612bc0908263ffffffff61289b16565b600b556001600160a01b038216600090815260036020526040902054612bec908263ffffffff61289b16565b6001600160a01b03831660008181526003602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612c855782800160ff19823516178555612cb2565b82800160010185558215612cb2579182015b82811115612cb2578235825591602001919060010190612c97565b50612cbe929150612d02565b5090565b50805460018160011615610100020316600290046000825580601f10612ce85750610b35565b601f016020900490600052602060002090810190610b3591905b610a8591905b80821115612cbe5760008155600101612d0856fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636543524f57444c49544f4b454e3a2061646472657373206973206e6f7420696e206b7963206c6973744f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636543524f57444c49544f4b454e3a2054686520636f646520646f6573206e6f7420657869737443726f77646c69546f6b656e3a204e6f7420656e6f75676820756e616c6c6f636174656420746f6b656e7320746f20616c6c6f63617465207468652072657175657374656420616d6f756e7443524f57444c49544f4b454e3a20546f2072656d6f766520736f6d656f6e652066726f6d207468652077686974656c697374207468652062616c616e6365206861766520746f2062652030526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572526f6c65733a206163636f756e7420697320746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f206164647265737343524f57444c49544f4b454e3a205468652070726f706572747920686173206e6f20616c6c6f636174656420746f6b656e7320666f722074686174206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373455243313430343a20436f6465732074696c6c20313030206172652072657365727665726420666f722074686520536d617274436f6e747261637420696e7465726e616c7343524f57444c49544f4b454e3a2054686520636f646520616c72656164792065786973747345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737343524f57444c49544f4b454e3a205472616e736665727265737472696374696f6e20646574656374656420706c656173652063616c6c206465746563745472616e736665725265737472696374696f6e28616464726573732066726f6d2c206164647265737320746f2c2075696e743235362076616c75652920666f722064657461696c656420696e666f726d6174696f6e43524f57444c49544f4b454e3a2054686572652061726520746f6b656e20616c6c6f636174696f6e732c20697473206e6f7420616c6c6f77656420746f206275726e20746f6b656e732069662074686572652061726520746f6b656e20616c6c6f636174696f6e7343524f57444c49544f4b454e3a20546865726520617265206e6f7420656e6f75676820616c6c6f636174656420746f6b656e7320746f20756e616c6c6f63617465207468652072657175657374656420616d6f756e7445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa265627a7a723158202f59b9c85a0f9be9e5f094fa513032354613b182c9bfd66b21bbd373cf044a9764736f6c63430005110032

Deployed Bytecode Sourcemap

153:21420:1:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;153:21420:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14746:162;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14746:162:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3223:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3223:83:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13451:261;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13451:261:1;-1:-1:-1;;;;;13451:261:1;;:::i;:::-;;15914:319;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15914:319:1;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;15914:319:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15914:319:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;15914:319:1;;-1:-1:-1;15914:319:1;-1:-1:-1;15914:319:1;:::i;5017:154::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5017:154:1;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;17966:294;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17966:294:1;;;;:::i;11716:222::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11716:222:1;;;;:::i;3699:93::-;;;:::i;14519:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14519:109:1;-1:-1:-1;;;;;14519:109:1;;:::i;10010:410::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10010:410:1;;-1:-1:-1;;;;;10010:410:1;;;;;;;;;;;;;:::i;5484:306::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;5484:306:1;;;;;;;;;;;;;;;;;:::i;18477:507::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18477:507:1;;;;;;;;;;;;;:::i;3539:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6057:212;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6057:212:1;;;;;;;;:::i;16768:356::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16768:356:1;;;;:::i;11406:222::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11406:222:1;;;;:::i;3875:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3875:112:1;-1:-1:-1;;;;;3875:112:1;;:::i;1679:137:5:-;;;:::i;11050:268:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11050:268:1;;;;:::i;15033:340::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15033:340:1;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;15033:340:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15033:340:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;15033:340:1;;-1:-1:-1;15033:340:1;-1:-1:-1;15033:340:1;:::i;894:77:5:-;;;:::i;:::-;;;;-1:-1:-1;;;;;894:77:5;;;;;;;;;;;;;;1245:92;;;:::i;3372:87:1:-;;;:::i;15484:319::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15484:319:1;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;15484:319:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15484:319:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;15484:319:1;;-1:-1:-1;15484:319:1;-1:-1:-1;15484:319:1;:::i;16346:322::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16346:322:1;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;16346:322:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16346:322:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;16346:322:1;;-1:-1:-1;16346:322:1;-1:-1:-1;16346:322:1;:::i;6630:263::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6630:263:1;;;;;;;;:::i;4211:160::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4211:160:1;;;;;;;;:::i;12027:228::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12027:228:1;;;;:::i;14144:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14144:277:1;;-1:-1:-1;;;;;14144:277:1;;;;;;;;:::i;17587:291::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17587:291:1;;;;:::i;19203:639::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19203:639:1;;;;;;;;;;;;;:::i;12376:708::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12376:708:1;;;;;;;;;;;;;;;;;:::i;13161:218::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13161:218:1;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;13161:218:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13161:218:1;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;13161:218:1;;-1:-1:-1;13161:218:1;-1:-1:-1;13161:218:1;:::i;4650:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4650:136:1;;;;;;;;;;:::i;17210:291::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17210:291:1;;;;:::i;1965:107:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1965:107:5;-1:-1:-1;;;;;1965:107:5;;:::i;13791:269:1:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13791:269:1;;-1:-1:-1;;;;;13791:269:1;;;;;;;;:::i;10700:255::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10700:255:1;;-1:-1:-1;;;;;10700:255:1;;;;;;;;;;;;;:::i;14746:162::-;-1:-1:-1;;;;;14856:27:1;;14829:7;14856:27;;;:20;:27;;;;;;;;:44;;;;;;;;;14746:162;;;;;:::o;3223:83::-;3293:5;3286:12;;;;;;;;-1:-1:-1;;3286:12:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3260:13;;3286:12;;3293:5;;3286:12;;3293:5;3286:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3223:83;;:::o;13451:261::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;13548:29:1;;;;;;:9;:29;;;;;;:34;13540:122;;;;-1:-1:-1;;;13540:122:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13673:31;:4;13685:18;13673:31;:11;:31;:::i;:::-;13451:261;:::o;15914:319::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;16012:30:1;16022:4;1716:1;16012:9;:30::i;:::-;16011:31;16003:81;;;;-1:-1:-1;;;16003:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16110:3;16103:4;:10;;;16095:92;;;;-1:-1:-1;;;16095:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16198:16;;;;;;;:10;:16;;;;;:27;;16217:8;;16198:27;:::i;:::-;;15914:319;;;:::o;5017:154::-;5085:4;5102:39;5111:12;:10;:12::i;:::-;5125:7;5134:6;5102:8;:39::i;:::-;-1:-1:-1;5159:4:1;5017:154;;;;:::o;17966:294::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;18041:31:1;18051:4;1765:1;18041:9;:31::i;:::-;18033:81;;;;-1:-1:-1;;;18033:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18140:3;18133:4;:10;;;18125:92;;;;-1:-1:-1;;;18125:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18235:17;;;;;;;:11;:17;;;;;18228:24;;;:::i;11716:222::-;11783:13;11816:34;11826:8;1716:1;11816:9;:34::i;:::-;11808:84;;;;-1:-1:-1;;;11808:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11910:20;;;;;;;:10;:20;;;;;;;;;11903:27;;;;;;-1:-1:-1;;11903:27:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11910:20;;11903:27;;11910:20;11903:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11716:222;;;:::o;3699:93::-;3772:12;;3699:93;:::o;14519:109::-;-1:-1:-1;;;;;14603:17:1;14580:7;14603:17;;;:10;:17;;;;;;;14519:109::o;10010:410::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;10107:30:1;10117:4;1668:1;10107:9;:30::i;:::-;10099:80;;;;-1:-1:-1;;;10099:80:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10198:24;10214:7;10198:15;:24::i;:::-;:29;10190:146;;;;-1:-1:-1;;;10190:146:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10347:22;10353:7;10362:6;10347:5;:22::i;:::-;10385:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;10385:27:1;;;;;;;;;;;10010:410;;;:::o;5484:306::-;5575:4;5592:36;5602:6;5610:9;5621:6;5592:9;:36::i;:::-;5639:121;5648:6;5656:12;:10;:12::i;:::-;5670:89;5708:6;5670:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5670:19:1;;;;;;:11;:19;;;;;;5690:12;:10;:12::i;:::-;-1:-1:-1;;;;;5670:33:1;;;;;;;;;;;;-1:-1:-1;5670:33:1;;;:89;;:37;:89;:::i;:::-;5639:8;:121::i;:::-;-1:-1:-1;5778:4:1;5484:306;;;;;;:::o;18477:507::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;18662:6:1;18636:22;18652:5;18636:15;:22::i;:::-;-1:-1:-1;;;;;18617:16:1;;;;;;:9;:16;;;;;;:41;:51;;18609:140;;;;-1:-1:-1;;;18609:140:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18780:17:1;;;;;;:10;:17;;;;;;:29;;18802:6;18780:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18760:17:1;;;;;;:10;:17;;;;;;;;:49;;;;18864:20;:27;;;;;:44;;;;;;;:56;;18913:6;18864:56;:48;:56;:::i;:::-;-1:-1:-1;;;;;18817:27:1;;;;;;:20;:27;;;;;;;;:44;;;;;;;;;:103;;;;18936:40;;;;;;;18845:15;;18936:40;;;;;;;;18477:507;;;:::o;3539:83::-;3605:9;;;;3539:83;:::o;6057:212::-;6139:4;6156:83;6165:12;:10;:12::i;:::-;6179:7;6188:50;6227:10;6188:11;:25;6200:12;:10;:12::i;:::-;-1:-1:-1;;;;;6188:25:1;;;;;;;;;;;;;;;;;-1:-1:-1;6188:25:1;;;:34;;;;;;;;;;;:50;:38;:50;:::i;16768:356::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;16860:48:1;16870:15;1620:1;16860:9;:48::i;:::-;16852:98;;;;-1:-1:-1;;;16852:98:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16987:3;16969:15;:21;;;16961:103;;;;-1:-1:-1;;;16961:103:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17082:34;;;;;;;:17;:34;;;;;17075:41;;;:::i;11406:222::-;11473:13;11506:34;11516:8;1668:1;11506:9;:34::i;:::-;11498:84;;;;-1:-1:-1;;;11498:84:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11600:20;;;;;;;:10;:20;;;;;;;;;11593:27;;;;;;-1:-1:-1;;11593:27:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11600:20;;11593:27;;11600:20;11593:27;;;;;;;;;;;;;;;;;;;;;;;;3875:112;-1:-1:-1;;;;;3961:18:1;3934:7;3961:18;;;:9;:18;;;;;;;3875:112::o;1679:137:5:-;1098:9;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;1777:1;1761:6;;1740:40;;-1:-1:-1;;;;;1761:6:5;;;;1740:40;;1777:1;;1740:40;1807:1;1790:19;;-1:-1:-1;;;;;;1790:19:5;;;1679:137::o;11050:268:1:-;11135:13;11168:48;11178:15;1620:1;11168:9;:48::i;:::-;11160:98;;;;-1:-1:-1;;;11160:98:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11276:34;;;;;;;:17;:34;;;;;;;;;11269:41;;;;;;-1:-1:-1;;11269:41:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11276:34;;11269:41;;11276:34;11269:41;;;;;;;;;;;;;;;;;;;;;;;;15033:340;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;15138:37:1;15148:4;1620:1;15138:9;:37::i;:::-;15137:38;15129:88;;;;-1:-1:-1;;;15129:88:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15243:3;15236:4;:10;;;15228:92;;;;-1:-1:-1;;;15228:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15331:23;;;;;;;:17;:23;;;;;:34;;15357:8;;15331:34;:::i;894:77:5:-;932:7;958:6;-1:-1:-1;;;;;958:6:5;894:77;:::o;1245:92::-;1285:4;1324:6;;-1:-1:-1;;;;;1324:6:5;1308:12;:10;:12::i;:::-;-1:-1:-1;;;;;1308:22:5;;1301:29;;1245:92;:::o;3372:87:1:-;3444:7;3437:14;;;;;;;;-1:-1:-1;;3437:14:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3411:13;;3437:14;;3444:7;;3437:14;;3444:7;3437:14;;;;;;;;;;;;;;;;;;;;;;;;15484:319;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;15582:30:1;15592:4;1668:1;15582:9;:30::i;:::-;15581:31;15573:81;;;;-1:-1:-1;;;15573:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15680:3;15673:4;:10;;;15665:92;;;;-1:-1:-1;;;15665:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15768:16;;;;;;;:10;:16;;;;;:27;;15787:8;;15768:27;:::i;16346:322::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;16445:31:1;16455:4;1765:1;16445:9;:31::i;:::-;16444:32;16436:82;;;;-1:-1:-1;;;16436:82:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16544:3;16537:4;:10;;;16529:92;;;;-1:-1:-1;;;16529:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16632:17;;;;;;;:11;:17;;;;;:28;;16652:8;;16632:28;:::i;6630:263::-;6717:4;6734:129;6743:12;:10;:12::i;:::-;6757:7;6766:96;6805:15;6766:96;;;;;;;;;;;;;;;;;:11;:25;6778:12;:10;:12::i;:::-;-1:-1:-1;;;;;6766:25:1;;;;;;;;;;;;;;;;;-1:-1:-1;6766:25:1;;;:34;;;;;;;;;;;:96;;:38;:96;:::i;4211:160::-;4282:4;4299:42;4309:12;:10;:12::i;:::-;4323:9;4334:6;4299:9;:42::i;12027:228::-;12096:13;12129:36;12139:9;1765:1;12129:9;:36::i;:::-;12121:86;;;;-1:-1:-1;;;12121:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12225:22;;;;;;;:11;:22;;;;;;;;;12218:29;;;;;;-1:-1:-1;;12218:29:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12225:22;;12218:29;;12225:22;12218:29;;;;;;;;;;;;;;;;;;;;;;;;14144:277;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;14247:31:1;14257:4;1765:1;14247:9;:31::i;:::-;14239:81;;;;-1:-1:-1;;;14239:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14331:37;:14;14353;14331:37;:21;:37;:::i;:::-;14384:29;;;;;;;;;;-1:-1:-1;;;;;14384:29:1;;;;;;;;;;;;;14144:277;;:::o;17587:291::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;17661:30:1;17671:4;1716:1;17661:9;:30::i;:::-;17653:80;;;;-1:-1:-1;;;17653:80:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17759:3;17752:4;:10;;;17744:92;;;;-1:-1:-1;;;17744:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17854:16;;;;;;;:10;:16;;;;;17847:23;;;:::i;19203:639::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;19374:1:1;19336:35;19349:5;19355:15;19336:12;:35::i;:::-;:39;19328:119;;;;-1:-1:-1;;;19328:119:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19476:35;19489:5;19495:15;19476:12;:35::i;:::-;19466:6;:45;;19458:144;;;;-1:-1:-1;;;19458:144:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19633:17:1;;;;;;:10;:17;;;;;;:29;;19655:6;19633:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;19613:17:1;;;;;;:10;:17;;;;;;;;:49;;;;19720:20;:27;;;;;:44;;;;;;;:56;;19769:6;19720:56;:48;:56;:::i;:::-;-1:-1:-1;;;;;19673:27:1;;;;;;:20;:27;;;;;;;;:44;;;;;;;;;:103;;;;19792:42;;;;;;;19701:15;;19792:42;;;;;;;;19203:639;;;:::o;12376:708::-;12473:5;12494:14;:4;12503;12494:14;:8;:14;:::i;:::-;12490:587;;-1:-1:-1;1870:1:1;12524:27;;12490:587;12573:12;:4;12582:2;12573:12;:8;:12;:::i;:::-;12569:508;;-1:-1:-1;1922:1:1;12601:25;;12569:508;12647:24;:14;12666:4;12647:24;:18;:24;:::i;:::-;12644:433;;;-1:-1:-1;1982:1:1;12687:33;;12644:433;12741:22;:14;12760:2;12741:22;:18;:22;:::i;:::-;12738:339;;;-1:-1:-1;2040:1:1;12779:31;;12738:339;-1:-1:-1;;;;;12831:15:1;;;;;;:9;:15;;;;;;:23;-1:-1:-1;12828:249:1;;;-1:-1:-1;2090:1:1;12870:23;;12828:249;-1:-1:-1;;;;;12934:16:1;;;;;;:10;:16;;;;;;;;;12914:9;:15;;;;;;;12954:5;;12914:37;;:15;:37;:19;:37;:::i;:::-;:45;12911:166;;;-1:-1:-1;2152:1:1;12975:35;;12911:166;-1:-1:-1;1816:1:1;13043:22;;13161:218;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;13266:6:1;13262:110;13276:30;;;13262:110;;;13327:33;13336:20;;13357:1;13336:23;;;;;;;;;;;;;-1:-1:-1;;;;;13336:23:1;13327:4;:8;;:33;;;;:::i;:::-;13308:3;;13262:110;;;;13161:218;;:::o;4650:136::-;-1:-1:-1;;;;;4751:18:1;;;4724:7;4751:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;4650:136::o;17210:291::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;17284:30:1;17294:4;1668:1;17284:9;:30::i;:::-;17276:80;;;;-1:-1:-1;;;17276:80:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17382:3;17375:4;:10;;;17367:92;;;;-1:-1:-1;;;17367:92:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17477:16;;;;;;;:10;:16;;;;;17470:23;;;:::i;1965:107:5:-;1098:9;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;2037:28;2056:8;2037:18;:28::i;13791:269:1:-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;13891:31:1;13901:4;1765:1;13891:9;:31::i;:::-;13883:81;;;;-1:-1:-1;;;13883:81:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13975:34;:14;13994;13975:34;:18;:34;:::i;:::-;14025:27;;;;;;;;;;-1:-1:-1;;;;;14025:27:1;;;;;;;;;;;;;13791:269;;:::o;10700:255::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;10799:30:1;10809:4;1716:1;10799:9;:30::i;:::-;10791:80;;;;-1:-1:-1;;;10791:80:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10882:22;10888:7;10897:6;10882:5;:22::i;:::-;10920:27;;;;;;;;;;;;;;;-1:-1:-1;;;;;10920:27:1;;;;;;;;;;;10700:255;;;:::o;510:180:6:-;589:18;593:4;599:7;589:3;:18::i;:::-;581:64;;;;-1:-1:-1;;;581:64:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;655:20:6;678:5;655:20;;;;;;;;;;;:28;;-1:-1:-1;;655:28:6;;;510:180::o;19907:647:1:-;19976:4;19992:22;20028:33;;;1620:1;20028:33;20025:402;;;20095:23;;;;;;;:17;:23;;;;;;;;;20077:42;;;;;;-1:-1:-1;;20077:42:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20095:23;;20077:42;;20095:23;20077:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20025:402;;;20140:26;;;1668:1;20140:26;20137:290;;;20200:16;;;;;;;:10;:16;;;;;;;;;20182:35;;;;;;-1:-1:-1;;20182:35:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20200:16;;20182:35;;20200:16;20182:35;;;;;;;;;;;;;;;;;;;;;;;;20137:290;20238:26;;;1716:1;20238:26;20235:192;;;20298:16;;;;;;;:10;:16;;;;;;;;;20280:35;;;;;;-1:-1:-1;;20280:35:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20298:16;;20280:35;;20298:16;20280:35;;;;;;;;;;;;;;;;;;;;;;;;20235:192;20336:27;;;1765:1;20336:27;20333:94;;;20397:17;;;;;;;:11;:17;;;;;;;;;20379:36;;;;;;-1:-1:-1;;20379:36:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20397:17;;20379:36;;20397:17;20379:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20333:94;20441:16;;20437:110;;20486:5;20479:12;;;;;20437:110;20531:4;20524:11;;;;;788:96:0;867:10;788:96;:::o;9568:338:1:-;-1:-1:-1;;;;;9662:19:1;;9654:68;;;;-1:-1:-1;;;9654:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9741:21:1;;9733:68;;;;-1:-1:-1;;;9733:68:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9814:18:1;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9866:32;;;;;;;;;;;;;;;;;9568:338;;;:::o;8933:356::-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;9019:21:1;;9011:67;;;;-1:-1:-1;;;9011:67:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9110:68;9133:6;9110:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9110:18:1;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;9089:18:1;;;;;;:9;:18;;;;;:89;9204:12;;:24;;9221:6;9204:24;:16;:24;:::i;:::-;9189:12;:39;9244:37;;;;;;;;9270:1;;-1:-1:-1;;;;;9244:37:1;;;;;;;;;;;;8933:356;;:::o;7217:708::-;-1:-1:-1;;;;;7315:20:1;;7307:70;;;;-1:-1:-1;;;7307:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7396:23:1;;7388:71;;;;-1:-1:-1;;;7388:71:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1816:1;7478:50;7504:6;7511:9;7521:6;7478:25;:50::i;:::-;:69;;;7470:228;;;;-1:-1:-1;;;7470:228:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7729:71;7751:6;7729:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7729:17:1;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;7709:17:1;;;;;;;:9;:17;;;;;;:91;;;;7834:20;;;;;;;:32;;7859:6;7834:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;7811:20:1;;;;;;;:9;:20;;;;;;;;;:55;;;;7882:35;;;;;;;7811:20;;7882:35;;;;;;;;;;;;;7217:708;;;:::o;1732:187:7:-;1818:7;1853:12;1845:6;;;;1837:29;;;;-1:-1:-1;;;1837:29:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1837:29:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1888:5:7;;;1732:187::o;834:176::-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:7;;;;;;;;;;;;;;;;;;;;;;;;;;;1274:134;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;779:200:6:-;851:4;-1:-1:-1;;;;;875:21:6;;867:68;;;;-1:-1:-1;;;867:68:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;952:20:6;:11;:20;;;;;;;;;;;;;;;779:200::o;260:175::-;337:18;341:4;347:7;337:3;:18::i;:::-;336:19;328:63;;;;;-1:-1:-1;;;328:63:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;401:20:6;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;401:27:6;424:4;401:27;;;260:175::o;2173:225:5:-;-1:-1:-1;;;;;2246:22:5;;2238:73;;;;-1:-1:-1;;;2238:73:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2347:6;;;2326:38;;-1:-1:-1;;;;;2326:38:5;;;;2347:6;;;2326:38;;;2374:6;:17;;-1:-1:-1;;;;;;2374:17:5;-1:-1:-1;;;;;2374:17:5;;;;;;;;;;2173:225::o;8209:397:1:-;1098:9:5;:7;:9::i;:::-;1090:54;;;;;-1:-1:-1;;;1090:54:5;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1090:54:5;;;;;;;;;;;;;;;-1:-1:-1;;;;;8295:21:1;;8287:65;;;;;-1:-1:-1;;;8287:65:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;8371:17;:4;8380:7;8371:17;:8;:17;:::i;:::-;8363:70;;;;-1:-1:-1;;;8363:70:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8459:12;;:24;;8476:6;8459:24;:16;:24;:::i;:::-;8444:12;:39;-1:-1:-1;;;;;8515:18:1;;;;;;:9;:18;;;;;;:30;;8538:6;8515:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;8494:18:1;;;;;;:9;:18;;;;;;;;:51;;;;8561:37;;;;;;;8494:18;;;;8561:37;;;;;;;;;;8209:397;;:::o;153:21420::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;153:21420:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;153:21420:1;;;-1:-1:-1;153:21420:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://2f59b9c85a0f9be9e5f094fa513032354613b182c9bfd66b21bbd373cf044a97
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.