ETH Price: $3,849.37 (-0.90%)
Gas: 9 Gwei

Token

Draggable ServiceHunter AG Shares (DSHS)
 

Overview

Max Total Supply

284 DSHS

Holders

10

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

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:
DraggableServiceHunterShares

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/SafeMath.sol

/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;

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

library SafeMath {

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

        c = a * b;
        assert(c / a == b);
        return c;
    }

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

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

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

// File: contracts/IERC20.sol

/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;

/**
 * @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.
     *
     * > 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: contracts/ERC20.sol

/**
* MIT License
*
* Copyright (c) 2016-2019 zOS Global Limited
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;



/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */

contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See `IERC20.transfer`.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev See `IERC20.transferFrom`.
     *
     * Emits an `Approval` event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of `ERC20`;
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * Emits an `Approval` event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to `approve` that can be used as a mitigation for
     * problems described in `IERC20.approve`.
     *
     * 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) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to `transfer`, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * 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");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev 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 {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     /**
     * @dev 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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an `Approval` event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

// File: contracts/ERC20Claimable.sol

/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;




/**
 * @title Claimable
 * In case of tokens that represent real-world assets such as shares of a company, one needs a way
 * to handle lost private keys. With physical certificates, courts can declare share certificates as
 * invalid so the company can issue replacements. Here, we want a solution that does not depend on
 * third parties to resolve such cases. Instead, when someone has lost a private key, he can use the
 * declareLost function to post a deposit and claim that the shares assigned to a specific address are
 * lost. To prevent front running, a commit reveal scheme is used. If he actually is the owner of the shares,
 * he needs to wait for a certain period and can then reclaim the lost shares as well as the deposit.
 * If he is an attacker trying to claim shares belonging to someone else, he risks losing the deposit
 * as it can be claimed at anytime by the rightful owner.
 * Furthermore, if "getClaimDeleter" is defined in the subclass, the returned address is allowed to
 * delete claims, returning the collateral. This can help to prevent obvious cases of abuse of the claim
 * function.
 */

contract ERC20Claimable is ERC20 {

    using SafeMath for uint256;
    using SafeMath for uint32;

    // A struct that represents a claim made
    struct Claim {
        address claimant; // the person who created the claim
        uint256 collateral; // the amount of collateral deposited
        uint32 timestamp;  // the timestamp of the block in which the claim was made
        address currencyUsed; // The currency (XCHF) can be updated, we record the currency used for every request
    }

    // Every claim must be preceded by an obscured preclaim in order to prevent front-running
    struct PreClaim {
        bytes32 msghash; // the hash of nonce + address to be claimed
        uint256 timestamp;  // the timestamp of the block in which the preclaim was made
    }

    uint256 public claimPeriod = 180 days; // Default of 180 days;
    uint256 public preClaimPeriod = 1 days; // One day. Minimum waiting period between preClaim and Claim;
    uint256 public preClaimPeriodEnd = 2 days; // Two days. Maximum waiting period between preClaim and Claim;

    mapping(address => Claim) public claims; // there can be at most one claim per address, here address is claimed address
    mapping(address => PreClaim) public preClaims; // there can be at most one preclaim per address, here address is claimer
    mapping(address => bool) public claimingDisabled; // disable claimability (e.g. for long term storage)

    // ERC-20 token that can be used as collateral or 0x0 if disabled
    address public customCollateralAddress;
    uint256 public customCollateralRate;

    /**
     * Returns the collateral rate for the given collateral type and 0 if that type
     * of collateral is not accepted. By default, only the token itself is accepted at
     * a rate of 1:1.
     *
     * Subclasses should override this method if they want to add additional types of
     * collateral.
     */
    function getCollateralRate(address collateralType) public view returns (uint256) {
        if (collateralType == address(this)) {
            return 1;
        } else if (collateralType == customCollateralAddress) {
            return customCollateralRate;
        } else {
            return 0;
        }
    }

    /**
     * Allows subclasses to set a custom collateral besides the token itself.
     * The collateral must be an ERC-20 token that returns true on successful transfers and
     * throws an exception or returns false on failure.
     * Also, do not forget to multiply the rate in accordance with the number of decimals of the collateral.
     * For example, rate should be 7*10**18 for 7 units of a collateral with 18 decimals.
     */
    function _setCustomClaimCollateral(address collateral, uint256 rate) internal {
        customCollateralAddress = collateral;
        if (customCollateralAddress == address(0)) {
            customCollateralRate = 0; // disabled
        } else {
            require(rate > 0, "Collateral rate can't be zero");
            customCollateralRate = rate;
        }
        emit CustomClaimCollateralChanged(collateral, rate);
    }

    function getClaimDeleter() public returns (address);

    /**
     * Allows subclasses to change the claim period, but not to fewer than 90 days.
     */
    function _setClaimPeriod(uint256 claimPeriodInDays) internal {
        require(claimPeriodInDays > 90, "Claim period must be at least 90 days"); // must be at least 90 days
        uint256 claimPeriodInSeconds = claimPeriodInDays.mul(1 days);
        claimPeriod = claimPeriodInSeconds;
        emit ClaimPeriodChanged(claimPeriod);
    }

    function setClaimable(bool enabled) public {
        claimingDisabled[msg.sender] = !enabled;
    }

    /**
     * Some users might want to disable claims for their address completely.
     * For example if they use a deep cold storage solution or paper wallet.
     */
    function isClaimsEnabled(address target) public view returns (bool) {
        return !claimingDisabled[target];
    }

    event ClaimMade(address indexed lostAddress, address indexed claimant, uint256 balance);
    event ClaimPrepared(address indexed claimer);
    event ClaimCleared(address indexed lostAddress, uint256 collateral);
    event ClaimDeleted(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimResolved(address indexed lostAddress, address indexed claimant, uint256 collateral);
    event ClaimPeriodChanged(uint256 newClaimPeriodInDays);
    event CustomClaimCollateralChanged(address newCustomCollateralAddress, uint256 newCustomCollareralRate);

  /** Anyone can declare that the private key to a certain address was lost by calling declareLost
    * providing a deposit/collateral. There are three possibilities of what can happen with the claim:
    * 1) The claim period expires and the claimant can get the deposit and the shares back by calling resolveClaim
    * 2) The "lost" private key is used at any time to call clearClaim. In that case, the claim is deleted and
    *    the deposit sent to the shareholder (the owner of the private key). It is recommended to call resolveClaim
    *    whenever someone transfers funds to let claims be resolved automatically when the "lost" private key is
    *    used again.
    * 3) The owner deletes the claim and assigns the deposit to the claimant. This is intended to be used to resolve
    *    disputes. Generally, using this function implies that you have to trust the issuer of the tokens to handle
    *    the situation well. As a rule of thumb, the contract owner should assume the owner of the lost address to be the
    *    rightful owner of the deposit.
    * It is highly recommended that the owner observes the claims made and informs the owners of the claimed addresses
    * whenever a claim is made for their address (this of course is only possible if they are known to the owner, e.g.
    * through a shareholder register).
    * To prevent frontrunning attacks, a claim can only be made if the information revealed when calling "declareLost"
    * was previously commited using the "prepareClaim" function.
    */
    function prepareClaim(bytes32 hashedpackage) public {
        preClaims[msg.sender] = PreClaim({
            msghash: hashedpackage,
            timestamp: block.timestamp
        });
        emit ClaimPrepared(msg.sender);
    }

    function validateClaim(address lostAddress, bytes32 nonce) private view {
        PreClaim memory preClaim = preClaims[msg.sender];
        require(preClaim.msghash != 0, "Message hash can't be zero");
        require(preClaim.timestamp.add(preClaimPeriod) <= block.timestamp, "Preclaim period violated. Claimed too early");
        require(preClaim.timestamp.add(preClaimPeriodEnd) >= block.timestamp, "Preclaim period end. Claimed too late");
        require(preClaim.msghash == keccak256(abi.encodePacked(nonce, msg.sender, lostAddress)),"Package could not be validated");
    }

    function declareLost(address collateralType, address lostAddress, bytes32 nonce) public {
        require(lostAddress != address(0), "Can't claim zero address");
        require(isClaimsEnabled(lostAddress), "Claims disabled for this address");
        uint256 collateralRate = getCollateralRate(collateralType);
        require(collateralRate > 0, "Unsupported collateral type");
        address claimant = msg.sender;
        uint256 balance = balanceOf(lostAddress);
        uint256 collateral = balance.mul(collateralRate);
        IERC20 currency = IERC20(collateralType);
        require(balance > 0, "Claimed address holds no shares");
        require(currency.allowance(claimant, address(this)) >= collateral, "Currency allowance insufficient");
        require(currency.balanceOf(claimant) >= collateral, "Currency balance insufficient");
        require(claims[lostAddress].collateral == 0, "Address already claimed");
        validateClaim(lostAddress, nonce);
        require(currency.transferFrom(claimant, address(this), collateral), "Collateral transfer failed");

        claims[lostAddress] = Claim({
            claimant: claimant,
            collateral: collateral,
            timestamp: uint32(block.timestamp), // block timestamp is in seconds --> Should not overflow
            currencyUsed: collateralType
        });

        delete preClaims[claimant];
        emit ClaimMade(lostAddress, claimant, balance);
    }

    function getClaimant(address lostAddress) public view returns (address) {
        return claims[lostAddress].claimant;
    }

    function getCollateral(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].collateral;
    }

    function getCollateralType(address lostAddress) public view returns (address) {
        return claims[lostAddress].currencyUsed;
    }

    function getTimeStamp(address lostAddress) public view returns (uint256) {
        return claims[lostAddress].timestamp;
    }

    function getPreClaimTimeStamp(address claimerAddress) public view returns (uint256) {
        return preClaims[claimerAddress].timestamp;
    }

    function getMsgHash(address claimerAddress) public view returns (bytes32) {
        return preClaims[claimerAddress].msghash;
    }

    function transfer(address recipient, uint256 amount) public returns (bool) {
        require(super.transfer(recipient, amount), "Transfer failed");
        clearClaim();
        return true;
    }

    /**
     * Clears a claim after the key has been found again and assigns the collateral to the "lost" address.
     * This is the price an adverse claimer pays for filing a false claim and makes it risky to do so.
     */
    function clearClaim() public {
        if (claims[msg.sender].collateral != 0) {
            uint256 collateral = claims[msg.sender].collateral;
            IERC20 currency = IERC20(claims[msg.sender].currencyUsed);
            delete claims[msg.sender];
            require(currency.transfer(msg.sender, collateral), "Collateral transfer failed");
            emit ClaimCleared(msg.sender, collateral);
        }
    }

   /**
    * After the claim period has passed, the claimant can call this function to send the
    * tokens on the lost address as well as the collateral to himself.
    */
    function resolveClaim(address lostAddress) public {
        Claim memory claim = claims[lostAddress];
        uint256 collateral = claim.collateral;
        IERC20 currency = IERC20(claim.currencyUsed);
        require(collateral != 0, "No claim found");
        require(claim.claimant == msg.sender, "Only claimant can resolve claim");
        require(claim.timestamp.add(uint32(claimPeriod)) <= block.timestamp, "Claim period not over yet");
        address claimant = claim.claimant;
        delete claims[lostAddress];
        require(currency.transfer(claimant, collateral), "Collateral transfer failed");
        _transfer(lostAddress, claimant, balanceOf(lostAddress));
        emit ClaimResolved(lostAddress, claimant, collateral);
    }

    /**
     * This function is to be executed by the owner only in case a dispute needs to be resolved manually.
     */
    function deleteClaim(address lostAddress) public {
        require(msg.sender == getClaimDeleter(), "You cannot delete claims");
        Claim memory claim = claims[lostAddress];
        IERC20 currency = IERC20(claim.currencyUsed);
        require(claim.collateral != 0, "No claim found");
        delete claims[lostAddress];
        require(currency.transfer(claim.claimant, claim.collateral), "Collateral transfer failed");
        emit ClaimDeleted(lostAddress, claim.claimant, claim.collateral);
    }

}

// File: contracts/Acquisition.sol

/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;



/**
 * @title Acquisition Attempt
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 *
 */

contract Acquisition {

    using SafeMath for uint256;

    uint256 public constant VOTING_PERIOD = 60 days;    // 2months/60days
    uint256 public constant VALIDITY_PERIOD = 90 days;  // 3months/90days

    uint256 public quorum;                              // Percentage of votes needed to start drag-along process

    address private parent;                             // the parent contract
    address payable public buyer;                       // the person who made the offer
    uint256 public price;                               // the price offered per share (in XCHF base units, so 10**18 is 1 XCHF)
    uint256 public timestamp;                           // the timestamp of the block in which the acquisition was created

    uint256 public noVotes;                             // number of tokens voting for no
    uint256 public yesVotes;                            // number of tokens voting for yes

    enum Vote { NONE, YES, NO }                         // Used internally, represents not voted yet or yes/no vote.
    mapping (address => Vote) private votes;            // Who votes what

    event VotesChanged(uint256 newYesVotes, uint256 newNoVotes);

    constructor (address payable buyer_, uint256 price_, uint256 quorum_) public {
        require(price_ > 0, "Price cannot be zero");
        parent = msg.sender;
        buyer = buyer_;
        price = price_;
        quorum = quorum_;
        timestamp = block.timestamp;
    }

    function isWellFunded(address currency_, uint256 sharesToAcquire) public view returns (bool) {
        IERC20 currency = IERC20(currency_);
        uint256 buyerXCHFBalance = currency.balanceOf(buyer);
        uint256 buyerXCHFAllowance = currency.allowance(buyer, parent);
        uint256 xchfNeeded = sharesToAcquire.mul(price);
        return xchfNeeded <= buyerXCHFBalance && xchfNeeded <= buyerXCHFAllowance;
    }

    function isQuorumReached() public view returns (bool) {
        if (isVotingOpen()) {
            // is it already clear that 75% will vote yes even though the vote is not over yet?
            return yesVotes.mul(10000).div(IERC20(parent).totalSupply()) >= quorum;
        } else {
            // did 75% of all cast votes say 'yes'?
            return yesVotes.mul(10000).div(yesVotes.add(noVotes)) >= quorum;
        }
    }

    function quorumHasFailed() public view returns (bool) {
        if (isVotingOpen()) {
            // is it already clear that 25% will vote no even though the vote is not over yet?
            return (IERC20(parent).totalSupply().sub(noVotes)).mul(10000).div(IERC20(parent).totalSupply()) < quorum;
        } else {
            // did 25% of all cast votes say 'no'?
            return yesVotes.mul(10000).div(yesVotes.add(noVotes)) < quorum;
        }
    }

    function adjustVotes(address from, address to, uint256 value) public parentOnly() {
        if (isVotingOpen()) {
            Vote fromVoting = votes[from];
            Vote toVoting = votes[to];
            update(fromVoting, toVoting, value);
        }
    }

    function update(Vote previousVote, Vote newVote, uint256 votes_) internal {
        if (previousVote != newVote) {
            if (previousVote == Vote.NO) {
                noVotes = noVotes.sub(votes_);
            } else if (previousVote == Vote.YES) {
                yesVotes = yesVotes.sub(votes_);
            }
            if (newVote == Vote.NO) {
                noVotes = noVotes.add(votes_);
            } else if (newVote == Vote.YES) {
                yesVotes = yesVotes.add(votes_);
            }
            emit VotesChanged(yesVotes, noVotes);
        }
    }

    function isVotingOpen() public view returns (bool) {
        uint256 age = block.timestamp.sub(timestamp);
        return age <= VOTING_PERIOD;
    }

    function hasExpired() public view returns (bool) {
        uint256 age = block.timestamp.sub(timestamp);
        return age > VALIDITY_PERIOD;
    }

    modifier votingOpen() {
        require(isVotingOpen(), "The vote has ended.");
        _;
    }

    function voteYes(address sender, uint256 votes_) public parentOnly() votingOpen() {
        vote(Vote.YES, votes_, sender);
    }

    function voteNo(address sender, uint256 votes_) public parentOnly() votingOpen() {
        vote(Vote.NO, votes_, sender);
    }

    function vote(Vote yesOrNo, uint256 votes_, address voter) internal {
        Vote previousVote = votes[voter];
        Vote newVote = yesOrNo;
        votes[voter] = newVote;
        update(previousVote, newVote, votes_);
    }

    function hasVotedYes(address voter) public view returns (bool) {
        return votes[voter] == Vote.YES;
    }

    function hasVotedNo(address voter) public view returns (bool) {
        return votes[voter] == Vote.NO;
    }

    function kill() public parentOnly() {
        // destroy the contract and send leftovers to the buyer.
        selfdestruct(buyer);
    }

    modifier parentOnly () {
        require(msg.sender == parent, "Can only be called by parent contract");
        _;
    }
}

// File: contracts/IMigratable.sol

/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;

contract IMigratable {
    function migrationToContract() public returns (address);
}

// File: contracts/ERC20Draggable.sol

/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;






/**
 * @title Alethena SHA
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 * @dev These tokens are based on the ERC20 standard and the open-zeppelin library.
 *
 * This is an ERC-20 token representing shares of ServiceHunter AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'
 * of the 'DraggableServiceHunterShares' contract. The agreement is partially enforced
 * through the Swiss legal system, and partially enforced through this smart contract.
 * In particular, this smart contract implements a drag-along clause which allows the
 * majority of token holders to force the minority sell their shares along with them in
 * case of an acquisition. That's why the tokens are called "Draggable ServiceHunter AG Shares."
 */

contract ERC20Draggable is ERC20 {

    using SafeMath for uint256;

    IERC20 private wrapped;                        // The wrapped contract

    // If the wrapped tokens got replaced in an acquisition, unwrapping might yield many currency tokens
    uint256 public unwrapConversionFactor = 1;

    // The current acquisition attempt, if any. See initiateAcquisition to see the requirements to make a public offer.
    Acquisition public offer;

    IERC20 private currency;

    address public offerFeeRecipient;              // Recipient of the fee. Fee makes sure the offer is serious.

    uint256 public offerFee;             // Fee of 5000 XCHF
    uint256 public migrationQuorum;      // Number of tokens that need to be migrated to complete migration
    uint256 public acquisitionQuorum;

    uint256 constant MIN_OFFER_INCREMENT = 10500;  // New offer must be at least 105% of old offer
    uint256 constant MIN_HOLDING = 500;            // Need at least 5% of all drag along tokens to make an offer
    uint256 constant MIN_DRAG_ALONG_QUOTA = 3000;  // 30% of the equity needs to be represented by drag along tokens for an offer to be made

    bool public active = true;                     // True as long as this contract is legally binding and the wrapped tokens are locked.

    event OfferCreated(address indexed buyer, uint256 pricePerShare);
    event OfferEnded(address indexed buyer, address sender, bool success, string message);
    event MigrationSucceeded(address newContractAddress);

    /**
     * CurrencyAddress specifies the currency used in acquisitions. The currency must be
     * an ERC-20 token that returns true on successful transfers and throws an exception or
     * returns false on failure. It can only be updated later if the currency supports the
     * IMigratable interface.
     */
    constructor(
        address wrappedToken,
        uint256 migrationQuorumInBIPS_,
        uint256 acquisitionQuorum_,
        address currencyAddress,
        address offerFeeRecipient_,
        uint offerFee_
    ) public {
        wrapped = IERC20(wrappedToken);
        offerFeeRecipient = offerFeeRecipient_;
        offerFee = offerFee_;
        migrationQuorum = migrationQuorumInBIPS_;
        acquisitionQuorum = acquisitionQuorum_;
        currency = IERC20(currencyAddress);
        IShares(wrappedToken).totalShares();
    }

    function getWrappedContract() public view returns (address) {
        return address(wrapped);
    }

    function getCurrencyContract() public view returns (address) {
        return address(currency);
    }

    function updateCurrency(address newCurrency) public noOfferPending () {
        require(active, "Contract is not active");
        require(IMigratable(getCurrencyContract()).migrationToContract() == newCurrency, "Invalid currency update");
        currency = IERC20(newCurrency);
    }

    /** Increases the number of drag-along tokens. Requires minter to deposit an equal amount of share tokens */
    function wrap(address shareholder, uint256 amount) public noOfferPending() {
        require(active, "Contract not active any more.");
        require(wrapped.balanceOf(msg.sender) >= amount, "Share balance not sufficient");
        require(wrapped.allowance(msg.sender, address(this)) >= amount, "Share allowance not sufficient");
        require(wrapped.transferFrom(msg.sender, address(this), amount), "Share transfer failed");
        _mint(shareholder, amount);
    }

    /** Decrease the number of drag-along tokens. The user gets back their shares in return */
    function unwrap(uint256 amount) public {
        require(!active, "As long as the contract is active, you are bound to it");
        _burn(msg.sender, amount);
        require(wrapped.transfer(msg.sender, amount.mul(unwrapConversionFactor)), "Share transfer failed");
    }

    /**
     * Burns both the token itself as well as the wrapped token!
     * If you want to get out of the shareholder agreement, use unwrap after it has been
     * deactivated by a majority vote or acquisition.
     *
     * Burning only works if wrapped token supports burning. Also, the exact meaning of this
     * operation might depend on the circumstances. Burning and reussing the wrapped token
     * does not free the sender from the legal obligations of the shareholder agreement.
     */
    function burn(uint256 amount) public {
        _burn(msg.sender, amount);
        IBurnable(getWrappedContract()).burn(amount.mul(unwrapConversionFactor));
    }

  /** @dev Function to start drag-along procedure
   *  This can be called by anyone, but there is an upfront payment.
   */
    function initiateAcquisition(uint256 pricePerShare) public {
        require(active, "An accepted offer exists");
        uint256 totalEquity = IShares(getWrappedContract()).totalShares();
        address buyer = msg.sender;

        require(totalSupply() >= totalEquity.mul(MIN_DRAG_ALONG_QUOTA).div(10000), "This contract does not represent enough equity");
        require(balanceOf(buyer) >= totalEquity.mul(MIN_HOLDING).div(10000), "You need to hold at least 5% of the firm to make an offer");

        require(currency.transferFrom(buyer, offerFeeRecipient, offerFee), "Currency transfer failed");

        Acquisition newOffer = new Acquisition(msg.sender, pricePerShare, acquisitionQuorum);
        require(newOffer.isWellFunded(getCurrencyContract(), totalSupply() - balanceOf(buyer)), "Insufficient funding");
        if (offerExists()) {
            require(pricePerShare >= offer.price().mul(MIN_OFFER_INCREMENT).div(10000), "New offers must be at least 5% higher than the pending offer");
            killAcquisition("Offer was replaced by a higher bid");
        }
        offer = newOffer;

        emit OfferCreated(buyer, pricePerShare);
    }

    function voteYes() public offerPending() {
        address voter = msg.sender;
        offer.voteYes(voter, balanceOf(voter));
    }

    function voteNo() public offerPending() {
        address voter = msg.sender;
        offer.voteNo(voter, balanceOf(voter));
    }

    function cancelAcquisition() public offerPending() {
        require(msg.sender == offer.buyer(), "You are not authorized to cancel this acquisition offer");
        killAcquisition("Cancelled by buyer");
    }

    function contestAcquisition() public offerPending() {
        if (offer.hasExpired()) {
            killAcquisition("Offer expired");
        } else if (offer.quorumHasFailed()) {
            killAcquisition("Not enough support");
        } else if (
            !offer.isWellFunded(
                getCurrencyContract(),
                totalSupply().sub(balanceOf(offer.buyer()))
                )
            ) {
            killAcquisition("Offer was not sufficiently funded");
        } else {
            revert("Acquisition contest unsuccessful");
        }
    }

    function killAcquisition(string memory message) internal {
        address buyer = offer.buyer();
        offer.kill();
        offer = Acquisition(address(0));
        emit OfferEnded(
            buyer,
            msg.sender,
            false,
            message
        );
    }

    function completeAcquisition() public offerPending() {
        address buyer = offer.buyer();
        require(msg.sender == buyer, "You are not authorized to complete this acquisition offer");
        require(offer.isQuorumReached(), "Insufficient number of yes votes");
        require(
            offer.isWellFunded(
            getCurrencyContract(),
            totalSupply().sub(balanceOf(buyer))),
            "Offer insufficiently funded"
            );
        invertHoldings(buyer, currency, offer.price());
        emit OfferEnded(
            buyer,
            msg.sender,
            true,
            "Completed successfully"
        );
    }

    function wasAcquired() public view returns (bool) {
        return offerExists() ? !active : false;
    }

    function invertHoldings(address newOwner, IERC20 newBacking, uint256 conversionRate) internal {
        uint256 buyerBalance = balanceOf(newOwner);
        uint256 initialSupply = totalSupply();
        active = false;
        unwrap(buyerBalance);
        uint256 remaining = initialSupply.sub(buyerBalance);
        require(wrapped.transfer(newOwner, remaining), "Wrapped token transfer failed");
        require(newBacking.transferFrom(newOwner, address(this), conversionRate.mul(remaining)), "Backing transfer failed");

        wrapped = newBacking;
        unwrapConversionFactor = conversionRate;
    }

    function migrate() public {
        require(active, "Contract is not active");
        address successor = msg.sender;
        require(balanceOf(successor) >= totalSupply().mul(migrationQuorum).div(10000), "Quorum not reached");

        if (offerExists()) {
            if (!offer.quorumHasFailed()) {
                voteNo(); // should shut down the offer
                require(offer.quorumHasFailed(), "Quorum has not failed");
            }
            contestAcquisition();
            assert (!offerExists());
        }

        invertHoldings(successor, IERC20(successor), 1);
        emit MigrationSucceeded(successor);
    }

    function _mint(address account, uint256 amount) internal {
        super._mint(account, amount);
        if (offerExists() && active) {
            // never executed in the default implementation as wrap requires no offer
            offer.adjustVotes(address(0), account, amount);
        }
    }

    function _transfer(address from, address to, uint256 value) internal {
        super._transfer(from, to, value);
        if (offerExists() && active) {
            offer.adjustVotes(from, to, value);
        }
    }

    function _burn(address account, uint256 amount) internal {
        require(balanceOf(msg.sender) >= amount, "Balance insufficient");
        super._burn(account, amount);
        if (offerExists() && active) {
            offer.adjustVotes(account, address(0), amount);
        }
    }

    function getPendingOffer() public view returns (address) {
        return address(offer);
    }

    function offerExists() public view returns (bool) {
        return getPendingOffer() != address(0);
    }

    modifier offerPending() {
        require(offerExists() && active, "There is no pending offer");
        _;
    }

    modifier noOfferPending() {
        require(!offerExists(), "There is a pending offer");
        _;
    }

}

contract IShares {
    function totalShares() public returns (uint256);
}

contract IBurnable {
    function burn(uint256) public;
}

// File: contracts/DraggableServiceHunterShares.sol

/**
* MIT License with Automated License Fee Payments
*
* Copyright (c) 2019 Equility AG (alethena.com)
*
* Permission is hereby granted to any person obtaining a copy of this software
* and associated documentation files (the "Software"), to deal in the Software
* without restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* - The above copyright notice and this permission notice shall be included in
*   all copies or substantial portions of the Software.
* - All automated license fee payments integrated into this and related Software
*   are preserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
pragma solidity 0.5.10;



/**
 * @title Draggable ServiceHunter AG Shares
 * @author Benjamin Rickenbacher, [email protected]
 * @author Luzius Meisser, [email protected]
 *
 * This is an ERC-20 token representing shares of ServiceHunter AG that are bound to
 * a shareholder agreement that can be found at the URL defined in the constant 'terms'.
 * The shareholder agreement is partially enforced through this smart contract. The agreement
 * is designed to facilitate a complete acquisition of the firm even if a minority of shareholders
 * disagree with the acquisition, to protect the interest of the minority shareholders by requiring
 * the acquirer to offer the same conditions to everyone when acquiring the company, and to
 * facilitate an update of the shareholder agreement even if a minority of the shareholders that
 * are bound to this agreement disagree. The name "draggable" stems from the convention of calling
 * the right to drag a minority along with a sale of the company "drag-along" rights. The name is
 * chosen to ensure that token holders are aware that they are bound to such an agreement.
 *
 * The percentage of token holders that must agree with an update of the terms is defined by the
 * constant UPDATE_QUORUM. The precentage of yes-votes that is needed to successfully complete an
 * acquisition is defined in the constant ACQUISITION_QUORUM. Note that the update quorum is based
 * on the total number of tokens in circulation. In contrast, the acquisition quorum is based on the
 * number of votes cast during the voting period, not taking into account those who did not bother
 * to vote.
 */

contract DraggableServiceHunterShares is ERC20Claimable, ERC20Draggable {

    string public constant symbol = "DSHS";
    string public constant name = "Draggable ServiceHunter AG Shares";
    string public constant terms = "quitt.ch/investoren";

    uint8 public constant decimals = 0;                  // shares are not divisible

    uint256 public constant UPDATE_QUORUM = 7500;        // 7500 basis points = 75%
    uint256 public constant ACQUISITION_QUORUM = 7500;   // 7500 basis points = 75%
    uint256 public constant OFFER_FEE = 5000 * 10 ** 18; // 5000 XCHF

    /**
     * Designed to be used with the Crypto Franc as currency token. See also parent constructor.
     */
    constructor(address wrappedToken, address xchfAddress, address offerFeeRecipient)
        ERC20Draggable(wrappedToken, UPDATE_QUORUM, ACQUISITION_QUORUM, xchfAddress, offerFeeRecipient, OFFER_FEE) public {
        IClaimable(wrappedToken).setClaimable(false);
    }

    function getClaimDeleter() public returns (address) {
        return IClaimable(getWrappedContract()).getClaimDeleter();
    }

    function getCollateralRate(address collateralType) public view returns (uint256) {
        uint256 rate = super.getCollateralRate(collateralType);
        if (rate > 0) {
            return rate;
        } else if (collateralType == getWrappedContract()) {
            return unwrapConversionFactor;
        } else {
            // If the wrapped contract allows for a specific collateral, we should too.
            // If the wrapped contract is not IClaimable, we will fail here, but would fail anyway.
            return IClaimable(getWrappedContract()).getCollateralRate(collateralType).mul(unwrapConversionFactor);
        }
    }

}

contract IClaimable {
    function setClaimable(bool) public;
    function getCollateralRate(address) public view returns (uint256);
    function getClaimDeleter() public returns (address);
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"active","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"unwrapConversionFactor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"customCollateralAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"completeAcquisition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ACQUISITION_QUORUM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getClaimant","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"claimerAddress","type":"address"}],"name":"getMsgHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"getClaimDeleter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"lostAddress","type":"address"}],"name":"deleteClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"OFFER_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"acquisitionQuorum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"enabled","type":"bool"}],"name":"setClaimable","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getCollateralType","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"voteNo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"pricePerShare","type":"uint256"}],"name":"initiateAcquisition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"preClaims","outputs":[{"name":"msghash","type":"bytes32"},{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getWrappedContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"hashedpackage","type":"bytes32"}],"name":"prepareClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newCurrency","type":"address"}],"name":"updateCurrency","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"customCollateralRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getPendingOffer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"clearClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"contestAcquisition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"claimerAddress","type":"address"}],"name":"getPreClaimTimeStamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"collateralType","type":"address"}],"name":"getCollateralRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"claimPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preClaimPeriodEnd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"offerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"claimingDisabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"migrate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"voteYes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"UPDATE_QUORUM","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"lostAddress","type":"address"}],"name":"resolveClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"migrationQuorum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"offerExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"shareholder","type":"address"},{"name":"amount","type":"uint256"}],"name":"wrap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"offer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"claims","outputs":[{"name":"claimant","type":"address"},{"name":"collateral","type":"uint256"},{"name":"timestamp","type":"uint32"},{"name":"currencyUsed","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"terms","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"unwrap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrencyContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelAcquisition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"collateralType","type":"address"},{"name":"lostAddress","type":"address"},{"name":"nonce","type":"bytes32"}],"name":"declareLost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lostAddress","type":"address"}],"name":"getTimeStamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"wasAcquired","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preClaimPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"}],"name":"isClaimsEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"offerFeeRecipient","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"wrappedToken","type":"address"},{"name":"xchfAddress","type":"address"},{"name":"offerFeeRecipient","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"pricePerShare","type":"uint256"}],"name":"OfferCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"success","type":"bool"},{"indexed":false,"name":"message","type":"string"}],"name":"OfferEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newContractAddress","type":"address"}],"name":"MigrationSucceeded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"ClaimMade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"claimer","type":"address"}],"name":"ClaimPrepared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lostAddress","type":"address"},{"indexed":true,"name":"claimant","type":"address"},{"indexed":false,"name":"collateral","type":"uint256"}],"name":"ClaimResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newClaimPeriodInDays","type":"uint256"}],"name":"ClaimPeriodChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newCustomCollateralAddress","type":"address"},{"indexed":false,"name":"newCustomCollareralRate","type":"uint256"}],"name":"CustomClaimCollateralChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

608060405262ed4e00600355620151806004556202a3006005556001600c8190556013805460ff191690911790553480156200003a57600080fd5b506040516200540538038062005405833981810160405260608110156200006057600080fd5b508051602080830151604093840151600b80546001600160a01b03199081166001600160a01b03808816918217909355600f8054831684861617905569010f0cf064dd592000006010819055611d4c60118190556012819055600e80549094169487169490941790925587517f3a98ef3900000000000000000000000000000000000000000000000000000000815297519697949693958895939485948994899490939092633a98ef399260048181019392918290030181600087803b1580156200012a57600080fd5b505af11580156200013f573d6000803e3d6000fd5b505050506040513d60208110156200015657600080fd5b5050604080517f378c93ad00000000000000000000000000000000000000000000000000000000815260006004820181905291516001600160a01b038c16985063378c93ad9750602480830197509295509350839003019050818387803b158015620001c157600080fd5b505af1158015620001d6573d6000803e3d6000fd5b5050505050505061521880620001ed6000396000f3fe60806040523480156200001157600080fd5b50600436106200040c5760003560e01c806370a082311162000225578063a9059cbb1162000135578063de49468511620000bd578063ec6580e21162000087578063ec6580e21462000ac5578063ee18d99e1462000acf578063f66f145a1462000ad9578063fec21a9c1462000b02576200040c565b8063de4946851462000a4f578063e1b8c38e1462000a59578063e5a8765a1462000a63578063eb470ebf1462000a9c576200040c565b8063c6788bdd11620000ff578063c6788bdd1462000992578063d502562514620009f4578063dd62ed3e14620009fe578063de0e9a3e1462000a2f576200040c565b8063a9059cbb1462000920578063bc1b1e7c146200094f578063bf376c7a1462000959578063c028df061462000988576200040c565b80638fd3ab8011620001b957806395d89b41116200018357806395d89b4114620008b45780639b56d6c914620008be5780639e8a9a5a14620008e7578063a457c2d714620008f1576200040c565b80638fd3ab80146200087757806390cf581c14620008815780639361d7d6146200053857806394d645a8146200088b576200040c565b80637dc2cd9811620001fb5780637dc2cd9814620008305780637dde2a02146200083a5780638760678914620008445780638e0597c1146200084e576200040c565b806370a0823114620007b557806375a88bcf14620007de57806377e071ad1462000807576200040c565b80633549788a1162000321578063493c160f11620002b557806360918117116200027f57806360918117146200078d5780636467c09a14620007975780636b03ed5f14620007a15780636f4b18df14620007ab576200040c565b8063493c160f14620006f857806358047913146200073a5780635b1c162514620007445780635e0276011462000764576200040c565b80633bcc45ba11620002f75780633bcc45ba146200068557806341c12a7014620006ae57806342966c6814620006b85780634900ca5114620006d8576200040c565b80633549788a146200062a578063378c93ad1462000634578063395093511462000656576200040c565b8063198d7fc511620003a55780632a0a4ed5116200036f5780632a0a4ed514620005cd578063313ce56714620005d757806332a7ae9514620005f7578063332a6ee81462000620576200040c565b8063198d7fc514620005385780631e3b9de5146200054257806323b872dd146200056b57806324b50e4314620005a4576200040c565b8063095ea7b311620003e7578063095ea7b314620004cd5780630c6f0e5d14620004fc578063141c7068146200052257806318160ddd146200052e576200040c565b806302fb0c5e146200041157806306fdde03146200042f5780630832e47014620004b1575b600080fd5b6200041b62000b0c565b604080519115158252519081900360200190f35b6200043962000b15565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620004755781810151838201526020016200045b565b50505050905090810190601f168015620004a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b620004bb62000b32565b60408051918252519081900360200190f35b6200041b60048036036040811015620004e557600080fd5b506001600160a01b03813516906020013562000b38565b6200050662000b51565b604080516001600160a01b039092168252519081900360200190f35b6200052c62000b60565b005b620004bb62000f54565b620004bb62000f5a565b62000506600480360360208110156200055a57600080fd5b50356001600160a01b031662000f60565b6200041b600480360360608110156200058357600080fd5b506001600160a01b0381358116916020810135909116906040013562000f81565b620004bb60048036036020811015620005bc57600080fd5b50356001600160a01b031662000fde565b6200050662000ff9565b620005e162001073565b6040805160ff9092168252519081900360200190f35b6200052c600480360360208110156200060f57600080fd5b50356001600160a01b031662001078565b620004bb620012e9565b620004bb620012f7565b6200052c600480360360208110156200064c57600080fd5b50351515620012fd565b6200041b600480360360408110156200066e57600080fd5b506001600160a01b0381351690602001356200131c565b62000506600480360360208110156200069d57600080fd5b50356001600160a01b03166200135b565b6200052c62001384565b6200052c60048036036020811015620006d057600080fd5b503562001469565b6200052c60048036036020811015620006f057600080fd5b5035620014db565b62000721600480360360208110156200071057600080fd5b50356001600160a01b031662001a19565b6040805192835260208301919091528051918290030190f35b6200050662001a32565b6200052c600480360360208110156200075c57600080fd5b503562001a41565b6200052c600480360360208110156200077c57600080fd5b50356001600160a01b031662001a9c565b620004bb62001c40565b6200050662001c46565b6200052c62001c55565b6200052c62001dc0565b620004bb60048036036020811015620007cd57600080fd5b50356001600160a01b031662002123565b620004bb60048036036020811015620007f657600080fd5b50356001600160a01b03166200213e565b620004bb600480360360208110156200081f57600080fd5b50356001600160a01b03166200215c565b620004bb6200221a565b620004bb62002220565b620004bb62002226565b6200041b600480360360208110156200086657600080fd5b50356001600160a01b03166200222c565b6200052c62002241565b6200052c620024dc565b6200052c60048036036020811015620008a357600080fd5b50356001600160a01b031662002555565b620004396200284e565b620004bb60048036036020811015620008d657600080fd5b50356001600160a01b03166200286e565b620004bb6200288c565b6200041b600480360360408110156200090957600080fd5b506001600160a01b03813516906020013562002892565b6200041b600480360360408110156200093857600080fd5b506001600160a01b038135169060200135620028d1565b6200041b6200292d565b6200052c600480360360408110156200097157600080fd5b506001600160a01b0381351690602001356200294a565b6200050662002c7d565b620009bb60048036036020811015620009aa57600080fd5b50356001600160a01b031662002c8c565b604080516001600160a01b039586168152602081019490945263ffffffff90921683830152909216606082015290519081900360800190f35b6200043962002cc8565b620004bb6004803603604081101562000a1657600080fd5b506001600160a01b038135811691602001351662002cf7565b6200052c6004803603602081101562000a4757600080fd5b503562002d22565b6200050662002e6a565b6200052c62002e79565b6200052c6004803603606081101562000a7b57600080fd5b506001600160a01b0381358116916020810135909116906040013562002fcd565b620004bb6004803603602081101562000ab457600080fd5b50356001600160a01b031662003556565b6200041b6200357a565b620004bb620035a0565b6200041b6004803603602081101562000af157600080fd5b50356001600160a01b0316620035a6565b62000506620035c5565b60135460ff1681565b60405180606001604052806021815260200162004ffb6021913981565b600c5481565b600062000b47338484620035d4565b5060015b92915050565b6009546001600160a01b031681565b62000b6a6200292d565b801562000b79575060135460ff165b62000bba576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562000c0057600080fd5b505afa15801562000c15573d6000803e3d6000fd5b505050506040513d602081101562000c2c57600080fd5b50519050336001600160a01b0382161462000c795760405162461bcd60e51b8152600401808060200182810382526039815260200180620051726039913960400191505060405180910390fd5b600d60009054906101000a90046001600160a01b03166001600160a01b031663d7be4e296040518163ffffffff1660e01b815260040160206040518083038186803b15801562000cc857600080fd5b505afa15801562000cdd573d6000803e3d6000fd5b505050506040513d602081101562000cf457600080fd5b505162000d48576040805162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e74206e756d626572206f662079657320766f746573604482015290519081900360640190fd5b600d546001600160a01b0316639890f82462000d6362002e6a565b62000d8962000d728562002123565b62000d7c62000f54565b9063ffffffff620036c416565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b15801562000dd757600080fd5b505afa15801562000dec573d6000803e3d6000fd5b505050506040513d602081101562000e0357600080fd5b505162000e57576040805162461bcd60e51b815260206004820152601b60248201527f4f6666657220696e73756666696369656e746c792066756e6465640000000000604482015290519081900360640190fd5b600e54600d546040805163501ad8ff60e11b8152905162000ede9385936001600160a01b039182169391169163a035b1fe91600480820192602092909190829003018186803b15801562000eaa57600080fd5b505afa15801562000ebf573d6000803e3d6000fd5b505050506040513d602081101562000ed657600080fd5b5051620036d7565b6040805133815260016020820152606081830181905260169082015275436f6d706c65746564207375636365737366756c6c7960501b608082015290516001600160a01b038316917ffef6e75af3bccd87a961c3adb40d63d6c00eafaf14fff75952fa7b214fc1aec2919081900360a00190a250565b60025490565b611d4c81565b6001600160a01b03808216600090815260066020526040902054165b919050565b600062000f908484846200392c565b6001600160a01b03841660009081526001602090815260408083203380855292529091205462000fd491869162000fce908663ffffffff620036c416565b620035d4565b5060019392505050565b6001600160a01b031660009081526007602052604090205490565b60006200100562001a32565b6001600160a01b0316632a0a4ed56040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200104057600080fd5b505af115801562001055573d6000803e3d6000fd5b505050506040513d60208110156200106c57600080fd5b5051905090565b600081565b6200108262000ff9565b6001600160a01b0316336001600160a01b031614620010e8576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b620010f262004291565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff81169382019390935264010000000090920490921660608201819052909162001195576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b1580156200122057600080fd5b505af115801562001235573d6000803e3d6000fd5b505050506040513d60208110156200124c57600080fd5b50516200129d576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b69010f0cf064dd5920000081565b60125481565b336000908152600860205260409020805460ff19169115919091179055565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000b4791859062000fce908663ffffffff620039d516565b6001600160a01b0390811660009081526006602052604090206002015464010000000090041690565b6200138e6200292d565b80156200139d575060135460ff165b620013de576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d5433906001600160a01b0316634b91562e82620013fd8162002123565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156200144d57600080fd5b505af115801562001462573d6000803e3d6000fd5b5050505050565b620014753382620039e3565b6200147f62001a32565b6001600160a01b03166342966c68620014a4600c548462003add90919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156200144d57600080fd5b60135460ff1662001533576040805162461bcd60e51b815260206004820152601860248201527f416e206163636570746564206f66666572206578697374730000000000000000604482015290519081900360640190fd5b60006200153f62001a32565b6001600160a01b0316633a98ef396040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200157a57600080fd5b505af11580156200158f573d6000803e3d6000fd5b505050506040513d6020811015620015a657600080fd5b5051905033620015d3612710620015c684610bb863ffffffff62003add16565b9063ffffffff62003b0616565b620015dd62000f54565b10156200161c5760405162461bcd60e51b815260040180806020018281038252602e81526020018062005120602e913960400191505060405180910390fd5b62001637612710620015c6846101f463ffffffff62003add16565b620016428262002123565b1015620016815760405162461bcd60e51b8152600401808060200182810382526039815260200180620051ab6039913960400191505060405180910390fd5b600e54600f54601054604080516323b872dd60e01b81526001600160a01b038681166004830152938416602482015260448101929092525191909216916323b872dd9160648083019260209291908290030181600087803b158015620016e657600080fd5b505af1158015620016fb573d6000803e3d6000fd5b505050506040513d60208110156200171257600080fd5b505162001766576040805162461bcd60e51b815260206004820152601860248201527f43757272656e6379207472616e73666572206661696c65640000000000000000604482015290519081900360640190fd5b600033846012546040516200177b90620042b8565b6001600160a01b03909316835260208301919091526040808301919091525190819003606001906000f080158015620017b8573d6000803e3d6000fd5b509050806001600160a01b0316639890f824620017d462002e6a565b620017df8562002123565b620017e962000f54565b036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156200183857600080fd5b505afa1580156200184d573d6000803e3d6000fd5b505050506040513d60208110156200186457600080fd5b5051620018af576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742066756e64696e6760601b604482015290519081900360640190fd5b620018b96200292d565b15620019bb5762001957612710620015c6612904600d60009054906101000a90046001600160a01b03166001600160a01b031663a035b1fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200191c57600080fd5b505afa15801562001931573d6000803e3d6000fd5b505050506040513d60208110156200194857600080fd5b50519063ffffffff62003add16565b841015620019975760405162461bcd60e51b815260040180806020018281038252603c81526020018062005053603c913960400191505060405180910390fd5b620019bb60405180606001604052806022815260200162004f3b6022913962003b1a565b600d80546001600160a01b0319166001600160a01b0383811691909117909155604080518681529051918416917fd219cfd25914f132495270765bf331d19a2d0ed94cff788aebff0cfa278e6d4a916020908290030190a250505050565b6007602052600090815260409020805460019091015482565b600b546001600160a01b031690565b604080518082018252828152426020808301918252336000818152600790925284822093518455915160019093019290925591517f4c767b7b6b4e5b19edbb3ce0f841c467aa366beda334c58254bb264371819a119190a250565b62001aa66200292d565b1562001af4576040805162461bcd60e51b81526020600482015260186024820152772a3432b9329034b99030903832b73234b7339037b33332b960411b604482015290519081900360640190fd5b60135460ff1662001b45576040805162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015290519081900360640190fd5b806001600160a01b031662001b5962002e6a565b6001600160a01b031663ee5554d36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562001b9457600080fd5b505af115801562001ba9573d6000803e3d6000fd5b505050506040513d602081101562001bc057600080fd5b50516001600160a01b03161462001c1e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c69642063757272656e637920757064617465000000000000000000604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b600d546001600160a01b031690565b336000908152600660205260409020600101541562001dbe5733600081815260066020908152604080832060018101805460028301805484546001600160a01b031916909455918690556001600160c01b03198316909155825163a9059cbb60e01b8152600481019690965260248601819052915191946401000000009091046001600160a01b031693849363a9059cbb93604480850194929391928390030190829087803b15801562001d0857600080fd5b505af115801562001d1d573d6000803e3d6000fd5b505050506040513d602081101562001d3457600080fd5b505162001d85576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b62001dca6200292d565b801562001dd9575060135460ff165b62001e1a576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d60009054906101000a90046001600160a01b03166001600160a01b03166390e64d136040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e6957600080fd5b505afa15801562001e7e573d6000803e3d6000fd5b505050506040513d602081101562001e9557600080fd5b50511562001ed35762001ecd6040518060400160405280600d81526020016c13d999995c88195e1c1a5c9959609a1b81525062003b1a565b62001dbe565b600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f2257600080fd5b505afa15801562001f37573d6000803e3d6000fd5b505050506040513d602081101562001f4e57600080fd5b50511562001f8b5762001ecd60405180604001604052806012815260200171139bdd08195b9bdd59da081cdd5c1c1bdc9d60721b81525062003b1a565b600d546001600160a01b0316639890f82462001fa662002e6a565b6200203162000d72600d60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001ffd57600080fd5b505afa15801562002012573d6000803e3d6000fd5b505050506040513d60208110156200202957600080fd5b505162002123565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156200207f57600080fd5b505afa15801562002094573d6000803e3d6000fd5b505050506040513d6020811015620020ab57600080fd5b5051620020d65762001ecd60405180606001604052806021815260200162004fa46021913962003b1a565b6040805162461bcd60e51b815260206004820181905260248201527f4163717569736974696f6e20636f6e7465737420756e7375636365737366756c604482015290519081900360640190fd5b6001600160a01b031660009081526020819052604090205490565b6001600160a01b031660009081526007602052604090206001015490565b6000806200216a8362003cbf565b905080156200217b57905062000f7c565b6200218562001a32565b6001600160a01b0316836001600160a01b03161415620021aa575050600c5462000f7c565b62002211600c54620021bb62001a32565b6001600160a01b03166377e071ad866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156200191c57600080fd5b91505062000f7c565b60035481565b60055481565b60105481565b60086020526000908152604090205460ff1681565b60135460ff1662002292576040805162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015290519081900360640190fd5b6000339050620022bc612710620015c6601154620022af62000f54565b9063ffffffff62003add16565b620022c78262002123565b101562002310576040805162461bcd60e51b8152602060048201526012602482015271145d5bdc9d5b481b9bdd081c995858da195960721b604482015290519081900360640190fd5b6200231a6200292d565b156200248f57600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200236f57600080fd5b505afa15801562002384573d6000803e3d6000fd5b505050506040513d60208110156200239b57600080fd5b50516200247357620023ac62001384565b600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b158015620023fb57600080fd5b505afa15801562002410573d6000803e3d6000fd5b505050506040513d60208110156200242757600080fd5b505162002473576040805162461bcd60e51b8152602060048201526015602482015274145d5bdc9d5b481a185cc81b9bdd0819985a5b1959605a1b604482015290519081900360640190fd5b6200247d62001dc0565b620024876200292d565b156200248f57fe5b6200249d81826001620036d7565b604080516001600160a01b038316815290517f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a99181900360200190a150565b620024e66200292d565b8015620024f5575060135460ff165b62002536576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d5433906001600160a01b0316635ff0cf8482620013fd8162002123565b6200255f62004291565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352640100000000909204909216606082018190529091908162002604576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b0316331462002663576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b426200268b60035463ffffffff16856040015163ffffffff16620039d590919063ffffffff16565b1115620026df576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b1580156200276857600080fd5b505af11580156200277d573d6000803e3d6000fd5b505050506040513d60208110156200279457600080fd5b5051620027e5576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b620027fc8582620027f68862002123565b6200392c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b604051806040016040528060048152602001634453485360e01b81525081565b6001600160a01b031660009081526006602052604090206001015490565b60115481565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000b4791859062000fce908663ffffffff620036c416565b6000620028df838362003d06565b62002923576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b62000b4762001c55565b6000806200293a62001c46565b6001600160a01b03161415905090565b620029546200292d565b15620029a2576040805162461bcd60e51b81526020600482015260186024820152772a3432b9329034b99030903832b73234b7339037b33332b960411b604482015290519081900360640190fd5b60135460ff16620029fa576040805162461bcd60e51b815260206004820152601d60248201527f436f6e7472616374206e6f742061637469766520616e79206d6f72652e000000604482015290519081900360640190fd5b600b54604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801562002a4557600080fd5b505afa15801562002a5a573d6000803e3d6000fd5b505050506040513d602081101562002a7157600080fd5b5051101562002ac7576040805162461bcd60e51b815260206004820152601c60248201527f53686172652062616c616e6365206e6f742073756666696369656e7400000000604482015290519081900360640190fd5b600b5460408051636eb1769f60e11b8152336004820152306024820152905183926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b15801562002b1857600080fd5b505afa15801562002b2d573d6000803e3d6000fd5b505050506040513d602081101562002b4457600080fd5b5051101562002b9a576040805162461bcd60e51b815260206004820152601e60248201527f536861726520616c6c6f77616e6365206e6f742073756666696369656e740000604482015290519081900360640190fd5b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801562002bf557600080fd5b505af115801562002c0a573d6000803e3d6000fd5b505050506040513d602081101562002c2157600080fd5b505162002c6d576040805162461bcd60e51b815260206004820152601560248201527414da185c99481d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b62002c79828262003d15565b5050565b600d546001600160a01b031681565b6006602052600090815260409020805460018201546002909201546001600160a01b03918216929163ffffffff82169164010000000090041684565b6040518060400160405280601381526020017238bab4ba3a1731b417b4b73b32b9ba37b932b760691b81525081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60135460ff161562002d665760405162461bcd60e51b815260040180806020018281038252603681526020018062004fc56036913960400191505060405180910390fd5b62002d723382620039e3565b600b54600c546001600160a01b039091169063a9059cbb90339062002d9f90859063ffffffff62003add16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801562002def57600080fd5b505af115801562002e04573d6000803e3d6000fd5b505050506040513d602081101562002e1b57600080fd5b505162002e67576040805162461bcd60e51b815260206004820152601560248201527414da185c99481d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b50565b600e546001600160a01b031690565b62002e836200292d565b801562002e92575060135460ff165b62002ed3576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562002f2257600080fd5b505afa15801562002f37573d6000803e3d6000fd5b505050506040513d602081101562002f4e57600080fd5b50516001600160a01b0316331462002f985760405162461bcd60e51b81526004018080602001828103825260378152602001806200501c6037913960400191505060405180910390fd5b62001dbe6040518060400160405280601281526020017121b0b731b2b63632b210313c90313abcb2b960711b81525062003b1a565b6001600160a01b03821662003029576040805162461bcd60e51b815260206004820152601860248201527f43616e277420636c61696d207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6200303482620035a6565b62003086576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b600062003093846200215c565b905060008111620030eb576040805162461bcd60e51b815260206004820152601b60248201527f556e737570706f7274656420636f6c6c61746572616c20747970650000000000604482015290519081900360640190fd5b336000620030f98562002123565b905060006200310f828563ffffffff62003add16565b9050868262003165576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b60408051636eb1769f60e11b81526001600160a01b0386811660048301523060248301529151849284169163dd62ed3e916044808301926020929190829003018186803b158015620031b657600080fd5b505afa158015620031cb573d6000803e3d6000fd5b505050506040513d6020811015620031e257600080fd5b5051101562003238576040805162461bcd60e51b815260206004820152601f60248201527f43757272656e637920616c6c6f77616e636520696e73756666696369656e7400604482015290519081900360640190fd5b81816001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156200329057600080fd5b505afa158015620032a5573d6000803e3d6000fd5b505050506040513d6020811015620032bc57600080fd5b5051101562003312576040805162461bcd60e51b815260206004820152601d60248201527f43757272656e63792062616c616e636520696e73756666696369656e74000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600660205260409020600101541562003381576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b6200338d878762003d9a565b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b158015620033e757600080fd5b505af1158015620033fc573d6000803e3d6000fd5b505050506040513d60208110156200341357600080fd5b505162003464576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b0386811680835260208084018781524263ffffffff9081168688019081528f8616606088019081528f87166000818152600687528a812099518a546001600160a01b031916908a16178a5594516001808b0191909155925160029099018054925163ffffffff199093169990941698909817640100000000600160c01b031916640100000000919097160295909517905582815260078252858120818155909301929092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a35050505050505050565b6001600160a01b031660009081526006602052604090206002015463ffffffff1690565b6000620035866200292d565b620035935760006200359b565b60135460ff16155b905090565b60045481565b6001600160a01b031660009081526008602052604090205460ff161590565b600f546001600160a01b031681565b6001600160a01b0383166200361b5760405162461bcd60e51b81526004018080602001828103825260248152602001806200514e6024913960400191505060405180910390fd5b6001600160a01b038216620036625760405162461bcd60e51b815260040180806020018281038252602281526020018062004f5d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082821115620036d157fe5b50900390565b6000620036e48462002123565b90506000620036f262000f54565b6013805460ff191690559050620037098262002d22565b60006200371d828463ffffffff620036c416565b600b546040805163a9059cbb60e01b81526001600160a01b038a8116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156200377657600080fd5b505af11580156200378b573d6000803e3d6000fd5b505050506040513d6020811015620037a257600080fd5b5051620037f6576040805162461bcd60e51b815260206004820152601d60248201527f5772617070656420746f6b656e207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6001600160a01b0385166323b872dd873062003819888663ffffffff62003add16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156200388257600080fd5b505af115801562003897573d6000803e3d6000fd5b505050506040513d6020811015620038ae57600080fd5b505162003902576040805162461bcd60e51b815260206004820152601760248201527f4261636b696e67207472616e73666572206661696c6564000000000000000000604482015290519081900360640190fd5b5050600b80546001600160a01b0319166001600160a01b039490941693909317909255600c555050565b6200393983838362003f73565b620039436200292d565b801562003952575060135460ff165b15620039d057600d5460408051636240a7d760e11b81526001600160a01b0386811660048301528581166024830152604482018590529151919092169163c4814fae91606480830192600092919082900301818387803b158015620039b657600080fd5b505af1158015620039cb573d6000803e3d6000fd5b505050505b505050565b8181018281101562000b4b57fe5b80620039ef3362002123565b101562003a3a576040805162461bcd60e51b815260206004820152601460248201527310985b185b98d9481a5b9cdd59999a58da595b9d60621b604482015290519081900360640190fd5b62003a468282620040bd565b62003a506200292d565b801562003a5f575060135460ff165b1562002c7957600d5460408051636240a7d760e11b81526001600160a01b03858116600483015260006024830181905260448301869052925193169263c4814fae9260648084019391929182900301818387803b15801562003ac057600080fd5b505af115801562003ad5573d6000803e3d6000fd5b505050505050565b60008262003aee5750600062000b4b565b508181028183828162003afd57fe5b041462000b4b57fe5b600081838162003b1257fe5b049392505050565b600d54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562003b6057600080fd5b505afa15801562003b75573d6000803e3d6000fd5b505050506040513d602081101562003b8c57600080fd5b5051600d54604080516341c0e1b560e01b815290519293506001600160a01b03909116916341c0e1b59160048082019260009290919082900301818387803b15801562003bd857600080fd5b505af115801562003bed573d6000803e3d6000fd5b5050600d80546001600160a01b03191690555050604080513380825260006020808401829052606094840185815287519585019590955286516001600160a01b038716957ffef6e75af3bccd87a961c3adb40d63d6c00eafaf14fff75952fa7b214fc1aec295899390926080840191850190808383895b8381101562003c7e57818101518382015260200162003c64565b50505050905090810190601f16801562003cac5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b60006001600160a01b03821630141562003cdc5750600162000f7c565b6009546001600160a01b038381169116141562003cfd5750600a5462000f7c565b50600062000f7c565b600062000b473384846200392c565b62003d2182826200419c565b62003d2b6200292d565b801562003d3a575060135460ff165b1562002c7957600d5460408051636240a7d760e11b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263c4814fae9260648084019382900301818387803b15801562003ac057600080fd5b62003da4620042c6565b5033600090815260076020908152604091829020825180840190935280548084526001909101549183019190915262003e24576040805162461bcd60e51b815260206004820152601a60248201527f4d65737361676520686173682063616e2774206265207a65726f000000000000604482015290519081900360640190fd5b4262003e406004548360200151620039d590919063ffffffff16565b111562003e7f5760405162461bcd60e51b815260040180806020018281038252602b815260200180620050f5602b913960400191505060405180910390fd5b4262003e9b6005548360200151620039d590919063ffffffff16565b101562003eda5760405162461bcd60e51b815260040180806020018281038252602581526020018062004f7f6025913960400191505060405180910390fd5b60408051602080820185905233606090811b8385015286901b6bffffffffffffffffffffffff191660548301528251808303604801815260689092019092528051910120815114620039d0576040805162461bcd60e51b815260206004820152601e60248201527f5061636b61676520636f756c64206e6f742062652076616c6964617465640000604482015290519081900360640190fd5b6001600160a01b03831662003fba5760405162461bcd60e51b8152600401808060200182810382526025815260200180620050d06025913960400191505060405180910390fd5b6001600160a01b038216620040015760405162461bcd60e51b815260040180806020018281038252602381526020018062004f186023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546200402c908263ffffffff620036c416565b6001600160a01b03808516600090815260208190526040808220939093559084168152205462004063908263ffffffff620039d516565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216620041045760405162461bcd60e51b8152600401808060200182810382526021815260200180620050af6021913960400191505060405180910390fd5b60025462004119908263ffffffff620036c416565b6002556001600160a01b03821660009081526020819052604090205462004147908263ffffffff620036c416565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6001600160a01b038216620041f8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546200420d908263ffffffff620039d516565b6002556001600160a01b0382166000908152602081905260409020546200423b908263ffffffff620039d516565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b610c3a80620042de83390190565b60408051808201909152600080825260208201529056fe608060405234801561001057600080fd5b50604051610c3a380380610c3a8339818101604052606081101561003357600080fd5b5080516020820151604090920151909190816100b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f50726963652063616e6e6f74206265207a65726f000000000000000000000000604482015290519081900360640190fd5b600180546001600160a01b03199081163317909155600280546001600160a01b0395909516949091169390931790925560035560005542600455610b41806100f96000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639890f824116100ad578063c4814fae11610071578063c4814fae14610282578063cf42a927146102b8578063d7be4e29146102c0578063fa7f1bae146102c8578063fb286c65146102d057610121565b80639890f82414610236578063a035b1fe14610262578063b1610d7e1461026a578063b5b47f4214610272578063b80777ea1461027a57610121565b80634b91562e116100f45780634b91562e1461018c5780635ff0cf84146101b85780637150d8ae146101e45780638f1b4c6f1461020857806390e64d131461022e57610121565b80630c43cd88146101265780631703a0181461014057806341c0e1b514610148578063448ab4c614610152575b600080fd5b61012e6102d8565b60408051918252519081900360200190f35b61012e6102df565b6101506102e5565b005b6101786004803603602081101561016857600080fd5b50356001600160a01b031661033c565b604080519115158252519081900360200190f35b610150600480360360408110156101a257600080fd5b506001600160a01b03813516906020013561036f565b610150600480360360408110156101ce57600080fd5b506001600160a01b038135169060200135610417565b6101ec6104bb565b604080516001600160a01b039092168252519081900360200190f35b6101786004803603602081101561021e57600080fd5b50356001600160a01b03166104ca565b6101786104d3565b6101786004803603604081101561024c57600080fd5b506001600160a01b0381351690602001356104f7565b61012e610639565b61012e61063f565b61012e610646565b61012e61064c565b6101506004803603606081101561029857600080fd5b506001600160a01b03813581169160208101359091169060400135610652565b6101786106e5565b610178610848565b610178610907565b61012e61092b565b6276a70081565b60005481565b6001546001600160a01b0316331461032e5760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6002546001600160a01b0316ff5b600060015b6001600160a01b03831660009081526007602052604090205460ff16600281111561036857fe5b1492915050565b6001546001600160a01b031633146103b85760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6103c0610907565b610407576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041360028284610931565b5050565b6001546001600160a01b031633146104605760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b610468610907565b6104af576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041360018284610931565b6002546001600160a01b031681565b60006002610341565b6000806104eb6004544261097790919063ffffffff16565b6276a700109150505b90565b600254604080516370a0823160e01b81526001600160a01b039283166004820152905160009285928492918416916370a0823191602480820192602092909190829003018186803b15801561054b57600080fd5b505afa15801561055f573d6000803e3d6000fd5b505050506040513d602081101561057557600080fd5b505160025460015460408051636eb1769f60e11b81526001600160a01b0393841660048201529183166024830152519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b1580156105d457600080fd5b505afa1580156105e8573d6000803e3d6000fd5b505050506040513d60208110156105fe57600080fd5b505160035490915060009061061a90879063ffffffff61098916565b905082811115801561062c5750818111155b9450505050505b92915050565b60035481565b624f1a0081565b60055481565b60045481565b6001546001600160a01b0316331461069b5760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6106a3610907565b156106e0576001600160a01b0380841660009081526007602052604080822054928516825290205460ff91821691166106dd8282856109ae565b50505b505050565b60006106ef610907565b1561081657600054600154604080516318160ddd60e01b8152905161080e926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561073d57600080fd5b505afa158015610751573d6000803e3d6000fd5b505050506040513d602081101561076757600080fd5b5051600554600154604080516318160ddd60e01b8152905161080293612710936107f69391926001600160a01b03909116916318160ddd916004808301926020929190829003018186803b1580156107be57600080fd5b505afa1580156107d2573d6000803e3d6000fd5b505050506040513d60208110156107e857600080fd5b50519063ffffffff61097716565b9063ffffffff61098916565b9063ffffffff610ac716565b1090506104f4565b60005461080e610833600554600654610ada90919063ffffffff16565b6006546108029061271063ffffffff61098916565b6000610852610907565b156108ea57600054600154604080516318160ddd60e01b815290516108e1926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156108a057600080fd5b505afa1580156108b4573d6000803e3d6000fd5b505050506040513d60208110156108ca57600080fd5b50516006546108029061271063ffffffff61098916565b101590506104f4565b6000546108e1610833600554600654610ada90919063ffffffff16565b60008061091f6004544261097790919063ffffffff16565b624f1a00101591505090565b60065481565b6001600160a01b0381166000908152600760205260409020805460ff811691859182919060ff1916600183600281111561096757fe5b02179055506106dd8282866109ae565b60008282111561098357fe5b50900390565b60008261099857506000610633565b50818102818382816109a657fe5b041461063357fe5b8160028111156109ba57fe5b8360028111156109c657fe5b146106e05760028360028111156109d957fe5b14156109fa576005546109f2908263ffffffff61097716565b600555610a25565b6001836002811115610a0857fe5b1415610a2557600654610a21908263ffffffff61097716565b6006555b6002826002811115610a3357fe5b1415610a5457600554610a4c908263ffffffff610ada16565b600555610a7f565b6001826002811115610a6257fe5b1415610a7f57600654610a7b908263ffffffff610ada16565b6006555b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c256600654600554604051808381526020018281526020019250505060405180910390a1505050565b6000818381610ad257fe5b049392505050565b8181018281101561063357fefe43616e206f6e6c792062652063616c6c656420627920706172656e7420636f6e7472616374a265627a7a723058203e021df2f1e574c1fee2c590149aeebec134def49ab4644aafe89f6d006ab6e264736f6c634300050a003245524332303a207472616e7366657220746f20746865207a65726f20616464726573734f6666657220776173207265706c616365642062792061206869676865722062696445524332303a20617070726f766520746f20746865207a65726f2061646472657373507265636c61696d20706572696f6420656e642e20436c61696d656420746f6f206c6174654f6666657220776173206e6f742073756666696369656e746c792066756e6465644173206c6f6e672061732074686520636f6e7472616374206973206163746976652c20796f752061726520626f756e6420746f206974447261676761626c65205365727669636548756e74657220414720536861726573596f7520617265206e6f7420617574686f72697a656420746f2063616e63656c2074686973206163717569736974696f6e206f666665724e6577206f6666657273206d757374206265206174206c6561737420352520686967686572207468616e207468652070656e64696e67206f666665725468657265206973206e6f2070656e64696e67206f666665720000000000000045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373507265636c61696d20706572696f642076696f6c617465642e20436c61696d656420746f6f206561726c795468697320636f6e747261637420646f6573206e6f7420726570726573656e7420656e6f7567682065717569747945524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373596f7520617265206e6f7420617574686f72697a656420746f20636f6d706c6574652074686973206163717569736974696f6e206f66666572596f75206e65656420746f20686f6c64206174206c65617374203525206f6620746865206669726d20746f206d616b6520616e206f66666572a265627a7a723058209d00a6be25a9efd1669b127fac3aae0fb8560f2cc61d9ed20d7365555cbd251b64736f6c634300050a0032000000000000000000000000bc41f5259e10e36341ff0da77a5870abc698de56000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc08000000000000000000000000025a554f1b6ffbcb323c916328c55e64f6ad5af7

Deployed Bytecode

0x60806040523480156200001157600080fd5b50600436106200040c5760003560e01c806370a082311162000225578063a9059cbb1162000135578063de49468511620000bd578063ec6580e21162000087578063ec6580e21462000ac5578063ee18d99e1462000acf578063f66f145a1462000ad9578063fec21a9c1462000b02576200040c565b8063de4946851462000a4f578063e1b8c38e1462000a59578063e5a8765a1462000a63578063eb470ebf1462000a9c576200040c565b8063c6788bdd11620000ff578063c6788bdd1462000992578063d502562514620009f4578063dd62ed3e14620009fe578063de0e9a3e1462000a2f576200040c565b8063a9059cbb1462000920578063bc1b1e7c146200094f578063bf376c7a1462000959578063c028df061462000988576200040c565b80638fd3ab8011620001b957806395d89b41116200018357806395d89b4114620008b45780639b56d6c914620008be5780639e8a9a5a14620008e7578063a457c2d714620008f1576200040c565b80638fd3ab80146200087757806390cf581c14620008815780639361d7d6146200053857806394d645a8146200088b576200040c565b80637dc2cd9811620001fb5780637dc2cd9814620008305780637dde2a02146200083a5780638760678914620008445780638e0597c1146200084e576200040c565b806370a0823114620007b557806375a88bcf14620007de57806377e071ad1462000807576200040c565b80633549788a1162000321578063493c160f11620002b557806360918117116200027f57806360918117146200078d5780636467c09a14620007975780636b03ed5f14620007a15780636f4b18df14620007ab576200040c565b8063493c160f14620006f857806358047913146200073a5780635b1c162514620007445780635e0276011462000764576200040c565b80633bcc45ba11620002f75780633bcc45ba146200068557806341c12a7014620006ae57806342966c6814620006b85780634900ca5114620006d8576200040c565b80633549788a146200062a578063378c93ad1462000634578063395093511462000656576200040c565b8063198d7fc511620003a55780632a0a4ed5116200036f5780632a0a4ed514620005cd578063313ce56714620005d757806332a7ae9514620005f7578063332a6ee81462000620576200040c565b8063198d7fc514620005385780631e3b9de5146200054257806323b872dd146200056b57806324b50e4314620005a4576200040c565b8063095ea7b311620003e7578063095ea7b314620004cd5780630c6f0e5d14620004fc578063141c7068146200052257806318160ddd146200052e576200040c565b806302fb0c5e146200041157806306fdde03146200042f5780630832e47014620004b1575b600080fd5b6200041b62000b0c565b604080519115158252519081900360200190f35b6200043962000b15565b6040805160208082528351818301528351919283929083019185019080838360005b83811015620004755781810151838201526020016200045b565b50505050905090810190601f168015620004a35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b620004bb62000b32565b60408051918252519081900360200190f35b6200041b60048036036040811015620004e557600080fd5b506001600160a01b03813516906020013562000b38565b6200050662000b51565b604080516001600160a01b039092168252519081900360200190f35b6200052c62000b60565b005b620004bb62000f54565b620004bb62000f5a565b62000506600480360360208110156200055a57600080fd5b50356001600160a01b031662000f60565b6200041b600480360360608110156200058357600080fd5b506001600160a01b0381358116916020810135909116906040013562000f81565b620004bb60048036036020811015620005bc57600080fd5b50356001600160a01b031662000fde565b6200050662000ff9565b620005e162001073565b6040805160ff9092168252519081900360200190f35b6200052c600480360360208110156200060f57600080fd5b50356001600160a01b031662001078565b620004bb620012e9565b620004bb620012f7565b6200052c600480360360208110156200064c57600080fd5b50351515620012fd565b6200041b600480360360408110156200066e57600080fd5b506001600160a01b0381351690602001356200131c565b62000506600480360360208110156200069d57600080fd5b50356001600160a01b03166200135b565b6200052c62001384565b6200052c60048036036020811015620006d057600080fd5b503562001469565b6200052c60048036036020811015620006f057600080fd5b5035620014db565b62000721600480360360208110156200071057600080fd5b50356001600160a01b031662001a19565b6040805192835260208301919091528051918290030190f35b6200050662001a32565b6200052c600480360360208110156200075c57600080fd5b503562001a41565b6200052c600480360360208110156200077c57600080fd5b50356001600160a01b031662001a9c565b620004bb62001c40565b6200050662001c46565b6200052c62001c55565b6200052c62001dc0565b620004bb60048036036020811015620007cd57600080fd5b50356001600160a01b031662002123565b620004bb60048036036020811015620007f657600080fd5b50356001600160a01b03166200213e565b620004bb600480360360208110156200081f57600080fd5b50356001600160a01b03166200215c565b620004bb6200221a565b620004bb62002220565b620004bb62002226565b6200041b600480360360208110156200086657600080fd5b50356001600160a01b03166200222c565b6200052c62002241565b6200052c620024dc565b6200052c60048036036020811015620008a357600080fd5b50356001600160a01b031662002555565b620004396200284e565b620004bb60048036036020811015620008d657600080fd5b50356001600160a01b03166200286e565b620004bb6200288c565b6200041b600480360360408110156200090957600080fd5b506001600160a01b03813516906020013562002892565b6200041b600480360360408110156200093857600080fd5b506001600160a01b038135169060200135620028d1565b6200041b6200292d565b6200052c600480360360408110156200097157600080fd5b506001600160a01b0381351690602001356200294a565b6200050662002c7d565b620009bb60048036036020811015620009aa57600080fd5b50356001600160a01b031662002c8c565b604080516001600160a01b039586168152602081019490945263ffffffff90921683830152909216606082015290519081900360800190f35b6200043962002cc8565b620004bb6004803603604081101562000a1657600080fd5b506001600160a01b038135811691602001351662002cf7565b6200052c6004803603602081101562000a4757600080fd5b503562002d22565b6200050662002e6a565b6200052c62002e79565b6200052c6004803603606081101562000a7b57600080fd5b506001600160a01b0381358116916020810135909116906040013562002fcd565b620004bb6004803603602081101562000ab457600080fd5b50356001600160a01b031662003556565b6200041b6200357a565b620004bb620035a0565b6200041b6004803603602081101562000af157600080fd5b50356001600160a01b0316620035a6565b62000506620035c5565b60135460ff1681565b60405180606001604052806021815260200162004ffb6021913981565b600c5481565b600062000b47338484620035d4565b5060015b92915050565b6009546001600160a01b031681565b62000b6a6200292d565b801562000b79575060135460ff165b62000bba576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562000c0057600080fd5b505afa15801562000c15573d6000803e3d6000fd5b505050506040513d602081101562000c2c57600080fd5b50519050336001600160a01b0382161462000c795760405162461bcd60e51b8152600401808060200182810382526039815260200180620051726039913960400191505060405180910390fd5b600d60009054906101000a90046001600160a01b03166001600160a01b031663d7be4e296040518163ffffffff1660e01b815260040160206040518083038186803b15801562000cc857600080fd5b505afa15801562000cdd573d6000803e3d6000fd5b505050506040513d602081101562000cf457600080fd5b505162000d48576040805162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e74206e756d626572206f662079657320766f746573604482015290519081900360640190fd5b600d546001600160a01b0316639890f82462000d6362002e6a565b62000d8962000d728562002123565b62000d7c62000f54565b9063ffffffff620036c416565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b15801562000dd757600080fd5b505afa15801562000dec573d6000803e3d6000fd5b505050506040513d602081101562000e0357600080fd5b505162000e57576040805162461bcd60e51b815260206004820152601b60248201527f4f6666657220696e73756666696369656e746c792066756e6465640000000000604482015290519081900360640190fd5b600e54600d546040805163501ad8ff60e11b8152905162000ede9385936001600160a01b039182169391169163a035b1fe91600480820192602092909190829003018186803b15801562000eaa57600080fd5b505afa15801562000ebf573d6000803e3d6000fd5b505050506040513d602081101562000ed657600080fd5b5051620036d7565b6040805133815260016020820152606081830181905260169082015275436f6d706c65746564207375636365737366756c6c7960501b608082015290516001600160a01b038316917ffef6e75af3bccd87a961c3adb40d63d6c00eafaf14fff75952fa7b214fc1aec2919081900360a00190a250565b60025490565b611d4c81565b6001600160a01b03808216600090815260066020526040902054165b919050565b600062000f908484846200392c565b6001600160a01b03841660009081526001602090815260408083203380855292529091205462000fd491869162000fce908663ffffffff620036c416565b620035d4565b5060019392505050565b6001600160a01b031660009081526007602052604090205490565b60006200100562001a32565b6001600160a01b0316632a0a4ed56040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200104057600080fd5b505af115801562001055573d6000803e3d6000fd5b505050506040513d60208110156200106c57600080fd5b5051905090565b600081565b6200108262000ff9565b6001600160a01b0316336001600160a01b031614620010e8576040805162461bcd60e51b815260206004820152601860248201527f596f752063616e6e6f742064656c65746520636c61696d730000000000000000604482015290519081900360640190fd5b620010f262004291565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff81169382019390935264010000000090920490921660608201819052909162001195576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b6001600160a01b03808416600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055855186830151825163a9059cbb60e01b81529186166004830152602482015290519385169363a9059cbb93604480840194938390030190829087803b1580156200122057600080fd5b505af115801562001235573d6000803e3d6000fd5b505050506040513d60208110156200124c57600080fd5b50516200129d576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b815160208084015160408051918252516001600160a01b03938416938716927fbb036e629a9f4c0897ee5d48440dfdb36f7e772117723a2ed603a6514244c2d5928290030190a3505050565b69010f0cf064dd5920000081565b60125481565b336000908152600860205260409020805460ff19169115919091179055565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000b4791859062000fce908663ffffffff620039d516565b6001600160a01b0390811660009081526006602052604090206002015464010000000090041690565b6200138e6200292d565b80156200139d575060135460ff165b620013de576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d5433906001600160a01b0316634b91562e82620013fd8162002123565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b1580156200144d57600080fd5b505af115801562001462573d6000803e3d6000fd5b5050505050565b620014753382620039e3565b6200147f62001a32565b6001600160a01b03166342966c68620014a4600c548462003add90919063ffffffff16565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156200144d57600080fd5b60135460ff1662001533576040805162461bcd60e51b815260206004820152601860248201527f416e206163636570746564206f66666572206578697374730000000000000000604482015290519081900360640190fd5b60006200153f62001a32565b6001600160a01b0316633a98ef396040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200157a57600080fd5b505af11580156200158f573d6000803e3d6000fd5b505050506040513d6020811015620015a657600080fd5b5051905033620015d3612710620015c684610bb863ffffffff62003add16565b9063ffffffff62003b0616565b620015dd62000f54565b10156200161c5760405162461bcd60e51b815260040180806020018281038252602e81526020018062005120602e913960400191505060405180910390fd5b62001637612710620015c6846101f463ffffffff62003add16565b620016428262002123565b1015620016815760405162461bcd60e51b8152600401808060200182810382526039815260200180620051ab6039913960400191505060405180910390fd5b600e54600f54601054604080516323b872dd60e01b81526001600160a01b038681166004830152938416602482015260448101929092525191909216916323b872dd9160648083019260209291908290030181600087803b158015620016e657600080fd5b505af1158015620016fb573d6000803e3d6000fd5b505050506040513d60208110156200171257600080fd5b505162001766576040805162461bcd60e51b815260206004820152601860248201527f43757272656e6379207472616e73666572206661696c65640000000000000000604482015290519081900360640190fd5b600033846012546040516200177b90620042b8565b6001600160a01b03909316835260208301919091526040808301919091525190819003606001906000f080158015620017b8573d6000803e3d6000fd5b509050806001600160a01b0316639890f824620017d462002e6a565b620017df8562002123565b620017e962000f54565b036040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156200183857600080fd5b505afa1580156200184d573d6000803e3d6000fd5b505050506040513d60208110156200186457600080fd5b5051620018af576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742066756e64696e6760601b604482015290519081900360640190fd5b620018b96200292d565b15620019bb5762001957612710620015c6612904600d60009054906101000a90046001600160a01b03166001600160a01b031663a035b1fe6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200191c57600080fd5b505afa15801562001931573d6000803e3d6000fd5b505050506040513d60208110156200194857600080fd5b50519063ffffffff62003add16565b841015620019975760405162461bcd60e51b815260040180806020018281038252603c81526020018062005053603c913960400191505060405180910390fd5b620019bb60405180606001604052806022815260200162004f3b6022913962003b1a565b600d80546001600160a01b0319166001600160a01b0383811691909117909155604080518681529051918416917fd219cfd25914f132495270765bf331d19a2d0ed94cff788aebff0cfa278e6d4a916020908290030190a250505050565b6007602052600090815260409020805460019091015482565b600b546001600160a01b031690565b604080518082018252828152426020808301918252336000818152600790925284822093518455915160019093019290925591517f4c767b7b6b4e5b19edbb3ce0f841c467aa366beda334c58254bb264371819a119190a250565b62001aa66200292d565b1562001af4576040805162461bcd60e51b81526020600482015260186024820152772a3432b9329034b99030903832b73234b7339037b33332b960411b604482015290519081900360640190fd5b60135460ff1662001b45576040805162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015290519081900360640190fd5b806001600160a01b031662001b5962002e6a565b6001600160a01b031663ee5554d36040518163ffffffff1660e01b8152600401602060405180830381600087803b15801562001b9457600080fd5b505af115801562001ba9573d6000803e3d6000fd5b505050506040513d602081101562001bc057600080fd5b50516001600160a01b03161462001c1e576040805162461bcd60e51b815260206004820152601760248201527f496e76616c69642063757272656e637920757064617465000000000000000000604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600a5481565b600d546001600160a01b031690565b336000908152600660205260409020600101541562001dbe5733600081815260066020908152604080832060018101805460028301805484546001600160a01b031916909455918690556001600160c01b03198316909155825163a9059cbb60e01b8152600481019690965260248601819052915191946401000000009091046001600160a01b031693849363a9059cbb93604480850194929391928390030190829087803b15801562001d0857600080fd5b505af115801562001d1d573d6000803e3d6000fd5b505050506040513d602081101562001d3457600080fd5b505162001d85576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b60408051838152905133917f203627483d943880619f4b7e0cca21dbefd6204b4d85b124eb99540e17ba86dd919081900360200190a250505b565b62001dca6200292d565b801562001dd9575060135460ff165b62001e1a576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d60009054906101000a90046001600160a01b03166001600160a01b03166390e64d136040518163ffffffff1660e01b815260040160206040518083038186803b15801562001e6957600080fd5b505afa15801562001e7e573d6000803e3d6000fd5b505050506040513d602081101562001e9557600080fd5b50511562001ed35762001ecd6040518060400160405280600d81526020016c13d999995c88195e1c1a5c9959609a1b81525062003b1a565b62001dbe565b600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b15801562001f2257600080fd5b505afa15801562001f37573d6000803e3d6000fd5b505050506040513d602081101562001f4e57600080fd5b50511562001f8b5762001ecd60405180604001604052806012815260200171139bdd08195b9bdd59da081cdd5c1c1bdc9d60721b81525062003b1a565b600d546001600160a01b0316639890f82462001fa662002e6a565b6200203162000d72600d60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562001ffd57600080fd5b505afa15801562002012573d6000803e3d6000fd5b505050506040513d60208110156200202957600080fd5b505162002123565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b031681526020018281526020019250505060206040518083038186803b1580156200207f57600080fd5b505afa15801562002094573d6000803e3d6000fd5b505050506040513d6020811015620020ab57600080fd5b5051620020d65762001ecd60405180606001604052806021815260200162004fa46021913962003b1a565b6040805162461bcd60e51b815260206004820181905260248201527f4163717569736974696f6e20636f6e7465737420756e7375636365737366756c604482015290519081900360640190fd5b6001600160a01b031660009081526020819052604090205490565b6001600160a01b031660009081526007602052604090206001015490565b6000806200216a8362003cbf565b905080156200217b57905062000f7c565b6200218562001a32565b6001600160a01b0316836001600160a01b03161415620021aa575050600c5462000f7c565b62002211600c54620021bb62001a32565b6001600160a01b03166377e071ad866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156200191c57600080fd5b91505062000f7c565b60035481565b60055481565b60105481565b60086020526000908152604090205460ff1681565b60135460ff1662002292576040805162461bcd60e51b8152602060048201526016602482015275436f6e7472616374206973206e6f742061637469766560501b604482015290519081900360640190fd5b6000339050620022bc612710620015c6601154620022af62000f54565b9063ffffffff62003add16565b620022c78262002123565b101562002310576040805162461bcd60e51b8152602060048201526012602482015271145d5bdc9d5b481b9bdd081c995858da195960721b604482015290519081900360640190fd5b6200231a6200292d565b156200248f57600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b1580156200236f57600080fd5b505afa15801562002384573d6000803e3d6000fd5b505050506040513d60208110156200239b57600080fd5b50516200247357620023ac62001384565b600d60009054906101000a90046001600160a01b03166001600160a01b031663cf42a9276040518163ffffffff1660e01b815260040160206040518083038186803b158015620023fb57600080fd5b505afa15801562002410573d6000803e3d6000fd5b505050506040513d60208110156200242757600080fd5b505162002473576040805162461bcd60e51b8152602060048201526015602482015274145d5bdc9d5b481a185cc81b9bdd0819985a5b1959605a1b604482015290519081900360640190fd5b6200247d62001dc0565b620024876200292d565b156200248f57fe5b6200249d81826001620036d7565b604080516001600160a01b038316815290517f3b6b79a09e9fd230e8591b65c97236bf7df7a604edf733db0658e66b0e6eb2a99181900360200190a150565b620024e66200292d565b8015620024f5575060135460ff165b62002536576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d5433906001600160a01b0316635ff0cf8482620013fd8162002123565b6200255f62004291565b506001600160a01b038082166000908152600660209081526040918290208251608081018452815485168152600182015492810183905260029091015463ffffffff811693820193909352640100000000909204909216606082018190529091908162002604576040805162461bcd60e51b815260206004820152600e60248201526d139bc818db185a5b48199bdd5b9960921b604482015290519081900360640190fd5b82516001600160a01b0316331462002663576040805162461bcd60e51b815260206004820152601f60248201527f4f6e6c7920636c61696d616e742063616e207265736f6c766520636c61696d00604482015290519081900360640190fd5b426200268b60035463ffffffff16856040015163ffffffff16620039d590919063ffffffff16565b1115620026df576040805162461bcd60e51b815260206004820152601960248201527f436c61696d20706572696f64206e6f74206f7665722079657400000000000000604482015290519081900360640190fd5b82516001600160a01b03808616600090815260066020908152604080832080546001600160a01b03191681556001810184905560020180546001600160c01b0319169055805163a9059cbb60e01b815284861660048201526024810188905290519386169363a9059cbb93604480840194938390030190829087803b1580156200276857600080fd5b505af11580156200277d573d6000803e3d6000fd5b505050506040513d60208110156200279457600080fd5b5051620027e5576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b620027fc8582620027f68862002123565b6200392c565b806001600160a01b0316856001600160a01b03167f52a5c2b28bc6eb9712d0ced43463103b486b13ccc9cda499fd3b2d7b6a74a8ee856040518082815260200191505060405180910390a35050505050565b604051806040016040528060048152602001634453485360e01b81525081565b6001600160a01b031660009081526006602052604090206001015490565b60115481565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909162000b4791859062000fce908663ffffffff620036c416565b6000620028df838362003d06565b62002923576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b62000b4762001c55565b6000806200293a62001c46565b6001600160a01b03161415905090565b620029546200292d565b15620029a2576040805162461bcd60e51b81526020600482015260186024820152772a3432b9329034b99030903832b73234b7339037b33332b960411b604482015290519081900360640190fd5b60135460ff16620029fa576040805162461bcd60e51b815260206004820152601d60248201527f436f6e7472616374206e6f742061637469766520616e79206d6f72652e000000604482015290519081900360640190fd5b600b54604080516370a0823160e01b8152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b15801562002a4557600080fd5b505afa15801562002a5a573d6000803e3d6000fd5b505050506040513d602081101562002a7157600080fd5b5051101562002ac7576040805162461bcd60e51b815260206004820152601c60248201527f53686172652062616c616e6365206e6f742073756666696369656e7400000000604482015290519081900360640190fd5b600b5460408051636eb1769f60e11b8152336004820152306024820152905183926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b15801562002b1857600080fd5b505afa15801562002b2d573d6000803e3d6000fd5b505050506040513d602081101562002b4457600080fd5b5051101562002b9a576040805162461bcd60e51b815260206004820152601e60248201527f536861726520616c6c6f77616e6365206e6f742073756666696369656e740000604482015290519081900360640190fd5b600b54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801562002bf557600080fd5b505af115801562002c0a573d6000803e3d6000fd5b505050506040513d602081101562002c2157600080fd5b505162002c6d576040805162461bcd60e51b815260206004820152601560248201527414da185c99481d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b62002c79828262003d15565b5050565b600d546001600160a01b031681565b6006602052600090815260409020805460018201546002909201546001600160a01b03918216929163ffffffff82169164010000000090041684565b6040518060400160405280601381526020017238bab4ba3a1731b417b4b73b32b9ba37b932b760691b81525081565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60135460ff161562002d665760405162461bcd60e51b815260040180806020018281038252603681526020018062004fc56036913960400191505060405180910390fd5b62002d723382620039e3565b600b54600c546001600160a01b039091169063a9059cbb90339062002d9f90859063ffffffff62003add16565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801562002def57600080fd5b505af115801562002e04573d6000803e3d6000fd5b505050506040513d602081101562002e1b57600080fd5b505162002e67576040805162461bcd60e51b815260206004820152601560248201527414da185c99481d1c985b9cd9995c8819985a5b1959605a1b604482015290519081900360640190fd5b50565b600e546001600160a01b031690565b62002e836200292d565b801562002e92575060135460ff165b62002ed3576040805162461bcd60e51b815260206004820152601960248201526000805160206200508f833981519152604482015290519081900360640190fd5b600d60009054906101000a90046001600160a01b03166001600160a01b0316637150d8ae6040518163ffffffff1660e01b815260040160206040518083038186803b15801562002f2257600080fd5b505afa15801562002f37573d6000803e3d6000fd5b505050506040513d602081101562002f4e57600080fd5b50516001600160a01b0316331462002f985760405162461bcd60e51b81526004018080602001828103825260378152602001806200501c6037913960400191505060405180910390fd5b62001dbe6040518060400160405280601281526020017121b0b731b2b63632b210313c90313abcb2b960711b81525062003b1a565b6001600160a01b03821662003029576040805162461bcd60e51b815260206004820152601860248201527f43616e277420636c61696d207a65726f20616464726573730000000000000000604482015290519081900360640190fd5b6200303482620035a6565b62003086576040805162461bcd60e51b815260206004820181905260248201527f436c61696d732064697361626c656420666f7220746869732061646472657373604482015290519081900360640190fd5b600062003093846200215c565b905060008111620030eb576040805162461bcd60e51b815260206004820152601b60248201527f556e737570706f7274656420636f6c6c61746572616c20747970650000000000604482015290519081900360640190fd5b336000620030f98562002123565b905060006200310f828563ffffffff62003add16565b9050868262003165576040805162461bcd60e51b815260206004820152601f60248201527f436c61696d6564206164647265737320686f6c6473206e6f2073686172657300604482015290519081900360640190fd5b60408051636eb1769f60e11b81526001600160a01b0386811660048301523060248301529151849284169163dd62ed3e916044808301926020929190829003018186803b158015620031b657600080fd5b505afa158015620031cb573d6000803e3d6000fd5b505050506040513d6020811015620031e257600080fd5b5051101562003238576040805162461bcd60e51b815260206004820152601f60248201527f43757272656e637920616c6c6f77616e636520696e73756666696369656e7400604482015290519081900360640190fd5b81816001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156200329057600080fd5b505afa158015620032a5573d6000803e3d6000fd5b505050506040513d6020811015620032bc57600080fd5b5051101562003312576040805162461bcd60e51b815260206004820152601d60248201527f43757272656e63792062616c616e636520696e73756666696369656e74000000604482015290519081900360640190fd5b6001600160a01b0387166000908152600660205260409020600101541562003381576040805162461bcd60e51b815260206004820152601760248201527f4164647265737320616c726561647920636c61696d6564000000000000000000604482015290519081900360640190fd5b6200338d878762003d9a565b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918316916323b872dd916064808201926020929091908290030181600087803b158015620033e757600080fd5b505af1158015620033fc573d6000803e3d6000fd5b505050506040513d60208110156200341357600080fd5b505162003464576040805162461bcd60e51b815260206004820152601a60248201527910dbdb1b185d195c985b081d1c985b9cd9995c8819985a5b195960321b604482015290519081900360640190fd5b604080516080810182526001600160a01b0386811680835260208084018781524263ffffffff9081168688019081528f8616606088019081528f87166000818152600687528a812099518a546001600160a01b031916908a16178a5594516001808b0191909155925160029099018054925163ffffffff199093169990941698909817640100000000600160c01b031916640100000000919097160295909517905582815260078252858120818155909301929092558351878152935190937f1982ca8958fc8a8176cb52be509260f4bc5af7ce04e1533711793f1c56dd535992908290030190a35050505050505050565b6001600160a01b031660009081526006602052604090206002015463ffffffff1690565b6000620035866200292d565b620035935760006200359b565b60135460ff16155b905090565b60045481565b6001600160a01b031660009081526008602052604090205460ff161590565b600f546001600160a01b031681565b6001600160a01b0383166200361b5760405162461bcd60e51b81526004018080602001828103825260248152602001806200514e6024913960400191505060405180910390fd5b6001600160a01b038216620036625760405162461bcd60e51b815260040180806020018281038252602281526020018062004f5d6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600082821115620036d157fe5b50900390565b6000620036e48462002123565b90506000620036f262000f54565b6013805460ff191690559050620037098262002d22565b60006200371d828463ffffffff620036c416565b600b546040805163a9059cbb60e01b81526001600160a01b038a8116600483015260248201859052915193945091169163a9059cbb916044808201926020929091908290030181600087803b1580156200377657600080fd5b505af11580156200378b573d6000803e3d6000fd5b505050506040513d6020811015620037a257600080fd5b5051620037f6576040805162461bcd60e51b815260206004820152601d60248201527f5772617070656420746f6b656e207472616e73666572206661696c6564000000604482015290519081900360640190fd5b6001600160a01b0385166323b872dd873062003819888663ffffffff62003add16565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156200388257600080fd5b505af115801562003897573d6000803e3d6000fd5b505050506040513d6020811015620038ae57600080fd5b505162003902576040805162461bcd60e51b815260206004820152601760248201527f4261636b696e67207472616e73666572206661696c6564000000000000000000604482015290519081900360640190fd5b5050600b80546001600160a01b0319166001600160a01b039490941693909317909255600c555050565b6200393983838362003f73565b620039436200292d565b801562003952575060135460ff165b15620039d057600d5460408051636240a7d760e11b81526001600160a01b0386811660048301528581166024830152604482018590529151919092169163c4814fae91606480830192600092919082900301818387803b158015620039b657600080fd5b505af1158015620039cb573d6000803e3d6000fd5b505050505b505050565b8181018281101562000b4b57fe5b80620039ef3362002123565b101562003a3a576040805162461bcd60e51b815260206004820152601460248201527310985b185b98d9481a5b9cdd59999a58da595b9d60621b604482015290519081900360640190fd5b62003a468282620040bd565b62003a506200292d565b801562003a5f575060135460ff165b1562002c7957600d5460408051636240a7d760e11b81526001600160a01b03858116600483015260006024830181905260448301869052925193169263c4814fae9260648084019391929182900301818387803b15801562003ac057600080fd5b505af115801562003ad5573d6000803e3d6000fd5b505050505050565b60008262003aee5750600062000b4b565b508181028183828162003afd57fe5b041462000b4b57fe5b600081838162003b1257fe5b049392505050565b600d54604080516338a86c5760e11b815290516000926001600160a01b031691637150d8ae916004808301926020929190829003018186803b15801562003b6057600080fd5b505afa15801562003b75573d6000803e3d6000fd5b505050506040513d602081101562003b8c57600080fd5b5051600d54604080516341c0e1b560e01b815290519293506001600160a01b03909116916341c0e1b59160048082019260009290919082900301818387803b15801562003bd857600080fd5b505af115801562003bed573d6000803e3d6000fd5b5050600d80546001600160a01b03191690555050604080513380825260006020808401829052606094840185815287519585019590955286516001600160a01b038716957ffef6e75af3bccd87a961c3adb40d63d6c00eafaf14fff75952fa7b214fc1aec295899390926080840191850190808383895b8381101562003c7e57818101518382015260200162003c64565b50505050905090810190601f16801562003cac5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a25050565b60006001600160a01b03821630141562003cdc5750600162000f7c565b6009546001600160a01b038381169116141562003cfd5750600a5462000f7c565b50600062000f7c565b600062000b473384846200392c565b62003d2182826200419c565b62003d2b6200292d565b801562003d3a575060135460ff165b1562002c7957600d5460408051636240a7d760e11b81526000600482018190526001600160a01b038681166024840152604483018690529251929093169263c4814fae9260648084019382900301818387803b15801562003ac057600080fd5b62003da4620042c6565b5033600090815260076020908152604091829020825180840190935280548084526001909101549183019190915262003e24576040805162461bcd60e51b815260206004820152601a60248201527f4d65737361676520686173682063616e2774206265207a65726f000000000000604482015290519081900360640190fd5b4262003e406004548360200151620039d590919063ffffffff16565b111562003e7f5760405162461bcd60e51b815260040180806020018281038252602b815260200180620050f5602b913960400191505060405180910390fd5b4262003e9b6005548360200151620039d590919063ffffffff16565b101562003eda5760405162461bcd60e51b815260040180806020018281038252602581526020018062004f7f6025913960400191505060405180910390fd5b60408051602080820185905233606090811b8385015286901b6bffffffffffffffffffffffff191660548301528251808303604801815260689092019092528051910120815114620039d0576040805162461bcd60e51b815260206004820152601e60248201527f5061636b61676520636f756c64206e6f742062652076616c6964617465640000604482015290519081900360640190fd5b6001600160a01b03831662003fba5760405162461bcd60e51b8152600401808060200182810382526025815260200180620050d06025913960400191505060405180910390fd5b6001600160a01b038216620040015760405162461bcd60e51b815260040180806020018281038252602381526020018062004f186023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546200402c908263ffffffff620036c416565b6001600160a01b03808516600090815260208190526040808220939093559084168152205462004063908263ffffffff620039d516565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b038216620041045760405162461bcd60e51b8152600401808060200182810382526021815260200180620050af6021913960400191505060405180910390fd5b60025462004119908263ffffffff620036c416565b6002556001600160a01b03821660009081526020819052604090205462004147908263ffffffff620036c416565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b6001600160a01b038216620041f8576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6002546200420d908263ffffffff620039d516565b6002556001600160a01b0382166000908152602081905260409020546200423b908263ffffffff620039d516565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60408051608081018252600080825260208201819052918101829052606081019190915290565b610c3a80620042de83390190565b60408051808201909152600080825260208201529056fe608060405234801561001057600080fd5b50604051610c3a380380610c3a8339818101604052606081101561003357600080fd5b5080516020820151604090920151909190816100b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f50726963652063616e6e6f74206265207a65726f000000000000000000000000604482015290519081900360640190fd5b600180546001600160a01b03199081163317909155600280546001600160a01b0395909516949091169390931790925560035560005542600455610b41806100f96000396000f3fe608060405234801561001057600080fd5b50600436106101215760003560e01c80639890f824116100ad578063c4814fae11610071578063c4814fae14610282578063cf42a927146102b8578063d7be4e29146102c0578063fa7f1bae146102c8578063fb286c65146102d057610121565b80639890f82414610236578063a035b1fe14610262578063b1610d7e1461026a578063b5b47f4214610272578063b80777ea1461027a57610121565b80634b91562e116100f45780634b91562e1461018c5780635ff0cf84146101b85780637150d8ae146101e45780638f1b4c6f1461020857806390e64d131461022e57610121565b80630c43cd88146101265780631703a0181461014057806341c0e1b514610148578063448ab4c614610152575b600080fd5b61012e6102d8565b60408051918252519081900360200190f35b61012e6102df565b6101506102e5565b005b6101786004803603602081101561016857600080fd5b50356001600160a01b031661033c565b604080519115158252519081900360200190f35b610150600480360360408110156101a257600080fd5b506001600160a01b03813516906020013561036f565b610150600480360360408110156101ce57600080fd5b506001600160a01b038135169060200135610417565b6101ec6104bb565b604080516001600160a01b039092168252519081900360200190f35b6101786004803603602081101561021e57600080fd5b50356001600160a01b03166104ca565b6101786104d3565b6101786004803603604081101561024c57600080fd5b506001600160a01b0381351690602001356104f7565b61012e610639565b61012e61063f565b61012e610646565b61012e61064c565b6101506004803603606081101561029857600080fd5b506001600160a01b03813581169160208101359091169060400135610652565b6101786106e5565b610178610848565b610178610907565b61012e61092b565b6276a70081565b60005481565b6001546001600160a01b0316331461032e5760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6002546001600160a01b0316ff5b600060015b6001600160a01b03831660009081526007602052604090205460ff16600281111561036857fe5b1492915050565b6001546001600160a01b031633146103b85760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6103c0610907565b610407576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041360028284610931565b5050565b6001546001600160a01b031633146104605760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b610468610907565b6104af576040805162461bcd60e51b81526020600482015260136024820152722a3432903b37ba32903430b99032b73232b21760691b604482015290519081900360640190fd5b61041360018284610931565b6002546001600160a01b031681565b60006002610341565b6000806104eb6004544261097790919063ffffffff16565b6276a700109150505b90565b600254604080516370a0823160e01b81526001600160a01b039283166004820152905160009285928492918416916370a0823191602480820192602092909190829003018186803b15801561054b57600080fd5b505afa15801561055f573d6000803e3d6000fd5b505050506040513d602081101561057557600080fd5b505160025460015460408051636eb1769f60e11b81526001600160a01b0393841660048201529183166024830152519293506000929185169163dd62ed3e91604480820192602092909190829003018186803b1580156105d457600080fd5b505afa1580156105e8573d6000803e3d6000fd5b505050506040513d60208110156105fe57600080fd5b505160035490915060009061061a90879063ffffffff61098916565b905082811115801561062c5750818111155b9450505050505b92915050565b60035481565b624f1a0081565b60055481565b60045481565b6001546001600160a01b0316331461069b5760405162461bcd60e51b8152600401808060200182810382526025815260200180610ae86025913960400191505060405180910390fd5b6106a3610907565b156106e0576001600160a01b0380841660009081526007602052604080822054928516825290205460ff91821691166106dd8282856109ae565b50505b505050565b60006106ef610907565b1561081657600054600154604080516318160ddd60e01b8152905161080e926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561073d57600080fd5b505afa158015610751573d6000803e3d6000fd5b505050506040513d602081101561076757600080fd5b5051600554600154604080516318160ddd60e01b8152905161080293612710936107f69391926001600160a01b03909116916318160ddd916004808301926020929190829003018186803b1580156107be57600080fd5b505afa1580156107d2573d6000803e3d6000fd5b505050506040513d60208110156107e857600080fd5b50519063ffffffff61097716565b9063ffffffff61098916565b9063ffffffff610ac716565b1090506104f4565b60005461080e610833600554600654610ada90919063ffffffff16565b6006546108029061271063ffffffff61098916565b6000610852610907565b156108ea57600054600154604080516318160ddd60e01b815290516108e1926001600160a01b0316916318160ddd916004808301926020929190829003018186803b1580156108a057600080fd5b505afa1580156108b4573d6000803e3d6000fd5b505050506040513d60208110156108ca57600080fd5b50516006546108029061271063ffffffff61098916565b101590506104f4565b6000546108e1610833600554600654610ada90919063ffffffff16565b60008061091f6004544261097790919063ffffffff16565b624f1a00101591505090565b60065481565b6001600160a01b0381166000908152600760205260409020805460ff811691859182919060ff1916600183600281111561096757fe5b02179055506106dd8282866109ae565b60008282111561098357fe5b50900390565b60008261099857506000610633565b50818102818382816109a657fe5b041461063357fe5b8160028111156109ba57fe5b8360028111156109c657fe5b146106e05760028360028111156109d957fe5b14156109fa576005546109f2908263ffffffff61097716565b600555610a25565b6001836002811115610a0857fe5b1415610a2557600654610a21908263ffffffff61097716565b6006555b6002826002811115610a3357fe5b1415610a5457600554610a4c908263ffffffff610ada16565b600555610a7f565b6001826002811115610a6257fe5b1415610a7f57600654610a7b908263ffffffff610ada16565b6006555b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c256600654600554604051808381526020018281526020019250505060405180910390a1505050565b6000818381610ad257fe5b049392505050565b8181018281101561063357fefe43616e206f6e6c792062652063616c6c656420627920706172656e7420636f6e7472616374a265627a7a723058203e021df2f1e574c1fee2c590149aeebec134def49ab4644aafe89f6d006ab6e264736f6c634300050a003245524332303a207472616e7366657220746f20746865207a65726f20616464726573734f6666657220776173207265706c616365642062792061206869676865722062696445524332303a20617070726f766520746f20746865207a65726f2061646472657373507265636c61696d20706572696f6420656e642e20436c61696d656420746f6f206c6174654f6666657220776173206e6f742073756666696369656e746c792066756e6465644173206c6f6e672061732074686520636f6e7472616374206973206163746976652c20796f752061726520626f756e6420746f206974447261676761626c65205365727669636548756e74657220414720536861726573596f7520617265206e6f7420617574686f72697a656420746f2063616e63656c2074686973206163717569736974696f6e206f666665724e6577206f6666657273206d757374206265206174206c6561737420352520686967686572207468616e207468652070656e64696e67206f666665725468657265206973206e6f2070656e64696e67206f666665720000000000000045524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f2061646472657373507265636c61696d20706572696f642076696f6c617465642e20436c61696d656420746f6f206561726c795468697320636f6e747261637420646f6573206e6f7420726570726573656e7420656e6f7567682065717569747945524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373596f7520617265206e6f7420617574686f72697a656420746f20636f6d706c6574652074686973206163717569736974696f6e206f66666572596f75206e65656420746f20686f6c64206174206c65617374203525206f6620746865206669726d20746f206d616b6520616e206f66666572a265627a7a723058209d00a6be25a9efd1669b127fac3aae0fb8560f2cc61d9ed20d7365555cbd251b64736f6c634300050a0032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000bc41f5259e10e36341ff0da77a5870abc698de56000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc08000000000000000000000000025a554f1b6ffbcb323c916328c55e64f6ad5af7

-----Decoded View---------------
Arg [0] : wrappedToken (address): 0xBc41F5259E10E36341ff0DA77A5870abc698de56
Arg [1] : xchfAddress (address): 0xB4272071eCAdd69d933AdcD19cA99fe80664fc08
Arg [2] : offerFeeRecipient (address): 0x025a554F1B6FfBcB323c916328c55e64f6AD5af7

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000bc41f5259e10e36341ff0da77a5870abc698de56
Arg [1] : 000000000000000000000000b4272071ecadd69d933adcd19ca99fe80664fc08
Arg [2] : 000000000000000000000000025a554f1b6ffbcb323c916328c55e64f6ad5af7


Deployed Bytecode Sourcemap

54381:1769:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54381:1769:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41700:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;54507:65;;;:::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;54507:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40778:41;;;:::i;:::-;;;;;;;;;;;;;;;;10317:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10317:148:0;;;;;;;;:::i;19842:38::-;;;:::i;:::-;;;;-1:-1:-1;;;;;19842:38:0;;;;;;;;;;;;;;47849:674;;;:::i;:::-;;9340:91;;;:::i;54813:49::-;;;:::i;26867:126::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26867:126:0;-1:-1:-1;;;;;26867:126:0;;:::i;10936:256::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10936:256:0;;;;;;;;;;;;;;;;;:::i;27572:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27572:133:0;-1:-1:-1;;;;;27572:133:0;;:::i;55363:128::-;;;:::i;54640:34::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29654:514;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29654:514:0;-1:-1:-1;;;;;29654:514:0;;:::i;54898:51::-;;;:::i;41301:32::-;;;:::i;21993:101::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21993:101:0;;;;:::i;11601:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11601:206:0;;;;;;;;:::i;27139:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27139:136:0;-1:-1:-1;;;;;27139:136:0;;:::i;46591:133::-;;;:::i;44961:164::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44961:164:0;;:::i;45261:1179::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45261:1179:0;;:::i;19535:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19535:45:0;-1:-1:-1;;;;;19535:45:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;42948:102;;;:::i;24554:235::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24554:235:0;;:::i;43170:289::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43170:289:0;-1:-1:-1;;;;;43170:289:0;;:::i;19887:35::-;;;:::i;50772:97::-;;;:::i;28151:427::-;;;:::i;46953:586::-;;;:::i;9494:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9494:110:0;-1:-1:-1;;;;;9494:110:0;;:::i;27419:145::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27419:145:0;-1:-1:-1;;;;;27419:145:0;;:::i;55499:646::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55499:646:0;-1:-1:-1;;;;;55499:646:0;;:::i;19120:37::-;;;:::i;19296:41::-;;;:::i;41130:23::-;;;:::i;19661:48::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19661:48:0;-1:-1:-1;;;;;19661:48:0;;:::i;49274:652::-;;;:::i;46448:135::-;;;:::i;28764:757::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28764:757:0;-1:-1:-1;;;;;28764:757:0;;:::i;54462:38::-;;;:::i;27001:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27001:130:0;-1:-1:-1;;;;;27001:130:0;;:::i;41192:30::-;;;:::i;12310:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12310:216:0;;;;;;;;:::i;27713:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27713:200:0;;;;;;;;:::i;50877:107::-;;;:::i;43581:478::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;43581:478:0;;;;;;;;:::i;40949:24::-;;;:::i;19410:39::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19410:39:0;-1:-1:-1;;;;;19410:39:0;;:::i;:::-;;;;-1:-1:-1;;;;;19410:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54579:52;;;:::i;10036:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10036:134:0;;;;;;;;;;:::i;44163:277::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44163:277:0;;:::i;43058:104::-;;;:::i;46732:213::-;;;:::i;25392:1467::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25392:1467:0;;;;;;;;;;;;;;;;;:::i;27283:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27283:128:0;-1:-1:-1;;;;;27283:128:0;;:::i;48531:107::-;;;:::i;19188:38::-;;;:::i;22276:119::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22276:119:0;-1:-1:-1;;;;;22276:119:0;;:::i;41014:32::-;;;:::i;41700:25::-;;;;;;:::o;54507:65::-;;;;;;;;;;;;;;;;;;;:::o;40778:41::-;;;;:::o;10317:148::-;10382:4;10399:36;10408:10;10420:7;10429:5;10399:8;:36::i;:::-;-1:-1:-1;10453:4:0;10317:148;;;;;:::o;19842:38::-;;;-1:-1:-1;;;;;19842:38:0;;:::o;47849:674::-;51035:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;51052:6:0;;;;51035:23;51027:61;;;;;-1:-1:-1;;;51027:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51027:61:0;;;;;;;;;;;;;;;47929:5;;:13;;;-1:-1:-1;;;47929:13:0;;;;47913;;-1:-1:-1;;;;;47929:5:0;;:11;;:13;;;;;;;;;;;;;;:5;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;47929:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47929:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47929:13:0;;-1:-1:-1;47961:10:0;-1:-1:-1;;;;;47961:19:0;;;47953:89;;;;-1:-1:-1;;;47953:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48061:5;;;;;;;;;-1:-1:-1;;;;;48061:5:0;-1:-1:-1;;;;;48061:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48061:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48061:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48061:23:0;48053:68;;;;;-1:-1:-1;;;48053:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48154:5;;-1:-1:-1;;;;;48154:5:0;:18;48187:21;:19;:21::i;:::-;48223:35;48241:16;48251:5;48241:9;:16::i;:::-;48223:13;:11;:13::i;:::-;:17;:35;:17;:35;:::i;:::-;48154:105;;;;;;;;;;;;;-1:-1:-1;;;;;48154:105:0;-1:-1:-1;;;;;48154:105:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48154:105:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48154:105:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48154:105:0;48132:186;;;;;-1:-1:-1;;;48132:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48351:8;;48361:5;;:13;;;-1:-1:-1;;;48361:13:0;;;;48329:46;;48344:5;;-1:-1:-1;;;;;48351:8:0;;;;48361:5;;;:11;;:13;;;;;;;;;;;;;;;:5;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;48361:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48361:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48361:13:0;48329:14;:46::i;:::-;48391:124;;;48436:10;48391:124;;48461:4;48391:124;;;;;;;;;;;;;;;;-1:-1:-1;;;48391:124:0;;;;;;-1:-1:-1;;;;;48391:124:0;;;;;;;;;;;;;51099:1;47849:674::o;9340:91::-;9411:12;;9340:91;:::o;54813:49::-;54858:4;54813:49;:::o;26867:126::-;-1:-1:-1;;;;;26957:19:0;;;26930:7;26957:19;;;:6;:19;;;;;:28;;26867:126;;;;:::o;10936:256::-;11025:4;11042:36;11052:6;11060:9;11071:6;11042:9;:36::i;:::-;-1:-1:-1;;;;;11118:19:0;;;;;;:11;:19;;;;;;;;11106:10;11118:31;;;;;;;;;11089:73;;11098:6;;11118:43;;11154:6;11118:43;:35;:43;:::i;:::-;11089:8;:73::i;:::-;-1:-1:-1;11180:4:0;10936:256;;;;;:::o;27572:133::-;-1:-1:-1;;;;;27664:25:0;27637:7;27664:25;;;:9;:25;;;;;:33;;27572:133::o;55363:128::-;55406:7;55444:20;:18;:20::i;:::-;-1:-1:-1;;;;;55433:48:0;;:50;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55433:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55433:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55433:50:0;;-1:-1:-1;55363:128:0;:::o;54640:34::-;54673:1;54640:34;:::o;29654:514::-;29736:17;:15;:17::i;:::-;-1:-1:-1;;;;;29722:31:0;:10;-1:-1:-1;;;;;29722:31:0;;29714:68;;;;;-1:-1:-1;;;29714:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29793:18;;:::i;:::-;-1:-1:-1;;;;;;29814:19:0;;;;;;;:6;:19;;;;;;;;;29793:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29899:48;;;;;-1:-1:-1;;;29899:48:0;;;;;;;;;;;;-1:-1:-1;;;29899:48:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;29965:19:0;;;;;;;:6;:19;;;;;;;;29958:26;;-1:-1:-1;;;;;;29958:26:0;;;;;;;;;;;;;-1:-1:-1;;;;;;29958:26:0;;;30021:14;;30037:16;;;;30003:51;;-1:-1:-1;;;30003:51:0;;;;;29958:26;30003:51;;;;;;;;;:17;;;;;;:51;;;;;29965:19;30003:51;;;;;;;:17;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;30003:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30003:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30003:51:0;29995:90;;;;;-1:-1:-1;;;29995:90:0;;;;;;;;;;;;-1:-1:-1;;;29995:90:0;;;;;;;;;;;;;;;30127:14;;30143:16;;;;;30101:59;;;;;;;-1:-1:-1;;;;;30101:59:0;;;;;;;;;;;;;;;29654:514;;;:::o;54898:51::-;54934:15;54898:51;:::o;41301:32::-;;;;:::o;21993:101::-;22064:10;22047:28;;;;:16;:28;;;;;:39;;-1:-1:-1;;22047:39:0;22078:8;;22047:39;;;;;;21993:101::o;11601:206::-;11707:10;11681:4;11728:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11728:32:0;;;;;;;;;;11681:4;;11698:79;;11719:7;;11728:48;;11765:10;11728:48;:36;:48;:::i;27139:136::-;-1:-1:-1;;;;;27235:19:0;;;27208:7;27235:19;;;:6;:19;;;;;:32;;;;;;;;27139:136::o;46591:133::-;51035:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;51052:6:0;;;;51035:23;51027:61;;;;;-1:-1:-1;;;51027:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51027:61:0;;;;;;;;;;;;;;;46679:5;;46658:10;;-1:-1:-1;;;;;46679:5:0;:12;46658:10;46699:16;46658:10;46699:9;:16::i;:::-;46679:37;;;;;;;;;;;;;-1:-1:-1;;;;;46679:37:0;-1:-1:-1;;;;;46679:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46679:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46679:37:0;;;;51099:1;46591:133::o;44961:164::-;45009:25;45015:10;45027:6;45009:5;:25::i;:::-;45055:20;:18;:20::i;:::-;-1:-1:-1;;;;;45045:36:0;;45082:34;45093:22;;45082:6;:10;;:34;;;;:::i;:::-;45045:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;45261:1179:0;45339:6;;;;45331:43;;;;;-1:-1:-1;;;45331:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45385:19;45415:20;:18;:20::i;:::-;-1:-1:-1;;;;;45407:41:0;;:43;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45407:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45407:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45407:43:0;;-1:-1:-1;45477:10:0;45525:48;45567:5;45525:37;45407:43;41596:4;45525:37;:15;:37;:::i;:::-;:41;:48;:41;:48;:::i;:::-;45508:13;:11;:13::i;:::-;:65;;45500:124;;;;-1:-1:-1;;;45500:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45663:39;45696:5;45663:28;:11;41473:3;45663:28;:15;:28;:::i;:39::-;45643:16;45653:5;45643:9;:16::i;:::-;:59;;45635:129;;;;-1:-1:-1;;;45635:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45785:8;;45814:17;;45833:8;;45785:57;;;-1:-1:-1;;;45785:57:0;;-1:-1:-1;;;;;45785:57:0;;;;;;;45814:17;;;45785:57;;;;;;;;;;;;:8;;;;;:21;;:57;;;;;;;;;;;;;;:8;;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;45785:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45785:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45785:57:0;45777:94;;;;;-1:-1:-1;;;45777:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45884:20;45923:10;45935:13;45950:17;;45907:61;;;;;:::i;:::-;-1:-1:-1;;;;;45907:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45907:61:0;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45907:61:0;45884:84;;45987:8;-1:-1:-1;;;;;45987:21:0;;46009;:19;:21::i;:::-;46048:16;46058:5;46048:9;:16::i;:::-;46032:13;:11;:13::i;:::-;:32;45987:78;;;;;;;;;;;;;-1:-1:-1;;;;;45987:78:0;-1:-1:-1;;;;;45987:78:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45987:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45987:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45987:78:0;45979:111;;;;;-1:-1:-1;;;45979:111:0;;;;;;;;;;;;-1:-1:-1;;;45979:111:0;;;;;;;;;;;;;;;46105:13;:11;:13::i;:::-;46101:253;;;46160:49;46203:5;46160:38;41381:5;46160;;;;;;;;;-1:-1:-1;;;;;46160:5:0;-1:-1:-1;;;;;46160:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46160:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46160:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46160:13:0;;:38;:17;:38;:::i;:49::-;46143:13;:66;;46135:139;;;;-1:-1:-1;;;46135:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46289:53;;;;;;;;;;;;;;;;;;:15;:53::i;:::-;46364:5;:16;;-1:-1:-1;;;;;;46364:16:0;-1:-1:-1;;;;;46364:16:0;;;;;;;;;;46398:34;;;;;;;;;;;;;;;;;;;;;;45261:1179;;;;:::o;19535:45::-;;;;;;;;;;;;;;;;;;;:::o;42948:102::-;43034:7;;-1:-1:-1;;;;;43034:7:0;42948:102;:::o;24554:235::-;24641:99;;;;;;;;;;;24713:15;24641:99;;;;;;;24627:10;-1:-1:-1;24617:21:0;;;:9;:21;;;;;;:123;;;;;;;;;;;;;;24756:25;;;;-1:-1:-1;24756:25:0;24554:235;:::o;43170:289::-;51162:13;:11;:13::i;:::-;51161:14;51153:51;;;;;-1:-1:-1;;;51153:51:0;;;;;;;;;;;;-1:-1:-1;;;51153:51:0;;;;;;;;;;;;;;;43259:6;;;;43251:41;;;;;-1:-1:-1;;;43251:41:0;;;;;;;;;;;;-1:-1:-1;;;43251:41:0;;;;;;;;;;;;;;;43371:11;-1:-1:-1;;;;;43311:71:0;43323:21;:19;:21::i;:::-;-1:-1:-1;;;;;43311:54:0;;:56;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43311:56:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43311:56:0;-1:-1:-1;;;;;43311:71:0;;43303:107;;;;;-1:-1:-1;;;43303:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43421:8;:30;;-1:-1:-1;;;;;;43421:30:0;-1:-1:-1;;;;;43421:30:0;;;;;;;;;;43170:289::o;19887:35::-;;;;:::o;50772:97::-;50855:5;;-1:-1:-1;;;;;50855:5:0;50772:97;:::o;28151:427::-;28202:10;28195:18;;;;:6;:18;;;;;:29;;;:34;28191:380;;28274:10;28246:18;28267;;;:6;:18;;;;;;;;:29;;;;;28336:31;;;;;28383:25;;-1:-1:-1;;;;;;28383:25:0;;;;;;;;-1:-1:-1;;;;;;28383:25:0;;;;;28431:41;;-1:-1:-1;;;28431:41:0;;28336:31;28431:41;;;;;;;;;;;;;;28267:29;;28336:31;;;;-1:-1:-1;;;;;28336:31:0;;;;28431:17;;:41;;;;;28267:18;;28431:41;;;;;;;;;28336:31;28431:41;;;5:2:-1;;;;30:1;27;20:12;5:2;28431:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28431:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28431:41:0;28423:80;;;;;-1:-1:-1;;;28423:80:0;;;;;;;;;;;;-1:-1:-1;;;28423:80:0;;;;;;;;;;;;;;;28523:36;;;;;;;;28536:10;;28523:36;;;;;;;;;;28191:380;;;28151:427::o;46953:586::-;51035:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;51052:6:0;;;;51035:23;51027:61;;;;;-1:-1:-1;;;51027:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51027:61:0;;;;;;;;;;;;;;;47020:5;;;;;;;;;-1:-1:-1;;;;;47020:5:0;-1:-1:-1;;;;;47020:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47020:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47020:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47020:18:0;47016:516;;;47055:32;;;;;;;;;;;;;;-1:-1:-1;;;47055:32:0;;;:15;:32::i;:::-;47016:516;;;47109:5;;;;;;;;;-1:-1:-1;;;;;47109:5:0;-1:-1:-1;;;;;47109:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47109:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47109:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47109:23:0;47105:427;;;47149:37;;;;;;;;;;;;;;-1:-1:-1;;;47149:37:0;;;:15;:37::i;47105:427::-;47223:5;;-1:-1:-1;;;;;47223:5:0;:18;47260:21;:19;:21::i;:::-;47300:43;47318:24;47328:5;;;;;;;;;-1:-1:-1;;;;;47328:5:0;-1:-1:-1;;;;;47328:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47328:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47328:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47328:13:0;47318:9;:24::i;47300:43::-;47223:139;;;;;;;;;;;;;-1:-1:-1;;;;;47223:139:0;-1:-1:-1;;;;;47223:139:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47223:139:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47223:139:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47223:139:0;47204:328;;47393:52;;;;;;;;;;;;;;;;;;:15;:52::i;47204:328::-;47478:42;;;-1:-1:-1;;;47478:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9494:110;-1:-1:-1;;;;;9578:18:0;9551:7;9578:18;;;;;;;;;;;;9494:110::o;27419:145::-;-1:-1:-1;;;;;27521:25:0;27494:7;27521:25;;;:9;:25;;;;;:35;;;;27419:145::o;55499:646::-;55571:7;55591:12;55606:39;55630:14;55606:23;:39::i;:::-;55591:54;-1:-1:-1;55660:8:0;;55656:482;;55692:4;-1:-1:-1;55685:11:0;;55656:482;55736:20;:18;:20::i;:::-;-1:-1:-1;;;;;55718:38:0;:14;-1:-1:-1;;;;;55718:38:0;;55714:424;;;-1:-1:-1;;55780:22:0;;55773:29;;55714:424;56032:94;56103:22;;56043:20;:18;:20::i;:::-;-1:-1:-1;;;;;56032:50:0;;56083:14;56032:66;;;;;;;;;;;;;-1:-1:-1;;;;;56032:66:0;-1:-1:-1;;;;;56032:66:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;56032:94:0;56025:101;;;;;19120:37;;;;:::o;19296:41::-;;;;:::o;41130:23::-;;;;:::o;19661:48::-;;;;;;;;;;;;;;;:::o;49274:652::-;49319:6;;;;49311:41;;;;;-1:-1:-1;;;49311:41:0;;;;;;;;;;;;-1:-1:-1;;;49311:41:0;;;;;;;;;;;;;;;49363:17;49383:10;49363:30;;49436:45;49475:5;49436:34;49454:15;;49436:13;:11;:13::i;:::-;:17;:34;:17;:34;:::i;:45::-;49412:20;49422:9;49412;:20::i;:::-;:69;;49404:100;;;;;-1:-1:-1;;;49404:100:0;;;;;;;;;;;;-1:-1:-1;;;49404:100:0;;;;;;;;;;;;;;;49521:13;:11;:13::i;:::-;49517:297;;;49556:5;;;;;;;;;-1:-1:-1;;;;;49556:5:0;-1:-1:-1;;;;;49556:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49556:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49556:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49556:23:0;49551:179;;49600:8;:6;:8::i;:::-;49665:5;;;;;;;;;-1:-1:-1;;;;;49665:5:0;-1:-1:-1;;;;;49665:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49665:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49665:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49665:23:0;49657:57;;;;;-1:-1:-1;;;49657:57:0;;;;;;;;;;;;-1:-1:-1;;;49657:57:0;;;;;;;;;;;;;;;49744:20;:18;:20::i;:::-;49788:13;:11;:13::i;:::-;49787:14;49779:23;;;;49826:47;49841:9;49859;49871:1;49826:14;:47::i;:::-;49889:29;;;-1:-1:-1;;;;;49889:29:0;;;;;;;;;;;;;;;49274:652;:::o;46448:135::-;51035:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;51052:6:0;;;;51035:23;51027:61;;;;;-1:-1:-1;;;51027:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51027:61:0;;;;;;;;;;;;;;;46537:5;;46516:10;;-1:-1:-1;;;;;46537:5:0;:13;46516:10;46558:16;46516:10;46558:9;:16::i;28764:757::-;28825:18;;:::i;:::-;-1:-1:-1;;;;;;28846:19:0;;;;;;;:6;:19;;;;;;;;;28825:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28987:15;28979:42;;;;;-1:-1:-1;;;28979:42:0;;;;;;;;;;;;-1:-1:-1;;;28979:42:0;;;;;;;;;;;;;;;29040:14;;-1:-1:-1;;;;;29040:28:0;29058:10;29040:28;29032:72;;;;;-1:-1:-1;;;29032:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29167:15;29123:40;29150:11;;29123:40;;:5;:15;;;:19;;;;:40;;;;:::i;:::-;:59;;29115:97;;;;;-1:-1:-1;;;29115:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29242:14;;-1:-1:-1;;;;;29274:19:0;;;29223:16;29274:19;;;:6;:19;;;;;;;;29267:26;;-1:-1:-1;;;;;;29267:26:0;;;;;;;;;;;;;-1:-1:-1;;;;;;29267:26:0;;;29312:39;;-1:-1:-1;;;29312:39:0;;;;;29267:26;29312:39;;;;;;;;;;;:17;;;;;;:39;;;;;29274:19;29312:39;;;;;;;:17;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;29312:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29312:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29312:39:0;29304:78;;;;;-1:-1:-1;;;29304:78:0;;;;;;;;;;;;-1:-1:-1;;;29304:78:0;;;;;;;;;;;;;;;29393:56;29403:11;29416:8;29426:22;29436:11;29426:9;:22::i;:::-;29393:9;:56::i;:::-;29492:8;-1:-1:-1;;;;;29465:48:0;29479:11;-1:-1:-1;;;;;29465:48:0;;29502:10;29465:48;;;;;;;;;;;;;;;;;;28764:757;;;;;:::o;54462:38::-;;;;;;;;;;;;;;-1:-1:-1;;;54462:38:0;;;;:::o;27001:130::-;-1:-1:-1;;;;;27093:19:0;27066:7;27093:19;;;:6;:19;;;;;:30;;;;27001:130::o;41192:30::-;;;;:::o;12310:216::-;12421:10;12395:4;12442:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12442:32:0;;;;;;;;;;12395:4;;12412:84;;12433:7;;12442:53;;12479:15;12442:53;:36;:53;:::i;27713:200::-;27782:4;27807:33;27822:9;27833:6;27807:14;:33::i;:::-;27799:61;;;;;-1:-1:-1;;;27799:61:0;;;;;;;;;;;;-1:-1:-1;;;27799:61:0;;;;;;;;;;;;;;;27871:12;:10;:12::i;50877:107::-;50921:4;;50945:17;:15;:17::i;:::-;-1:-1:-1;;;;;50945:31:0;;;50938:38;;50877:107;:::o;43581:478::-;51162:13;:11;:13::i;:::-;51161:14;51153:51;;;;;-1:-1:-1;;;51153:51:0;;;;;;;;;;;;-1:-1:-1;;;51153:51:0;;;;;;;;;;;;;;;43675:6;;;;43667:48;;;;;-1:-1:-1;;;43667:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43734:7;;:29;;;-1:-1:-1;;;43734:29:0;;43752:10;43734:29;;;;;;43767:6;;-1:-1:-1;;;;;43734:7:0;;:17;;:29;;;;;;;;;;;;;;:7;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;43734:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43734:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43734:29:0;:39;;43726:80;;;;;-1:-1:-1;;;43726:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43825:7;;:44;;;-1:-1:-1;;;43825:44:0;;43843:10;43825:44;;;;43863:4;43825:44;;;;;;43873:6;;-1:-1:-1;;;;;43825:7:0;;:17;;:44;;;;;;;;;;;;;;:7;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;43825:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43825:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43825:44:0;:54;;43817:97;;;;;-1:-1:-1;;;43817:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43933:7;;:55;;;-1:-1:-1;;;43933:55:0;;43954:10;43933:55;;;;43974:4;43933:55;;;;;;;;;;;;-1:-1:-1;;;;;43933:7:0;;;;:20;;:55;;;;;;;;;;;;;;;:7;;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;43933:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43933:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43933:55:0;43925:89;;;;;-1:-1:-1;;;43925:89:0;;;;;;;;;;;;-1:-1:-1;;;43925:89:0;;;;;;;;;;;;;;;44025:26;44031:11;44044:6;44025:5;:26::i;:::-;43581:478;;:::o;40949:24::-;;;-1:-1:-1;;;;;40949:24:0;;:::o;19410:39::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19410:39:0;;;;;;;;;;;;;;:::o;54579:52::-;;;;;;;;;;;;;;-1:-1:-1;;;54579:52:0;;;;:::o;10036:134::-;-1:-1:-1;;;;;10135:18:0;;;10108:7;10135:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10036:134::o;44163:277::-;44222:6;;;;44221:7;44213:74;;;;-1:-1:-1;;;44213:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44298:25;44304:10;44316:6;44298:5;:25::i;:::-;44342:7;;44382:22;;-1:-1:-1;;;;;44342:7:0;;;;:16;;44359:10;;44371:34;;:6;;:34;:10;:34;:::i;:::-;44342:64;;;;;;;;;;;;;-1:-1:-1;;;;;44342:64:0;-1:-1:-1;;;;;44342:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44342:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44342:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44342:64:0;44334:98;;;;;-1:-1:-1;;;44334:98:0;;;;;;;;;;;;-1:-1:-1;;;44334:98:0;;;;;;;;;;;;;;;44163:277;:::o;43058:104::-;43145:8;;-1:-1:-1;;;;;43145:8:0;43058:104;:::o;46732:213::-;51035:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;51052:6:0;;;;51035:23;51027:61;;;;;-1:-1:-1;;;51027:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;51027:61:0;;;;;;;;;;;;;;;46816:5;;;;;;;;;-1:-1:-1;;;;;46816:5:0;-1:-1:-1;;;;;46816:11:0;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46816:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46816:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46816:13:0;-1:-1:-1;;;;;46802:27:0;:10;:27;46794:95;;;;-1:-1:-1;;;46794:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46900:37;;;;;;;;;;;;;;-1:-1:-1;;;46900:37:0;;;:15;:37::i;25392:1467::-;-1:-1:-1;;;;;25499:25:0;;25491:62;;;;;-1:-1:-1;;;25491:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25572:28;25588:11;25572:15;:28::i;:::-;25564:73;;;;;-1:-1:-1;;;25564:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25648:22;25673:33;25691:14;25673:17;:33::i;:::-;25648:58;;25742:1;25725:14;:18;25717:58;;;;;-1:-1:-1;;;25717:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25805:10;25786:16;25844:22;25854:11;25844:9;:22::i;:::-;25826:40;-1:-1:-1;25877:18:0;25898:27;25826:40;25910:14;25898:27;:11;:27;:::i;:::-;25877:48;-1:-1:-1;25961:14:0;25995:11;25987:55;;;;;-1:-1:-1;;;25987:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26061:43;;;-1:-1:-1;;;26061:43:0;;-1:-1:-1;;;;;26061:43:0;;;;;;;26098:4;26061:43;;;;;;26108:10;;26061:18;;;;;:43;;;;;;;;;;;;;;:18;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;26061:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26061:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26061:43:0;:57;;26053:101;;;;;-1:-1:-1;;;26053:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26205:10;26173:8;-1:-1:-1;;;;;26173:18:0;;26192:8;26173:28;;;;;;;;;;;;;-1:-1:-1;;;;;26173:28:0;-1:-1:-1;;;;;26173:28:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26173:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26173:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26173:28:0;:42;;26165:84;;;;;-1:-1:-1;;;26165:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26268:19:0;;;;;;:6;:19;;;;;:30;;;:35;26260:71;;;;;-1:-1:-1;;;26260:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26342:33;26356:11;26369:5;26342:13;:33::i;:::-;26394:58;;;-1:-1:-1;;;26394:58:0;;-1:-1:-1;;;;;26394:58:0;;;;;;;26434:4;26394:58;;;;;;;;;;;;:21;;;;;;:58;;;;;;;;;;;;;;;-1:-1:-1;26394:21:0;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;26394:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26394:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26394:58:0;26386:97;;;;;-1:-1:-1;;;26386:97:0;;;;;;;;;;;;-1:-1:-1;;;26386:97:0;;;;;;;;;;;;;;;26518:237;;;;;;;;-1:-1:-1;;;;;26518:237:0;;;;;;;;;;;;;26627:15;26518:237;;;;;;;;;;;;;;;;;;;26496:19;;;-1:-1:-1;26496:19:0;;;:6;:19;;;;;:259;;;;-1:-1:-1;;;;;;26496:259:0;;;;;;;;;-1:-1:-1;26496:259:0;;;;;;;;;;;;;;;;;-1:-1:-1;;26496:259:0;;;;;;;;;;;-1:-1:-1;;;;;;26496:259:0;;;;;;;;;;;;;26775:19;;;:9;:19;;;;;26768:26;;;;;;;;;;26810:41;;;;;;;26518:237;;26810:41;;;;;;;;;25392:1467;;;;;;;;:::o;27283:128::-;-1:-1:-1;;;;;27374:19:0;27347:7;27374:19;;;:6;:19;;;;;:29;;;;;;27283:128::o;48531:107::-;48575:4;48599:13;:11;:13::i;:::-;:31;;48625:5;48599:31;;;48616:6;;;;48615:7;48599:31;48592:38;;48531:107;:::o;19188:38::-;;;;:::o;22276:119::-;-1:-1:-1;;;;;22363:24:0;22338:4;22363:24;;;:16;:24;;;;;;;;22362:25;;22276:119::o;41014:32::-;;;-1:-1:-1;;;;;41014:32:0;;:::o;15113:335::-;-1:-1:-1;;;;;15206:19:0;;15198:68;;;;-1:-1:-1;;;15198:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15285:21:0;;15277:68;;;;-1:-1:-1;;;15277:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15358:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;15409:31;;;;;;;;;;;;;;;;;15113:335;;;:::o;2326:123::-;2384:7;2416:1;2411;:6;;2404:14;;;;-1:-1:-1;2436:5:0;;;2326:123::o;48646:620::-;48751:20;48774:19;48784:8;48774:9;:19::i;:::-;48751:42;;48804:21;48828:13;:11;:13::i;:::-;48852:6;:14;;-1:-1:-1;;48852:14:0;;;48804:37;-1:-1:-1;48877:20:0;48884:12;48877:6;:20::i;:::-;48908:17;48928:31;:13;48946:12;48928:31;:17;:31;:::i;:::-;48978:7;;:37;;;-1:-1:-1;;;48978:37:0;;-1:-1:-1;;;;;48978:37:0;;;;;;;;;;;;;;;48908:51;;-1:-1:-1;48978:7:0;;;:16;;:37;;;;;;;;;;;;;;;:7;;:37;;;5:2:-1;;;;30:1;27;20:12;5:2;48978:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48978:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48978:37:0;48970:79;;;;;-1:-1:-1;;;48970:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49068:23:0;;;49092:8;49110:4;49117:29;:14;49136:9;49117:29;:18;:29;:::i;:::-;49068:79;;;;;;;;;;;;;-1:-1:-1;;;;;49068:79:0;-1:-1:-1;;;;;49068:79:0;;;;;;-1:-1:-1;;;;;49068:79:0;-1:-1:-1;;;;;49068:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49068:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49068:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49068:79:0;49060:115;;;;;-1:-1:-1;;;49060:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49188:7:0;:20;;-1:-1:-1;;;;;;49188:20:0;-1:-1:-1;;;;;49188:20:0;;;;;;;;;;;49219:22;:39;-1:-1:-1;;48646:620:0:o;50245:220::-;50325:32;50341:4;50347:2;50351:5;50325:15;:32::i;:::-;50372:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;50389:6:0;;;;50372:23;50368:90;;;50412:5;;:34;;;-1:-1:-1;;;50412:34:0;;-1:-1:-1;;;;;50412:34:0;;;;;;;;;;;;;;;;;;;;;;:5;;;;;:17;;:34;;;;;:5;;:34;;;;;;;:5;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;50412:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50412:34:0;;;;50368:90;50245:220;;;:::o;2518:141::-;2602:5;;;2625:6;;;;2618:14;;;50473:291;50574:6;50549:21;50559:10;50549:9;:21::i;:::-;:31;;50541:64;;;;;-1:-1:-1;;;50541:64:0;;;;;;;;;;;;-1:-1:-1;;;50541:64:0;;;;;;;;;;;;;;;50616:28;50628:7;50637:6;50616:11;:28::i;:::-;50659:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;50676:6:0;;;;50659:23;50655:102;;;50699:5;;:46;;;-1:-1:-1;;;50699:46:0;;-1:-1:-1;;;;;50699:46:0;;;;;;;:5;:46;;;;;;;;;;;;;;:5;;;:17;;:46;;;;;:5;;:46;;;;;;:5;;:46;;;5:2:-1;;;;30:1;27;20:12;5:2;50699:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50699:46:0;;;;50473:291;;:::o;1399:424::-;1457:9;1703:6;1699:47;;-1:-1:-1;1733:1:0;1726:8;;1699:47;-1:-1:-1;1762:5:0;;;1766:1;1762;:5;:1;1785:5;;;;;:10;1778:18;;;1912:295;1970:7;2198:1;2194;:5;;;;;;;1912:295;-1:-1:-1;;;1912:295:0:o;47547:294::-;47631:5;;:13;;;-1:-1:-1;;;47631:13:0;;;;47615;;-1:-1:-1;;;;;47631:5:0;;:11;;:13;;;;;;;;;;;;;;:5;:13;;;5:2:-1;;;;30:1;27;20:12;5:2;47631:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47631:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47631:13:0;47655:5;;:12;;;-1:-1:-1;;;47655:12:0;;;;47631:13;;-1:-1:-1;;;;;;47655:5:0;;;;:10;;:12;;;;;:5;;:12;;;;;;;;:5;;:12;;;5:2:-1;;;;30:1;27;20:12;5:2;47655:12:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;47678:5:0;:31;;-1:-1:-1;;;;;;47678:31:0;;;-1:-1:-1;;47725:108:0;;;47770:10;47725:108;;;47706:1;47725:108;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47725:108:0;;;;;47815:7;;47725:108;;;;;;;;;;;;47706:1;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;47725:108:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47547:294;;:::o;20260:319::-;20332:7;-1:-1:-1;;;;;20356:31:0;;20382:4;20356:31;20352:220;;;-1:-1:-1;20411:1:0;20404:8;;20352:220;20452:23;;-1:-1:-1;;;;;20434:41:0;;;20452:23;;20434:41;20430:142;;;-1:-1:-1;20499:20:0;;20492:27;;20430:142;-1:-1:-1;20559:1:0;20552:8;;9817:156;9886:4;9903:40;9913:10;9925:9;9936:6;9903:9;:40::i;49934:303::-;50002:28;50014:7;50023:6;50002:11;:28::i;:::-;50045:13;:11;:13::i;:::-;:23;;;;-1:-1:-1;50062:6:0;;;;50045:23;50041:189;;;50172:5;;:46;;;-1:-1:-1;;;50172:46:0;;:5;:46;;;;;;-1:-1:-1;;;;;50172:46:0;;;;;;;;;;;;;;;:5;;;;;:17;;:46;;;;;;;;;;:5;;:46;;;5:2:-1;;;;30:1;27;20:12;24797:587:0;24880:24;;:::i;:::-;-1:-1:-1;24917:10:0;24907:21;;;;:9;:21;;;;;;;;;24880:48;;;;;;;;;;;;;;;;;;;;;;;;;24939:60;;;;;-1:-1:-1;;;24939:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25060:15;25018:38;25041:14;;25018:8;:18;;;:22;;:38;;;;:::i;:::-;:57;;25010:113;;;;-1:-1:-1;;;25010:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25187:15;25142:41;25165:17;;25142:8;:18;;;:22;;:41;;;;:::i;:::-;:60;;25134:110;;;;-1:-1:-1;;;25134:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25293:48;;;;;;;;;;25317:10;25293:48;;;;;;;;;;;-1:-1:-1;;25293:48:0;;;;;;;26:21:-1;;;22:32;;6:49;;25293:48:0;;;;;;;25283:59;;;;;25263:16;;:79;25255:121;;;;;-1:-1:-1;;;25255:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;13016:429;-1:-1:-1;;;;;13114:20:0;;13106:70;;;;-1:-1:-1;;;13106:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13195:23:0;;13187:71;;;;-1:-1:-1;;;13187:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13291:17:0;;:9;:17;;;;;;;;;;;:29;;13313:6;13291:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;13271:17:0;;;:9;:17;;;;;;;;;;;:49;;;;13354:20;;;;;;;:32;;13379:6;13354:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;13331:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;13402:35;;;;;;;13331:20;;13402:35;;;;;;;;;;;;;13016:429;;;:::o;14367:306::-;-1:-1:-1;;;;;14442:21:0;;14434:67;;;;-1:-1:-1;;;14434:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14529:12;;:23;;14546:5;14529:23;:16;:23;:::i;:::-;14514:12;:38;-1:-1:-1;;;;;14584:18:0;;:9;:18;;;;;;;;;;;:29;;14607:5;14584:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;14563:18:0;;:9;:18;;;;;;;;;;;:50;;;;14629:36;;;;;;;14563:9;;14629:36;;;;;;;;;;;14367:306;;:::o;13726:308::-;-1:-1:-1;;;;;13802:21:0;;13794:65;;;;;-1:-1:-1;;;13794:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13887:12;;:24;;13904:6;13887:24;:16;:24;:::i;:::-;13872:12;:39;-1:-1:-1;;;;;13943:18:0;;:9;:18;;;;;;;;;;;:30;;13966:6;13943:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;13922:18:0;;:9;:18;;;;;;;;;;;:51;;;;13989:37;;;;;;;13922:18;;:9;;13989:37;;;;;;;;;;13726:308;;:::o;54381:1769::-;;;;;;;;;-1:-1:-1;54381:1769:0;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;54381:1769:0;;;;;;;;:::o

Swarm Source

bzzr://9d00a6be25a9efd1669b127fac3aae0fb8560f2cc61d9ed20d7365555cbd251b
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.