ETH Price: $3,119.39 (-5.90%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Fuxion Labs (FUXE) (@$0.0262)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve215831402025-01-08 23:47:2318 days ago1736380043IN
Fuxion Labs: FUXE Token
0 ETH0.000229735.98391032
Approve214682592024-12-23 22:47:4734 days ago1734994067IN
Fuxion Labs: FUXE Token
0 ETH0.0006659511.02579568
Approve213274672024-12-04 6:53:1154 days ago1733295191IN
Fuxion Labs: FUXE Token
0 ETH0.0010644117.52530007
Approve211781262024-11-13 10:18:3575 days ago1731493115IN
Fuxion Labs: FUXE Token
0 ETH0.001224320.17773701
Approve211570962024-11-10 11:53:4778 days ago1731239627IN
Fuxion Labs: FUXE Token
0 ETH0.0010539517.37028112
Approve211382302024-11-07 20:42:4780 days ago1731012167IN
Fuxion Labs: FUXE Token
0 ETH0.0014456323.82554941
Transfer211362722024-11-07 14:08:2381 days ago1730988503IN
Fuxion Labs: FUXE Token
0 ETH0.002860512.88630447
Approve211233582024-11-05 18:52:2382 days ago1730832743IN
Fuxion Labs: FUXE Token
0 ETH0.0007089311.68397221
Transfer211233282024-11-05 18:46:2382 days ago1730832383IN
Fuxion Labs: FUXE Token
0 ETH0.001510311.87395897
Transfer211231982024-11-05 18:19:5982 days ago1730830799IN
Fuxion Labs: FUXE Token
0 ETH0.0017482813.7483567
Approve211161452024-11-04 18:42:1183 days ago1730745731IN
Fuxion Labs: FUXE Token
0 ETH0.000365516.01805489
Approve211051842024-11-03 6:00:5985 days ago1730613659IN
Fuxion Labs: FUXE Token
0 ETH0.000461667.60866415
Approve211023642024-11-02 20:32:4785 days ago1730579567IN
Fuxion Labs: FUXE Token
0 ETH0.000319255.26165554
Transfer211020282024-11-02 19:24:5985 days ago1730575499IN
Fuxion Labs: FUXE Token
0 ETH0.000842036.61984404
Approve210856432024-10-31 12:33:2388 days ago1730378003IN
Fuxion Labs: FUXE Token
0 ETH0.000633310.43748463
Approve210805922024-10-30 19:38:3588 days ago1730317115IN
Fuxion Labs: FUXE Token
0 ETH0.0006784711.18188683
Approve210603652024-10-27 23:50:3591 days ago1730073035IN
Fuxion Labs: FUXE Token
0 ETH0.000346945.71802091
Approve210335362024-10-24 6:02:2395 days ago1729749743IN
Fuxion Labs: FUXE Token
0 ETH0.000452017.44229263
Approve210146452024-10-21 14:46:5998 days ago1729522019IN
Fuxion Labs: FUXE Token
0 ETH0.000644914.8979907
Approve210146412024-10-21 14:46:1198 days ago1729521971IN
Fuxion Labs: FUXE Token
0 ETH0.0009268615.27562528
Approve209992762024-10-19 11:20:11100 days ago1729336811IN
Fuxion Labs: FUXE Token
0 ETH0.00058149.58213928
Approve209980602024-10-19 7:15:59100 days ago1729322159IN
Fuxion Labs: FUXE Token
0 ETH0.000545618.98346712
Approve209956242024-10-18 23:06:23100 days ago1729292783IN
Fuxion Labs: FUXE Token
0 ETH0.0005864613.54806744
Approve209926382024-10-18 13:06:23101 days ago1729256783IN
Fuxion Labs: FUXE Token
0 ETH0.0015140224.92796085
Approve209853042024-10-17 12:31:35102 days ago1729168295IN
Fuxion Labs: FUXE Token
0 ETH0.002383139.23714003
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FuxionLabs

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-12
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.21;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

interface ILERC20 {
    function name() external view returns (string memory);

    function admin() external view returns (address);

    function getAdmin() external view returns (address);

    function symbol() external view returns (string memory);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address _account) external view returns (uint256);

    function transfer(
        address _recipient,
        uint256 _amount
    ) external returns (bool);

    function allowance(
        address _owner,
        address _spender
    ) external view returns (uint256);

    function approve(address _spender, uint256 _amount) external returns (bool);

    function transferFrom(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external returns (bool);

    function increaseAllowance(
        address _spender,
        uint256 _addedValue
    ) external returns (bool);

    function decreaseAllowance(
        address _spender,
        uint256 _subtractedValue
    ) external returns (bool);

    function transferOutBlacklistedFunds(address[] calldata _from) external;

    function setLosslessAdmin(address _newAdmin) external;

    function transferRecoveryAdminOwnership(
        address _candidate,
        bytes32 _keyHash
    ) external;

    function acceptRecoveryAdminOwnership(bytes memory _key) external;

    function proposeLosslessTurnOff() external;

    function executeLosslessTurnOff() external;

    function executeLosslessTurnOn() external;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(
        address indexed _owner,
        address indexed _spender,
        uint256 _value
    );
    event NewAdmin(address indexed _newAdmin);
    event NewRecoveryAdminProposal(address indexed _candidate);
    event NewRecoveryAdmin(address indexed _newAdmin);
    event LosslessTurnOffProposal(uint256 _turnOffDate);
    event LosslessOff();
    event LosslessOn();
}

interface ILssGovernance {
    function LSS_TEAM_INDEX() external view returns (uint256);

    function TOKEN_OWNER_INDEX() external view returns (uint256);

    function COMMITEE_INDEX() external view returns (uint256);

    function committeeMembersCount() external view returns (uint256);

    function walletDisputePeriod() external view returns (uint256);

    function losslessStaking() external view returns (ILssStaking);

    function losslessReporting() external view returns (ILssReporting);

    function losslessController() external view returns (ILssController);

    function isCommitteeMember(address _account) external view returns (bool);

    function getIsVoted(
        uint256 _reportId,
        uint256 _voterIndex
    ) external view returns (bool);

    function getVote(
        uint256 _reportId,
        uint256 _voterIndex
    ) external view returns (bool);

    function isReportSolved(uint256 _reportId) external view returns (bool);

    function reportResolution(uint256 _reportId) external view returns (bool);

    function getAmountReported(
        uint256 _reportId
    ) external view returns (uint256);

    function setDisputePeriod(uint256 _timeFrame) external;

    function addCommitteeMembers(address[] memory _members) external;

    function removeCommitteeMembers(address[] memory _members) external;

    function losslessVote(uint256 _reportId, bool _vote) external;

    function tokenOwnersVote(uint256 _reportId, bool _vote) external;

    function committeeMemberVote(uint256 _reportId, bool _vote) external;

    function resolveReport(uint256 _reportId) external;

    function proposeWallet(uint256 _reportId, address wallet) external;

    function rejectWallet(uint256 _reportId) external;

    function retrieveFunds(uint256 _reportId) external;

    function retrieveCompensation() external;

    function claimCommitteeReward(uint256 _reportId) external;

    function setCompensationAmount(uint256 _amount) external;

    function losslessClaim(uint256 _reportId) external;

    function extaordinaryRetrieval(
        address[] calldata _address,
        ILERC20 _token
    ) external;

    event NewCommitteeMembers(address[] _members);
    event CommitteeMembersRemoval(address[] _members);
    event LosslessTeamPositiveVote(uint256 indexed _reportId);
    event LosslessTeamNegativeVote(uint256 indexed _reportId);
    event TokenOwnersPositiveVote(uint256 indexed _reportId);
    event TokenOwnersNegativeVote(uint256 indexed _reportId);
    event CommitteeMemberPositiveVote(
        uint256 indexed _reportId,
        address indexed _member
    );
    event CommitteeMemberNegativeVote(
        uint256 indexed _reportId,
        address indexed _member
    );
    event ReportResolve(uint256 indexed _reportId, bool indexed _resolution);
    event WalletProposal(uint256 indexed _reportId, address indexed _wallet);
    event CommitteeMemberClaim(
        uint256 indexed _reportId,
        address indexed _member,
        uint256 indexed _amount
    );
    event CommitteeMajorityReach(
        uint256 indexed _reportId,
        bool indexed _result
    );
    event NewDisputePeriod(uint256 indexed _newPeriod);
    event WalletRejection(uint256 indexed _reportId);
    event FundsRetrieval(uint256 indexed _reportId, uint256 indexed _amount);
    event CompensationRetrieval(
        address indexed _wallet,
        uint256 indexed _amount
    );
    event LosslessClaim(
        ILERC20 indexed _token,
        uint256 indexed _reportID,
        uint256 indexed _amount
    );
    event ExtraordinaryProposalAccept(ILERC20 indexed _token);
}

interface ILssStaking {
    function stakingToken() external returns (ILERC20);

    function losslessReporting() external returns (ILssReporting);

    function losslessController() external returns (ILssController);

    function losslessGovernance() external returns (ILssGovernance);

    function stakingAmount() external returns (uint256);

    function getVersion() external pure returns (uint256);

    function getIsAccountStaked(
        uint256 _reportId,
        address _account
    ) external view returns (bool);

    function getStakerCoefficient(
        uint256 _reportId,
        address _address
    ) external view returns (uint256);

    function stakerClaimableAmount(
        uint256 _reportId
    ) external view returns (uint256);

    function reportCoefficient(
        uint256 _reportId
    ) external view returns (uint256);

    function pause() external;

    function unpause() external;

    function setLssReporting(ILssReporting _losslessReporting) external;

    function setStakingToken(ILERC20 _stakingToken) external;

    function setLosslessGovernance(ILssGovernance _losslessGovernance) external;

    function setStakingAmount(uint256 _stakingAmount) external;

    function stake(uint256 _reportId) external;

    function stakerClaim(uint256 _reportId) external;

    event NewStake(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event StakerClaim(
        address indexed _staker,
        ILERC20 indexed _token,
        uint256 indexed _reportID,
        uint256 _amount
    );
    event NewStakingAmount(uint256 indexed _newAmount);
    event NewStakingToken(ILERC20 indexed _newToken);
    event NewReportingContract(ILssReporting indexed _newContract);
    event NewGovernanceContract(ILssGovernance indexed _newContract);
}

interface ILssReporting {
    function reporterReward() external returns (uint256);

    function losslessReward() external returns (uint256);

    function stakersReward() external returns (uint256);

    function committeeReward() external returns (uint256);

    function reportLifetime() external view returns (uint256);

    function reportingAmount() external returns (uint256);

    function reportCount() external returns (uint256);

    function stakingToken() external returns (ILERC20);

    function losslessController() external returns (ILssController);

    function losslessGovernance() external returns (ILssGovernance);

    function getVersion() external pure returns (uint256);

    function getRewards()
        external
        view
        returns (
            uint256 _reporter,
            uint256 _lossless,
            uint256 _committee,
            uint256 _stakers
        );

    function report(
        ILERC20 _token,
        address _account
    ) external returns (uint256);

    function reporterClaimableAmount(
        uint256 _reportId
    ) external view returns (uint256);

    function getReportInfo(
        uint256 _reportId
    )
        external
        view
        returns (
            address _reporter,
            address _reportedAddress,
            address _secondReportedAddress,
            uint256 _reportTimestamps,
            ILERC20 _reportTokens,
            bool _secondReports,
            bool _reporterClaimStatus
        );

    function pause() external;

    function unpause() external;

    function setStakingToken(ILERC20 _stakingToken) external;

    function setLosslessGovernance(ILssGovernance _losslessGovernance) external;

    function setReportingAmount(uint256 _reportingAmount) external;

    function setReporterReward(uint256 _reward) external;

    function setLosslessReward(uint256 _reward) external;

    function setStakersReward(uint256 _reward) external;

    function setCommitteeReward(uint256 _reward) external;

    function setReportLifetime(uint256 _lifetime) external;

    function secondReport(uint256 _reportId, address _account) external;

    function reporterClaim(uint256 _reportId) external;

    function retrieveCompensation(address _adr, uint256 _amount) external;

    event ReportSubmission(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event SecondReportSubmission(
        ILERC20 indexed _token,
        address indexed _account,
        uint256 indexed _reportId
    );
    event NewReportingAmount(uint256 indexed _newAmount);
    event NewStakingToken(ILERC20 indexed _token);
    event NewGovernanceContract(ILssGovernance indexed _adr);
    event NewReporterReward(uint256 indexed _newValue);
    event NewLosslessReward(uint256 indexed _newValue);
    event NewStakersReward(uint256 indexed _newValue);
    event NewCommitteeReward(uint256 indexed _newValue);
    event NewReportLifetime(uint256 indexed _newValue);
    event ReporterClaim(
        address indexed _reporter,
        uint256 indexed _reportId,
        uint256 indexed _amount
    );
    event CompensationRetrieve(address indexed _adr, uint256 indexed _amount);
}

interface ProtectionStrategy {
    function isTransferAllowed(
        address token,
        address sender,
        address recipient,
        uint256 amount
    ) external;
}

interface ILssController {
    // function getLockedAmount(ILERC20 _token, address _account)  returns (uint256);
    // function getAvailableAmount(ILERC20 _token, address _account) external view returns (uint256 amount);
    function retrieveBlacklistedFunds(
        address[] calldata _addresses,
        ILERC20 _token,
        uint256 _reportId
    ) external returns (uint256);

    function whitelist(address _adr) external view returns (bool);

    function dexList(address _dexAddress) external returns (bool);

    function blacklist(address _adr) external view returns (bool);

    function admin() external view returns (address);

    function pauseAdmin() external view returns (address);

    function recoveryAdmin() external view returns (address);

    function guardian() external view returns (address);

    function losslessStaking() external view returns (ILssStaking);

    function losslessReporting() external view returns (ILssReporting);

    function losslessGovernance() external view returns (ILssGovernance);

    function dexTranferThreshold() external view returns (uint256);

    function settlementTimeLock() external view returns (uint256);

    function extraordinaryRetrievalProposalPeriod()
        external
        view
        returns (uint256);

    function pause() external;

    function unpause() external;

    function setAdmin(address _newAdmin) external;

    function setRecoveryAdmin(address _newRecoveryAdmin) external;

    function setPauseAdmin(address _newPauseAdmin) external;

    function setSettlementTimeLock(uint256 _newTimelock) external;

    function setDexTransferThreshold(uint256 _newThreshold) external;

    function setDexList(address[] calldata _dexList, bool _value) external;

    function setWhitelist(address[] calldata _addrList, bool _value) external;

    function addToBlacklist(address _adr) external;

    function resolvedNegatively(address _adr) external;

    function setStakingContractAddress(ILssStaking _adr) external;

    function setReportingContractAddress(ILssReporting _adr) external;

    function setGovernanceContractAddress(ILssGovernance _adr) external;

    function setTokenMintLimit(ILERC20 _token, uint256 limit) external;

    function setTokenMintPeriod(ILERC20 _token, uint256 _period) external;

    function setTokenBurnLimit(ILERC20 _token, uint256 _limit) external;

    function setTokenBurnPeriod(ILERC20 _token, uint256 _period) external;

    function proposeNewSettlementPeriod(
        ILERC20 _token,
        uint256 _seconds
    ) external;

    function executeNewSettlementPeriod(ILERC20 _token) external;

    function activateEmergency(ILERC20 _token) external;

    function deactivateEmergency(ILERC20 _token) external;

    function setGuardian(address _newGuardian) external;

    function removeProtectedAddress(
        ILERC20 _token,
        address _protectedAddresss
    ) external;

    function beforeTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function beforeTransferFrom(
        address _msgSender,
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function beforeApprove(
        address _sender,
        address _spender,
        uint256 _amount
    ) external;

    function beforeIncreaseAllowance(
        address _msgSender,
        address _spender,
        uint256 _addedValue
    ) external;

    function beforeDecreaseAllowance(
        address _msgSender,
        address _spender,
        uint256 _subtractedValue
    ) external;

    function beforeMint(address _to, uint256 _amount) external;

    function beforeBurn(address _account, uint256 _amount) external;

    function afterTransfer(
        address _sender,
        address _recipient,
        uint256 _amount
    ) external;

    function setProtectedAddress(
        ILERC20 _token,
        address _protectedAddress,
        ProtectionStrategy _strategy
    ) external;

    function setExtraordinaryRetrievalPeriod(uint256 _newPEriod) external;

    function extraordinaryRetrieval(
        ILERC20 _token,
        address[] calldata addresses,
        uint256 fundsToRetrieve
    ) external;

    event AdminChange(address indexed _newAdmin);
    event RecoveryAdminChange(address indexed _newAdmin);
    event PauseAdminChange(address indexed _newAdmin);
    event GuardianSet(
        address indexed _oldGuardian,
        address indexed _newGuardian
    );
    event NewProtectedAddress(
        ILERC20 indexed _token,
        address indexed _protectedAddress,
        address indexed _strategy
    );
    event RemovedProtectedAddress(
        ILERC20 indexed _token,
        address indexed _protectedAddress
    );
    event NewSettlementPeriodProposal(ILERC20 indexed _token, uint256 _seconds);
    event SettlementPeriodChange(
        ILERC20 indexed _token,
        uint256 _proposedTokenLockTimeframe
    );
    event NewSettlementTimelock(uint256 indexed _timelock);
    event NewDexThreshold(uint256 indexed _newThreshold);
    event NewDex(address indexed _dexAddress);
    event DexRemoval(address indexed _dexAddress);
    event NewWhitelistedAddress(address indexed _whitelistAdr);
    event WhitelistedAddressRemoval(address indexed _whitelistAdr);
    event NewBlacklistedAddress(address indexed _blacklistedAddres);
    event AccountBlacklistRemoval(address indexed _adr);
    event NewStakingContract(ILssStaking indexed _newAdr);
    event NewReportingContract(ILssReporting indexed _newAdr);
    event NewGovernanceContract(ILssGovernance indexed _newAdr);
    event EmergencyActive(ILERC20 indexed _token);
    event EmergencyDeactivation(ILERC20 indexed _token);
    event NewMint(
        ILERC20 indexed token,
        address indexed account,
        uint256 indexed amount
    );
    event NewMintLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewMintPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewBurn(
        ILERC20 indexed token,
        address indexed account,
        uint256 indexed amount
    );
    event NewBurnLimit(ILERC20 indexed token, uint256 indexed limit);
    event NewBurnPeriod(ILERC20 indexed token, uint256 indexed period);
    event NewExtraordinaryPeriod(
        uint256 indexed extraordinaryRetrievalProposalPeriod
    );
}

contract LERC20 is Context, ILERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    address public recoveryAdmin;
    address private recoveryAdminCandidate;
    bytes32 private recoveryAdminKeyHash;
    address public override admin;
    uint256 public timelockPeriod;
    uint256 public losslessTurnOffTimestamp;
    bool public isLosslessOn = true;
    ILssController public lossless;

    constructor(
        string memory name_,
        string memory symbol_,
        address admin_,
        address recoveryAdmin_,
        uint256 timelockPeriod_,
        address lossless_
    ) {
        _name = name_;
        _symbol = symbol_;
        admin = admin_;
        recoveryAdmin = recoveryAdmin_;
        recoveryAdminCandidate = address(0);
        recoveryAdminKeyHash = "";
        timelockPeriod = timelockPeriod_;
        losslessTurnOffTimestamp = 0;
        lossless = ILssController(lossless_);
    }

    // --- LOSSLESS modifiers ---

    modifier lssAprove(address spender, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeApprove(_msgSender(), spender, amount);
        }
        _;
    }

    modifier lssTransfer(address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransfer(_msgSender(), recipient, amount);
        }
        _;
    }

    modifier lssTransferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) {
        if (isLosslessOn) {
            lossless.beforeTransferFrom(
                _msgSender(),
                sender,
                recipient,
                amount
            );
        }
        _;
    }

    modifier lssIncreaseAllowance(address spender, uint256 addedValue) {
        if (isLosslessOn) {
            lossless.beforeIncreaseAllowance(_msgSender(), spender, addedValue);
        }
        _;
    }

    modifier lssDecreaseAllowance(address spender, uint256 subtractedValue) {
        if (isLosslessOn) {
            lossless.beforeDecreaseAllowance(
                _msgSender(),
                spender,
                subtractedValue
            );
        }
        _;
    }

    modifier onlyRecoveryAdmin() {
        require(
            _msgSender() == recoveryAdmin,
            "LERC20: Must be recovery admin"
        );
        _;
    }

    // --- LOSSLESS management ---
    function transferOutBlacklistedFunds(
        address[] calldata from
    ) external override {
        require(
            _msgSender() == address(lossless),
            "LERC20: Only lossless contract"
        );
        require(isLosslessOn, "LERC20: Lossless is off");

        uint256 fromLength = from.length;
        uint256 totalAmount = 0;

        for (uint256 i = 0; i < fromLength; i++) {
            address fromAddress = from[i];
            uint256 fromBalance = _balances[fromAddress];
            _balances[fromAddress] = 0;
            totalAmount += fromBalance;
            emit Transfer(fromAddress, address(lossless), fromBalance);
        }

        _balances[address(lossless)] += totalAmount;
    }

    function setLosslessAdmin(
        address newAdmin
    ) external override onlyRecoveryAdmin {
        require(newAdmin != admin, "LERC20: Cannot set same address");
        emit NewAdmin(newAdmin);
        admin = newAdmin;
    }

    function transferRecoveryAdminOwnership(
        address candidate,
        bytes32 keyHash
    ) external override onlyRecoveryAdmin {
        recoveryAdminCandidate = candidate;
        recoveryAdminKeyHash = keyHash;
        emit NewRecoveryAdminProposal(candidate);
    }

    function acceptRecoveryAdminOwnership(bytes memory key) external override {
        require(
            _msgSender() == recoveryAdminCandidate,
            "LERC20: Must be canditate"
        );
        require(keccak256(key) == recoveryAdminKeyHash, "LERC20: Invalid key");
        emit NewRecoveryAdmin(recoveryAdminCandidate);
        recoveryAdmin = recoveryAdminCandidate;
        recoveryAdminCandidate = address(0);
    }

    function proposeLosslessTurnOff() external override onlyRecoveryAdmin {
        require(
            losslessTurnOffTimestamp == 0,
            "LERC20: TurnOff already proposed"
        );
        require(isLosslessOn, "LERC20: Lossless already off");
        losslessTurnOffTimestamp = block.timestamp + timelockPeriod;
        emit LosslessTurnOffProposal(losslessTurnOffTimestamp);
    }

    function executeLosslessTurnOff() external override onlyRecoveryAdmin {
        require(losslessTurnOffTimestamp != 0, "LERC20: TurnOff not proposed");
        require(
            losslessTurnOffTimestamp <= block.timestamp,
            "LERC20: Time lock in progress"
        );
        isLosslessOn = false;
        losslessTurnOffTimestamp = 0;
        emit LosslessOff();
    }

    function executeLosslessTurnOn() external override onlyRecoveryAdmin {
        require(!isLosslessOn, "LERC20: Lossless already on");
        losslessTurnOffTimestamp = 0;
        isLosslessOn = true;
        emit LosslessOn();
    }

    function getAdmin() public view virtual override returns (address) {
        return admin;
    }

    // --- ERC20 methods ---

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

    function transfer(
        address recipient,
        uint256 amount
    ) public virtual override lssTransfer(recipient, amount) returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(
        address owner,
        address spender
    ) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(
        address spender,
        uint256 amount
    ) public virtual override lssAprove(spender, amount) returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    )
        public
        virtual
        override
        lssTransferFrom(sender, recipient, amount)
        returns (bool)
    {
        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(
            currentAllowance >= amount,
            "LERC20: transfer amount exceeds allowance"
        );
        _transfer(sender, recipient, amount);

        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    )
        public
        virtual
        override
        lssIncreaseAllowance(spender, addedValue)
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender] + addedValue
        );
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    )
        public
        virtual
        override
        lssDecreaseAllowance(spender, subtractedValue)
        returns (bool)
    {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(
            currentAllowance >= subtractedValue,
            "LERC20: decreased allowance below zero"
        );
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "LERC20: transfer from the zero address");

        uint256 senderBalance = _balances[sender];
        require(
            senderBalance >= amount,
            "LERC20: transfer amount exceeds balance"
        );
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "LERC20: mint to the zero address");

        _totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(
            newOwner != address(0),
            "Ownable: new owner is the zero address"
        );
        _transferOwnership(newOwner);
    }

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

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountA, uint amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountToken, uint amountETH);

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function swapTokensForExactETH(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

    function swapETHForExactTokens(
        uint amountOut,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable returns (uint[] memory amounts);

    function quote(
        uint amountA,
        uint reserveA,
        uint reserveB
    ) external pure returns (uint amountB);

    function getAmountOut(
        uint amountIn,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountOut);

    function getAmountIn(
        uint amountOut,
        uint reserveIn,
        uint reserveOut
    ) external pure returns (uint amountIn);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address pair);

    function allPairs(uint) external view returns (address pair);

    function allPairsLength() external view returns (uint);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint);

    function balanceOf(address owner) external view returns (uint);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);

    function transfer(address to, uint value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint);

    function permit(
        address owner,
        address spender,
        uint value,
        uint deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Cast(address indexed sender, uint amount0, uint amount1);
    event Burn(
        address indexed sender,
        uint amount0,
        uint amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);

    function price0CumulativeLast() external view returns (uint);

    function price1CumulativeLast() external view returns (uint);

    function kLast() external view returns (uint);

    function burn(address to) external returns (uint amount0, uint amount1);

    function swap(
        uint amount0Out,
        uint amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

error FUXION__MaxWalletReached(address wallet, uint triedBalance);
error FUXION__Blacklisted();
error FUXION__InvalidThreshold();
error FUXION__TradingNotEnabled();
error FUXION__NotAllowed();
error FUXION__InvalidTaxAmount();
error FUXION__InvalidMaxWallet();

contract FuxionLabs is Ownable, LERC20 {
    //---------------------------------------------------------------------------------
    // Structs
    //---------------------------------------------------------------------------------

    struct SnapshotInfo {
        uint tier1Total; // Tier 1 eligible balance
        uint tier2Total; // Tier 2 eligible balance
        uint snapshotTakenTimestamp; // Timestamp of the snapshot
    }
    //---------------------------------------------------------------------------------
    // State Variables
    //---------------------------------------------------------------------------------

    mapping(address user => mapping(uint snapId => uint amount))
        public snapshotInfo;
    mapping(address user => uint lastSnapshotId) public lastSnapshotId;
    mapping(uint snapId => SnapshotInfo) public snapshots;
    mapping(address wallet => bool excludedStatus) public isExcludedFromTax;
    mapping(address wallet => bool excludedStatus)
        public isExcludedFromMaxWallet;
    mapping(address wallet => bool dividendExcepmtionStatus)
        public isDividendExempt;
    mapping(address lpAddress => bool) public isLpAddress;
    mapping(address executor => bool isExecutor) public isSnapshotter;

    uint private constant MAX_SUPPLY = 5_000_000 ether;
    uint private constant TIER_1 = 50_000 ether; // TIER 1 is top TIER
    uint private constant TIER_2 = 1_000 ether; // TIER 2 is middle TIER
    uint private constant TAX_PERCENT = 100;
    IUniswapV2Router02 public router;

    address public mainPair;
    address private immutable WETH;
    address payable public immutable ADMIN_WALLET;
    uint public currentSnapId = 0;
    uint public taxThreshold;

    uint public maxWallet;
    uint public buyTax = 5;
    uint public sellTax = 5;

    bool private isSwapping = false;
    bool public tradingEnabled = false;

    //---------------------------------------------------------------------------------
    // Events
    //---------------------------------------------------------------------------------

    event WalletExcludedFromTax(address indexed _user, bool excluded);
    event WalletExcludedFromMax(address indexed _user, bool excluded);
    event BlacklistWalletsUpdate(address[] _users, bool blacklisted);
    event SetAddressAsLp(address indexed _lpAddress, bool isLpAddress);
    event SnapshotTaken(uint indexed snapId, uint timestamp);
    event TradingEnabled(bool isEnabled);
    event UpdateBlacklister(address indexed _blacklister);
    event SetSnapshotterStatus(address indexed _snapshotter, bool status);
    event EditMaxWalletAmount(uint newAmount);
    event EditTax(uint newTax, bool buyTax, bool sellTax);

    //---------------------------------------------------------------------------------
    // Modifiers
    //---------------------------------------------------------------------------------

    modifier onlySnapshotter() {
        if (!isSnapshotter[msg.sender]) revert FUXION__NotAllowed();
        _;
    }

    //---------------------------------------------------------------------------------
    // Constructor
    //---------------------------------------------------------------------------------

    constructor(
        address _admin,
        address _newOwner,
        address _recoveryAdmin,
        address lossless_,
        uint256 timeLockPeriod_
    )
        LERC20(
            "Fuxion Labs",
            "FUXE",
            address(_admin),
            address(_recoveryAdmin),
            timeLockPeriod_,
            address(lossless_)
        )
    {
        require(_newOwner != address(0), "FUXION__InvalidAddress");
        _transferOwnership(_newOwner);
        _mint(_newOwner, MAX_SUPPLY);

        maxWallet = (MAX_SUPPLY * 10) / 100_0; // 1% of total supply
        taxThreshold = MAX_SUPPLY / 100_00; // 0.01% of total supply

        // Ethereum Mainnet UniswapV2 Router
        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        WETH = router.WETH();
        // Create the Pair for this token with WETH
        mainPair = IUniswapV2Factory(router.factory()).createPair(
            address(this),
            WETH
        );
        isLpAddress[mainPair] = true;

        isExcludedFromMaxWallet[address(this)] = true;
        isExcludedFromMaxWallet[owner()] = true;
        isExcludedFromMaxWallet[address(router)] = true;
        isExcludedFromMaxWallet[address(mainPair)] = true;

        isExcludedFromTax[owner()] = true;
        isExcludedFromTax[address(this)] = true;
        isExcludedFromTax[address(router)] = true;

        isDividendExempt[owner()] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[address(router)] = true;
        isDividendExempt[address(mainPair)] = true;

        isSnapshotter[owner()] = true;
        ADMIN_WALLET = payable(_admin);
        _approve(address(this), address(router), type(uint).max);
    }

    //---------------------------------------------------------------------------------
    // External & Public Functions
    //---------------------------------------------------------------------------------

    /**
     * Set wether an address is excluded from taxes or NOT.
     * @param _user User which status will be updated
     * @param _excluded The new excluded status. True is Excluded, False is NOT excluded
     */
    function setExcludeFromTax(
        address _user,
        bool _excluded
    ) external onlyOwner {
        require(_user != address(0), "FUXION__InvalidAddress");
        require(
            isExcludedFromTax[_user] != _excluded,
            "FUXION__AlreadyExcluded"
        );
        isExcludedFromTax[_user] = _excluded;
        emit WalletExcludedFromTax(_user, _excluded);
    }

    /**
     * Exclude or include a wallet of MAX wallet limit (AntiWhale)
     * @param _user Address which status will be updated
     * @param _excluded The new excluded status. True is Excluded, False is NOT excluded
     */
    function setExcludedFromMaxWallet(
        address _user,
        bool _excluded
    ) external onlyOwner {
        require(_user != address(0), "FUXION__InvalidAddress");
        require(
            isExcludedFromMaxWallet[_user] != _excluded,
            "FUXION__AlreadyExcluded"
        );
        isExcludedFromMaxWallet[_user] = _excluded;
        emit WalletExcludedFromMax(_user, _excluded);
    }

    /**
     * @notice Set an Address as LP
     * @param _lpAddress Address to set as LP
     * @param _isLpAddress enable or disable address as an LP
     */
    function setLpAddress(
        address _lpAddress,
        bool _isLpAddress
    ) external onlyOwner {
        require(_lpAddress != address(0), "FUXION__InvalidAddress");
        require(isLpAddress[_lpAddress] != _isLpAddress, "FUXION__AlreadySet");
        require(
            isDividendExempt[_lpAddress] != _isLpAddress,
            "FUXION__Invalid"
        );
        isLpAddress[_lpAddress] = _isLpAddress;
        isDividendExempt[_lpAddress] = _isLpAddress;
        emit SetAddressAsLp(_lpAddress, _isLpAddress);
    }

    /**
     * @notice Create a snapshot of the current balances
     */
    function takeSnapshot() external onlySnapshotter {
        uint currentSnap = currentSnapId;
        currentSnapId++;

        SnapshotInfo storage snap = snapshots[currentSnap];
        snap.snapshotTakenTimestamp = block.timestamp;
        // roll over total amounts
        snapshots[currentSnapId] = SnapshotInfo({
            tier1Total: snap.tier1Total,
            tier2Total: snap.tier2Total,
            snapshotTakenTimestamp: 0
        });

        emit SnapshotTaken(currentSnap, block.timestamp);
    }

    /**
     * @notice Set the new Tax swap threshold
     * @param _taxThreshold New tax threshold
     */
    function setTaxThreshold(uint _taxThreshold) external onlyOwner {
        require(_taxThreshold > 0, "FUXION__InvalidThreshold");

        if (_taxThreshold > MAX_SUPPLY) revert FUXION__InvalidThreshold();
        taxThreshold = _taxThreshold;
    }

    function setMaxWallet(uint _maxWallet) external onlyOwner {
        require(_maxWallet > 0, "FUXION__InvalidMaxWallet");
        if (_maxWallet < MAX_SUPPLY / 100_00) revert FUXION__InvalidMaxWallet();
        maxWallet = _maxWallet;
        emit EditMaxWalletAmount(_maxWallet);
    }

    /**
     * @notice set trading as enabled
     */
    function enableTrading() external onlyOwner {
        tradingEnabled = true;
        emit TradingEnabled(true);
    }

    /**
     * @notice set trading as disabled
     */
    function pauseTrading() external onlyOwner {
        tradingEnabled = false;
        emit TradingEnabled(false);
    }

    /**
     * @notice Set the Snapshotter status to an address. These addresses can take snapshots at any time
     * @param _snapshotter Address to set snapshotter status
     * @param _isSnapshotter True to set as snapshotter, false to remove
     */
    function setSnapshotterAddress(
        address _snapshotter,
        bool _isSnapshotter
    ) external onlyOwner {
        require(_snapshotter != address(0), "FUXION__InvalidAddress");
        require(
            isSnapshotter[_snapshotter] != _isSnapshotter,
            "FUXION__AlreadySet"
        );
        isSnapshotter[_snapshotter] = _isSnapshotter;
        emit SetSnapshotterStatus(_snapshotter, _isSnapshotter);
    }

    /**
     * @notice set the Buy tax to a new value
     * @param _buyTax New buy tax
     * @dev buyTax is a maximimum of 10% so the max acceptable _buyTax is 10
     */
    function setBuyTax(uint _buyTax) external onlyOwner {
        require(_buyTax > 0, "FUXION__InvalidTaxAmount");
        if (_buyTax > 10) revert FUXION__InvalidTaxAmount();
        buyTax = _buyTax;
        emit EditTax(_buyTax, true, false);
    }

    /**
     * @notice set the Sell tax to a new value
     * @param _sellTax New sell tax
     * @dev sellTax is a maximimum of 10% so the max acceptable _sellTax is 10
     */
    function setSellTax(uint _sellTax) external onlyOwner {
        require(_sellTax > 0, "FUXION__InvalidTaxAmount");
        if (_sellTax > 10) revert FUXION__InvalidTaxAmount();
        sellTax = _sellTax;
        emit EditTax(_sellTax, false, true);
    }

    //---------------------------------------------------------------------------------
    // Internal & Private Functions
    //---------------------------------------------------------------------------------

    /**
     * @notice Underlying transfer of tokens used by `transfer` and `transferFrom` in ERC20 which are public
     * @param from Address that holds the funds
     * @param to Address that receives the funds
     * @param amount Amount of funds to send
     */
    function _transfer(
        address from,
        address to,
        uint amount
    ) internal override {
        bool taxExclusion = isExcludedFromTax[from] || isExcludedFromTax[to];

        if (!tradingEnabled && !taxExclusion) {
            revert FUXION__TradingNotEnabled();
        }

        _updateSnapDecrease(from, amount);

        uint currentBalance = balanceOf(address(this));

        if (
            !isSwapping &&
            currentBalance >= taxThreshold &&
            !taxExclusion &&
            !isLpAddress[from] // Cant do this on buys
        ) {
            _swapTokens();
        }

        // Check that sender is free of tax or receiver is free of tax
        if (!taxExclusion) {
            uint tax;
            // if not free of tax, check if is buy or sell
            if (isLpAddress[to]) {
                // IS SELL
                tax = (amount * sellTax) / TAX_PERCENT;
            } else if (isLpAddress[from]) {
                // IS BUY
                tax = (amount * buyTax) / TAX_PERCENT;
            }
            if (tax > 0) {
                super._transfer(from, address(this), tax);
                amount -= tax;
            }
        }

        // check if receiver is free of max wallet
        uint toNEWBalance = balanceOf(to) + amount;
        if (!isExcludedFromMaxWallet[to] && toNEWBalance > maxWallet) {
            revert FUXION__MaxWalletReached(to, toNEWBalance);
        }
        _updateSnapIncrease(to, amount);
        super._transfer(from, to, amount);
    }

    /**
     * @notice Swap any tokens the contract has for ETH and send the ETH directly to the Admin Wallet
     */
    function _swapTokens() private {
        isSwapping = true;
        // Get the current amount of tokens stored in the contract
        uint256 contractTokenBalance = balanceOf(address(this));
        // If the contract has tokens
        if (contractTokenBalance > 0) {
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = WETH;
            // Swap all for ETH and send to Admin Wallet
            router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                contractTokenBalance,
                0, // Accept any amount of ETH
                path,
                ADMIN_WALLET,
                block.timestamp
            );
        }
        isSwapping = false;
    }

    /**
     * @notice Decrease a wallet's current snapshot balance
     * @param user Wallet to update snapshot info
     * @param amount the difference amount in snapshot
     */
    function _updateSnapDecrease(address user, uint amount) private {
        uint currentSnap = currentSnapId;
        uint currentSnapBalance = snapshotInfo[user][currentSnap];
        uint currentBalance = balanceOf(user);
        uint newBalance = currentBalance - amount;
        SnapshotInfo storage snap = snapshots[currentSnap];
        lastSnapshotId[user] = currentSnap;
        // If user is exempt from dividends, we need to set the snapshot value to 0
        if (isDividendExempt[user]) {
            delete snapshotInfo[user][currentSnap];
            // if user is now exempt but used to have funds, we need to decrease the total
            if (currentSnapBalance > 0) {
                if (currentSnapBalance >= TIER_1)
                    snap.tier1Total -= currentSnapBalance;
                else if (currentSnapBalance >= TIER_2)
                    snap.tier2Total -= currentSnapBalance;
            }
        } else {
            snapshotInfo[user][currentSnap] = newBalance;

            /// FROM TIER 1
            if (currentBalance >= TIER_1) {
                // Decrease TIER 1
                snap.tier1Total -= currentBalance;
                // TO SAME TIER
                if (newBalance >= TIER_1) snap.tier1Total += newBalance;
                // TO TIER 2
                if (newBalance < TIER_1 && newBalance >= TIER_2)
                    snap.tier2Total += newBalance;
                // if to NO tier, just decrease is fine
            }
            // FROM TIER 2
            else if (currentBalance >= TIER_2) {
                snap.tier2Total -= currentBalance;
                // TO SAME TIER
                if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                // TO NO TIER JUST DO NOTHING
            }
        }
    }

    /**
     * @notice Increase a wallet's current snapshot balance
     * @param user Wallet to update snapshot info
     * @param amount Difference amount
     */
    function _updateSnapIncrease(address user, uint amount) private {
        uint currentSnap = currentSnapId;
        uint currentBalance = balanceOf(user);
        uint currentSnapBalance = snapshotInfo[user][currentSnap];
        SnapshotInfo storage snap = snapshots[currentSnap];
        lastSnapshotId[user] = currentSnap;
        // If user is exempt from dividends, we need to set the snapshot value to 0
        if (isDividendExempt[user]) {
            delete snapshotInfo[user][currentSnap];
            // if user is now exempt but used to have funds, we need to decrease the total
            if (currentSnapBalance > 0) {
                if (currentSnapBalance >= TIER_1)
                    snap.tier1Total -= currentSnapBalance;
                else if (currentSnapBalance >= TIER_2)
                    snap.tier2Total -= currentSnapBalance;
            }
        } else {
            snapshotInfo[user][currentSnap] = currentBalance + amount;
            uint newBalance = currentBalance + amount;
            // Check if there is any tier advancement

            // FROM NO TIER
            if (currentBalance < TIER_2) {
                // TO TIER 1
                if (newBalance >= TIER_1)
                    snap.tier1Total += newBalance;
                    // TO TIER 2
                else if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                // TO NO TIER DO NOTHING
            }
            // FROM TIER 2
            else if (currentBalance >= TIER_2 && currentBalance < TIER_1) {
                // TO TIER 1
                if (newBalance >= TIER_1)
                    snap.tier1Total += newBalance;

                    // TO SAME TIER
                else if (newBalance >= TIER_2) snap.tier2Total += newBalance;
                snap.tier2Total -= currentBalance;
            }
            // FROM TIER 1
            else if (currentBalance >= TIER_1) {
                // Stay in same tier
                snap.tier1Total += newBalance;
                snap.tier1Total -= currentBalance;
            }
        }
    }

    //---------------------------------------------------------------------------------
    // External & Public VIEW | PURE Functions
    //---------------------------------------------------------------------------------

    function getUserSnapshotAt(
        address user,
        uint snapId
    ) external view returns (uint) {
        // If snapshot ID hasn't been taken, return 0
        if (snapId > currentSnapId) return 0;
        uint lastUserSnap = lastSnapshotId[user];
        // if last snapshot is before the requested snapshot, return current balance of the user
        if (snapId > lastUserSnap) return balanceOf(user);
        // else return the snapshot balance
        return snapshotInfo[user][snapId];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_newOwner","type":"address"},{"internalType":"address","name":"_recoveryAdmin","type":"address"},{"internalType":"address","name":"lossless_","type":"address"},{"internalType":"uint256","name":"timeLockPeriod_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"FUXION__InvalidMaxWallet","type":"error"},{"inputs":[],"name":"FUXION__InvalidTaxAmount","type":"error"},{"inputs":[],"name":"FUXION__InvalidThreshold","type":"error"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"triedBalance","type":"uint256"}],"name":"FUXION__MaxWalletReached","type":"error"},{"inputs":[],"name":"FUXION__NotAllowed","type":"error"},{"inputs":[],"name":"FUXION__TradingNotEnabled","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"_users","type":"address[]"},{"indexed":false,"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"BlacklistWalletsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"EditMaxWalletAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newTax","type":"uint256"},{"indexed":false,"internalType":"bool","name":"buyTax","type":"bool"},{"indexed":false,"internalType":"bool","name":"sellTax","type":"bool"}],"name":"EditTax","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOff","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_turnOffDate","type":"uint256"}],"name":"LosslessTurnOffProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newAdmin","type":"address"}],"name":"NewRecoveryAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_candidate","type":"address"}],"name":"NewRecoveryAdminProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_lpAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isLpAddress","type":"bool"}],"name":"SetAddressAsLp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_snapshotter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetSnapshotterStatus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"snapId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"SnapshotTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isEnabled","type":"bool"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_blacklister","type":"address"}],"name":"UpdateBlacklister","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"WalletExcludedFromMax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"WalletExcludedFromTax","type":"event"},{"inputs":[],"name":"ADMIN_WALLET","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"key","type":"bytes"}],"name":"acceptRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSnapId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"getUserSnapshotAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"dividendExcepmtionStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromMaxWallet","outputs":[{"internalType":"bool","name":"excludedStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isExcludedFromTax","outputs":[{"internalType":"bool","name":"excludedStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLosslessOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpAddress","type":"address"}],"name":"isLpAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"executor","type":"address"}],"name":"isSnapshotter","outputs":[{"internalType":"bool","name":"isExecutor","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"lastSnapshotId","outputs":[{"internalType":"uint256","name":"lastSnapshotId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossless","outputs":[{"internalType":"contract ILssController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"losslessTurnOffTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mainPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_buyTax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludeFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"bool","name":"_excluded","type":"bool"}],"name":"setExcludedFromMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setLosslessAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpAddress","type":"address"},{"internalType":"bool","name":"_isLpAddress","type":"bool"}],"name":"setLpAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellTax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_snapshotter","type":"address"},{"internalType":"bool","name":"_isSnapshotter","type":"bool"}],"name":"setSnapshotterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_taxThreshold","type":"uint256"}],"name":"setTaxThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"snapshotInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"snapId","type":"uint256"}],"name":"snapshots","outputs":[{"internalType":"uint256","name":"tier1Total","type":"uint256"},{"internalType":"uint256","name":"tier2Total","type":"uint256"},{"internalType":"uint256","name":"snapshotTakenTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeSnapshot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"taxThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from","type":"address[]"}],"name":"transferOutBlacklistedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"name":"transferRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526001600c5f6101000a81548160ff0219169083151502179055505f6017556005601a556005601b555f601c5f6101000a81548160ff0219169083151502179055505f601c60016101000a81548160ff0219169083151502179055503480156200006b575f80fd5b5060405162006c7738038062006c77833981810160405281019062000091919062000fc5565b6040518060400160405280600b81526020017f467578696f6e204c6162730000000000000000000000000000000000000000008152506040518060400160405280600481526020017f465558450000000000000000000000000000000000000000000000000000000081525086858486620001216200011562000b9f60201b60201c565b62000ba660201b60201c565b8560049081620001329190620012a4565b508460059081620001449190620012a4565b508360095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60088190555081600a819055505f600b8190555080600c60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603620002d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002c990620013e6565b60405180910390fd5b620002e38462000ba660201b60201c565b62000300846a0422ca8b0a00a42500000062000cd860201b60201c565b6103e8600a6a0422ca8b0a00a4250000006200031d919062001433565b620003299190620014aa565b6019819055506127106a0422ca8b0a00a4250000006200034a9190620014aa565b601881905550737a250d5630b4cf539739df2c5dacb4c659f2488d60155f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200040f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004359190620014e1565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620004d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004f99190620014e1565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396306080516040518363ffffffff1660e01b81526004016200053792919062001522565b6020604051808303815f875af115801562000554573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200057a9190620014e1565b60165f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160135f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f6200069962000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160115f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f620007e962000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160105f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f6200091862000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f3073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160125f60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550600160145f62000abd62000e1860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505062000b943060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff62000e3f60201b60201c565b5050505050620016b5565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c0e90620015c1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d40906200162f565b60405180910390fd5b8060035f82825462000d5c91906200164f565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000e0c91906200169a565b60405180910390a35050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405162000f1b91906200169a565b60405180910390a3505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000f578262000f2c565b9050919050565b62000f698162000f4b565b811462000f74575f80fd5b50565b5f8151905062000f878162000f5e565b92915050565b5f819050919050565b62000fa18162000f8d565b811462000fac575f80fd5b50565b5f8151905062000fbf8162000f96565b92915050565b5f805f805f60a0868803121562000fe15762000fe062000f28565b5b5f62000ff08882890162000f77565b9550506020620010038882890162000f77565b9450506040620010168882890162000f77565b9350506060620010298882890162000f77565b92505060806200103c8882890162000faf565b9150509295509295909350565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620010c557607f821691505b602082108103620010db57620010da62001080565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026200113f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262001102565b6200114b868362001102565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6200118c62001186620011808462000f8d565b62001163565b62000f8d565b9050919050565b5f819050919050565b620011a7836200116c565b620011bf620011b68262001193565b8484546200110e565b825550505050565b5f90565b620011d5620011c7565b620011e28184846200119c565b505050565b5b818110156200120957620011fd5f82620011cb565b600181019050620011e8565b5050565b601f82111562001258576200122281620010e1565b6200122d84620010f3565b810160208510156200123d578190505b620012556200124c85620010f3565b830182620011e7565b50505b505050565b5f82821c905092915050565b5f6200127a5f19846008026200125d565b1980831691505092915050565b5f62001294838362001269565b9150826002028217905092915050565b620012af8262001049565b67ffffffffffffffff811115620012cb57620012ca62001053565b5b620012d78254620010ad565b620012e48282856200120d565b5f60209050601f8311600181146200131a575f841562001305578287015190505b62001311858262001287565b86555062001380565b601f1984166200132a86620010e1565b5f5b8281101562001353578489015182556001820191506020850194506020810190506200132c565b868310156200137357848901516200136f601f89168262001269565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f620013ce60168362001388565b9150620013db8262001398565b602082019050919050565b5f6020820190508181035f830152620013ff81620013c0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200143f8262000f8d565b91506200144c8362000f8d565b92508282026200145c8162000f8d565b9150828204841483151762001476576200147562001406565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f620014b68262000f8d565b9150620014c38362000f8d565b925082620014d657620014d56200147d565b5b828204905092915050565b5f60208284031215620014f957620014f862000f28565b5b5f620015088482850162000f77565b91505092915050565b6200151c8162000f4b565b82525050565b5f604082019050620015375f83018562001511565b62001546602083018462001511565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f620015a960268362001388565b9150620015b6826200154d565b604082019050919050565b5f6020820190508181035f830152620015da816200159b565b9050919050565b7f4c45524332303a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f6200161760208362001388565b91506200162482620015e1565b602082019050919050565b5f6020820190508181035f830152620016488162001609565b9050919050565b5f6200165b8262000f8d565b9150620016688362000f8d565b925082820190508082111562001683576200168262001406565b5b92915050565b620016948162000f8d565b82525050565b5f602082019050620016af5f83018462001689565b92915050565b60805160a051615599620016de5f395f8181612aa4015261396301525f6138b401526155995ff3fe608060405234801561000f575f80fd5b5060043610610381575f3560e01c8063715018a6116101dc578063b3d3d37e1161010d578063d6565a2d116100ab578063f2fde38b1161007a578063f2fde38b14610a39578063f851a44014610a55578063f887ea4014610a73578063f8b45b0514610a9157610381565b8063d6565a2d146109b1578063d6e242b8146109e3578063dc1052e2146109ed578063dd62ed3e14610a0957610381565b8063cb4ca631116100e7578063cb4ca63114610915578063cc1776d314610945578063ccfa214f14610963578063cd9a0d461461098157610381565b8063b3d3d37e146108d1578063b5c22877146108db578063c2cd4a07146108f757610381565b8063936af9111161017a578063a9059cbb11610154578063a9059cbb14610837578063b16b04a714610867578063b20161db14610897578063b38fe957146108c757610381565b8063936af911146107cd57806395d89b41146107e9578063a457c2d71461080757610381565b80638a8c523c116101b65780638a8c523c1461076d5780638cd09d50146107775780638da5cb5b1461079357806393310ffe146107b157610381565b8063715018a61461072757806377d1440d1461073157806385af30c51461074f57610381565b806339509351116102b65780635d0044ca1161025457806362771d331161022e57806362771d331461068d5780636dd3d39f146106a95780636e9960c3146106d957806370a08231146106f757610381565b80635d0044ca146106355780635f6529a31461065157806361086b001461066f57610381565b80634355855a116102905780634355855a146105bf5780634ada218b146105ef5780634f7041a51461060d5780635b8a194a1461062b57610381565b8063395093511461055757806339fb86c51461058757806341220104146105a357610381565b806318160ddd116103235780632ecaf675116102fd5780632ecaf675146104cd5780632f7c5980146104eb578063313ce5671461051b57806334f6ebf51461053957610381565b806318160ddd1461046357806323b872dd146104815780632baa3c9e146104b157610381565b80630da7caa31161035f5780630da7caa3146103ef5780630ee0a1131461040b5780631031e36e1461042957806315c9aca11461043357610381565b806306fdde031461038557806307a212be146103a3578063095ea7b3146103bf575b5f80fd5b61038d610aaf565b60405161039a9190614001565b60405180910390f35b6103bd60048036038101906103b89190614065565b610b3f565b005b6103d960048036038101906103d491906140ea565b610bd8565b6040516103e69190614142565b60405180910390f35b61040960048036038101906104049190614185565b610ca1565b005b610413610e4c565b60405161042091906141d2565b60405180910390f35b610431610e52565b005b61044d600480360381019061044891906141eb565b610ead565b60405161045a9190614142565b60405180910390f35b61046b610eca565b60405161047891906141d2565b60405180910390f35b61049b60048036038101906104969190614216565b610ed3565b6040516104a89190614142565b60405180910390f35b6104cb60048036038101906104c691906141eb565b61107e565b005b6104d5611229565b6040516104e291906141d2565b60405180910390f35b610505600480360381019061050091906141eb565b61122f565b6040516105129190614142565b60405180910390f35b61052361124c565b6040516105309190614281565b60405180910390f35b610541611254565b60405161054e91906142f5565b60405180910390f35b610571600480360381019061056c91906140ea565b61127a565b60405161057e9190614142565b60405180910390f35b6105a1600480360381019061059c9190614185565b6113cd565b005b6105bd60048036038101906105b89190614185565b611578565b005b6105d960048036038101906105d491906141eb565b611723565b6040516105e69190614142565b60405180910390f35b6105f7611740565b6040516106049190614142565b60405180910390f35b610615611753565b60405161062291906141d2565b60405180910390f35b610633611759565b005b61064f600480360381019061064a9190614065565b61188d565b005b61065961196a565b604051610666919061431d565b60405180910390f35b61067761198f565b60405161068491906141d2565b60405180910390f35b6106a760048036038101906106a29190614185565b611995565b005b6106c360048036038101906106be91906141eb565b611c23565b6040516106d09190614142565b60405180910390f35b6106e1611c40565b6040516106ee919061431d565b60405180910390f35b610711600480360381019061070c91906141eb565b611c68565b60405161071e91906141d2565b60405180910390f35b61072f611cae565b005b610739611cc1565b60405161074691906141d2565b60405180910390f35b610757611cc7565b604051610764919061431d565b60405180910390f35b610775611cec565b005b610791600480360381019061078c9190614065565b611d49565b005b61079b611e14565b6040516107a8919061431d565b60405180910390f35b6107cb60048036038101906107c69190614369565b611e3b565b005b6107e760048036038101906107e29190614408565b611f5f565b005b6107f161222a565b6040516107fe9190614001565b60405180910390f35b610821600480360381019061081c91906140ea565b6122ba565b60405161082e9190614142565b60405180910390f35b610851600480360381019061084c91906140ea565b612455565b60405161085e9190614142565b60405180910390f35b610881600480360381019061087c91906140ea565b61251e565b60405161088e91906141d2565b60405180910390f35b6108b160048036038101906108ac91906140ea565b61253e565b6040516108be91906141d2565b60405180910390f35b6108cf612602565b005b6108d961276f565b005b6108f560048036038101906108f0919061457b565b6128b9565b005b6108ff612aa2565b60405161090c91906145e2565b60405180910390f35b61092f600480360381019061092a91906141eb565b612ac6565b60405161093c9190614142565b60405180910390f35b61094d612ae3565b60405161095a91906141d2565b60405180910390f35b61096b612ae9565b6040516109789190614142565b60405180910390f35b61099b600480360381019061099691906141eb565b612afb565b6040516109a891906141d2565b60405180910390f35b6109cb60048036038101906109c69190614065565b612b10565b6040516109da939291906145fb565b60405180910390f35b6109eb612b36565b005b610a076004803603810190610a029190614065565b612cad565b005b610a236004803603810190610a1e9190614630565b612d78565b604051610a3091906141d2565b60405180910390f35b610a536004803603810190610a4e91906141eb565b612dfa565b005b610a5d612e7c565b604051610a6a919061431d565b60405180910390f35b610a7b612ea1565b604051610a88919061468e565b60405180910390f35b610a99612ec6565b604051610aa691906141d2565b60405180910390f35b606060048054610abe906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea906146d4565b8015610b355780601f10610b0c57610100808354040283529160200191610b35565b820191905f5260205f20905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b610b47612ecc565b5f8111610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061474e565b60405180910390fd5b6a0422ca8b0a00a425000000811115610bce576040517f39922d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060188190555050565b5f8282600c5f9054906101000a900460ff1615610c8357600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347abf3be610c35612f4a565b84846040518463ffffffff1660e01b8152600401610c559392919061476c565b5f604051808303815f87803b158015610c6c575f80fd5b505af1158015610c7e573d5f803e3d5ffd5b505050505b610c95610c8e612f4a565b8686612f51565b60019250505092915050565b610ca9612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906147eb565b60405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90614853565b60405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f0d148a5c1704d9c0c8a1669e9b7ae29b729fa7fd357765342510c19a81a985d982604051610e409190614142565b60405180910390a25050565b60175481565b610e5a612ecc565b5f601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a5f604051610ea39190614142565b60405180910390a1565b6014602052805f5260405f205f915054906101000a900460ff1681565b5f600354905090565b5f838383600c5f9054906101000a900460ff1615610f8157600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663379f5c69610f31612f4a565b8585856040518563ffffffff1660e01b8152600401610f539493929190614871565b5f604051808303815f87803b158015610f6a575f80fd5b505af1158015610f7c573d5f803e3d5ffd5b505050505b5f60025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610fc8612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905085811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614924565b60405180910390fd5b611052888888613038565b61106f8861105e612f4a565b888461106a919061496f565b612f51565b60019450505050509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110be612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906149ec565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614a54565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a28060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f6012905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8282600c5f9054906101000a900460ff161561132557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf5961bb6112d7612f4a565b84846040518463ffffffff1660e01b81526004016112f79392919061476c565b5f604051808303815f87803b15801561130e575f80fd5b505af1158015611320573d5f803e3d5ffd5b505050505b6113c1611330612f4a565b868660025f61133d612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113bc9190614a72565b612f51565b60019250505092915050565b6113d5612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a906147eb565b60405180910390fd5b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614aef565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2633ad3ef534c4bddda523fae274ccb4e47bb324c2eca411a9377d01529e2ffe8260405161156c9190614142565b60405180910390a25050565b611580612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906147eb565b60405180910390fd5b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614aef565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff40f85f17edc8eb36b286100bde23545ec4fac647f64dd7214a897af944fcb30826040516117179190614142565b60405180910390a25050565b6012602052805f5260405f205f915054906101000a900460ff1681565b601c60019054906101000a900460ff1681565b601a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611799612f4a565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e6906149ec565b60405180910390fd5b600c5f9054906101000a900460ff161561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b57565b60405180910390fd5b5f600b819055506001600c5f6101000a81548160ff0219169083151502179055507f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b60405160405180910390a1565b611895612ecc565b5f81116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614bbf565b60405180910390fd5b6127106a0422ca8b0a00a4250000006118f09190614c0a565b811015611929576040517fbb8cf97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806019819055507fcb6a4e25e6070c228470cc0df60e64d9c48337dd39b32c47376eef2b366454b78160405161195f91906141d2565b60405180910390a150565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b61199d612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906147eb565b60405180910390fd5b80151560135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614853565b60405180910390fd5b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c84565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f242e47ed17a9f432e4242bab4c34941ac33603481cb8319ed8dd8df34ae0051182604051611c179190614142565b60405180910390a25050565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611cb6612ecc565b611cbf5f61339e565b565b60185481565b60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf4612ecc565b6001601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a6001604051611d3f9190614142565b60405180910390a1565b611d51612ecc565b5f8111611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90614cec565b60405180910390fd5b600a811115611dce576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d815f6001604051611e0993929190614d0a565b60405180910390a150565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e7b612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149ec565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806008819055508173ffffffffffffffffffffffffffffffffffffffff167f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b160405160405180910390a25050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fa0612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614d89565b60405180910390fd5b600c5f9054906101000a900460ff16612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614df1565b60405180910390fd5b5f8282905090505f805b828110156121ae575f85858381811061206a57612069614e0f565b5b905060200201602081019061207f91906141eb565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080846121109190614a72565b9350600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219191906141d2565b60405180910390a3505080806121a690614e3c565b91505061204e565b508060015f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461221d9190614a72565b9250508190555050505050565b606060058054612239906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054612265906146d4565b80156122b05780601f10612287576101008083540402835291602001916122b0565b820191905f5260205f20905b81548152906001019060200180831161229357829003601f168201915b5050505050905090565b5f8282600c5f9054906101000a900460ff161561236557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663568c75a9612317612f4a565b84846040518463ffffffff1660e01b81526004016123379392919061476c565b5f604051808303815f87803b15801561234e575f80fd5b505af1158015612360573d5f803e3d5ffd5b505050505b5f60025f612371612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508481101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614ef3565b60405180910390fd5b612448612436612f4a565b878784612443919061496f565b612f51565b6001935050505092915050565b5f8282600c5f9054906101000a900460ff161561250057600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ffb811f6124b2612f4a565b84846040518463ffffffff1660e01b81526004016124d29392919061476c565b5f604051808303815f87803b1580156124e9575f80fd5b505af11580156124fb573d5f803e3d5ffd5b505050505b61251261250b612f4a565b8686613038565b60019250505092915050565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b5f601754821115612551575f90506125fc565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050808311156125ab576125a384611c68565b9150506125fc565b600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20549150505b92915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612642612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906149ec565b60405180910390fd5b5f600b54036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614f5b565b60405180910390fd5b42600b541115612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890614fc3565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055505f600b819055507f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b60405160405180910390a1565b60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127ef576040517f42df492800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601754905060175f81548092919061280790614e3c565b91905055505f600f5f8381526020019081526020015f2090504281600201819055506040518060600160405280825f01548152602001826001015481526020015f815250600f5f60175481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155905050817f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516128ad91906141d2565b60405180910390a25050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f9612f4a565b73ffffffffffffffffffffffffffffffffffffffff161461294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129469061502b565b60405180910390fd5b60085481805190602001201461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190615093565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f60405160405180910390a260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6010602052805f5260405f205f915054906101000a900460ff1681565b601b5481565b600c5f9054906101000a900460ff1681565b600e602052805f5260405f205f915090505481565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b76612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc3906149ec565b60405180910390fd5b5f600b5414612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906150fb565b60405180910390fd5b600c5f9054906101000a900460ff16612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590615163565b60405180910390fd5b600a5442612c6c9190614a72565b600b819055507f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a600b54604051612ca391906141d2565b60405180910390a1565b612cb5612ecc565b5f8111612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90614cec565b60405180910390fd5b600a811115612d32576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d8160015f604051612d6d93929190614d0a565b60405180910390a150565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b612e02612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e67906151f1565b60405180910390fd5b612e798161339e565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b612ed4612f4a565b73ffffffffffffffffffffffffffffffffffffffff16612ef2611e14565b73ffffffffffffffffffffffffffffffffffffffff1614612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90615259565b60405180910390fd5b565b5f33905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161302b91906141d2565b60405180910390a3505050565b5f60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806130d4575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050601c60019054906101000a900460ff161580156130f1575080155b15613128576040517f729cc03d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61313284836134cd565b5f61313c30611c68565b9050601c5f9054906101000a900460ff1615801561315c57506018548110155b8015613166575081155b80156131b9575060135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156131c7576131c66137e9565b5b816132ce575f60135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561323d576064601b548561322c9190615277565b6132369190614c0a565b90506132aa565b60135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156132a9576064601a548561329c9190615277565b6132a69190614c0a565b90505b5b5f8111156132cc576132bd8630836139ee565b80846132c9919061496f565b93505b505b5f836132d986611c68565b6132e39190614a72565b905060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561333d575060195481115b156133815784816040517f1ba623300000000000000000000000000000000000000000000000000000000081526004016133789291906152b8565b60405180910390fd5b61338b8585613beb565b6133968686866139ee565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361340c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613403906151f1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60175490505f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490505f61352d85611c68565b90505f848261353c919061496f565b90505f600f5f8681526020019081526020015f20905084600e5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561369b57600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f205f90555f84111561369657690a968163f0a57b40000084106136695783815f015f82825461365d919061496f565b92505081905550613695565b683635c9adc5dea0000084106136945783816001015f82825461368c919061496f565b925050819055505b5b5b6137e0565b81600d5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2081905550690a968163f0a57b40000083106137885782815f015f82825461370f919061496f565b92505081905550690a968163f0a57b40000082106137415781815f015f8282546137399190614a72565b925050819055505b690a968163f0a57b400000821080156137635750683635c9adc5dea000008210155b156137835781816001015f82825461377b9190614a72565b925050819055505b6137df565b683635c9adc5dea0000083106137de5782816001015f8282546137ab919061496f565b92505081905550683635c9adc5dea0000082106137dd5781816001015f8282546137d59190614a72565b925050819055505b5b5b5b50505050505050565b6001601c5f6101000a81548160ff0219169083151502179055505f61380d30611c68565b90505f8111156139d2575f600267ffffffffffffffff81111561383357613832614457565b5b6040519080825280602002602001820160405280156138615781602001602082028036833780820191505090505b50905030815f8151811061387857613877614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106138e7576138e6614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f847f0000000000000000000000000000000000000000000000000000000000000000426040518663ffffffff1660e01b81526004016139a39594939291906153ef565b5f604051808303815f87803b1580156139ba575f80fd5b505af11580156139cc573d5f803e3d5ffd5b50505050505b5f601c5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a53906154b7565b60405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615545565b60405180910390fd5b8181613aec919061496f565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613b799190614a72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bdd91906141d2565b60405180910390a350505050565b5f60175490505f613bfb84611c68565b90505f600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f600f5f8581526020019081526020015f20905083600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613daa57600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f90555f821115613da557690a968163f0a57b4000008210613d785781815f015f828254613d6c919061496f565b92505081905550613da4565b683635c9adc5dea000008210613da35781816001015f828254613d9b919061496f565b925050819055505b5b5b613f6f565b8483613db69190614a72565b600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f20819055505f8584613e139190614a72565b9050683635c9adc5dea00000841015613e8657690a968163f0a57b4000008110613e555780825f015f828254613e499190614a72565b92505081905550613e81565b683635c9adc5dea000008110613e805780826001015f828254613e789190614a72565b925050819055505b5b613f6d565b683635c9adc5dea000008410158015613ea85750690a968163f0a57b40000084105b15613f2757690a968163f0a57b4000008110613edc5780825f015f828254613ed09190614a72565b92505081905550613f08565b683635c9adc5dea000008110613f075780826001015f828254613eff9190614a72565b925050819055505b5b83826001015f828254613f1b919061496f565b92505081905550613f6c565b690a968163f0a57b4000008410613f6b5780825f015f828254613f4a9190614a72565b9250508190555083825f015f828254613f63919061496f565b925050819055505b5b5b505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fae578082015181840152602081019050613f93565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fd382613f77565b613fdd8185613f81565b9350613fed818560208601613f91565b613ff681613fb9565b840191505092915050565b5f6020820190508181035f8301526140198184613fc9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61404481614032565b811461404e575f80fd5b50565b5f8135905061405f8161403b565b92915050565b5f6020828403121561407a5761407961402a565b5b5f61408784828501614051565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140b982614090565b9050919050565b6140c9816140af565b81146140d3575f80fd5b50565b5f813590506140e4816140c0565b92915050565b5f8060408385031215614100576140ff61402a565b5b5f61410d858286016140d6565b925050602061411e85828601614051565b9150509250929050565b5f8115159050919050565b61413c81614128565b82525050565b5f6020820190506141555f830184614133565b92915050565b61416481614128565b811461416e575f80fd5b50565b5f8135905061417f8161415b565b92915050565b5f806040838503121561419b5761419a61402a565b5b5f6141a8858286016140d6565b92505060206141b985828601614171565b9150509250929050565b6141cc81614032565b82525050565b5f6020820190506141e55f8301846141c3565b92915050565b5f60208284031215614200576141ff61402a565b5b5f61420d848285016140d6565b91505092915050565b5f805f6060848603121561422d5761422c61402a565b5b5f61423a868287016140d6565b935050602061424b868287016140d6565b925050604061425c86828701614051565b9150509250925092565b5f60ff82169050919050565b61427b81614266565b82525050565b5f6020820190506142945f830184614272565b92915050565b5f819050919050565b5f6142bd6142b86142b384614090565b61429a565b614090565b9050919050565b5f6142ce826142a3565b9050919050565b5f6142df826142c4565b9050919050565b6142ef816142d5565b82525050565b5f6020820190506143085f8301846142e6565b92915050565b614317816140af565b82525050565b5f6020820190506143305f83018461430e565b92915050565b5f819050919050565b61434881614336565b8114614352575f80fd5b50565b5f813590506143638161433f565b92915050565b5f806040838503121561437f5761437e61402a565b5b5f61438c858286016140d6565b925050602061439d85828601614355565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126143c8576143c76143a7565b5b8235905067ffffffffffffffff8111156143e5576143e46143ab565b5b602083019150836020820283011115614401576144006143af565b5b9250929050565b5f806020838503121561441e5761441d61402a565b5b5f83013567ffffffffffffffff81111561443b5761443a61402e565b5b614447858286016143b3565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61448d82613fb9565b810181811067ffffffffffffffff821117156144ac576144ab614457565b5b80604052505050565b5f6144be614021565b90506144ca8282614484565b919050565b5f67ffffffffffffffff8211156144e9576144e8614457565b5b6144f282613fb9565b9050602081019050919050565b828183375f83830152505050565b5f61451f61451a846144cf565b6144b5565b90508281526020810184848401111561453b5761453a614453565b5b6145468482856144ff565b509392505050565b5f82601f830112614562576145616143a7565b5b813561457284826020860161450d565b91505092915050565b5f602082840312156145905761458f61402a565b5b5f82013567ffffffffffffffff8111156145ad576145ac61402e565b5b6145b98482850161454e565b91505092915050565b5f6145cc82614090565b9050919050565b6145dc816145c2565b82525050565b5f6020820190506145f55f8301846145d3565b92915050565b5f60608201905061460e5f8301866141c3565b61461b60208301856141c3565b61462860408301846141c3565b949350505050565b5f80604083850312156146465761464561402a565b5b5f614653858286016140d6565b9250506020614664858286016140d6565b9150509250929050565b5f614678826142c4565b9050919050565b6146888161466e565b82525050565b5f6020820190506146a15f83018461467f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146eb57607f821691505b6020821081036146fe576146fd6146a7565b5b50919050565b7f465558494f4e5f5f496e76616c69645468726573686f6c6400000000000000005f82015250565b5f614738601883613f81565b915061474382614704565b602082019050919050565b5f6020820190508181035f8301526147658161472c565b9050919050565b5f60608201905061477f5f83018661430e565b61478c602083018561430e565b61479960408301846141c3565b949350505050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f6147d5601683613f81565b91506147e0826147a1565b602082019050919050565b5f6020820190508181035f830152614802816147c9565b9050919050565b7f465558494f4e5f5f416c726561647953657400000000000000000000000000005f82015250565b5f61483d601283613f81565b915061484882614809565b602082019050919050565b5f6020820190508181035f83015261486a81614831565b9050919050565b5f6080820190506148845f83018761430e565b614891602083018661430e565b61489e604083018561430e565b6148ab60608301846141c3565b95945050505050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b5f61490e602983613f81565b9150614919826148b4565b604082019050919050565b5f6020820190508181035f83015261493b81614902565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61497982614032565b915061498483614032565b925082820390508181111561499c5761499b614942565b5b92915050565b7f4c45524332303a204d757374206265207265636f766572792061646d696e00005f82015250565b5f6149d6601e83613f81565b91506149e1826149a2565b602082019050919050565b5f6020820190508181035f830152614a03816149ca565b9050919050565b7f4c45524332303a2043616e6e6f74207365742073616d652061646472657373005f82015250565b5f614a3e601f83613f81565b9150614a4982614a0a565b602082019050919050565b5f6020820190508181035f830152614a6b81614a32565b9050919050565b5f614a7c82614032565b9150614a8783614032565b9250828201905080821115614a9f57614a9e614942565b5b92915050565b7f465558494f4e5f5f416c72656164794578636c756465640000000000000000005f82015250565b5f614ad9601783613f81565b9150614ae482614aa5565b602082019050919050565b5f6020820190508181035f830152614b0681614acd565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000005f82015250565b5f614b41601b83613f81565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b7f465558494f4e5f5f496e76616c69644d617857616c6c657400000000000000005f82015250565b5f614ba9601883613f81565b9150614bb482614b75565b602082019050919050565b5f6020820190508181035f830152614bd681614b9d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c1482614032565b9150614c1f83614032565b925082614c2f57614c2e614bdd565b5b828204905092915050565b7f465558494f4e5f5f496e76616c696400000000000000000000000000000000005f82015250565b5f614c6e600f83613f81565b9150614c7982614c3a565b602082019050919050565b5f6020820190508181035f830152614c9b81614c62565b9050919050565b7f465558494f4e5f5f496e76616c6964546178416d6f756e7400000000000000005f82015250565b5f614cd6601883613f81565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b5f606082019050614d1d5f8301866141c3565b614d2a6020830185614133565b614d376040830184614133565b949350505050565b7f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400005f82015250565b5f614d73601e83613f81565b9150614d7e82614d3f565b602082019050919050565b5f6020820190508181035f830152614da081614d67565b9050919050565b7f4c45524332303a204c6f73736c657373206973206f66660000000000000000005f82015250565b5f614ddb601783613f81565b9150614de682614da7565b602082019050919050565b5f6020820190508181035f830152614e0881614dcf565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614e4682614032565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7857614e77614942565b5b600182019050919050565b7f4c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f5f8201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b5f614edd602683613f81565b9150614ee882614e83565b604082019050919050565b5f6020820190508181035f830152614f0a81614ed1565b9050919050565b7f4c45524332303a205475726e4f6666206e6f742070726f706f736564000000005f82015250565b5f614f45601c83613f81565b9150614f5082614f11565b602082019050919050565b5f6020820190508181035f830152614f7281614f39565b9050919050565b7f4c45524332303a2054696d65206c6f636b20696e2070726f67726573730000005f82015250565b5f614fad601d83613f81565b9150614fb882614f79565b602082019050919050565b5f6020820190508181035f830152614fda81614fa1565b9050919050565b7f4c45524332303a204d7573742062652063616e646974617465000000000000005f82015250565b5f615015601983613f81565b915061502082614fe1565b602082019050919050565b5f6020820190508181035f83015261504281615009565b9050919050565b7f4c45524332303a20496e76616c6964206b6579000000000000000000000000005f82015250565b5f61507d601383613f81565b915061508882615049565b602082019050919050565b5f6020820190508181035f8301526150aa81615071565b9050919050565b7f4c45524332303a205475726e4f666620616c72656164792070726f706f7365645f82015250565b5f6150e5602083613f81565b91506150f0826150b1565b602082019050919050565b5f6020820190508181035f830152615112816150d9565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000005f82015250565b5f61514d601c83613f81565b915061515882615119565b602082019050919050565b5f6020820190508181035f83015261517a81615141565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6151db602683613f81565b91506151e682615181565b604082019050919050565b5f6020820190508181035f830152615208816151cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615243602083613f81565b915061524e8261520f565b602082019050919050565b5f6020820190508181035f83015261527081615237565b9050919050565b5f61528182614032565b915061528c83614032565b925082820261529a81614032565b915082820484148315176152b1576152b0614942565b5b5092915050565b5f6040820190506152cb5f83018561430e565b6152d860208301846141c3565b9392505050565b5f819050919050565b5f6153026152fd6152f8846152df565b61429a565b614032565b9050919050565b615312816152e8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61534a816140af565b82525050565b5f61535b8383615341565b60208301905092915050565b5f602082019050919050565b5f61537d82615318565b6153878185615322565b935061539283615332565b805f5b838110156153c25781516153a98882615350565b97506153b483615367565b925050600181019050615395565b5085935050505092915050565b5f6153d9826142c4565b9050919050565b6153e9816153cf565b82525050565b5f60a0820190506154025f8301886141c3565b61540f6020830187615309565b81810360408301526154218186615373565b905061543060608301856153e0565b61543d60808301846141c3565b9695505050505050565b7f4c45524332303a207472616e736665722066726f6d20746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6154a1602683613f81565b91506154ac82615447565b604082019050919050565b5f6020820190508181035f8301526154ce81615495565b9050919050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b5f61552f602783613f81565b915061553a826154d5565b604082019050919050565b5f6020820190508181035f83015261555c81615523565b905091905056fea2646970667358221220416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf764736f6c634300081500330000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db40000000000000000000000000000000000000000000000000000000000015180

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610381575f3560e01c8063715018a6116101dc578063b3d3d37e1161010d578063d6565a2d116100ab578063f2fde38b1161007a578063f2fde38b14610a39578063f851a44014610a55578063f887ea4014610a73578063f8b45b0514610a9157610381565b8063d6565a2d146109b1578063d6e242b8146109e3578063dc1052e2146109ed578063dd62ed3e14610a0957610381565b8063cb4ca631116100e7578063cb4ca63114610915578063cc1776d314610945578063ccfa214f14610963578063cd9a0d461461098157610381565b8063b3d3d37e146108d1578063b5c22877146108db578063c2cd4a07146108f757610381565b8063936af9111161017a578063a9059cbb11610154578063a9059cbb14610837578063b16b04a714610867578063b20161db14610897578063b38fe957146108c757610381565b8063936af911146107cd57806395d89b41146107e9578063a457c2d71461080757610381565b80638a8c523c116101b65780638a8c523c1461076d5780638cd09d50146107775780638da5cb5b1461079357806393310ffe146107b157610381565b8063715018a61461072757806377d1440d1461073157806385af30c51461074f57610381565b806339509351116102b65780635d0044ca1161025457806362771d331161022e57806362771d331461068d5780636dd3d39f146106a95780636e9960c3146106d957806370a08231146106f757610381565b80635d0044ca146106355780635f6529a31461065157806361086b001461066f57610381565b80634355855a116102905780634355855a146105bf5780634ada218b146105ef5780634f7041a51461060d5780635b8a194a1461062b57610381565b8063395093511461055757806339fb86c51461058757806341220104146105a357610381565b806318160ddd116103235780632ecaf675116102fd5780632ecaf675146104cd5780632f7c5980146104eb578063313ce5671461051b57806334f6ebf51461053957610381565b806318160ddd1461046357806323b872dd146104815780632baa3c9e146104b157610381565b80630da7caa31161035f5780630da7caa3146103ef5780630ee0a1131461040b5780631031e36e1461042957806315c9aca11461043357610381565b806306fdde031461038557806307a212be146103a3578063095ea7b3146103bf575b5f80fd5b61038d610aaf565b60405161039a9190614001565b60405180910390f35b6103bd60048036038101906103b89190614065565b610b3f565b005b6103d960048036038101906103d491906140ea565b610bd8565b6040516103e69190614142565b60405180910390f35b61040960048036038101906104049190614185565b610ca1565b005b610413610e4c565b60405161042091906141d2565b60405180910390f35b610431610e52565b005b61044d600480360381019061044891906141eb565b610ead565b60405161045a9190614142565b60405180910390f35b61046b610eca565b60405161047891906141d2565b60405180910390f35b61049b60048036038101906104969190614216565b610ed3565b6040516104a89190614142565b60405180910390f35b6104cb60048036038101906104c691906141eb565b61107e565b005b6104d5611229565b6040516104e291906141d2565b60405180910390f35b610505600480360381019061050091906141eb565b61122f565b6040516105129190614142565b60405180910390f35b61052361124c565b6040516105309190614281565b60405180910390f35b610541611254565b60405161054e91906142f5565b60405180910390f35b610571600480360381019061056c91906140ea565b61127a565b60405161057e9190614142565b60405180910390f35b6105a1600480360381019061059c9190614185565b6113cd565b005b6105bd60048036038101906105b89190614185565b611578565b005b6105d960048036038101906105d491906141eb565b611723565b6040516105e69190614142565b60405180910390f35b6105f7611740565b6040516106049190614142565b60405180910390f35b610615611753565b60405161062291906141d2565b60405180910390f35b610633611759565b005b61064f600480360381019061064a9190614065565b61188d565b005b61065961196a565b604051610666919061431d565b60405180910390f35b61067761198f565b60405161068491906141d2565b60405180910390f35b6106a760048036038101906106a29190614185565b611995565b005b6106c360048036038101906106be91906141eb565b611c23565b6040516106d09190614142565b60405180910390f35b6106e1611c40565b6040516106ee919061431d565b60405180910390f35b610711600480360381019061070c91906141eb565b611c68565b60405161071e91906141d2565b60405180910390f35b61072f611cae565b005b610739611cc1565b60405161074691906141d2565b60405180910390f35b610757611cc7565b604051610764919061431d565b60405180910390f35b610775611cec565b005b610791600480360381019061078c9190614065565b611d49565b005b61079b611e14565b6040516107a8919061431d565b60405180910390f35b6107cb60048036038101906107c69190614369565b611e3b565b005b6107e760048036038101906107e29190614408565b611f5f565b005b6107f161222a565b6040516107fe9190614001565b60405180910390f35b610821600480360381019061081c91906140ea565b6122ba565b60405161082e9190614142565b60405180910390f35b610851600480360381019061084c91906140ea565b612455565b60405161085e9190614142565b60405180910390f35b610881600480360381019061087c91906140ea565b61251e565b60405161088e91906141d2565b60405180910390f35b6108b160048036038101906108ac91906140ea565b61253e565b6040516108be91906141d2565b60405180910390f35b6108cf612602565b005b6108d961276f565b005b6108f560048036038101906108f0919061457b565b6128b9565b005b6108ff612aa2565b60405161090c91906145e2565b60405180910390f35b61092f600480360381019061092a91906141eb565b612ac6565b60405161093c9190614142565b60405180910390f35b61094d612ae3565b60405161095a91906141d2565b60405180910390f35b61096b612ae9565b6040516109789190614142565b60405180910390f35b61099b600480360381019061099691906141eb565b612afb565b6040516109a891906141d2565b60405180910390f35b6109cb60048036038101906109c69190614065565b612b10565b6040516109da939291906145fb565b60405180910390f35b6109eb612b36565b005b610a076004803603810190610a029190614065565b612cad565b005b610a236004803603810190610a1e9190614630565b612d78565b604051610a3091906141d2565b60405180910390f35b610a536004803603810190610a4e91906141eb565b612dfa565b005b610a5d612e7c565b604051610a6a919061431d565b60405180910390f35b610a7b612ea1565b604051610a88919061468e565b60405180910390f35b610a99612ec6565b604051610aa691906141d2565b60405180910390f35b606060048054610abe906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054610aea906146d4565b8015610b355780601f10610b0c57610100808354040283529160200191610b35565b820191905f5260205f20905b815481529060010190602001808311610b1857829003601f168201915b5050505050905090565b610b47612ecc565b5f8111610b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b809061474e565b60405180910390fd5b6a0422ca8b0a00a425000000811115610bce576040517f39922d1c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060188190555050565b5f8282600c5f9054906101000a900460ff1615610c8357600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347abf3be610c35612f4a565b84846040518463ffffffff1660e01b8152600401610c559392919061476c565b5f604051808303815f87803b158015610c6c575f80fd5b505af1158015610c7e573d5f803e3d5ffd5b505050505b610c95610c8e612f4a565b8686612f51565b60019250505092915050565b610ca9612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906147eb565b60405180910390fd5b80151560145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d90614853565b60405180910390fd5b8060145f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f0d148a5c1704d9c0c8a1669e9b7ae29b729fa7fd357765342510c19a81a985d982604051610e409190614142565b60405180910390a25050565b60175481565b610e5a612ecc565b5f601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a5f604051610ea39190614142565b60405180910390a1565b6014602052805f5260405f205f915054906101000a900460ff1681565b5f600354905090565b5f838383600c5f9054906101000a900460ff1615610f8157600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663379f5c69610f31612f4a565b8585856040518563ffffffff1660e01b8152600401610f539493929190614871565b5f604051808303815f87803b158015610f6a575f80fd5b505af1158015610f7c573d5f803e3d5ffd5b505050505b5f60025f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610fc8612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905085811015611047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103e90614924565b60405180910390fd5b611052888888613038565b61106f8861105e612f4a565b888461106a919061496f565b612f51565b60019450505050509392505050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166110be612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906149ec565b60405180910390fd5b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90614a54565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a28060095f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b6013602052805f5260405f205f915054906101000a900460ff1681565b5f6012905090565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8282600c5f9054906101000a900460ff161561132557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cf5961bb6112d7612f4a565b84846040518463ffffffff1660e01b81526004016112f79392919061476c565b5f604051808303815f87803b15801561130e575f80fd5b505af1158015611320573d5f803e3d5ffd5b505050505b6113c1611330612f4a565b868660025f61133d612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546113bc9190614a72565b612f51565b60019250505092915050565b6113d5612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143a906147eb565b60405180910390fd5b80151560105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161515036114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c990614aef565b60405180910390fd5b8060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f2633ad3ef534c4bddda523fae274ccb4e47bb324c2eca411a9377d01529e2ffe8260405161156c9190614142565b60405180910390a25050565b611580612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e5906147eb565b60405180910390fd5b80151560115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615150361167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490614aef565b60405180910390fd5b8060115f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ff40f85f17edc8eb36b286100bde23545ec4fac647f64dd7214a897af944fcb30826040516117179190614142565b60405180910390a25050565b6012602052805f5260405f205f915054906101000a900460ff1681565b601c60019054906101000a900460ff1681565b601a5481565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611799612f4a565b73ffffffffffffffffffffffffffffffffffffffff16146117ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e6906149ec565b60405180910390fd5b600c5f9054906101000a900460ff161561183e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183590614b57565b60405180910390fd5b5f600b819055506001600c5f6101000a81548160ff0219169083151502179055507f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b60405160405180910390a1565b611895612ecc565b5f81116118d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ce90614bbf565b60405180910390fd5b6127106a0422ca8b0a00a4250000006118f09190614c0a565b811015611929576040517fbb8cf97300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806019819055507fcb6a4e25e6070c228470cc0df60e64d9c48337dd39b32c47376eef2b366454b78160405161195f91906141d2565b60405180910390a150565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b5481565b61199d612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a02906147eb565b60405180910390fd5b80151560135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9190614853565b60405180910390fd5b80151560125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16151503611b29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2090614c84565b60405180910390fd5b8060135f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f242e47ed17a9f432e4242bab4c34941ac33603481cb8319ed8dd8df34ae0051182604051611c179190614142565b60405180910390a25050565b6011602052805f5260405f205f915054906101000a900460ff1681565b5f60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611cb6612ecc565b611cbf5f61339e565b565b60185481565b60165f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cf4612ecc565b6001601c60016101000a81548160ff0219169083151502179055507fbeda7dca7bc1b3e80b871f4818129ec73b771581f803d553aeb3484098e5f65a6001604051611d3f9190614142565b60405180910390a1565b611d51612ecc565b5f8111611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90614cec565b60405180910390fd5b600a811115611dce576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601b819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d815f6001604051611e0993929190614d0a565b60405180910390a150565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611e7b612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec8906149ec565b60405180910390fd5b8160075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806008819055508173ffffffffffffffffffffffffffffffffffffffff167f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b160405160405180910390a25050565b600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611fa0612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed90614d89565b60405180910390fd5b600c5f9054906101000a900460ff16612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614df1565b60405180910390fd5b5f8282905090505f805b828110156121ae575f85858381811061206a57612069614e0f565b5b905060200201602081019061207f91906141eb565b90505f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555080846121109190614a72565b9350600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219191906141d2565b60405180910390a3505080806121a690614e3c565b91505061204e565b508060015f600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461221d9190614a72565b9250508190555050505050565b606060058054612239906146d4565b80601f0160208091040260200160405190810160405280929190818152602001828054612265906146d4565b80156122b05780601f10612287576101008083540402835291602001916122b0565b820191905f5260205f20905b81548152906001019060200180831161229357829003601f168201915b5050505050905090565b5f8282600c5f9054906101000a900460ff161561236557600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663568c75a9612317612f4a565b84846040518463ffffffff1660e01b81526004016123379392919061476c565b5f604051808303815f87803b15801561234e575f80fd5b505af1158015612360573d5f803e3d5ffd5b505050505b5f60025f612371612f4a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508481101561242b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242290614ef3565b60405180910390fd5b612448612436612f4a565b878784612443919061496f565b612f51565b6001935050505092915050565b5f8282600c5f9054906101000a900460ff161561250057600c60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631ffb811f6124b2612f4a565b84846040518463ffffffff1660e01b81526004016124d29392919061476c565b5f604051808303815f87803b1580156124e9575f80fd5b505af11580156124fb573d5f803e3d5ffd5b505050505b61251261250b612f4a565b8686613038565b60019250505092915050565b600d602052815f5260405f20602052805f5260405f205f91509150505481565b5f601754821115612551575f90506125fc565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050808311156125ab576125a384611c68565b9150506125fc565b600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f20549150505b92915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612642612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906149ec565b60405180910390fd5b5f600b54036126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614f5b565b60405180910390fd5b42600b541115612721576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271890614fc3565b60405180910390fd5b5f600c5f6101000a81548160ff0219169083151502179055505f600b819055507f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b60405160405180910390a1565b60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166127ef576040517f42df492800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601754905060175f81548092919061280790614e3c565b91905055505f600f5f8381526020019081526020015f2090504281600201819055506040518060600160405280825f01548152602001826001015481526020015f815250600f5f60175481526020019081526020015f205f820151815f01556020820151816001015560408201518160020155905050817f3b5ce8b2d475067181f949f668899c93f26f0b25c5f8712ebca6b4b93d92989d426040516128ad91906141d2565b60405180910390a25050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166128f9612f4a565b73ffffffffffffffffffffffffffffffffffffffff161461294f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129469061502b565b60405180910390fd5b60085481805190602001201461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190615093565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f60405160405180910390a260075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f81565b6010602052805f5260405f205f915054906101000a900460ff1681565b601b5481565b600c5f9054906101000a900460ff1681565b600e602052805f5260405f205f915090505481565b600f602052805f5260405f205f91509050805f0154908060010154908060020154905083565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612b76612f4a565b73ffffffffffffffffffffffffffffffffffffffff1614612bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc3906149ec565b60405180910390fd5b5f600b5414612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906150fb565b60405180910390fd5b600c5f9054906101000a900460ff16612c5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5590615163565b60405180910390fd5b600a5442612c6c9190614a72565b600b819055507f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a600b54604051612ca391906141d2565b60405180910390a1565b612cb5612ecc565b5f8111612cf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cee90614cec565b60405180910390fd5b600a811115612d32576040517f2aad382000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80601a819055507f78cd946ea54440e5e0457ca142c8592fd7a7d34388c8a82328c57e39cc67f04d8160015f604051612d6d93929190614d0a565b60405180910390a150565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b612e02612ecc565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e67906151f1565b60405180910390fd5b612e798161339e565b50565b60095f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60195481565b612ed4612f4a565b73ffffffffffffffffffffffffffffffffffffffff16612ef2611e14565b73ffffffffffffffffffffffffffffffffffffffff1614612f48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3f90615259565b60405180910390fd5b565b5f33905090565b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161302b91906141d2565b60405180910390a3505050565b5f60105f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806130d4575060105f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b9050601c60019054906101000a900460ff161580156130f1575080155b15613128576040517f729cc03d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61313284836134cd565b5f61313c30611c68565b9050601c5f9054906101000a900460ff1615801561315c57506018548110155b8015613166575081155b80156131b9575060135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b156131c7576131c66137e9565b5b816132ce575f60135f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561323d576064601b548561322c9190615277565b6132369190614c0a565b90506132aa565b60135f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156132a9576064601a548561329c9190615277565b6132a69190614c0a565b90505b5b5f8111156132cc576132bd8630836139ee565b80846132c9919061496f565b93505b505b5f836132d986611c68565b6132e39190614a72565b905060115f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615801561333d575060195481115b156133815784816040517f1ba623300000000000000000000000000000000000000000000000000000000081526004016133789291906152b8565b60405180910390fd5b61338b8585613beb565b6133968686866139ee565b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361340c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613403906151f1565b60405180910390fd5b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f60175490505f600d5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8381526020019081526020015f205490505f61352d85611c68565b90505f848261353c919061496f565b90505f600f5f8681526020019081526020015f20905084600e5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561369b57600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f205f90555f84111561369657690a968163f0a57b40000084106136695783815f015f82825461365d919061496f565b92505081905550613695565b683635c9adc5dea0000084106136945783816001015f82825461368c919061496f565b925050819055505b5b5b6137e0565b81600d5f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8781526020019081526020015f2081905550690a968163f0a57b40000083106137885782815f015f82825461370f919061496f565b92505081905550690a968163f0a57b40000082106137415781815f015f8282546137399190614a72565b925050819055505b690a968163f0a57b400000821080156137635750683635c9adc5dea000008210155b156137835781816001015f82825461377b9190614a72565b925050819055505b6137df565b683635c9adc5dea0000083106137de5782816001015f8282546137ab919061496f565b92505081905550683635c9adc5dea0000082106137dd5781816001015f8282546137d59190614a72565b925050819055505b5b5b5b50505050505050565b6001601c5f6101000a81548160ff0219169083151502179055505f61380d30611c68565b90505f8111156139d2575f600267ffffffffffffffff81111561383357613832614457565b5b6040519080825280602002602001820160405280156138615781602001602082028036833780820191505090505b50905030815f8151811061387857613877614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106138e7576138e6614e0f565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060155f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac947835f847f0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f426040518663ffffffff1660e01b81526004016139a39594939291906153ef565b5f604051808303815f87803b1580156139ba575f80fd5b505af11580156139cc573d5f803e3d5ffd5b50505050505b5f601c5f6101000a81548160ff02191690831515021790555050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613a5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a53906154b7565b60405180910390fd5b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015613ae0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ad790615545565b60405180910390fd5b8181613aec919061496f565b60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254613b799190614a72565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613bdd91906141d2565b60405180910390a350505050565b5f60175490505f613bfb84611c68565b90505f600d5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8481526020019081526020015f205490505f600f5f8581526020019081526020015f20905083600e5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615613daa57600d5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8581526020019081526020015f205f90555f821115613da557690a968163f0a57b4000008210613d785781815f015f828254613d6c919061496f565b92505081905550613da4565b683635c9adc5dea000008210613da35781816001015f828254613d9b919061496f565b925050819055505b5b5b613f6f565b8483613db69190614a72565b600d5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8681526020019081526020015f20819055505f8584613e139190614a72565b9050683635c9adc5dea00000841015613e8657690a968163f0a57b4000008110613e555780825f015f828254613e499190614a72565b92505081905550613e81565b683635c9adc5dea000008110613e805780826001015f828254613e789190614a72565b925050819055505b5b613f6d565b683635c9adc5dea000008410158015613ea85750690a968163f0a57b40000084105b15613f2757690a968163f0a57b4000008110613edc5780825f015f828254613ed09190614a72565b92505081905550613f08565b683635c9adc5dea000008110613f075780826001015f828254613eff9190614a72565b925050819055505b5b83826001015f828254613f1b919061496f565b92505081905550613f6c565b690a968163f0a57b4000008410613f6b5780825f015f828254613f4a9190614a72565b9250508190555083825f015f828254613f63919061496f565b925050819055505b5b5b505b505050505050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613fae578082015181840152602081019050613f93565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613fd382613f77565b613fdd8185613f81565b9350613fed818560208601613f91565b613ff681613fb9565b840191505092915050565b5f6020820190508181035f8301526140198184613fc9565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b61404481614032565b811461404e575f80fd5b50565b5f8135905061405f8161403b565b92915050565b5f6020828403121561407a5761407961402a565b5b5f61408784828501614051565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6140b982614090565b9050919050565b6140c9816140af565b81146140d3575f80fd5b50565b5f813590506140e4816140c0565b92915050565b5f8060408385031215614100576140ff61402a565b5b5f61410d858286016140d6565b925050602061411e85828601614051565b9150509250929050565b5f8115159050919050565b61413c81614128565b82525050565b5f6020820190506141555f830184614133565b92915050565b61416481614128565b811461416e575f80fd5b50565b5f8135905061417f8161415b565b92915050565b5f806040838503121561419b5761419a61402a565b5b5f6141a8858286016140d6565b92505060206141b985828601614171565b9150509250929050565b6141cc81614032565b82525050565b5f6020820190506141e55f8301846141c3565b92915050565b5f60208284031215614200576141ff61402a565b5b5f61420d848285016140d6565b91505092915050565b5f805f6060848603121561422d5761422c61402a565b5b5f61423a868287016140d6565b935050602061424b868287016140d6565b925050604061425c86828701614051565b9150509250925092565b5f60ff82169050919050565b61427b81614266565b82525050565b5f6020820190506142945f830184614272565b92915050565b5f819050919050565b5f6142bd6142b86142b384614090565b61429a565b614090565b9050919050565b5f6142ce826142a3565b9050919050565b5f6142df826142c4565b9050919050565b6142ef816142d5565b82525050565b5f6020820190506143085f8301846142e6565b92915050565b614317816140af565b82525050565b5f6020820190506143305f83018461430e565b92915050565b5f819050919050565b61434881614336565b8114614352575f80fd5b50565b5f813590506143638161433f565b92915050565b5f806040838503121561437f5761437e61402a565b5b5f61438c858286016140d6565b925050602061439d85828601614355565b9150509250929050565b5f80fd5b5f80fd5b5f80fd5b5f8083601f8401126143c8576143c76143a7565b5b8235905067ffffffffffffffff8111156143e5576143e46143ab565b5b602083019150836020820283011115614401576144006143af565b5b9250929050565b5f806020838503121561441e5761441d61402a565b5b5f83013567ffffffffffffffff81111561443b5761443a61402e565b5b614447858286016143b3565b92509250509250929050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61448d82613fb9565b810181811067ffffffffffffffff821117156144ac576144ab614457565b5b80604052505050565b5f6144be614021565b90506144ca8282614484565b919050565b5f67ffffffffffffffff8211156144e9576144e8614457565b5b6144f282613fb9565b9050602081019050919050565b828183375f83830152505050565b5f61451f61451a846144cf565b6144b5565b90508281526020810184848401111561453b5761453a614453565b5b6145468482856144ff565b509392505050565b5f82601f830112614562576145616143a7565b5b813561457284826020860161450d565b91505092915050565b5f602082840312156145905761458f61402a565b5b5f82013567ffffffffffffffff8111156145ad576145ac61402e565b5b6145b98482850161454e565b91505092915050565b5f6145cc82614090565b9050919050565b6145dc816145c2565b82525050565b5f6020820190506145f55f8301846145d3565b92915050565b5f60608201905061460e5f8301866141c3565b61461b60208301856141c3565b61462860408301846141c3565b949350505050565b5f80604083850312156146465761464561402a565b5b5f614653858286016140d6565b9250506020614664858286016140d6565b9150509250929050565b5f614678826142c4565b9050919050565b6146888161466e565b82525050565b5f6020820190506146a15f83018461467f565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806146eb57607f821691505b6020821081036146fe576146fd6146a7565b5b50919050565b7f465558494f4e5f5f496e76616c69645468726573686f6c6400000000000000005f82015250565b5f614738601883613f81565b915061474382614704565b602082019050919050565b5f6020820190508181035f8301526147658161472c565b9050919050565b5f60608201905061477f5f83018661430e565b61478c602083018561430e565b61479960408301846141c3565b949350505050565b7f465558494f4e5f5f496e76616c696441646472657373000000000000000000005f82015250565b5f6147d5601683613f81565b91506147e0826147a1565b602082019050919050565b5f6020820190508181035f830152614802816147c9565b9050919050565b7f465558494f4e5f5f416c726561647953657400000000000000000000000000005f82015250565b5f61483d601283613f81565b915061484882614809565b602082019050919050565b5f6020820190508181035f83015261486a81614831565b9050919050565b5f6080820190506148845f83018761430e565b614891602083018661430e565b61489e604083018561430e565b6148ab60608301846141c3565b95945050505050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f616c6c6f77616e63650000000000000000000000000000000000000000000000602082015250565b5f61490e602983613f81565b9150614919826148b4565b604082019050919050565b5f6020820190508181035f83015261493b81614902565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61497982614032565b915061498483614032565b925082820390508181111561499c5761499b614942565b5b92915050565b7f4c45524332303a204d757374206265207265636f766572792061646d696e00005f82015250565b5f6149d6601e83613f81565b91506149e1826149a2565b602082019050919050565b5f6020820190508181035f830152614a03816149ca565b9050919050565b7f4c45524332303a2043616e6e6f74207365742073616d652061646472657373005f82015250565b5f614a3e601f83613f81565b9150614a4982614a0a565b602082019050919050565b5f6020820190508181035f830152614a6b81614a32565b9050919050565b5f614a7c82614032565b9150614a8783614032565b9250828201905080821115614a9f57614a9e614942565b5b92915050565b7f465558494f4e5f5f416c72656164794578636c756465640000000000000000005f82015250565b5f614ad9601783613f81565b9150614ae482614aa5565b602082019050919050565b5f6020820190508181035f830152614b0681614acd565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6e00000000005f82015250565b5f614b41601b83613f81565b9150614b4c82614b0d565b602082019050919050565b5f6020820190508181035f830152614b6e81614b35565b9050919050565b7f465558494f4e5f5f496e76616c69644d617857616c6c657400000000000000005f82015250565b5f614ba9601883613f81565b9150614bb482614b75565b602082019050919050565b5f6020820190508181035f830152614bd681614b9d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614c1482614032565b9150614c1f83614032565b925082614c2f57614c2e614bdd565b5b828204905092915050565b7f465558494f4e5f5f496e76616c696400000000000000000000000000000000005f82015250565b5f614c6e600f83613f81565b9150614c7982614c3a565b602082019050919050565b5f6020820190508181035f830152614c9b81614c62565b9050919050565b7f465558494f4e5f5f496e76616c6964546178416d6f756e7400000000000000005f82015250565b5f614cd6601883613f81565b9150614ce182614ca2565b602082019050919050565b5f6020820190508181035f830152614d0381614cca565b9050919050565b5f606082019050614d1d5f8301866141c3565b614d2a6020830185614133565b614d376040830184614133565b949350505050565b7f4c45524332303a204f6e6c79206c6f73736c65737320636f6e747261637400005f82015250565b5f614d73601e83613f81565b9150614d7e82614d3f565b602082019050919050565b5f6020820190508181035f830152614da081614d67565b9050919050565b7f4c45524332303a204c6f73736c657373206973206f66660000000000000000005f82015250565b5f614ddb601783613f81565b9150614de682614da7565b602082019050919050565b5f6020820190508181035f830152614e0881614dcf565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f614e4682614032565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614e7857614e77614942565b5b600182019050919050565b7f4c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f5f8201527f77207a65726f0000000000000000000000000000000000000000000000000000602082015250565b5f614edd602683613f81565b9150614ee882614e83565b604082019050919050565b5f6020820190508181035f830152614f0a81614ed1565b9050919050565b7f4c45524332303a205475726e4f6666206e6f742070726f706f736564000000005f82015250565b5f614f45601c83613f81565b9150614f5082614f11565b602082019050919050565b5f6020820190508181035f830152614f7281614f39565b9050919050565b7f4c45524332303a2054696d65206c6f636b20696e2070726f67726573730000005f82015250565b5f614fad601d83613f81565b9150614fb882614f79565b602082019050919050565b5f6020820190508181035f830152614fda81614fa1565b9050919050565b7f4c45524332303a204d7573742062652063616e646974617465000000000000005f82015250565b5f615015601983613f81565b915061502082614fe1565b602082019050919050565b5f6020820190508181035f83015261504281615009565b9050919050565b7f4c45524332303a20496e76616c6964206b6579000000000000000000000000005f82015250565b5f61507d601383613f81565b915061508882615049565b602082019050919050565b5f6020820190508181035f8301526150aa81615071565b9050919050565b7f4c45524332303a205475726e4f666620616c72656164792070726f706f7365645f82015250565b5f6150e5602083613f81565b91506150f0826150b1565b602082019050919050565b5f6020820190508181035f830152615112816150d9565b9050919050565b7f4c45524332303a204c6f73736c65737320616c7265616479206f6666000000005f82015250565b5f61514d601c83613f81565b915061515882615119565b602082019050919050565b5f6020820190508181035f83015261517a81615141565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6151db602683613f81565b91506151e682615181565b604082019050919050565b5f6020820190508181035f830152615208816151cf565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f615243602083613f81565b915061524e8261520f565b602082019050919050565b5f6020820190508181035f83015261527081615237565b9050919050565b5f61528182614032565b915061528c83614032565b925082820261529a81614032565b915082820484148315176152b1576152b0614942565b5b5092915050565b5f6040820190506152cb5f83018561430e565b6152d860208301846141c3565b9392505050565b5f819050919050565b5f6153026152fd6152f8846152df565b61429a565b614032565b9050919050565b615312816152e8565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61534a816140af565b82525050565b5f61535b8383615341565b60208301905092915050565b5f602082019050919050565b5f61537d82615318565b6153878185615322565b935061539283615332565b805f5b838110156153c25781516153a98882615350565b97506153b483615367565b925050600181019050615395565b5085935050505092915050565b5f6153d9826142c4565b9050919050565b6153e9816153cf565b82525050565b5f60a0820190506154025f8301886141c3565b61540f6020830187615309565b81810360408301526154218186615373565b905061543060608301856153e0565b61543d60808301846141c3565b9695505050505050565b7f4c45524332303a207472616e736665722066726f6d20746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6154a1602683613f81565b91506154ac82615447565b604082019050919050565b5f6020820190508181035f8301526154ce81615495565b9050919050565b7f4c45524332303a207472616e7366657220616d6f756e742065786365656473205f8201527f62616c616e636500000000000000000000000000000000000000000000000000602082015250565b5f61552f602783613f81565b915061553a826154d5565b604082019050919050565b5f6020820190508181035f83015261555c81615523565b905091905056fea2646970667358221220416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf764736f6c63430008150033

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

0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db40000000000000000000000000000000000000000000000000000000000015180

-----Decoded View---------------
Arg [0] : _admin (address): 0x3336F22201914e8BFfC69D2dB520a9DA84dBa14f
Arg [1] : _newOwner (address): 0x1A4232444Bbdca5e4E37e125E4b17F1aD037c056
Arg [2] : _recoveryAdmin (address): 0xf6Af39db4887c8f3671Ec11c5baB428700626a41
Arg [3] : lossless_ (address): 0xe91D7cEBcE484070fc70777cB04F7e2EfAe31DB4
Arg [4] : timeLockPeriod_ (uint256): 86400

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000003336f22201914e8bffc69d2db520a9da84dba14f
Arg [1] : 0000000000000000000000001a4232444bbdca5e4e37e125e4b17f1ad037c056
Arg [2] : 000000000000000000000000f6af39db4887c8f3671ec11c5bab428700626a41
Arg [3] : 000000000000000000000000e91d7cebce484070fc70777cb04f7e2efae31db4
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180


Deployed Bytecode Sourcemap

39326:18582:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47347:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24710:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48538:443;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41018:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48150:121;;;:::i;:::-;;40535:65;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24020:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24939:587;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21528:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18583:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40475:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23919:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18703:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25534:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44841:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45481:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40379:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41214:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41115:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23315:238;;;:::i;:::-;;47609:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18424:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18619:39;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46071:543;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40286:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23561:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24136:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29405:103;;;:::i;:::-;;41054:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40899:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47964:120;;;:::i;:::-;;49611:260;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28764:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21773:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20775:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23807:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25933:546;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24287:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39979:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57389:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22916:391;;;:::i;:::-;;46698:529;;;:::i;:::-;;22063:438;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40966:45;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40208:71;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41144:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18665:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40075:66;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40148:53;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;22509:399;;;:::i;:::-;;49167:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24526:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29663:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18547:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40858:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41087:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23699:100;23753:13;23786:5;23779:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23699:100;:::o;47347:254::-;28650:13;:11;:13::i;:::-;47446:1:::1;47430:13;:17;47422:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;40644:15;47493:13;:26;47489:65;;;47528:26;;;;;;;;;;;;;;47489:65;47580:13;47565:12;:28;;;;47347:254:::0;:::o;24710:221::-;24845:4;24819:7;24828:6;19392:12;;;;;;;;;;;19388:98;;;19421:8;;;;;;;;;;;:22;;;19444:12;:10;:12::i;:::-;19458:7;19467:6;19421:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19388:98;24862:39:::1;24871:12;:10;:12::i;:::-;24885:7;24894:6;24862:8;:39::i;:::-;24919:4;24912:11;;24710:221:::0;;;;;;:::o;48538:443::-;28650:13;:11;:13::i;:::-;48699:1:::1;48675:26;;:12;:26;;::::0;48667:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48792:14;48761:45;;:13;:27;48775:12;48761:27;;;;;;;;;;;;;;;;;;;;;;;;;:45;;::::0;48739:113:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48893:14;48863:13;:27;48877:12;48863:27;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;48944:12;48923:50;;;48958:14;48923:50;;;;;;:::i;:::-;;;;;;;;48538:443:::0;;:::o;41018:29::-;;;;:::o;48150:121::-;28650:13;:11;:13::i;:::-;48221:5:::1;48204:14;;:22;;;;;;;;;;;;;;;;;;48242:21;48257:5;48242:21;;;;;;:::i;:::-;;;;;;;;48150:121::o:0;40535:65::-;;;;;;;;;;;;;;;;;;;;;;:::o;24020:108::-;24081:7;24108:12;;24101:19;;24020:108;:::o;24939:587::-;25167:4;25122:6;25130:9;25141:6;19833:12;;;;;;;;;;;19829:196;;;19862:8;;;;;;;;;;;:27;;;19908:12;:10;:12::i;:::-;19939:6;19964:9;19992:6;19862:151;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19829:196;25189:24:::1;25216:11;:19;25228:6;25216:19;;;;;;;;;;;;;;;:33;25236:12;:10;:12::i;:::-;25216:33;;;;;;;;;;;;;;;;25189:60;;25302:6;25282:16;:26;;25260:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;25388:36;25398:6;25406:9;25417:6;25388:9;:36::i;:::-;25437:57;25446:6;25454:12;:10;:12::i;:::-;25487:6;25468:16;:25;;;;:::i;:::-;25437:8;:57::i;:::-;25514:4;25507:11;;;24939:587:::0;;;;;;;;:::o;21528:237::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;21655:5:::1;;;;;;;;;;;21643:17;;:8;:17;;::::0;21635:61:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21721:8;21712:18;;;;;;;;;;;;21749:8;21741:5;;:16;;;;;;;;;;;;;;;;;;21528:237:::0;:::o;18583:29::-;;;;:::o;40475:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;23919:93::-;23977:5;24002:2;23995:9;;23919:93;:::o;18703:30::-;;;;;;;;;;;;;:::o;25534:391::-;25743:4;25704:7;25713:10;20134:12;;;;;;;;;;;20130:112;;;20163:8;;;;;;;;;;;:32;;;20196:12;:10;:12::i;:::-;20210:7;20219:10;20163:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20130:112;25765:130:::1;25788:12;:10;:12::i;:::-;25815:7;25874:10;25837:11;:25;25849:12;:10;:12::i;:::-;25837:25;;;;;;;;;;;;;;;:34;25863:7;25837:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;25765:8;:130::i;:::-;25913:4;25906:11;;25534:391:::0;;;;;;:::o;44841:398::-;28650:13;:11;:13::i;:::-;44979:1:::1;44962:19;;:5;:19;;::::0;44954:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45069:9;45041:37;;:17;:24;45059:5;45041:24;;;;;;;;;;;;;;;;;;;;;;;;;:37;;::::0;45019:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45167:9;45140:17;:24;45158:5;45140:24;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;45214:5;45192:39;;;45221:9;45192:39;;;;;;:::i;:::-;;;;;;;;44841:398:::0;;:::o;45481:417::-;28650:13;:11;:13::i;:::-;45626:1:::1;45609:19;;:5;:19;;::::0;45601:54:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45722:9;45688:43;;:23;:30;45712:5;45688:30;;;;;;;;;;;;;;;;;;;;;;;;;:43;;::::0;45666:116:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45826:9;45793:23;:30;45817:5;45793:30;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;45873:5;45851:39;;;45880:9;45851:39;;;;;;:::i;:::-;;;;;;;;45481:417:::0;;:::o;40379:89::-;;;;;;;;;;;;;;;;;;;;;;:::o;41214:34::-;;;;;;;;;;;;;:::o;41115:22::-;;;;:::o;23315:238::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23404:12:::1;;;;;;;;;;;23403:13;23395:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;23486:1;23459:24;:28;;;;23513:4;23498:12;;:19;;;;;;;;;;;;;;;;;;23533:12;;;;;;;;;;23315:238::o:0;47609:290::-;28650:13;:11;:13::i;:::-;47699:1:::1;47686:10;:14;47678:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;47770:6;40644:15;47757:19;;;;:::i;:::-;47744:10;:32;47740:71;;;47785:26;;;;;;;;;;;;;;47740:71;47834:10;47822:9;:22;;;;47860:31;47880:10;47860:31;;;;;;:::i;:::-;;;;;;;;47609:290:::0;:::o;18424:28::-;;;;;;;;;;;;;:::o;18619:39::-;;;;:::o;46071:543::-;28650:13;:11;:13::i;:::-;46217:1:::1;46195:24;;:10;:24;;::::0;46187:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46292:12;46265:39;;:11;:23;46277:10;46265:23;;;;;;;;;;;;;;;;;;;;;;;;;:39;;::::0;46257:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46392:12;46360:44;;:16;:28;46377:10;46360:28;;;;;;;;;;;;;;;;;;;;;;;;;:44;;::::0;46338:109:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46484:12;46458:11;:23;46470:10;46458:23;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;46538:12;46507:16;:28;46524:10;46507:28;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;46581:10;46566:40;;;46593:12;46566:40;;;;;;:::i;:::-;;;;;;;;46071:543:::0;;:::o;40286:86::-;;;;;;;;;;;;;;;;;;;;;;:::o;23561:98::-;23619:7;23646:5;;;;;;;;;;;23639:12;;23561:98;:::o;24136:143::-;24226:7;24253:9;:18;24263:7;24253:18;;;;;;;;;;;;;;;;24246:25;;24136:143;;;:::o;29405:103::-;28650:13;:11;:13::i;:::-;29470:30:::1;29497:1;29470:18;:30::i;:::-;29405:103::o:0;41054:24::-;;;;:::o;40899:23::-;;;;;;;;;;;;;:::o;47964:120::-;28650:13;:11;:13::i;:::-;48036:4:::1;48019:14;;:21;;;;;;;;;;;;;;;;;;48056:20;48071:4;48056:20;;;;;;:::i;:::-;;;;;;;;47964:120::o:0;49611:260::-;28650:13;:11;:13::i;:::-;49695:1:::1;49684:8;:12;49676:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;49751:2;49740:8;:13;49736:52;;;49762:26;;;;;;;;;;;;;;49736:52;49809:8;49799:7;:18;;;;49833:30;49841:8;49851:5;49858:4;49833:30;;;;;;;;:::i;:::-;;;;;;;;49611:260:::0;:::o;28764:87::-;28810:7;28837:6;;;;;;;;;;;28830:13;;28764:87;:::o;21773:282::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;21946:9:::1;21921:22;;:34;;;;;;;;;;;;;;;;;;21989:7;21966:20;:30;;;;22037:9;22012:35;;;;;;;;;;;;21773:282:::0;;:::o;20775:745::-;20928:8;;;;;;;;;;;20904:33;;:12;:10;:12::i;:::-;:33;;;20882:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;21014:12;;;;;;;;;;;21006:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;21067:18;21088:4;;:11;;21067:32;;21110:19;21151:9;21146:311;21170:10;21166:1;:14;21146:311;;;21202:19;21224:4;;21229:1;21224:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21202:29;;21246:19;21268:9;:22;21278:11;21268:22;;;;;;;;;;;;;;;;21246:44;;21330:1;21305:9;:22;21315:11;21305:22;;;;;;;;;;;;;;;:26;;;;21361:11;21346:26;;;;;:::i;:::-;;;21422:8;;;;;;;;;;;21392:53;;21401:11;21392:53;;;21433:11;21392:53;;;;;;:::i;:::-;;;;;;;;21187:270;;21182:3;;;;;:::i;:::-;;;;21146:311;;;;21501:11;21469:9;:28;21487:8;;;;;;;;;;;21469:28;;;;;;;;;;;;;;;;:43;;;;;;;:::i;:::-;;;;;;;;20871:649;;20775:745;;:::o;23807:104::-;23863:13;23896:7;23889:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23807:104;:::o;25933:546::-;26152:4;26108:7;26117:15;20356:12;;;;;;;;;;;20352:183;;;20385:8;;;;;;;;;;;:32;;;20436:12;:10;:12::i;:::-;20467:7;20493:15;20385:138;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20352:183;26174:24:::1;26201:11;:25;26213:12;:10;:12::i;:::-;26201:25;;;;;;;;;;;;;;;:34;26227:7;26201:34;;;;;;;;;;;;;;;;26174:61;;26288:15;26268:16;:35;;26246:123;;;;;;;;;;;;:::i;:::-;;;;;;;;;26380:67;26389:12;:10;:12::i;:::-;26403:7;26431:15;26412:16;:34;;;;:::i;:::-;26380:8;:67::i;:::-;26467:4;26460:11;;;25933:546:::0;;;;;;:::o;24287:231::-;24429:4;24401:9;24412:6;19584:12;;;;;;;;;;;19580:101;;;19613:8;;;;;;;;;;;:23;;;19637:12;:10;:12::i;:::-;19651:9;19662:6;19613:56;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19580:101;24446:42:::1;24456:12;:10;:12::i;:::-;24470:9;24481:6;24446:9;:42::i;:::-;24506:4;24499:11;;24287:231:::0;;;;;;:::o;39979:89::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57389:516::-;57491:4;57576:13;;57567:6;:22;57563:36;;;57598:1;57591:8;;;;57563:36;57610:17;57630:14;:20;57645:4;57630:20;;;;;;;;;;;;;;;;57610:40;;57772:12;57763:6;:21;57759:49;;;57793:15;57803:4;57793:9;:15::i;:::-;57786:22;;;;;57759:49;57871:12;:18;57884:4;57871:18;;;;;;;;;;;;;;;:26;57890:6;57871:26;;;;;;;;;;;;57864:33;;;57389:516;;;;;:::o;22916:391::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;23033:1:::1;23005:24;;:29:::0;22997:70:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23128:15;23100:24;;:43;;23078:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;23226:5;23211:12;;:20;;;;;;;;;;;;;;;;;;23269:1;23242:24;:28;;;;23286:13;;;;;;;;;;22916:391::o:0;46698:529::-;42333:13;:25;42347:10;42333:25;;;;;;;;;;;;;;;;;;;;;;;;;42328:59;;42367:20;;;;;;;;;;;;;;42328:59;46758:16:::1;46777:13;;46758:32;;46801:13;;:15;;;;;;;;;:::i;:::-;;;;;;46829:25;46857:9;:22;46867:11;46857:22;;;;;;;;;;;46829:50;;46920:15;46890:4;:27;;:45;;;;47009:149;;;;;;;;47049:4;:15;;;47009:149;;;;47091:4;:15;;;47009:149;;;;47145:1;47009:149;;::::0;46982:9:::1;:24;46992:13;;46982:24;;;;;;;;;;;:176;;;;;;;;;;;;;;;;;;;;;;;;;;;47190:11;47176:43;47203:15;47176:43;;;;;;:::i;:::-;;;;;;;;46747:480;;46698:529::o:0;22063:438::-;22186:22;;;;;;;;;;;22170:38;;:12;:10;:12::i;:::-;:38;;;22148:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;22298:20;;22290:3;22280:14;;;;;;:38;22272:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;22375:22;;;;;;;;;;;22358:40;;;;;;;;;;;;22425:22;;;;;;;;;;;22409:13;;:38;;;;;;;;;;;;;;;;;;22491:1;22458:22;;:35;;;;;;;;;;;;;;;;;;22063:438;:::o;40966:45::-;;;:::o;40208:71::-;;;;;;;;;;;;;;;;;;;;;;:::o;41144:23::-;;;;:::o;18665:31::-;;;;;;;;;;;;;:::o;40075:66::-;;;;;;;;;;;;;;;;;:::o;40148:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22509:399::-;20640:13;;;;;;;;;;;20624:29;;:12;:10;:12::i;:::-;:29;;;20602:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;22640:1:::1;22612:24;;:29;22590:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22720:12;;;;;;;;;;;22712:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;22821:14;;22803:15;:32;;;;:::i;:::-;22776:24;:59;;;;22851:49;22875:24;;22851:49;;;;;;:::i;:::-;;;;;;;;22509:399::o:0;49167:253::-;28650:13;:11;:13::i;:::-;49248:1:::1;49238:7;:11;49230:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;49303:2;49293:7;:12;49289:51;;;49314:26;;;;;;;;;;;;;;49289:51;49360:7;49351:6;:16;;;;49383:29;49391:7;49400:4;49406:5;49383:29;;;;;;;;:::i;:::-;;;;;;;;49167:253:::0;:::o;24526:176::-;24640:7;24667:11;:18;24679:5;24667:18;;;;;;;;;;;;;;;:27;24686:7;24667:27;;;;;;;;;;;;;;;;24660:34;;24526:176;;;;:::o;29663:238::-;28650:13;:11;:13::i;:::-;29786:1:::1;29766:22;;:8;:22;;::::0;29744:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29865:28;29884:8;29865:18;:28::i;:::-;29663:238:::0;:::o;18547:29::-;;;;;;;;;;;;;:::o;40858:32::-;;;;;;;;;;;;;:::o;41087:21::-;;;;:::o;28929:132::-;29004:12;:10;:12::i;:::-;28993:23;;:7;:5;:7::i;:::-;:23;;;28985:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28929:132::o;93:98::-;146:7;173:10;166:17;;93:98;:::o;27942:220::-;28100:6;28070:11;:18;28082:5;28070:18;;;;;;;;;;;;;;;:27;28089:7;28070:27;;;;;;;;;;;;;;;:36;;;;28138:7;28122:32;;28131:5;28122:32;;;28147:6;28122:32;;;;;;:::i;:::-;;;;;;;;27942:220;;;:::o;50369:1580::-;50490:17;50510;:23;50528:4;50510:23;;;;;;;;;;;;;;;;;;;;;;;;;:48;;;;50537:17;:21;50555:2;50537:21;;;;;;;;;;;;;;;;;;;;;;;;;50510:48;50490:68;;50576:14;;;;;;;;;;;50575:15;:32;;;;;50595:12;50594:13;50575:32;50571:99;;;50631:27;;;;;;;;;;;;;;50571:99;50682:33;50702:4;50708:6;50682:19;:33::i;:::-;50728:19;50750:24;50768:4;50750:9;:24::i;:::-;50728:46;;50806:10;;;;;;;;;;;50805:11;:58;;;;;50851:12;;50833:14;:30;;50805:58;:88;;;;;50881:12;50880:13;50805:88;:123;;;;;50911:11;:17;50923:4;50911:17;;;;;;;;;;;;;;;;;;;;;;;;;50910:18;50805:123;50787:217;;;50979:13;:11;:13::i;:::-;50787:217;51093:12;51088:513;;51122:8;51209:11;:15;51221:2;51209:15;;;;;;;;;;;;;;;;;;;;;;;;;51205:250;;;40848:3;51289:7;;51280:6;:16;;;;:::i;:::-;51279:32;;;;:::i;:::-;51273:38;;51205:250;;;51337:11;:17;51349:4;51337:17;;;;;;;;;;;;;;;;;;;;;;;;;51333:122;;;40848:3;51418:6;;51409;:15;;;;:::i;:::-;51408:31;;;;:::i;:::-;51402:37;;51333:122;51205:250;51479:1;51473:3;:7;51469:121;;;51501:41;51517:4;51531;51538:3;51501:15;:41::i;:::-;51571:3;51561:13;;;;;:::i;:::-;;;51469:121;51107:494;51088:513;51665:17;51701:6;51685:13;51695:2;51685:9;:13::i;:::-;:22;;;;:::i;:::-;51665:42;;51723:23;:27;51747:2;51723:27;;;;;;;;;;;;;;;;;;;;;;;;;51722:28;:56;;;;;51769:9;;51754:12;:24;51722:56;51718:138;;;51827:2;51831:12;51802:42;;;;;;;;;;;;:::i;:::-;;;;;;;;51718:138;51866:31;51886:2;51890:6;51866:19;:31::i;:::-;51908:33;51924:4;51930:2;51934:6;51908:15;:33::i;:::-;50479:1470;;;50369:1580;;;:::o;30061:312::-;30177:1;30157:22;;:8;:22;;;30135:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;30256:16;30275:6;;;;;;;;;;;30256:25;;30301:8;30292:6;;:17;;;;;;;;;;;;;;;;;;30356:8;30325:40;;30346:8;30325:40;;;;;;;;;;;;30124:249;30061:312;:::o;53035:1821::-;53110:16;53129:13;;53110:32;;53153:23;53179:12;:18;53192:4;53179:18;;;;;;;;;;;;;;;:31;53198:11;53179:31;;;;;;;;;;;;53153:57;;53221:19;53243:15;53253:4;53243:9;:15::i;:::-;53221:37;;53269:15;53304:6;53287:14;:23;;;;:::i;:::-;53269:41;;53321:25;53349:9;:22;53359:11;53349:22;;;;;;;;;;;53321:50;;53405:11;53382:14;:20;53397:4;53382:20;;;;;;;;;;;;;;;:34;;;;53516:16;:22;53533:4;53516:22;;;;;;;;;;;;;;;;;;;;;;;;;53512:1337;;;53562:12;:18;53575:4;53562:18;;;;;;;;;;;;;;;:31;53581:11;53562:31;;;;;;;;;;;53555:38;;;53725:1;53704:18;:22;53700:271;;;40697:12;53751:18;:28;53747:208;;53821:18;53802:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;53747:208;;;40769:11;53867:18;:28;53863:92;;53937:18;53918:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;53863:92;53747:208;53700:271;53512:1337;;;54037:10;54003:12;:18;54016:4;54003:18;;;;;;;;;;;;;;;:31;54022:11;54003:31;;;;;;;;;;;:44;;;;40697:12;54097:14;:24;54093:745;;54197:14;54178:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;40697:12;54267:10;:20;54263:55;;54308:10;54289:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54263:55;40697:12;54371:10;:19;:43;;;;;40769:11;54394:10;:20;;54371:43;54367:99;;;54456:10;54437:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54367:99;54093:745;;;40769:11;54590:14;:24;54586:252;;54654:14;54635:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;40769:11;54724:10;:20;54720:55;;54765:10;54746:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;54720:55;54586:252;54093:745;53512:1337;53099:1757;;;;;53035:1821;;:::o;52078:763::-;52133:4;52120:10;;:17;;;;;;;;;;;;;;;;;;52216:28;52247:24;52265:4;52247:9;:24::i;:::-;52216:55;;52348:1;52325:20;:24;52321:484;;;52366:21;52404:1;52390:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52366:40;;52439:4;52421;52426:1;52421:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;52469:4;52459;52464:1;52459:7;;;;;;;;:::i;:::-;;;;;;;:14;;;;;;;;;;;52546:6;;;;;;;;;;;:57;;;52622:20;52661:1;52709:4;52732:12;52763:15;52546:247;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52351:454;52321:484;52828:5;52815:10;;:18;;;;;;;;;;;;;;;;;;52109:732;52078:763::o;26487:535::-;26645:1;26627:20;;:6;:20;;;26619:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26703:21;26727:9;:17;26737:6;26727:17;;;;;;;;;;;;;;;;26703:41;;26794:6;26777:13;:23;;26755:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;26914:6;26898:13;:22;;;;:::i;:::-;26878:9;:17;26888:6;26878:17;;;;;;;;;;;;;;;:42;;;;26955:6;26931:9;:20;26941:9;26931:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;26996:9;26979:35;;26988:6;26979:35;;;27007:6;26979:35;;;;;;:::i;:::-;;;;;;;;26608:414;26487:535;;;:::o;55034:2119::-;55109:16;55128:13;;55109:32;;55152:19;55174:15;55184:4;55174:9;:15::i;:::-;55152:37;;55200:23;55226:12;:18;55239:4;55226:18;;;;;;;;;;;;;;;:31;55245:11;55226:31;;;;;;;;;;;;55200:57;;55268:25;55296:9;:22;55306:11;55296:22;;;;;;;;;;;55268:50;;55352:11;55329:14;:20;55344:4;55329:20;;;;;;;;;;;;;;;:34;;;;55463:16;:22;55480:4;55463:22;;;;;;;;;;;;;;;;;;;;;;;;;55459:1687;;;55509:12;:18;55522:4;55509:18;;;;;;;;;;;;;;;:31;55528:11;55509:31;;;;;;;;;;;55502:38;;;55672:1;55651:18;:22;55647:271;;;40697:12;55698:18;:28;55694:208;;55768:18;55749:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;55694:208;;;40769:11;55814:18;:28;55810:92;;55884:18;55865:4;:15;;;:37;;;;;;;:::i;:::-;;;;;;;;55810:92;55694:208;55647:271;55459:1687;;;56001:6;55984:14;:23;;;;:::i;:::-;55950:12;:18;55963:4;55950:18;;;;;;;;;;;;;;;:31;55969:11;55950:31;;;;;;;;;;;:57;;;;56022:15;56057:6;56040:14;:23;;;;:::i;:::-;56022:41;;40769:11;56168:14;:23;56164:971;;;40697:12;56246:10;:20;56242:189;;56308:10;56289:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56242:189;;;40769:11;56380:10;:20;56376:55;;56421:10;56402:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56376:55;56242:189;56164:971;;;40769:11;56540:14;:24;;:51;;;;;40697:12;56568:14;:23;56540:51;56536:599;;;40697:12;56646:10;:20;56642:194;;56708:10;56689:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56642:194;;;40769:11;56785:10;:20;56781:55;;56826:10;56807:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;56781:55;56642:194;56874:14;56855:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;56536:599;;;40697:12;56955:14;:24;56951:184;;57057:10;57038:4;:15;;;:29;;;;;;;:::i;:::-;;;;;;;;57105:14;57086:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;56951:184;56536:599;56164:971;55935:1211;55459:1687;55098:2055;;;;55034:2119;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:122::-;2674:24;2692:5;2674:24;:::i;:::-;2667:5;2664:35;2654:63;;2713:1;2710;2703:12;2654:63;2601:122;:::o;2729:139::-;2775:5;2813:6;2800:20;2791:29;;2829:33;2856:5;2829:33;:::i;:::-;2729:139;;;;:::o;2874:474::-;2942:6;2950;2999:2;2987:9;2978:7;2974:23;2970:32;2967:119;;;3005:79;;:::i;:::-;2967:119;3125:1;3150:53;3195:7;3186:6;3175:9;3171:22;3150:53;:::i;:::-;3140:63;;3096:117;3252:2;3278:53;3323:7;3314:6;3303:9;3299:22;3278:53;:::i;:::-;3268:63;;3223:118;2874:474;;;;;:::o;3354:90::-;3388:7;3431:5;3424:13;3417:21;3406:32;;3354:90;;;:::o;3450:109::-;3531:21;3546:5;3531:21;:::i;:::-;3526:3;3519:34;3450:109;;:::o;3565:210::-;3652:4;3690:2;3679:9;3675:18;3667:26;;3703:65;3765:1;3754:9;3750:17;3741:6;3703:65;:::i;:::-;3565:210;;;;:::o;3781:116::-;3851:21;3866:5;3851:21;:::i;:::-;3844:5;3841:32;3831:60;;3887:1;3884;3877:12;3831:60;3781:116;:::o;3903:133::-;3946:5;3984:6;3971:20;3962:29;;4000:30;4024:5;4000:30;:::i;:::-;3903:133;;;;:::o;4042:468::-;4107:6;4115;4164:2;4152:9;4143:7;4139:23;4135:32;4132:119;;;4170:79;;:::i;:::-;4132:119;4290:1;4315:53;4360:7;4351:6;4340:9;4336:22;4315:53;:::i;:::-;4305:63;;4261:117;4417:2;4443:50;4485:7;4476:6;4465:9;4461:22;4443:50;:::i;:::-;4433:60;;4388:115;4042:468;;;;;:::o;4516:118::-;4603:24;4621:5;4603:24;:::i;:::-;4598:3;4591:37;4516:118;;:::o;4640:222::-;4733:4;4771:2;4760:9;4756:18;4748:26;;4784:71;4852:1;4841:9;4837:17;4828:6;4784:71;:::i;:::-;4640:222;;;;:::o;4868:329::-;4927:6;4976:2;4964:9;4955:7;4951:23;4947:32;4944:119;;;4982:79;;:::i;:::-;4944:119;5102:1;5127:53;5172:7;5163:6;5152:9;5148:22;5127:53;:::i;:::-;5117:63;;5073:117;4868:329;;;;:::o;5203:619::-;5280:6;5288;5296;5345:2;5333:9;5324:7;5320:23;5316:32;5313:119;;;5351:79;;:::i;:::-;5313:119;5471:1;5496:53;5541:7;5532:6;5521:9;5517:22;5496:53;:::i;:::-;5486:63;;5442:117;5598:2;5624:53;5669:7;5660:6;5649:9;5645:22;5624:53;:::i;:::-;5614:63;;5569:118;5726:2;5752:53;5797:7;5788:6;5777:9;5773:22;5752:53;:::i;:::-;5742:63;;5697:118;5203:619;;;;;:::o;5828:86::-;5863:7;5903:4;5896:5;5892:16;5881:27;;5828:86;;;:::o;5920:112::-;6003:22;6019:5;6003:22;:::i;:::-;5998:3;5991:35;5920:112;;:::o;6038:214::-;6127:4;6165:2;6154:9;6150:18;6142:26;;6178:67;6242:1;6231:9;6227:17;6218:6;6178:67;:::i;:::-;6038:214;;;;:::o;6258:60::-;6286:3;6307:5;6300:12;;6258:60;;;:::o;6324:142::-;6374:9;6407:53;6425:34;6434:24;6452:5;6434:24;:::i;:::-;6425:34;:::i;:::-;6407:53;:::i;:::-;6394:66;;6324:142;;;:::o;6472:126::-;6522:9;6555:37;6586:5;6555:37;:::i;:::-;6542:50;;6472:126;;;:::o;6604:149::-;6677:9;6710:37;6741:5;6710:37;:::i;:::-;6697:50;;6604:149;;;:::o;6759:177::-;6869:60;6923:5;6869:60;:::i;:::-;6864:3;6857:73;6759:177;;:::o;6942:268::-;7058:4;7096:2;7085:9;7081:18;7073:26;;7109:94;7200:1;7189:9;7185:17;7176:6;7109:94;:::i;:::-;6942:268;;;;:::o;7216:118::-;7303:24;7321:5;7303:24;:::i;:::-;7298:3;7291:37;7216:118;;:::o;7340:222::-;7433:4;7471:2;7460:9;7456:18;7448:26;;7484:71;7552:1;7541:9;7537:17;7528:6;7484:71;:::i;:::-;7340:222;;;;:::o;7568:77::-;7605:7;7634:5;7623:16;;7568:77;;;:::o;7651:122::-;7724:24;7742:5;7724:24;:::i;:::-;7717:5;7714:35;7704:63;;7763:1;7760;7753:12;7704:63;7651:122;:::o;7779:139::-;7825:5;7863:6;7850:20;7841:29;;7879:33;7906:5;7879:33;:::i;:::-;7779:139;;;;:::o;7924:474::-;7992:6;8000;8049:2;8037:9;8028:7;8024:23;8020:32;8017:119;;;8055:79;;:::i;:::-;8017:119;8175:1;8200:53;8245:7;8236:6;8225:9;8221:22;8200:53;:::i;:::-;8190:63;;8146:117;8302:2;8328:53;8373:7;8364:6;8353:9;8349:22;8328:53;:::i;:::-;8318:63;;8273:118;7924:474;;;;;:::o;8404:117::-;8513:1;8510;8503:12;8527:117;8636:1;8633;8626:12;8650:117;8759:1;8756;8749:12;8790:568;8863:8;8873:6;8923:3;8916:4;8908:6;8904:17;8900:27;8890:122;;8931:79;;:::i;:::-;8890:122;9044:6;9031:20;9021:30;;9074:18;9066:6;9063:30;9060:117;;;9096:79;;:::i;:::-;9060:117;9210:4;9202:6;9198:17;9186:29;;9264:3;9256:4;9248:6;9244:17;9234:8;9230:32;9227:41;9224:128;;;9271:79;;:::i;:::-;9224:128;8790:568;;;;;:::o;9364:559::-;9450:6;9458;9507:2;9495:9;9486:7;9482:23;9478:32;9475:119;;;9513:79;;:::i;:::-;9475:119;9661:1;9650:9;9646:17;9633:31;9691:18;9683:6;9680:30;9677:117;;;9713:79;;:::i;:::-;9677:117;9826:80;9898:7;9889:6;9878:9;9874:22;9826:80;:::i;:::-;9808:98;;;;9604:312;9364:559;;;;;:::o;9929:117::-;10038:1;10035;10028:12;10052:180;10100:77;10097:1;10090:88;10197:4;10194:1;10187:15;10221:4;10218:1;10211:15;10238:281;10321:27;10343:4;10321:27;:::i;:::-;10313:6;10309:40;10451:6;10439:10;10436:22;10415:18;10403:10;10400:34;10397:62;10394:88;;;10462:18;;:::i;:::-;10394:88;10502:10;10498:2;10491:22;10281:238;10238:281;;:::o;10525:129::-;10559:6;10586:20;;:::i;:::-;10576:30;;10615:33;10643:4;10635:6;10615:33;:::i;:::-;10525:129;;;:::o;10660:307::-;10721:4;10811:18;10803:6;10800:30;10797:56;;;10833:18;;:::i;:::-;10797:56;10871:29;10893:6;10871:29;:::i;:::-;10863:37;;10955:4;10949;10945:15;10937:23;;10660:307;;;:::o;10973:146::-;11070:6;11065:3;11060;11047:30;11111:1;11102:6;11097:3;11093:16;11086:27;10973:146;;;:::o;11125:423::-;11202:5;11227:65;11243:48;11284:6;11243:48;:::i;:::-;11227:65;:::i;:::-;11218:74;;11315:6;11308:5;11301:21;11353:4;11346:5;11342:16;11391:3;11382:6;11377:3;11373:16;11370:25;11367:112;;;11398:79;;:::i;:::-;11367:112;11488:54;11535:6;11530:3;11525;11488:54;:::i;:::-;11208:340;11125:423;;;;;:::o;11567:338::-;11622:5;11671:3;11664:4;11656:6;11652:17;11648:27;11638:122;;11679:79;;:::i;:::-;11638:122;11796:6;11783:20;11821:78;11895:3;11887:6;11880:4;11872:6;11868:17;11821:78;:::i;:::-;11812:87;;11628:277;11567:338;;;;:::o;11911:507::-;11979:6;12028:2;12016:9;12007:7;12003:23;11999:32;11996:119;;;12034:79;;:::i;:::-;11996:119;12182:1;12171:9;12167:17;12154:31;12212:18;12204:6;12201:30;12198:117;;;12234:79;;:::i;:::-;12198:117;12339:62;12393:7;12384:6;12373:9;12369:22;12339:62;:::i;:::-;12329:72;;12125:286;11911:507;;;;:::o;12424:104::-;12469:7;12498:24;12516:5;12498:24;:::i;:::-;12487:35;;12424:104;;;:::o;12534:142::-;12637:32;12663:5;12637:32;:::i;:::-;12632:3;12625:45;12534:142;;:::o;12682:254::-;12791:4;12829:2;12818:9;12814:18;12806:26;;12842:87;12926:1;12915:9;12911:17;12902:6;12842:87;:::i;:::-;12682:254;;;;:::o;12942:442::-;13091:4;13129:2;13118:9;13114:18;13106:26;;13142:71;13210:1;13199:9;13195:17;13186:6;13142:71;:::i;:::-;13223:72;13291:2;13280:9;13276:18;13267:6;13223:72;:::i;:::-;13305;13373:2;13362:9;13358:18;13349:6;13305:72;:::i;:::-;12942:442;;;;;;:::o;13390:474::-;13458:6;13466;13515:2;13503:9;13494:7;13490:23;13486:32;13483:119;;;13521:79;;:::i;:::-;13483:119;13641:1;13666:53;13711:7;13702:6;13691:9;13687:22;13666:53;:::i;:::-;13656:63;;13612:117;13768:2;13794:53;13839:7;13830:6;13819:9;13815:22;13794:53;:::i;:::-;13784:63;;13739:118;13390:474;;;;;:::o;13870:153::-;13947:9;13980:37;14011:5;13980:37;:::i;:::-;13967:50;;13870:153;;;:::o;14029:185::-;14143:64;14201:5;14143:64;:::i;:::-;14138:3;14131:77;14029:185;;:::o;14220:276::-;14340:4;14378:2;14367:9;14363:18;14355:26;;14391:98;14486:1;14475:9;14471:17;14462:6;14391:98;:::i;:::-;14220:276;;;;:::o;14502:180::-;14550:77;14547:1;14540:88;14647:4;14644:1;14637:15;14671:4;14668:1;14661:15;14688:320;14732:6;14769:1;14763:4;14759:12;14749:22;;14816:1;14810:4;14806:12;14837:18;14827:81;;14893:4;14885:6;14881:17;14871:27;;14827:81;14955:2;14947:6;14944:14;14924:18;14921:38;14918:84;;14974:18;;:::i;:::-;14918:84;14739:269;14688:320;;;:::o;15014:174::-;15154:26;15150:1;15142:6;15138:14;15131:50;15014:174;:::o;15194:366::-;15336:3;15357:67;15421:2;15416:3;15357:67;:::i;:::-;15350:74;;15433:93;15522:3;15433:93;:::i;:::-;15551:2;15546:3;15542:12;15535:19;;15194:366;;;:::o;15566:419::-;15732:4;15770:2;15759:9;15755:18;15747:26;;15819:9;15813:4;15809:20;15805:1;15794:9;15790:17;15783:47;15847:131;15973:4;15847:131;:::i;:::-;15839:139;;15566:419;;;:::o;15991:442::-;16140:4;16178:2;16167:9;16163:18;16155:26;;16191:71;16259:1;16248:9;16244:17;16235:6;16191:71;:::i;:::-;16272:72;16340:2;16329:9;16325:18;16316:6;16272:72;:::i;:::-;16354;16422:2;16411:9;16407:18;16398:6;16354:72;:::i;:::-;15991:442;;;;;;:::o;16439:172::-;16579:24;16575:1;16567:6;16563:14;16556:48;16439:172;:::o;16617:366::-;16759:3;16780:67;16844:2;16839:3;16780:67;:::i;:::-;16773:74;;16856:93;16945:3;16856:93;:::i;:::-;16974:2;16969:3;16965:12;16958:19;;16617:366;;;:::o;16989:419::-;17155:4;17193:2;17182:9;17178:18;17170:26;;17242:9;17236:4;17232:20;17228:1;17217:9;17213:17;17206:47;17270:131;17396:4;17270:131;:::i;:::-;17262:139;;16989:419;;;:::o;17414:168::-;17554:20;17550:1;17542:6;17538:14;17531:44;17414:168;:::o;17588:366::-;17730:3;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17588:366;;;:::o;17960:419::-;18126:4;18164:2;18153:9;18149:18;18141:26;;18213:9;18207:4;18203:20;18199:1;18188:9;18184:17;18177:47;18241:131;18367:4;18241:131;:::i;:::-;18233:139;;17960:419;;;:::o;18385:553::-;18562:4;18600:3;18589:9;18585:19;18577:27;;18614:71;18682:1;18671:9;18667:17;18658:6;18614:71;:::i;:::-;18695:72;18763:2;18752:9;18748:18;18739:6;18695:72;:::i;:::-;18777;18845:2;18834:9;18830:18;18821:6;18777:72;:::i;:::-;18859;18927:2;18916:9;18912:18;18903:6;18859:72;:::i;:::-;18385:553;;;;;;;:::o;18944:228::-;19084:34;19080:1;19072:6;19068:14;19061:58;19153:11;19148:2;19140:6;19136:15;19129:36;18944:228;:::o;19178:366::-;19320:3;19341:67;19405:2;19400:3;19341:67;:::i;:::-;19334:74;;19417:93;19506:3;19417:93;:::i;:::-;19535:2;19530:3;19526:12;19519:19;;19178:366;;;:::o;19550:419::-;19716:4;19754:2;19743:9;19739:18;19731:26;;19803:9;19797:4;19793:20;19789:1;19778:9;19774:17;19767:47;19831:131;19957:4;19831:131;:::i;:::-;19823:139;;19550:419;;;:::o;19975:180::-;20023:77;20020:1;20013:88;20120:4;20117:1;20110:15;20144:4;20141:1;20134:15;20161:194;20201:4;20221:20;20239:1;20221:20;:::i;:::-;20216:25;;20255:20;20273:1;20255:20;:::i;:::-;20250:25;;20299:1;20296;20292:9;20284:17;;20323:1;20317:4;20314:11;20311:37;;;20328:18;;:::i;:::-;20311:37;20161:194;;;;:::o;20361:180::-;20501:32;20497:1;20489:6;20485:14;20478:56;20361:180;:::o;20547:366::-;20689:3;20710:67;20774:2;20769:3;20710:67;:::i;:::-;20703:74;;20786:93;20875:3;20786:93;:::i;:::-;20904:2;20899:3;20895:12;20888:19;;20547:366;;;:::o;20919:419::-;21085:4;21123:2;21112:9;21108:18;21100:26;;21172:9;21166:4;21162:20;21158:1;21147:9;21143:17;21136:47;21200:131;21326:4;21200:131;:::i;:::-;21192:139;;20919:419;;;:::o;21344:181::-;21484:33;21480:1;21472:6;21468:14;21461:57;21344:181;:::o;21531:366::-;21673:3;21694:67;21758:2;21753:3;21694:67;:::i;:::-;21687:74;;21770:93;21859:3;21770:93;:::i;:::-;21888:2;21883:3;21879:12;21872:19;;21531:366;;;:::o;21903:419::-;22069:4;22107:2;22096:9;22092:18;22084:26;;22156:9;22150:4;22146:20;22142:1;22131:9;22127:17;22120:47;22184:131;22310:4;22184:131;:::i;:::-;22176:139;;21903:419;;;:::o;22328:191::-;22368:3;22387:20;22405:1;22387:20;:::i;:::-;22382:25;;22421:20;22439:1;22421:20;:::i;:::-;22416:25;;22464:1;22461;22457:9;22450:16;;22485:3;22482:1;22479:10;22476:36;;;22492:18;;:::i;:::-;22476:36;22328:191;;;;:::o;22525:173::-;22665:25;22661:1;22653:6;22649:14;22642:49;22525:173;:::o;22704:366::-;22846:3;22867:67;22931:2;22926:3;22867:67;:::i;:::-;22860:74;;22943:93;23032:3;22943:93;:::i;:::-;23061:2;23056:3;23052:12;23045:19;;22704:366;;;:::o;23076:419::-;23242:4;23280:2;23269:9;23265:18;23257:26;;23329:9;23323:4;23319:20;23315:1;23304:9;23300:17;23293:47;23357:131;23483:4;23357:131;:::i;:::-;23349:139;;23076:419;;;:::o;23501:177::-;23641:29;23637:1;23629:6;23625:14;23618:53;23501:177;:::o;23684:366::-;23826:3;23847:67;23911:2;23906:3;23847:67;:::i;:::-;23840:74;;23923:93;24012:3;23923:93;:::i;:::-;24041:2;24036:3;24032:12;24025:19;;23684:366;;;:::o;24056:419::-;24222:4;24260:2;24249:9;24245:18;24237:26;;24309:9;24303:4;24299:20;24295:1;24284:9;24280:17;24273:47;24337:131;24463:4;24337:131;:::i;:::-;24329:139;;24056:419;;;:::o;24481:174::-;24621:26;24617:1;24609:6;24605:14;24598:50;24481:174;:::o;24661:366::-;24803:3;24824:67;24888:2;24883:3;24824:67;:::i;:::-;24817:74;;24900:93;24989:3;24900:93;:::i;:::-;25018:2;25013:3;25009:12;25002:19;;24661:366;;;:::o;25033:419::-;25199:4;25237:2;25226:9;25222:18;25214:26;;25286:9;25280:4;25276:20;25272:1;25261:9;25257:17;25250:47;25314:131;25440:4;25314:131;:::i;:::-;25306:139;;25033:419;;;:::o;25458:180::-;25506:77;25503:1;25496:88;25603:4;25600:1;25593:15;25627:4;25624:1;25617:15;25644:185;25684:1;25701:20;25719:1;25701:20;:::i;:::-;25696:25;;25735:20;25753:1;25735:20;:::i;:::-;25730:25;;25774:1;25764:35;;25779:18;;:::i;:::-;25764:35;25821:1;25818;25814:9;25809:14;;25644:185;;;;:::o;25835:165::-;25975:17;25971:1;25963:6;25959:14;25952:41;25835:165;:::o;26006:366::-;26148:3;26169:67;26233:2;26228:3;26169:67;:::i;:::-;26162:74;;26245:93;26334:3;26245:93;:::i;:::-;26363:2;26358:3;26354:12;26347:19;;26006:366;;;:::o;26378:419::-;26544:4;26582:2;26571:9;26567:18;26559:26;;26631:9;26625:4;26621:20;26617:1;26606:9;26602:17;26595:47;26659:131;26785:4;26659:131;:::i;:::-;26651:139;;26378:419;;;:::o;26803:174::-;26943:26;26939:1;26931:6;26927:14;26920:50;26803:174;:::o;26983:366::-;27125:3;27146:67;27210:2;27205:3;27146:67;:::i;:::-;27139:74;;27222:93;27311:3;27222:93;:::i;:::-;27340:2;27335:3;27331:12;27324:19;;26983:366;;;:::o;27355:419::-;27521:4;27559:2;27548:9;27544:18;27536:26;;27608:9;27602:4;27598:20;27594:1;27583:9;27579:17;27572:47;27636:131;27762:4;27636:131;:::i;:::-;27628:139;;27355:419;;;:::o;27780:418::-;27917:4;27955:2;27944:9;27940:18;27932:26;;27968:71;28036:1;28025:9;28021:17;28012:6;27968:71;:::i;:::-;28049:66;28111:2;28100:9;28096:18;28087:6;28049:66;:::i;:::-;28125;28187:2;28176:9;28172:18;28163:6;28125:66;:::i;:::-;27780:418;;;;;;:::o;28204:180::-;28344:32;28340:1;28332:6;28328:14;28321:56;28204:180;:::o;28390:366::-;28532:3;28553:67;28617:2;28612:3;28553:67;:::i;:::-;28546:74;;28629:93;28718:3;28629:93;:::i;:::-;28747:2;28742:3;28738:12;28731:19;;28390:366;;;:::o;28762:419::-;28928:4;28966:2;28955:9;28951:18;28943:26;;29015:9;29009:4;29005:20;29001:1;28990:9;28986:17;28979:47;29043:131;29169:4;29043:131;:::i;:::-;29035:139;;28762:419;;;:::o;29187:173::-;29327:25;29323:1;29315:6;29311:14;29304:49;29187:173;:::o;29366:366::-;29508:3;29529:67;29593:2;29588:3;29529:67;:::i;:::-;29522:74;;29605:93;29694:3;29605:93;:::i;:::-;29723:2;29718:3;29714:12;29707:19;;29366:366;;;:::o;29738:419::-;29904:4;29942:2;29931:9;29927:18;29919:26;;29991:9;29985:4;29981:20;29977:1;29966:9;29962:17;29955:47;30019:131;30145:4;30019:131;:::i;:::-;30011:139;;29738:419;;;:::o;30163:180::-;30211:77;30208:1;30201:88;30308:4;30305:1;30298:15;30332:4;30329:1;30322:15;30349:233;30388:3;30411:24;30429:5;30411:24;:::i;:::-;30402:33;;30457:66;30450:5;30447:77;30444:103;;30527:18;;:::i;:::-;30444:103;30574:1;30567:5;30563:13;30556:20;;30349:233;;;:::o;30588:225::-;30728:34;30724:1;30716:6;30712:14;30705:58;30797:8;30792:2;30784:6;30780:15;30773:33;30588:225;:::o;30819:366::-;30961:3;30982:67;31046:2;31041:3;30982:67;:::i;:::-;30975:74;;31058:93;31147:3;31058:93;:::i;:::-;31176:2;31171:3;31167:12;31160:19;;30819:366;;;:::o;31191:419::-;31357:4;31395:2;31384:9;31380:18;31372:26;;31444:9;31438:4;31434:20;31430:1;31419:9;31415:17;31408:47;31472:131;31598:4;31472:131;:::i;:::-;31464:139;;31191:419;;;:::o;31616:178::-;31756:30;31752:1;31744:6;31740:14;31733:54;31616:178;:::o;31800:366::-;31942:3;31963:67;32027:2;32022:3;31963:67;:::i;:::-;31956:74;;32039:93;32128:3;32039:93;:::i;:::-;32157:2;32152:3;32148:12;32141:19;;31800:366;;;:::o;32172:419::-;32338:4;32376:2;32365:9;32361:18;32353:26;;32425:9;32419:4;32415:20;32411:1;32400:9;32396:17;32389:47;32453:131;32579:4;32453:131;:::i;:::-;32445:139;;32172:419;;;:::o;32597:179::-;32737:31;32733:1;32725:6;32721:14;32714:55;32597:179;:::o;32782:366::-;32924:3;32945:67;33009:2;33004:3;32945:67;:::i;:::-;32938:74;;33021:93;33110:3;33021:93;:::i;:::-;33139:2;33134:3;33130:12;33123:19;;32782:366;;;:::o;33154:419::-;33320:4;33358:2;33347:9;33343:18;33335:26;;33407:9;33401:4;33397:20;33393:1;33382:9;33378:17;33371:47;33435:131;33561:4;33435:131;:::i;:::-;33427:139;;33154:419;;;:::o;33579:175::-;33719:27;33715:1;33707:6;33703:14;33696:51;33579:175;:::o;33760:366::-;33902:3;33923:67;33987:2;33982:3;33923:67;:::i;:::-;33916:74;;33999:93;34088:3;33999:93;:::i;:::-;34117:2;34112:3;34108:12;34101:19;;33760:366;;;:::o;34132:419::-;34298:4;34336:2;34325:9;34321:18;34313:26;;34385:9;34379:4;34375:20;34371:1;34360:9;34356:17;34349:47;34413:131;34539:4;34413:131;:::i;:::-;34405:139;;34132:419;;;:::o;34557:169::-;34697:21;34693:1;34685:6;34681:14;34674:45;34557:169;:::o;34732:366::-;34874:3;34895:67;34959:2;34954:3;34895:67;:::i;:::-;34888:74;;34971:93;35060:3;34971:93;:::i;:::-;35089:2;35084:3;35080:12;35073:19;;34732:366;;;:::o;35104:419::-;35270:4;35308:2;35297:9;35293:18;35285:26;;35357:9;35351:4;35347:20;35343:1;35332:9;35328:17;35321:47;35385:131;35511:4;35385:131;:::i;:::-;35377:139;;35104:419;;;:::o;35529:182::-;35669:34;35665:1;35657:6;35653:14;35646:58;35529:182;:::o;35717:366::-;35859:3;35880:67;35944:2;35939:3;35880:67;:::i;:::-;35873:74;;35956:93;36045:3;35956:93;:::i;:::-;36074:2;36069:3;36065:12;36058:19;;35717:366;;;:::o;36089:419::-;36255:4;36293:2;36282:9;36278:18;36270:26;;36342:9;36336:4;36332:20;36328:1;36317:9;36313:17;36306:47;36370:131;36496:4;36370:131;:::i;:::-;36362:139;;36089:419;;;:::o;36514:178::-;36654:30;36650:1;36642:6;36638:14;36631:54;36514:178;:::o;36698:366::-;36840:3;36861:67;36925:2;36920:3;36861:67;:::i;:::-;36854:74;;36937:93;37026:3;36937:93;:::i;:::-;37055:2;37050:3;37046:12;37039:19;;36698:366;;;:::o;37070:419::-;37236:4;37274:2;37263:9;37259:18;37251:26;;37323:9;37317:4;37313:20;37309:1;37298:9;37294:17;37287:47;37351:131;37477:4;37351:131;:::i;:::-;37343:139;;37070:419;;;:::o;37495:225::-;37635:34;37631:1;37623:6;37619:14;37612:58;37704:8;37699:2;37691:6;37687:15;37680:33;37495:225;:::o;37726:366::-;37868:3;37889:67;37953:2;37948:3;37889:67;:::i;:::-;37882:74;;37965:93;38054:3;37965:93;:::i;:::-;38083:2;38078:3;38074:12;38067:19;;37726:366;;;:::o;38098:419::-;38264:4;38302:2;38291:9;38287:18;38279:26;;38351:9;38345:4;38341:20;38337:1;38326:9;38322:17;38315:47;38379:131;38505:4;38379:131;:::i;:::-;38371:139;;38098:419;;;:::o;38523:182::-;38663:34;38659:1;38651:6;38647:14;38640:58;38523:182;:::o;38711:366::-;38853:3;38874:67;38938:2;38933:3;38874:67;:::i;:::-;38867:74;;38950:93;39039:3;38950:93;:::i;:::-;39068:2;39063:3;39059:12;39052:19;;38711:366;;;:::o;39083:419::-;39249:4;39287:2;39276:9;39272:18;39264:26;;39336:9;39330:4;39326:20;39322:1;39311:9;39307:17;39300:47;39364:131;39490:4;39364:131;:::i;:::-;39356:139;;39083:419;;;:::o;39508:410::-;39548:7;39571:20;39589:1;39571:20;:::i;:::-;39566:25;;39605:20;39623:1;39605:20;:::i;:::-;39600:25;;39660:1;39657;39653:9;39682:30;39700:11;39682:30;:::i;:::-;39671:41;;39861:1;39852:7;39848:15;39845:1;39842:22;39822:1;39815:9;39795:83;39772:139;;39891:18;;:::i;:::-;39772:139;39556:362;39508:410;;;;:::o;39924:332::-;40045:4;40083:2;40072:9;40068:18;40060:26;;40096:71;40164:1;40153:9;40149:17;40140:6;40096:71;:::i;:::-;40177:72;40245:2;40234:9;40230:18;40221:6;40177:72;:::i;:::-;39924:332;;;;;:::o;40262:85::-;40307:7;40336:5;40325:16;;40262:85;;;:::o;40353:158::-;40411:9;40444:61;40462:42;40471:32;40497:5;40471:32;:::i;:::-;40462:42;:::i;:::-;40444:61;:::i;:::-;40431:74;;40353:158;;;:::o;40517:147::-;40612:45;40651:5;40612:45;:::i;:::-;40607:3;40600:58;40517:147;;:::o;40670:114::-;40737:6;40771:5;40765:12;40755:22;;40670:114;;;:::o;40790:184::-;40889:11;40923:6;40918:3;40911:19;40963:4;40958:3;40954:14;40939:29;;40790:184;;;;:::o;40980:132::-;41047:4;41070:3;41062:11;;41100:4;41095:3;41091:14;41083:22;;40980:132;;;:::o;41118:108::-;41195:24;41213:5;41195:24;:::i;:::-;41190:3;41183:37;41118:108;;:::o;41232:179::-;41301:10;41322:46;41364:3;41356:6;41322:46;:::i;:::-;41400:4;41395:3;41391:14;41377:28;;41232:179;;;;:::o;41417:113::-;41487:4;41519;41514:3;41510:14;41502:22;;41417:113;;;:::o;41566:732::-;41685:3;41714:54;41762:5;41714:54;:::i;:::-;41784:86;41863:6;41858:3;41784:86;:::i;:::-;41777:93;;41894:56;41944:5;41894:56;:::i;:::-;41973:7;42004:1;41989:284;42014:6;42011:1;42008:13;41989:284;;;42090:6;42084:13;42117:63;42176:3;42161:13;42117:63;:::i;:::-;42110:70;;42203:60;42256:6;42203:60;:::i;:::-;42193:70;;42049:224;42036:1;42033;42029:9;42024:14;;41989:284;;;41993:14;42289:3;42282:10;;41690:608;;;41566:732;;;;:::o;42304:134::-;42362:9;42395:37;42426:5;42395:37;:::i;:::-;42382:50;;42304:134;;;:::o;42444:147::-;42539:45;42578:5;42539:45;:::i;:::-;42534:3;42527:58;42444:147;;:::o;42597:847::-;42868:4;42906:3;42895:9;42891:19;42883:27;;42920:71;42988:1;42977:9;42973:17;42964:6;42920:71;:::i;:::-;43001:80;43077:2;43066:9;43062:18;43053:6;43001:80;:::i;:::-;43128:9;43122:4;43118:20;43113:2;43102:9;43098:18;43091:48;43156:108;43259:4;43250:6;43156:108;:::i;:::-;43148:116;;43274:80;43350:2;43339:9;43335:18;43326:6;43274:80;:::i;:::-;43364:73;43432:3;43421:9;43417:19;43408:6;43364:73;:::i;:::-;42597:847;;;;;;;;:::o;43450:225::-;43590:34;43586:1;43578:6;43574:14;43567:58;43659:8;43654:2;43646:6;43642:15;43635:33;43450:225;:::o;43681:366::-;43823:3;43844:67;43908:2;43903:3;43844:67;:::i;:::-;43837:74;;43920:93;44009:3;43920:93;:::i;:::-;44038:2;44033:3;44029:12;44022:19;;43681:366;;;:::o;44053:419::-;44219:4;44257:2;44246:9;44242:18;44234:26;;44306:9;44300:4;44296:20;44292:1;44281:9;44277:17;44270:47;44334:131;44460:4;44334:131;:::i;:::-;44326:139;;44053:419;;;:::o;44478:226::-;44618:34;44614:1;44606:6;44602:14;44595:58;44687:9;44682:2;44674:6;44670:15;44663:34;44478:226;:::o;44710:366::-;44852:3;44873:67;44937:2;44932:3;44873:67;:::i;:::-;44866:74;;44949:93;45038:3;44949:93;:::i;:::-;45067:2;45062:3;45058:12;45051:19;;44710:366;;;:::o;45082:419::-;45248:4;45286:2;45275:9;45271:18;45263:26;;45335:9;45329:4;45325:20;45321:1;45310:9;45306:17;45299:47;45363:131;45489:4;45363:131;:::i;:::-;45355:139;;45082:419;;;:::o

Swarm Source

ipfs://416b2d3ee07bbd75200b7a187eb286a4bbbe9f27e7fde39157299261ca31daf7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Fuxion Labs empowers users to explore Web3 by developing a platform that provides access to different DApp services.

Validator Index Block Amount
View All Withdrawals

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

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