Contract 0x8F5EE036492342F8f83FdcF9093745C01a1603f2

 

Contract Overview

Balance:
0.0079883538116595 Ether

EtherValue:
$12.13 (@ $1,518.84/ETH)

Token:
Txn Hash
Block
From
To
Value
0x90e3a8a173f680d91423a19e0b020e09e5d47289e463da41b3c1d5d85cdf9009112608432020-11-15 6:45:11109 days 15 hrs ago0xcb5410f9598f09bfbf2b51d57e4e26f8f4989fff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.00074692222
0xa0bab7f6d4487cc6009d20553ca348e2af4e2dedcfa74393d95de112c973bdca112608222020-11-15 6:40:03109 days 15 hrs ago0xcb5410f9598f09bfbf2b51d57e4e26f8f4989fff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20.0008 Ether0.003902219122.1
0x19d9d3f30a8fc36df0b5d4002cb5435106963aea46f603501ece36ab985ca8f9112607772020-11-15 6:29:55109 days 16 hrs ago0xcb5410f9598f09bfbf2b51d57e4e26f8f4989fff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20.0008 Ether0.0038316620
0xac3e913daaf26bbc33a2a574d9aa6d2246d45afaac2ec580357eaf545c995e01112607672020-11-15 6:26:37109 days 16 hrs ago0xcb5410f9598f09bfbf2b51d57e4e26f8f4989fff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0010396220
0xac542cb06f2fa863461435af4f05c54205dabf1766d8be036d3ed1cdb9ea9382111516092020-10-29 12:15:40126 days 10 hrs ago0x64823b19255825a0db8a9fc34b032ade9fba7b83 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20.0008 Ether0.00224343999
0xa7e66ec66281d8bbc10a44b48c3ff2b459ab8542f0649667bb8ed4c5cdc8a97699700242020-04-29 21:51:38309 days 40 mins ago0xdf9b4823e43b7bf4c89d068c198496568d5bae85 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0002524812
0xab8cf6766073b25b52ee1464a07a5785f2df8617803b1757e934dce7b4867d5799547242020-04-27 13:10:30311 days 9 hrs ago0xdf9b4823e43b7bf4c89d068c198496568d5bae85 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0001792648
0x93e163c2765a53fd3c4bb6e80fc5cb2eb2eb07f429dc42853ed1224d322608d498813772020-04-16 4:35:08322 days 17 hrs ago0x00004242181ac91013ba0201202f623f7240e8c5 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0002262
0x7518551d710136ce3be8971c064de59b5bd39bd3f3a9ca9307a49adbb8a9e26298812792020-04-16 4:12:40322 days 18 hrs ago0xd8e37018265f307e3a4f9dbceaa64e94021e1e7c IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20.0008 Ether0.0008827955
0x08ed6ee4776af41f977c308905d214a7b30a1cb915251048515165122f69d2e098812782020-04-16 4:12:19322 days 18 hrs ago0xd8e37018265f307e3a4f9dbceaa64e94021e1e7c IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0002597855
0x97a277f92f086d0e34d06261528fd08390ef0c95b41b16c3fd3b14236169ae4895322632020-02-22 9:14:55376 days 13 hrs ago0x9ac53e2e2b4b392b84a8f1c1c1145de749feb76d IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0000315991
0xbb02d541f1c4514ad242349a13fcaad1980aeaa1011fd3114795b2def31443b295283442020-02-21 18:56:23377 days 3 hrs ago0x9ac53e2e2b4b392b84a8f1c1c1145de749feb76d IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0000519571
0xca41d454905d4dd77a622f10652fb0e9f3faf787ed54b3ae993bdcd49f10cc4c92549162020-01-10 19:18:45419 days 3 hrs ago0x3fcc3b7d08d1e9826abe29e35335520b9d18c1c6 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0001895946
0x959656c6044aa448aeb08b096d4dabddea2c5f920701f850bc895b73dacd5b3e92549022020-01-10 19:14:51419 days 3 hrs ago0x3fcc3b7d08d1e9826abe29e35335520b9d18c1c6 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0003117426
0xdb3ef553bf84d71fd8813299d0c457790e21f7f1f0e089584d63ee3dee05f1e992197442020-01-05 10:04:27424 days 12 hrs ago0x68c44877a80f7768ad71de9f2e3fa11cc7690b3e IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0000252351
0xd0da8b38cd34eaf860b4346ff7cf212219223314c64fb8ca97eaac39c46d859692197362020-01-05 10:03:17424 days 12 hrs ago0x68c44877a80f7768ad71de9f2e3fa11cc7690b3e IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0000252591
0x02e532f4e510f440e3cd3babf1d1e387af88ef6ee50d74eec4a7c23b96a7d49e92053812020-01-03 5:35:02426 days 16 hrs ago0xe16a99e36bd1ed9f93ea315694fe9363e27b9c9d IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.000044842
0x0aa56d2101c1f9114e57a773e3e9f8579e11cca946e4ecddc72bf249ad7ba19591841272019-12-30 4:13:42430 days 18 hrs ago0xbb114d9198c44bdd66ad85b5b31c884e63d4e393 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.00014173066.325
0xbfbf8c12ec385460d579322f2c1e9e1ad89713ea7d68e61bdb4cef3cc66092cf91841232019-12-30 4:12:57430 days 18 hrs ago0xbb114d9198c44bdd66ad85b5b31c884e63d4e393 IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0001344486
0x9e533b79e08cfca957d06d6751298b91d7acc28f2423f784e30007ef1d308aaf91816322019-12-29 16:16:29431 days 6 hrs ago0x000042422f5190255552082df8cfdc3e8fdea65c IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0001675782
0x34f91ad71c1b0c70c3a9e0a70d62b91b3702474b70388979e26568123299ab0391816292019-12-29 16:15:54431 days 6 hrs ago0x2026001855172dc690233021e51a3cd1b54aa5ff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20.0008 Ether0.0003531662
0xd344b80024785e848b694d3516104621c75ac054a83f6417da5a082f8677226191816232019-12-29 16:13:56431 days 6 hrs ago0x2026001855172dc690233021e51a3cd1b54aa5ff IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0001109433
0x9a97d30e8c8db3b5380a8d7cb9289b2c97991cbcc02da9317b716d56105fff8c91651542019-12-26 9:48:16434 days 12 hrs ago0x8f737f1d3cf37f60a4840582403f1e4aee98296e IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.00005549062.2
0xbb063e55b0923b9b0f0883adb66010de1202d0244857f601d74bb13731adcfe989512052019-11-17 15:32:48473 days 6 hrs ago0x10050f54b33a9a30f71ec089a68ca5b4f275271c IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.0002326328
0x15f7f31384ba3d01c1924794e98c8eea0dca6e35b91f39190ff9604780cd2d6b89511982019-11-17 15:31:02473 days 7 hrs ago0x00004242b0c63a1a65a522dba6ab05d943d18cfb IN  0x8f5ee036492342f8f83fdcf9093745c01a1603f20 Ether0.000219982
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xa0bab7f6d4487cc6009d20553ca348e2af4e2dedcfa74393d95de112c973bdca112608222020-11-15 6:40:03109 days 15 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00052599536337065 Ether
0x19d9d3f30a8fc36df0b5d4002cb5435106963aea46f603501ece36ab985ca8f9112607772020-11-15 6:29:55109 days 16 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00052599536337065 Ether
0x7518551d710136ce3be8971c064de59b5bd39bd3f3a9ca9307a49adbb8a9e26298812792020-04-16 4:12:40322 days 18 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00072398107950495 Ether
0x34f91ad71c1b0c70c3a9e0a70d62b91b3702474b70388979e26568123299ab0391816292019-12-29 16:15:54431 days 6 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.00072916392363395 Ether
0xb293a1eb810408318fb9701b12eb2e2b935c4f686b4539417e5bc790cf13123189511962019-11-17 15:30:45473 days 7 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xf681612ef82d0639bcec9411698fb84c335b5ca25e47676dc5d1407a7369fa3888924322019-11-07 21:47:11483 days 45 mins ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xed114dc8cc3a2fc7da183f6602b7f8412d4ac9f1f7d9b4d832c9266d19e22d8d88924272019-11-07 21:46:12483 days 46 mins ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x741b2d98e32eb18fa7c54dfcb05cefe9ad8cf665c5c1556a2b41059d11b0eebf88924232019-11-07 21:45:11483 days 47 mins ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x950cc5177ac51df02a506ae78879ea0f88e8e51f2827b6285bbd8679cf11373988923942019-11-07 21:40:01483 days 52 mins ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xd51504c74c7d2f4264b720684b5773bb90bb6bada5cb6dac7d542a6d33e7075688923772019-11-07 21:34:47483 days 57 mins ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x831d2aa44077bb7fd0e587fb3c13b30b36ccf26963f004fad6faf0f07cd52d1988655992019-11-03 14:17:51487 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x3220a07c1b73f3fea42a59cc5d7e8c7073941cf1777c02c5cc95a2b7206b385087949492019-10-23 5:52:24498 days 16 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x0b4fd6ebcb6b79da65a8f2e80983bd4dc4fde9c2eb7d13baa818e60b76ef7e4f87949382019-10-23 5:48:13498 days 16 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x53d3bb4b3b0811aff49f8d5d39f6b2317084c40ef2411df433348ee79b6ddd4187936782019-10-23 1:14:38498 days 21 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xaa136308024a091a6eca8b5de69a3d03a9e1dcf9dabbd2f639f58603220d149287802742019-10-20 22:34:42500 days 23 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xc19ba9bc9c6535ffe9799d15ca146f1223d97bf7a470c609f1517e483f4b5c9987654662019-10-18 14:38:33503 days 7 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x26f42bcb74c6159c101a26519bfc5ea1c4441c9e392f616be6dc8b8fc9ec89d587654592019-10-18 14:36:17503 days 7 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x10523fd31b7c10919790d2eb796bb3264e9364942fc038b1b5bd6aa3ecab47c087654512019-10-18 14:33:48503 days 7 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x7fb3628b2b24ede6096e86c3fe20bfc6dbd03908859b633e8ce3f7b9d0571c5987654432019-10-18 14:31:06503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x723a791741a363cabb1d2957dea29ce53f028c21d8499e6b32845f1deab53aa087654042019-10-18 14:24:26503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x477010a01c70e80c350621b27cd4c28e9f6cf642dd510a7011f3f073cd5f683b87653992019-10-18 14:23:23503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x26be939c1f4911310f583d73538d581039b59b4c6fcfd76713d057c03bdbb52e87653952019-10-18 14:21:45503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xa9ba11ffcdbd20918e944ba3b1d954612a2a265910b4ef2538fefeaed6ebe84b87653852019-10-18 14:20:24503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0x362bc68b7f347c6c1a54cc2387fe25466c698dc6c695b9b6fd2b0cbb5727610887653302019-10-18 14:11:11503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
0xa06af8992ff544583a473bb52d45509f55eeaf4aaf06ad9eb50e4a29f5193e5b87652442019-10-18 13:50:31503 days 8 hrs ago 0x8f5ee036492342f8f83fdcf9093745c01a1603f2 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0006674798052747 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ShittyDice

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: shittydice_new.sol
pragma solidity >= 0.5.0 < 0.6.0;

import "./provableAPI_0.5.sol";

library SafeMath {
  function add(uint a, uint b) internal pure returns (uint c) {
    c = a + b;
    require(c >= a);
  }
  function sub(uint a, uint b) internal pure returns (uint c) {
    require(b <= a);
    c = a - b;
  }
  function mul(uint a, uint b) internal pure returns (uint c) {
    c = a * b;
    require(a == 0 || c / a == b);
  }
  function div(uint a, uint b) internal pure returns (uint c) {
    require(b > 0);
    c = a / b;
  }
}

interface IERC20 {

  function totalSupply() external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract Owned {
  address public owner;
  address public newOwner;

  event OwnershipTransferred(address indexed _from, address indexed _to);

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

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

  function transferOwnership(address _newOwner) public onlyOwner {
    newOwner = _newOwner;
  }
  function acceptOwnership() public {
    require(msg.sender == newOwner);
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
    newOwner = address(0);
  }
}


contract ShittyDice is usingProvable, Owned {

  using SafeMath for uint;

  constructor() public {
    provable_setProof(proofType_Ledger);
    provable_setCustomGasPrice(5000000000);
  }
  uint256 GAS_FOR_CALLBACK = 200000;

  event LogNewProvableQuery(string description);

  event playerRoll(address player, uint256 betamount, bytes32 queryId);
  event playerWithdrawal(address player, uint256 amount);
  event playerDeposit(address player, uint256 amount);
  event rolloutcome(address player, uint256 betamount, uint256 payout, uint256 outcome, bytes32 queryId);


  struct sidestruct {
    uint256 m;
    uint256 d;
  }

  uint256 public sides;

  struct proll {
    uint256 outcome;
    address addr;
    uint256 amount;
  }

  mapping(uint256 => sidestruct) public sideoutcome;
  mapping(address => uint256) public balance;

  mapping(bytes32 => proll) public playerrolls;


  IERC20 SHIT = IERC20(0xaa7FB1c8cE6F18d4fD4Aabb61A2193d4D441c54F);

  //PLAYER FUNCTIONS
  function Roll(uint256 amount) payable public {
    require(amount <= balance[msg.sender]);
    require(balance[address(this)] >= amount * 4);

    if (provable_getPrice("random") > msg.value) {
      emit LogNewProvableQuery("you need to pay for gas, bitch");
    }
    else {
      balance[msg.sender] = balance[msg.sender].sub(amount);
      balance[address(this)] = balance[address(this)].add(amount);

      uint256 QUERY_EXECUTION_DELAY = 0;

      bytes32 _queryId =  provable_newRandomDSQuery(
        QUERY_EXECUTION_DELAY,
        NUM_RANDOM_BYTES_REQUESTED,
        GAS_FOR_CALLBACK
      );

      playerrolls[_queryId].addr = msg.sender;
      playerrolls[_queryId].amount = amount;

      emit playerRoll(msg.sender, amount, _queryId);
    }
  }

  function deposit(uint256 amount) public {
    SHIT.transferFrom(msg.sender, address(this), amount);
    balance[msg.sender] = balance[msg.sender].add(amount);
    emit playerDeposit(msg.sender, amount);
  }

  function withdrawal(uint256 amount) public {
    require(balance[msg.sender] >= amount);
    balance[msg.sender] = balance[msg.sender].sub(amount);
    SHIT.transfer(msg.sender, amount);
    emit playerWithdrawal(msg.sender, amount);
  }
  //VIEW FUNCTIONS
  function viewbal(address _addr) public view returns(uint256){
    return(balance[_addr]);
  }
  //ADMIN ONLY FUNCTIONS
  function setsides(uint256 _sides) public onlyOwner() {
    sides = _sides;
  }
  function setsideoutcome(uint256 _side, uint256 _m, uint256 _d) public onlyOwner() {
    sideoutcome[_side].m = _m;
    sideoutcome[_side].d = _d;
  }
  function admindeposit(IERC20 token, uint256 amount) public onlyOwner() {
    token.transferFrom(msg.sender, address(this), amount);
    if (token == SHIT) {
      balance[address(this)] = balance[address(this)].add(amount);
    }
  }
  function adminwithdrawal(IERC20 token, uint256 amount) public onlyOwner() {
    if (token == SHIT) {
      require(balance[address(this)] >= amount);
      balance[address(this)] = balance[address(this)].sub(amount);
    }
    token.transfer(msg.sender, amount);
  }
  function clearETH() public onlyOwner() {
    address payable _owner = msg.sender;
    _owner.transfer(address(this).balance);
  }
  function setprovablegasprice(uint256 _price) public onlyOwner() {
    provable_setCustomGasPrice(_price);
  }
  function setgasforcallback(uint256 _gas) public onlyOwner() {
    GAS_FOR_CALLBACK = _gas;
  }




  uint256 constant MAX_INT_FROM_BYTE = 256;
  uint256 constant NUM_RANDOM_BYTES_REQUESTED = 7;



  function __callback(
    bytes32 _queryId,
    string memory _result,
    bytes memory _proof
  )
  public
  {
    require(msg.sender == provable_cbAddress());

    if (
      provable_randomDS_proofVerify__returnCode(
        _queryId,
        _result,
        _proof
      ) != 0
    ) {

    } else {

      if(playerrolls[_queryId].outcome == 0){
        uint256 _rnum = uint256(keccak256(abi.encodePacked(_result))) % sides + 1;
        address addr = playerrolls[_queryId].addr;
        uint256 amount = playerrolls[_queryId].amount;
        playerrolls[_queryId].outcome = _rnum;
        uint256 tmp;

        if (sideoutcome[_rnum].m != 0) {
          tmp = amount.mul(sideoutcome[_rnum].m);
          tmp = tmp.div(sideoutcome[_rnum].d);
          balance[addr] = balance[addr].add(tmp);
          balance[address(this)] = balance[address(this)].sub(tmp);
        }

        emit rolloutcome(addr, amount, tmp, _rnum, _queryId);
      }

    }
  }
  function() external payable {

  }
}

File 1 of 2: provableAPI_0.5.sol
// <provableAPI>
/*


Copyright (c) 2015-2016 Oraclize SRL
Copyright (c) 2016-2019 Oraclize LTD
Copyright (c) 2019 Provable Things Limited

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

*/
pragma solidity >= 0.5.0 < 0.6.0; // Incompatible compiler version - please select a compiler within the stated pragma range, or use a different version of the provableAPI!

// Dummy contract only used to emit to end-user they are using wrong solc
contract solcChecker {
/* INCOMPATIBLE SOLC: import the following instead: "github.com/oraclize/ethereum-api/oraclizeAPI_0.4.sol" */ function f(bytes calldata x) external;
}

contract ProvableI {

    address public cbAddress;

    function setProofType(byte _proofType) external;
    function setCustomGasPrice(uint _gasPrice) external;
    function getPrice(string memory _datasource) public returns (uint _dsprice);
    function randomDS_getSessionPubKeyHash() external view returns (bytes32 _sessionKeyHash);
    function getPrice(string memory _datasource, uint _gasLimit) public returns (uint _dsprice);
    function queryN(uint _timestamp, string memory _datasource, bytes memory _argN) public payable returns (bytes32 _id);
    function query(uint _timestamp, string calldata _datasource, string calldata _arg) external payable returns (bytes32 _id);
    function query2(uint _timestamp, string memory _datasource, string memory _arg1, string memory _arg2) public payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string calldata _datasource, string calldata _arg, uint _gasLimit) external payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string calldata _datasource, bytes calldata _argN, uint _gasLimit) external payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string calldata _datasource, string calldata _arg1, string calldata _arg2, uint _gasLimit) external payable returns (bytes32 _id);
}

contract OracleAddrResolverI {
    function getAddress() public returns (address _address);
}
/*

Begin solidity-cborutils

https://github.com/smartcontractkit/solidity-cborutils

MIT License

Copyright (c) 2018 SmartContract ChainLink, Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

*/
library Buffer {

    struct buffer {
        bytes buf;
        uint capacity;
    }

    function init(buffer memory _buf, uint _capacity) internal pure {
        uint capacity = _capacity;
        if (capacity % 32 != 0) {
            capacity += 32 - (capacity % 32);
        }
        _buf.capacity = capacity; // Allocate space for the buffer data
        assembly {
            let ptr := mload(0x40)
            mstore(_buf, ptr)
            mstore(ptr, 0)
            mstore(0x40, add(ptr, capacity))
        }
    }

    function resize(buffer memory _buf, uint _capacity) private pure {
        bytes memory oldbuf = _buf.buf;
        init(_buf, _capacity);
        append(_buf, oldbuf);
    }

    function max(uint _a, uint _b) private pure returns (uint _max) {
        if (_a > _b) {
            return _a;
        }
        return _b;
    }
    /**
      * @dev Appends a byte array to the end of the buffer. Resizes if doing so
      *      would exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      * @return The original buffer.
      *
      */
    function append(buffer memory _buf, bytes memory _data) internal pure returns (buffer memory _buffer) {
        if (_data.length + _buf.buf.length > _buf.capacity) {
            resize(_buf, max(_buf.capacity, _data.length) * 2);
        }
        uint dest;
        uint src;
        uint len = _data.length;
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            dest := add(add(bufptr, buflen), 32) // Start address = buffer address + buffer length + sizeof(buffer length)
            mstore(bufptr, add(buflen, mload(_data))) // Update buffer length
            src := add(_data, 32)
        }
        for(; len >= 32; len -= 32) { // Copy word-length chunks while possible
            assembly {
                mstore(dest, mload(src))
            }
            dest += 32;
            src += 32;
        }
        uint mask = 256 ** (32 - len) - 1; // Copy remaining bytes
        assembly {
            let srcpart := and(mload(src), not(mask))
            let destpart := and(mload(dest), mask)
            mstore(dest, or(destpart, srcpart))
        }
        return _buf;
    }
    /**
      *
      * @dev Appends a byte to the end of the buffer. Resizes if doing so would
      * exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      * @return The original buffer.
      *
      */
    function append(buffer memory _buf, uint8 _data) internal pure {
        if (_buf.buf.length + 1 > _buf.capacity) {
            resize(_buf, _buf.capacity * 2);
        }
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            let dest := add(add(bufptr, buflen), 32) // Address = buffer address + buffer length + sizeof(buffer length)
            mstore8(dest, _data)
            mstore(bufptr, add(buflen, 1)) // Update buffer length
        }
    }
    /**
      *
      * @dev Appends a byte to the end of the buffer. Resizes if doing so would
      * exceed the capacity of the buffer.
      * @param _buf The buffer to append to.
      * @param _data The data to append.
      * @return The original buffer.
      *
      */
    function appendInt(buffer memory _buf, uint _data, uint _len) internal pure returns (buffer memory _buffer) {
        if (_len + _buf.buf.length > _buf.capacity) {
            resize(_buf, max(_buf.capacity, _len) * 2);
        }
        uint mask = 256 ** _len - 1;
        assembly {
            let bufptr := mload(_buf) // Memory address of the buffer data
            let buflen := mload(bufptr) // Length of existing buffer data
            let dest := add(add(bufptr, buflen), _len) // Address = buffer address + buffer length + sizeof(buffer length) + len
            mstore(dest, or(and(mload(dest), not(mask)), _data))
            mstore(bufptr, add(buflen, _len)) // Update buffer length
        }
        return _buf;
    }
}

library CBOR {

    using Buffer for Buffer.buffer;

    uint8 private constant MAJOR_TYPE_INT = 0;
    uint8 private constant MAJOR_TYPE_MAP = 5;
    uint8 private constant MAJOR_TYPE_BYTES = 2;
    uint8 private constant MAJOR_TYPE_ARRAY = 4;
    uint8 private constant MAJOR_TYPE_STRING = 3;
    uint8 private constant MAJOR_TYPE_NEGATIVE_INT = 1;
    uint8 private constant MAJOR_TYPE_CONTENT_FREE = 7;

    function encodeType(Buffer.buffer memory _buf, uint8 _major, uint _value) private pure {
        if (_value <= 23) {
            _buf.append(uint8((_major << 5) | _value));
        } else if (_value <= 0xFF) {
            _buf.append(uint8((_major << 5) | 24));
            _buf.appendInt(_value, 1);
        } else if (_value <= 0xFFFF) {
            _buf.append(uint8((_major << 5) | 25));
            _buf.appendInt(_value, 2);
        } else if (_value <= 0xFFFFFFFF) {
            _buf.append(uint8((_major << 5) | 26));
            _buf.appendInt(_value, 4);
        } else if (_value <= 0xFFFFFFFFFFFFFFFF) {
            _buf.append(uint8((_major << 5) | 27));
            _buf.appendInt(_value, 8);
        }
    }

    function encodeIndefiniteLengthType(Buffer.buffer memory _buf, uint8 _major) private pure {
        _buf.append(uint8((_major << 5) | 31));
    }

    function encodeUInt(Buffer.buffer memory _buf, uint _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_INT, _value);
    }

    function encodeInt(Buffer.buffer memory _buf, int _value) internal pure {
        if (_value >= 0) {
            encodeType(_buf, MAJOR_TYPE_INT, uint(_value));
        } else {
            encodeType(_buf, MAJOR_TYPE_NEGATIVE_INT, uint(-1 - _value));
        }
    }

    function encodeBytes(Buffer.buffer memory _buf, bytes memory _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_BYTES, _value.length);
        _buf.append(_value);
    }

    function encodeString(Buffer.buffer memory _buf, string memory _value) internal pure {
        encodeType(_buf, MAJOR_TYPE_STRING, bytes(_value).length);
        _buf.append(bytes(_value));
    }

    function startArray(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_ARRAY);
    }

    function startMap(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_MAP);
    }

    function endSequence(Buffer.buffer memory _buf) internal pure {
        encodeIndefiniteLengthType(_buf, MAJOR_TYPE_CONTENT_FREE);
    }
}
/*

End solidity-cborutils

*/
contract usingProvable {

    using CBOR for Buffer.buffer;

    ProvableI provable;
    OracleAddrResolverI OAR;

    uint constant day = 60 * 60 * 24;
    uint constant week = 60 * 60 * 24 * 7;
    uint constant month = 60 * 60 * 24 * 30;

    byte constant proofType_NONE = 0x00;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    byte constant proofType_Android = 0x40;
    byte constant proofType_TLSNotary = 0x10;

    string provable_network_name;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_consensys = 161;

    mapping(bytes32 => bytes32) provable_randomDS_args;
    mapping(bytes32 => bool) provable_randomDS_sessionKeysHashVerified;

    modifier provableAPI {
        if ((address(OAR) == address(0)) || (getCodeSize(address(OAR)) == 0)) {
            provable_setNetwork(networkID_auto);
        }
        if (address(provable) != OAR.getAddress()) {
            provable = ProvableI(OAR.getAddress());
        }
        _;
    }

    modifier provable_randomDS_proofVerify(bytes32 _queryId, string memory _result, bytes memory _proof) {
        // RandomDS Proof Step 1: The prefix has to match 'LP\x01' (Ledger Proof version 1)
        require((_proof[0] == "L") && (_proof[1] == "P") && (uint8(_proof[2]) == uint8(1)));
        bool proofVerified = provable_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), provable_getNetworkName());
        require(proofVerified);
        _;
    }

    function provable_setNetwork(uint8 _networkID) internal returns (bool _networkSet) {
      _networkID; // NOTE: Silence the warning and remain backwards compatible
      return provable_setNetwork();
    }

    function provable_setNetworkName(string memory _network_name) internal {
        provable_network_name = _network_name;
    }

    function provable_getNetworkName() internal view returns (string memory _networkName) {
        return provable_network_name;
    }

    function provable_setNetwork() internal returns (bool _networkSet) {
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed) > 0) { //mainnet
            OAR = OracleAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            provable_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1) > 0) { //ropsten testnet
            OAR = OracleAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            provable_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e) > 0) { //kovan testnet
            OAR = OracleAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            provable_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48) > 0) { //rinkeby testnet
            OAR = OracleAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            provable_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0xa2998EFD205FB9D4B4963aFb70778D6354ad3A41) > 0) { //goerli testnet
            OAR = OracleAddrResolverI(0xa2998EFD205FB9D4B4963aFb70778D6354ad3A41);
            provable_setNetworkName("eth_goerli");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475) > 0) { //ethereum-bridge
            OAR = OracleAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF) > 0) { //ether.camp ide
            OAR = OracleAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA) > 0) { //browser-solidity
            OAR = OracleAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }
    /**
     * @dev The following `__callback` functions are just placeholders ideally
     *      meant to be defined in child contract when proofs are used.
     *      The function bodies simply silence compiler warnings.
     */
    function __callback(bytes32 _myid, string memory _result) public {
        __callback(_myid, _result, new bytes(0));
    }

    function __callback(bytes32 _myid, string memory _result, bytes memory _proof) public {
      _myid; _result; _proof;
      provable_randomDS_args[bytes32(0)] = bytes32(0);
    }

    function provable_getPrice(string memory _datasource) provableAPI internal returns (uint _queryPrice) {
        return provable.getPrice(_datasource);
    }

    function provable_getPrice(string memory _datasource, uint _gasLimit) provableAPI internal returns (uint _queryPrice) {
        return provable.getPrice(_datasource, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query.value(price)(0, _datasource, _arg);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query.value(price)(_timestamp, _datasource, _arg);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource,_gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query_withGasLimit.value(price)(_timestamp, _datasource, _arg, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
           return 0; // Unexpectedly high price
        }
        return provable.query_withGasLimit.value(price)(0, _datasource, _arg, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg1, string memory _arg2) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query2.value(price)(0, _datasource, _arg1, _arg2);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg1, string memory _arg2) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        return provable.query2.value(price)(_timestamp, _datasource, _arg1, _arg2);
    }

    function provable_query(uint _timestamp, string memory _datasource, string memory _arg1, string memory _arg2, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query2_withGasLimit.value(price)(_timestamp, _datasource, _arg1, _arg2, _gasLimit);
    }

    function provable_query(string memory _datasource, string memory _arg1, string memory _arg2, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        return provable.query2_withGasLimit.value(price)(0, _datasource, _arg1, _arg2, _gasLimit);
    }

    function provable_query(string memory _datasource, string[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN.value(price)(0, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN.value(price)(_timestamp, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN_withGasLimit.value(price)(_timestamp, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, string[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = stra2cbor(_argN);
        return provable.queryN_withGasLimit.value(price)(0, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, string[1] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[1] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[2] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[2] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[3] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[3] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[4] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[4] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[5] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[5] memory _args) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, string[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, string[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN.value(price)(0, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[] memory _argN) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource);
        if (price > 1 ether + tx.gasprice * 200000) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN.value(price)(_timestamp, _datasource, args);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN_withGasLimit.value(price)(_timestamp, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[] memory _argN, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        uint price = provable.getPrice(_datasource, _gasLimit);
        if (price > 1 ether + tx.gasprice * _gasLimit) {
            return 0; // Unexpectedly high price
        }
        bytes memory args = ba2cbor(_argN);
        return provable.queryN_withGasLimit.value(price)(0, _datasource, args, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[1] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[1] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[1] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = _args[0];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[2] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[2] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[2] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[3] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[3] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[3] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[4] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[4] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[4] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[5] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[5] memory _args) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs);
    }

    function provable_query(uint _timestamp, string memory _datasource, bytes[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_timestamp, _datasource, dynargs, _gasLimit);
    }

    function provable_query(string memory _datasource, bytes[5] memory _args, uint _gasLimit) provableAPI internal returns (bytes32 _id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = _args[0];
        dynargs[1] = _args[1];
        dynargs[2] = _args[2];
        dynargs[3] = _args[3];
        dynargs[4] = _args[4];
        return provable_query(_datasource, dynargs, _gasLimit);
    }

    function provable_setProof(byte _proofP) provableAPI internal {
        return provable.setProofType(_proofP);
    }


    function provable_cbAddress() provableAPI internal returns (address _callbackAddress) {
        return provable.cbAddress();
    }

    function getCodeSize(address _addr) view internal returns (uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function provable_setCustomGasPrice(uint _gasPrice) provableAPI internal {
        return provable.setCustomGasPrice(_gasPrice);
    }

    function provable_randomDS_getSessionPubKeyHash() provableAPI internal returns (bytes32 _sessionKeyHash) {
        return provable.randomDS_getSessionPubKeyHash();
    }

    function parseAddr(string memory _a) internal pure returns (address _parsedAddress) {
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i = 2; i < 2 + 2 * 20; i += 2) {
            iaddr *= 256;
            b1 = uint160(uint8(tmp[i]));
            b2 = uint160(uint8(tmp[i + 1]));
            if ((b1 >= 97) && (b1 <= 102)) {
                b1 -= 87;
            } else if ((b1 >= 65) && (b1 <= 70)) {
                b1 -= 55;
            } else if ((b1 >= 48) && (b1 <= 57)) {
                b1 -= 48;
            }
            if ((b2 >= 97) && (b2 <= 102)) {
                b2 -= 87;
            } else if ((b2 >= 65) && (b2 <= 70)) {
                b2 -= 55;
            } else if ((b2 >= 48) && (b2 <= 57)) {
                b2 -= 48;
            }
            iaddr += (b1 * 16 + b2);
        }
        return address(iaddr);
    }

    function strCompare(string memory _a, string memory _b) internal pure returns (int _returnCode) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) {
            minLength = b.length;
        }
        for (uint i = 0; i < minLength; i ++) {
            if (a[i] < b[i]) {
                return -1;
            } else if (a[i] > b[i]) {
                return 1;
            }
        }
        if (a.length < b.length) {
            return -1;
        } else if (a.length > b.length) {
            return 1;
        } else {
            return 0;
        }
    }

    function indexOf(string memory _haystack, string memory _needle) internal pure returns (int _returnCode) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if (h.length < 1 || n.length < 1 || (n.length > h.length)) {
            return -1;
        } else if (h.length > (2 ** 128 - 1)) {
            return -1;
        } else {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i++) {
                if (h[i] == n[0]) {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex]) {
                        subindex++;
                    }
                    if (subindex == n.length) {
                        return int(i);
                    }
                }
            }
            return -1;
        }
    }

    function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, "", "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory _concatenatedString) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory _concatenatedString) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        uint i = 0;
        for (i = 0; i < _ba.length; i++) {
            babcde[k++] = _ba[i];
        }
        for (i = 0; i < _bb.length; i++) {
            babcde[k++] = _bb[i];
        }
        for (i = 0; i < _bc.length; i++) {
            babcde[k++] = _bc[i];
        }
        for (i = 0; i < _bd.length; i++) {
            babcde[k++] = _bd[i];
        }
        for (i = 0; i < _be.length; i++) {
            babcde[k++] = _be[i];
        }
        return string(babcde);
    }

    function safeParseInt(string memory _a) internal pure returns (uint _parsedInt) {
        return safeParseInt(_a, 0);
    }

    function safeParseInt(string memory _a, uint _b) internal pure returns (uint _parsedInt) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i = 0; i < bresult.length; i++) {
            if ((uint(uint8(bresult[i])) >= 48) && (uint(uint8(bresult[i])) <= 57)) {
                if (decimals) {
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(uint8(bresult[i])) - 48;
            } else if (uint(uint8(bresult[i])) == 46) {
                require(!decimals, 'More than one decimal encountered in string!');
                decimals = true;
            } else {
                revert("Non-numeral character encountered in string!");
            }
        }
        if (_b > 0) {
            mint *= 10 ** _b;
        }
        return mint;
    }

    function parseInt(string memory _a) internal pure returns (uint _parsedInt) {
        return parseInt(_a, 0);
    }

    function parseInt(string memory _a, uint _b) internal pure returns (uint _parsedInt) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i = 0; i < bresult.length; i++) {
            if ((uint(uint8(bresult[i])) >= 48) && (uint(uint8(bresult[i])) <= 57)) {
                if (decimals) {
                   if (_b == 0) {
                       break;
                   } else {
                       _b--;
                   }
                }
                mint *= 10;
                mint += uint(uint8(bresult[i])) - 48;
            } else if (uint(uint8(bresult[i])) == 46) {
                decimals = true;
            }
        }
        if (_b > 0) {
            mint *= 10 ** _b;
        }
        return mint;
    }

    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    function stra2cbor(string[] memory _arr) internal pure returns (bytes memory _cborEncoding) {
        safeMemoryCleaner();
        Buffer.buffer memory buf;
        Buffer.init(buf, 1024);
        buf.startArray();
        for (uint i = 0; i < _arr.length; i++) {
            buf.encodeString(_arr[i]);
        }
        buf.endSequence();
        return buf.buf;
    }

    function ba2cbor(bytes[] memory _arr) internal pure returns (bytes memory _cborEncoding) {
        safeMemoryCleaner();
        Buffer.buffer memory buf;
        Buffer.init(buf, 1024);
        buf.startArray();
        for (uint i = 0; i < _arr.length; i++) {
            buf.encodeBytes(_arr[i]);
        }
        buf.endSequence();
        return buf.buf;
    }

    function provable_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32 _queryId) {
        require((_nbytes > 0) && (_nbytes <= 32));
        _delay *= 10; // Convert from seconds to ledger timer ticks
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(uint8(_nbytes));
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = provable_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            /*
             The following variables can be relaxed.
             Check the relaxed random contract at https://github.com/oraclize/ethereum-examples
             for an idea on how to override and replace commit hash variables.
            */
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes memory delay = new bytes(32);
        assembly {
            mstore(add(delay, 0x20), _delay)
        }
        bytes memory delay_bytes8 = new bytes(8);
        copyBytes(delay, 24, 8, delay_bytes8, 0);
        bytes[4] memory args = [unonce, nbytes, sessionKeyHash, delay];
        bytes32 queryId = provable_query("random", args, _customGasLimit);
        bytes memory delay_bytes8_left = new bytes(8);
        assembly {
            let x := mload(add(delay_bytes8, 0x20))
            mstore8(add(delay_bytes8_left, 0x27), div(x, 0x100000000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x26), div(x, 0x1000000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x25), div(x, 0x10000000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x24), div(x, 0x100000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x23), div(x, 0x1000000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x22), div(x, 0x10000000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x21), div(x, 0x100000000000000000000000000000000000000000000000000))
            mstore8(add(delay_bytes8_left, 0x20), div(x, 0x1000000000000000000000000000000000000000000000000))
        }
        provable_randomDS_setCommitment(queryId, keccak256(abi.encodePacked(delay_bytes8_left, args[1], sha256(args[0]), args[2])));
        return queryId;
    }

    function provable_randomDS_setCommitment(bytes32 _queryId, bytes32 _commitment) internal {
        provable_randomDS_args[_queryId] = _commitment;
    }

    function verifySig(bytes32 _tosignh, bytes memory _dersig, bytes memory _pubkey) internal returns (bool _sigVerified) {
        bool sigok;
        address signer;
        bytes32 sigr;
        bytes32 sigs;
        bytes memory sigr_ = new bytes(32);
        uint offset = 4 + (uint(uint8(_dersig[3])) - 0x20);
        sigr_ = copyBytes(_dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(_dersig, offset + (uint(uint8(_dersig[offset - 1])) - 0x20), 32, sigs_, 0);
        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        (sigok, signer) = safer_ecrecover(_tosignh, 27, sigr, sigs);
        if (address(uint160(uint256(keccak256(_pubkey)))) == signer) {
            return true;
        } else {
            (sigok, signer) = safer_ecrecover(_tosignh, 28, sigr, sigs);
            return (address(uint160(uint256(keccak256(_pubkey)))) == signer);
        }
    }

    function provable_randomDS_proofVerify__sessionKeyValidity(bytes memory _proof, uint _sig2offset) internal returns (bool _proofVerified) {
        bool sigok;
        // Random DS Proof Step 6: Verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(uint8(_proof[_sig2offset + 1])) + 2);
        copyBytes(_proof, _sig2offset, sig2.length, sig2, 0);
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(_proof, 3 + 1, 64, appkey1_pubkey, 0);
        bytes memory tosign2 = new bytes(1 + 65 + 32);
        tosign2[0] = byte(uint8(1)); //role
        copyBytes(_proof, _sig2offset - 65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1 + 65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        if (!sigok) {
            return false;
        }
        // Random DS Proof Step 7: Verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        bytes memory tosign3 = new bytes(1 + 65);
        tosign3[0] = 0xFE;
        copyBytes(_proof, 3, 65, tosign3, 1);
        bytes memory sig3 = new bytes(uint(uint8(_proof[3 + 65 + 1])) + 2);
        copyBytes(_proof, 3 + 65, sig3.length, sig3, 0);
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        return sigok;
    }

    function provable_randomDS_proofVerify__returnCode(bytes32 _queryId, string memory _result, bytes memory _proof) internal returns (uint8 _returnCode) {
        // Random DS Proof Step 1: The prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L") || (_proof[1] != "P") || (uint8(_proof[2]) != uint8(1))) {
            return 1;
        }
        bool proofVerified = provable_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), provable_getNetworkName());
        if (!proofVerified) {
            return 2;
        }
        return 0;
    }

    function matchBytes32Prefix(bytes32 _content, bytes memory _prefix, uint _nRandomBytes) internal pure returns (bool _matchesPrefix) {
        bool match_ = true;
        require(_prefix.length == _nRandomBytes);
        for (uint256 i = 0; i< _nRandomBytes; i++) {
            if (_content[i] != _prefix[i]) {
                match_ = false;
            }
        }
        return match_;
    }

    function provable_randomDS_proofVerify__main(bytes memory _proof, bytes32 _queryId, bytes memory _result, string memory _contextName) internal returns (bool _proofVerified) {
        // Random DS Proof Step 2: The unique keyhash has to match with the sha256 of (context name + _queryId)
        uint ledgerProofLength = 3 + 65 + (uint(uint8(_proof[3 + 65 + 1])) + 2) + 32;
        bytes memory keyhash = new bytes(32);
        copyBytes(_proof, ledgerProofLength, 32, keyhash, 0);
        if (!(keccak256(keyhash) == keccak256(abi.encodePacked(sha256(abi.encodePacked(_contextName, _queryId)))))) {
            return false;
        }
        bytes memory sig1 = new bytes(uint(uint8(_proof[ledgerProofLength + (32 + 8 + 1 + 32) + 1])) + 2);
        copyBytes(_proof, ledgerProofLength + (32 + 8 + 1 + 32), sig1.length, sig1, 0);
        // Random DS Proof Step 3: We assume sig1 is valid (it will be verified during step 5) and we verify if '_result' is the _prefix of sha256(sig1)
        if (!matchBytes32Prefix(sha256(sig1), _result, uint(uint8(_proof[ledgerProofLength + 32 + 8])))) {
            return false;
        }
        // Random DS Proof Step 4: Commitment match verification, keccak256(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8 + 1 + 32);
        copyBytes(_proof, ledgerProofLength + 32, 8 + 1 + 32, commitmentSlice1, 0);
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength + 32 + (8 + 1 + 32) + sig1.length + 65;
        copyBytes(_proof, sig2offset - 64, 64, sessionPubkey, 0);
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (provable_randomDS_args[_queryId] == keccak256(abi.encodePacked(commitmentSlice1, sessionPubkeyHash))) { //unonce, nbytes and sessionKeyHash match
            delete provable_randomDS_args[_queryId];
        } else return false;
        // Random DS Proof Step 5: Validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32 + 8 + 1 + 32);
        copyBytes(_proof, ledgerProofLength, 32 + 8 + 1 + 32, tosign1, 0);
        if (!verifySig(sha256(tosign1), sig1, sessionPubkey)) {
            return false;
        }
        // Verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (!provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash]) {
            provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = provable_randomDS_proofVerify__sessionKeyValidity(_proof, sig2offset);
        }
        return provable_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    */
    function copyBytes(bytes memory _from, uint _fromOffset, uint _length, bytes memory _to, uint _toOffset) internal pure returns (bytes memory _copiedBytes) {
        uint minLength = _length + _toOffset;
        require(_to.length >= minLength); // Buffer too small. Should be a better way?
        uint i = 32 + _fromOffset; // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint j = 32 + _toOffset;
        while (i < (32 + _fromOffset + _length)) {
            assembly {
                let tmp := mload(add(_from, i))
                mstore(add(_to, j), tmp)
            }
            i += 32;
            j += 32;
        }
        return _to;
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
     Duplicate Solidity's ecrecover, but catching the CALL return value
    */
    function safer_ecrecover(bytes32 _hash, uint8 _v, bytes32 _r, bytes32 _s) internal returns (bool _success, address _recoveredAddress) {
        /*
         We do our own memory management here. Solidity uses memory offset
         0x40 to store the current end of memory. We write past it (as
         writes are memory extensions), but don't update the offset so
         Solidity will reuse it. The memory used here is only needed for
         this context.
         FIXME: inline assembly can't access return values
        */
        bool ret;
        address addr;
        assembly {
            let size := mload(0x40)
            mstore(size, _hash)
            mstore(add(size, 32), _v)
            mstore(add(size, 64), _r)
            mstore(add(size, 96), _s)
            ret := call(3000, 1, 0, size, 128, size, 32) // NOTE: we can reuse the request memory because we deal with the return code.
            addr := mload(size)
        }
        return (ret, addr);
    }
    /*
     The following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    */
    function ecrecovery(bytes32 _hash, bytes memory _sig) internal returns (bool _success, address _recoveredAddress) {
        bytes32 r;
        bytes32 s;
        uint8 v;
        if (_sig.length != 65) {
            return (false, address(0));
        }
        /*
         The signature format is a compact form of:
           {bytes32 r}{bytes32 s}{uint8 v}
         Compact means, uint8 is not padded to 32 bytes.
        */
        assembly {
            r := mload(add(_sig, 32))
            s := mload(add(_sig, 64))
            /*
             Here we are loading the last 32 bytes. We exploit the fact that
             'mload' will pad with zeroes if we overread.
             There is no 'mload8' to do this, but that would be nicer.
            */
            v := byte(0, mload(add(_sig, 96)))
            /*
              Alternative solution:
              'byte' is not working due to the Solidity parser, so lets
              use the second best option, 'and'
              v := and(mload(add(_sig, 65)), 255)
            */
        }
        /*
         albeit non-transactional signatures are not specified by the YP, one would expect it
         to match the YP range of [27, 28]
         geth uses [0, 1] and some clients have followed. This might change, see:
         https://github.com/ethereum/go-ethereum/issues/2053
        */
        if (v < 27) {
            v += 27;
        }
        if (v != 27 && v != 28) {
            return (false, address(0));
        }
        return safer_ecrecover(_hash, v, r, s);
    }

    function safeMemoryCleaner() internal pure {
        assembly {
            let fmem := mload(0x40)
            codecopy(fmem, codesize, sub(msize, fmem))
        }
    }
}
// </provableAPI>

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"internalType":"uint256","name":"_gas","type":"uint256"}],"name":"setgasforcallback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_myid","type":"bytes32"},{"internalType":"string","name":"_result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"_queryId","type":"bytes32"},{"internalType":"string","name":"_result","type":"string"},{"internalType":"bytes","name":"_proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"playerrolls","outputs":[{"internalType":"uint256","name":"outcome","type":"uint256"},{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"clearETH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_sides","type":"uint256"}],"name":"setsides","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_side","type":"uint256"},{"internalType":"uint256","name":"_m","type":"uint256"},{"internalType":"uint256","name":"_d","type":"uint256"}],"name":"setsideoutcome","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminwithdrawal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Roll","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"sideoutcome","outputs":[{"internalType":"uint256","name":"m","type":"uint256"},{"internalType":"uint256","name":"d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"viewbal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sides","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"admindeposit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setprovablegasprice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"LogNewProvableQuery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"betamount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"queryId","type":"bytes32"}],"name":"playerRoll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"playerWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"playerDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"betamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payout","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outcome","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"queryId","type":"bytes32"}],"name":"rolloutcome","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405262030d40600755600c80546001600160a01b03191673aa7fb1c8ce6f18d4fd4aabb61a2193d4d441c54f1790553480156200003e57600080fd5b50600580546001600160a01b03191633179055620000857f30000000000000000000000000000000000000000000000000000000000000006001600160e01b03620000a416565b6200009e64012a05f2006001600160e01b03620002ca16565b620009d3565b6001546001600160a01b03161580620000da5750600154620000d8906001600160a01b03166001600160e01b03620004b316565b155b15620000f757620000f560006001600160e01b03620004b716565b505b600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200014857600080fd5b505af11580156200015d573d6000803e3d6000fd5b505050506040513d60208110156200017457600080fd5b50516000546001600160a01b039081169116146200022b57600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015620001dd57600080fd5b505af1158015620001f2573d6000803e3d6000fd5b505050506040513d60208110156200020957600080fd5b5051600080546001600160a01b0319166001600160a01b039092169190911790555b60008054604080517f688dcfd70000000000000000000000000000000000000000000000000000000081527fff000000000000000000000000000000000000000000000000000000000000008516600482015290516001600160a01b039092169263688dcfd79260248084019382900301818387803b158015620002ae57600080fd5b505af1158015620002c3573d6000803e3d6000fd5b5050505050565b6001546001600160a01b03161580620003005750600154620002fe906001600160a01b03166001600160e01b03620004b316565b155b156200031d576200031b60006001600160e01b03620004b716565b505b600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200036e57600080fd5b505af115801562000383573d6000803e3d6000fd5b505050506040513d60208110156200039a57600080fd5b50516000546001600160a01b039081169116146200045157600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200040357600080fd5b505af115801562000418573d6000803e3d6000fd5b505050506040513d60208110156200042f57600080fd5b5051600080546001600160a01b0319166001600160a01b039092169190911790555b60008054604080517fca6ad1e40000000000000000000000000000000000000000000000000000000081526004810185905290516001600160a01b039092169263ca6ad1e49260248084019382900301818387803b158015620002ae57600080fd5b3b90565b6000620004cc6001600160e01b03620004d216565b92915050565b600080620004fd731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed6001600160e01b03620004b316565b11156200057b57600180546001600160a01b031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed17905560408051808201909152600b81527f6574685f6d61696e6e6574000000000000000000000000000000000000000000602082015262000572906001600160e01b036200091816565b50600162000915565b6000620005a573c03a2615d5efaf5f49f60b7bb6583eaec212fdf16001600160e01b03620004b316565b11156200061a57600180546001600160a01b03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf117905560408051808201909152600c81527f6574685f726f707374656e330000000000000000000000000000000000000000602082015262000572906001600160e01b036200091816565b60006200064473b7a07bcf2ba2f2703b24c0691b5278999c59ac7e6001600160e01b03620004b316565b1115620006b957600180546001600160a01b03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e17905560408051808201909152600981527f6574685f6b6f76616e0000000000000000000000000000000000000000000000602082015262000572906001600160e01b036200091816565b6000620006e373146500cfd35b22e4a392fe0adc06de1a1368ed486001600160e01b03620004b316565b11156200075857600180546001600160a01b03191673146500cfd35b22e4a392fe0adc06de1a1368ed4817905560408051808201909152600b81527f6574685f72696e6b656279000000000000000000000000000000000000000000602082015262000572906001600160e01b036200091816565b60006200078273a2998efd205fb9d4b4963afb70778d6354ad3a416001600160e01b03620004b316565b1115620007f757600180546001600160a01b03191673a2998efd205fb9d4b4963afb70778d6354ad3a4117905560408051808201909152600a81527f6574685f676f65726c6900000000000000000000000000000000000000000000602082015262000572906001600160e01b036200091816565b600062000821736f485c8bf6fc43ea212e93bbf8ce046c7f1cb4756001600160e01b03620004b316565b1115620008555750600180546001600160a01b031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517815562000915565b60006200087f7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf6001600160e01b03620004b316565b1115620008b35750600180546001600160a01b0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17815562000915565b6000620008dd7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa6001600160e01b03620004b316565b1115620009115750600180546001600160a01b0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17815562000915565b5060005b90565b80516200092d90600290602084019062000931565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200097457805160ff1916838001178555620009a4565b82800160010185558215620009a4579182015b82811115620009a457825182559160200191906001019062000987565b50620009b2929150620009b6565b5090565b6200091591905b80821115620009b25760008155600101620009bd565b6138ae80620009e36000396000f3fe60806040526004361061012a5760003560e01c8063a6e3ce2b116100ab578063d3522d511161006f578063d3522d5114610590578063d4ee1d90146105a5578063e3d670d7146105ba578063eaff0118146105ed578063f2fde38b14610626578063f58bd55b146106595761012a565b8063a6e3ce2b14610489578063b682b754146104c2578063b6b55f25146104df578063c08c8ab014610509578063c75ddfd01461054b5761012a565b80636ade150d116100f25780636ade150d146103b957806377a9912e146103e357806379ba509714610419578063835fc6ca1461042e5780638da5cb5b146104585761012a565b8063217630991461012c57806327dc297e1461015657806338bbfa501461020f5780635ce7517b1461034e578063616eb638146103a4575b005b34801561013857600080fd5b5061012a6004803603602081101561014f57600080fd5b5035610683565b34801561016257600080fd5b5061012a6004803603604081101561017957600080fd5b8135919081019060408101602082013564010000000081111561019b57600080fd5b8201836020820111156101ad57600080fd5b803590602001918460018302840111640100000000831117156101cf57600080fd5b91908080601f016020809104026020016040519081016040528181529291906020840183838082843760009201919091525092955061069f945050505050565b34801561021b57600080fd5b5061012a6004803603606081101561023257600080fd5b8135919081019060408101602082013564010000000081111561025457600080fd5b82018360208201111561026657600080fd5b8035906020019184600183028401116401000000008311171561028857600080fd5b91908080601f016020809104026020016040519081016040528181529291906020840183838082843760009201919091525092959493602081019350359150506401000000008111156102da57600080fd5b8201836020820111156102ec57600080fd5b8035906020019184600183028401116401000000008311171561030e57600080fd5b91908080601f01602080910402602001604051908101604052818152929190602084018383808284376000920191909152509295506106da945050505050565b34801561035a57600080fd5b506103786004803603602081101561037157600080fd5b5035610933565b6040519283526001600160a01b0390911660208301526040808301919091526060909101905180910390f35b3480156103b057600080fd5b5061012a610960565b3480156103c557600080fd5b5061012a600480360360208110156103dc57600080fd5b50356109a8565b3480156103ef57600080fd5b5061012a6004803603606081101561040657600080fd5b50803590602081013590604001356109c4565b34801561042557600080fd5b5061012a610a05565b34801561043a57600080fd5b5061012a6004803603602081101561045157600080fd5b5035610a82565b34801561046457600080fd5b5061046d610ba8565b6040516001600160a01b03909116815260200160405180910390f35b34801561049557600080fd5b5061012a600480360360408110156104ac57600080fd5b506001600160a01b038135169060200135610bb7565b61012a600480360360208110156104d857600080fd5b5035610cc3565b3480156104eb57600080fd5b5061012a6004803603602081101561050257600080fd5b5035610eb4565b34801561051557600080fd5b506105336004803603602081101561052c57600080fd5b5035610fc7565b60405191825260208201526040908101905180910390f35b34801561055757600080fd5b5061057e6004803603602081101561056e57600080fd5b50356001600160a01b0316610fe3565b60405190815260200160405180910390f35b34801561059c57600080fd5b5061057e611002565b3480156105b157600080fd5b5061046d611008565b3480156105c657600080fd5b5061057e600480360360208110156105dd57600080fd5b50356001600160a01b0316611017565b3480156105f957600080fd5b5061012a6004803603604081101561061057600080fd5b506001600160a01b03813516906020013561102b565b34801561063257600080fd5b5061012a6004803603602081101561064957600080fd5b50356001600160a01b0316611128565b34801561066557600080fd5b5061012a6004803603602081101561067c57600080fd5b5035611161565b6005546001600160a01b0316331461069a57600080fd5b600755565b6106d682826000604051818152601f19601f83011681016020016040529080156106d0576020820181803883390190505b506106da565b5050565b6106e2611181565b6001600160a01b0316336001600160a01b0316146106ff57600080fd5b61070a83838361134b565b60ff16156107175761092e565b6000838152600b602052604090205461092e576000600854836040516020018082805190602001908083835b602083106107625780518252601f199092019160209182019101610743565b6001836020036101000a038019825116818451161790925250505091909101925060409150505160208183030381529060405280519060200120816107a357fe5b0660010190506000600b6000868152602001908152602001600020600101546000868152600b6020526001600160a01b03909116915060408120600201546000878152600b60205290915083906040902055600083815260096020526040812054156108c95760008481526009602052610829906040902054839063ffffffff6113fa16565b6000858152600960205290915061084f906040902060010154829063ffffffff61142116565b6001600160a01b0384166000908152600a60205290915061087d90829060409020549063ffffffff61144016565b6001600160a01b0384166000908152600a6020526040902055306000908152600a6020526108b890829060409020549063ffffffff61145016565b306000908152600a60205260409020555b7f4bd2ebd094c48d9f98e6240cb4987a25a4b95362dd6cbd0dcd1d0cfec6a7b6ab838383878b6040516001600160a01b03909516855260208501939093526040808501929092526060840152608083019190915260a0909101905180910390a1505050505b505050565b600b602052806000526040600020805460018201546002909201549092506001600160a01b039091169083565b6005546001600160a01b0316331461097757600080fd5b3380303180156108fc0290604051600060405180830381858888f193505050501580156106d6573d6000803e3d6000fd5b6005546001600160a01b031633146109bf57600080fd5b600855565b6005546001600160a01b031633146109db57600080fd5b60008381526009602052829060409020556000838152600960205281906040902060010155505050565b6006546001600160a01b03163314610a1c57600080fd5b6006546005546001600160a01b0391821691167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360068054600580546001600160a01b03199081166001600160a01b03841617909155169055565b336000908152600a602052819060409020541015610a9f57600080fd5b336000908152600a602052610ac190829060409020549063ffffffff61145016565b336000908152600a6020526040902055600c546001600160a01b031663a9059cbb33836040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610b2a57600080fd5b505af1158015610b3e573d6000803e3d6000fd5b505050506040513d6020811015610b5457600080fd5b810190808051507fc0ae8b67f07fd03fffddeadb78e3b00dde187d408787338d1aa73ed2692fd1e692503391508390506040516001600160a01b03909216825260208201526040908101905180910390a150565b6005546001600160a01b031681565b6005546001600160a01b03163314610bce57600080fd5b600c546001600160a01b0383811691161415610c3457306000908152600a602052819060409020541015610c0157600080fd5b306000908152600a602052610c2390829060409020549063ffffffff61145016565b306000908152600a60205260409020555b816001600160a01b031663a9059cbb33836040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b158015610c8b57600080fd5b505af1158015610c9f573d6000803e3d6000fd5b505050506040513d6020811015610cb557600080fd5b810190808051505050505050565b336000908152600a6020526040902054811115610cdf57600080fd5b306000908152600a602052600482029060409020541015610cff57600080fd5b34610d2560405160408082019052600681526572616e646f6d60d01b6020820152611465565b1115610d95577fc4dc360d0a9c0677a3379ae0a3d81e887f761e65fdf3d7e00859d1bcd3c473896040516020808252601e908201527f796f75206e65656420746f2070617920666f72206761732c20626974636800006040808301919091526060909101905180910390a1610eb1565b336000908152600a602052610db790829060409020549063ffffffff61145016565b336000908152600a6020526040902055306000908152600a602052610de990829060409020549063ffffffff61144016565b306000908152600a6020526040902055600780546000918291610e0d91839161169e565b6000818152600b60205290915033906040902060010180546001600160a01b0319166001600160a01b03929092169190911790556000818152600b602052839060409020600201557fad35d98937711821dbf3065a01eaa1cf0ad885566e7600a252bea2b8fff936c133848360405180846001600160a01b03166001600160a01b03168152602001838152602001828152602001935050505060405180910390a150505b50565b600c546001600160a01b03166323b872dd3330846040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b158015610f1a57600080fd5b505af1158015610f2e573d6000803e3d6000fd5b505050506040513d6020811015610f4457600080fd5b8101908080515050336000908152600a602052610f70925083915060409020549063ffffffff61144016565b336000908152600a60205260409020557f1465dd72734cdf73c30c2236d3ef723f1209cd7a51356e4f78f4c7aa4f37892c33826040516001600160a01b03909216825260208201526040908101905180910390a150565b6009602052806000526040600020805460019091015490915082565b6001600160a01b0381166000908152600a602052604081205492915050565b60085481565b6006546001600160a01b031681565b600a60205280600052604060002054905081565b6005546001600160a01b0316331461104257600080fd5b816001600160a01b03166323b872dd3330846040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b1580156110a657600080fd5b505af11580156110ba573d6000803e3d6000fd5b505050506040513d60208110156110d057600080fd5b8101908080515050600c546001600160a01b038581169116141591506106d6905057306000908152600a60205261111490829060409020549063ffffffff61144016565b306000908152600a60205260409020555050565b6005546001600160a01b0316331461113f57600080fd5b600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461117857600080fd5b610eb181611acd565b6001546000906001600160a01b031615806111ae57506001546111ac906001600160a01b0316611c86565b155b156111bf576111bd6000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156111fc57600080fd5b505af1158015611210573d6000803e3d6000fd5b505050506040513d602081101561122657600080fd5b8101908080516000546001600160a01b0390811691161492506112d7915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561128357600080fd5b505af1158015611297573d6000803e3d6000fd5b505050506040513d60208110156112ad57600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663c281d19e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d602081101561133c57600080fd5b81019080805193505050505b90565b60008160008151811061135a57fe5b60200101516001600160f81b031916601360fa1b14158061139a57508160018151811061138357fe5b60200101516001600160f81b031916600560fc1b14155b806113ba57506001826002815181106113af57fe5b602001015160f81c14155b156113c7575060016113f3565b60006113dc8386866113d7611c94565b611d36565b9050806113ed5760029150506113f3565b60009150505b9392505050565b81810282158061141257508183828161140f57fe5b04145b61141b57600080fd5b92915050565b600080821161142f57600080fd5b81838161143857fe5b049392505050565b8181018281101561141b57600080fd5b60008282111561145f57600080fd5b50900390565b6001546000906001600160a01b031615806114925750600154611490906001600160a01b0316611c86565b155b156114a3576114a16000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156114e057600080fd5b505af11580156114f4573d6000803e3d6000fd5b505050506040513d602081101561150a57600080fd5b8101908080516000546001600160a01b0390811691161492506115bb915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561156757600080fd5b505af115801561157b573d6000803e3d6000fd5b505050506040513d602081101561159157600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663524f3889836040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611619578082015183820152602001611601565b50505050905090810190601f1680156116465780820380516001836020036101000a031916815260200191505b5092505050602060405180830381600087803b15801561166557600080fd5b505af1158015611679573d6000803e3d6000fd5b505050506040513d602081101561168f57600080fd5b81019080805195945050505050565b600080831180156116b0575060208311155b6116b957600080fd5b600a8402935060606001604051818152601f19601f83011681016020016040529080156116ed576020820181803883390190505b5090508360f81b8160008151811061170157fe5b60200101906001600160f81b031916908160001a90535060606020604051818152601f19601f8301168101602001604052908015611746576020820181803883390190505b50905060606020604051818152601f19601f8301168101602001604052908015611777576020820181803883390190505b509050600061178461232a565b90506020835242411860014303401860208401526020825280602083015260606020604051818152601f19601f83011681016020016040529080156117d0576020820181803883390190505b50905088602082015260606008604051818152601f19601f8301168101602001604052908015611807576020820181803883390190505b50905061181a82601860088460006124bb565b50611823613763565b6040518060800160405280878152602001888152602001868152602001848152509050600061186f60405160408082019052600681526572616e646f6d60d01b6020820152838c612505565b905060606008604051818152601f19601f830116810160200160405290801561189f576020820181803883390190505b5090506020840151600160f81b81046027830153600160f01b81046026830153600160e81b81046025830153600160e01b81046024830153600160d81b81046023830153600160d01b81046022830153600160c81b81046021830153600160c01b8104602083015350611abd82826020860151600287516040518082805190602001908083835b602083106119455780518252601f199092019160209182019101611926565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015611987573d6000803e3d6000fd5b5050506040513d602081101561199c57600080fd5b8101908080519250505060408801516040516020018085805190602001908083835b602083106119dd5780518252601f1990920191602091820191016119be565b6001836020036101000a038019825116818451161790925250505091909101905084805190602001908083835b60208310611a295780518252601f199092019160209182019101611a0a565b6001836020036101000a038019825116818451161790925250505091909101848152602001905082805190602001908083835b60208310611a7b5780518252601f199092019160209182019101611a5c565b6001836020036101000a03801982511681845116179092525050509190910195506040945050505050516020818303038152906040528051906020012061271d565b509b9a5050505050505050505050565b6001546001600160a01b03161580611af75750600154611af5906001600160a01b0316611c86565b155b15611b0857611b066000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611b4557600080fd5b505af1158015611b59573d6000803e3d6000fd5b505050506040513d6020811015611b6f57600080fd5b8101908080516000546001600160a01b039081169116149250611c20915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611bcc57600080fd5b505af1158015611be0573d6000803e3d6000fd5b505050506040513d6020811015611bf657600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663ca6ad1e4826040516001600160e01b031960e084901b1681526004810191909152602401600060405180830381600087803b158015611c6b57600080fd5b505af1158015611c7f573d6000803e3d6000fd5b5050505050565b3b90565b600061141b612732565b606060028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611d2c5780601f10611d0157610100808354040283529160200191611d2c565b820191906000526020600020905b815481529060010190602001808311611d0f57829003601f168201915b5050505050905090565b60008085604581518110611d4657fe5b602001015160f81c606601905060606020604051818152601f19601f8301168101602001604052908015611d81576020820181803883390190505b509050611d93878360208460006124bb565b50600284876040516020018083805190602001908083835b60208310611dca5780518252601f199092019160209182019101611dab565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040516020818303038152906040526040518082805190602001908083835b60208310611e315780518252601f199092019160209182019101611e12565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015611e73573d6000803e3d6000fd5b5050506040513d6020811015611e8857600080fd5b81019080805192506040915050516020018082815260200191505060405160208183030381529060405280519060200120818051906020012014611ed157600092505050612322565b606087604a840181518110611ee257fe5b602001015160f81c600201604051818152601f19601f8301168101602001604052908015611f17576020820181803883390190505b509050611f2c888460490183518460006124bb565b50611fe26002826040518082805190602001908083835b60208310611f625780518252601f199092019160209182019101611f43565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015611fa4573d6000803e3d6000fd5b5050506040513d6020811015611fb957600080fd5b81019080805192508991508b90506028870181518110611fd557fe5b602001015160f81c612a7b565b611ff25760009350505050612322565b60606029604051818152601f19601f8301168101602001604052908015612020576020820181803883390190505b509050612035898560200160298460006124bb565b50606060408051818152601f19601f8301168101602001604052908015612063576020820181803883390190505b50905060008351866020016029010160410190506120898b6040830360408560006124bb565b5060006002836040518082805190602001908083835b602083106120be5780518252601f19909201916020918201910161209f565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612100573d6000803e3d6000fd5b5050506040513d602081101561211557600080fd5b810190808051935086925083915060409050516020018083805190602001908083835b602083106121575780518252601f199092019160209182019101612138565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040516020818303038152906040528051906020012060008c81526003602052604090205414156121c25760008b8152600360205260409020600090556121d2565b6000975050505050505050612322565b60606049604051818152601f19601f8301168101602001604052908015612200576020820181803883390190505b5090506122128d8960498460006124bb565b506122b26002826040518082805190602001908083835b602083106122485780518252601f199092019160209182019101612229565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561228a573d6000803e3d6000fd5b5050506040513d602081101561229f57600080fd5b8101908080519250899150879050612ae7565b6122c757600098505050505050505050612322565b60008281526004602052604090205460ff16612305576122e78d84612c4a565b6000838152600460205260409020805460ff19169115159190911790555b60008281526004602052604090205460ff16985050505050505050505b949350505050565b6001546000906001600160a01b031615806123575750600154612355906001600160a01b0316611c86565b155b15612368576123666000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156123a557600080fd5b505af11580156123b9573d6000803e3d6000fd5b505050506040513d60208110156123cf57600080fd5b8101908080516000546001600160a01b039081169116149250612480915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561242c57600080fd5b505af1158015612440573d6000803e3d6000fd5b505050506040513d602081101561245657600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663abaa5f3e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561131257600080fd5b606083820180845110156124ce57600080fd5b60208087019084015b8688602001018210156124f8578189015186820152602091820191016124d7565b5093979650505050505050565b6001546000906001600160a01b031615806125325750600154612530906001600160a01b0316611c86565b155b15612543576125416000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561258057600080fd5b505af1158015612594573d6000803e3d6000fd5b505050506040513d60208110156125aa57600080fd5b8101908080516000546001600160a01b03908116911614925061265b915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561260757600080fd5b505af115801561261b573d6000803e3d6000fd5b505050506040513d602081101561263157600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6060600460405190808252806020026020018201604052801561269257816020015b606081526020019060019003908161267d5790505b5090508351816000815181106126a457fe5b60209081029190910101528360016020020151816001815181106126c457fe5b60209081029190910101526040840151816002815181106126e157fe5b60209081029190910101526060840151816003815181106126fe57fe5b6020026020010181905250612714858285612fe1565b95945050505050565b60008281526003602052819060409020555050565b600080612752731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed611c86565b11156127b057600180546001600160a01b031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed1790556127a860405160408082019052600b81526a195d1a17db585a5b9b995d60aa1b60208201526133b2565b506001611348565b60006127cf73c03a2615d5efaf5f49f60b7bb6583eaec212fdf1611c86565b111561282657600180546001600160a01b03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf11790556127a860405160408082019052600c81526b6574685f726f707374656e3360a01b60208201526133b2565b600061284573b7a07bcf2ba2f2703b24c0691b5278999c59ac7e611c86565b111561289957600180546001600160a01b03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e1790556127a860405160408082019052600981526832ba342fb5b7bb30b760b91b60208201526133b2565b60006128b873146500cfd35b22e4a392fe0adc06de1a1368ed48611c86565b111561290e57600180546001600160a01b03191673146500cfd35b22e4a392fe0adc06de1a1368ed481790556127a860405160408082019052600b81526a6574685f72696e6b65627960a81b60208201526133b2565b600061292d73a2998efd205fb9d4b4963afb70778d6354ad3a41611c86565b111561298257600180546001600160a01b03191673a2998efd205fb9d4b4963afb70778d6354ad3a411790556127a860405160408082019052600a8152696574685f676f65726c6960b01b60208201526133b2565b60006129a1736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475611c86565b11156129d35750600180546001600160a01b031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475178155611348565b60006129f27320e12a1f859b3feae5fb2a0a32c18f5a65555bbf611c86565b1115612a245750600180546001600160a01b0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf178155611348565b6000612a437351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa611c86565b1115612a755750600180546001600160a01b0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa178155611348565b50600090565b6000600182845114612a8c57600080fd5b60005b83811015612ade57848181518110612aa357fe5b60200101516001600160f81b031916868260208110612abe57fe5b1a60f81b6001600160f81b03191614612ad657600091505b600101612a8f565b50949350505050565b600080600080600060606020604051818152601f19601f8301168101602001604052908015612b1d576020820181803883390190505b5090506000602089600381518110612b3157fe5b602001015160f81c60f81b60f81c60ff16036004019050612b57898260208560006124bb565b915060606020604051818152601f19601f8301168101602001604052908015612b87576020820181803883390190505b509050602282019150612bba8a60208c6001860381518110612ba557fe5b602001015160f81c03840160208460006124bb565b90506020830151945060208101519350612bd78b601b87876133c5565b90975095506001600160a01b03861689805190602001206001600160a01b03161415612c0d5760019750505050505050506113f3565b612c1a8b601c87876133c5565b90975095506001600160a01b03861689805190602001206001600160a01b03161497506113f39650505050505050565b6000806060848460010181518110612c5e57fe5b602001015160f81c600201604051818152601f19601f8301168101602001604052908015612c93576020820181803883390190505b509050612ca5858583518460006124bb565b50606060408051818152601f19601f8301168101602001604052908015612cd3576020820181803883390190505b509050612ce686600460408460006124bb565b5060606062604051818152601f19601f8301168101602001604052908015612d15576020820181803883390190505b509050600160f81b81600081518110612d2a57fe5b60200101906001600160f81b031916908160001a905350612d53876041880360418460016124bb565b5060606040518060400160405280602081526020017ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c8152509050612d9e81600060208560426124bb565b50612e3e6002836040518082805190602001908083835b60208310612dd45780518252601f199092019160209182019101612db5565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612e16573d6000803e3d6000fd5b5050506040513d6020811015612e2b57600080fd5b8101908080519250879150869050612ae7565b945084612e535760009550505050505061141b565b606060405180606001604052806040815260200161383a60409139905060606042604051818152601f19601f8301168101602001604052908015612e9e576020820181803883390190505b509050607f60f91b81600081518110612eb357fe5b60200101906001600160f81b031916908160001a905350612eda8a600360418460016124bb565b5060608a604581518110612eea57fe5b602001015160f81c600201604051818152601f19601f8301168101602001604052908015612f1f576020820181803883390190505b509050612f328b604483518460006124bb565b50612fd26002836040518082805190602001908083835b60208310612f685780518252601f199092019160209182019101612f49565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612faa573d6000803e3d6000fd5b5050506040513d6020811015612fbf57600080fd5b8101908080519250849150869050612ae7565b9b9a5050505050505050505050565b6001546000906001600160a01b0316158061300e575060015461300c906001600160a01b0316611c86565b155b1561301f5761301d6000611c8a565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561305c57600080fd5b505af1158015613070573d6000803e3d6000fd5b505050506040513d602081101561308657600080fd5b8101908080516000546001600160a01b039081169116149250613137915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156130e357600080fd5b505af11580156130f7573d6000803e3d6000fd5b505050506040513d602081101561310d57600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b600080546001600160a01b0316632ef3accc86856040518363ffffffff1660e01b81526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561319d578082015183820152602001613185565b50505050905090810190601f1680156131ca5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156131ea57600080fd5b505af11580156131fe573d6000803e3d6000fd5b505050506040513d602081101561321457600080fd5b8101908080519350505050670de0b6b3a76400003a84020181111561323d5750600090506113f3565b606061324885613405565b600080549192506001600160a01b039091169063c55c1cb69084908985896040518663ffffffff1660e01b8152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132c25780820151838201526020016132aa565b50505050905090810190601f1680156132ef5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b8381101561332557808201518382015260200161330d565b50505050905090810190601f1680156133525780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b15801561337457600080fd5b505af1158015613388573d6000803e3d6000fd5b50505050506040513d602081101561339f57600080fd5b8101908080519998505050505050505050565b60028180516106d6929160200190613789565b60008060008060405188815287602082015286604082015285606082015260208160808360006001610bb8f1925080519299929850919650505050505050565b606061340f613477565b613417613807565b61342381610400613483565b61342c816134b1565b60005b83518110156134645761345c84828151811061344757fe5b6020026020010151839063ffffffff6134bc16565b60010161342f565b5061346e816134d9565b80519392505050565b60405180590338823950565b8060208106156134965760208106602003015b60208301819052604051928390526000835290910160405250565b610eb18160046134e0565b6134c982600283516134fb565b61092e828263ffffffff61360c16565b610eb18160075b6106d682601f611fe0600585901b161763ffffffff6136a516565b601781116135215761351c8360e0600585901b16831763ffffffff6136a516565b61092e565b60ff811161355c57613544836018611fe0600586901b161763ffffffff6136a516565b6135568382600163ffffffff6136de16565b5061092e565b61ffff811161359257613580836019611fe0600586901b161763ffffffff6136a516565b6135568382600263ffffffff6136de16565b63ffffffff81116135ca576135b883601a611fe0600586901b161763ffffffff6136a516565b6135568382600463ffffffff6136de16565b67ffffffffffffffff811161092e576135f483601b611fe0600586901b161763ffffffff6136a516565b6136068382600863ffffffff6136de16565b50505050565b613614613807565b82602001518351518351011115613640576136408361363885602001518551613732565b600202613749565b60008060008451905085518051602081830101945086510190526020850191505b6020811061368157815183526020928301929190910190601f1901613661565b60001960208290036101000a01801983511681855116179093525093949350505050565b816020015182515160010111156136c7576136c7828360200151600202613749565b815180516020818301018381535060010190525050565b6136e6613807565b8360200151845151830111156137085761370884613638866020015185613732565b60001961010083900a01845180518481830101868419825116179052909301909252509192915050565b60008183111561374357508161141b565b50919050565b6060825190506137598383613483565b613606838261360c565b604051608081016040526004815b60608152602001906001900390816137715790505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137ca57805160ff19168380011785556137f7565b828001600101855582156137f7579182015b828111156137f75782518255916020019190600101906137dc565b5061380392915061381f565b5090565b60405160408082019052606081526000602082015290565b61134891905b80821115613803576000815560010161382556fe7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4a265627a7a723158202195d455db5e5c3b96c68682ef749896e98ed1670beb8c4aafb62b9f5f6bf3d764736f6c634300050b0032

Deployed ByteCode Sourcemap

1714:4503:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5023:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5023:94:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5023:94:1;;:::i;15718:124:0:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15718:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15718:124:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15718:124:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15718:124:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;15718:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;15718:124:0;;-1:-1:-1;15718:124:0;;-1:-1:-1;;;;;15718:124:0:i;5222:956:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5222:956:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5222:956:1;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;5222:956:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5222:956:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5222:956:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;5222:956:1;;;;;;;;-1:-1:-1;5222:956:1;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;5222:956:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5222:956:1;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;5222:956:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;5222:956:1;;-1:-1:-1;5222:956:1;;-1:-1:-1;;;;;5222:956:1:i;2549:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2549:44:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2549:44:1;;:::i;:::-;;;;;;-1:-1:-1;;;;;2549:44:1;;;;;;;;;;;;;;;;;;;;;;;;;;4779:129;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4779:129:1;;;:::i;4041:78::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4041:78:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4041:78:1;;:::i;4122:149::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4122:149:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4122:149:1;;;;;;;;;;;;:::i;1536:173::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1536:173:1;;;:::i;3661:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3661:237:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3661:237:1;;:::i;1189:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1189:20:1;;;:::i;:::-;;;-1:-1:-1;;;;;1189:20:1;;;;;;;;;;;;;;4510:266;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4510:266:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4510:266:1;;;;;;;;:::i;2689:758::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2689:758:1;;:::i;3451:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3451:206:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3451:206:1;;:::i;2449:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2449:49:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2449:49:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3920:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3920:93:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3920:93:1;-1:-1:-1;;;;;3920:93:1;;:::i;:::-;;;;;;;;;;;;;;;2343:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2343:20:1;;;:::i;1213:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1213:23:1;;;:::i;2502:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2502:42:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2502:42:1;-1:-1:-1;;;;;2502:42:1;;:::i;4274:233::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4274:233:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4274:233:1;;;;;;;;:::i;1439:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1439:94:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1439:94:1;-1:-1:-1;;;;;1439:94:1;;:::i;4911:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4911:109:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4911:109:1;;:::i;5023:94::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;5089:16;:23;5023:94::o;15718:124:0:-;15794:40;15805:5;15812:7;15831:1;15821:12;;;;;-1:-1:-1;;15821:12:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;15821:12:0;87:34:-1;135:17;;-1:-1;15821:12:0;;15794:10;:40::i;:::-;15718:124;;:::o;5222:956:1:-;5359:20;:18;:20::i;:::-;-1:-1:-1;;;;;5345:34:1;:10;-1:-1:-1;;;;;5345:34:1;;5337:43;;;;;;5398:100;5449:8;5467:7;5484:6;5398:41;:100::i;:::-;:105;;;5387:787;;;;;5536:21;;;;:11;:21;;;;;:29;5533:634;;5581:13;5645:5;;5632:7;5615:25;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;5615:25:1;;;;;-1:-1:-1;5615:25:1;;-1:-1:-1;;5615:25:1;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5615:25:1;;;5605:36;;;;;;5597:53;;;;;;5653:1;5597:57;5581:73;;5664:12;5679:11;:21;5691:8;5679:21;;;;;;;;;;;:26;;;;5732:21;;;:11;:21;;-1:-1:-1;;;;;5679:26:1;;;;-1:-1:-1;5732:21:1;5679:26;5732:21;:28;;;5770:21;;;;:11;:21;;5732:28;;-1:-1:-1;5802:5:1;;5770:21;;;:37;:29;5843:18;;;:11;:18;;;5770:29;5843:18;:20;:25;5839:257;;5899:18;;;;:11;:18;;5888:32;;5899:18;;;:20;5888:6;;:32;:10;:32;:::i;:::-;5946:18;;;;:11;:18;;5882:38;;-1:-1:-1;5938:29:1;;5946:18;;;:20;;;5938:3;;:29;:7;:29;:::i;:::-;-1:-1:-1;;;;;5995:13:1;;;;;;:7;:13;;5932:35;;-1:-1:-1;5995:22:1;;5932:35;;5995:13;;;;;:22;:17;:22;:::i;:::-;-1:-1:-1;;;;;5979:13:1;;;;;;:7;:13;;;;;:38;6070:4;6054:22;;;;:7;:22;;:31;;6081:3;;6054:22;;;;;:31;:26;:31;:::i;:::-;6045:4;6029:22;;;;:7;:22;;;;;:56;5839:257;6111:47;6123:4;6129:6;6137:3;6142:5;6149:8;6111:47;;-1:-1:-1;;;;;6111:47:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5533:634;;;;;5222:956;;;:::o;2549:44::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2549:44:1;;;;;:::o;4779:129::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4849:10;;4889:4;4881:21;4865:38;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;4041:78:1;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4100:5;:14;4041:78::o;4122:149::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4210:18;;;;:11;:18;;4233:2;;4210:18;;;:25;:20;4241:18;;;:11;:18;;4264:2;;4241:18;;;:20;;:25;-1:-1:-1;;;4122:149:1:o;1536:173::-;1598:8;;-1:-1:-1;;;;;1598:8:1;1584:10;:22;1576:31;;;;;;1646:8;;1639:5;;-1:-1:-1;;;;;1646:8:1;;;;1639:5;1618:37;;;;;;;;;;1669:8;;;1661:5;:16;;-1:-1:-1;;;;;;1661:16:1;;;-1:-1:-1;;;;;1669:8:1;;1661:16;;;;1683:21;;;1536:173::o;3661:237::-;3726:10;3718:19;;;;:7;:19;;3741:6;;3718:19;;;;:29;;3710:38;;;;;;3784:10;3776:19;;;;:7;:19;;:31;;3800:6;;3776:19;;;;;:31;:23;:31;:::i;:::-;3762:10;3754:19;;;;:7;:19;;;;;:53;3813:4;;-1:-1:-1;;;;;3813:4:1;:13;3827:10;3839:6;3813:33;;-1:-1:-1;;;;;;3813:33:1;;;;;;;-1:-1:-1;;;;;3813:33:1;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3813:33:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3813:33:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3813:33:1;;;;;;-1:-1:-1;3857:36:1;;-1:-1:-1;3874:10:1;;-1:-1:-1;3886:6:1;;-1:-1:-1;3857:36:1;;-1:-1:-1;;;;;3857:36:1;;;;;;;;;;;;;;;;;;;;3661:237;:::o;1189:20::-;;;-1:-1:-1;;;;;1189:20:1;;:::o;4510:266::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4603:4;;-1:-1:-1;;;;;4594:13:1;;;4603:4;;4594:13;4590:142;;;4641:4;4625:22;;;;:7;:22;;4651:6;;4625:22;;;;:32;;4617:41;;;;;;4707:4;4691:22;;;;:7;:22;;:34;;4718:6;;4691:22;;;;;:34;:26;:34;:::i;:::-;4682:4;4666:22;;;;:7;:22;;;;;:59;4590:142;4737:5;-1:-1:-1;;;;;4737:14:1;;4752:10;4764:6;4737:34;;-1:-1:-1;;;;;;4737:34:1;;;;;;;-1:-1:-1;;;;;4737:34:1;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4737:34:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4737:34:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4737:34:1;;;;;;-1:-1:-1;;;;;;4510:266:1:o;2689:758::-;2766:10;2758:19;;;;:7;:19;;;;;;2748:6;:29;;2740:38;;;;;;2808:4;2792:22;;;;:7;:22;;2827:1;2818:10;;;2792:22;;;;:36;;2784:45;;;;;;2870:9;2840:27;;;;;;;;;;;;-1:-1:-1;;;2840:27:1;;;;:17;:27::i;:::-;:39;2836:607;;;2894:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2836:607;;;3002:10;2994:19;;;;:7;:19;;:31;;3018:6;;2994:19;;;;;:31;:23;:31;:::i;:::-;2980:10;2972:19;;;;:7;:19;;;;;:53;3074:4;3058:22;;;;:7;:22;;:34;;3085:6;;3058:22;;;;;:34;:26;:34;:::i;:::-;3049:4;3033:22;;;;:7;:22;;;;;:59;5214:1;3265:16;;3101:29;;;;3163:126;;3101:29;;3163:25;:126::i;:::-;3298:21;;;;:11;:21;;3143:146;;-1:-1:-1;3327:10:1;;3298:21;;;:26;;:39;;-1:-1:-1;;;;;;3298:39:1;-1:-1:-1;;;;;3298:39:1;;;;;;;;;;-1:-1:-1;3345:21:1;;;:11;:21;;3376:6;;3345:21;;;:28;;:37;3396:40;3407:10;3419:6;3427:8;3396:40;;;;-1:-1:-1;;;;;3396:40:1;-1:-1:-1;;;;;3396:40:1;;;;;;;;;;;;;;;;;;;;;;;;;;;2836:607;;;2689:758;:::o;3451:206::-;3497:4;;-1:-1:-1;;;;;3497:4:1;:17;3515:10;3535:4;3542:6;3497:52;;-1:-1:-1;;;;;;3497:52:1;;;;;;;-1:-1:-1;;;;;3497:52:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3497:52:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3497:52:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3497:52:1;;;;;;-1:-1:-1;;3585:10:1;3577:19;;;;:7;3497:52;3577:19;:31;;-1:-1:-1;3601:6:1;;-1:-1:-1;3577:19:1;;;;;:31;:23;:31;:::i;:::-;3563:10;3555:19;;;;:7;:19;;;;;:53;3619:33;3633:10;3645:6;3619:33;;-1:-1:-1;;;;;3619:33:1;;;;;;;;;;;;;;;;;;;;3451:206;:::o;2449:49::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;2449:49:1;:::o;3920:93::-;-1:-1:-1;;;;;3993:14:1;;3972:7;3993:14;;;:7;:14;;;3972:7;3993:14;;;3920:93;-1:-1:-1;;3920:93:1:o;2343:20::-;;;;:::o;1213:23::-;;;-1:-1:-1;;;;;1213:23:1;;:::o;2502:42::-;;;;;;;;;;;;-1:-1:-1;2502:42:1;:::o;4274:233::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4351:5;-1:-1:-1;;;;;4351:18:1;;4370:10;4390:4;4397:6;4351:53;;-1:-1:-1;;;;;;4351:53:1;;;;;;;-1:-1:-1;;;;;4351:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4351:53:1;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4351:53:1;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4351:53:1;;;;;;-1:-1:-1;;4423:4:1;;-1:-1:-1;;;;;4414:13:1;;;4423:4;;4414:13;4410:93;;-1:-1:-1;4410:93:1;;-1:-1:-1;4410:93:1;4478:4;4462:22;;;;:7;:22;;:34;;4489:6;;4462:22;;;;;:34;:26;:34;:::i;:::-;4453:4;4437:22;;;;:7;:22;;;;;:59;4274:233;;:::o;1439:94::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;1508:8;:20;;-1:-1:-1;;;;;;1508:20:1;-1:-1:-1;;;;;1508:20:1;;;;;;;;;;1439:94::o;4911:109::-;1417:5;;-1:-1:-1;;;;;1417:5:1;1403:10;:19;1395:28;;;;;;4981:34;5008:6;4981:26;:34::i;38056:132:0:-;12171:3;;38116:24;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;38160:8;;-1:-1:-1;;;;;38160:8:0;:18;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38160:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38160:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38160:20:0;;;;;;;-1:-1:-1;;;;12418:1:0;38056:132;:::o;51645:589::-;51776:17;51905:6;51912:1;51905:9;;;;;;;;;;;;-1:-1:-1;;;;;;51905:9:0;-1:-1:-1;;;51905:16:0;;;51904:40;;;51927:6;51934:1;51927:9;;;;;;;;;;;;-1:-1:-1;;;;;;51927:9:0;-1:-1:-1;;;51927:16:0;;51904:40;:74;;;-1:-1:-1;51975:1:0;51955:6;51962:1;51955:6;:9;;;;;;;;;;;;;51949:28;;51904:74;51900:115;;;-1:-1:-1;52002:1:0;51995:8;;51900:115;52025:18;52046:96;52082:6;52090:8;52106:7;52116:25;:23;:25::i;:::-;52046:35;:96::i;:::-;52025:117;;52158:13;52153:55;;52195:1;52188:8;;;;;52153:55;52225:1;52218:8;;;51645:589;;;;;;:::o;297:115:1:-;367:5;;;386:6;;;:20;;;405:1;400;396;:5;;;;;;:10;386:20;378:29;;;;;;297:115;;;;:::o;415:100::-;467:6;493:1;489;:5;481:14;;;;;;509:1;505;:5;;;;;;;415:100;-1:-1:-1;;;415:100:1:o;89:101::-;159:5;;;178:6;;;;170:15;;;;;193:101;245:6;272:1;267;:6;;259:15;;;;;;-1:-1:-1;284:5:1;;;193:101::o;16039:158:0:-;12171:3;;16123:16;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;16159:8;;-1:-1:-1;;;;;16159:8:0;:17;16177:11;16159:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16159:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16159:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16159:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;16159:30:0;;;;;;;16039:158;-1:-1:-1;;;;;16039:158:0:o;46129:2683::-;46231:16;46279:1;46269:7;:11;46268:32;;;;;46297:2;46286:7;:13;;46268:32;46260:41;;;;;;46322:2;46312:12;;;;46381:19;46413:1;46403:12;;;;;-1:-1:-1;;46403:12:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46403:12:0;87:34:-1;135:17;;-1:-1;46403:12:0;;46381:34;;46449:7;46438:20;;46426:6;46433:1;46426:9;;;;;;;;;;;:32;-1:-1:-1;;;;;46426:32:0;;;;;;;;;46469:19;46501:2;46491:13;;;;;-1:-1:-1;;46491:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46491:13:0;87:34:-1;135:17;;-1:-1;46491:13:0;;46469:35;;46515:27;46555:2;46545:13;;;;;-1:-1:-1;;46545:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46545:13:0;87:34:-1;135:17;;-1:-1;46545:13:0;;46515:43;;46569:30;46602:40;:38;:40::i;:::-;46569:73;;46692:4;46684:6;46677:20;47045:9;47035:8;47031:24;47026:1;47018:6;47014:14;47004:25;47000:56;46993:4;46985:6;46981:17;46974:83;47094:4;47078:14;47071:28;47147:22;47140:4;47124:14;47120:25;47113:57;47191:18;47222:2;47212:13;;;;;-1:-1:-1;;47212:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47212:13:0;87:34:-1;135:17;;-1:-1;47212:13:0;;47191:34;;47285:6;47278:4;47271:5;47267:16;47260:32;47313:25;47351:1;47341:12;;;;;-1:-1:-1;;47341:12:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47341:12:0;87:34:-1;135:17;;-1:-1;47341:12:0;;47313:40;;47364;47374:5;47381:2;47385:1;47388:12;47402:1;47364:9;:40::i;:::-;;47415:20;;:::i;:::-;:62;;;;;;;;47439:6;47415:62;;;;47447:6;47415:62;;;;47455:14;47415:62;;;;47471:5;47415:62;;;;;47488:15;47506:47;;;;;;;;;;;;-1:-1:-1;;;47506:47:0;;;;47531:4;47537:15;47506:14;:47::i;:::-;47488:65;;47564:30;47607:1;47597:12;;;;;-1:-1:-1;;47597:12:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47597:12:0;87:34:-1;135:17;;-1:-1;47597:12:0;;47564:45;;47677:4;47663:12;47659:23;47653:30;-1:-1:-1;;;47739:1:0;47735:73;47728:4;47709:17;47705:28;47697:112;-1:-1:-1;;;47865:1:0;47861:71;47854:4;47835:17;47831:28;47823:110;-1:-1:-1;;;47989:1:0;47985:69;47978:4;47959:17;47955:28;47947:108;-1:-1:-1;;;48111:1:0;48107:67;48100:4;48081:17;48077:28;48069:106;-1:-1:-1;;;48231:1:0;48227:65;48220:4;48201:17;48197:28;48189:104;-1:-1:-1;;;48349:1:0;48345:63;48338:4;48319:17;48315:28;48307:102;-1:-1:-1;;;48465:1:0;48461:61;48454:4;48435:17;48431:28;48423:100;-1:-1:-1;;;48579:1:0;48575:59;48568:4;48549:17;48545:28;48537:98;-1:-1:-1;48656:123:0;48688:7;48724:17;48743:7;;;;48752:15;48759:4;:7;48752:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;48752:15:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48752:15:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48752:15:0;;;;;;;-1:-1:-1;;;48769:7:0;;;;48707:70;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;48707:70:0;;;;;-1:-1:-1;48707:70:0;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;48707:70:0;;;;;;;;;;-1:-1:-1;48707:70:0;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;48707:70:0;;;;;-1:-1:-1;48707:70:0;;-1:-1:-1;;;;;48707:70:0;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48707:70:0;;;48697:81;;;;;;48656:31;:123::i;:::-;-1:-1:-1;48797:7:0;46129:2683;-1:-1:-1;;;;;;;;;;;46129:2683:0:o;38355:136::-;12171:3;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;38446:8;;-1:-1:-1;;;;;38446:8:0;:26;38473:9;38446:37;;-1:-1:-1;;;;;;38446:37:0;;;;;;;;;;;;;;;;-1:-1:-1;38446:37:0;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38446:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38446:37:0;;;;38355:136;:::o;38196:151::-;38311:18;;38287:53::o;12912:208::-;12977:16;13091:21;:19;:21::i;13263:133::-;13321:26;13367:21;13360:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13263:133;:::o;52653:2791::-;52805:19;52950:22;52996:6;53003:10;52996:18;;;;;;;;;;;;;;52975:51;;;-1:-1:-1;53037:20:0;53024:2;53060:13;;;;;-1:-1:-1;;53060:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;53060:13:0;87:34:-1;135:17;;-1:-1;53060:13:0;;53037:36;;53084:52;53094:6;53102:17;53121:2;53125:7;53134:1;53084:9;:52::i;:::-;;53202:48;53226:12;53240:8;53209:40;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;53209:40:0;;;;;;;-1:-1:-1;;53209:40:0;;;-1:-1:-1;53209:40:0;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53209:40:0;;;53202:48;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53202:48:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53202:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53202:48:0;;;;;;;-1:-1:-1;53185:66:0;;-1:-1:-1;;53185:66:0;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53185:66:0;;;53175:77;;;;;;53163:7;53153:18;;;;;;:99;53147:147;;53277:5;53270:12;;;;;;53147:147;53304:17;53345:6;53352:41;;;53345:6;:49;;;;;;;;;;;;;53399:1;53334:66;53324:77;;;;;-1:-1:-1;;53324:77:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;53324:77:0;87:34:-1;135:17;;-1:-1;53324:77:0;;53304:97;;53412:78;53422:6;53430:17;53451:15;53430:37;53469:4;:11;53482:4;53488:1;53412:9;:78::i;:::-;;53660:90;53679:12;53686:4;53679:12;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;53679:12:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53679:12:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53679:12:0;;;;;;;-1:-1:-1;53693:7:0;;-1:-1:-1;53713:6:0;;-1:-1:-1;53720:26:0;;;53713:6;:34;;;;;;;;;;;;;53660:18;:90::i;:::-;53655:136;;53774:5;53767:12;;;;;;;53655:136;54040:29;54082:10;54072:21;;;;;-1:-1:-1;;54072:21:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54072:21:0;87:34:-1;135:17;;-1:-1;54072:21:0;;54040:53;;54104:74;54114:6;54122:17;54142:2;54122:22;54146:10;54158:16;54176:1;54104:9;:74::i;:::-;;54189:26;54228:2;54218:13;;;;;-1:-1:-1;;54218:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54218:13:0;87:34:-1;135:17;;-1:-1;54218:13:0;;54189:42;;54242:15;54300:4;:11;54260:17;54280:2;54260:22;54286:10;54260:37;:51;54314:2;54260:56;54242:74;;54327:56;54337:6;54358:2;54345:10;:15;54362:2;54366:13;54381:1;54327:9;:56::i;:::-;;54394:25;54422:21;54429:13;54422:21;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;54422:21:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54422:21:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54422:21:0;;;;;;;-1:-1:-1;54521:16:0;;-1:-1:-1;54422:21:0;;-1:-1:-1;54504:53:0;;-1:-1:-1;54504:53:0;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;377:20;365:33;;;-1:-1;;;54504:53:0;;;;;;;-1:-1:-1;;54504:53:0;;;-1:-1:-1;54504:53:0;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;54504:53:0;;;54494:64;;;;;;54458:32;;;;:22;:32;;;;;;:100;54454:232;;;54624:32;;;;:22;:32;;;;;54617:39;;;54454:232;;;54681:5;54674:12;;;;;;;;;;;54454:232;54810:20;54843:15;54833:26;;;;;-1:-1:-1;;54833:26:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54833:26:0;87:34:-1;135:17;;-1:-1;54833:26:0;;54810:49;;54870:65;54880:6;54888:17;54907:15;54924:7;54933:1;54870:9;:65::i;:::-;;54951:47;54961:15;54968:7;54961:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;54961:15:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54961:15:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54961:15:0;;;;;;;-1:-1:-1;54978:4:0;;-1:-1:-1;54984:13:0;;-1:-1:-1;54951:9:0;:47::i;:::-;54946:93;;55022:5;55015:12;;;;;;;;;;;;54946:93;55138:60;;;;:41;:60;;;;;;;;55133:226;;55278:69;55328:6;55336:10;55278:49;:69::i;:::-;55215:60;;;;:41;:60;;;;;:132;;-1:-1:-1;;55215:132:0;;;;;;;;;;55133:226;55376:60;;;;:41;:60;;;;;;;;;-1:-1:-1;;;;;;;;;52653:2791:0;;;;;;;:::o;38499:171::-;12171:3;;38579:23;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;38622:8;;-1:-1:-1;;;;;38622:8:0;:38;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;55583:707:0;55711:25;55766:19;;;;55804:3;:10;:23;;55796:32;;;;;;55893:2;:16;;;;56010:14;;56035:227;56066:7;56052:11;56047:2;:16;:26;56042:1;:32;56035:227;;;56147:1;56140:5;56136:13;56130:20;56175:11;;;56168:24;56226:2;56221:7;;;;56243;56035:227;;;-1:-1:-1;56279:3:0;;55583:707;-1:-1:-1;;;;;;;55583:707:0:o;35836:384::-;12171:3;;35956:11;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;35980:22;36017:1;36005:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35980:39:0;-1:-1:-1;36043:5:0;:8;36030:7;36038:1;36030:10;;;;;;;;;;;;;;;;;:21;36075:5;36081:1;36075:8;;;;36062:7;36070:1;36062:10;;;;;;;;;;;;;;;;;:21;36107:8;;;;36094:7;36102:1;36094:10;;;;;;;;;;;;;;;;;:21;36139:8;;;;36126:7;36134:1;36126:10;;;;;;;;;;;;;:21;;;;36165:47;36180:11;36193:7;36202:9;36165:14;:47::i;:::-;36158:54;35836:384;-1:-1:-1;;;;;35836:384:0:o;48820:154::-;48920:32;;;;:22;:32;;48955:11;;48920:32;;;:46;-1:-1:-1;;48820:154:0:o;13404:2070::-;13453:16;13544:1;13486:55;13498:42;13486:11;:55::i;:::-;:59;13482:250;;;13572:3;:69;;-1:-1:-1;;;;;;13572:69:0;13598:42;13572:69;;;13656:38;;;;;;;;;;;;-1:-1:-1;;;13656:38:0;;;;:23;:38::i;:::-;-1:-1:-1;13716:4:0;13709:11;;13482:250;13804:1;13746:55;13758:42;13746:11;:55::i;:::-;:59;13742:259;;;13840:3;:69;;-1:-1:-1;;;;;;13840:69:0;13866:42;13840:69;;;13924:39;;;;;;;;;;;;-1:-1:-1;;;13924:39:0;;;;:23;:39::i;13742:259::-;14073:1;14015:55;14027:42;14015:11;:55::i;:::-;:59;14011:254;;;14107:3;:69;;-1:-1:-1;;;;;;14107:69:0;14133:42;14107:69;;;14191:36;;;;;;;;;;;;-1:-1:-1;;;14191:36:0;;;;:23;:36::i;14011:254::-;14337:1;14279:55;14291:42;14279:11;:55::i;:::-;:59;14275:258;;;14373:3;:69;;-1:-1:-1;;;;;;14373:69:0;14399:42;14373:69;;;14457:38;;;;;;;;;;;;-1:-1:-1;;;14457:38:0;;;;:23;:38::i;14275:258::-;14605:1;14547:55;14559:42;14547:11;:55::i;:::-;:59;14543:256;;;14640:3;:69;;-1:-1:-1;;;;;;14640:69:0;14666:42;14640:69;;;14724:37;;;;;;;;;;;;-1:-1:-1;;;14724:37:0;;;;:23;:37::i;14543:256::-;14871:1;14813:55;14825:42;14813:11;:55::i;:::-;:59;14809:205;;;-1:-1:-1;14907:3:0;:69;;-1:-1:-1;;;;;;14907:69:0;14933:42;14907:69;;;14991:11;;14809:205;15086:1;15028:55;15040:42;15028:11;:55::i;:::-;:59;15024:204;;;-1:-1:-1;15121:3:0;:69;;-1:-1:-1;;;;;;15121:69:0;15147:42;15121:69;;;15205:11;;15024:204;15300:1;15242:55;15254:42;15242:11;:55::i;:::-;:59;15238:206;;;-1:-1:-1;15337:3:0;:69;;-1:-1:-1;;;;;;15337:69:0;15363:42;15337:69;;;15421:11;;15238:206;-1:-1:-1;15461:5:0;13404:2070;:::o;52242:403::-;52353:19;52399:4;52440:13;52422:7;:14;:31;52414:40;;;;;;52470:9;52465:149;52488:13;52485:1;:16;52465:149;;;52542:7;52550:1;52542:10;;;;;;;;;;;;-1:-1:-1;;;;;;52542:10:0;52527:8;52536:1;52527:11;;;;;;;;;;-1:-1:-1;;;;;52527:25:0;;;52523:80;;52582:5;52573:14;;52523:80;52503:3;;52465:149;;;-1:-1:-1;52631:6:0;52242:403;-1:-1:-1;;;;52242:403:0:o;48982:1025::-;49081:17;49111:10;49132:14;49157:12;49180;49203:18;49234:2;49224:13;;;;;-1:-1:-1;;49224:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;49224:13:0;87:34:-1;135:17;;-1:-1;49224:13:0;;49203:34;;49248:11;49293:4;49278:7;49286:1;49278:10;;;;;;;;;;;;;;;;49272:17;;49267:23;;:30;49262:1;:36;49248:50;;49317:40;49327:7;49336:6;49344:2;49348:5;49355:1;49317:9;:40::i;:::-;49309:48;;49368:18;49399:2;49389:13;;;;;-1:-1:-1;;49389:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;49389:13:0;87:34:-1;135:17;;-1:-1;49389:13:0;;49368:34;;49423:6;49413:16;;;;49448:84;49458:7;49512:4;49488:7;49505:1;49496:6;:10;49488:19;;;;;;;;;;;;;;49477:39;49467:50;;49519:2;49523:5;49530:1;49448:9;:84::i;:::-;49440:92;;49592:2;49585:5;49581:14;49575:21;49567:29;;49635:2;49628:5;49624:14;49618:21;49610:29;;49678:41;49694:8;49704:2;49708:4;49714;49678:15;:41::i;:::-;49660:59;;-1:-1:-1;49660:59:0;-1:-1:-1;;;;;;49734:55:0;;49768:7;;49758:18;;;;;-1:-1:-1;;;;;49734:55:0;;49730:270;;;49813:4;49806:11;;;;;;;;;;;49730:270;49868:41;49884:8;49894:2;49898:4;49904;49868:15;:41::i;:::-;49850:59;;-1:-1:-1;49850:59:0;-1:-1:-1;;;;;;49932:55:0;;49966:7;;49956:18;;;;;-1:-1:-1;;;;;49932:55:0;;;-1:-1:-1;49924:64:0;;-1:-1:-1;;;;;;;49924:64:0;50015:1622;50131:19;50163:10;50326:17;50367:6;50374:11;50388:1;50374:15;50367:23;;;;;;;;;;;;;;50395:1;50356:40;50346:51;;;;;-1:-1:-1;;50346:51:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50346:51:0;87:34:-1;135:17;;-1:-1;50346:51:0;;50326:71;;50408:52;50418:6;50426:11;50439:4;:11;50452:4;50458:1;50408:9;:52::i;:::-;;50471:27;50511:2;50501:13;;;;;-1:-1:-1;;50501:13:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50501:13:0;87:34:-1;135:17;;-1:-1;50501:13:0;;50471:43;;50525:47;50535:6;50543:5;50550:2;50554:14;50570:1;50525:9;:47::i;:::-;;50583:20;50616:11;50606:22;;;;;-1:-1:-1;;50606:22:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50606:22:0;87:34:-1;135:17;;-1:-1;50606:22:0;-1:-1:-1;50583:45:0;-1:-1:-1;;;;50583:45:0;50647:1;50583:45;50639:10;;;;;;;;;;:27;-1:-1:-1;;;;;50639:27:0;;;;;;;;;50684:51;50694:6;50716:2;50702:11;:16;50720:2;50724:7;50733:1;50684:9;:51::i;:::-;;50746:21;:93;;;;;;;;;;;;;;;;;;;50850:43;50860:8;50870:1;50873:2;50877:7;50886:6;50850:9;:43::i;:::-;;50912:48;50922:15;50929:7;50922:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;50922:15:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50922:15:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50922:15:0;;;;;;;-1:-1:-1;50939:4:0;;-1:-1:-1;50945:14:0;;-1:-1:-1;50912:9:0;:48::i;:::-;50904:56;;50976:5;50971:51;;51005:5;50998:12;;;;;;;;;50971:51;51125:22;:158;;;;;;;;;;;;;;;;;;;51294:20;51327:6;51317:17;;;;;-1:-1:-1;;51317:17:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51317:17:0;87:34:-1;135:17;;-1:-1;51317:17:0;-1:-1:-1;51294:40:0;-1:-1:-1;;;;51294:40:0;51353:1;51294:40;51345:10;;;;;;;;;;:17;-1:-1:-1;;;;;51345:17:0;;;;;;;;;51373:36;51383:6;51391:1;51394:2;51398:7;51407:1;51373:9;:36::i;:::-;;51420:17;51461:6;51468:10;51461:18;;;;;;;;;;;;;;51484:1;51450:35;51440:46;;;;;-1:-1:-1;;51440:46:0;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51440:46:0;87:34:-1;135:17;;-1:-1;51440:46:0;;51420:66;;51497:47;51507:6;51515;51523:4;:11;51536:4;51542:1;51497:9;:47::i;:::-;;51563:43;51573:15;51580:7;51573:15;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;51573:15:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51573:15:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51573:15:0;;;;;;;-1:-1:-1;51590:4:0;;-1:-1:-1;51596:9:0;;-1:-1:-1;51563:9:0;:43::i;:::-;51555:51;50015:1622;-1:-1:-1;;;;;;;;;;;50015:1622:0:o;30239:461::-;12171:3;;30358:11;;-1:-1:-1;;;;;12171:3:0;12163:26;;12162:64;;-1:-1:-1;12215:3:0;;12195:25;;-1:-1:-1;;;;;12215:3:0;12195:11;:25::i;:::-;:30;12162:64;12158:132;;;12243:35;11809:1;12243:19;:35::i;:::-;;12158:132;12325:3;;-1:-1:-1;;;;;12325:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:0;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:0;;;12304:37;;;;-1:-1:-1;12300:108:0;;-1:-1:-1;;12300:108:0;12379:3;;-1:-1:-1;;;;;12379:3:0;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:0;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:0;-1:-1:-1;;;;;12358:38:0;;;;;;;;;;-1:-1:-1;;;12300:108:0;30382:10;30395:8;;-1:-1:-1;;;;;30395:8:0;:17;30413:11;30426:9;30395:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30395:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30395:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30395:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30395:41:0;;;;;;;-1:-1:-1;;;;30459:7:0;30469:11;:23;;30459:33;30451:41;;30447:109;;;-1:-1:-1;30516:1:0;;-1:-1:-1;30509:8:0;;30447:109;30566:17;30586:14;30594:5;30586:7;:14::i;:::-;30618:8;;;30566:34;;-1:-1:-1;;;;;;30618:8:0;;;;:28;;30653:5;;30663:11;30566:34;30682:9;30618:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30618:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30618:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30618:74:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30618:74:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30618:74:0;;;;;;;30239:461;-1:-1:-1;;;;;;;;;30239:461:0:o;13128:127::-;13210:21;13234:13;;13210:37;;;;;;;;:::i;56502:1003::-;56594:13;56609:25;57049:8;57068:12;57133:4;57127:11;57165:5;57159:4;57152:19;57207:2;57202;57196:4;57192:13;57185:25;57246:2;57241;57235:4;57231:13;57224:25;57285:2;57280;57274:4;57270:13;57263:25;57343:2;57337:4;57332:3;57326:4;57323:1;57320;57314:4;57309:37;57302:44;;57453:4;57447:11;57487:3;;;;-1:-1:-1;56502:1003:0;;-1:-1:-1;;;;;;;56502:1003:0:o;45746:375::-;45807:26;45846:19;:17;:19::i;:::-;45876:24;;:::i;:::-;45911:22;45923:3;45928:4;45911:11;:22::i;:::-;45944:16;:3;:14;:16::i;:::-;45976:6;45971:90;45992:4;:11;45988:1;:15;45971:90;;;46025:24;46041:4;46046:1;46041:7;;;;;;;;;;;;;;46025:3;;:24;:15;:24;:::i;:::-;46005:3;;45971:90;;;;46071:17;:3;:15;:17::i;:::-;46106:3;:7;46099:14;45746:375;-1:-1:-1;;;45746:375:0:o;59237:175::-;59333:4;59327:11;59388:4;59381:5;59377:16;59367:8;59361:4;59352:42;59300:105;:::o;4367:446::-;4458:9;4493:2;4458:9;4482:13;:18;4478:83;;4546:2;4535:8;:13;4529:2;:20;4517:32;4478:83;4571:13;;;:24;;;4685:4;4679:11;4704:17;;;;4747:1;4735:14;;4776:18;;;4770:4;4763:32;-1:-1:-1;4653:153:0:o;10765:130::-;10837:50;10864:4;8872:1;10837:26;:50::i;10370:181::-;10464:49;10475:4;8822:1;10499:6;:13;10464:10;:49::i;:::-;10524:19;:4;10536:6;10524:19;:11;:19;:::i;11037:138::-;11110:57;11137:4;9037:1;9793:147;9894:38;:4;9928:2;9913:11;9923:1;9913:11;;;;9912:18;9894:38;:11;:38;:::i;9047:738::-;9159:2;9149:6;:12;9145:633;;9178:42;:4;9196:22;9207:1;9197:11;;;9196:22;;;9178:42;:11;:42;:::i;:::-;9145:633;;;9252:4;9242:6;:14;9238:540;;9273:38;:4;9307:2;9292:11;9302:1;9292:11;;;;9291:18;9273:38;:11;:38;:::i;:::-;9326:25;:4;9341:6;9349:1;9326:25;:14;:25;:::i;:::-;;9238:540;;;9383:6;9373;:16;9369:409;;9406:38;:4;9440:2;9425:11;9435:1;9425:11;;;;9424:18;9406:38;:11;:38;:::i;:::-;9459:25;:4;9474:6;9482:1;9459:25;:14;:25;:::i;9369:409::-;9516:10;9506:6;:20;9502:276;;9543:38;:4;9577:2;9562:11;9572:1;9562:11;;;;9561:18;9543:38;:11;:38;:::i;:::-;9596:25;:4;9611:6;9619:1;9596:25;:14;:25;:::i;9502:276::-;9653:18;9643:6;:28;9639:139;;9688:38;:4;9722:2;9707:11;9717:1;9707:11;;;;9706:18;9688:38;:11;:38;:::i;:::-;9741:25;:4;9756:6;9764:1;9741:25;:14;:25;:::i;:::-;;9047:738;;;:::o;5453:1241::-;5532:21;;:::i;:::-;5603:4;:13;;;5585:4;:8;:15;5570:5;:12;:30;:46;5566:129;;;5633:50;5640:4;5646:32;5650:4;:13;;;5665:5;:12;5646:3;:32::i;:::-;5681:1;5646:36;5633:6;:50::i;:::-;5705:9;5725:8;5744;5755:5;:12;5744:23;;5822:4;5816:11;5898:6;5892:13;5986:2;5977:6;5969;5965:19;5961:28;5953:36;;6110:5;6104:12;6092:25;6077:41;;6174:2;6163:14;;;-1:-1:-1;6198:212:0;6211:2;6204:3;:9;6198:212;;6330:3;6324:10;6311:24;;6372:2;6364:10;;;;6389:9;;;;;-1:-1:-1;;6215:9:0;6198:212;;;-1:-1:-1;;6440:2:0;:8;;;6432:3;:17;:21;6543:9;;6537:3;6531:10;6527:26;6600:4;6593;6587:11;6583:22;6632:21;6619:35;;;-1:-1:-1;6682:4:0;;5453:1241;-1:-1:-1;;;;5453:1241:0:o;6988:586::-;7088:4;:13;;;7066:4;:8;:15;7084:1;7066:19;:35;7062:99;;;7118:31;7125:4;7131;:13;;;7147:1;7131:17;7118:6;:31::i;:::-;7215:4;7209:11;7291:6;7285:13;7383:2;7374:6;7366;7362:19;7358:28;7482:5;7476:4;7468:20;-1:-1:-1;7529:1:0;7517:14;7502:30;;-1:-1:-1;;7180:387:0:o;7868:748::-;7953:21;;:::i;:::-;8016:4;:13;;;7998:4;:8;:15;7991:4;:22;:38;7987:113;;;8046:42;8053:4;8059:24;8063:4;:13;;;8078:4;8059:3;:24::i;8046:42::-;-1:-1:-1;;8122:3:0;:11;;;:15;8192:4;8186:11;8268:6;8262:13;8360:4;8351:6;8343;8339:19;8335:30;8498:5;8490:4;8486:9;8479:4;8473:11;8469:27;8466:38;8453:52;;8534:17;;;8519:33;;;-1:-1:-1;8604:4:0;;7868:748;-1:-1:-1;;7868:748:0:o;5006:151::-;5059:9;5090:2;5085;:7;5081:49;;;-1:-1:-1;5116:2:0;5109:9;;5081:49;-1:-1:-1;5147:2:0;5006:151;-1:-1:-1;5006:151:0:o;4821:177::-;4897:19;4919:4;:8;4897:30;;4938:21;4943:4;4949:9;4938:4;:21::i;:::-;4970:20;4977:4;4983:6;4970;:20::i;1714:4503:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1714:4503:1;;;-1:-1:-1;1714:4503:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://2195d455db5e5c3b96c68682ef749896e98ed1670beb8c4aafb62b9f5f6bf3d7
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.