Contract 0x47f21a0ec081df4c18a244a451b40f4773ed49ca 1

Contract Overview

Balance:
1.40277903472222265 HT

HT Value:
$12.10 (@ $8.63/HT)

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x5b742722dbc7e4e2ec7866e20d58945d7698717df59d5df4f3ee83a06942eec1Withdraw121194382022-01-27 2:59:061 min ago0x55441c6998f0806a12492a2ed9b5027aa7bf92a4 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.005298153752.25
0xbccd2c1289461f6218e9c01e5781527baf634c9b5a171ebc899fa143a04491ddWithdraw121194222022-01-27 2:58:182 mins ago0x87e28022fe7b747ce19a143957d9831f08b227be IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.005059568252.25
0xf8dab8665e5c9ee1178c9a5b350f91c321036bdf9434e5fd53c0ff3418668098Withdraw121194072022-01-27 2:57:332 mins ago0x861efc31d83a7193ad147db3835b9f9712a35f2e IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.006037026752.25
0x67e448406768132c55e053ef98e954e8354ac34463b3260b956077b75f59a24fDeposit121193842022-01-27 2:56:244 mins ago0xb2794f1a115eae8ae43f1c3dd21c5bf0945a419b IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0016524272.25
0x361a61a7eb2d6b51bd72d6365e9d8716e1aa5632219de2e8a6f49dcb7e2a07f2Withdraw121192552022-01-27 2:49:5710 mins ago0x47ba5f1a5308d30e40c9c0d6a37093f9fbe9f8f2 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.006532634252.25
0x2efb8aaa32938899e74fa1031755e3d9c57c8a7f607c4979d4d5a1c8dc1802d7Withdraw121192432022-01-27 2:49:2111 mins ago0x63a7e4e8c9404b30694e49d00487471c522da92d IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00660258452.25
0x244ca10985d2847449d863c4a0a3da6e4f289fc39e0f1e4bef2eadd67065594fDeposit121192292022-01-27 2:48:3911 mins ago0xcc1fb8c1318daf9d4000634b45b85bff3fe4add8 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0014289572.25
0x3c1999e92a84a513467314685aa05bbd122ce0e3f6c706825b89fa2581429556Withdraw121192172022-01-27 2:48:0312 mins ago0xcf541102d9e7ec2d980298be3255f73fdf2e0157 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00652095452.25
0x21216f8caad6552189b87c98291b32201ee1864ea14388518d14aea518fe5935Withdraw121192062022-01-27 2:47:3013 mins ago0xbe000de77aa9bae8da42cb6a6e867ff87b80a900 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00675804152.25
0x5b67fbd75cc67cb4c2919a3c50b78d75fa4f2df9740540756f2482232b3b4c59Withdraw121191942022-01-27 2:46:5413 mins ago0x80f95e62807871e0757d0c8ab4303019a6731f6d IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0062573222.25
0x38f5357f1993936b204c8137587c65b479b0b970fae84c899694f7ace15feea3Withdraw121191882022-01-27 2:46:3613 mins ago0xda1172f6a30f0328a61a8e464d0f670b6f9805d2 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00774421652.25
0x2f6e0594bafb330b221cacc614c51f54fa9faabc65e732802e200ba940b58537Withdraw121191792022-01-27 2:46:0914 mins ago0x6b937111f608ae86c221929411ad0279e746976a IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0062573222.25
0x3065a461f2dcf5a9d50ddc38eb9b7b82ab2bbb40a3f704d10b87b7a4f1b0b455Withdraw121191672022-01-27 2:45:3314 mins ago0x9db6e7db1b7574badfd4214ddeb7f019340ba98a IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0062573222.25
0xc4becc23c5287b351fbe5286ae66c4008a2dfc57bb6c635be33610f01e0165b4Deposit Redeem121191562022-01-27 2:45:0015 mins ago0x52b66261e3ff7d9d6c3e2b9a840d60b94c89e701 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.001315545752.25
0xd3bde6c327e19eb052738a5f75ff465aa5686fc0ed0200621db9999da848aaf7Withdraw121191552022-01-27 2:44:5715 mins ago0x841e497708744ce120f7b28231d7b0baae79a9e4 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0062573222.25
0x2d2b628ffddd24eb2f483dd46085ce95313798182d52bfc565bd80d307f00025Withdraw121191482022-01-27 2:44:3615 mins ago0x52b66261e3ff7d9d6c3e2b9a840d60b94c89e701 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.009773511752.25
0xcfff4487b9c042ffe5d815c8da458b92d8996f267f9a4bed72353c7716b14f4eWithdraw121191232022-01-27 2:43:2117 mins ago0x21796cee1fefab1b8462a5925c0999240d682513 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.004941303752.25
0x4a9ae5a4cf8ac81891e7df00b71b3f6159fe8c38c7fefb8ffdcd7cced287e859Deposit Redeem121191162022-01-27 2:43:0017 mins ago0x25cfa8e50de1f200d39547964cad06c5f515fc19 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.001449429752.25
0x25547fc2afdf4c6d11c3888c93cb580a8773ac7aa6b7dffe1305715d0074b5a8Withdraw121191082022-01-27 2:42:3617 mins ago0x25cfa8e50de1f200d39547964cad06c5f515fc19 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.009026601752.25
0x55c31703cef84d55542ce282e6c9a3c53d3c8ba2734f5243fd841cbbb6990f2fDeposit121191042022-01-27 2:42:2418 mins ago0x7629607da775ec41c1355b81b5a5d2162f278132 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.0017971112.25
0xa67612319e254482052ca85769f15131eb2a6f180e496d466df8be959f8d2b8dWithdraw121191002022-01-27 2:42:1218 mins ago0xec3e7e01bd2a8e74e90feb1f4918087d9dbea2d0 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.004917975752.25
0x916c3e0654927ac9230611b86c8bc30d655b5405b5304f489c6290a44c51697eWithdraw121190862022-01-27 2:41:3019 mins ago0x7629607da775ec41c1355b81b5a5d2162f278132 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00591744152.25
0xe43572e20ccefdd49b009c07a7d161d80a78fff567d5e404e62f5fce5cfc31f5Withdraw121190772022-01-27 2:41:0319 mins ago0x7076ffcea9709d4f6193586ce386e30b7769eff6 IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.004908269252.25
0x97e04fd6eeaad594849184b58e01964b054c8db13b882ad3b619dd349eca74cbWithdraw121190572022-01-27 2:40:0320 mins ago0x0c82678f9bb7b221dcf2f548db4b4f7d5c717dcb IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.004933532.25
0x3081d8380e68fb6d27fa73fe4e6359c1e5be087b8c1c68c186a56a71d3f7f535Withdraw121190432022-01-27 2:39:2121 mins ago0x2e4b5b24eab6069adc1d5a2b79bef14f318e6bfe IN  0x47f21a0ec081df4c18a244a451b40f4773ed49ca0 HT0.00606464552.25
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x4dbdd4ad574d62d0146baf4edc4f48ee3a77c9a9d71c8dd2b5c6b2a005188d8a51003912021-05-28 9:40:56243 days 17 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x427cc7001f1b0b0375634f9191aa3de1b934019c15.255792672453703676 HT
0xa4bb16e99d6fcd557107520e40f00b4e4f3b2867fb244f75cb9e773f97cccc0850924052021-05-28 3:01:36243 days 23 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x579b92feb428e5bd7eb637968d22c61e4b145fe515.192834973379629623 HT
0x78b0fc7b4cf0978035b089437082bdcd950c620c25715572dce1608ac1c6185550877632021-05-27 23:09:30244 days 3 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x5ab77a34e3b4b67410bc3b9fa91dae4147f7e74218.663062799768518516 HT
0x747b2a5eb4e450ecf11a467caab8232dff9e0f227a939b8e515f546c75af74fc50140142021-05-25 9:42:01246 days 17 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x187aba2ef2a1277274ef7ebd35b6fe9182c21e6116.67961725462962962 HT
0x95e672bf598ada0409b09d837d30458f4f64f001c53cc30aec0991ae258af4f350046512021-05-25 1:53:52247 days 1 hr ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x3caa623ad1f265490baa9c4246e41411363dbd0015.099033280092592581 HT
0x11d0ebcbe2726da9befb9f1f3253e266a879522d51d52ec4326aba80f3b3a7de49896832021-05-24 13:25:27247 days 13 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x5a849989211d7273277df208d75055eb7194dfb221.359297792824074071 HT
0x695114ffa2e28ea4e09a4e63397b9cec32352792ce0feab5b3daec557456fb3d49896792021-05-24 13:25:15247 days 13 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xb56002cfcc7b7bd9dd2b841d5590132852285b2815.376170443287037022 HT
0x926758eb57dd700638999184c98cf5ab702dd757406c4fde053fb1a08572cfc949896672021-05-24 13:24:39247 days 13 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xd1fb620decef88a6b1f75f1e895761d7b110b65318.546021255787037035 HT
0xfcff99f91897f4a0f6f5d6c2c60ecf151cfb5172663e447b58d114d77c7029ec49843692021-05-24 8:59:45247 days 18 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xa47cf2d52dbcca9c096c442fa6574bccec223d8c18.199506256944444442 HT
0x0f90eab34934fea68c4e647898b4c74a27cc455c5ebbd3c42f98dfc3a16fc41c49812922021-05-24 6:25:54247 days 20 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xfc109881403f1d92bf01f81ea0997dff3ef4dd4916.507571468749999978 HT
0xb9088ce048a220889b4ffc4d76c00b87d5ebeaac616407f7b5c8c09d6409add549751782021-05-24 1:20:12248 days 1 hr ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xe86b6c0beb692d7569183ed94ef0dbd21cbf16d015.429012729166666665 HT
0xa4583afca502ecfcd166424f23605d92d0601f6746c15669f11148b36c5ee7a349539532021-05-23 7:38:57248 days 19 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x78b36aa72bdb2c0b20ddbaf5703cbf54376a7fd316.625019552083333329 HT
0xa8e9da7f445c9dd44115bb7d3fedfa6b75e31b9400bcbd22ef1e4ccf27de9e7049530322021-05-23 6:52:54248 days 20 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xb1428cf134eff7f4b87f687356964fb20df3606815.774140732638888883 HT
0xa67425ae3f058b86190673a097ff71c3cfcef85f0ab40d4cec4bed4d84c9fa1648898122021-05-21 2:11:51251 days 48 mins ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x68cf7957baad593a9336eb08dd00bce977db1e1615.965931287037037029 HT
0x2763240c5bece7d8492fe5f00bf40961ec7fdce340aa5042306acb6acd8022ad48670422021-05-20 7:13:20251 days 19 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xa1e16b999cf73d7c63baced1b8520640ba6fa9fc15.583122133101851826 HT
0x07d116c2df6ac0e9ffd3f5da9dd4e66ca2370acbfc0d5abd785285cff7c557f748618722021-05-20 2:54:50252 days 5 mins ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x829d1009f1828fa2c1e8be410fb63607c401250a17.780703013888888886 HT
0x0f07b16cccfbbcbcca3fd5ab4231c017bb96d04ddab15807931fc1d639caa09f48323092021-05-19 2:16:37253 days 43 mins ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xed64f02f52ea06ffead9f2fc3f6cf6cc85aa6ee115.113624040509259247 HT
0xf1cc251d007c30b93c09aa17ccafece76aa6138d787d97497e40799548a12fe848271622021-05-18 21:59:16253 days 5 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x8d6aee28307c967d500cd12293087b4f6082317f15.315859784722222209 HT
0x99166751cd76e7fbece25b903933d6ed2b2fc89eae5358fade6811e54a1322e147809272021-05-17 7:27:30254 days 19 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xd3fc4836fa24e6c8869995447ab056772a6b611c15.620103733796296287 HT
0x60227cc52b00504f84da8043ad2fe4c805dd9ed8f748110a483f574c12a589b547725442021-05-17 0:28:21255 days 2 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x62ada2cb0e8bbf02c9abfcc7303aa383d12ff4fc15.381454850694444433 HT
0x7f961d7ca6ae24267534a833adca29a711c8d80ebb0505ea1da11ff4eebe290447300272021-05-15 13:02:29256 days 13 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x0999b9d381fa9a6c9ff85f99ab9602232e7636f517.161148953703703688 HT
0x88bf726d4fdd0cf8cdca92e780818cb8e6264a07be3597cac32da42b90233d4e46866702021-05-14 0:54:38258 days 2 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x62a9aa7a73949856be2462a90012c4f4e8a2330615.049759268518518444 HT
0x67e9fcaca8a910d37e048c2f50c6c349dcd075b93fa8ce616b6756daafb8299d46683632021-05-13 9:39:16258 days 17 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0xb797dd4d3d4aa2bf1920a4c410ff8d5301c40bc815.053062320601851849 HT
0x78fae52901a53a7e5539a2372d4d71a3029eb9c84d4815a01dde8c8a92c93ac946101502021-05-11 9:08:37260 days 17 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x0e343fa4d27d6bbf8e9df4f74e888b5d2dd9699415.119734605324074072 HT
0xf7fd5c6a806f34fa821bff871e76ce44faac80d0e1b346671fbad92a7fa47a8d46029872021-05-11 3:10:27260 days 23 hrs ago 0x47f21a0ec081df4c18a244a451b40f4773ed49ca0x7e144a2f20bd9629d4779d47cf7ea26de195a5da15.038071943287037037 HT
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OneCoinGlobal

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at hecoinfo.com on 2021-03-25
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.6.12;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    if (a == 0) {
      return 0;
    }
    c = a * b;
    assert(c / a == b);
    return c;
  }

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

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

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

contract Ownable {
  address public owner;

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


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

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

}

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

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view 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);
}

/*
* @dev Get the current price of HT/USD in a buyTokens function of a deployed solidity smart contract
*/
interface AggregatorInterface {
  function latestAnswer() external view returns (int256);
  function latestTimestamp() external view returns (uint256);
  function latestRound() external view returns (uint256);
  function getAnswer(uint256 roundId) external view returns (int256);
  function getTimestamp(uint256 roundId) external view returns (uint256);

  event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
  event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}


/*
* @title  1CC Global Financial System, build in Heco Network
* @dev    A financial system built on smart contract technology. Open to all, transparent to all.
*         The worlds first decentralized, community support fund
*/
contract OneCoinGlobal is Ownable {
    
    IERC20 public investToken;
    AggregatorInterface internal priceFeed;

    using SafeMath for uint256;

    struct PlayerDeposit {
        uint256 id;
        uint256 amount;
        uint256 total_withdraw;
        uint256 time;
        uint256 period;
        uint256 expire;
        uint8 status;
        uint8 is_crowd;
    }

    struct Player {
        address referral;
        uint8 is_crowd;
        uint256 level_id;
        uint256 dividends;
        uint256 eth_dividends;
        uint256 referral_bonus;
        uint256 match_bonus;
        uint256 holder_full_bonus;
        uint256 holder_single_bonus;
        uint256 total_invested;
        uint256 total_redeem;
        uint256 total_withdrawn;
        uint256 last_payout;
        PlayerDeposit[] deposits;
        address[] referrals;
    }
    
    struct PlayerTotal {
        uint256 total_match_invested;
        uint256 total_dividends;
        uint256 total_referral_bonus;
        uint256 total_match_bonus;
        uint256 total_holder_full_bonus;
        uint256 total_holder_single_bonus;
        uint256 total_eth_dividends;
    }
    
    /* Deposit smart contract address */
    address public invest_token_address = 0xFAd7161C74c809C213D88DAc021600D74F6c961c;
    /* Chainlink ETH/USD proxy address */
    address public HTUSD_proxy_address = 0x8EC213E7191488C7873cEC6daC8e97cdbAdb7B35;
    
    uint256 public invest_token_decimal = 4;
    uint256 public invest_eth_decimal = 8;
    
    uint256 public total_investors;
    uint256 public total_invested;
    uint256 public total_withdrawn;
    uint256 public total_redeem;
    uint256 public total_referral_bonus;
    uint256 public total_match_bonus;
    uint256 public total_dividends;
    uint256 public total_eth_dividends;
    uint256 public total_holder_full_bonus;
    uint256 public total_holder_single_bonus;
    uint256 public total_platform_bonus;
    
    /* Current corwded shareholder number */
    uint256 public total_crowded_num; 
    
    /* Total shareholder join limit number */
    uint256 constant public SHAREHOLDER_LIMIT_NUM = 30;
    
    /* Shareholder bonus rate */
    uint256 constant public shareholder_full_bonus_rate = 5;
    uint256 constant public shareholder_single_bonus_rate = 3;

    /* Referral bonuses data  define*/
    uint8[] public referral_bonuses = [10,8,6,4,2,1,1,1,1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
    
    /* Invest period and profit parameter definition */
    uint256[] public invest_period_months =      [1,   2,   3,    6,    12,   18];     //period months
    uint256[] public invest_period_month_rates = [800, 900, 1000, 1100, 1200, 1200];   //Ten thousand of month' rate
    
    /* yield reduce project section config, item1: total yield, item2: reduce rate */
    uint256[] public yield_reduce_section1 = [2000000, 30];
    uint256[] public yield_reduce_section2 = [5000000, 30];
    uint256[] public yield_reduce_section3 = [9000000, 30];
    
    /* Team level data definition */
    uint256[] public team_level_ids =     [1,2,3,4,5,6];
    uint256[] public team_level_amounts = [10000,30000,50000,100000,200000,500000];
    uint256[] public team_level_bonuses = [2,4,6,8,10,11];

    /* invest coin usd price */ 
    uint256 public invest_coin_usd_price = 1;
    
    /* invest reward eth rate ‰ */
    uint256 public invest_reward_eth_month_rate = 25;
    
    /* ETH min withdraw amount: 15 HT */
    uint256 public eth_min_withdraw_num = 15 * (10 ** 18);
    
    /* user invest min amount */
    uint256 constant public INVEST_MIN_AMOUNT = 100;
    /* user invest max amount */
    uint256 constant public INVEST_MAX_AMOUNT = 10000;
    /* user crowd limit amount */
    uint256 constant public CROWD_LIMIT_AMOUNT = 15000;
    /* user crowd period(month) */
    uint256 constant public crowd_period_month = 18;

    /* Platform bonus address */
    address public platform_bonus_address = 0xb42a4bed3C53a7aC9551670dF0AF36956c7b87F1;
    /* Platform bonus rate percent(%) */
    uint256 constant public platform_bonus_rate = 5;
    
    /* Mapping data list define */
    mapping(address => Player) public players;
    mapping(address => PlayerTotal) public playerTotals;
    mapping(uint256 => address) public addrmap;
    address[] public shareholders;
    
    event Deposit(address indexed addr, uint256 amount, uint256 month);
    event Withdraw(address indexed addr, uint256 amount);
    event ReferralPayout(address indexed addr, uint256 amount, uint8 level);
    event Crowd(address indexed addr, uint256 amount);
    event DepositRedeem(uint256 invest_id);

    constructor() public {
        
        /* Create invest token instace  */
        investToken = IERC20(invest_token_address);
        
        /* Create eth price feed in chainlink */
        priceFeed = AggregatorInterface(HTUSD_proxy_address);
        
    }
    
    /* Function to receive Ether. msg.data must be empty */
    receive() external payable {}

    /* Fallback function is called when msg.data is not empty */ 
    fallback() external payable {}

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
    
    /*
    * @dev user do deposit action,grant the referrs bonus,grant the shareholder bonus,grant the match bonus
    */
    function deposit(address _referral, uint256 _amount, uint256 _month) 
        external 
        payable 
    {

        require(_amount >= INVEST_MIN_AMOUNT, "Minimal deposit: 100 1CC");
        require(_amount <= INVEST_MAX_AMOUNT, "Maxinum deposit: 10000 1CC");
        //require(_amount % 100 == 0, "Invest amount must be multiple of 100");
        
        Player storage player = players[msg.sender];
        require(player.deposits.length < 2000, "Max 2000 deposits per address");
        
        /* format token amount  */
        uint256 token_decimals = 10 ** invest_token_decimal;
        uint256 token_amount = _amount * token_decimals;
        
        /* Transfer user address token to contract address*/
        require(investToken.transferFrom(msg.sender, address(this), token_amount), "transferFrom failed");

        _setReferral(msg.sender, _referral);
        
        /* update total investor count */
        if(player.deposits.length == 0){
            total_investors += 1;
            addrmap[total_investors] = msg.sender;
        }
        
        /* get the period total time (total secones) */
        uint256 period_time = _month * 30 * 86400;
        
        uint256 _id = player.deposits.length + 1;
        player.deposits.push(PlayerDeposit({
            id: _id,
            amount: _amount,
            total_withdraw: 0,
            time: uint256(block.timestamp),
            period: _month,
            expire:uint256(block.timestamp).add(period_time),
            status: 0,
            is_crowd: 0
        }));

        player.total_invested += _amount;
        total_invested += _amount;

        /* update user referral and match invested amount*/
        _updateReferralMatchInvestedAmount(msg.sender, _amount, 1);

        emit Deposit(msg.sender, _amount, _month);
    }
    
    
    /*
    * @dev user do crowd action, to join shareholder
    */
    function crowd(address _referral, uint256 _amount) 
        payable
        external 
    {

        require(_amount == CROWD_LIMIT_AMOUNT, "Crowd limit: 15000 1CC");
        require(total_crowded_num <= SHAREHOLDER_LIMIT_NUM, "Maximum shareholders: 30");
        
        Player storage player = players[msg.sender];
        require(player.is_crowd == 0, "Already a shareholder");
        
        /* format token amount  */
        uint256 token_amount = _getTokenAmount(_amount,invest_token_decimal);
        
        /* Transfer user address token to contract address*/
        require(investToken.transferFrom(msg.sender, address(this), token_amount), "transferFrom failed");

        _setReferral(msg.sender, _referral);
        
        /* get the period total time (total secones) */
        uint256 _month = crowd_period_month;
        uint256 period_time = _month.mul(30).mul(86400);
        
        /* update total investor count */
        if(player.deposits.length == 0){
            total_investors += 1;
            addrmap[total_investors] = msg.sender;
        }
        
        uint256 _id = player.deposits.length + 1;
        player.deposits.push(PlayerDeposit({
            id: _id,
            amount: _amount,
            total_withdraw: 0,
            time: uint256(block.timestamp),
            period: _month,
            expire: uint256(block.timestamp).add(period_time),
            status: 0,
            is_crowd: 1
        }));

        /* set the player of shareholders roles */
        player.is_crowd = 1;
        total_crowded_num += 1;
        
        /* push user to shareholder list*/
        shareholders.push(msg.sender);

        player.total_invested += _amount;
        total_invested += _amount;

        /* update user referral and match invested amount*/
        _updateReferralMatchInvestedAmount(msg.sender, _amount, 1);

        emit Crowd(msg.sender, _amount);
    }
    
    /*
    * @dev user do withdraw action, tranfer the total profit to user account, grant rereferral bonus, grant match bonus, grant shareholder bonus
    */
    function withdraw() 
        payable 
        external 
    {
        
        /* update user dividend data */
        _payout(msg.sender);
        
        Player storage player = players[msg.sender];

        uint256 _amount = player.dividends + player.referral_bonus + player.match_bonus + player.holder_full_bonus + player.holder_single_bonus;
        uint256 _eth_amount = player.eth_dividends;
        
        require(_amount > 0, "Insufficient balance");
        
        /* format deposit token amount  */
        uint256 token_amount = _amount;
        
        /* process token transfer action */
        require(investToken.approve(address(this), token_amount), "approve failed");
        require(investToken.transferFrom(address(this), msg.sender, token_amount), "transferFrom failed");
        
        /* eth dividends must greater than min withdraw num */
        if(_eth_amount >= eth_min_withdraw_num && address(this).balance >= _eth_amount){
            msg.sender.transfer(_eth_amount);
            playerTotals[msg.sender].total_eth_dividends += player.eth_dividends;
            total_eth_dividends += player.eth_dividends;
            player.eth_dividends = 0;
        }

        /* Grant referral bonus */
        _referralPayout(msg.sender, token_amount);
        
        /* Grant shareholder full node bonus */
        _shareHoldersFullNodePayout(token_amount);
        
        /* Grant shareholder single node bonus */
        _shareHoldersSingleNodePayout(msg.sender, token_amount);
        
        /* Grant team match bonus*/
        _matchPayout(msg.sender, token_amount);

        /* Update user total payout data */
        _updatePlayerTotalPayout(msg.sender, token_amount);
        
        emit Withdraw(msg.sender, token_amount);
    }
    
    
    /*
    * @dev user do deposit redeem action,transfer the expire deposit's amount to user account
    */
    function depositRedeem(uint256 _invest_id) 
        payable 
        external 
    {
        Player storage player = players[msg.sender];
        
        require(player.deposits.length >= _invest_id && _invest_id > 0, "Valid deposit id");
        uint256 _index = _invest_id - 1;
        require(player.deposits[_index].expire < block.timestamp, "Invest not expired");
        require(player.deposits[_index].status == 0, "Invest is redeemed");
        
        /* formt deposit token amount */
        uint256 _amount = player.deposits[_index].amount;
        uint256 token_amount = _getTokenAmount(_amount,invest_token_decimal);
        
        /* process token transfer action*/
        //require(investToken.approve(address(this), 0), "approve failed");
        require(investToken.approve(address(this), token_amount), "approve failed");
        require(investToken.transferFrom(address(this), msg.sender, token_amount), "transferFrom failed");
        
        /* update deposit status in redeem */
        player.deposits[_index].status = 1;

        /* user quit crowd, cancel the shareholders role */
        if(player.deposits[_index].is_crowd == 1){
            player.is_crowd = 0;
            total_crowded_num -= 1;
            
            /* remove user to shareholder list*/
            _removeShareholders(msg.sender);
        }

        /* update user token balance*/
        player.total_invested -= _amount;
        
        /* update total invested/redeem amount */
        total_invested -= _amount;
        total_redeem += _amount;
        
        /* update user referral and match invested amount*/
        _updateReferralMatchInvestedAmount(msg.sender, _amount, -1);

        emit DepositRedeem(_invest_id);
    }
     
    /*
    * @dev Update Referral Match invest amount, total investor number, map investor address index
    */
    function _updateReferralMatchInvestedAmount(address _addr,uint256 _amount,int8 op) 
        private
    {
        if(op > 0){
            playerTotals[_addr].total_match_invested += _amount;
            
            address ref = players[_addr].referral;
            while(true){
                if(ref == address(0)) break;
                
                playerTotals[ref].total_match_invested += _amount;
                ref = players[ref].referral;
            }
        }else{
            playerTotals[_addr].total_match_invested -= _amount;
            
            address ref = players[_addr].referral;
            while(true){
                if(ref == address(0)) break;
                
                playerTotals[ref].total_match_invested -= _amount;
                ref = players[ref].referral;
            }
        }
    }
    
    /*
    * @dev Update user total payout data
    */
    function _updatePlayerTotalPayout(address _addr,uint256 token_amount) 
        private
    {
        
        Player storage player = players[_addr];
        PlayerTotal storage playerTotal = playerTotals[_addr];
        
        /* update user Withdraw total amount*/
        player.total_withdrawn += token_amount;
        
        playerTotal.total_dividends += player.dividends;
        playerTotal.total_referral_bonus += player.referral_bonus;
        playerTotal.total_match_bonus += player.match_bonus;
        playerTotal.total_holder_full_bonus += player.holder_full_bonus;
        playerTotal.total_holder_single_bonus += player.holder_single_bonus;
        
        /* update platform total data*/
        total_withdrawn += token_amount;
        total_dividends += player.dividends;
        total_referral_bonus += player.referral_bonus;
        total_match_bonus += player.match_bonus;
        total_holder_full_bonus += player.holder_full_bonus;
        total_holder_single_bonus += player.holder_single_bonus; 
        uint256 _platform_bonus = (token_amount * platform_bonus_rate / 100);
        total_platform_bonus += _platform_bonus;
        
        /* update platform address bonus*/
        players[platform_bonus_address].match_bonus += _platform_bonus;
        
        /* reset user bonus data */
        player.dividends = 0;
        player.referral_bonus = 0;
        player.match_bonus = 0;
        player.holder_full_bonus = 0;
        player.holder_single_bonus = 0;
    }
    
    
    /*
    * @dev update user referral data
    */
    function _setReferral(address _addr, address _referral) 
        private 
    {
        /* if user referral is not set */
        if(players[_addr].referral == address(0) && _referral != _addr) {
            
            players[_addr].referral = _referral;

            /* update user referral address list*/
            players[_referral].referrals.push(_addr);
        }
    }
    
    
    /*
    * @dev Grant user referral bonus in user withdraw
    */
    function _referralPayout(address _addr, uint256 _amount) 
        private
    {
        address ref = players[_addr].referral;
        uint256 _day_payout = _payoutOfDay(_addr);
        if(_day_payout == 0) return;
        
        for(uint8 i = 0; i < referral_bonuses.length; i++) {
        
            if(ref == address(0)) break;

            uint256 _ref_day_payout = _payoutOfDay(ref);
            uint256 _token_amount = _amount;
            
            /* user bonus double burn */
            if(_ref_day_payout * 2 < _day_payout){
                _token_amount = _token_amount * (_ref_day_payout * 2) / _day_payout;
            }
            
            uint256 bonus = _token_amount * referral_bonuses[i] / 100;
            players[ref].referral_bonus += bonus;
            
            //emit ReferralPayout(ref, bonus, (i+1));
            
            ref = players[ref].referral;
        }
    }
    
    /*
    * @dev  Grant shareholder full node bonus in user withdraw
    */
    function _shareHoldersFullNodePayout(uint256 _amount)
        private
    {
        if(total_crowded_num == 0) return;
        
        uint256 bonus = _amount * shareholder_full_bonus_rate / 100 / total_crowded_num;
        for(uint8 i = 0; i < shareholders.length; i++) {
            address _addr = shareholders[i];
            players[_addr].holder_full_bonus += bonus;
        }
    }
    
    
    /*
    * @dev  Grant shareholder single node bonus in user withdraw
    */
    function _shareHoldersSingleNodePayout(address _addr,uint256 _amount)
        private
    {
        uint256 bonus = _amount * shareholder_single_bonus_rate / 100;
        address ref = players[_addr].referral;
        
        while(true){
            
            if(ref == address(0)) break;
            
            if(players[ref].is_crowd == 1){
                players[ref].holder_single_bonus += bonus;
                break;
            }
            ref = players[ref].referral;
        }
    }

    /*
    * @dev Grant Match bonus in user withdraw
    */
    function _matchPayout(address _addr,uint256 _amount) 
        private
    {
        /* update player team level */
        _upgradePlayerTeamLevel(_addr);
        uint256 last_level_id = players[_addr].level_id;
        
        /* player is max team level, quit */
        if(last_level_id == team_level_ids[team_level_ids.length-1]) return;
        
        address ref = players[_addr].referral;
        
        while(true){
            
            if(ref == address(0)) break;
            
            /* upgrade player team level id*/
            _upgradePlayerTeamLevel(ref);
            
            if(players[ref].level_id > last_level_id){
                
                uint256 last_level_bonus = 0;
                if(last_level_id > 0){
                    last_level_bonus = team_level_bonuses[last_level_id-1];
                }
                uint256 cur_level_bonus = team_level_bonuses[players[ref].level_id-1];
                uint256 bonus_amount = _amount * (cur_level_bonus - last_level_bonus) / 100;
                players[ref].match_bonus += bonus_amount;
                
                last_level_id = players[ref].level_id;
                
                /* referral is max team level, quit */
                if(last_level_id == team_level_ids[team_level_ids.length-1]) 
                    break;
            }
            ref = players[ref].referral;
        }
    }
    
    /*
    * @dev upgrade player team level id
    */    
    function _upgradePlayerTeamLevel(address _addr) 
        private
    {
        /* get community total invested*/
        uint256 community_total_invested = _getCommunityTotalInvested(_addr);
        
        uint256 level_id = 0;
        for(uint8 i=0; i < team_level_ids.length; i++){
            if(community_total_invested >= team_level_amounts[i]){
                level_id = team_level_ids[i];
            }
        }
        players[_addr].level_id = level_id;
    }
    
    /*
    * @dev Get community total invested
    */
    function _getCommunityTotalInvested(address _addr) 
        view
        private
        returns(uint256 value)
    {
        address[] memory referrals = players[_addr].referrals;
        
        uint256 nodes_max_invested = 0;
        uint256 nodes_total_invested = 0;
        for(uint256 i=0;i<referrals.length;i++){
            address ref = referrals[i];
            nodes_total_invested += playerTotals[ref].total_match_invested;
            if(playerTotals[ref].total_match_invested > nodes_max_invested){
                nodes_max_invested = playerTotals[ref].total_match_invested;
            }
        }
        return (nodes_total_invested - nodes_max_invested);
    }

    /*
    * @dev user withdraw, user devidends data update
    */
    function _payout(address _addr) 
        private 
    {
        uint256 payout = this.payoutOf(_addr);
        uint256 payout_eth = this.payoutEthOf(_addr);
        if(payout > 0) {
            
            _updateTotalPayout(_addr);
            
            players[_addr].last_payout = uint256(block.timestamp);
            players[_addr].dividends += payout;
            players[_addr].eth_dividends += payout_eth;
        }
    }
    
    /*
    * @dev format token amount with token decimal
    */
    function _getTokenAmount(uint256 _amount,uint256 _token_decimal) 
        pure
        private
        returns(uint256 token_amount)
    {
        uint256 token_decimals = 10 ** _token_decimal;
        token_amount = _amount * token_decimals;   
        return token_amount;
    }
    

    /*
    * @dev update user total withdraw data
    */
    function _updateTotalPayout(address _addr)
        private
    {
        Player storage player = players[_addr];

        for(uint256 i = 0; i < player.deposits.length; i++) {
            
            PlayerDeposit storage dep = player.deposits[i];

            uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            uint256 to = block.timestamp > dep.expire ? dep.expire : uint256(block.timestamp);

            if(from < to && dep.status == 0) {
                uint256 _day_payout = _getInvestDayPayoutOf(dep.amount,dep.period);
                player.deposits[i].total_withdraw += _day_payout * (to - from) / 86400;
            }
        }
    }
    
    /*
    * @dev get the invest period rate, if total yield reached reduce limit, invest day rate will be reduce
    */
    function _getInvestDayPayoutOf(uint256 _amount, uint256 _month) 
        view 
        private 
        returns(uint256 value)
    {
        /* get invest period base rate*/
        uint256 period_month_rate = invest_period_month_rates[0];
        
        for(uint256 i = 0; i < invest_period_months.length; i++) {
            if(invest_period_months[i] == _month){
                period_month_rate = invest_period_month_rates[i];
                break;
            }
        }
        
        /* format amount with token decimal */
        uint256 token_amount = _getTokenAmount(_amount, invest_token_decimal);
        value = token_amount * period_month_rate / 30 / 10000;
        
        if(value > 0){
            
            /* total yield reached 2,000,000,start first reduce */
            if(total_withdrawn >= _getTokenAmount(yield_reduce_section1[0], invest_token_decimal)){
                value = value * (100 - yield_reduce_section1[1]) / 100;
            }
            /* total yield reached 5,000,000,start second reduce */
            if(total_withdrawn >= _getTokenAmount(yield_reduce_section2[0], invest_token_decimal)){
                value = value * (100 - yield_reduce_section2[1]) / 100;
            }
            /* total yield reached 9,000,000,start third reduce */
            if(total_withdrawn >= _getTokenAmount(yield_reduce_section3[0], invest_token_decimal)){
                value = value * (100 - yield_reduce_section3[1]) / 100;
            }
        }
        return value;
    }
    
    /*
    * @dev get user deposit day total pending profit
    * @return user pending payout amount
    */
    function payoutOf(address _addr) 
        view 
        external 
        returns(uint256 value)
    {
        Player storage player = players[_addr];

        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];
            
            uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            uint256 to = block.timestamp > dep.expire ? dep.expire : uint256(block.timestamp);
            
            if(from < to && dep.status == 0) {
                uint256 _day_payout = _getInvestDayPayoutOf(dep.amount,dep.period);
                value += _day_payout * (to - from) / 86400;
            }
        }
        return value;
    }
    
    /*
    * @dev get user deposit day total pending eth profit
    * @return user pending payout eth amount
    */
    function payoutEthOf(address _addr) 
        view 
        external 
        returns(uint256 value)
    {
        Player storage player = players[_addr];
        uint256 ht_usd_price = getLatestPrice();
        
        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];
            
            uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            uint256 to = block.timestamp > dep.expire ? dep.expire : uint256(block.timestamp);
            
            if(from < to && dep.status == 0) {
                uint256 token_amount = _getTokenAmount(dep.amount, invest_token_decimal);
                uint256 _day_eth_payout = (token_amount * invest_reward_eth_month_rate / 1000 / 30) * (invest_coin_usd_price * (10**8)) / ht_usd_price * (10 ** (18 - invest_token_decimal));
                value += _day_eth_payout * (to - from) / 86400;
            }
        }
        return value;
    }

    /*
    * @dev get user deposit day total pending profit
    * @return user pending payout amount
    */
    function _payoutOfDay(address _addr) 
        view
        private 
        returns(uint256 value)
    {
        Player storage player = players[_addr];

        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];
            
            //uint256 from = player.last_payout > dep.time ? player.last_payout : dep.time;
            //uint256 to = block.timestamp > dep.expire ? dep.expire : uint256(block.timestamp);
            
            if(dep.status == 0) {
                uint256 _day_payout = _getInvestDayPayoutOf(dep.amount, dep.period);
                value += _day_payout;
            }
        }
        return value;
    }
    
  
    /*
    * @dev Remove shareholders of the special address
    */
    function _removeShareholders(address _addr) private {
        for (uint index = 0; index < shareholders.length; index++) {
            if(shareholders[index] == _addr){
                for (uint i = index; i < shareholders.length-1; i++) {
                    shareholders[i] = shareholders[i+1];
                }
                delete shareholders[shareholders.length-1];
                break;
            }
        }
    }
    

    /*
    * @dev get contract data info 
    * @return total invested,total investor number,total withdraw,total referral bonus
    */
    function contractInfo() 
        view 
        external 
        returns(uint256 _total_invested, uint256 _total_investors, uint256 _total_withdrawn, uint256 _total_dividends, uint256 _total_referral_bonus, uint256 _total_platform_bonus, uint256 _total_crowded_num,uint256[] memory _invest_periods,uint256 _crowd_limit_amount,uint256 _crowd_period_month,uint256 _eth_min_withdraw_num,uint256 _total_holder_bonus,uint256 _total_eth_dividends,uint256 _total_match_bonus) 
    {
        return (
            total_invested, 
            total_investors, 
            total_withdrawn, 
            total_dividends, 
            total_referral_bonus, 
            total_platform_bonus, 
            total_crowded_num, 
            invest_period_months, 
            CROWD_LIMIT_AMOUNT, 
            crowd_period_month,
            eth_min_withdraw_num,
            total_holder_full_bonus + total_holder_single_bonus,
            total_eth_dividends,
            total_match_bonus
        );
    }
    
    /*
    * @dev get user info
    * @return pending withdraw amount,referral,rreferral num etc.
    */
    function userInfo(address _addr)
        view 
        external 
        returns(address _referral, uint256 _referral_num, uint256 _is_crowd, uint256 _dividends, uint256 _eth_dividends, uint256 _referral_bonus, uint256 _match_bonus, uint256 _holder_single_bonus, uint256 _holder_full_bonus,uint256 _last_payout) 
    {
        Player storage player = players[_addr];
        return (
            player.referral,
            player.referrals.length,
            player.is_crowd,
            player.dividends,
            player.eth_dividends,
            player.referral_bonus,
            player.match_bonus,
            player.holder_single_bonus,
            player.holder_full_bonus,
            player.last_payout
        );
    }
    
    /*
    * @dev get user info
    * @return pending withdraw amount,referral bonus, total deposited, total withdrawn etc.
    */
    function userInfoTotals(address _addr) 
        view 
        external 
        returns(uint256 _total_invested, uint256 _total_withdrawn, uint256 _total_community_invested, uint256 _total_match_invested, uint256 _total_dividends, uint256 _total_referral_bonus, uint256 _total_match_bonus, uint256 _total_holder_full_bonus, uint256 _total_holder_single_bonus, uint256 _total_math_invested,uint256 _total_eth_dividends) 
    {
        Player storage player = players[_addr];
        PlayerTotal storage playerTotal = playerTotals[_addr];
        
        /* get community total invested*/
        uint256 total_community_invested = _getCommunityTotalInvested(_addr);
        
        return (
            player.total_invested,
            player.total_withdrawn,
            //player.total_redeem,
            total_community_invested,
            playerTotal.total_match_invested,
            playerTotal.total_dividends,
            playerTotal.total_referral_bonus,
            playerTotal.total_match_bonus,
            playerTotal.total_holder_full_bonus,
            playerTotal.total_holder_single_bonus,
            playerTotal.total_match_invested,
            playerTotal.total_eth_dividends
        );
    }
    
    /*
    * @dev get user investment list
    */
    function getInvestList(address _addr) 
        view 
        external 
        returns(uint256[] memory ids,uint256[] memory times, uint256[] memory amounts, uint256[] memory withdraws,uint256[] memory endTimes,uint256[] memory statuses) 
    {
        Player storage player = players[_addr];
        uint256[] memory _ids = new uint256[](player.deposits.length);
        uint256[] memory _times = new uint256[](player.deposits.length);
        uint256[] memory _endTimes = new uint256[](player.deposits.length);
        uint256[] memory _amounts = new uint256[](player.deposits.length);
        uint256[] memory _withdraws = new uint256[](player.deposits.length);
        uint256[] memory _statuses = new uint256[](player.deposits.length);
        for(uint256 i = 0; i < player.deposits.length; i++) {
            PlayerDeposit storage dep = player.deposits[i];
            _ids[i] = dep.id;
            _amounts[i] = dep.amount;
            _withdraws[i] = dep.total_withdraw;
            _times[i] = dep.time;
            _endTimes[i] = dep.expire;
            _statuses[i] = dep.status;
        }
        return (
            _ids,
            _times,
            _amounts,
            _withdraws,
            _endTimes,
            _statuses
        );
    }
    
    /**
     * @dev get the eth/usd lastest price
     * @return the eth/usd latest price, price decimal: 8
     */
    function getLatestPrice() 
        public 
        view 
        returns (uint256) 
    {
        int256 price= priceFeed.latestAnswer();
        return uint256(price);
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Crowd","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"month","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"invest_id","type":"uint256"}],"name":"DepositRedeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"}],"name":"ReferralPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"CROWD_LIMIT_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HTUSD_proxy_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVEST_MAX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVEST_MIN_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHAREHOLDER_LIMIT_NUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"addrmap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractInfo","outputs":[{"internalType":"uint256","name":"_total_invested","type":"uint256"},{"internalType":"uint256","name":"_total_investors","type":"uint256"},{"internalType":"uint256","name":"_total_withdrawn","type":"uint256"},{"internalType":"uint256","name":"_total_dividends","type":"uint256"},{"internalType":"uint256","name":"_total_referral_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_platform_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_crowded_num","type":"uint256"},{"internalType":"uint256[]","name":"_invest_periods","type":"uint256[]"},{"internalType":"uint256","name":"_crowd_limit_amount","type":"uint256"},{"internalType":"uint256","name":"_crowd_period_month","type":"uint256"},{"internalType":"uint256","name":"_eth_min_withdraw_num","type":"uint256"},{"internalType":"uint256","name":"_total_holder_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_eth_dividends","type":"uint256"},{"internalType":"uint256","name":"_total_match_bonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referral","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"crowd","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"crowd_period_month","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referral","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_month","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_invest_id","type":"uint256"}],"name":"depositRedeem","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"eth_min_withdraw_num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getInvestList","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"times","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"withdraws","type":"uint256[]"},{"internalType":"uint256[]","name":"endTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"statuses","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest_coin_usd_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest_eth_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"invest_period_month_rates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"invest_period_months","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest_reward_eth_month_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest_token_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invest_token_decimal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"payoutEthOf","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"payoutOf","outputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platform_bonus_address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platform_bonus_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerTotals","outputs":[{"internalType":"uint256","name":"total_match_invested","type":"uint256"},{"internalType":"uint256","name":"total_dividends","type":"uint256"},{"internalType":"uint256","name":"total_referral_bonus","type":"uint256"},{"internalType":"uint256","name":"total_match_bonus","type":"uint256"},{"internalType":"uint256","name":"total_holder_full_bonus","type":"uint256"},{"internalType":"uint256","name":"total_holder_single_bonus","type":"uint256"},{"internalType":"uint256","name":"total_eth_dividends","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"players","outputs":[{"internalType":"address","name":"referral","type":"address"},{"internalType":"uint8","name":"is_crowd","type":"uint8"},{"internalType":"uint256","name":"level_id","type":"uint256"},{"internalType":"uint256","name":"dividends","type":"uint256"},{"internalType":"uint256","name":"eth_dividends","type":"uint256"},{"internalType":"uint256","name":"referral_bonus","type":"uint256"},{"internalType":"uint256","name":"match_bonus","type":"uint256"},{"internalType":"uint256","name":"holder_full_bonus","type":"uint256"},{"internalType":"uint256","name":"holder_single_bonus","type":"uint256"},{"internalType":"uint256","name":"total_invested","type":"uint256"},{"internalType":"uint256","name":"total_redeem","type":"uint256"},{"internalType":"uint256","name":"total_withdrawn","type":"uint256"},{"internalType":"uint256","name":"last_payout","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"referral_bonuses","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareholder_full_bonus_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shareholder_single_bonus_rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shareholders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"team_level_amounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"team_level_bonuses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"team_level_ids","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_crowded_num","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_dividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_eth_dividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_holder_full_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_holder_single_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_invested","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_investors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_match_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_platform_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_redeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_referral_bonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_withdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"userInfo","outputs":[{"internalType":"address","name":"_referral","type":"address"},{"internalType":"uint256","name":"_referral_num","type":"uint256"},{"internalType":"uint256","name":"_is_crowd","type":"uint256"},{"internalType":"uint256","name":"_dividends","type":"uint256"},{"internalType":"uint256","name":"_eth_dividends","type":"uint256"},{"internalType":"uint256","name":"_referral_bonus","type":"uint256"},{"internalType":"uint256","name":"_match_bonus","type":"uint256"},{"internalType":"uint256","name":"_holder_single_bonus","type":"uint256"},{"internalType":"uint256","name":"_holder_full_bonus","type":"uint256"},{"internalType":"uint256","name":"_last_payout","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"userInfoTotals","outputs":[{"internalType":"uint256","name":"_total_invested","type":"uint256"},{"internalType":"uint256","name":"_total_withdrawn","type":"uint256"},{"internalType":"uint256","name":"_total_community_invested","type":"uint256"},{"internalType":"uint256","name":"_total_match_invested","type":"uint256"},{"internalType":"uint256","name":"_total_dividends","type":"uint256"},{"internalType":"uint256","name":"_total_referral_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_match_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_holder_full_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_holder_single_bonus","type":"uint256"},{"internalType":"uint256","name":"_total_math_invested","type":"uint256"},{"internalType":"uint256","name":"_total_eth_dividends","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"yield_reduce_section1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"yield_reduce_section2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"yield_reduce_section3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405273fad7161c74c809c213d88dac021600d74f6c961c600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550738ec213e7191488c7873cec6dac8e97cdbadb7b35600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060046005556008600655604051806102800160405280600a60ff168152602001600860ff168152602001600660ff168152602001600460ff168152602001600260ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff168152602001600160ff1681525060139060146200019c9291906200059d565b506040518060c00160405280600160ff168152602001600260ff168152602001600360ff168152602001600660ff168152602001600c60ff168152602001601260ff168152506014906006620001f49291906200064b565b506040518060c0016040528061032061ffff16815260200161038461ffff1681526020016103e861ffff16815260200161044c61ffff1681526020016104b061ffff1681526020016104b061ffff16815250601590600662000258929190620006a2565b506040518060400160405280621e848062ffffff168152602001601e62ffffff1681525060169060026200028e929190620006fa565b506040518060400160405280624c4b4062ffffff168152602001601e62ffffff168152506017906002620002c4929190620006fa565b5060405180604001604052806289544062ffffff168152602001601e62ffffff168152506018906002620002fa929190620006fa565b506040518060c00160405280600160ff168152602001600260ff168152602001600360ff168152602001600460ff168152602001600560ff168152602001600660ff168152506019906006620003529291906200064b565b506040518060c0016040528061271062ffffff16815260200161753062ffffff16815260200161c35062ffffff168152602001620186a062ffffff16815260200162030d4062ffffff1681526020016207a12062ffffff16815250601a906006620003bf92919062000753565b506040518060c00160405280600260ff168152602001600460ff168152602001600660ff168152602001600860ff168152602001600a60ff168152602001600b60ff16815250601b906006620004179291906200064b565b506001601c556019601d5567d02ab486cedc0000601e5573b42a4bed3c53a7ac9551670df0af36956c7b87f1601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200049057600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620007f5565b82805482825590600052602060002090601f01602090048101928215620006385791602002820160005b838211156200060757835183826101000a81548160ff021916908360ff1602179055509260200192600101602081600001049283019260010302620005c7565b8015620006365782816101000a81549060ff021916905560010160208160000104928301926001030262000607565b505b509050620006479190620007ac565b5090565b8280548282559060005260206000209081019282156200068f579160200282015b828111156200068e578251829060ff169055916020019190600101906200066c565b5b5090506200069e9190620007d6565b5090565b828054828255906000526020600020908101928215620006e7579160200282015b82811115620006e6578251829061ffff16905591602001919060010190620006c3565b5b509050620006f69190620007d6565b5090565b82805482825590600052602060002090810192821562000740579160200282015b828111156200073f578251829062ffffff169055916020019190600101906200071b565b5b5090506200074f9190620007d6565b5090565b82805482825590600052602060002090810192821562000799579160200282015b8281111562000798578251829062ffffff1690559160200191906001019062000774565b5b509050620007a89190620007d6565b5090565b5b80821115620007d257600081816101000a81549060ff021916905550600101620007ad565b5090565b5b80821115620007f1576000816000905550600101620007d7565b5090565b61520580620008056000396000f3fe6080604052600436106103545760003560e01c8063837b7af0116101c6578063b574da5b116100f7578063e262113e11610095578063eb6521161161006f578063eb6521161461130f578063ee64db381461133a578063f179c79714611365578063f4f3a44c146113b45761035b565b8063e262113e146111e7578063e2eb41ff14611212578063e92205af146112e45761035b565b8063c57dd6df116100d1578063c57dd6df14611101578063c7a69c0314611142578063cb6fbd9f1461116d578063db48c290146111985761035b565b8063b574da5b14611009578063badf822b1461106e578063c0c9a4a0146110af5761035b565b8063918ae01e11610164578063a6b165ee1161013e578063a6b165ee14610f23578063a8305c4b14610f4e578063aaac8a4314610f79578063ab377daa14610fa45761035b565b8063918ae01e14610e5a578063949f954714610e855780639f6de72714610ed45761035b565b80638b46a09c116101a05780638b46a09c14610d985780638da5cb5b14610dc35780638e15f47314610e0457806391212e7614610e2f5761035b565b8063837b7af014610cf357806386fab93f14610d4257806388d2786c14610d6d5761035b565b8063451c2baf116102a057806374a172fc1161023e57806378a441b01161021857806378a441b014610c0d5780637a1b730514610c385780637d8cb7a214610c875780637da2c0fc14610cb25761035b565b806374a172fc14610af657806374b95b2d14610b3757806377b6980e14610be25761035b565b8063599b21cf1161027a578063599b21cf146109ac5780635f45527b146109d75780636da61d1e14610a025780636ff55eaf14610a675761035b565b8063451c2baf146108ee57806346f987531461091c57806352fe3e43146109815761035b565b806312065fe01161030d5780631959a002116102e75780631959a002146107d457806330ef0d031461088e5780633ccfd60b146108b957806343bfdd5d146108c35761035b565b806312065fe014610693578063136e36c1146106be57806315c43aaf1461070d5761035b565b8063051789101461035d57806305a103f61461038857806307e7dcab146105965780630a8692f9146105c15780630aec8b4d146106105780630efe6a8b1461063b5761035b565b3661035b57005b005b34801561036957600080fd5b50610372611402565b6040518082815260200191505060405180910390f35b34801561039457600080fd5b506103d7600480360360208110156103ab57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611408565b6040518080602001806020018060200180602001806020018060200187810387528d818151815260200191508051906020019060200280838360005b8381101561042e578082015181840152602081019050610413565b5050505090500187810386528c818151815260200191508051906020019060200280838360005b83811015610470578082015181840152602081019050610455565b5050505090500187810385528b818151815260200191508051906020019060200280838360005b838110156104b2578082015181840152602081019050610497565b5050505090500187810384528a818151815260200191508051906020019060200280838360005b838110156104f45780820151818401526020810190506104d9565b50505050905001878103835289818151815260200191508051906020019060200280838360005b8381101561053657808201518184015260208101905061051b565b50505050905001878103825288818151815260200191508051906020019060200280838360005b8381101561057857808201518184015260208101905061055d565b505050509050019c5050505050505050505050505060405180910390f35b3480156105a257600080fd5b506105ab611762565b6040518082815260200191505060405180910390f35b3480156105cd57600080fd5b506105fa600480360360208110156105e457600080fd5b8101908080359060200190929190505050611768565b6040518082815260200191505060405180910390f35b34801561061c57600080fd5b50610625611789565b6040518082815260200191505060405180910390f35b6106916004803603606081101561065157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919050505061178f565b005b34801561069f57600080fd5b506106a8611cda565b6040518082815260200191505060405180910390f35b3480156106ca57600080fd5b506106f7600480360360208110156106e157600080fd5b8101908080359060200190929190505050611ce2565b6040518082815260200191505060405180910390f35b34801561071957600080fd5b50610722611d03565b604051808f81526020018e81526020018d81526020018c81526020018b81526020018a815260200189815260200180602001888152602001878152602001868152602001858152602001848152602001838152602001828103825289818151815260200191508051906020019060200280838360005b838110156107b3578082015181840152602081019050610798565b505050509050019f5050505050505050505050505050505060405180910390f35b3480156107e057600080fd5b50610823600480360360208110156107f757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611dc3565b604051808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390f35b34801561089a57600080fd5b506108a3611e9f565b6040518082815260200191505060405180910390f35b6108c1611ea5565b005b3480156108cf57600080fd5b506108d861238a565b6040518082815260200191505060405180910390f35b61091a6004803603602081101561090457600080fd5b8101908080359060200190929190505050612390565b005b34801561092857600080fd5b5061096b6004803603602081101561093f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506129b9565b6040518082815260200191505060405180910390f35b34801561098d57600080fd5b50610996612b21565b6040518082815260200191505060405180910390f35b3480156109b857600080fd5b506109c1612b27565b6040518082815260200191505060405180910390f35b3480156109e357600080fd5b506109ec612b2d565b6040518082815260200191505060405180910390f35b348015610a0e57600080fd5b50610a5160048036036020811015610a2557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b33565b6040518082815260200191505060405180910390f35b348015610a7357600080fd5b50610ab660048036036020811015610a8a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c54565b6040518088815260200187815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390f35b348015610b0257600080fd5b50610b0b612c96565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b4357600080fd5b50610b8660048036036020811015610b5a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612cbc565b604051808c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405180910390f35b348015610bee57600080fd5b50610bf7612dba565b6040518082815260200191505060405180910390f35b348015610c1957600080fd5b50610c22612dbf565b6040518082815260200191505060405180910390f35b348015610c4457600080fd5b50610c7160048036036020811015610c5b57600080fd5b8101908080359060200190929190505050612dc4565b6040518082815260200191505060405180910390f35b348015610c9357600080fd5b50610c9c612de5565b6040518082815260200191505060405180910390f35b348015610cbe57600080fd5b50610cc7612deb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610cff57600080fd5b50610d2c60048036036020811015610d1657600080fd5b8101908080359060200190929190505050612e11565b6040518082815260200191505060405180910390f35b348015610d4e57600080fd5b50610d57612e32565b6040518082815260200191505060405180910390f35b348015610d7957600080fd5b50610d82612e38565b6040518082815260200191505060405180910390f35b348015610da457600080fd5b50610dad612e3e565b6040518082815260200191505060405180910390f35b348015610dcf57600080fd5b50610dd8612e44565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610e1057600080fd5b50610e19612e68565b6040518082815260200191505060405180910390f35b348015610e3b57600080fd5b50610e44612f17565b6040518082815260200191505060405180910390f35b348015610e6657600080fd5b50610e6f612f1d565b6040518082815260200191505060405180910390f35b348015610e9157600080fd5b50610ebe60048036036020811015610ea857600080fd5b8101908080359060200190929190505050612f23565b6040518082815260200191505060405180910390f35b348015610ee057600080fd5b50610f0d60048036036020811015610ef757600080fd5b8101908080359060200190929190505050612f44565b6040518082815260200191505060405180910390f35b348015610f2f57600080fd5b50610f38612f65565b6040518082815260200191505060405180910390f35b348015610f5a57600080fd5b50610f63612f6b565b6040518082815260200191505060405180910390f35b348015610f8557600080fd5b50610f8e612f70565b6040518082815260200191505060405180910390f35b348015610fb057600080fd5b50610fdd60048036036020811015610fc757600080fd5b8101908080359060200190929190505050612f76565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561101557600080fd5b506110426004803603602081101561102c57600080fd5b8101908080359060200190929190505050612fb2565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561107a57600080fd5b50611083612fe5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156110bb57600080fd5b506110e8600480360360208110156110d257600080fd5b810190808035906020019092919050505061300b565b604051808260ff16815260200191505060405180910390f35b34801561110d57600080fd5b5061111661303c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561114e57600080fd5b50611157613062565b6040518082815260200191505060405180910390f35b34801561117957600080fd5b50611182613068565b6040518082815260200191505060405180910390f35b3480156111a457600080fd5b506111d1600480360360208110156111bb57600080fd5b810190808035906020019092919050505061306d565b6040518082815260200191505060405180910390f35b3480156111f357600080fd5b506111fc61308e565b6040518082815260200191505060405180910390f35b34801561121e57600080fd5b506112616004803603602081101561123557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613093565b604051808e73ffffffffffffffffffffffffffffffffffffffff1681526020018d60ff1681526020018c81526020018b81526020018a81526020018981526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019d505050505050505050505050505060405180910390f35b3480156112f057600080fd5b506112f9613125565b6040518082815260200191505060405180910390f35b34801561131b57600080fd5b5061132461312a565b6040518082815260200191505060405180910390f35b34801561134657600080fd5b5061134f613130565b6040518082815260200191505060405180910390f35b34801561137157600080fd5b5061139e6004803603602081101561138857600080fd5b8101908080359060200190929190505050613136565b6040518082815260200191505060405180910390f35b611400600480360360408110156113ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613157565b005b60105481565b6060806060806060806000602060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050606081600c018054905067ffffffffffffffff8111801561147457600080fd5b506040519080825280602002602001820160405280156114a35781602001602082028036833780820191505090505b509050606082600c018054905067ffffffffffffffff811180156114c657600080fd5b506040519080825280602002602001820160405280156114f55781602001602082028036833780820191505090505b509050606083600c018054905067ffffffffffffffff8111801561151857600080fd5b506040519080825280602002602001820160405280156115475781602001602082028036833780820191505090505b509050606084600c018054905067ffffffffffffffff8111801561156a57600080fd5b506040519080825280602002602001820160405280156115995781602001602082028036833780820191505090505b509050606085600c018054905067ffffffffffffffff811180156115bc57600080fd5b506040519080825280602002602001820160405280156115eb5781602001602082028036833780820191505090505b509050606086600c018054905067ffffffffffffffff8111801561160e57600080fd5b5060405190808252806020026020018201604052801561163d5781602001602082028036833780820191505090505b50905060005b87600c018054905081101561173f57600088600c01828154811061166357fe5b90600052602060002090600702019050806000015488838151811061168457fe5b60200260200101818152505080600101548583815181106116a157fe5b60200260200101818152505080600201548483815181106116be57fe5b60200260200101818152505080600301548783815181106116db57fe5b60200260200101818152505080600501548683815181106116f857fe5b6020026020010181815250508060060160009054906101000a900460ff1660ff1683838151811061172557fe5b602002602001018181525050508080600101915050611643565b508585848487859c509c509c509c509c509c505050505050505091939550919395565b60125481565b6015818154811061177557fe5b906000526020600020016000915090505481565b600a5481565b6064821015611806576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4d696e696d616c206465706f7369743a2031303020314343000000000000000081525060200191505060405180910390fd5b61271082111561187e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d6178696e756d206465706f7369743a2031303030302031434300000000000081525060200191505060405180910390fd5b6000602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506107d081600c01805490501061193f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d61782032303030206465706f7369747320706572206164647265737300000081525060200191505060405180910390fd5b6000600554600a0a905060008185029050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015611a0157600080fd5b505af1158015611a15573d6000803e3d6000fd5b505050506040513d6020811015611a2b57600080fd5b8101908080519060200190929190505050611aae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b611ab8338761375d565b600083600c01805490501415611b2e5760016007600082825401925050819055503360226000600754815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600062015180601e86020290506000600185600c018054905001905084600c0160405180610100016040528083815260200189815260200160008152602001428152602001888152602001611b8c854261395590919063ffffffff16565b8152602001600060ff168152602001600060ff168152509080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff021916908360ff16021790555060e08201518160060160016101000a81548160ff021916908360ff160217905550505086856008016000828254019250508190555086600860008282540192505081905550611c7a3388600161396c565b3373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158888604051808381526020018281526020019250505060405180910390a25050505050505050565b600047905090565b60198181548110611cef57fe5b906000526020600020016000915090505481565b60008060008060008060006060600080600080600080600854600754600954600d54600b546011546012546014613a986012601e54601054600f5401600e54600c5486805480602002602001604051908101604052809291908181526020018280548015611d9057602002820191906000526020600020905b815481526020019060010190808311611d7c575b505050505096509d509d509d509d509d509d509d509d509d509d509d509d509d509d50909192939495969798999a9b9c9d565b6000806000806000806000806000806000602060008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600d01805490508260000160149054906101000a900460ff1683600201548460030154856004015486600501548760070154886006015489600b01548760ff1697509a509a509a509a509a509a509a509a509a509a50509193959799509193959799565b601e5481565b611eae33613ceb565b6000602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160070154826006015483600501548460040154856002015401010101905060008260030154905060008211611f91576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f496e73756666696369656e742062616c616e636500000000000000000000000081525060200191505060405180910390fd5b6000829050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b330836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561202957600080fd5b505af115801561203d573d6000803e3d6000fd5b505050506040513d602081101561205357600080fd5b81019080805190602001909291905050506120d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f617070726f7665206661696c656400000000000000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b15801561218757600080fd5b505af115801561219b573d6000803e3d6000fd5b505050506040513d60208110156121b157600080fd5b8101908080519060200190929190505050612234576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b601e5482101580156122465750814710155b15612305573373ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050158015612291573d6000803e3d6000fd5b508360030154602160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600601600082825401925050819055508360030154600e60008282540192505081905550600084600301819055505b61230f3382613f36565b61231881614146565b6123223382614229565b61232c3382614404565b6123363382614752565b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040518082815260200191505060405180910390a250505050565b60095481565b6000602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508181600c0180549050101580156123ea5750600082115b61245c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f56616c6964206465706f7369742069640000000000000000000000000000000081525060200191505060405180910390fd5b60006001830390504282600c01828154811061247457fe5b906000526020600020906007020160050154106124f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e76657374206e6f742065787069726564000000000000000000000000000081525060200191505060405180910390fd5b600082600c01828154811061250a57fe5b906000526020600020906007020160060160009054906101000a900460ff1660ff161461259f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f496e766573742069732072656465656d6564000000000000000000000000000081525060200191505060405180910390fd5b600082600c0182815481106125b057fe5b906000526020600020906007020160010154905060006125d282600554614999565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b330836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561266757600080fd5b505af115801561267b573d6000803e3d6000fd5b505050506040513d602081101561269157600080fd5b8101908080519060200190929190505050612714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f617070726f7665206661696c656400000000000000000000000000000000000081525060200191505060405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156127c557600080fd5b505af11580156127d9573d6000803e3d6000fd5b505050506040513d60208110156127ef57600080fd5b8101908080519060200190929190505050612872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b600184600c01848154811061288357fe5b906000526020600020906007020160060160006101000a81548160ff021916908360ff160217905550600184600c0184815481106128bd57fe5b906000526020600020906007020160060160019054906101000a900460ff1660ff16141561291e5760008460000160146101000a81548160ff021916908360ff160217905550600160126000828254039250508190555061291d336149ae565b5b8184600801600082825403925050819055508160086000828254039250508190555081600a6000828254019250508190555061297b33837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61396c565b7fa6a089c9a854d2f9b951b600fdfe0fff33d90a23c7b2cbdb3ca229f83d1527af856040518082815260200191505060405180910390a15050505050565b600080602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000612a07612e68565b905060005b82600c0180549050811015612b1957600083600c018281548110612a2c57fe5b906000526020600020906007020190506000816003015485600b015411612a57578160030154612a5d565b84600b01545b9050600082600501544211612a725742612a78565b82600501545b90508082108015612a9d575060008360060160009054906101000a900460ff1660ff16145b15612b09576000612ab48460010154600554614999565b90506000600554601203600a0a876305f5e100601c5402601e6103e8601d54870281612adc57fe5b0481612ae457fe5b040281612aed57fe5b0402905062015180848403820281612b0157fe5b048901985050505b5050508080600101915050612a0c565b505050919050565b600f5481565b600d5481565b60085481565b600080602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b81600c0180549050811015612c4d57600082600c018281548110612b9a57fe5b906000526020600020906007020190506000816003015484600b015411612bc5578160030154612bcb565b83600b01545b9050600082600501544211612be05742612be6565b82600501545b90508082108015612c0b575060008360060160009054906101000a900460ff1660ff16145b15612c3d576000612c2484600101548560040154614b35565b905062015180838303820281612c3657fe5b0487019650505b5050508080600101915050612b7a565b5050919050565b60216020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154905087565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600080602060008e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000602160008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000612d5d8f614cf0565b9050826008015483600a0154828460000154856001015486600201548760030154886004015489600501548a600001548b600601549d509d509d509d509d509d509d509d509d509d509d5050505091939597999b90929496989a50565b600581565b600581565b601a8181548110612dd157fe5b906000526020600020016000915090505481565b61271081565b601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60188181548110612e1e57fe5b906000526020600020016000915090505481565b60065481565b600b5481565b613a9881565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612ed357600080fd5b505afa158015612ee7573d6000803e3d6000fd5b505050506040513d6020811015612efd57600080fd5b810190808051906020019092919050505090508091505090565b601d5481565b600c5481565b60178181548110612f3057fe5b906000526020600020016000915090505481565b60148181548110612f5157fe5b906000526020600020016000915090505481565b60075481565b601e81565b60115481565b60238181548110612f8357fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60226020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6013818154811061301857fe5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b601c5481565b601281565b601b818154811061307a57fe5b906000526020600020016000915090505481565b606481565b602080528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060000160149054906101000a900460ff169080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a01549080600b015490508d565b600381565b600e5481565b60055481565b6016818154811061314357fe5b906000526020600020016000915090505481565b613a9881146131ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f43726f7764206c696d69743a203135303030203143430000000000000000000081525060200191505060405180910390fd5b601e6012541115613247576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4d6178696d756d207368617265686f6c646572733a203330000000000000000081525060200191505060405180910390fd5b6000602060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160000160149054906101000a900460ff1660ff1614613314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f416c72656164792061207368617265686f6c646572000000000000000000000081525060200191505060405180910390fd5b600061332283600554614999565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1580156133d557600080fd5b505af11580156133e9573d6000803e3d6000fd5b505050506040513d60208110156133ff57600080fd5b8101908080519060200190929190505050613482576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7472616e7366657246726f6d206661696c65640000000000000000000000000081525060200191505060405180910390fd5b61348c338561375d565b60006012905060006134bd620151806134af601e85614ed790919063ffffffff16565b614ed790919063ffffffff16565b9050600084600c018054905014156135355760016007600082825401925050819055503360226000600754815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600185600c018054905001905084600c0160405180610100016040528083815260200188815260200160008152602001428152602001858152602001613586854261395590919063ffffffff16565b8152602001600060ff168152602001600160ff168152509080600181540180825580915050600190039060005260206000209060070201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff021916908360ff16021790555060e08201518160060160016101000a81548160ff021916908360ff160217905550505060018560000160146101000a81548160ff021916908360ff16021790555060016012600082825401925050819055506023339080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550858560080160008282540192505081905550856008600082825401925050819055506137063387600161396c565b3373ffffffffffffffffffffffffffffffffffffffff167f763ef1ffd472885fe8e9b20dd0559e972e3f4527b8e73f4ae950e8625514ea9d876040518082815260200191505060405180910390a250505050505050565b600073ffffffffffffffffffffffffffffffffffffffff16602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561382757508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b156139515780602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600d01829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b600081830190508281101561396657fe5b92915050565b60008160000b1315613b315781602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825401925050819055506000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600115613b2b57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a7157613b2b565b82602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540192505081905550602060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050613a30565b50613ce6565b81602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001600082825403925050819055506000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600115613ce457600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613c2a57613ce4565b82602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282540392505081905550602060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050613be9565b505b505050565b60003073ffffffffffffffffffffffffffffffffffffffff16636da61d1e836040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613d5457600080fd5b505afa158015613d68573d6000803e3d6000fd5b505050506040513d6020811015613d7e57600080fd5b8101908080519060200190929190505050905060003073ffffffffffffffffffffffffffffffffffffffff166346f98753846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015613dfa57600080fd5b505afa158015613e0e573d6000803e3d6000fd5b505050506040513d6020811015613e2457600080fd5b810190808051906020019092919050505090506000821115613f3157613e4983614f08565b42602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600b018190555081602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254019250508190555080602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301600082825401925050819055505b505050565b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000613fa88461504f565b90506000811415613fba575050614142565b60005b6013805490508160ff16101561413e57600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156140075761413e565b60006140128461504f565b905060008590508360028302101561403657836002830282028161403257fe5b0490505b6000606460138560ff168154811061404a57fe5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1683028161407657fe5b04905080602060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008282540192505081905550602060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1695505050508080600101915050613fbd565b5050505b5050565b6000601254141561415657614226565b60006012546064600584028161416857fe5b048161417057fe5b04905060005b6023805490508160ff16101561422357600060238260ff168154811061419857fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905082602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060060160008282540192505081905550508080600101915050614176565b50505b50565b60006064600383028161423857fe5b0490506000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b6001156143fe57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156142e4576143fe565b6001602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160149054906101000a900460ff1660ff1614156143945781602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600701600082825401925050819055506143fe565b602060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506142a3565b50505050565b61440d82615115565b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905060196001601980549050038154811061446957fe5b9060005260206000200154811415614481575061474e565b6000602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b60011561474b57600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561452a5761474b565b61453381615115565b81602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411156146e1576000808311156145a557601b600184038154811061459757fe5b906000526020600020015490505b6000601b6001602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015403815481106145f957fe5b906000526020600020015490506000606483830387028161461657fe5b04905080602060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008282540192505081905550602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015494506019600160198054905003815481106146c357fe5b90600052602060002001548514156146dd5750505061474b565b5050505b602060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506144e9565b50505b5050565b6000602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000602160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508282600a01600082825401925050819055508160020154816001016000828254019250508190555081600401548160020160008282540192505081905550816005015481600301600082825401925050819055508160060154816004016000828254019250508190555081600701548160050160008282540192505081905550826009600082825401925050819055508160020154600d600082825401925050819055508160040154600b600082825401925050819055508160050154600c600082825401925050819055508160060154600f6000828254019250508190555081600701546010600082825401925050819055506000606460058502816148db57fe5b049050806011600082825401925050819055508060206000601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206005016000828254019250508190555060008360020181905550600083600401819055506000836005018190555060008360060181905550600083600701819055505050505050565b60008082600a0a905080840291505092915050565b60005b602380549050811015614b31578173ffffffffffffffffffffffffffffffffffffffff16602382815481106149e257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415614b245760008190505b600160238054905003811015614adc5760236001820181548110614a4f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660238281548110614a8757fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080600101915050614a2f565b50602360016023805490500381548110614af257fe5b9060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055614b31565b80806001019150506149b1565b5050565b6000806015600081548110614b4657fe5b9060005260206000200154905060005b601480549050811015614bae578360148281548110614b7157fe5b90600052602060002001541415614ba15760158181548110614b8f57fe5b90600052602060002001549150614bae565b8080600101915050614b56565b506000614bbd85600554614999565b9050612710601e83830281614bce57fe5b0481614bd657fe5b0492506000831115614ce857614c066016600081548110614bf357fe5b9060005260206000200154600554614999565b60095410614c395760646016600181548110614c1e57fe5b9060005260206000200154606403840281614c3557fe5b0492505b614c5d6017600081548110614c4a57fe5b9060005260206000200154600554614999565b60095410614c905760646017600181548110614c7557fe5b9060005260206000200154606403840281614c8c57fe5b0492505b614cb46018600081548110614ca157fe5b9060005260206000200154600554614999565b60095410614ce75760646018600181548110614ccc57fe5b9060005260206000200154606403840281614ce357fe5b0492505b5b505092915050565b60006060602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600d01805480602002602001604051908101604052809291908181526020018280548015614db657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311614d6c575b5050505050905060008060005b8351811015614ec9576000848281518110614dda57fe5b60200260200101519050602160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548301925083602160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541115614ebb57602160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015493505b508080600101915050614dc3565b508181039350505050919050565b600080831415614eea5760009050614f02565b818302905081838281614ef957fe5b0414614f0157fe5b5b92915050565b6000602060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b81600c018054905081101561504a57600082600c018281548110614f6e57fe5b906000526020600020906007020190506000816003015484600b015411614f99578160030154614f9f565b83600b01545b9050600082600501544211614fb45742614fba565b82600501545b90508082108015614fdf575060008360060160009054906101000a900460ff1660ff16145b1561503a576000614ff884600101548560040154614b35565b90506201518083830382028161500a57fe5b0486600c01868154811061501a57fe5b906000526020600020906007020160020160008282540192505081905550505b5050508080600101915050614f4e565b505050565b600080602060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060005b81600c018054905081101561510e57600082600c0182815481106150b657fe5b9060005260206000209060070201905060008160060160009054906101000a900460ff1660ff1614156151005760006150f782600101548360040154614b35565b90508085019450505b508080600101915050615096565b5050919050565b600061512082614cf0565b90506000805b6019805490508160ff16101561518257601a8160ff168154811061514657fe5b906000526020600020015483106151755760198160ff168154811061516757fe5b906000526020600020015491505b8080600101915050615126565b5080602060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555050505056fea2646970667358221220d480b4cb0fa1aeaa8d10263b93267be0e12ae97d2a654ca1f13b45fe6da29d9264736f6c634300060c0033

Deployed ByteCode Sourcemap

3383:33178:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5303:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34947:1292;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5444:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6062:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5065:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8849:1867;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8616:96;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6500:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31605:1013;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32739:753;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6933:53;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12952:1820;;;:::i;:::-;;5028:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14901:1785;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29081:1008;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5258:38;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5180:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4992:29;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28203:746;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7670:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4637:80;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33639:1243;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5634:55;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7526:47;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6558:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7121:49;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7395:82;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6395:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4905:37;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5099:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7212:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1143:20;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;36371:181;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6830:48;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5141:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6334:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5958:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4955:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5537:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5350:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7777:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7728:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3430:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5802:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;4767:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6739:40;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7305:47;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6643:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7033:47;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7622:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5696:57;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5217:34;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4859:39;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6273:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10804:1974;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5303:40;;;;:::o;34947:1292::-;35037:20;35058:22;35082:24;35108:26;35135:25;35161;35205:21;35229:7;:14;35237:5;35229:14;;;;;;;;;;;;;;;35205:38;;35254:21;35292:6;:15;;:22;;;;35278:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35254:61;;35326:23;35366:6;:15;;:22;;;;35352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35326:63;;35400:26;35443:6;:15;;:22;;;;35429:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35400:66;;35477:25;35519:6;:15;;:22;;;;35505:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35477:65;;35553:27;35597:6;:15;;:22;;;;35583:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35553:67;;35631:26;35674:6;:15;;:22;;;;35660:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35631:66;;35712:9;35708:359;35731:6;:15;;:22;;;;35727:1;:26;35708:359;;;35775:25;35803:6;:15;;35819:1;35803:18;;;;;;;;;;;;;;;;;;35775:46;;35846:3;:6;;;35836:4;35841:1;35836:7;;;;;;;;;;;;;:16;;;;;35881:3;:10;;;35867:8;35876:1;35867:11;;;;;;;;;;;;;:24;;;;;35922:3;:18;;;35906:10;35917:1;35906:13;;;;;;;;;;;;;:34;;;;;35967:3;:8;;;35955:6;35962:1;35955:9;;;;;;;;;;;;;:20;;;;;36005:3;:10;;;35990:9;36000:1;35990:12;;;;;;;;;;;;;:25;;;;;36045:3;:10;;;;;;;;;;;;36030:25;;:9;36040:1;36030:12;;;;;;;;;;;;;:25;;;;;35708:359;35755:3;;;;;;;35708:359;;;;36099:4;36118:6;36139:8;36162:10;36187:9;36211;36077:154;;;;;;;;;;;;;;;;;;;34947:1292;;;;;;;:::o;5444:32::-;;;;:::o;6062:79::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5065:27::-;;;;:::o;8849:1867::-;7077:3;8982:7;:28;;8974:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7165:5;9058:7;:28;;9050:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9219:21;9243:7;:19;9251:10;9243:19;;;;;;;;;;;;;;;9219:43;;9306:4;9281:6;:15;;:22;;;;:29;9273:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9401:22;9432:20;;9426:2;:26;9401:51;;9463:20;9496:14;9486:7;:24;9463:47;;9601:11;;;;;;;;;;;:24;;;9626:10;9646:4;9653:12;9601:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9593:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9703:35;9716:10;9728:9;9703:12;:35::i;:::-;9831:1;9805:6;:15;;:22;;;;:27;9802:130;;;9867:1;9848:15;;:20;;;;;;;;;;;9910:10;9883:7;:24;9891:15;;9883:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;9802:130;10009:19;10045:5;10040:2;10031:6;:11;:19;10009:41;;10071:11;10110:1;10085:6;:15;;:22;;;;:26;10071:40;;10122:6;:15;;10143:297;;;;;;;;10176:3;10143:297;;;;10202:7;10143:297;;;;10240:1;10143:297;;;;10270:15;10143:297;;;;10309:6;10143:297;;;;10337:41;10366:11;10345:15;10337:28;;:41;;;;:::i;:::-;10143:297;;;;10401:1;10143:297;;;;;;10427:1;10143:297;;;;;10122:319;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10479:7;10454:6;:21;;;:32;;;;;;;;;;;10515:7;10497:14;;:25;;;;;;;;;;;10596:58;10631:10;10643:7;10652:1;10596:34;:58::i;:::-;10680:10;10672:36;;;10692:7;10701:6;10672:36;;;;;;;;;;;;;;;;;;;;;;;;8849:1867;;;;;;;;:::o;8616:96::-;8659:4;8683:21;8676:28;;8616:96;:::o;6500:51::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31605:1013::-;31681:23;31706:24;31732;31758;31784:29;31815;31846:26;31873:32;31906:27;31934;31962:29;31992:27;32020:28;32049:26;32116:14;;32146:15;;32177;;32208;;32239:20;;32275;;32311:17;;32344:20;7257:5;7350:2;32447:20;;32508:25;;32482:23;;:51;32548:19;;32582:17;;32094:516;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31605:1013;;;;;;;;;;;;;;:::o;32739:753::-;32823:17;32842:21;32865:17;32884:18;32904:22;32928:23;32953:20;32975:28;33005:26;33032:20;33071:21;33095:7;:14;33103:5;33095:14;;;;;;;;;;;;;;;33071:38;;33142:6;:15;;;;;;;;;;;;33172:6;:16;;:23;;;;33210:6;:15;;;;;;;;;;;;33240:6;:16;;;33271:6;:20;;;33306:6;:21;;;33342:6;:18;;;33375:6;:26;;;33416:6;:24;;;33455:6;:18;;;33120:364;;;;;;;;;;;;;;;;;;;;;;;;;;32739:753;;;;;;;;;;;:::o;6933:53::-;;;;:::o;12952:1820::-;13077:19;13085:10;13077:7;:19::i;:::-;13117:21;13141:7;:19;13149:10;13141:19;;;;;;;;;;;;;;;13117:43;;13173:15;13282:6;:26;;;13255:6;:24;;;13234:6;:18;;;13210:6;:21;;;13191:6;:16;;;:40;:61;:88;:117;13173:135;;13319:19;13341:6;:20;;;13319:42;;13400:1;13390:7;:11;13382:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13491:20;13514:7;13491:30;;13595:11;;;;;;;;;;;:19;;;13623:4;13630:12;13595:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13587:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13681:11;;;;;;;;;;;:24;;;13714:4;13721:10;13733:12;13681:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13673:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13873:20;;13858:11;:35;;:75;;;;;13922:11;13897:21;:36;;13858:75;13855:318;;;13949:10;:19;;:32;13969:11;13949:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14044:6;:20;;;13996:12;:24;14009:10;13996:24;;;;;;;;;;;;;;;:44;;;:68;;;;;;;;;;;14102:6;:20;;;14079:19;;:43;;;;;;;;;;;14160:1;14137:6;:20;;:24;;;;13855:318;14221:41;14237:10;14249:12;14221:15;:41::i;:::-;14332;14360:12;14332:27;:41::i;:::-;14445:55;14475:10;14487:12;14445:29;:55::i;:::-;14558:38;14571:10;14583:12;14558;:38::i;:::-;14654:50;14679:10;14691:12;14654:24;:50::i;:::-;14739:10;14730:34;;;14751:12;14730:34;;;;;;;;;;;;;;;;;;12952:1820;;;;:::o;5028:30::-;;;;:::o;14901:1785::-;14998:21;15022:7;:19;15030:10;15022:19;;;;;;;;;;;;;;;14998:43;;15096:10;15070:6;:15;;:22;;;;:36;;:54;;;;;15123:1;15110:10;:14;15070:54;15062:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15156:14;15186:1;15173:10;:14;15156:31;;15239:15;15206:6;:15;;15222:6;15206:23;;;;;;;;;;;;;;;;;;:30;;;:48;15198:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15330:1;15296:6;:15;;15312:6;15296:23;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;:35;;;15288:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15417:15;15435:6;:15;;15451:6;15435:23;;;;;;;;;;;;;;;;;;:30;;;15417:48;;15476:20;15499:45;15515:7;15523:20;;15499:15;:45::i;:::-;15476:68;;15694:11;;;;;;;;;;;:19;;;15722:4;15729:12;15694:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15686:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15780:11;;;;;;;;;;;:24;;;15813:4;15820:10;15832:12;15780:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15772:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15970:1;15937:6;:15;;15953:6;15937:23;;;;;;;;;;;;;;;;;;:30;;;:34;;;;;;;;;;;;;;;;;;16084:1;16048:6;:15;;16064:6;16048:23;;;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;:37;;;16045:234;;;16119:1;16101:6;:15;;;:19;;;;;;;;;;;;;;;;;;16156:1;16135:17;;:22;;;;;;;;;;;16236:31;16256:10;16236:19;:31::i;:::-;16045:234;16356:7;16331:6;:21;;;:32;;;;;;;;;;;16453:7;16435:14;;:25;;;;;;;;;;;16487:7;16471:12;;:23;;;;;;;;;;;16576:59;16611:10;16623:7;16632:2;16576:34;:59::i;:::-;16653:25;16667:10;16653:25;;;;;;;;;;;;;;;;;;14901:1785;;;;;:::o;29081:1008::-;29169:13;29200:21;29224:7;:14;29232:5;29224:14;;;;;;;;;;;;;;;29200:38;;29249:20;29272:16;:14;:16::i;:::-;29249:39;;29313:9;29309:750;29332:6;:15;;:22;;;;29328:1;:26;29309:750;;;29376:25;29404:6;:15;;29420:1;29404:18;;;;;;;;;;;;;;;;;;29376:46;;29451:12;29487:3;:8;;;29466:6;:18;;;:29;:61;;29519:3;:8;;;29466:61;;;29498:6;:18;;;29466:61;29451:76;;29542:10;29573:3;:10;;;29555:15;:28;:68;;29607:15;29555:68;;;29586:3;:10;;;29555:68;29542:81;;29662:2;29655:4;:9;:28;;;;;29682:1;29668:3;:10;;;;;;;;;;;;:15;;;29655:28;29652:396;;;29704:20;29727:49;29743:3;:10;;;29755:20;;29727:15;:49::i;:::-;29704:72;;29795:23;29945:20;;29940:2;:25;29933:2;:33;29917:12;29907:5;29882:21;;:31;29875:2;29868:4;29837:28;;29822:12;:43;:50;;;;;;:55;;;;;;29821:93;:108;;;;;;:146;29795:172;;30027:5;30019:4;30014:2;:9;29995:15;:29;:37;;;;;;29986:46;;;;29652:396;;;29309:750;;;29356:3;;;;;;;29309:750;;;;30069:12;;29081:1008;;;:::o;5258:38::-;;;;:::o;5180:30::-;;;;:::o;4992:29::-;;;;:::o;28203:746::-;28288:13;28319:21;28343:7;:14;28351:5;28343:14;;;;;;;;;;;;;;;28319:38;;28374:9;28370:549;28393:6;:15;;:22;;;;28389:1;:26;28370:549;;;28437:25;28465:6;:15;;28481:1;28465:18;;;;;;;;;;;;;;;;;;28437:46;;28512:12;28548:3;:8;;;28527:6;:18;;;:29;:61;;28580:3;:8;;;28527:61;;;28559:6;:18;;;28527:61;28512:76;;28603:10;28634:3;:10;;;28616:15;:28;:68;;28668:15;28616:68;;;28647:3;:10;;;28616:68;28603:81;;28723:2;28716:4;:9;:28;;;;;28743:1;28729:3;:10;;;;;;;;;;;;:15;;;28716:28;28713:195;;;28765:19;28787:44;28809:3;:10;;;28820:3;:10;;;28787:21;:44::i;:::-;28765:66;;28887:5;28879:4;28874:2;:9;28859:11;:25;:33;;;;;;28850:42;;;;28713:195;;28370:549;;;28417:3;;;;;;;28370:549;;;;28929:12;28203:746;;;:::o;7670:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4637:80::-;;;;;;;;;;;;;:::o;33639:1243::-;33730:23;33755:24;33781:33;33816:29;33847:24;33873:29;33904:26;33932:32;33966:34;34002:28;34031;34078:21;34102:7;:14;34110:5;34102:14;;;;;;;;;;;;;;;34078:38;;34127:31;34161:12;:19;34174:5;34161:19;;;;;;;;;;;;;;;34127:53;;34244:32;34279:33;34306:5;34279:26;:33::i;:::-;34244:68;;34355:6;:21;;;34391:6;:22;;;34464:24;34503:11;:32;;;34550:11;:27;;;34592:11;:32;;;34639:11;:29;;;34683:11;:35;;;34733:11;:37;;;34785:11;:32;;;34832:11;:31;;;34333:541;;;;;;;;;;;;;;;;;;;;;;;;;33639:1243;;;;;;;;;;;;;:::o;5634:55::-;5688:1;5634:55;:::o;7526:47::-;7572:1;7526:47;:::o;6558:78::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7121:49::-;7165:5;7121:49;:::o;7395:82::-;;;;;;;;;;;;;:::o;6395:54::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4905:37::-;;;;:::o;5099:35::-;;;;:::o;7212:50::-;7257:5;7212:50;:::o;1143:20::-;;;;;;;;;;;;:::o;36371:181::-;36448:7;36474:12;36488:9;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36474:38;;36538:5;36523:21;;;36371:181;:::o;6830:48::-;;;;:::o;5141:32::-;;;;:::o;6334:54::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5958:77::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4955:30::-;;;;:::o;5537:50::-;5585:2;5537:50;:::o;5350:35::-;;;;:::o;7777:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7728:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;3430:25::-;;;;;;;;;;;;;:::o;5802:86::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4767:79::-;;;;;;;;;;;;;:::o;6739:40::-;;;;:::o;7305:47::-;7350:2;7305:47;:::o;6643:53::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7033:47::-;7077:3;7033:47;:::o;7622:41::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5696:57::-;5752:1;5696:57;:::o;5217:34::-;;;;:::o;4859:39::-;;;;:::o;6273:54::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10804:1974::-;7257:5;10918:7;:29;10910:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5585:2;10993:17;;:42;;10985:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11085:21;11109:7;:19;11117:10;11109:19;;;;;;;;;;;;;;;11085:43;;11166:1;11147:6;:15;;;;;;;;;;;;:20;;;11139:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11250:20;11273:45;11289:7;11297:20;;11273:15;:45::i;:::-;11250:68;;11409:11;;;;;;;;;;;:24;;;11434:10;11454:4;11461:12;11409:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11401:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11511:35;11524:10;11536:9;11511:12;:35::i;:::-;11624:14;7350:2;11624:35;;11670:19;11692:25;11711:5;11692:14;11703:2;11692:6;:10;;:14;;;;:::i;:::-;:18;;:25;;;;:::i;:::-;11670:47;;11810:1;11784:6;:15;;:22;;;;:27;11781:130;;;11846:1;11827:15;;:20;;;;;;;;;;;11889:10;11862:7;:24;11870:15;;11862:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;11781:130;11931:11;11970:1;11945:6;:15;;:22;;;;:26;11931:40;;11982:6;:15;;12003:298;;;;;;;;12036:3;12003:298;;;;12062:7;12003:298;;;;12100:1;12003:298;;;;12130:15;12003:298;;;;12169:6;12003:298;;;;12198:41;12227:11;12206:15;12198:28;;:41;;;;:::i;:::-;12003:298;;;;12262:1;12003:298;;;;;;12288:1;12003:298;;;;;11982:320;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12385:1;12367:6;:15;;;:19;;;;;;;;;;;;;;;;;;12418:1;12397:17;;:22;;;;;;;;;;;12484:12;12502:10;12484:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12551:7;12526:6;:21;;;:32;;;;;;;;;;;12587:7;12569:14;;:25;;;;;;;;;;;12668:58;12703:10;12715:7;12724:1;12668:34;:58::i;:::-;12750:10;12744:26;;;12762:7;12744:26;;;;;;;;;;;;;;;;;;10804:1974;;;;;;;:::o;19358:390::-;19530:1;19495:37;;:7;:14;19503:5;19495:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;:37;;;:59;;;;;19549:5;19536:18;;:9;:18;;;;19495:59;19492:249;;;19611:9;19585:7;:14;19593:5;19585:14;;;;;;;;;;;;;;;:23;;;:35;;;;;;;;;;;;;;;;;;19689:7;:18;19697:9;19689:18;;;;;;;;;;;;;;;:28;;19723:5;19689:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19492:249;19358:390;;:::o;987:127::-;1045:9;1071:1;1067;:5;1063:9;;1091:1;1086;:6;;1079:14;;;;987:127;;;;:::o;16814:864::-;16939:1;16934:2;:6;;;16931:740;;;17000:7;16956:12;:19;16969:5;16956:19;;;;;;;;;;;;;;;:40;;;:51;;;;;;;;;;;17036:11;17050:7;:14;17058:5;17050:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;17036:37;;17088:205;17094:4;17088:205;;;17136:1;17121:17;;:3;:17;;;17118:27;;;17140:5;;17118:27;17224:7;17182:12;:17;17195:3;17182:17;;;;;;;;;;;;;;;:38;;;:49;;;;;;;;;;;17256:7;:12;17264:3;17256:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;17250:27;;17088:205;;;16931:740;;;;17367:7;17323:12;:19;17336:5;17323:19;;;;;;;;;;;;;;;:40;;;:51;;;;;;;;;;;17403:11;17417:7;:14;17425:5;17417:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;17403:37;;17455:205;17461:4;17455:205;;;17503:1;17488:17;;:3;:17;;;17485:27;;;17507:5;;17485:27;17591:7;17549:12;:17;17562:3;17549:17;;;;;;;;;;;;;;;:38;;;:49;;;;;;;;;;;17623:7;:12;17631:3;17623:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;17617:27;;17455:205;;;16931:740;;16814:864;;;:::o;24800:446::-;24867:14;24884:4;:13;;;24898:5;24884:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24867:37;;24915:18;24936:4;:16;;;24953:5;24936:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24915:44;;24982:1;24973:6;:10;24970:269;;;25014:25;25033:5;25014:18;:25::i;:::-;25105:15;25068:7;:14;25076:5;25068:14;;;;;;;;;;;;;;;:26;;:53;;;;25164:6;25136:7;:14;25144:5;25136:14;;;;;;;;;;;;;;;:24;;;:34;;;;;;;;;;;25217:10;25185:7;:14;25193:5;25185:14;;;;;;;;;;;;;;;:28;;;:42;;;;;;;;;;;24970:269;24800:446;;;:::o;19837:938::-;19928:11;19942:7;:14;19950:5;19942:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;19928:37;;19976:19;19998;20011:5;19998:12;:19::i;:::-;19976:41;;20046:1;20031:11;:16;20028:28;;;20049:7;;;;20028:28;20080:7;20076:692;20097:16;:23;;;;20093:1;:27;;;20076:692;;;20170:1;20155:17;;:3;:17;;;20152:27;;;20174:5;;20152:27;20196:23;20222:17;20235:3;20222:12;:17::i;:::-;20196:43;;20254:21;20278:7;20254:31;;20381:11;20377:1;20359:15;:19;:33;20356:139;;;20468:11;20463:1;20445:15;:19;20428:13;:37;:51;;;;;;20412:67;;20356:139;20523:13;20577:3;20555:16;20572:1;20555:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20539:35;;:13;:35;:41;;;;;;20523:57;;20626:5;20595:7;:12;20603:3;20595:12;;;;;;;;;;;;;;;:27;;;:36;;;;;;;;;;;20735:7;:12;20743:3;20735:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;20729:27;;20076:692;;;20122:3;;;;;;;20076:692;;;;19837:938;;;;;:::o;20867:399::-;20978:1;20957:17;;:22;20954:34;;;20981:7;;20954:34;21008:13;21070:17;;21064:3;5688:1;21024:7;:37;:43;;;;;;:63;;;;;;21008:79;;21102:7;21098:161;21119:12;:19;;;;21115:1;:23;;;21098:161;;;21160:13;21176:12;21189:1;21176:15;;;;;;;;;;;;;;;;;;;;;;;;;;;21160:31;;21242:5;21206:7;:14;21214:5;21206:14;;;;;;;;;;;;;;;:32;;;:41;;;;;;;;;;;21098:161;21140:3;;;;;;;21098:161;;;;20867:399;;;:::o;21366:519::-;21469:13;21527:3;5752:1;21485:7;:39;:45;;;;;;21469:61;;21541:11;21555:7;:14;21563:5;21555:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;21541:37;;21599:279;21605:4;21599:279;;;21657:1;21642:17;;:3;:17;;;21639:27;;;21661:5;;21639:27;21723:1;21698:7;:12;21706:3;21698:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;:26;;;21695:130;;;21780:5;21744:7;:12;21752:3;21744:12;;;;;;;;;;;;;;;:32;;;:41;;;;;;;;;;;21804:5;;21695:130;21845:7;:12;21853:3;21845:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;21839:27;;21599:279;;;21366:519;;;;:::o;21956:1442::-;22083:30;22107:5;22083:23;:30::i;:::-;22124:21;22148:7;:14;22156:5;22148:14;;;;;;;;;;;;;;;:23;;;22124:47;;22258:14;22295:1;22273:14;:21;;;;:23;22258:39;;;;;;;;;;;;;;;;22241:13;:56;22238:68;;;22299:7;;;22238:68;22326:11;22340:7;:14;22348:5;22340:14;;;;;;;;;;;;;;;:23;;;;;;;;;;;;22326:37;;22384:1007;22390:4;22384:1007;;;22442:1;22427:17;;:3;:17;;;22424:27;;;22446:5;;22424:27;22527:28;22551:3;22527:23;:28::i;:::-;22611:13;22587:7;:12;22595:3;22587:12;;;;;;;;;;;;;;;:21;;;:37;22584:754;;;22662:24;22728:1;22712:13;:17;22709:118;;;22772:18;22805:1;22791:13;:15;22772:35;;;;;;;;;;;;;;;;22753:54;;22709:118;22845:23;22871:18;22912:1;22890:7;:12;22898:3;22890:12;;;;;;;;;;;;;;;:21;;;:23;22871:43;;;;;;;;;;;;;;;;22845:69;;22933:20;23005:3;22985:16;22967:15;:34;22956:7;:46;:52;;;;;;22933:75;;23055:12;23027:7;:12;23035:3;23027:12;;;;;;;;;;;;;;;:24;;;:40;;;;;;;;;;;23120:7;:12;23128:3;23120:12;;;;;;;;;;;;;;;:21;;;23104:37;;23254:14;23291:1;23269:14;:21;;;;:23;23254:39;;;;;;;;;;;;;;;;23237:13;:56;23234:88;;;23317:5;;;;;23234:88;22584:754;;;;23358:7;:12;23366:3;23358:12;;;;;;;;;;;;;;;:21;;;;;;;;;;;;23352:27;;22384:1007;;;21956:1442;;;;;:::o;17748:1538::-;17862:21;17886:7;:14;17894:5;17886:14;;;;;;;;;;;;;;;17862:38;;17911:31;17945:12;:19;17958:5;17945:19;;;;;;;;;;;;;;;17911:53;;18059:12;18033:6;:22;;;:38;;;;;;;;;;;18123:6;:16;;;18092:11;:27;;;:47;;;;;;;;;;;18186:6;:21;;;18150:11;:32;;;:57;;;;;;;;;;;18251:6;:18;;;18218:11;:29;;;:51;;;;;;;;;;;18319:6;:24;;;18280:11;:35;;;:63;;;;;;;;;;;18395:6;:26;;;18354:11;:37;;;:67;;;;;;;;;;;18502:12;18483:15;;:31;;;;;;;;;;;18544:6;:16;;;18525:15;;:35;;;;;;;;;;;18595:6;:21;;;18571:20;;:45;;;;;;;;;;;18648:6;:18;;;18627:17;;:39;;;;;;;;;;;18704:6;:24;;;18677:23;;:51;;;;;;;;;;;18768:6;:26;;;18739:25;;:55;;;;;;;;;;;18806:23;18870:3;7572:1;18833:12;:34;:40;;;;;;18806:68;;18909:15;18885:20;;:39;;;;;;;;;;;19036:15;18989:7;:31;18997:22;;;;;;;;;;;18989:31;;;;;;;;;;;;;;;:43;;;:62;;;;;;;;;;;19128:1;19109:6;:16;;:20;;;;19164:1;19140:6;:21;;:25;;;;19197:1;19176:6;:18;;:22;;;;19236:1;19209:6;:24;;:28;;;;19277:1;19248:6;:26;;:30;;;;17748:1538;;;;;:::o;25325:288::-;25439:20;25477:22;25508:14;25502:2;:20;25477:45;;25558:14;25548:7;:24;25533:39;;25586:19;25325:288;;;;:::o;31014:437::-;31082:10;31077:367;31106:12;:19;;;;31098:5;:27;31077:367;;;31177:5;31154:28;;:12;31167:5;31154:19;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;31151:282;;;31207:6;31216:5;31207:14;;31202:131;31247:1;31227:12;:19;;;;:21;31223:1;:25;31202:131;;;31296:12;31311:1;31309;:3;31296:17;;;;;;;;;;;;;;;;;;;;;;;;;31278:12;31291:1;31278:15;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;31250:3;;;;;;;31202:131;;;;31358:12;31391:1;31371:12;:19;;;;:21;31358:35;;;;;;;;;;;;;;;;31351:42;;;;;;;;;;;31412:5;;31151:282;31127:7;;;;;;;31077:367;;;;31014:437;:::o;26524:1555::-;26639:13;26712:25;26740;26766:1;26740:28;;;;;;;;;;;;;;;;26712:56;;26793:9;26789:227;26812:20;:27;;;;26808:1;:31;26789:227;;;26891:6;26864:20;26885:1;26864:23;;;;;;;;;;;;;;;;:33;26861:144;;;26937:25;26963:1;26937:28;;;;;;;;;;;;;;;;26917:48;;26984:5;;26861:144;26841:3;;;;;;;26789:227;;;;27084:20;27107:46;27123:7;27132:20;;27107:15;:46::i;:::-;27084:69;;27212:5;27207:2;27187:17;27172:12;:32;:37;;;;;;:45;;;;;;27164:53;;27249:1;27241:5;:9;27238:811;;;27370:63;27386:21;27408:1;27386:24;;;;;;;;;;;;;;;;27412:20;;27370:15;:63::i;:::-;27351:15;;:82;27348:175;;27504:3;27476:21;27498:1;27476:24;;;;;;;;;;;;;;;;27470:3;:30;27461:5;:40;:46;;;;;;27453:54;;27348:175;27628:63;27644:21;27666:1;27644:24;;;;;;;;;;;;;;;;27670:20;;27628:15;:63::i;:::-;27609:15;;:82;27606:175;;27762:3;27734:21;27756:1;27734:24;;;;;;;;;;;;;;;;27728:3;:30;27719:5;:40;:46;;;;;;27711:54;;27606:175;27885:63;27901:21;27923:1;27901:24;;;;;;;;;;;;;;;;27927:20;;27885:15;:63::i;:::-;27866:15;;:82;27863:175;;28019:3;27991:21;28013:1;27991:24;;;;;;;;;;;;;;;;27985:3;:30;27976:5;:40;:46;;;;;;27968:54;;27863:175;27238:811;28059:12;;26524:1555;;;;:::o;24025:697::-;24125:13;24156:26;24185:7;:14;24193:5;24185:14;;;;;;;;;;;;;;;:24;;24156:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24230:26;24271:28;24318:9;24314:340;24332:9;:16;24330:1;:18;24314:340;;;24368:11;24382:9;24392:1;24382:12;;;;;;;;;;;;;;24368:26;;24433:12;:17;24446:3;24433:17;;;;;;;;;;;;;;;:38;;;24409:62;;;;24530:18;24489:12;:17;24502:3;24489:17;;;;;;;;;;;;;;;:38;;;:59;24486:157;;;24589:12;:17;24602:3;24589:17;;;;;;;;;;;;;;;:38;;;24568:59;;24486:157;24314:340;24349:3;;;;;;;24314:340;;;;24695:18;24672:20;:41;24664:50;;;;;24025:697;;;:::o;152:174::-;210:9;237:1;232;:6;228:37;;;256:1;249:8;;;;228:37;279:1;275;:5;271:9;;303:1;298;294;:5;;;;;;:10;287:18;;;;152:174;;;;;:::o;25687:701::-;25763:21;25787:7;:14;25795:5;25787:14;;;;;;;;;;;;;;;25763:38;;25818:9;25814:567;25837:6;:15;;:22;;;;25833:1;:26;25814:567;;;25895:25;25923:6;:15;;25939:1;25923:18;;;;;;;;;;;;;;;;;;25895:46;;25958:12;25994:3;:8;;;25973:6;:18;;;:29;:61;;26026:3;:8;;;25973:61;;;26005:6;:18;;;25973:61;25958:76;;26049:10;26080:3;:10;;;26062:15;:28;:68;;26114:15;26062:68;;;26093:3;:10;;;26062:68;26049:81;;26157:2;26150:4;:9;:28;;;;;26177:1;26163:3;:10;;;;;;;;;;;;:15;;;26150:28;26147:223;;;26199:19;26221:44;26243:3;:10;;;26254:3;:10;;;26221:21;:44::i;:::-;26199:66;;26349:5;26341:4;26336:2;:9;26321:11;:25;:33;;;;;;26284:6;:15;;26300:1;26284:18;;;;;;;;;;;;;;;;;;:33;;;:70;;;;;;;;;;;26147:223;;25814:567;;;25861:3;;;;;;;25814:567;;;;25687:701;;:::o;30209:718::-;30296:13;30327:21;30351:7;:14;30359:5;30351:14;;;;;;;;;;;;;;;30327:38;;30382:9;30378:519;30401:6;:15;;:22;;;;30397:1;:26;30378:519;;;30445:25;30473:6;:15;;30489:1;30473:18;;;;;;;;;;;;;;;;;;30445:46;;30742:1;30728:3;:10;;;;;;;;;;;;:15;;;30725:161;;;30764:19;30786:45;30808:3;:10;;;30820:3;:10;;;30786:21;:45::i;:::-;30764:67;;30859:11;30850:20;;;;30725:161;;30378:519;30425:3;;;;;;;30378:519;;;;30907:12;30209:718;;;:::o;23471:485::-;23596:32;23631:33;23658:5;23631:26;:33::i;:::-;23596:68;;23685:16;23720:7;23716:188;23735:14;:21;;;;23731:1;:25;;;23716:188;;;23808:18;23827:1;23808:21;;;;;;;;;;;;;;;;;;23780:24;:49;23777:116;;23860:14;23875:1;23860:17;;;;;;;;;;;;;;;;;;23849:28;;23777:116;23758:3;;;;;;;23716:188;;;;23940:8;23914:7;:14;23922:5;23914:14;;;;;;;;;;;;;;;:23;;:34;;;;23471:485;;;:::o

Swarm Source

ipfs://d480b4cb0fa1aeaa8d10263b93267be0e12ae97d2a654ca1f13b45fe6da29d92
Block Transaction Gas Used Reward
Age Block Fee Address Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading