Notice: The OpenEthereum team and core developers are aware of the syncing issues facing the OE client and are working to diagnose and fix. New block data will not be available on Etherscan until a fix is released.

Contract 0x8E0bC7a37D2db44BbC46Ac77A1e4296A5a3Fb862

 
Ad
Ad
Txn Hash Method
Block
From
To
Value
0x9e768aaa9f8a8a1ce2952abc70efc820a915a09be2b45eaa311a8eb81c10e8d6Set ECDSA Signer99782162020-05-01 4:34:33349 days 10 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0001848726
0x060ca7e9abc8da52ca1f420ea66cf6125a68befd9a8962d6b14faa367d35654eSet ECDSA Signer99776832020-05-01 2:44:10349 days 12 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0001050363
0xba0d762b9b0f06404c6d99b489f32519e1216162473950c2ba00818bed345bc2Set ECDSA Signer99727252020-04-30 7:55:25350 days 7 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0007002420
0x945104f752bef26965dc438978a45e98f223920735c8c340a9f7bb1360b7db4dWith Draw Fund98689862020-04-14 6:49:35366 days 8 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000638962
0xb2e94ca5b0e609e437ffbad208bb16fa36bd9296310228c92b277deb57b54ea0Set ECDSA Signer98304392020-04-08 8:28:51372 days 6 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0002076363
0xfc108b610dbc2a202edd9584f976b469b16189380798786c124d1d2c1bccd7ed__callback97837342020-04-01 4:06:34379 days 11 hrs ago0x000042425e06b0b1e8e20a811c91d6864608324b IN  SquareQueue.info0 Ether0.002175120
0xbda366643e9ffe528dacaa62bf49d88ab15a522a1b11ace4191532755bcc97a4Play Submit97837322020-04-01 4:06:26379 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0.1 Ether0.00047207051.1
0x9a9412f13949a21b2de9b64cadfe74fca2fa8bf45de7cbfdc6cf30ddbb215503__callback97789112020-03-31 10:20:17380 days 4 hrs ago0x00004242ca3469e30ae4a62775fee6584ed3fdca IN  SquareQueue.info0 Ether0.0025253420
0x8d15f18eb6def590a5262df4e07ef1727c1580c6fe262717dc733230ce56ee02Play Submit97789082020-03-31 10:20:02380 days 4 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0.2 Ether0.0004382441
0xe1f7031dfdf406f2cc30f389c2d1ac85613ef66474c7b224f4a4547080a27dcaWith Draw Fund97771662020-03-31 3:43:21380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.00003511641.1
0x6dba13fdbd5e94333732a59a7c7c1d170683d723d3ce3742f8ac8ae0098bf9e3With Draw Fund97771652020-03-31 3:43:07380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xc2586dd0f8a08138255ac03223b3317a44e827e67bf4f47967bd422ef0fff11fWith Draw Fund97771642020-03-31 3:42:49380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xcb61c8d43cb2dc98c1e72583926edfebdbc1ca29871dae374d8e078f17337dcaWith Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319121
0x66abf203932f676e5386cfe18aaa7345bed36fb1423a8c4e15dba5f0b2576d15With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xb56f36dad35032b0dc3c2dd516eeb946c602dfc959067c2698a9f22fcb10f22dWith Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319121
0x35e49fe4ed156862a070a913df1d8a4207b8283a50005a3ee932cb670ad0367cWith Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xc0b0857e79b7f1d4b238945d16503dbb01afe640871d110d575f2ee9f40c3d73With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0x84c372cc1a580d8b7156284f6cfa04784aa43d25abba9ca542db1b89d650a064With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0x7572f1ca70005ed1d1453095c8f48f7626d882aaae4b6a22a31bc9861b022c98With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xd97f26103720ad9141d4e29d9f5bcca537ed2ff20b5584437fe2df32b0276f9cWith Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xc25a266a6f0a595757f0a22ccda293b993b466595229edf7a1beca78ef1243e5With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xe1f65244992270482b94765ddb5c2e9f442b0283cc39511aaa046db42e117538With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0x132c39d79df06e9eed2d075365112033e863b92612b78b9a10b4913ddbc2560cWith Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0xdd79b37bd3533f7f7f6d6eee646d79c41c2f28cdd3bcf303b9703126e8a1cfe4With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319241
0x57d471d1c940dc6134c2a497c241a444f1a0d619b75eb782c6714c9fa289fe18With Draw Fund97771282020-03-31 3:36:20380 days 11 hrs ago0xa20eee839756cf7b550d5b1e985e30634d987de8 IN  SquareQueue.info0 Ether0.0000319121
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x945104f752bef26965dc438978a45e98f223920735c8c340a9f7bb1360b7db4d98689862020-04-14 6:49:35366 days 8 hrs ago SquareQueue.info0xa20eee839756cf7b550d5b1e985e30634d987de87.560239021166265604 Ether
0xbda366643e9ffe528dacaa62bf49d88ab15a522a1b11ace4191532755bcc97a497837322020-04-01 4:06:26379 days 11 hrs ago SquareQueue.info 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0054016064257028 Ether
0x8d15f18eb6def590a5262df4e07ef1727c1580c6fe262717dc733230ce56ee0297789082020-03-31 10:20:02380 days 4 hrs ago SquareQueue.info 0x3dbdc81a6edc94c720b0b88fb65dbd7e395fdcf60.0068716064257028 Ether
0xe1f7031dfdf406f2cc30f389c2d1ac85613ef66474c7b224f4a4547080a27dca97771662020-03-31 3:43:21380 days 11 hrs ago SquareQueue.info0xd61677f8cd372901c01df22c6096513b3f1580e50.001 Ether
0x6dba13fdbd5e94333732a59a7c7c1d170683d723d3ce3742f8ac8ae0098bf9e397771652020-03-31 3:43:07380 days 11 hrs ago SquareQueue.info0x60b15bf939e09c602e96ca5d2fc8c2055b764dcb0.001 Ether
0xc2586dd0f8a08138255ac03223b3317a44e827e67bf4f47967bd422ef0fff11f97771642020-03-31 3:42:49380 days 11 hrs ago SquareQueue.info0x948a0cce6d57edb9077ccb7dd9c78b6587775f110.001 Ether
0xcb61c8d43cb2dc98c1e72583926edfebdbc1ca29871dae374d8e078f17337dca97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x46ee00a5d5576b344ede3b8f1eeb016d8aa1d0fa0.001 Ether
0x66abf203932f676e5386cfe18aaa7345bed36fb1423a8c4e15dba5f0b2576d1597771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x98f39ed4d4ab573259fd398b4dbaf3abfcb6b1950.001 Ether
0xb56f36dad35032b0dc3c2dd516eeb946c602dfc959067c2698a9f22fcb10f22d97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x8d133233657deb63c39c71363b00ecaf5346eb9e0.001 Ether
0x35e49fe4ed156862a070a913df1d8a4207b8283a50005a3ee932cb670ad0367c97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0xb328bf977f9202d691d64c3bd283459fe542dd8e0.001 Ether
0xc0b0857e79b7f1d4b238945d16503dbb01afe640871d110d575f2ee9f40c3d7397771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x680f367c5d068af862411924a220620dca3793b80.001 Ether
0x84c372cc1a580d8b7156284f6cfa04784aa43d25abba9ca542db1b89d650a06497771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0xd0e6bf8710300e5d1f12cf30c5877a395ed97f930.001 Ether
0x7572f1ca70005ed1d1453095c8f48f7626d882aaae4b6a22a31bc9861b022c9897771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x4c11aa6d5c1c27c99f4e6c48b6d4a4bd88607cb50.001 Ether
0xd97f26103720ad9141d4e29d9f5bcca537ed2ff20b5584437fe2df32b0276f9c97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x7e89c56d750d0ebdba0810baa93c4d2d254a61200.001 Ether
0xc25a266a6f0a595757f0a22ccda293b993b466595229edf7a1beca78ef1243e597771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0xbb0b7538e434071dde0ee07c3dbca3b5435fe96a0.001 Ether
0xe1f65244992270482b94765ddb5c2e9f442b0283cc39511aaa046db42e11753897771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x1342a43a8894a7d9d454ec5e32f85fb4a2c433a70.001 Ether
0x132c39d79df06e9eed2d075365112033e863b92612b78b9a10b4913ddbc2560c97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x0a3018a8c8ff1cc58f199219ea1eb11b258608f70.001 Ether
0xdd79b37bd3533f7f7f6d6eee646d79c41c2f28cdd3bcf303b9703126e8a1cfe497771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x0d510c526d16658b99c9e0d89b88b0f338ad8fd80.001 Ether
0x57d471d1c940dc6134c2a497c241a444f1a0d619b75eb782c6714c9fa289fe1897771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x8e0840b31bf3b4717445f33000ba07fe04941b160.001 Ether
0x780c0c3188d3a83e5786dc15bd11d35013867669b5390efaa50b948cbd87200697771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x3b4772a5e2befc37efea27e7043bd19de14175540.001 Ether
0x9170b9ffb70d3def70c6d219efc1acacffde8cd28e730baefbf1d3cf16373a4c97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x7149e33adffff476ab54bbd773cbe0372b9489070.001 Ether
0x5a92e23df425f01054fb2365be49aed272e5c100882b796fa165b160864ec42f97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x15c1146fe36522187f548aca09b04d2575039f8a0.001 Ether
0x68c903ef8995347192000039587f037b5bb358e7dea119d7afc94154e948102a97771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x888888885184115d64a4a868b3fdd91c44de470a0.001 Ether
0x2947898fb11964bdebdca33b9ca5de5b8547206613d5d8111daee3283adf4cd297771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x49a81f01e26b8fbbb05a7a70019c69566d8b84810.001 Ether
0x64d912a4602e17587c59a2c04e02eaee8808ad00fa0e79d03c79d09b53dfed5697771282020-03-31 3:36:20380 days 11 hrs ago SquareQueue.info0x25a0e1e03276f195dcaf8f189302deee2d798a4e0.001 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SquareQueue

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 3: SquareQueue_one_dice.sol
// <SquareQueue>

/*
MIT License

Copyright (c) 2020 SquareQueue

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.16;

/**
 * @title one of the contracts in the Square Queue - One-dice ver pre-release 0.1. Continuous updates will be developed. Updating to a new version does not delete the legacy contract.
 *
 * @notice Please read the white paper. The comments and CODE of this smart contract are written in plain language and easy CODE for those who are not familiar with programming languages.
 * @author SquareQueue - [email protected] https://github.com/squarequeue
 *
 * @notice Players can join the game either by using the SquareQueue webpage or by generating transactions directly SquareQueue smart-contract inner function.
 * @dev Join the game with the 'playSubmit' function and receive the result of the game with the __callback function. These two functions have separate tx / block.number but this.smartContract controls everything automatically.
 * SquareQueue is an impartial space that takes advantage of https://provable.xyz/ (Oraclize)'s a random data source to provide end-users with untampered entropy.
 */

import "SafeMath.sol";
import "provableAPI_0.5.sol";

contract SquareQueue is usingProvable {
    using SafeMath for uint;
    uint public playerCount;
    uint public callbackCount;
    uint public minEntryGas;
    uint public minEntryGasCallBack;
    
    constructor () public {
        provable_setProof(proofType_Ledger); // The proof type of the (RNG) random number generator is ledger
        owner = msg.sender;
        ECDSASigner = 0xbFd38732F3bD7Cd3e761ce578386d7E3B091ad24; // ECDSA (ecRecover) will be assigned to the new address.
        minEntryGas = 500000;
        maximumProfit = 5000000000000000000;
        provablelimitBlock = 15;
        provablelimitTime = 5 minutes;
        checkedTime = now;
        preJamCount = 0;
    }
    /**
     * @notice struct Play is used as a database for each game.
     * @param amount - Amount of Ethereum sent by a player to a game.
     * @param modulo - The type of game the player participated in is assigned.
     * @param rollUnder - The variable that will be used in the inverse proportion for the winning rate and prize Ether.
     * @param playBlockNumber - Stores the block number of a game in which the player participates, and is the baseline start block for automatic refunds if the processing is delayed due to unexpected EVM or Ethereum network or Provable(Oraclize) callback issues.
     * @param resultBlockNumber - The block number from which the result of the game is derived.
     * @param mask - It assigns a number or a combination of numbers chosen by the player and will be used to determine the game win or loss using random numbers and Bitwise operations. Details are described in the function contractDetermineExecute inside this contract.
     * @param possibleWinAmount - It is used to lock the contract's funds by pre-calculating ether that the player can obtain.
     * @param trophyIncreaseFee - Deducted by 'trophyFee'% of the player's game amount, and add to the trophy weight.
     * @param playCount - Represents the sequence number of the game.
     * @param player - Assign the player address(msg_sender).
     */
    struct Play {
        uint amount;
        uint modulo;
        uint rollUnder;
        uint playBlockNumber;
        uint resultBlockNumber;
        uint mask;
        uint possibleWinAmount;
        uint trophyIncreaseFee;
        uint playCount;
        uint Tpayment;
        uint Payment;
        address payable player;
    }

    /**
     * @notice a struct that calls a function that guarantees an automatic refund when the player's game state is deadlocked.
     * @notice function __callback, function checkNcleanJam - check if the callback arrived too late, and did not arrive completely, and failed the Random proof Verify test.
     * @param play_number - Game Counting. Same as struct Play @ playCount.
     * @param play_amount - True if the result of the game is derived; false if no result is obtained.
     * @param play_queryId - Individual gameplay unique identifier and a query id for callBack.
     */
    struct CheckJam {
        uint play_number;
        bool play_amount;
        bytes32 play_queryId;
    }
    
    mapping (uint => Play) public playTable;
    mapping (uint => CheckJam) public checkJamDB;

    modifier onlyOwner {
        require (msg.sender == owner, "This function can only create Tx by the owner of the contract.");
        _;
    }

    event submitGameParams(uint playCount, uint eventCode, address indexed player, uint playMask, uint playModulo, uint rollUnder, bytes32 indexed queryId);

    uint public minimumParticipateAmount = 0.1 ether; // a game minimum entry-amount
    uint public maximumParticipateAmount = 10 ether; // a game maximum entry-amount
    uint public playAmountLockedInAccount; // 'playAmountLockedInAccount' is a guarantee that the contract will be able to pay when the player wins.
    uint criticalPlayNumber = 62/*0xFFFFFFFFF*/; // The threshold that prevents the game from overflow.

    /**
     * @notice The owner can adjust entry-amount due to future changes in Ethereum value or any hard fork or gas rate change. 
     * @notice No matter how the owner change these values, the entry-amount variables are declared public, so you can call the value of the Contract at any time, such as through BlockExplorer, and so on.
     */ 
    function SetParticipateAmount(uint _minimumParticipateAmount, uint _maximumParticipateAmount) external onlyOwner {
        minimumParticipateAmount = _minimumParticipateAmount;
        maximumParticipateAmount = _maximumParticipateAmount;
    }

    /**
     * @notice The Provable(Oraclize) Random Data Source leverages the Ledger Proof and a custom application to generate unbiased random numbers. 
     * Parameters of queryId to request a random number.
     * @param numberOfBytes - This value returns a 2^(bit-bytes) entropy value. For example, a value of 4 would result in 2^32.
     * @param delay - Set 0 to run without delay.
     * @param callbackGas - The gasprice of the callback.
     * @param callbackGasAmplify - When the automatic refund loop operation occurs, it temporarily boosts the gas price. This price is supported by the contract, not the player.
     * @dev The values may be changed to optimize the performance of the contract. No matter how the owner change these values, variables are declared public, so you can call the value of the Contract at any time, such as through BlockExplorer, and so on.
     */
    uint public numberOfBytes = 7;
    uint public delay = 0;
    uint public callbackGas = 210000 + 40000;
    uint public callbackGasAmplify;
    uint public loopGas = 3500 + 21000;
    function setRNGqueryParameter(uint _numberOfBytes, uint _delay, uint _callbackGas) external onlyOwner {
        numberOfBytes = _numberOfBytes;
        delay = _delay;
        callbackGas = _callbackGas;
    }
    
    event restPlayAmountLockedInAccount(uint debugCode); // Lines for debugging
    
    /**
     * @notice can modify the variable to check the minimum gas value to ensure that the player has submitted enough gas to play the game.
     * @dev callback fee will be charged even if out of gas occurs. It must be reverted before an "out of gas" occurs.
     * The default is assigned to the constructor, but it can be modified because may need to consider future EVM environments.
     */
    function setMinGasEntry(uint _newGasEntry, uint _loopGas) external onlyOwner {
        minEntryGas = _newGasEntry;
        loopGas = _loopGas;
    }

    function callbackGasCalcul() private {
        minEntryGasCallBack = (jamCount.sub(preJamCount) * loopGas) + callbackGas;
        if (now > checkedTime + provablelimitTime && jamCount.sub(preJamCount) >= 3) {
            callbackGasAmplify = minEntryGasCallBack;
            minEntryGas += minEntryGasCallBack;
        } else {

        }
    }
    
    event test(uint testcode, uint contractfee, uint throphyfee, uint possiblewinamount); // Lines for debugging
    function standardNormalDistributionAndSDF () private {
        
    }
    
    /**
     * @notice This bitwise operation checks how many cases the player has submitted. The function contractDetermineExecute contains information about bitwise.
     * @param cntN play_mask
     * @return Counts how many numbers have selected and return the result. The return value is the ratio of dividends based on the player winning rate.
     */
    function calculatePlayQuota (uint cntN) private pure returns (uint _playQuota) {
        cntN = cntN - ((cntN >> 1) & 1431655765);
        cntN = (cntN & 0x33333333) + ((cntN >> 2) & 0x33333333);
        uint baseQ = ((cntN + (cntN >> 4) & 0xF0F0F0F) * 0x1010101) >> 24; 
        /**
         * Rather than applying the standard normal distribution / SDF / Hypergeometric distribution to values as a function, hard-coding it because there are only six cases.
         * Please note the Square Queue white paper for more details.
         */
        if (baseQ == 1) {return 61400;}if (baseQ == 2) {return 25100;}if (baseQ == 3) {return 17300;}if (baseQ == 4) {return 13900;}if (baseQ == 5) {return 12200;}if (baseQ < 0 || baseQ > 5) {return 0;}
    }
    /**
     * @notice When a transaction occurs in function playSubmit, all the process of game win/loss decision and winning ether transfer or refund will be automatically processed by smart-contracts.
     * @param _playMask Will be assigned to play_mask of struct Play.
     * @param _playModulo Will be assigned to play_modulo of struct Play.
     * @param _submitHash Check the ECDSA (Elliptic Curve Digital Signature Algorithm) signature with param _v, _r, _s. SquareQueue uses Provable (Oraclize) rather than commit-reveal RNGs, so ECDSA is not essential, but it is an effective way to deal with the occurrence of aggressive transactions.    
     */
    function playSubmit(uint _playMask, uint _playModulo, bytes32 _submitHash, uint8 _v, bytes32 _r, bytes32 _s) external payable {
        uint tempMinEntryGas = minEntryGas;
        callbackGasCalcul();
        //Make sure player have enough gas to join the game.
        require(gasleft() > minEntryGas, "There is not enough gas to play the game.");
        minEntryGas = tempMinEntryGas;
        
        address payable play_player = msg.sender;
        uint play_amount = msg.value;
        uint play_modulo = _playModulo;
        uint play_playBlockNumber = block.number;
        uint play_mask = _playMask;

        require (play_modulo == 6 /*|| play_modulo == 72*/, "Only 6 case games are available.");
        require (play_amount >= minimumParticipateAmount && play_amount <= maximumParticipateAmount, "Ehter amount must be within the game playable range.");
        require (play_mask > 0 && play_mask <= criticalPlayNumber, "The numbers chosen by the player must be within the gameable range.");
        require (ECDSASigner == ecrecover(_submitHash, _v, _r, _s), "ECDSA signature is not valid. ");

        /** 
        Players can choose a number of cases to increase their winning probability, but in this case, their dividends will be lower.
        On the contrary to this, dividends can be raised by lowering the winning probability. Everything is up to the player's choice.
        rollUnder is a variable used to calculate dividends by interacting with playMask.
        */
        uint play_rollUnder = calculatePlayQuota(play_mask);
        require (0 < play_rollUnder && play_rollUnder <= play_modulo.mul(10234), "The probability does not exist in the range.");

        uint play_possibleWinAmount;
        uint play_trophyIncreaseFee;

        //Deducted by 'trophyFee'1/10% of the player's game amount, and add to the trophy weight.
        uint _trophyIncreaseFee = play_amount * trophyFee / 1000;
        //Deducted by 'contractFee'1/10% of the player's game amount, and add to the trophy weight.
        uint contractFee = play_amount * contractCommissionPercentage / 1000;
        //It is used to lock the contract's funds by pre-calculating ether that the player can obtain.
        uint _possibleWinAmount = ((play_amount * play_rollUnder).div(10000)) - (contractFee + _trophyIncreaseFee);

        emit test (111, contractFee, _trophyIncreaseFee, _possibleWinAmount); // Lines for debugging
        
        if (trophyWeight + playAmountLockedInAccount + _possibleWinAmount + _trophyIncreaseFee <= address(this).balance) {
            require (_possibleWinAmount <= play_amount.add(maximumProfit), "At this time, it is not possible to play out of the range maximum ether profits of this contract.");

            //Fetch the player's possibleWinAmount&trophyIncreaseFee information into the database.
            play_possibleWinAmount = _possibleWinAmount;
            play_trophyIncreaseFee = _trophyIncreaseFee;

            //Guarantees that all potentially payable ethers are payable.
            playAmountLockedInAccount = playAmountLockedInAccount.add(play_possibleWinAmount);
            trophyWeight = trophyWeight.add(play_trophyIncreaseFee);
        } else {
            revert("There is not enough funds to play your game on SquareQueue Contract.");
        }
        
        /*
         * @dev Note that there is a fee charged for generating queryId even if an error occurs inside the contract after the queryId is generated.
         * @dev It is recommended to create a queryId that generates a callBack if the player can be sure to complete the game without any errors.
         */
        bytes32 queryId = getQueryId();

        // The queryId, which is guaranteed to be unique on the network, is usefully reused as an identifier for each game.
        Play storage play = playTable[uint(queryId)];

        //Make sure the current gameplay is allocated in the free space of the structure database. 
        if (play.player == address(0)) {
            //Fetch the player's current information into the database.
            play.player = play_player;
            play.amount = play_amount;
            play.modulo = play_modulo;
            play.playBlockNumber = play_playBlockNumber;
            play.mask = play_mask;
            play.possibleWinAmount = play_possibleWinAmount;
            play.trophyIncreaseFee = play_trophyIncreaseFee;
            play.rollUnder = play_rollUnder;
        } else {
            revert ("Cannot assign a player to the database.");
        }
        
        //assgin the game play count. Will be used for Function cleanPlayAmountLockedInAccount.
        playerCount = playerCount.add(1);
        
        /*
         * SquareQueue contract's automatic refund system works for gameplay that is deadlocked for any reason due to problems with EVM or Network or callBack or else.
         * To do this and operate a separate DB for easy identification.
         */
        storeJam(queryId);
        
        /**
        All data submitted by the player can be seen transparently through the input data item of the transaction.
        Nevertheless, submitGameParams generates an event to check that the contract's internal function returns correctly even it consumes a bit more gas.
        Players can always check for events using the ethereum block explorer. In addition, players can check their rollUnder and queryId value.
         */
        emit submitGameParams(play.playCount, 100, play.player, play.mask, play.modulo, play.rollUnder, queryId);
    }

    bytes32 public queryidToPerformTheCheck; //Variable that determines whether the game is in turn to run checkNcleanJam

    /**
     * @notice Every time the function provable_query(oraclize_query) is called, it returns a unique ID, hereby referred to as queryId, which is guaranteed to be unique in the given network execution context.
     */
    function getQueryId() private returns(bytes32 _Id) {
        uint _callbackGas = callbackGas;
        bool checkIdBool;

        if (now > checkedTime + provablelimitTime && jamCount.sub(preJamCount) >= 3) {
            _callbackGas = callbackGasAmplify;
            checkIdBool = true;
        }
        _Id = provable_newRandomDSQuery(delay, numberOfBytes, _callbackGas);
        
        if (checkIdBool == true) {
            checkedTime = now;
            queryidToPerformTheCheck = _Id;
            checkIdBool = false;
        } else {
            queryidToPerformTheCheck = 0x1111111111111112222222222233333322112222222211111111111111111111;
        }
        return(_Id);
    }
    
    /**
     * provableRandomValue - Declared for Random Number Generator(RNG) by Provable(Oraclize).
     * provablelimitBlock - SquareQueue will automatically issue a refund if __callback Tx is generated too late due to an unexpected EVM or network or other problem. The criterion is block number.
     * provablelimitTime - SquareQueue will automatically issue a refund if __callback Tx is generated too late due to an unexpected EVM or network or other problem. The criterion is Time.
     * As mentioned in the Ethereum Yellow Paper, Contracts can't get hashes before the latest 256 blocks.(However, 256 blocks are too much time for the user to wait for the game results, so SquareQueue'll cut that down.)
     * So in order to eliminate potential risks, the contract will refund if a callback occurs above the limit block.
     */
    uint provableRandomValue;
    uint public provablelimitBlock;
    uint public provablelimitTime;
    
    function setProvablelimitLine(uint _provablelimitBlock, uint _provablelimitTime) external onlyOwner {
        provablelimitBlock = _provablelimitBlock;
        provablelimitTime = _provablelimitTime;
    }

    uint public contractCommissionPercentage = 7; // n= 0.n% Deduct contract service charge. It is calculated as a percentage of the player's game amount.
    uint public trophyFee = 3; // n=0.n% Deduct trophy weight charge. It is calculated as a percentage of the player's game amount.

    /**
     * @notice The owner can adjust entry-amount due to future changes in Ethereum value or any hard fork or gas rate change. No matter how owner change these values, the entry-amount variables are declared public, so you can call the value of the Contract at any time, such as through BlockExplorer, and so on.
     * @param trophyWeight Trophy prize. This value cannot be changed by anyone, including the owner.
     * @param trophyTicketQualification Entry-amount lower than this value will not be accepted for winning the trophy.
     * @param trophyModulo Chance to win a Trophy 10000 == 0.01%
     * @param maximumProfit As a "wei" unit of "Ether". A player cannot take a prize-amount larger than this value. However, whatever the trophy prize-amount is, a player can earn it separately from this variable.
     * trophyTicketQualification and trophyModulo can be changed by the contract owner (reason for scalability). But, no matter how the owner change these values, variables are declared public, so you can call the value of the Contract at any time, such as through BlockExplorer, and so on.
     */
    uint public trophyWeight;
    uint public trophyTicketQualification = 0.5 ether;
    uint public trophyModulo = 10000;
    uint public maximumProfit;
    bool public trophy_period = false;
    function SetTrophyVariable(uint _trophyTicketQualification, uint _trophyModulo, bool _trophy_period) external onlyOwner {
        trophy_period = _trophy_period;
        trophyTicketQualification = _trophyTicketQualification;
        trophyModulo = _trophyModulo;
    }

    address payable public owner;
    address payable private nextOwner;
    address public ECDSASigner;

    /**
     * All events are written as a basis for transparently operating the return values of this smart contract.
     * Payment - Player Address, amount earned by the player in the game.
     * Tpayment - Player Address, Trophy prize earned by the player.
     * gameQueryIdRandomEntropy - Player Address, Provable(Oraclize) queryId, Random entropy.
     * gameResult - Player Choice(playMask), Game Choice(Random Number Generation Algorithm), The estimated amount of ether acquisition when the player wins.
     *              A player choice does not have to match the game choice perfectly to win the game. There is a wider winning strategy. Details are described in function contractDetermineExecute.
     * automaticRefund - The amount of ether refunded to the automatic refund system, queryId.
     */
    event Payment(uint eventCode, address indexed recipient, uint dividend);
    event Tpayment(uint eventCode, address indexed recipient, uint _tAmount);
    event gameQueryIdRandomEntropy(uint eventCode, address indexed recipient, bytes32 indexed ProvableQueryId, uint entropy);
    event gameResult(bytes32 indexed queryId, uint playCount, uint eventCode, uint PlayerChoice, uint GameChoice, uint payment, uint trophyPayment);
    event automaticRefund(uint eventCode, uint amount, bytes32 indexed queryId);

    /**
     * This function cannot have arguments, cannot return anything and must have external visibility and payable state mutability. 
     * It is executed on a call to the contract with empty calldata. This is the function that is executed on plain Ether transfers (e.g. via .send() or .transfer()). 
     * If no such function exists, but a payable fallback function exists, the fallback function will be called on a plain Ether transfer. 
     * If neither a receive Ether nor a payable fallback function is present, the contract cannot receive Ether through regular transactions and throws an exception.
     */
    //receive() external payable { //solidity 0.6.0
        function() external payable {

    }

    /**
     * In order to change the owner of this contract, the original owner must send a new owner address(function approveNextOwner), 
     * and then the ownership must be changed only after the new owner approves ownership(function acceptNextOwner).
     */
    function approveNextOwner(address payable _nextOwner) external onlyOwner {
        require (_nextOwner != owner, "Cannot approve current owner.");
        nextOwner = _nextOwner;
    }

    function acceptNextOwner() external {
        require (msg.sender == nextOwner, "Can only accept preapproved new owner.");
        owner = nextOwner;
    }

    /**
     * Assign a new ECDSA Address for SquareQueue.
     * ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address):
     * recover the address associated with the public key from elliptic curve signature or return zero on error. The function parameters correspond to ECDSA values of the signature:
     * r = first 32 bytes of signature s = second 32 bytes of signature v = final 1 byte of signature.
     */
    function setECDSASigner(address _newECDSASigner) external onlyOwner {
        cleaningBlock = block.number;
        prePlayerCount = playerCount;
        ECDSASigner = _newECDSASigner;
    }

    /**
     * If an unexpected error occurs after playSubmit and the Contract is reverted, the funds of the PlayAmountLockedInAccount of the corresponding tx will be locked forever.
     * Funtion contractDetermineExecute, checkNcleanJam solves this problem, but this function is necessary because it doesn't know what will change in the future EVM environment.
     * Don't worry. The send(transfer) statement throws an exception at revert, so all statements such as refunds and payments will be performed.
     * However, funds in PlayAmountLockedInAccount must be released. This function effectively cut off entrance new gameplay by allocating a new ECDSA and not telling the user 
     * the v, r, s values, and allocates 0 to PlayAmountLockedInAccount when more than a refundable block number has passed(If a refund is required, complete all refunds) and there is certainly no new gameplay.
     */
    uint cleaningBlock; // If there is already a game in progress, this variable to wait for the result of games.
    uint prePlayerCount; // If there is gameplay since the new ECDSA address was assigned, this variable prevents cleanLockedInAccountAndPlayCallcount function from executing.
    function cleanLockedInAccountAndPlayCallcount() external onlyOwner {
        require(cleaningBlock + provablelimitBlock <= block.number, "It can be executed after all automatic refunds have been processed.");
        require(prePlayerCount == playerCount, "There is already a user who played the game.");
        
        //If there is a deadlocked player, all ether will be refunded.
        checkNcleanJam();

        playAmountLockedInAccount = 0;
        callbackCount = 0;
    }

    /**
     * SquareQueue can set an upper limit on the amount of game entry and winnings. This value can be associated with maximumParticipateAmount to effectively prevent fund depletion.
     * No matter how the owner changes these values, variables are declared public, so you can call the value of the Contract at any time, such as through BlockExplorer, and so on.
     * and it will not any affect the game in progress.
     */
    function setMaximumProfit(uint _maximumProfit) public onlyOwner {
        maximumProfit = _maximumProfit;
    }

    // The owner of SquareQueue can increase the trophy weight. Of course, can't lower it. Our best wishes go with you.
    function bumpTrophyWeight(uint _bumpAmount) external onlyOwner {
        require (trophyWeight + playAmountLockedInAccount + _bumpAmount <= address(this).balance, "The contract needs to replenish the fund because it is scarce.");
        trophyWeight = trophyWeight.add(_bumpAmount);
    }

    /**
     * SquareQueue can upgrade the Contract and update the current version of the Contract to upgrade the game, add games, or get better.
     * In this case, you have to disable the older version of the Contract, but SquareQueue owner can't break it if there is a game in progress.
     * Thus, SquareQueue owners can use ECDSA variables to limit new game participation and dismiss Contract only after the results of all the games in progress have been obtained.
     */
    function contractDissolution() external onlyOwner {
        require (playAmountLockedInAccount == 0, "There is a game in progress.");
        selfdestruct(owner);
    }

    /**
     * Play_storage_play Call the game and player information via the identifier. 
     * @param _queryId Every time the function provable_query(oraclize_query) is called, it returns a unique ID in the network.
     * @param _entropy Key entropy of random numbers used to derive game results. The random data of provable(oraclize) is leveraging the Ledger proof to prove that the origin of the generated randomness is really a secure Ledger device.
     * @dev Run automatically when SquareQueue gets a callBack from Provable (Oraclize). If the Contract does not receive callBack, it will not run in any case.
     */
    function contractDetermineExecute(Play storage _play,bytes32 _queryId, uint _entropy) private {
        //Get the player's data from the __callback.
        uint _amount = _play.amount;
        uint _modulo = _play.modulo;
        address payable player = _play.player;

        //Check that the player has already participated in the game and is waiting for the result, not a new contract.
        if (_amount != 0 && player != address(0)) {
            _play.amount = 0;
            CheckJam storage checkJam = checkJamDB[_play.playCount];
            checkJam.play_amount = true;
        } else {
            revert ("The player does not exist in the database or is already closed.");
        }
        
        /**
         * game - Modular arithmetic of Provable's random numbers and player game types is used to calculate game base results.
         * gameWin & trophyWin - If the player meets the conditions for winning the prize, it will be replaced by the prize value, or else Zero as it is.
         */
        uint game = _entropy.mod(_modulo);
        uint gameWin = 0;
        uint trophyWin = 0;
        
        /**
         * The SquareQueue SmartContract establishes a foundation that builds on existing Ethereum and Provable(Oraclize) processes while creating transparency and trust with players.
         * These events make the calculation of "SquareQueue SmartContract" more transparent and fair, which is useful for players to check the game result. a player can always check with BlockExplorer or a similar solution, and so on.
         * Details are described in the event comment.
         */
        emit gameQueryIdRandomEntropy(200, _play.player, _queryId, _entropy);

        /**
         * SquareQueue generates a random number using the Random Data Source at https://provable.xyz/ (Oraclize) and uses this random number to calculate the player's winning result.
         * The Provable Random Data Source leverages the Ledger Proof and a custom application to generate unbiased random numbers and provide them on demand to blockchain and non-blockchain based applications.
         * The end applications can perform verification step to unsure that the randomness provided was truly generated in an secure hardware environment provided by a Ledger Nano S.
         * 
         * If the result of the game's random number includes the player's chosen numbers, the player wins the game and wins the prize. 
         * The player can choose only one number or choose multiple numbers. Everything depends on the choice of the player.
         * Consequentially, outcomes of the game have in numerous cases, and one of the best ways to calculate it effectively is to use Bitwise operators.
         * However, it is trouble to explain how the Bitwise operators are applied to the game, so I will explain a complex algorithm very easily.
         *  (Case to choose only in six figures(6).)
         * n = player Number, A = array of multiples of 2, B = bit of A
         *  |  n  |   A   |    B   |     i.e.    || When player select a number, all numbers are substitute by multiples of two starting with one. (inside game algorithms and Tx.)
         *  |_____|_______|________|_____________|| If player choose the number "2,3,5", "2 (000010), 4 (000100), 16 (010000)" is selected as the bitmask, and this value is aggregated and 22(010110) will be transmitted.
         *  |  1 =>   1  => 000001 |             || a player wins if only one number is matched, even if a player selects multiple numbers. (Of course, choose multiple numbers, a higher chance of winning but the lower prize.)
         *  |  2 =>   2  => 000010 |  (2) 000010 || The random number of the game, when 6 numbers are the reference, is one of the numbers 0,1,2,3,4,5 by uint game = uint(_entropy).mod(modulo);
         *  |  3 =>   4  => 000100 |  (4)+000100 || When the derived random number is called "r", "2^r" is used to determine the result of the game. If r is 5, then 2^5 = 32(100000):case1.
         *  |  4 =>   8  => 001000 |             ||(case 1:lose)|| (case 2:win)|| 32 (100000) and (22) 010110 Bitwise "& AND" returns 0. A bitwise AND is a binary operation that takes two equal-length binary representations.
         *  |  5 =>  16  => 010000 |  (5)+010000 || (22) 010110 || (22) 010110 || Thus, if both bits in the compared position are 1, the bit in the resulting binary representation is 1 (1 × 1 = 1); otherwise, the result is 0 (1 × 0 = 0 and 0 × 0 = 0).
         *  |  6 =>  32  => 100000 |=(22) 010110 || (32) 100000 || (16) 010000 || 
         *  |----------------------|-------------||-------------||-------------|| If r is 4, then 2^4 = 16(010000):case2. Bitwise operation results in a nonzero number.
         *  |                      |             ||   &  000000 ||   &  010000 || This means that the number or one of player choice matches the Game random number, so player winning.
         * 
         * As mentioned earlier, the comments and CODE of this smart contract are written in plain language for people who do not know the programming language.
         * This is not an exact description of a Bitmask Using Bitwise Operators. but, it makes it point more accessible because it is expressed as being the very closest analogy. 
         */
            if ((2 ** game) & _play.mask != 0) {
                gameWin = _play.possibleWinAmount;
            }
        //contract releases the locked funds to pay ether to the player.
        playAmountLockedInAccount = playAmountLockedInAccount.sub(_play.possibleWinAmount);
        uint _playAmountLockedInAccount = playAmountLockedInAccount; // Lines for debugging

        //calculate whether a trophy can be acquired separately from the game result.
        if (_amount >= trophyTicketQualification) {
            //The trophy is a process of accumulate 0.03% of Ether amount submitted by users to game. In the ICO period, only the accumulation is made, after which the winner comes out using provable.xyz random.
            if (trophy_period == true) {
                uint trophyRandomness = _entropy.mod(trophyModulo);
                if (trophyRandomness == 1) {
                    trophyWin = trophyWeight;
                    trophyWeight = 0;
                }
            }
        }
        
        sendFund(player, trophyWin, gameWin, _play);
        emit gameResult(_queryId, _play.playCount, 300, _play.mask, 2 ** game, gameWin, trophyWin);
        
        /* 
         * If there is a problem with callBack, we will automatically refund to the player.
         * This feature does not run every time, but when the threshold is reached.
         */
        if (_queryId == queryidToPerformTheCheck) {
            checkNcleanJam();
        } else { }
        
        // Lines for debugging
        if (playAmountLockedInAccount != _playAmountLockedInAccount) {
            emit restPlayAmountLockedInAccount (1010);
        }
    }

    /**
     * @param recipient Address
     * @param _tAmount Trophy prizes
     * @param _gAmount Game prizes
     * @notice Ether transfer function called from contractDetermineExecute/withDrawFund/refundPlay
     */
    function sendFund(address payable recipient, uint _tAmount, uint _gAmount, Play storage _play) private {
        if (_tAmount !=0 || _gAmount != 0) {

            if (_tAmount != 0 && _tAmount > 0) { //Determine if there is a trophy prize.
                recipient.transfer(_tAmount);
                emit Tpayment(400, recipient, _tAmount);
                _play.Tpayment = _tAmount;
            }
            
            if (_gAmount != 0 && _gAmount > 0) { //Determine if there is a game prize.
                recipient.transfer(_gAmount);
                emit Payment(500, recipient, _gAmount);
                _play.Payment = _gAmount;
            }
        }
    }

    /**
     * @param recipient Address
     * @param _withDrawAmount Ether amount to be sent.
     * @notice Trophy prizes never withdraws except in the case of winning.
     */
    function withDrawFund(address payable recipient, uint _withDrawAmount) external onlyOwner { 
        require (trophyWeight + playAmountLockedInAccount + _withDrawAmount <= address(this).balance, "The process cannot proceed, the withdrawal amount exceeds the withdrawable amount.");
        recipient.transfer(_withDrawAmount);
    }

    /**
     * a transaction executing a function of the SquareQueue is broadcasted by a player. The function contains a special instruction which manifest to Provable(Oraclize), who is constantly monitoring the Ethereum for such instruction, a request for data.
     * According to the parameters of such a request, Provable will fetch or compute a result, build, sign and broadcast the transaction carrying the result. In the default configuration, such a transaction will execute the __callback function which 
     * should be placed in the smart contract by its developer: for this reason, this transaction is referred to in the documentation as the Provable(Oraclize) __callback transaction.
     * One of the fundamental characteristics of Provable(Oraclize) is the capability of returning data to a smart contract together with one or more proofs of Authenticity of the data.
     * Authenticity proofs are at the core of Provable's oracle model. Smart contracts can request authenticity proofs together with their data by calling the provable_setProof function available in the usingProvable contract. 
     * The authenticity proof can be either delivered directly to the smart contract or it can be saved. When a smart contract requests for an authenticity proof, it must define a different callback function with the following arguments: 
     * function __callback(bytes32 queryId, string result, bytes proof) provable_setProof(oraclize_setProof) function of SquareQueue the following format : provable_setProof(proofType_Ledger) in the constructor.
     */
    function __callback(bytes32 _queryId, string memory _result, bytes memory _proof) public {
        require(msg.sender == provable_cbAddress(), "Must comply with the provable cbAddress.");
        Play storage play = playTable[uint(_queryId)];
        callbackCount = callbackCount.add(1);
        
        bool BlockCheck = true; 
        
        if (block.number > play.playBlockNumber && block.number < play.playBlockNumber + provablelimitBlock) {
            
        } else {
            /**
             * if in extreme cases Tx is generated too late due to an unexpected EVM or network or other problem, player amount will be refunded.
             * "Too late callBack tx arrives, SquareQueue automatically refunded except fee."
             */
            refundPlay(_queryId, 602);
            BlockCheck = false;
        }
        
        if(provable_randomDS_proofVerify__returnCode(_queryId, _result, _proof) == 0 && BlockCheck == true) {
            /**
             * @notice The proof verification has passed! Convert the random bytes received from the  query to a `uint256`.
             * to safely check the authenticity of the data received it is customary to verify the proof included in a Provable answer. Once the verifyProof method succeeds (returning 'true'), 
             * the user can be sure that neither Provable(Oraclize) nor other Parties have tampered with the results.
             */
            // generate random game values using Provable(Oraclize) Random Data Source.
            provableRandomValue = uint(keccak256(abi.encodePacked(_result)));

            /**
             * When the contract is thrown (e.g revert ...), the state is also reverted, so returning a value of zero.
             * e.g. this case also applies for an automatic refund.
             */
            play.resultBlockNumber = block.number;
            
            /// @dev Should never be run in any case unless receiving a Provable callBack.
            contractDetermineExecute(play, _queryId, provableRandomValue);
        } else {
            /**
             * If the proof verification is not passed, refund the player's ether amount and terminate the tx.
             * The proof provable_proofVerify has failed, so SquareQueue automatically refunded ether except fee.
             */
            if(BlockCheck == true) {
                refundPlay(_queryId, 611);
            }
        }
        
    }
    
    /**
     * @notice If the Contract does not work properly, it will revert all processes and refund the player's amount. However, the amount(e.g. fee,gas) deducted from the trophy and the contract is not refundable.
     * The whole process takes place automatically, without an owner or any player intervention. 'contractCommissionPercentage' is deducted to prevent malicious transactions.
     * @dev After this function is executed to eliminate any potential risks, all the contract's progress should be reverted.
     */
    function refundPlay(bytes32 _queryId, uint _id) private {
        uint _playAmountLockedInAccount = playAmountLockedInAccount; // Lines for debugging
        Play storage play = playTable[uint(_queryId)];
        
        uint _recoverAmount = play.possibleWinAmount;
        uint _amount = play.amount;
        
        if (_amount == 0) {
            revert("Since the player game ether amount is zero or the refund has already been completed.");
        } else {
            // Fetch the player game amount and issue a refund if ever there was one.
            uint deduct = contractCommissionPercentage + trophyFee;
            _amount = play.amount - play.amount * deduct / 1000;
            play.amount = 0;
            CheckJam storage checkJam = checkJamDB[play.playCount];
            checkJam.play_amount = true;
            play.possibleWinAmount = 0;
        }
        
        // Unlock ether to be refunded.
        playAmountLockedInAccount = playAmountLockedInAccount.sub(_recoverAmount);
        
        //Proceed with a refund and write a log.
        play.player.transfer(_amount);
        emit automaticRefund(_id, _amount, _queryId);
        
        //Lines for debugging
        if (playAmountLockedInAccount != _playAmountLockedInAccount) {
            emit restPlayAmountLockedInAccount (2020);
        }
    }

    /**
     * jamCount - Same as playerCount, used as a starting and ending point to check if callBack is correct.
     * checkedTime - Allocates the block that last checked time.
     * preJamCount - Allocates the block that last checked jamCount.
     */
    uint public jamCount;
    uint public checkedTime;
    uint public preJamCount;
    
    /**
     * @notice If callBack does not arrive until after provablelimitBlock, and the outcome of the game cannot be obtained, the ether will be refunded to the player.
     * @dev When callBack arrives too late, it solves the problem inside the callBack function. This function handles the case of what callBack is not completely.
     */
    function storeJam(bytes32 _queryId) private {
        jamCount = jamCount.add(1);
        CheckJam storage checkJam = checkJamDB[jamCount];
        checkJam.play_number = jamCount;
        checkJam.play_queryId = _queryId;
        
        Play storage _play = playTable[uint(checkJam.play_queryId)];
        _play.playCount = jamCount;
    }
    
    /**
     * Each provablelimitBlock is reached, it checks to all callback has been reached correctly.
     * @notice The process of checking for this callBack checks both the callBack arrival time in the __callBack function and the case where callBack does not come at all in the checkNcleanJam function.
     * All of these features guarantee that automatic refunds will be activated if there is a problem with the gameplay.
     */
    function checkNcleanJam() private {
        uint passCount;
        for(uint i = jamCount; preJamCount < i; i--) {
            CheckJam storage checkJam = checkJamDB[i];
            Play storage _play = playTable[uint(checkJam.play_queryId)];
            
            if (block.number == _play.playBlockNumber) {
                passCount ++;
                //Only the game tx of the previous block of the current block is processed.
            } else {
                if (_play.amount != 0) {
                    refundPlay(checkJam.play_queryId, 702);
                } else { }
            }
        }
        preJamCount = jamCount.sub(passCount) - 1;
    }
    /**
    Disclaimers

    Please note, during your use of the SquareQueue that online vehicle, and that it carries with it a certain degree of Ethereum financial risk. 
    Players should be aware of this risk and govern themselves accordingly. SquareQueue is intended as a Smart-Contracts for those who are interested in the pastime of Ethereum space. 
    The content within this smart-contract is designed for informational purposes. Any information posted within this website & CODE is accurate to the best of our knowledge. 
    All measures are taken to ensure that such information is accurate and up-to-date, but please take note that some of it may become outdated and/or may be subject to change at any time, 
    including descriptions of features at the developer that are reviewed, at the discretion of the said developer.
    SquareQueue maintains no responsibility for player service issues that are particular to the space that is reviewed, nor does it serve as a clearinghouse for player complaints. 
    SquareQueue does not guarantee the accuracy, adequacy, completeness of any services and shall not be liable for any errors, omissions or other defects in, delays or interruptions 
    in such services, or for any actions taken in reliance thereon or availability of any information and is not responsible for any errors or omissions, regardless of the cause or for 
    the results obtained from the use of such information. SquareQueue, its affiliates and their third party suppliers disclaim any and all express or implied warranties.
    In no event shall SquareQueue be liable for any direct, indirect, special or consequential damages, costs, expenses, legal fees, or losses (including lost income or lost profit and opportunity profits) 
    in connection with your or others’ use of the SquareQueue(includes ICO and an exchange market and all services related to SquareQueue.).
    Players must play on the basis of trusting that SquareQueue Smart-Contract written in Solidity language on the Ethereum Network & Provable(Oraclize) works as-is code.
     */

    /**
    Square Queue designates the beginning of 'space' as a 'game’ but will ultimately develop it towards 'virtual society’ and hope that the impartial laws & ruls of the virtual society will be projected into the real world.
     */
}

File 1 of 3: 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>

File 2 of 3: SafeMath.sol
pragma solidity ^0.5.0;

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"dividend","type":"uint256"}],"name":"Payment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tAmount","type":"uint256"}],"name":"Tpayment","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"queryId","type":"bytes32"}],"name":"automaticRefund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"bytes32","name":"ProvableQueryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"entropy","type":"uint256"}],"name":"gameQueryIdRandomEntropy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"queryId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"playCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"PlayerChoice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"GameChoice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"trophyPayment","type":"uint256"}],"name":"gameResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debugCode","type":"uint256"}],"name":"restPlayAmountLockedInAccount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"playCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eventCode","type":"uint256"},{"indexed":true,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"playMask","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"playModulo","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rollUnder","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"queryId","type":"bytes32"}],"name":"submitGameParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"testcode","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"contractfee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"throphyfee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"possiblewinamount","type":"uint256"}],"name":"test","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"ECDSASigner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_minimumParticipateAmount","type":"uint256"},{"internalType":"uint256","name":"_maximumParticipateAmount","type":"uint256"}],"name":"SetParticipateAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_trophyTicketQualification","type":"uint256"},{"internalType":"uint256","name":"_trophyModulo","type":"uint256"},{"internalType":"bool","name":"_trophy_period","type":"bool"}],"name":"SetTrophyVariable","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":false,"inputs":[],"name":"acceptNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"_nextOwner","type":"address"}],"name":"approveNextOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_bumpAmount","type":"uint256"}],"name":"bumpTrophyWeight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"callbackCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callbackGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"callbackGasAmplify","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"checkJamDB","outputs":[{"internalType":"uint256","name":"play_number","type":"uint256"},{"internalType":"bool","name":"play_amount","type":"bool"},{"internalType":"bytes32","name":"play_queryId","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"checkedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cleanLockedInAccountAndPlayCallcount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractCommissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"contractDissolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"jamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"loopGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumParticipateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minEntryGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minEntryGasCallBack","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minimumParticipateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numberOfBytes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"playAmountLockedInAccount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_playMask","type":"uint256"},{"internalType":"uint256","name":"_playModulo","type":"uint256"},{"internalType":"bytes32","name":"_submitHash","type":"bytes32"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"playSubmit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"playTable","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"modulo","type":"uint256"},{"internalType":"uint256","name":"rollUnder","type":"uint256"},{"internalType":"uint256","name":"playBlockNumber","type":"uint256"},{"internalType":"uint256","name":"resultBlockNumber","type":"uint256"},{"internalType":"uint256","name":"mask","type":"uint256"},{"internalType":"uint256","name":"possibleWinAmount","type":"uint256"},{"internalType":"uint256","name":"trophyIncreaseFee","type":"uint256"},{"internalType":"uint256","name":"playCount","type":"uint256"},{"internalType":"uint256","name":"Tpayment","type":"uint256"},{"internalType":"uint256","name":"Payment","type":"uint256"},{"internalType":"address payable","name":"player","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"playerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"preJamCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provablelimitBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"provablelimitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"queryidToPerformTheCheck","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newECDSASigner","type":"address"}],"name":"setECDSASigner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_maximumProfit","type":"uint256"}],"name":"setMaximumProfit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_newGasEntry","type":"uint256"},{"internalType":"uint256","name":"_loopGas","type":"uint256"}],"name":"setMinGasEntry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_provablelimitBlock","type":"uint256"},{"internalType":"uint256","name":"_provablelimitTime","type":"uint256"}],"name":"setProvablelimitLine","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_numberOfBytes","type":"uint256"},{"internalType":"uint256","name":"_delay","type":"uint256"},{"internalType":"uint256","name":"_callbackGas","type":"uint256"}],"name":"setRNGqueryParameter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"trophyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trophyModulo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trophyTicketQualification","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trophyWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"trophy_period","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"_withDrawAmount","type":"uint256"}],"name":"withDrawFund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

608060405267016345785d8a0000600b55678ac7230489e80000600c55603e600e556007600f81905560006010556203d090601155615fb460135560185560036019556706f05b59d3b20000601b55612710601c55601e805460ff191690553480156200006b57600080fd5b5062000084600360fc1b6001600160e01b03620000f016565b601e80546101003302610100600160a81b0319909116179055602080546001600160a01b03191673bfd38732f3bd7cd3e761ce578386d7e3b091ad241790556207a120600755674563918244f40000601d55600f60165561012c601755426024556000602555620007c1565b6001546001600160a01b0316158062000126575060015462000124906001600160a01b03166001600160e01b03620002fd16565b155b1562000143576200014160006001600160e01b036200030116565b505b600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200019457600080fd5b505af1158015620001a9573d6000803e3d6000fd5b505050506040513d6020811015620001c057600080fd5b50516000546001600160a01b039081169116146200027757600160009054906101000a90046001600160a01b03166001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200022957600080fd5b505af11580156200023e573d6000803e3d6000fd5b505050506040513d60208110156200025557600080fd5b5051600080546001600160a01b0319166001600160a01b039092169190911790555b600080546040805163688dcfd760e01b81527fff000000000000000000000000000000000000000000000000000000000000008516600482015290516001600160a01b039092169263688dcfd79260248084019382900301818387803b158015620002e157600080fd5b505af1158015620002f6573d6000803e3d6000fd5b5050505050565b3b90565b6000620003166001600160e01b036200031c16565b92915050565b60008062000347731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed6001600160e01b03620002fd16565b1115620003b357600180546001600160a01b031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed17905560408051808201909152600b81526a195d1a17db585a5b9b995d60aa1b6020820152620003aa906001600160e01b036200070616565b50600162000703565b6000620003dd73c03a2615d5efaf5f49f60b7bb6583eaec212fdf16001600160e01b03620002fd16565b11156200044157600180546001600160a01b03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf117905560408051808201909152600c81526b6574685f726f707374656e3360a01b6020820152620003aa906001600160e01b036200070616565b60006200046b73b7a07bcf2ba2f2703b24c0691b5278999c59ac7e6001600160e01b03620002fd16565b1115620004cc57600180546001600160a01b03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e17905560408051808201909152600981526832ba342fb5b7bb30b760b91b6020820152620003aa906001600160e01b036200070616565b6000620004f673146500cfd35b22e4a392fe0adc06de1a1368ed486001600160e01b03620002fd16565b11156200055957600180546001600160a01b03191673146500cfd35b22e4a392fe0adc06de1a1368ed4817905560408051808201909152600b81526a6574685f72696e6b65627960a81b6020820152620003aa906001600160e01b036200070616565b60006200058373a2998efd205fb9d4b4963afb70778d6354ad3a416001600160e01b03620002fd16565b1115620005e557600180546001600160a01b03191673a2998efd205fb9d4b4963afb70778d6354ad3a4117905560408051808201909152600a8152696574685f676f65726c6960b01b6020820152620003aa906001600160e01b036200070616565b60006200060f736f485c8bf6fc43ea212e93bbf8ce046c7f1cb4756001600160e01b03620002fd16565b1115620006435750600180546001600160a01b031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47517815562000703565b60006200066d7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf6001600160e01b03620002fd16565b1115620006a15750600180546001600160a01b0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf17815562000703565b6000620006cb7351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa6001600160e01b03620002fd16565b1115620006ff5750600180546001600160a01b0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa17815562000703565b5060005b90565b80516200071b9060029060208401906200071f565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200076257805160ff191683800117855562000792565b8280016001018555821562000792579182015b828111156200079257825182559160200191906001019062000775565b50620007a0929150620007a4565b5090565b6200070391905b80821115620007a05760008155600101620007ab565b614aae80620007d16000396000f3fe6080604052600436106102725760003560e01c806394d6c5fe1161014f578063cbb5d624116100c1578063e9e6ed2f1161007a578063e9e6ed2f1461099f578063eb596630146109b4578063eece631c146109c9578063f162b861146109f9578063f21aad6e14610a0e578063fc8ec37414610a2357610272565b8063cbb5d62414610903578063cbe81a5514610918578063ccba97971461092d578063d06c54fb14610942578063d579fd4414610957578063e17f5cea1461098a57610272565b8063abab27f011610113578063abab27f014610850578063ac176af514610865578063be5ccaea1461089b578063bf7fa851146108b0578063c1f45107146108d9578063c4bd4344146108ee57610272565b806394d6c5fe146107be578063983075dc146107fc5780639bf3ccd114610811578063a10132ad14610826578063a3d84cf11461083b57610272565b806338bbfa50116101e857806364e3e9a8116101ac57806364e3e9a8146106695780636a42b8f81461069c5780636e758cfd146106b15780637ef3dd6a146106e1578063862892d3146106f65780638da5cb5b1461078d57610272565b806338bbfa50146104885780633d476b52146105c757806350a01b1514610600578063548d70641461061557806355429d8b1461063f57610272565b80631085a9da1161023a5780631085a9da1461032d57806311cf1818146103425780631d04592f1461039057806323d0e65c146103a557806327dc297e146103ba578063302bcc571461047357610272565b8063020ceebe1461027457806302ad9855146102ac57806302f59302146102dc5780630cd53879146103035780630dc54d7214610318575b005b34801561028057600080fd5b506102726004803603606081101561029757600080fd5b50803590602081013590604001351515610a38565b3480156102b857600080fd5b50610272600480360360408110156102cf57600080fd5b5080359060200135610aa2565b3480156102e857600080fd5b506102f1610afb565b60405190815260200160405180910390f35b34801561030f57600080fd5b506102f1610b01565b34801561032457600080fd5b506102f1610b07565b34801561033957600080fd5b506102f1610b0d565b34801561034e57600080fd5b5061036c6004803603602081101561036557600080fd5b5035610b13565b60405192835290151560208301526040808301919091526060909101905180910390f35b34801561039c57600080fd5b506102f1610b3a565b3480156103b157600080fd5b506102f1610b40565b3480156103c657600080fd5b50610272600480360360408110156103dd57600080fd5b813591908101906040810160208201356401000000008111156103ff57600080fd5b82018360208201111561041157600080fd5b8035906020019184600183028401116401000000008311171561043357600080fd5b91908080601f0160208091040260200160405190810160405281815292919060208401838380828437600092019190915250929550610b46945050505050565b34801561047f57600080fd5b506102f1610b81565b34801561049457600080fd5b50610272600480360360608110156104ab57600080fd5b813591908101906040810160208201356401000000008111156104cd57600080fd5b8201836020820111156104df57600080fd5b8035906020019184600183028401116401000000008311171561050157600080fd5b91908080601f0160208091040260200160405190810160405281815292919060208401838380828437600092019190915250929594936020810193503591505064010000000081111561055357600080fd5b82018360208201111561056557600080fd5b8035906020019184600183028401116401000000008311171561058757600080fd5b91908080601f0160208091040260200160405190810160405281815292919060208401838380828437600092019190915250929550610b87945050505050565b3480156105d357600080fd5b50610272600480360360408110156105ea57600080fd5b506001600160a01b038135169060200135610d08565b34801561060c57600080fd5b506102f1610dd9565b34801561062157600080fd5b506102726004803603602081101561063857600080fd5b5035610ddf565b34801561064b57600080fd5b506102726004803603602081101561066257600080fd5b5035610e8d565b34801561067557600080fd5b506102726004803603602081101561068c57600080fd5b50356001600160a01b0316610ee0565b3480156106a857600080fd5b506102f1610f5a565b3480156106bd57600080fd5b50610272600480360360408110156106d457600080fd5b5080359060200135610f60565b3480156106ed57600080fd5b506102f1610fb9565b34801561070257600080fd5b506107206004803603602081101561071957600080fd5b5035610fbf565b6040519b8c5260208c019a909a526040808c019990995260608b019790975260808a019590955260a089019390935260c088019190915260e08701526101008601526101208501526101408401526001600160a01b03909116610160830152610180909101905180910390f35b34801561079957600080fd5b506107a2611026565b6040516001600160a01b03909116815260200160405180910390f35b610272600480360360c08110156107d457600080fd5b5080359060208101359060408101359060ff6060820135169060808101359060a0013561103a565b34801561080857600080fd5b506107a2611583565b34801561081d57600080fd5b506102f1611592565b34801561083257600080fd5b506102f1611598565b34801561084757600080fd5b506102f161159e565b34801561085c57600080fd5b506102f16115a4565b34801561087157600080fd5b506102726004803603606081101561088857600080fd5b50803590602081013590604001356115aa565b3480156108a757600080fd5b506102f1611606565b3480156108bc57600080fd5b506108c561160c565b604051901515815260200160405180910390f35b3480156108e557600080fd5b506102f1611615565b3480156108fa57600080fd5b506102f161161b565b34801561090f57600080fd5b50610272611621565b34801561092457600080fd5b506102f16116d6565b34801561093957600080fd5b506102f16116dc565b34801561094e57600080fd5b506102726116e2565b34801561096357600080fd5b506102726004803603602081101561097a57600080fd5b50356001600160a01b0316611756565b34801561099657600080fd5b506102f161182d565b3480156109ab57600080fd5b506102f1611833565b3480156109c057600080fd5b506102f1611839565b3480156109d557600080fd5b50610272600480360360408110156109ec57600080fd5b508035906020013561183f565b348015610a0557600080fd5b506102f1611898565b348015610a1a57600080fd5b506102f161189e565b348015610a2f57600080fd5b506102726118a4565b601e5461010090046001600160a01b03163314610a865760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b601e805460ff1916911515919091179055601b91909155601c55565b601e5461010090046001600160a01b03163314610af05760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b600791909155601355565b60165481565b601c5481565b601a5481565b60075481565b600a6020528060005260406000208054600182015460029092015490925060ff9091169083565b60065481565b601d5481565b610b7d82826000604051818152601f19601f8301168101602001604052908015610b77576020820181803883390190505b50610b87565b5050565b60055481565b610b8f61198d565b6001600160a01b0316336001600160a01b031614610bde5760405162461bcd60e51b81526004018080602001828103825260288152602001806146b06028913960400191505060405180910390fd5b6000838152600960205260408120600654909150610c0390600163ffffffff611b5716565b600655600381015460019043118015610c23575060165482600301540143105b15610c2d57610c3d565b610c398561025a611bb9565b5060005b610c48858585611d2d565b60ff16158015610c5a57506001811515145b15610cea57836040516020018082805190602001908083835b60208310610c925780518252601f199092019160209182019101610c73565b6001836020036101000a038019825116818451161790925250505091909101925060409150505160208183030381529060405280519060200120601590815543600484015554610ce59083908790611ddc565b610d01565b60018115151415610d0157610d0185610263611bb9565b5050505050565b601e5461010090046001600160a01b03163314610d565760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b4781600d54601a5401011115610d9d5760405162461bcd60e51b81526004018080602001828103825260528152602001806148866052913960600191505060405180910390fd5b6001600160a01b03821681156108fc0282604051600060405180830381858888f19350505050158015610dd4573d6000803e3d6000fd5b505050565b600d5481565b601e5461010090046001600160a01b03163314610e2d5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b4781600d54601a5401011115610e745760405162461bcd60e51b815260040180806020018281038252603e81526020018061476f603e913960400191505060405180910390fd5b601a54610e87908263ffffffff611b5716565b601a5550565b601e5461010090046001600160a01b03163314610edb5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b601d55565b601e5461010090046001600160a01b03163314610f2e5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b43602155600554602255602080546001600160a01b0319166001600160a01b0392909216919091179055565b60105481565b601e5461010090046001600160a01b03163314610fae5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b600b91909155600c55565b600c5481565b600960205280600052604060002080546001820154600283015460038401546004850154600586015460068701546007880154600889015460098a0154600a8b0154600b909b0154999b50979996989597949693959294919390926001600160a01b03168c565b601e5461010090046001600160a01b031681565b600754611045612028565b6007545a116110855760405162461bcd60e51b81526004018080602001828103825260298152602001806149ac6029913960400191505060405180910390fd5b6007819055333487438a600683146110e35760405162461bcd60e51b815260206004820181905260248201527f4f6e6c79203620636173652067616d65732061726520617661696c61626c652e604482015260640160405180910390fd5b600b5484101580156110f75750600c548411155b6111325760405162461bcd60e51b81526004018080602001828103825260348152602001806149786034913960400191505060405180910390fd5b6000811180156111445750600e548111155b61117f5760405162461bcd60e51b815260040180806020018281038252604381526020018061472c6043913960600191505060405180910390fd5b60018a8a8a8a60405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156111dc573d6000803e3d6000fd5b505050602060405103516020546001600160a01b039081169116146112475760405162461bcd60e51b815260206004820152601e60248201527f4543445341207369676e6174757265206973206e6f742076616c69642e200000604482015260640160405180910390fd5b60006112528261208d565b90508060001080156112755750611271846127fa63ffffffff61214c16565b8111155b6112b05760405162461bcd60e51b815260040180806020018281038252602c8152602001806147ad602c913960400191505060405180910390fd5b60008060006103e86019548902816112c457fe5b04905060006103e86018548a02816112d857fe5b04905060008282016112f48b880261271063ffffffff6121a516565b0390507f3f03c88962cd0e0e6a779bdee90c90ac58354226d1d10910b74d80c26a1c9730606f8385846040518085815260200184815260200183815260200182815260200194505050505060405180910390a1478382600d54601a54010101116113e357601d5461136c908b9063ffffffff611b5716565b8111156113aa5760405162461bcd60e51b8152600401808060200182810382526061815260200180614a196061913960800191505060405180910390fd5b8094508293506113c585600d54611b5790919063ffffffff16565b600d55601a546113db908563ffffffff611b5716565b601a5561141a565b60405162461bcd60e51b81526004018080602001828103825260448152602001806149d56044913960600191505060405180910390fd5b60006114246121e5565b6000818152600960205290915060408120600b8101549091506001600160a01b031661149957600b810180546001600160a01b0319166001600160a01b038f161790558b8155600181018b9055600381018a9055600581018990556006810187905560078101869055600281018890556114d0565b60405162461bcd60e51b81526004018080602001828103825260278152602001806146636027913960400191505060405180910390fd5b6005546114e490600163ffffffff611b5716565b6005556114f08261227f565b600b810154600882015460058301546001840154600285015486946001600160a01b0316937f72acde90ebad312b7e5823536b7b516292d5552c775bcc07ed54bc1263cd0757939092606492604051808681526020018581526020018481526020018381526020018281526020019550505050505060405180910390a35050505050505050505050505050505050505050565b6020546001600160a01b031681565b60125481565b60115481565b600b5481565b60245481565b601e5461010090046001600160a01b031633146115f85760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b600f92909255601055601155565b60145481565b601e5460ff1681565b60255481565b60235481565b601e5461010090046001600160a01b0316331461166f5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b600d54156116c35760405162461bcd60e51b815260206004820152601c60248201527f546865726520697320612067616d6520696e2070726f67726573732e00000000604482015260640160405180910390fd5b601e5461010090046001600160a01b0316ff5b60185481565b601b5481565b601f546001600160a01b0316331461172b5760405162461bcd60e51b815260040180806020018281038252602681526020018061468a6026913960400191505060405180910390fd5b601f54601e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b601e5461010090046001600160a01b031633146117a45760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b601e546001600160a01b0382811661010090920416141561180b5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f7420617070726f76652063757272656e74206f776e65722e000000604482015260640160405180910390fd5b601f80546001600160a01b0319166001600160a01b0392909216919091179055565b60175481565b600f5481565b60195481565b601e5461010090046001600160a01b0316331461188d5760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b601691909155601755565b60135481565b60085481565b601e5461010090046001600160a01b031633146118f25760405162461bcd60e51b815260040180806020018281038252603e815260200180614805603e913960400191505060405180910390fd5b436016546021540111156119375760405162461bcd60e51b81526004018080602001828103825260438152602001806148436043913960600191505060405180910390fd5b600554602254146119795760405162461bcd60e51b815260040180806020018281038252602c8152602001806147d9602c913960400191505060405180910390fd5b6119816122d1565b6000600d819055600655565b6001546000906001600160a01b031615806119ba57506001546119b8906001600160a01b031661235f565b155b156119cb576119c96000612363565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a0857600080fd5b505af1158015611a1c573d6000803e3d6000fd5b505050506040513d6020811015611a3257600080fd5b8101908080516000546001600160a01b039081169116149250611ae3915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611a8f57600080fd5b505af1158015611aa3573d6000803e3d6000fd5b505050506040513d6020811015611ab957600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663c281d19e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1e57600080fd5b505afa158015611b32573d6000803e3d6000fd5b505050506040513d6020811015611b4857600080fd5b81019080805193505050505b90565b600082820183811015611bb05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640160405180910390fd5b90505b92915050565b600d546000838152600960205260408120600681015481549192509080611c115760405162461bcd60e51b81526004018080602001828103825260548152602001806146d86054913960600191505060405180910390fd5b506019546018548354600080865560088601548152600a6020526103e89290930180820292909204900391604081206001908101805460ff19169091179055505060006006840155600d54611c6c908363ffffffff61236d16565b600d55600b8301546001600160a01b031681156108fc0282604051600060405180830381858888f19350505050158015611caa573d6000803e3d6000fd5b50857f9712ae10b7ab4f4c46d1f85051b5ce66ef5438ffeecfed1c9995fecd26770ccf868360405191825260208201526040908101905180910390a283600d5414611d25577f8e307b2e425a5e979a4dcc8638b37e161d628a9b7bd415029f1056699f0fb92c6107e460405190815260200160405180910390a15b505050505050565b600081600081518110611d3c57fe5b60200101516001600160f81b031916601360fa1b141580611d7c575081600181518110611d6557fe5b60200101516001600160f81b031916600560fc1b14155b80611d9c5750600182600281518110611d9157fe5b602001015160f81c14155b15611da957506001611dd5565b6000611dbe838686611db96123ad565b61244f565b905080611dcf576002915050611dd5565b60009150505b9392505050565b82546001840154600b8501546001600160a01b03168215801590611e0857506001600160a01b03811615155b15611e3857600080875560088701548152600a602052604081206001908101805460ff1916909117905550611e6f565b60405162461bcd60e51b815260040180806020018281038252603f8152602001806148f9603f913960400191505060405180910390fd5b6000611e81858463ffffffff612a4316565b600b880154909150600090819088906001600160a01b03167f2874730804853498f5eafb416d2cb7660da375cea71ee8fbc41b3e0087720c8360c88a60405191825260208201526040908101905180910390a388600501548360020a16600014611eed57886006015491505b6006890154600d54611f049163ffffffff61236d16565b600d819055601b548710611f5257601e5460ff16151560011415611f52576000611f39601c548a612a4390919063ffffffff16565b90508060011415611f5057601a8054600090915592505b505b611f5e8583858d612a83565b887f57e35ae38ea48a1fe39a7a80e576f6975032bc8bb77f512e1a29408564e9645a8b6008015461012c8d600501548860020a888860405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a2601454891415611fdd57611fdd6122d1565b80600d541461201c577f8e307b2e425a5e979a4dcc8638b37e161d628a9b7bd415029f1056699f0fb92c6103f260405190815260200160405180910390a15b50505050505050505050565b6011546013546025546023546120439163ffffffff61236d16565b020160085560175460245401421180156120745750600361207160255460235461236d90919063ffffffff16565b10155b1561208b5760085460128190556007805490910190555b565b6000600182901c63555555551682039150600282901c6333333333168263333333331601915060006018600484901c8401630f0f0f0f16630101010102901c905080600114156120e25761efd8915050612147565b80600214156120f65761620c915050612147565b806003141561210a57614394915050612147565b806004141561211e5761364c915050612147565b806005141561213257612fa8915050612147565b6005811115612145576000915050612147565b505b919050565b60008261215b57506000611bb3565b8282028284828161216857fe5b0414611bb05760405162461bcd60e51b81526004018080602001828103825260218152602001806148d86021913960400191505060405180910390fd5b6000611bb0838360405160408082019052601a81527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006020820152612bcf565b60008060115490506000601754602454014211801561221b5750600361221860255460235461236d90919063ffffffff16565b10155b1561222857505060125460015b612237601054600f5484612c71565b9250600181151514156122555750426024556014829055600061227a565b7f11111111111111122222222222333333221122222222111111111111111111116014555b505090565b60235461229390600163ffffffff611b5716565b60238190556000908152600a602052604081206023548155600281018390556000838152600960205290915060408120602354600890910155505050565b6023546000905b806025541015612341576000818152600a60205260408120600281015460009081526009602052909150604081209050806003015443141561231f57600190930192612336565b8054156123365761233682600201546102be611bb9565b5050600019016122d8565b50602354600190612358908363ffffffff61236d16565b0360255550565b3b90565b6000611bb36130a0565b6000611bb0838360405160408082019052601e81527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060208201526133e9565b606060028054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156124455780601f1061241a57610100808354040283529160200191612445565b820191906000526020600020905b81548152906001019060200180831161242857829003601f168201915b5050505050905090565b6000808560458151811061245f57fe5b602001015160f81c606601905060606020604051818152601f19601f830116810160200160405290801561249a576020820181803883390190505b5090506124ac87836020846000613443565b50600284876040516020018083805190602001908083835b602083106124e35780518252601f1990920191602091820191016124c4565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040516020818303038152906040526040518082805190602001908083835b6020831061254a5780518252601f19909201916020918201910161252b565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa15801561258c573d6000803e3d6000fd5b5050506040513d60208110156125a157600080fd5b810190808051925060409150505160200180828152602001915050604051602081830303815290604052805190602001208180519060200120146125ea57600092505050612a3b565b606087604a8401815181106125fb57fe5b602001015160f81c600201604051818152601f19601f8301168101602001604052908015612630576020820181803883390190505b50905061264588846049018351846000613443565b506126fb6002826040518082805190602001908083835b6020831061267b5780518252601f19909201916020918201910161265c565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156126bd573d6000803e3d6000fd5b5050506040513d60208110156126d257600080fd5b81019080805192508991508b905060288701815181106126ee57fe5b602001015160f81c61348d565b61270b5760009350505050612a3b565b60606029604051818152601f19601f8301168101602001604052908015612739576020820181803883390190505b50905061274e89856020016029846000613443565b50606060408051818152601f19601f830116810160200160405290801561277c576020820181803883390190505b50905060008351866020016029010160410190506127a28b604083036040856000613443565b5060006002836040518082805190602001908083835b602083106127d75780518252601f1990920191602091820191016127b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612819573d6000803e3d6000fd5b5050506040513d602081101561282e57600080fd5b810190808051935086925083915060409050516020018083805190602001908083835b602083106128705780518252601f199092019160209182019101612851565b6001836020036101000a038019825116818451161790925250505091909101928352505060200190506040516020818303038152906040528051906020012060008c81526003602052604090205414156128db5760008b8152600360205260409020600090556128eb565b6000975050505050505050612a3b565b60606049604051818152601f19601f8301168101602001604052908015612919576020820181803883390190505b50905061292b8d896049846000613443565b506129cb6002826040518082805190602001908083835b602083106129615780518252601f199092019160209182019101612942565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156129a3573d6000803e3d6000fd5b5050506040513d60208110156129b857600080fd5b81019080805192508991508790506134f9565b6129e057600098505050505050505050612a3b565b60008281526004602052604090205460ff16612a1e57612a008d8461365c565b6000838152600460205260409020805460ff19169115159190911790555b60008281526004602052604090205460ff16985050505050505050505b949350505050565b6000611bb0838360405160408082019052601881527f536166654d6174683a206d6f64756c6f206279207a65726f000000000000000060208201526139f3565b82151580612a9057508115155b15612bc9578215801590612aa45750600083115b15612b2f576001600160a01b03841683156108fc0284604051600060405180830381858888f19350505050158015612ae0573d6000803e3d6000fd5b50836001600160a01b03167f181a3e5a702bf392a547618e36ff1761a8606f99c64af04c86866bef82b076dd6101908560405191825260208201526040908101905180910390a2600981018390555b8115801590612b3e5750600082115b15612bc9576001600160a01b03841682156108fc0283604051600060405180830381858888f19350505050158015612b7a573d6000803e3d6000fd5b50836001600160a01b03167fdef0dd1961901757e759c1e3e1ced766d61d989aa5030414848dae6bac75cbdd6101f48460405191825260208201526040908101905180910390a2600a81018290555b50505050565b60008183612c5b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c20578082015183820152602001612c08565b50505050905090810190601f168015612c4d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c6757fe5b0495945050505050565b60008083118015612c83575060208311155b612c8c57600080fd5b600a8402935060606001604051818152601f19601f8301168101602001604052908015612cc0576020820181803883390190505b5090508360f81b81600081518110612cd457fe5b60200101906001600160f81b031916908160001a90535060606020604051818152601f19601f8301168101602001604052908015612d19576020820181803883390190505b50905060606020604051818152601f19601f8301168101602001604052908015612d4a576020820181803883390190505b5090506000612d57613a55565b90506020835242411860014303401860208401526020825280602083015260606020604051818152601f19601f8301168101602001604052908015612da3576020820181803883390190505b50905088602082015260606008604051818152601f19601f8301168101602001604052908015612dda576020820181803883390190505b509050612ded8260186008846000613443565b50612df661458c565b60405180608001604052808781526020018881526020018681526020018481525090506000612e4260405160408082019052600681526572616e646f6d60d01b6020820152838c613be6565b905060606008604051818152601f19601f8301168101602001604052908015612e72576020820181803883390190505b5090506020840151600160f81b81046027830153600160f01b81046026830153600160e81b81046025830153600160e01b81046024830153600160d81b81046023830153600160d01b81046022830153600160c81b81046021830153600160c01b810460208301535061309082826020860151600287516040518082805190602001908083835b60208310612f185780518252601f199092019160209182019101612ef9565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015612f5a573d6000803e3d6000fd5b5050506040513d6020811015612f6f57600080fd5b8101908080519250505060408801516040516020018085805190602001908083835b60208310612fb05780518252601f199092019160209182019101612f91565b6001836020036101000a038019825116818451161790925250505091909101905084805190602001908083835b60208310612ffc5780518252601f199092019160209182019101612fdd565b6001836020036101000a038019825116818451161790925250505091909101848152602001905082805190602001908083835b6020831061304e5780518252601f19909201916020918201910161302f565b6001836020036101000a038019825116818451161790925250505091909101955060409450505050505160208183030381529060405280519060200120613dfe565b509b9a5050505050505050505050565b6000806130c0731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed61235f565b111561311e57600180546001600160a01b031916731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed17905561311660405160408082019052600b81526a195d1a17db585a5b9b995d60aa1b6020820152613e13565b506001611b54565b600061313d73c03a2615d5efaf5f49f60b7bb6583eaec212fdf161235f565b111561319457600180546001600160a01b03191673c03a2615d5efaf5f49f60b7bb6583eaec212fdf117905561311660405160408082019052600c81526b6574685f726f707374656e3360a01b6020820152613e13565b60006131b373b7a07bcf2ba2f2703b24c0691b5278999c59ac7e61235f565b111561320757600180546001600160a01b03191673b7a07bcf2ba2f2703b24c0691b5278999c59ac7e17905561311660405160408082019052600981526832ba342fb5b7bb30b760b91b6020820152613e13565b600061322673146500cfd35b22e4a392fe0adc06de1a1368ed4861235f565b111561327c57600180546001600160a01b03191673146500cfd35b22e4a392fe0adc06de1a1368ed4817905561311660405160408082019052600b81526a6574685f72696e6b65627960a81b6020820152613e13565b600061329b73a2998efd205fb9d4b4963afb70778d6354ad3a4161235f565b11156132f057600180546001600160a01b03191673a2998efd205fb9d4b4963afb70778d6354ad3a4117905561311660405160408082019052600a8152696574685f676f65726c6960b01b6020820152613e13565b600061330f736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47561235f565b11156133415750600180546001600160a01b031916736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475178155611b54565b60006133607320e12a1f859b3feae5fb2a0a32c18f5a65555bbf61235f565b11156133925750600180546001600160a01b0319167320e12a1f859b3feae5fb2a0a32c18f5a65555bbf178155611b54565b60006133b17351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa61235f565b11156133e35750600180546001600160a01b0319167351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa178155611b54565b50600090565b6000818484111561343b5760405162461bcd60e51b8152600401808060200182810382528381815181526020019150805160209091019080838360008315612c20578082015183820152602001612c08565b505050900390565b6060838201808451101561345657600080fd5b60208087019084015b8688602001018210156134805781890151868201526020918201910161345f565b5093979650505050505050565b600060018284511461349e57600080fd5b60005b838110156134f0578481815181106134b557fe5b60200101516001600160f81b0319168682602081106134d057fe5b1a60f81b6001600160f81b031916146134e857600091505b6001016134a1565b50949350505050565b600080600080600060606020604051818152601f19601f830116810160200160405290801561352f576020820181803883390190505b509050600060208960038151811061354357fe5b602001015160f81c60f81b60f81c60ff1603600401905061356989826020856000613443565b915060606020604051818152601f19601f8301168101602001604052908015613599576020820181803883390190505b5090506022820191506135cc8a60208c60018603815181106135b757fe5b602001015160f81c0384016020846000613443565b905060208301519450602081015193506135e98b601b8787613e26565b90975095506001600160a01b03861689805190602001206001600160a01b0316141561361f576001975050505050505050611dd5565b61362c8b601c8787613e26565b90975095506001600160a01b03861689805190602001206001600160a01b0316149750611dd59650505050505050565b600080606084846001018151811061367057fe5b602001015160f81c600201604051818152601f19601f83011681016020016040529080156136a5576020820181803883390190505b5090506136b785858351846000613443565b50606060408051818152601f19601f83011681016020016040529080156136e5576020820181803883390190505b5090506136f88660046040846000613443565b5060606062604051818152601f19601f8301168101602001604052908015613727576020820181803883390190505b509050600160f81b8160008151811061373c57fe5b60200101906001600160f81b031916908160001a90535061376587604188036041846001613443565b5060606040518060400160405280602081526020017ffd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c81525090506137b08160006020856042613443565b506138506002836040518082805190602001908083835b602083106137e65780518252601f1990920191602091820191016137c7565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa158015613828573d6000803e3d6000fd5b5050506040513d602081101561383d57600080fd5b81019080805192508791508690506134f9565b94508461386557600095505050505050611bb3565b606060405180606001604052806040815260200161493860409139905060606042604051818152601f19601f83011681016020016040529080156138b0576020820181803883390190505b509050607f60f91b816000815181106138c557fe5b60200101906001600160f81b031916908160001a9053506138ec8a60036041846001613443565b5060608a6045815181106138fc57fe5b602001015160f81c600201604051818152601f19601f8301168101602001604052908015613931576020820181803883390190505b5090506139448b60448351846000613443565b506139e46002836040518082805190602001908083835b6020831061397a5780518252601f19909201916020918201910161395b565b6001836020036101000a038019825116818451168082178552505050505050905001915050602060405180830381855afa1580156139bc573d6000803e3d6000fd5b5050506040513d60208110156139d157600080fd5b81019080805192508491508690506134f9565b9b9a5050505050505050505050565b60008183613a425760405162461bcd60e51b8152600401808060200182810382528381815181526020019150805160209091019080838360008315612c20578082015183820152602001612c08565b50828481613a4c57fe5b06949350505050565b6001546000906001600160a01b03161580613a825750600154613a80906001600160a01b031661235f565b155b15613a9357613a916000612363565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613ad057600080fd5b505af1158015613ae4573d6000803e3d6000fd5b505050506040513d6020811015613afa57600080fd5b8101908080516000546001600160a01b039081169116149250613bab915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613b5757600080fd5b505af1158015613b6b573d6000803e3d6000fd5b505050506040513d6020811015613b8157600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b6000546001600160a01b031663abaa5f3e6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b1e57600080fd5b6001546000906001600160a01b03161580613c135750600154613c11906001600160a01b031661235f565b155b15613c2457613c226000612363565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613c6157600080fd5b505af1158015613c75573d6000803e3d6000fd5b505050506040513d6020811015613c8b57600080fd5b8101908080516000546001600160a01b039081169116149250613d3c915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613ce857600080fd5b505af1158015613cfc573d6000803e3d6000fd5b505050506040513d6020811015613d1257600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b60606004604051908082528060200260200182016040528015613d7357816020015b6060815260200190600190039081613d5e5790505b509050835181600081518110613d8557fe5b6020908102919091010152836001602002015181600181518110613da557fe5b6020908102919091010152604084015181600281518110613dc257fe5b6020908102919091010152606084015181600381518110613ddf57fe5b6020026020010181905250613df5858285613e66565b95945050505050565b60008281526003602052819060409020555050565b6002818051610b7d9291602001906145b2565b60008060008060405188815287602082015286604082015285606082015260208160808360006001610bb8f1925080519299929850919650505050505050565b6001546000906001600160a01b03161580613e935750600154613e91906001600160a01b031661235f565b155b15613ea457613ea26000612363565b505b6001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613ee157600080fd5b505af1158015613ef5573d6000803e3d6000fd5b505050506040513d6020811015613f0b57600080fd5b8101908080516000546001600160a01b039081169116149250613fbc915050576001546001600160a01b03166338cc48316040518163ffffffff1660e01b8152600401602060405180830381600087803b158015613f6857600080fd5b505af1158015613f7c573d6000803e3d6000fd5b505050506040513d6020811015613f9257600080fd5b810190808051600080546001600160a01b0319166001600160a01b03929092169190911790555050505b600080546001600160a01b0316632ef3accc86856040518363ffffffff1660e01b81526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561402257808201518382015260200161400a565b50505050905090810190601f16801561404f5780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b15801561406f57600080fd5b505af1158015614083573d6000803e3d6000fd5b505050506040513d602081101561409957600080fd5b8101908080519350505050670de0b6b3a76400003a8402018111156140c2575060009050611dd5565b60606140cd85614237565b600080549192506001600160a01b039091169063c55c1cb69084908985896040518663ffffffff1660e01b8152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561414757808201518382015260200161412f565b50505050905090810190601f1680156141745780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156141aa578082015183820152602001614192565b50505050905090810190601f1680156141d75780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b1580156141f957600080fd5b505af115801561420d573d6000803e3d6000fd5b50505050506040513d602081101561422457600080fd5b8101908080519998505050505050505050565b60606142416142a9565b614249614630565b614255816104006142b5565b61425e816142e3565b60005b83518110156142965761428e84828151811061427957fe5b6020026020010151839063ffffffff6142f116565b600101614261565b506142a08161430e565b80519392505050565b60405180590338823950565b8060208106156142c85760208106602003015b60208301819052604051928390526000835290910160405250565b6142ee816004614315565b50565b6142fe8260028351614330565b610dd4828263ffffffff61443b16565b6142ee8160075b610b7d82601f611fe0600585901b161763ffffffff6144d416565b60178111614356576143518360e0600585901b16831763ffffffff6144d416565b610dd4565b60ff811161439157614379836018611fe0600586901b161763ffffffff6144d416565b61438b8382600163ffffffff61450d16565b50610dd4565b61ffff81116143c7576143b5836019611fe0600586901b161763ffffffff6144d416565b61438b8382600263ffffffff61450d16565b63ffffffff81116143ff576143ed83601a611fe0600586901b161763ffffffff6144d416565b61438b8382600463ffffffff61450d16565b67ffffffffffffffff8111610dd45761442983601b611fe0600586901b161763ffffffff6144d416565b612bc98382600863ffffffff61450d16565b614443614630565b8260200151835151835101111561446f5761446f8361446785602001518551614561565b600202614572565b60008060008451905085518051602081830101945086510190526020850191505b602081106144b057815183526020928301929190910190601f1901614490565b60001960208290036101000a01801983511681855116179093525093949350505050565b816020015182515160010111156144f6576144f6828360200151600202614572565b815180516020818301018381535060010190525050565b614515614630565b8360200151845151830111156145375761453784614467866020015185614561565b60001961010083900a01845180518481830101868419825116179052909301909252509192915050565b600081831115612145575081611bb3565b60608251905061458283836142b5565b612bc9838261443b565b604051608081016040526004815b606081526020019060019003908161459a5790505090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106145f357805160ff1916838001178555614620565b82800160010185558215614620579182015b82811115614620578251825591602001919060010190614605565b5061462c929150614648565b5090565b60405160408082019052606081526000602082015290565b611b5491905b8082111561462c576000815560010161464e56fe43616e6e6f742061737369676e206120706c6179657220746f207468652064617461626173652e43616e206f6e6c792061636365707420707265617070726f766564206e6577206f776e65722e4d75737420636f6d706c792077697468207468652070726f7661626c65206362416464726573732e53696e63652074686520706c617965722067616d6520657468657220616d6f756e74206973207a65726f206f722074686520726566756e642068617320616c7265616479206265656e20636f6d706c657465642e546865206e756d626572732063686f73656e2062792074686520706c61796572206d7573742062652077697468696e207468652067616d6561626c652072616e67652e54686520636f6e7472616374206e6565647320746f207265706c656e697368207468652066756e642062656361757365206974206973207363617263652e5468652070726f626162696c69747920646f6573206e6f7420657869737420696e207468652072616e67652e546865726520697320616c7265616479206120757365722077686f20706c61796564207468652067616d652e546869732066756e6374696f6e2063616e206f6e6c792063726561746520547820627920746865206f776e6572206f662074686520636f6e74726163742e49742063616e20626520657865637574656420616674657220616c6c206175746f6d6174696320726566756e64732068617665206265656e2070726f6365737365642e5468652070726f636573732063616e6e6f742070726f636565642c20746865207769746864726177616c20616d6f756e7420657863656564732074686520776974686472617761626c6520616d6f756e742e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754686520706c6179657220646f6573206e6f7420657869737420696e20746865206461746162617365206f7220697320616c726561647920636c6f7365642e7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4456874657220616d6f756e74206d7573742062652077697468696e207468652067616d6520706c617961626c652072616e67652e5468657265206973206e6f7420656e6f7567682067617320746f20706c6179207468652067616d652e5468657265206973206e6f7420656e6f7567682066756e647320746f20706c617920796f75722067616d65206f6e20537175617265517565756520436f6e74726163742e417420746869732074696d652c206974206973206e6f7420706f737369626c6520746f20706c6179206f7574206f66207468652072616e6765206d6178696d756d2065746865722070726f66697473206f66207468697320636f6e74726163742ea265627a7a723158209af6450befe2bab034d1f4d03391722ec423136972cc4cd2a8d5744af7345d5f64736f6c63430005100032

Deployed ByteCode Sourcemap

2187:44451:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20315:269;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20315:269:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20315:269:1;;;;;;;;;;;;;;:::i;8493:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8493:148:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8493:148:1;;;;;;;:::i;18427:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18427:30:1;;;:::i;:::-;;;;;;;;;;;;;;;20207:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20207:32:1;;;:::i;20122:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20122:24:1;;;:::i;2320:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2320:23:1;;;:::i;5334:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5334:44:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5334:44:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2289:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2289:25:1;;;:::i;20245:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20245:25:1;;;:::i;15718:124:2:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15718:124:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15718:124:2;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15718:124:2;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15718:124:2;;;;;;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:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;15718:124:2;;-1:-1:-1;15718:124:2;;-1:-1:-1;;;;;15718:124:2:i;2260:23:1:-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2260:23:1;;;:::i;37847:2429::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37847:2429:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37847:2429:1;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37847:2429:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37847:2429: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;37847:2429:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;37847:2429:1;;;;;;;;-1:-1:-1;37847:2429:1;;-1:-1:-1;;21:11;5:28;;2:2;;;46:1;43;36:12;2:2;37847:2429:1;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37847:2429: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;37847:2429:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;37847:2429:1;;-1:-1:-1;37847:2429:1;;-1:-1:-1;;;;;37847:2429:1:i;35938:332::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35938:332:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;35938:332:1;;;;;;;;:::i;5860:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5860:37:1;;;:::i;26343:289::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26343:289:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26343:289:1;;:::i;26106:111::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26106:111:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26106:111:1;;:::i;23791:190::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23791:190:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23791:190:1;-1:-1:-1;;;;;23791:190:1;;:::i;7638:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7638:21:1;;;:::i;6463:244::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6463:244:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6463:244:1;;;;;;;:::i;5776:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5776:47:1;;;:::i;5289:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5289:39:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5289:39:1;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5289:39:1;;;;;;;;;;;;;;;;;;20590:28;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20590:28:1;;;:::i;:::-;;;-1:-1:-1;;;;;20590:28:1;;;;;;;;;;;;;;10964:5546;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;10964:5546:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20663:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20663:26:1;;;:::i;7711:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7711:30:1;;;:::i;7665:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7665:40:1;;;:::i;5691:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5691:48:1;;;:::i;42440:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42440:23:1;;;:::i;7787:209::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7787:209:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7787:209:1;;;;;;;;;;;;:::i;16516:39::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16516:39:1;;;:::i;20276:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20276:33:1;;;:::i;:::-;;;;;;;;;;;;;;;;;42469:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42469:23:1;;;:::i;42414:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42414:20:1;;;:::i;27118:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27118:168:1;;;:::i;18714:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18714:44:1;;;:::i;20152:49::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20152:49:1;;;:::i;23197:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23197:155:1;;;:::i;23007:184::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23007:184:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23007:184:1;-1:-1:-1;;;;;23007:184:1;;:::i;18463:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18463:29:1;;;:::i;7603:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7603:29:1;;;:::i;18869:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18869:25:1;;;:::i;18503:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18503:205:1;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18503:205:1;;;;;;;:::i;7747:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7747:34:1;;;:::i;2349:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2349:31:1;;;:::i;25182:483::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25182:483:1;;;:::i;20315:269::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20445:13;:30;;-1:-1:-1;;20445:30:1;;;;;;;;;;20485:25;:54;;;;20549:12;:28;20315:269::o;8493:148::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8580:11;:26;;;;8616:7;:18;8493:148::o;18427:30::-;;;;:::o;20207:32::-;;;;:::o;20122:24::-;;;;:::o;2320:23::-;;;;:::o;5334:44::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5334:44:1;;;;;;:::o;2289:25::-;;;;:::o;20245:::-;;;;:::o;15718:124:2:-;15794:40;15805:5;15812:7;15831:1;15821:12;;;;;-1:-1:-1;;15821:12:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;15821:12:2;87:34:-1;135:17;;-1:-1;15821:12:2;;15794:10;:40::i;:::-;15718:124;;:::o;2260:23:1:-;;;;:::o;37847:2429::-;37968:20;:18;:20::i;:::-;-1:-1:-1;;;;;37954:34:1;:10;-1:-1:-1;;;;;37954:34:1;;37946:87;;;;-1:-1:-1;;;37946:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38043:17;38063:25;;;:9;:25;;;38043:17;38063:25;38114:13;;38043:45;;-1:-1:-1;38114:20:1;;38132:1;38114:20;:17;:20;:::i;:::-;38098:13;:36;38214:20;;;;38171:4;;38199:12;:35;:95;;;;;38276:18;;38253:4;:20;;;:41;38238:12;:56;38199:95;38195:485;;;;;;38612:25;38623:8;38633:3;38612:10;:25::i;:::-;-1:-1:-1;38664:5:1;38195:485;38701:68;38743:8;38753:7;38762:6;38701:41;:68::i;:::-;:73;;;:95;;;;-1:-1:-1;38792:4:1;38778:18;;;;38701:95;38698:1563;;;39422:7;39405: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;;;39405:25:1;;;;;-1:-1:-1;39405:25:1;;-1:-1:-1;;39405:25:1;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39405:25:1;;;39395:36;;;;;;39368:19;:64;;;39691:12;39666:22;;;:37;39862:19;39821:61;;39666:4;;39852:8;;39821:24;:61::i;:::-;38698:1563;;;40187:4;40173:18;;;;40170:81;;;40211:25;40222:8;40232:3;40211:10;:25::i;:::-;37847:2429;;;;;:::o;35938:332::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36110:21;36091:15;36063:25;;36048:12;;:40;:58;:83;;36039:179;;;;-1:-1:-1;;;36039:179:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36228:18:1;;:35;;;;36247:15;36228:35;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36228:35:1;35938:332;;:::o;5860:37::-;;;;:::o;26343:289::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26483:21;26468:11;26440:25;;26425:12;;:40;:54;:79;;26416:155;;;;-1:-1:-1;;;26416:155:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26596:12;;:29;;26613:11;26596:29;:16;:29;:::i;:::-;26581:12;:44;-1:-1:-1;26343:289:1:o;26106:111::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26180:13;:30;26106:111::o;23791:190::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23885:12;23869:13;:28;23924:11;;23907:14;:28;23945:11;:29;;-1:-1:-1;;;;;;23945:29:1;-1:-1:-1;;;;;23945:29:1;;;;;;;;;;23791:190::o;7638:21::-;;;;:::o;6463:244::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6586:24;:52;;;;6648:24;:52;6463:244::o;5776:47::-;;;;:::o;5289:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5289:39:1;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5289:39:1;;:::o;20590:28::-;;;;;;-1:-1:-1;;;;;20590:28:1;;:::o;10964:5546::-;11123:11;;11144:19;:17;:19::i;:::-;11254:11;;11242:9;:23;11234:77;;;;-1:-1:-1;;;11234:77:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11321:11;:29;;;11399:10;11438:9;11476:11;11525:12;11564:9;11608:1;11593:16;;11584:87;;;;-1:-1:-1;;;11584:87:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;11705:24;;11690:11;:39;;:82;;;;;11748:24;;11733:11;:39;;11690:82;11681:148;;;;-1:-1:-1;;;11681:148:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11860:1;11848:9;:13;:48;;;;;11878:18;;11865:9;:31;;11848:48;11839:129;;;;-1:-1:-1;;;11839:129:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12002:34;12012:11;12025:2;12029;12033;12002:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12002:34:1;;;;;;;;11987:11;;-1:-1:-1;;;;;11987:11:1;;;:49;;;11978:93;;;;-1:-1:-1;;;11978:93:1;;;;;;;;;;;;;;;;;;;;;;;;;;;12464:19;12486:29;12505:9;12486:18;:29::i;:::-;12464:51;;12538:14;12534:1;:18;:62;;;;-1:-1:-1;12574:22:1;:11;12590:5;12574:22;:15;:22;:::i;:::-;12556:14;:40;;12534:62;12525:120;;;;-1:-1:-1;;;12525:120:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12656:27;12693;12829:23;12881:4;12869:9;;12855:11;:23;:30;;;;;;12829:56;;12995:16;13059:4;13028:28;;13014:11;:42;:49;;;;;;;-1:-1:-1;13176:23:1;13249:32;;;13203:41;13204:28;;;13238:5;13203:41;:34;:41;:::i;:::-;13202:80;13176:106;;13298:63;13304:3;13309:11;13322:18;13342;13298:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13493:21;13471:18;13450;13422:25;;13407:12;;:40;:61;:82;:107;13403:864;;13577:13;;13561:30;;:11;;:30;:15;:30;:::i;:::-;13539:18;:52;;13530:163;;;;-1:-1:-1;;;13530:163:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13833:18;13808:43;;13890:18;13865:43;;14025:53;14055:22;14025:25;;:29;;:53;;;;:::i;:::-;13997:25;:81;14107:12;;:40;;14124:22;14107:40;:16;:40;:::i;:::-;14092:12;:55;13403:864;;;14178:78;;-1:-1:-1;;;14178:78:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13403:864;14603:15;14621:12;:10;:12::i;:::-;14768:17;14788:24;;;:9;:24;;14603:30;;-1:-1:-1;14788:24:1;14768:17;14788:24;14927:11;;;;14768:44;;-1:-1:-1;;;;;;14927:11:1;14923:571;;15040:11;;;:25;;-1:-1:-1;;;;;;15040:25:1;-1:-1:-1;;;;;15040:25:1;;;;;15079;;;-1:-1:-1;15118:11:1;;:25;;;15157:20;;;:43;;;15214:9;;;:21;;;-1:-1:-1;15249:22:1;;:47;;;15310:22;;;:47;;;15371:14;;;:31;;;14923:571;;;15433:50;;-1:-1:-1;;;15433:50:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14923:571;15622:11;;:18;;15638:1;15622:18;:15;:18;:::i;:::-;15608:11;:32;15923:17;15932:7;15923:8;:17::i;:::-;16442:11;;;;16421:14;;;;16455:9;;;;16442:11;16466;;;16479:14;;;;16495:7;;-1:-1:-1;;;;;16442:11:1;;16404:99;;16421:14;;16437:3;;16404:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10964:5546;;;;;;;;;;;;;;;;;;;;:::o;20663:26::-;;;-1:-1:-1;;;;;20663:26:1;;:::o;7711:30::-;;;;:::o;7665:40::-;;;;:::o;5691:48::-;;;;:::o;42440:23::-;;;;:::o;7787:209::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7899:13;:30;;;;7939:5;:14;7963:11;:26;7787:209::o;16516:39::-;;;;:::o;20276:33::-;;;;;;:::o;42469:23::-;;;;:::o;42414:20::-;;;;:::o;27118:168::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27187:25;;:30;27178:72;;;;-1:-1:-1;;;27178:72:1;;;;;;;;;;;;;;;;;;;;;;;;;;;27273:5;;;;;-1:-1:-1;;;;;27273:5:1;27260:19;18714:44;;;;:::o;20152:49::-;;;;:::o;23197:155::-;23266:9;;-1:-1:-1;;;;;23266:9:1;23252:10;:23;23243:75;;;;-1:-1:-1;;;23243:75:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23336:9;;23328:5;:17;;-1:-1:-1;;;;;23336:9:1;;;;23328:17;-1:-1:-1;;;;;;23328:17:1;;;;;;;;;23197:155::o;23007:184::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23113:5;;-1:-1:-1;;;;;23099:19:1;;;23113:5;;;;;23099:19;;23090:62;;;;-1:-1:-1;;;23090:62:1;;;;;;;;;;;;;;;;;;;;;;;;;;;23162:9;:22;;-1:-1:-1;;;;;;23162:22:1;-1:-1:-1;;;;;23162:22:1;;;;;;;;;;23007:184::o;18463:29::-;;;;:::o;7603:::-;;;;:::o;18869:25::-;;;;:::o;18503:205::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18613:18;:40;;;;18663:17;:38;18503:205::o;7747:34::-;;;;:::o;2349:31::-;;;;:::o;25182:483::-;5437:5;;;;;-1:-1:-1;;;;;5437:5:1;5423:10;:19;5414:95;;;;-1:-1:-1;;;5414:95:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25305:12;25283:18;;25267:13;;:34;:50;;25259:130;;;;-1:-1:-1;;;25259:130:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25425:11;;25407:14;;:29;25399:86;;;;-1:-1:-1;;;25399:86:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25575:16;:14;:16::i;:::-;25630:1;25602:25;:29;;;25641:13;:17;25182:483::o;38056:132:2:-;12171:3;;38116:24;;-1:-1:-1;;;;;12171:3:2;12163:26;;12162:64;;-1:-1:-1;12215:3:2;;12195:25;;-1:-1:-1;;;;;12215:3:2;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:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:2;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:2;;;12304:37;;;;-1:-1:-1;12300:108:2;;-1:-1:-1;;12300:108:2;12379:3;;-1:-1:-1;;;;;12379:3:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:2;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:2;-1:-1:-1;;;;;12358:38:2;;;;;;;;;;-1:-1:-1;;;12300:108:2;38160:8;;-1:-1:-1;;;;;38160:8:2;:18;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38160:20:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38160:20:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38160:20:2;;;;;;;-1:-1:-1;;;;12418:1:2;38056:132;:::o;834:176:0:-;892:7;923:5;;;946:6;;;;938:46;;;;-1:-1:-1;;;938:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;-1:-1:-1;834:176:0;;;;;:::o;40814:1336:1:-;40914:25;;40880:31;40992:25;;;:9;:25;;;40880:31;40992:25;41058:22;;;;41105:11;;40972:45;;-1:-1:-1;41058:22:1;41139:12;41135:551;;41167:94;;-1:-1:-1;;;41167:94:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41135:551;-1:-1:-1;41423:9:1;;41392:28;;41470:11;;41456;41511:15;;;41579:14;;;;41568:26;;:10;:26;;41493:4;41392:40;;;;41470:20;;;:27;;;;41456:41;;;41568:26;41456:11;41568:26;41631:4;41608:20;;;:27;;-1:-1:-1;;41608:27:1;;;;;;-1:-1:-1;;41608:20:1;41649:22;;;:26;41772:25;;:45;;41802:14;41772:45;:29;:45;:::i;:::-;41744:25;:73;41885:11;;;;-1:-1:-1;;;;;41885:11:1;:29;;;;41906:7;41885:29;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41885:29:1;41959:8;41929:39;41945:3;41950:7;41929:39;;;;;;;;;;;;;;;;;;;;42050:26;42021:25;;:55;42017:127;;42097:36;42128:4;42097:36;;;;;;;;;;;;;;42017:127;40814:1336;;;;;;:::o;51645:589:2:-;51776:17;51905:6;51912:1;51905:9;;;;;;;;;;;;-1:-1:-1;;;;;;51905:9:2;-1:-1:-1;;;51905:16:2;;;51904:40;;;51927:6;51934:1;51927:9;;;;;;;;;;;;-1:-1:-1;;;;;;51927:9:2;-1:-1:-1;;;51927:16:2;;51904:40;:74;;;-1:-1:-1;51975:1:2;51955:6;51962:1;51955:6;:9;;;;;;;;;;;;;51949:28;;51904:74;51900:115;;;-1:-1:-1;52002:1:2;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;27918:6936:1:-;28090:12;;28127;;;;28174;;;;-1:-1:-1;;;;;28174:12:1;28321;;;;;:36;;-1:-1:-1;;;;;;28337:20:1;;;;28321:36;28317:298;;;28388:1;28373:16;;;28442:15;;;;28431:27;;:10;:27;;;28388:1;28431:27;28495:4;28472:20;;;:27;;-1:-1:-1;;28472:27:1;;;;;;-1:-1:-1;28317:298:1;;;28530:74;;-1:-1:-1;;;28530:74:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28317:298;28939:9;28951:21;:8;28964:7;28951:21;:12;:21;:::i;:::-;29579:12;;;;28939:33;;-1:-1:-1;28982:12:1;;;;29593:8;;-1:-1:-1;;;;;29579:12:1;29549:63;29574:3;29603:8;29549:63;;;;;;;;;;;;;;;;;;;;33228:5;:10;;;33220:4;33215:1;:9;33214:24;33242:1;33214:29;33210:101;;33273:5;:23;;;33263:33;;33210:101;33451:23;;;;33421:25;;:54;;;:29;:54;:::i;:::-;33393:25;:82;;;33679:25;;33668:36;;33664:536;;33937:13;;;;:21;;:13;:21;33933:257;;;33978:21;34002:26;34015:12;;34002:8;:12;;:26;;;;:::i;:::-;33978:50;;34050:16;34070:1;34050:21;34046:130;;;34107:12;;;34156:1;34141:16;;;34107:12;-1:-1:-1;34046:130:1;33933:257;;34218:43;34227:6;34235:9;34246:7;34255:5;34218:8;:43::i;:::-;34287:8;34276:85;34297:5;:15;;;34314:3;34319:5;:10;;;34336:4;34331:1;:9;34342:7;34351:9;34276:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34596:24;;34584:8;:36;34580:92;;;34636:16;:14;:16::i;:::-;34754:26;34725:25;;:55;34721:127;;34801:36;34832:4;34801:36;;;;;;;;;;;;;;34721:127;27918:6936;;;;;;;;;;:::o;8647:344::-;8756:11;;8745:7;;8730:11;;8717:8;;:25;;;:12;:25;:::i;:::-;:35;8716:51;8694:19;:73;8801:17;;8787:11;;:31;8781:3;:37;:71;;;;;8851:1;8822:25;8835:11;;8822:8;;:12;;:25;;;;:::i;:::-;:30;;8781:71;8777:208;;;8889:19;;8868:18;:40;;;8922:11;:34;;;;;;;8777:208;8647:344::o;9551:749::-;9613:15;9664:1;9656:4;:9;;9669:10;9655:24;9647:4;:33;9640:40;;9729:1;9721:4;:9;;9734:10;9720:24;9698:4;9705:10;9698:17;9697:48;9690:55;;9755:10;9818:2;9786:1;9778:4;:9;;9770:4;:18;9791:9;9770:30;9804:9;9769:44;9768:52;;9755:65;;10104:5;10113:1;10104:10;10100:31;;;10124:5;10117:12;;;;;10100:31;10135:5;10144:1;10135:10;10131:31;;;10155:5;10148:12;;;;;10131:31;10166:5;10175:1;10166:10;10162:31;;;10186:5;10179:12;;;;;10162:31;10197:5;10206:1;10197:10;10193:31;;;10217:5;10210:12;;;;;10193:31;10228:5;10237:1;10228:10;10224:31;;;10248:5;10241:12;;;;;10224:31;10280:1;10272:5;:9;10255:39;;;10291:1;10284:8;;;;;10255:39;9551:749;;;;;:::o;2159:459:0:-;2217:7;2458:6;2454:45;;-1:-1:-1;2487:1:0;2480:8;;2454:45;2521:5;;;2525:1;2521;:5;:1;2544:5;;;;;:10;2536:56;;;;-1:-1:-1;;;2536:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3073:130;3131:7;3157:39;3161:1;3164;3157:39;;;;;;;;;;;;;;;;:3;:39::i;16864:686:1:-;16902:11;16925:17;16945:11;;16925:31;;16966:16;17017:17;;17003:11;;:31;16997:3;:37;:71;;;;;17067:1;17038:25;17051:11;;17038:8;;:12;;:25;;;;:::i;:::-;:30;;16997:71;16993:167;;;-1:-1:-1;;17099:18:1;;17145:4;16993:167;17175:61;17201:5;;17208:13;;17223:12;17175:25;:61::i;:::-;17169:67;-1:-1:-1;17274:4:1;17259:19;;;;17255:268;;;-1:-1:-1;17308:3:1;17294:11;:17;17325:24;:30;;;-1:-1:-1;17255:268:1;;;17446:66;17419:24;:93;17255:268;-1:-1:-1;;16864:686:1;:::o;42847:342::-;42912:8;;:15;;42925:1;42912:15;:12;:15;:::i;:::-;42901:8;:26;;;42937:25;42965:20;;;:10;:20;;;42937:25;42965:20;43018:8;;42995:31;;43036:21;;;:32;;;42995:20;43108:38;;;:9;:38;;42937:48;;-1:-1:-1;43108:38:1;42995:20;43108:38;43174:8;;43156:15;;;;:26;-1:-1:-1;;;42847:342:1:o;43636:664::-;43717:8;;43680:14;;43704:539;43741:1;43727:11;;:15;43704:539;;;43763:25;43791:13;;;:10;:13;;;43763:25;43791:13;43854:21;;;;43818:18;43839:38;;;:9;:38;;43763:41;;-1:-1:-1;43839:38:1;43818:18;43839:38;43818:59;;43924:5;:21;;;43908:12;:37;43904:329;;;43965:12;;;;;43904:329;;;44112:12;;:17;44108:111;;44153:38;44164:8;:21;;;44187:3;44153:10;:38::i;:::-;-1:-1:-1;;;;43744:3:1;43704:539;;;-1:-1:-1;44266:8:1;;44292:1;;44266:23;;44279:9;44266:23;:12;:23;:::i;:::-;:27;44252:11;:41;-1:-1:-1;43636:664:1:o;38196:151:2:-;38311:18;;38287:53::o;12912:208::-;12977:16;13091:21;:19;:21::i;1274:134:0:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;:3;:43::i;13263:133:2:-;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:2;53024:2;53060:13;;;;;-1:-1:-1;;53060:13:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;53060:13:2;87:34:-1;135:17;;-1:-1;53060:13:2;;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:2;;;;;;;-1:-1:-1;;53209:40:2;;;-1:-1:-1;53209:40:2;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53209:40:2;;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53202:48:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53202:48:2;;;;;;;-1:-1:-1;53185:66:2;;-1:-1:-1;;53185:66:2;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53185:66:2;;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;53324:77:2;87:34:-1;135:17;;-1:-1;53324:77:2;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53679:12:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;53679:12:2;;;;;;;-1:-1:-1;53693:7:2;;-1:-1:-1;53713:6:2;;-1:-1:-1;53720:26:2;;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54072:21:2;87:34:-1;135:17;;-1:-1;54072:21:2;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54218:13:2;87:34:-1;135:17;;-1:-1;54218:13:2;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54422:21:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54422:21:2;;;;;;;-1:-1:-1;54521:16:2;;-1:-1:-1;54422:21:2;;-1:-1:-1;54504:53:2;;-1:-1:-1;54504:53:2;;;;;;;;;;;;;;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:2;;;;;;;-1:-1:-1;;54504:53:2;;;-1:-1:-1;54504:53:2;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;54504:53:2;;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;54833:26:2;87:34:-1;135:17;;-1:-1;54833:26:2;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54961:15:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;54961:15:2;;;;;;;-1:-1:-1;54978:4:2;;-1:-1:-1;54984:13:2;;-1:-1:-1;54951:9:2;: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:2;;;;;;;;;;55133:226;55376:60;;;;:41;:60;;;;;;;;;-1:-1:-1;;;;;;;;;52653:2791:2;;;;;;;:::o;4500:128:0:-;4558:7;4584:37;4588:1;4591;4584:37;;;;;;;;;;;;;;;;:3;:37::i;35080:673:1:-;35197:12;;;;:29;;-1:-1:-1;35213:13:1;;;35197:29;35193:554;;;35247:13;;;;;:29;;;35275:1;35264:8;:12;35247:29;35243:236;;;-1:-1:-1;;;;;35336:18:1;;:28;;;;35355:8;35336:28;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35336:28:1;35401:9;-1:-1:-1;;;;;35387:34:1;;35396:3;35412:8;35387:34;;;;;;;;;;;;;;;;;;;;35439:14;;;:25;;;35243:236;35509:13;;;;;:29;;;35537:1;35526:8;:12;35509:29;35505:232;;;-1:-1:-1;;;;;35596:18:1;;:28;;;;35615:8;35596:28;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35596:28:1;35660:9;-1:-1:-1;;;;;35647:33:1;;35655:3;35671:8;35647:33;;;;;;;;;;;;;;;;;;;;35698:13;;;:24;;;35505:232;35080:673;;;;:::o;3718:338:0:-;3804:7;3904:12;3897:5;3889:28;;;;-1:-1:-1;;;3889:28: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;3889:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3927:9;3943:1;3939;:5;;;;;;;3718:338;-1:-1:-1;;;;;3718:338:0:o;46129:2683:2:-;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46403:12:2;87:34:-1;135:17;;-1:-1;46403:12:2;;46381:34;;46449:7;46438:20;;46426:6;46433:1;46426:9;;;;;;;;;;;:32;-1:-1:-1;;;;;46426:32:2;;;;;;;;;46469:19;46501:2;46491:13;;;;;-1:-1:-1;;46491:13:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46491:13:2;87:34:-1;135:17;;-1:-1;46491:13:2;;46469:35;;46515:27;46555:2;46545:13;;;;;-1:-1:-1;;46545:13:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;46545:13:2;87:34:-1;135:17;;-1:-1;46545:13:2;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47212:13:2;87:34:-1;135:17;;-1:-1;47212:13:2;;47191:34;;47285:6;47278:4;47271:5;47267:16;47260:32;47313:25;47351:1;47341:12;;;;;-1:-1:-1;;47341:12:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47341:12:2;87:34:-1;135:17;;-1:-1;47341:12:2;;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:2;;;;47531:4;47537:15;47506:14;:47::i;:::-;47488:65;;47564:30;47607:1;47597:12;;;;;-1:-1:-1;;47597:12:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;47597:12:2;87:34:-1;135:17;;-1:-1;47597:12:2;;47564:45;;47677:4;47663:12;47659:23;47653:30;-1:-1:-1;;;47739:1:2;47735:73;47728:4;47709:17;47705:28;47697:112;-1:-1:-1;;;47865:1:2;47861:71;47854:4;47835:17;47831:28;47823:110;-1:-1:-1;;;47989:1:2;47985:69;47978:4;47959:17;47955:28;47947:108;-1:-1:-1;;;48111:1:2;48107:67;48100:4;48081:17;48077:28;48069:106;-1:-1:-1;;;48231:1:2;48227:65;48220:4;48201:17;48197:28;48189:104;-1:-1:-1;;;48349:1:2;48345:63;48338:4;48319:17;48315:28;48307:102;-1:-1:-1;;;48465:1:2;48461:61;48454:4;48435:17;48431:28;48423:100;-1:-1:-1;;;48579:1:2;48575:59;48568:4;48549:17;48545:28;48537:98;-1:-1:-1;48656:123:2;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48752:15:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;48752:15:2;;;;;;;-1:-1:-1;;;48769:7:2;;;;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:2;;;;;-1:-1:-1;48707:70:2;;;;;;;;;;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:2;;;;;;;;;;-1:-1:-1;48707:70:2;;;;;;;;;;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:2;;;;;-1:-1:-1;48707:70:2;;-1:-1:-1;;;;;48707:70:2;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;48707:70:2;;;48697:81;;;;;;48656:31;:123::i;:::-;-1:-1:-1;48797:7:2;46129:2683;-1:-1:-1;;;;;;;;;;;46129:2683:2: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:2;13598:42;13572:69;;;13656:38;;;;;;;;;;;;-1:-1:-1;;;13656:38:2;;;;:23;:38::i;:::-;-1:-1:-1;13716:4:2;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:2;13866:42;13840:69;;;13924:39;;;;;;;;;;;;-1:-1:-1;;;13924:39:2;;;;: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:2;14133:42;14107:69;;;14191:36;;;;;;;;;;;;-1:-1:-1;;;14191:36:2;;;;: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:2;14399:42;14373:69;;;14457:38;;;;;;;;;;;;-1:-1:-1;;;14457:38:2;;;;: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:2;14666:42;14640:69;;;14724:37;;;;;;;;;;;;-1:-1:-1;;;14724:37:2;;;;:23;:37::i;14543:256::-;14871:1;14813:55;14825:42;14813:11;:55::i;:::-;:59;14809:205;;;-1:-1:-1;14907:3:2;:69;;-1:-1:-1;;;;;;14907:69:2;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:2;:69;;-1:-1:-1;;;;;;15121:69:2;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:2;:69;;-1:-1:-1;;;;;;15337:69:2;15363:42;15337:69;;;15421:11;;15238:206;-1:-1:-1;15461:5:2;13404:2070;:::o;1732:187:0:-;1818:7;1853:12;1845:6;;;;1837:29;;;;-1:-1:-1;;;1837:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;27:10;;8:100;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;1837:29:0;-1:-1:-1;;;1888:5:0;;;1732:187::o;55583:707:2:-;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:2;;55583:707;-1:-1:-1;;;;;;;55583:707:2: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:2;52527:8;52536:1;52527:11;;;;;;;;;;-1:-1:-1;;;;;52527:25:2;;;52523:80;;52582:5;52573:14;;52523:80;52503:3;;52465:149;;;-1:-1:-1;52631:6:2;52242:403;-1:-1:-1;;;;52242:403:2:o;48982:1025::-;49081:17;49111:10;49132:14;49157:12;49180;49203:18;49234:2;49224:13;;;;;-1:-1:-1;;49224:13:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;49224:13:2;87:34:-1;135:17;;-1:-1;49224:13:2;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;49389:13:2;87:34:-1;135:17;;-1:-1;49389:13:2;;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:2;-1:-1:-1;;;;;;49734:55:2;;49768:7;;49758:18;;;;;-1:-1:-1;;;;;49734:55:2;;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:2;-1:-1:-1;;;;;;49932:55:2;;49966:7;;49956:18;;;;;-1:-1:-1;;;;;49932:55:2;;;-1:-1:-1;49924:64:2;;-1:-1:-1;;;;;;;49924:64:2;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50346:51:2;87:34:-1;135:17;;-1:-1;50346:51:2;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50501:13:2;87:34:-1;135:17;;-1:-1;50501:13:2;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;50606:22:2;87:34:-1;135:17;;-1:-1;50606:22:2;-1:-1:-1;50583:45:2;-1:-1:-1;;;;50583:45:2;50647:1;50583:45;50639:10;;;;;;;;;;:27;-1:-1:-1;;;;;50639:27:2;;;;;;;;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50922:15:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;50922:15:2;;;;;;;-1:-1:-1;50939:4:2;;-1:-1:-1;50945:14:2;;-1:-1:-1;50912:9:2;: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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51317:17:2;87:34:-1;135:17;;-1:-1;51317:17:2;-1:-1:-1;51294:40:2;-1:-1:-1;;;;51294:40:2;51353:1;51294:40;51345:10;;;;;;;;;;:17;-1:-1:-1;;;;;51345:17:2;;;;;;;;;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:2;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;51440:46:2;87:34:-1;135:17;;-1:-1;51440:46:2;;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:2;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51573:15:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;51573:15:2;;;;;;;-1:-1:-1;51590:4:2;;-1:-1:-1;51596:9:2;;-1:-1:-1;51563:9:2;:43::i;:::-;51555:51;50015:1622;-1:-1:-1;;;;;;;;;;;50015:1622:2:o;5132:163:0:-;5218:7;5253:12;5245:6;5237:29;;;;-1:-1:-1;;;5237:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;27:10;;8:100;;99:1;94:3;90:11;84:18;71:11;;;64:39;52:2;45:10;8:100;;5237:29:0;;5287:1;5283;:5;;;;;;;5132:163;-1:-1:-1;;;;5132:163:0:o;38499:171:2:-;12171:3;;38579:23;;-1:-1:-1;;;;;12171:3:2;12163:26;;12162:64;;-1:-1:-1;12215:3:2;;12195:25;;-1:-1:-1;;;;;12215:3:2;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:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:2;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:2;;;12304:37;;;;-1:-1:-1;12300:108:2;;-1:-1:-1;;12300:108:2;12379:3;;-1:-1:-1;;;;;12379:3:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:2;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:2;-1:-1:-1;;;;;12358:38:2;;;;;;;;;;-1:-1:-1;;;12300:108:2;38622:8;;-1:-1:-1;;;;;38622:8:2;:38;:40;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;35836:384:2;12171:3;;35956:11;;-1:-1:-1;;;;;12171:3:2;12163:26;;12162:64;;-1:-1:-1;12215:3:2;;12195:25;;-1:-1:-1;;;;;12215:3:2;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:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:2;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:2;;;12304:37;;;;-1:-1:-1;12300:108:2;;-1:-1:-1;;12300:108:2;12379:3;;-1:-1:-1;;;;;12379:3:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:2;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:2;-1:-1:-1;;;;;12358:38:2;;;;;;;;;;-1:-1:-1;;;12300:108:2;35980:22;36017:1;36005:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35980:39:2;-1:-1:-1;36043:5:2;: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:2:o;48820:154::-;48920:32;;;;:22;:32;;48955:11;;48920:32;;;:46;-1:-1:-1;;48820:154:2: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:2;;-1:-1:-1;;;;;;;56502:1003:2:o;30239:461::-;12171:3;;30358:11;;-1:-1:-1;;;;;12171:3:2;12163:26;;12162:64;;-1:-1:-1;12215:3:2;;12195:25;;-1:-1:-1;;;;;12215:3:2;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:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12325:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12325:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12325:16:2;;;;;;12312:8;;-1:-1:-1;;;;;12312:8:2;;;12304:37;;;;-1:-1:-1;12300:108:2;;-1:-1:-1;;12300:108:2;12379:3;;-1:-1:-1;;;;;12379:3:2;:14;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12379:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12379:16:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12379:16:2;;;;;;12358:8;:38;;-1:-1:-1;;;;;;12358:38:2;-1:-1:-1;;;;;12358:38:2;;;;;;;;;;-1:-1:-1;;;12300:108:2;30382:10;30395:8;;-1:-1:-1;;;;;30395:8:2;: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:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30395:41:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30395:41:2;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30395:41:2;;;;;;;-1:-1:-1;;;;30459:7:2;30469:11;:23;;30459:33;30451:41;;30447:109;;;-1:-1:-1;30516:1:2;;-1:-1:-1;30509:8:2;;30447:109;30566:17;30586:14;30594:5;30586:7;:14::i;:::-;30618:8;;;30566:34;;-1:-1:-1;;;;;;30618:8:2;;;;: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:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30618:74:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30618:74:2;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30618:74:2;;;;;;;30239:461;-1:-1:-1;;;;;;;;;30239:461:2: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:2: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:2:o;10765:130::-;10837:50;10864:4;8872:1;10837:26;:50::i;:::-;10765:130;:::o;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;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:2;6211:2;6204:3;:9;6198:212;;6330:3;6324:10;6311:24;;6372:2;6364:10;;;;6389:9;;;;;-1:-1:-1;;6215:9:2;6198:212;;;-1:-1:-1;;6440:2:2;: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:2;;5453:1241;-1:-1:-1;;;;5453:1241:2: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:2;7517:14;7502:30;;-1:-1:-1;;7180:387:2: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:2;: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:2;;7868:748;-1:-1:-1;;7868:748:2:o;5006:151::-;5059:9;5090:2;5085;:7;5081:49;;;-1:-1:-1;5116:2:2;5109:9;;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;2187:44451:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2187:44451:1;;;-1:-1:-1;2187:44451:1;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

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