From 1e24ec1352680a3e77ee4a013913de2c71eec5aa Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 2 Mar 2022 08:15:10 +0000 Subject: [PATCH 01/57] Add apply demurrage cli tool --- python/CHANGELOG | 10 ++- .../erc20_demurrage_token/runnable/apply.py | 90 +++++++++++++++++++ python/setup.cfg | 3 +- 3 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 python/erc20_demurrage_token/runnable/apply.py diff --git a/python/CHANGELOG b/python/CHANGELOG index 38043fd..3602f2b 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,4 +1,10 @@ -- 0.0.2-pending +- 0.0.11 + * Apply demurrage cli tool +- 0.0.10 + * Settable sink address +- 0.0.9 + * Correct redistribution amount for SingleNocap contract +- 0.0.2 * Move to chainlib-eth -- 0.0.1-unreleased +- 0.0.1 * Interface for redistributed and non-redistributed, with or without cap diff --git a/python/erc20_demurrage_token/runnable/apply.py b/python/erc20_demurrage_token/runnable/apply.py new file mode 100644 index 0000000..91008fb --- /dev/null +++ b/python/erc20_demurrage_token/runnable/apply.py @@ -0,0 +1,90 @@ +"""Deploy sarafu token + +.. moduleauthor:: Louis Holbrook +.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 + +""" + +# standard imports +import sys +import os +import json +import argparse +import logging + +# external imports +import confini +from funga.eth.signer import EIP155Signer +from funga.eth.keystore.dict import DictKeystore +from chainlib.chain import ChainSpec +from chainlib.eth.nonce import ( + RPCNonceOracle, + OverrideNonceOracle, + ) +from chainlib.eth.gas import ( + RPCGasOracle, + OverrideGasOracle, + ) +from chainlib.eth.connection import EthHTTPConnection +from chainlib.eth.tx import receipt +from chainlib.eth.constant import ZERO_ADDRESS +import chainlib.eth.cli + +# local imports +import erc20_demurrage_token +from erc20_demurrage_token import ( + DemurrageToken, + DemurrageTokenSettings, + ) + +logging.basicConfig(level=logging.WARNING) +logg = logging.getLogger() + +script_dir = os.path.dirname(__file__) +data_dir = os.path.join(script_dir, '..', 'data') + +config_dir = os.path.join(data_dir, 'config') + +arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC +argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +args = argparser.parse_args() +config = chainlib.eth.cli.Config.from_args(args, arg_flags, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) + +wallet = chainlib.eth.cli.Wallet() +wallet.from_config(config) + +rpc = chainlib.eth.cli.Rpc(wallet=wallet) +conn = rpc.connect_by_config(config) + +chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) + + +def main(): + signer = rpc.get_signer() + signer_address = rpc.get_sender_address() + + gas_oracle = rpc.get_gas_oracle() + nonce_oracle = rpc.get_nonce_oracle() + + c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) + (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address) + if config.get('_RPC_SEND'): + conn.do(o) + if config.get('_WAIT'): + r = conn.wait(tx_hash_hex) + if r['status'] == 0: + sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') + sys.exit(1) + # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase) + address = r['contractAddress'] + + print(address) + else: + print(tx_hash_hex) + + else: + print(o) + + +if __name__ == '__main__': + main() diff --git a/python/setup.cfg b/python/setup.cfg index 2f76655..0536298 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.0.8 +version = 0.0.11 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no @@ -40,3 +40,4 @@ packages = [options.entry_points] console_scripts = erc20-demurrage-token-deploy = erc20_demurrage_token.runnable.deploy:main + erc20-demurrage-token-apply = erc20_demurrage_token.runnable.apply:main From 3a1fb226315f52a068e66c129bfcdc0fab5574a2 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 2 Mar 2022 13:32:25 +0000 Subject: [PATCH 02/57] Remove arg defaults --- python/erc20_demurrage_token/runnable/deploy.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/python/erc20_demurrage_token/runnable/deploy.py b/python/erc20_demurrage_token/runnable/deploy.py index ae2cbf2..71b8060 100644 --- a/python/erc20_demurrage_token/runnable/deploy.py +++ b/python/erc20_demurrage_token/runnable/deploy.py @@ -49,8 +49,8 @@ arg_flags = chainlib.eth.cli.argflag_std_write argparser = chainlib.eth.cli.ArgumentParser(arg_flags) argparser.add_argument('--name', dest='token_name', type=str, help='Token name') argparser.add_argument('--symbol', dest='token_symbol', required=True, type=str, help='Token symbol') -argparser.add_argument('--decimals', dest='token_decimals', default=18, type=int, help='Token decimals') -argparser.add_argument('--sink-address', dest='sink_address', default=ZERO_ADDRESS, type=str, help='demurrage level,ppm per minute') +argparser.add_argument('--decimals', dest='token_decimals', type=int, help='Token decimals') +argparser.add_argument('--sink-address', dest='sink_address', type=str, help='demurrage level,ppm per minute') argparser.add_argument('--supply-limit', dest='supply_limit', type=int, help='token supply limit (0 = no limit)') argparser.add_argument('--redistribution-period', type=int, help='redistribution period, minutes (0 = deactivate)') # default 10080 = week argparser.add_argument('--multi', action='store_true', help='automatic redistribution') @@ -90,7 +90,6 @@ conn = rpc.connect_by_config(config) chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) - def main(): signer = rpc.get_signer() signer_address = rpc.get_sender_address() From 1387451e01a579d0077e4748bc4f610eb4a45692 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 24 Apr 2022 18:53:09 +0000 Subject: [PATCH 03/57] Bump deps --- python/requirements.txt | 6 +++--- python/setup.cfg | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/requirements.txt b/python/requirements.txt index cea12ee..59502b2 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,3 +1,3 @@ -chainlib-eth~=0.0.27 -eth-erc20~=0.1.10 -funga-eth~=0.5.6 +chainlib-eth>=0.1.0,<0.2.0 +eth-erc20~=0.3.0 +funga-eth~=0.6.0 diff --git a/python/setup.cfg b/python/setup.cfg index 0536298..673d811 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.0.11 +version = 0.1.0 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From 127c67e665e862e4e5a82ef92a2db881ac3f45cc Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 3 May 2022 18:19:28 +0000 Subject: [PATCH 04/57] Add steps option to demurrage cli --- python/CHANGELOG | 4 + .../erc20_demurrage_token/runnable/apply.py | 90 +++++++++++++++---- python/erc20_demurrage_token/token.py | 4 + python/setup.cfg | 5 +- 4 files changed, 83 insertions(+), 20 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 3602f2b..8f54da5 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,7 @@ +- 0.1.1 + * Settable demurrage steps for apply demurrage cli tool +- 0.1.0 + * Dependency upgrades - 0.0.11 * Apply demurrage cli tool - 0.0.10 diff --git a/python/erc20_demurrage_token/runnable/apply.py b/python/erc20_demurrage_token/runnable/apply.py index 91008fb..270c0f4 100644 --- a/python/erc20_demurrage_token/runnable/apply.py +++ b/python/erc20_demurrage_token/runnable/apply.py @@ -11,6 +11,8 @@ import os import json import argparse import logging +import datetime +import math # external imports import confini @@ -25,10 +27,16 @@ from chainlib.eth.gas import ( RPCGasOracle, OverrideGasOracle, ) +from chainlib.eth.block import ( + block_latest, + block_by_number, + Block, + ) from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import receipt from chainlib.eth.constant import ZERO_ADDRESS import chainlib.eth.cli +from hexathon import to_int as hex_to_int # local imports import erc20_demurrage_token @@ -47,8 +55,11 @@ config_dir = os.path.join(data_dir, 'config') arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser.add_argument('--steps', type=int, default=0, help='Max demurrage steps to apply per round') args = argparser.parse_args() config = chainlib.eth.cli.Config.from_args(args, arg_flags, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) +config.add(args.steps, '_STEPS', False) +logg.debug('config loaded:\n{}'.format(config)) wallet = chainlib.eth.cli.Wallet() wallet.from_config(config) @@ -60,30 +71,73 @@ chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) def main(): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() + o = block_latest() + r = conn.do(o) + + block_start_number = None + try: + block_start_number = hex_to_int(r) + except TypeError: + block_start_number = int(r) + + o = block_by_number(block_start_number) + r = conn.do(o) + + block_start = Block(r) + block_start_timestamp = block_start.timestamp + block_start_datetime = datetime.datetime.fromtimestamp(block_start_timestamp) gas_oracle = rpc.get_gas_oracle() - nonce_oracle = rpc.get_nonce_oracle() + c = DemurrageToken(chain_spec, gas_oracle=gas_oracle) + o = c.demurrage_timestamp(config.get('_EXEC_ADDRESS')) + r = conn.do(o) - c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) - (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address) - if config.get('_RPC_SEND'): - conn.do(o) - if config.get('_WAIT'): - r = conn.wait(tx_hash_hex) - if r['status'] == 0: - sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') - sys.exit(1) - # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase) - address = r['contractAddress'] + demurrage_timestamp = None + try: + demurrage_timestamp = hex_to_int(r) + except TypeError: + demurrage_timestamp = int(r) + demurrage_datetime = datetime.datetime.fromtimestamp(demurrage_timestamp) - print(address) - else: + total_seconds = block_start_timestamp - demurrage_timestamp + total_steps = total_seconds / 60 + + if total_steps < 1.0: + logg.error('only {} seconds since last demurrage application, skipping'.format(total_seconds)) + return + + logg.debug('block start is at {} demurrage is at {} -> {} minutes'.format( + block_start_datetime, + demurrage_datetime, + total_steps, + )) + + rounds = 1 + if config.get('_STEPS') > 0: + rounds = math.ceil(total_steps / config.get('_STEPS')) + + logg.info('will perform {} rounds of {} steps'.format(rounds, config.get('_STEPS'))) + + last_tx_hash = None + for i in range(rounds): + signer = rpc.get_signer() + signer_address = rpc.get_sender_address() + + nonce_oracle = rpc.get_nonce_oracle() + + c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) + (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address, limit=config.get('_STEPS')) + if config.get('_RPC_SEND'): print(tx_hash_hex) + conn.do(o) + if config.get('_WAIT_ALL') or (i == rounds - 1 and config.get('_WAIT')): + r = conn.wait(tx_hash_hex) + if r['status'] == 0: + sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') + sys.exit(1) + else: + print(o) - else: - print(o) if __name__ == '__main__': diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 4b16df8..f1397f0 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -380,6 +380,10 @@ class DemurrageToken(ERC20): return self.call_noarg('demurrageAmount', contract_address, sender_address=sender_address) + def demurrage_timestamp(self, contract_address, sender_address=ZERO_ADDRESS): + return self.call_noarg('demurrageTimestamp', contract_address, sender_address=sender_address) + + def supply_cap(self, contract_address, sender_address=ZERO_ADDRESS): return self.call_noarg('supplyCap', contract_address, sender_address=sender_address) diff --git a/python/setup.cfg b/python/setup.cfg index 673d811..dd9ec7d 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.1.0 +version = 0.1.1 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no @@ -25,12 +25,13 @@ licence_files = [options] include_package_data = True -python_requires = >= 3.6 +python_requires = >= 3.7 packages = erc20_demurrage_token erc20_demurrage_token.runnable erc20_demurrage_token.data erc20_demurrage_token.sim + erc20_demurrage_token.unittest [options.package_data] * = From a0557b35a0c77ea8abfcee0ee7f5c6da28fa5e50 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 27 May 2022 11:10:31 +0000 Subject: [PATCH 05/57] Fix cumulative distribution calculation bug in SingleNocap --- .../data/DemurrageTokenMultiCap.bin | 2 +- .../data/DemurrageTokenMultiNocap.bin | 2 +- .../data/DemurrageTokenSingleCap.bin | 2 +- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 13 +++- python/erc20_demurrage_token/unittest/base.py | 5 +- python/run_tests.sh | 7 +- python/tests/test_redistribution.py | 72 +++++++++++++++++++ python/tests/test_redistribution_unit.py | 19 +++-- solidity/DemurrageTokenSingleNocap.sol | 28 +++++--- 11 files changed, 132 insertions(+), 22 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin index f38361b..66b6ceb 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c1d38038062003c1d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009da565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b60208210811415620009d457620009d362000975565b5b50919050565b60805160a05160c05160e0516131ca62000a5360003960008181610d3501528181610f90015281816110fb01528181611d9a0152818161239b01526123d301526000818161140201528181611d480152611e3501526000818161142e01528181611e560152611e9b01526000611d2401526131ca6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a6004803603810190610295919061294f565b61091c565b6040516102a79190612997565b60405180910390f35b6102b8610ac7565b6040516102c59190612a4b565b60405180910390f35b6102e860048036038101906102e39190612b01565b610b55565b6040516102f59190612997565b60405180910390f35b610306610c79565b6040516103139190612b6c565b60405180910390f35b610324610c9b565b6040516103319190612b96565b60405180910390f35b610342610ca1565b60405161034f9190612b96565b60405180910390f35b610372600480360381019061036d9190612bb1565b610cad565b60405161037f9190612b96565b60405180910390f35b610390610d33565b60405161039d9190612b96565b60405180910390f35b6103c060048036038101906103bb9190612bf1565b610d57565b6040516103cd9190612997565b60405180910390f35b6103f060048036038101906103eb9190612c44565b610e81565b6040516103fd9190612997565b60405180910390f35b610420600480360381019061041b9190612bb1565b610f74565b60405161042d9190612b96565b60405180910390f35b61043e611025565b60405161044b9190612b96565b60405180910390f35b61046e60048036038101906104699190612c44565b61102b565b60405161047b9190612997565b60405180910390f35b61049e60048036038101906104999190612c71565b61122b565b6040516104ab9190612cb7565b60405180910390f35b6104ce60048036038101906104c99190612cfe565b61124f565b6040516104db9190612b96565b60405180910390f35b6104fe60048036038101906104f99190612b01565b611280565b60405161050b9190612997565b60405180910390f35b61052e60048036038101906105299190612c44565b6113a6565b60405161053b9190612b96565b60405180910390f35b61055e60048036038101906105599190612c71565b6113fe565b60405161056b9190612b96565b60405180910390f35b61058e60048036038101906105899190612c71565b61145e565b60405161059b9190612b96565b60405180910390f35b6105ac61147f565b6040516105b99190612b96565b60405180910390f35b6105ca611485565b6040516105d79190612b96565b60405180910390f35b6105fa60048036038101906105f59190612c71565b61148b565b6040516106079190612b96565b60405180910390f35b61062a60048036038101906106259190612c71565b6114f7565b6040516106379190612b96565b60405180910390f35b61065a60048036038101906106559190612c44565b611518565b6040516106679190612b96565b60405180910390f35b61068a60048036038101906106859190612cfe565b611583565b6040516106979190612b96565b60405180910390f35b6106ba60048036038101906106b59190612c44565b6115b6565b6040516106c79190612b96565b60405180910390f35b6106d861165f565b6040516106e59190612997565b60405180910390f35b6106f6611781565b6040516107039190612997565b60405180910390f35b610714611928565b6040516107219190612d3a565b60405180910390f35b61073261194e565b60405161073f9190612997565b60405180910390f35b610750611b05565b60405161075d9190612b96565b60405180910390f35b61076e611b0b565b60405161077b9190612a4b565b60405180910390f35b61079e60048036038101906107999190612c44565b611b99565b6040516107ab9190612997565b60405180910390f35b6107ce60048036038101906107c99190612cfe565b611c56565b6040516107db9190612b96565b60405180910390f35b6107fe60048036038101906107f99190612b01565b611c82565b60405161080b9190612997565b60405180910390f35b61081c611d22565b6040516108299190612b96565b60405180910390f35b61083a611d46565b6040516108479190612b96565b60405180910390f35b61086a60048036038101906108659190612cfe565b611d6a565b6040516108779190612b96565b60405180910390f35b61089a60048036038101906108959190612bb1565b611d7e565b6040516108a79190612b96565b60405180910390f35b6108b8611e2f565b6040516108c59190612b6c565b60405180910390f35b6108d6611e99565b6040516108e39190612b96565b60405180910390f35b61090660048036038101906109019190612c44565b611ebd565b6040516109139190612997565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109715760019050610ac2565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c45760019050610ac2565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a175760019050610ac2565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a6a5760019050610ac2565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abd5760019050610ac2565b600090505b919050565b60068054610ad490612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0090612d84565b8015610b4d5780601f10610b2257610100808354040283529160200191610b4d565b820191906000526020600020905b815481529060010190602001808311610b3057829003601f168201915b505050505081565b600080610b6061194e565b50610b6a3361102b565b50610b748361148b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c029190612de5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c669190612b96565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b600080600080851415610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90612e87565b60405180910390fd5b838510610d0157600080fd5b8484610d0d9190612ed6565b91508482610d1b9190612f07565b90508084610d299190612f61565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d6461194e565b50610d6e3361102b565b50610d788461148b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610e0357600080fd5b610e0e868684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e6d9190612b96565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0a57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f1357600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb99190612ed6565b905060005b8481101561100057620f42408284610fd69190612f07565b610fe09190612ed6565b83610feb9190612f61565b92508080610ff890612f95565b915050610fbe565b50620f424085836110119190612f07565b61101b9190612ed6565b9250505092915050565b60085481565b60008060008060008060008061104089611518565b9150600082148061106a5750611054611e2f565b6fffffffffffffffffffffffffffffffff168210155b1561107f576000975050505050505050611226565b600060018361108e9190612f61565b8154811061109f5761109e612fde565b5b906000526020600020015496506110b58761124f565b945060008514156110d0576000975050505050505050611226565b6110d987611c56565b95506110e487611583565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006111249190612ed6565b86886111309190612ed6565b61113a9190612f07565b6111449190612ed6565b9350620f424081856111569190612f07565b6111609190612ed6565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111ca8984612003565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516112129190612b96565b60405180910390a360019750505050505050505b919050565b6000818154811061123b57600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d957600080fd5b600a54600954846112ea9190612de5565b11156112f557600080fd5b6112fd61194e565b506113078361148b565b9050826009600082825461131b9190612de5565b9250508190555061132c8482612003565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161138a9190612b96565b60405180910390a361139a61215f565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261142c9190612f07565b7f00000000000000000000000000000000000000000000000000000000000000006114579190612de5565b9050919050565b6000603c824261146e9190612f61565b6114789190612ed6565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114dc9190612f07565b6114e69190612f07565b6114f09190612ed6565b9050919050565b6000603c82426115079190612f61565b6115119190612ed6565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115c5856113a6565b92506115d260035461145e565b905061160e600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f74565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef810000000061163f9190612f07565b828461164b9190612f07565b6116559190612ed6565b9350505050919050565b60008060008061167060035461145e565b92506000831415611687576000935050505061177e565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116c48284610f74565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117099190612f07565b6003546117169190612de5565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161176e9190613048565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117de57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061196761165f565b506119706121fb565b995060006001028a14156119915760009a5050505050505050505050611b02565b61199a8a611d6a565b97506001886119a99190612de5565b90506119b4886113fe565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119f2826114f7565b92506000831115611a27576d04ee2d6d415b85acef8100000000611a168685611d7e565b611a209190612ed6565b9350611a44565b6d04ee2d6d415b85acef810000000085611a419190612ed6565b93505b611a53600085600954846122f6565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a878a61124f565b96506000871415611aa257611a9b8a612382565b9550611abc565b611aae87600954610cad565b9550611aba8689612529565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611aeb9190612b96565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b1890612d84565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4490612d84565b8015611b915780601f10611b6657610100808354040283529160200191611b91565b820191906000526020600020905b815481529060010190602001808311611b7457829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bf557600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c8f61194e565b50611c993361102b565b50611ca38461148b565b9150611cb0338684611f5f565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d0f9190612b96565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dc39190612ed6565b905060005b84811015611e0a57620f42408284611de09190612f07565b611dea9190612ed6565b83611df59190612de5565b92508080611e0290612f95565b915050611dc8565b50620f42408583611e1b9190612f07565b611e259190612ed6565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e809190612f61565b611e8a9190612ed6565b611e949190612de5565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f6c8584612613565b50611f778484612003565b50611f80611e2f565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fae575080611fab86611518565b14155b8015611fe657508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611ff757611ff58582612744565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156120645760009350505050612159565b61206d866113a6565b9250848361207b9190612de5565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e2906130af565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121769190612f61565b8154811061218757612186612fde565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121d49190612f61565b815481106121e5576121e4612fde565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122139190612f61565b8154811061222457612223612fde565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bc91906130fb565b6fffffffffffffffffffffffffffffffff1690506122d982611d6a565b81116122ed576000600102925050506122f3565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061239386611c56565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123c59190612f07565b6123cf9190612ed6565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124019190612f07565b61240b9190612ed6565b9050838110156124d75761241e86611d6a565b9250710fffffffff000000000000000000000000001960010260006001856124469190612f61565b8154811061245757612456612fde565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124ae9190612f61565b815481106124bf576124be612fde565b5b90600052602060002001600082825417925050819055505b61251c600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125179190612ed6565b612003565b5081945050505050919050565b600080600084141561253f57600091505061260d565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125729190612f61565b8154811061258357612582612fde565b5b90600052602060002001600082825417925050819055506125cd60006001856125ac9190612f61565b815481106125bd576125bc612fde565b5b9060005260206000200154611c56565b9050612606600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126019190612f61565b612003565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612674576000935050505061273e565b61267d866113a6565b9250848310156126c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b990613174565b60405180910390fd5b84836126ce9190612f61565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612815612820565b506001905092915050565b6000806000806000600160008054905061283a9190612f61565b8154811061284b5761284a612fde565b5b9060005260206000200154925060016128638461124f565b61286d9190612de5565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128c99190612f61565b815481106128da576128d9612fde565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61292c816128f7565b811461293757600080fd5b50565b60008135905061294981612923565b92915050565b600060208284031215612965576129646128f2565b5b60006129738482850161293a565b91505092915050565b60008115159050919050565b6129918161297c565b82525050565b60006020820190506129ac6000830184612988565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129ec5780820151818401526020810190506129d1565b838111156129fb576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a1d826129b2565b612a2781856129bd565b9350612a378185602086016129ce565b612a4081612a01565b840191505092915050565b60006020820190508181036000830152612a658184612a12565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a9882612a6d565b9050919050565b612aa881612a8d565b8114612ab357600080fd5b50565b600081359050612ac581612a9f565b92915050565b6000819050919050565b612ade81612acb565b8114612ae957600080fd5b50565b600081359050612afb81612ad5565b92915050565b60008060408385031215612b1857612b176128f2565b5b6000612b2685828601612ab6565b9250506020612b3785828601612aec565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b6681612b41565b82525050565b6000602082019050612b816000830184612b5d565b92915050565b612b9081612acb565b82525050565b6000602082019050612bab6000830184612b87565b92915050565b60008060408385031215612bc857612bc76128f2565b5b6000612bd685828601612aec565b9250506020612be785828601612aec565b9150509250929050565b600080600060608486031215612c0a57612c096128f2565b5b6000612c1886828701612ab6565b9350506020612c2986828701612ab6565b9250506040612c3a86828701612aec565b9150509250925092565b600060208284031215612c5a57612c596128f2565b5b6000612c6884828501612ab6565b91505092915050565b600060208284031215612c8757612c866128f2565b5b6000612c9584828501612aec565b91505092915050565b6000819050919050565b612cb181612c9e565b82525050565b6000602082019050612ccc6000830184612ca8565b92915050565b612cdb81612c9e565b8114612ce657600080fd5b50565b600081359050612cf881612cd2565b92915050565b600060208284031215612d1457612d136128f2565b5b6000612d2284828501612ce9565b91505092915050565b612d3481612a8d565b82525050565b6000602082019050612d4f6000830184612d2b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d9c57607f821691505b60208210811415612db057612daf612d55565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612df082612acb565b9150612dfb83612acb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e3057612e2f612db6565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e716011836129bd565b9150612e7c82612e3b565b602082019050919050565b60006020820190508181036000830152612ea081612e64565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ee182612acb565b9150612eec83612acb565b925082612efc57612efb612ea7565b5b828204905092915050565b6000612f1282612acb565b9150612f1d83612acb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f5657612f55612db6565b5b828202905092915050565b6000612f6c82612acb565b9150612f7783612acb565b925082821015612f8a57612f89612db6565b5b828203905092915050565b6000612fa082612acb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612fd357612fd2612db6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061303261302d61302884612b41565b61300d565b612acb565b9050919050565b61304281613017565b82525050565b600060208201905061305d6000830184613039565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b6000613099600d836129bd565b91506130a482613063565b602082019050919050565b600060208201905081810360008301526130c88161308c565b9050919050565b6130d881612b41565b81146130e357600080fd5b50565b6000815190506130f5816130cf565b92915050565b600060208284031215613111576131106128f2565b5b600061311f848285016130e6565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061315e600d836129bd565b915061316982613128565b602082019050919050565b6000602082019050818103600083015261318d81613151565b905091905056fea2646970667358221220ac7aec2600370aea4fd0eaf84b0dd8139ddc68a1233b4eb187bf642dd42b866b64736f6c634300080b0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c0d38038062003c0d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009d9565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60805160a05160c05160e0516131bb62000a5260003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131bb6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a3e565b60405180910390f35b6102e860048036038101906102e39190612af4565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b5f565b60405180910390f35b610324610c96565b6040516103319190612b89565b60405180910390f35b610342610c9c565b60405161034f9190612b89565b60405180910390f35b610372600480360381019061036d9190612ba4565b610ca8565b60405161037f9190612b89565b60405180910390f35b610390610d2d565b60405161039d9190612b89565b60405180910390f35b6103c060048036038101906103bb9190612be4565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c37565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612ba4565b610f6e565b60405161042d9190612b89565b60405180910390f35b61043e61101f565b60405161044b9190612b89565b60405180910390f35b61046e60048036038101906104699190612c37565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c64565b611224565b6040516104ab9190612caa565b60405180910390f35b6104ce60048036038101906104c99190612cf1565b611248565b6040516104db9190612b89565b60405180910390f35b6104fe60048036038101906104f99190612af4565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c37565b61139f565b60405161053b9190612b89565b60405180910390f35b61055e60048036038101906105599190612c64565b6113f7565b60405161056b9190612b89565b60405180910390f35b61058e60048036038101906105899190612c64565b611457565b60405161059b9190612b89565b60405180910390f35b6105ac611478565b6040516105b99190612b89565b60405180910390f35b6105ca61147e565b6040516105d79190612b89565b60405180910390f35b6105fa60048036038101906105f59190612c64565b611484565b6040516106079190612b89565b60405180910390f35b61062a60048036038101906106259190612c64565b6114f0565b6040516106379190612b89565b60405180910390f35b61065a60048036038101906106559190612c37565b611511565b6040516106679190612b89565b60405180910390f35b61068a60048036038101906106859190612cf1565b61157c565b6040516106979190612b89565b60405180910390f35b6106ba60048036038101906106b59190612c37565b6115af565b6040516106c79190612b89565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d2d565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b89565b60405180910390f35b61076e611b01565b60405161077b9190612a3e565b60405180910390f35b61079e60048036038101906107999190612c37565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612cf1565b611c4c565b6040516107db9190612b89565b60405180910390f35b6107fe60048036038101906107f99190612af4565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b89565b60405180910390f35b61083a611d3c565b6040516108479190612b89565b60405180910390f35b61086a60048036038101906108659190612cf1565b611d60565b6040516108779190612b89565b60405180910390f35b61089a60048036038101906108959190612ba4565b611d74565b6040516108a79190612b89565b60405180910390f35b6108b8611e25565b6040516108c59190612b5f565b60405180910390f35b6108d6611e8f565b6040516108e39190612b89565b60405180910390f35b61090660048036038101906109019190612c37565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d77565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dd7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b89565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e79565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612ec8565b91508482610d159190612ef9565b90508084610d239190612f53565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b89565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612ec8565b905060005b84811015610ffa57620f42408284610fd09190612ef9565b610fda9190612ec8565b83610fe59190612f53565b92508080610ff290612f87565b915050610fb8565b50620f4240858361100b9190612ef9565b6110159190612ec8565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f53565b8154811061109957611098612fcf565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612ec8565b86886111299190612ec8565b6111339190612ef9565b61113d9190612ec8565b9350620f4240818561114f9190612ef9565b6111599190612ec8565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b89565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dd7565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dd7565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b89565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ef9565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dd7565b9050919050565b6000603c82426114679190612f53565b6114719190612ec8565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ef9565b6114df9190612ef9565b6114e99190612ec8565b9050919050565b6000603c82426115009190612f53565b61150a9190612ec8565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ef9565b82846116449190612ef9565b61164e9190612ec8565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ef9565b60035461170e9190612dd7565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190613039565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dd7565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612ec8565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612ec8565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b89565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d77565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b89565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612ec8565b905060005b84811015611e0057620f42408284611dd69190612ef9565b611de09190612ec8565b83611deb9190612dd7565b92508080611df890612f87565b915050611dbe565b50620f42408583611e119190612ef9565b611e1b9190612ec8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f53565b611e809190612ec8565b611e8a9190612dd7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dd7565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906130a0565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f53565b8154811061217c5761217b612fcf565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f53565b815481106121da576121d9612fcf565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f53565b8154811061221957612218612fcf565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130ec565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ef9565b6123c49190612ec8565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ef9565b6124009190612ec8565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f53565b8154811061244c5761244b612fcf565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f53565b815481106124b4576124b3612fcf565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612ec8565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f53565b8154811061257757612576612fcf565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f53565b815481106125b1576125b0612fcf565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f53565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613165565b60405180910390fd5b84836126c19190612f53565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f53565b8154811061283e5761283d612fcf565b5b90600052602060002001549250600161285684611248565b6128609190612dd7565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f53565b815481106128cd576128cc612fcf565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b838111156129ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a10826129a5565b612a1a81856129b0565b9350612a2a8185602086016129c1565b612a33816129f4565b840191505092915050565b60006020820190508181036000830152612a588184612a05565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8b82612a60565b9050919050565b612a9b81612a80565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b6000819050919050565b612ad181612abe565b8114612adc57600080fd5b50565b600081359050612aee81612ac8565b92915050565b60008060408385031215612b0b57612b0a6128e5565b5b6000612b1985828601612aa9565b9250506020612b2a85828601612adf565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5981612b34565b82525050565b6000602082019050612b746000830184612b50565b92915050565b612b8381612abe565b82525050565b6000602082019050612b9e6000830184612b7a565b92915050565b60008060408385031215612bbb57612bba6128e5565b5b6000612bc985828601612adf565b9250506020612bda85828601612adf565b9150509250929050565b600080600060608486031215612bfd57612bfc6128e5565b5b6000612c0b86828701612aa9565b9350506020612c1c86828701612aa9565b9250506040612c2d86828701612adf565b9150509250925092565b600060208284031215612c4d57612c4c6128e5565b5b6000612c5b84828501612aa9565b91505092915050565b600060208284031215612c7a57612c796128e5565b5b6000612c8884828501612adf565b91505092915050565b6000819050919050565b612ca481612c91565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c91565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b600060208284031215612d0757612d066128e5565b5b6000612d1584828501612cdc565b91505092915050565b612d2781612a80565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8f57607f821691505b602082108103612da257612da1612d48565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de282612abe565b9150612ded83612abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2257612e21612da8565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e636011836129b0565b9150612e6e82612e2d565b602082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed382612abe565b9150612ede83612abe565b925082612eee57612eed612e99565b5b828204905092915050565b6000612f0482612abe565b9150612f0f83612abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f4857612f47612da8565b5b828202905092915050565b6000612f5e82612abe565b9150612f6983612abe565b925082821015612f7c57612f7b612da8565b5b828203905092915050565b6000612f9282612abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc457612fc3612da8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061302361301e61301984612b34565b612ffe565b612abe565b9050919050565b61303381613008565b82525050565b600060208201905061304e600083018461302a565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b600061308a600d836129b0565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b6130c981612b34565b81146130d457600080fd5b50565b6000815190506130e6816130c0565b92915050565b600060208284031215613102576131016128e5565b5b6000613110848285016130d7565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061314f600d836129b0565b915061315a82613119565b602082019050919050565b6000602082019050818103600083015261317e81613142565b905091905056fea2646970667358221220584c6761a6f53a48d12b32828df80bf173ed868c2802527ff2ebbdb3cc94fd7664736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin index 0e2a6fe..229aa27 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c9438038062003c9483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009ec565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b60208210811415620009e657620009e562000987565b5b50919050565b60805160a05160c05160e05161322f62000a6560003960008181610cd101528181610f2c0152818161109701528181611dcb015281816123cc015261240401526000818161137a01528181611d790152611e660152600081816113a601528181611e870152611ecc01526000611d55015261322f6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612980565b6108b8565b60405161029191906129c8565b60405180910390f35b6102a2610a63565b6040516102af9190612a7c565b60405180910390f35b6102d260048036038101906102cd9190612b32565b610af1565b6040516102df91906129c8565b60405180910390f35b6102f0610c15565b6040516102fd9190612b9d565b60405180910390f35b61030e610c37565b60405161031b9190612bc7565b60405180910390f35b61032c610c3d565b6040516103399190612bc7565b60405180910390f35b61035c60048036038101906103579190612be2565b610c49565b6040516103699190612bc7565b60405180910390f35b61037a610ccf565b6040516103879190612bc7565b60405180910390f35b6103aa60048036038101906103a59190612c22565b610cf3565b6040516103b791906129c8565b60405180910390f35b6103da60048036038101906103d59190612c75565b610e1d565b6040516103e791906129c8565b60405180910390f35b61040a60048036038101906104059190612be2565b610f10565b6040516104179190612bc7565b60405180910390f35b610428610fc1565b6040516104359190612bc7565b60405180910390f35b61045860048036038101906104539190612c75565b610fc7565b60405161046591906129c8565b60405180910390f35b61048860048036038101906104839190612ca2565b6111c7565b6040516104959190612ce8565b60405180910390f35b6104b860048036038101906104b39190612d2f565b6111eb565b6040516104c59190612bc7565b60405180910390f35b6104e860048036038101906104e39190612b32565b61121c565b6040516104f591906129c8565b60405180910390f35b61051860048036038101906105139190612c75565b61131e565b6040516105259190612bc7565b60405180910390f35b61054860048036038101906105439190612ca2565b611376565b6040516105559190612bc7565b60405180910390f35b6105666113d6565b6040516105739190612bc7565b60405180910390f35b61059660048036038101906105919190612ca2565b6113dc565b6040516105a39190612bc7565b60405180910390f35b6105c660048036038101906105c19190612ca2565b611448565b6040516105d39190612bc7565b60405180910390f35b6105f660048036038101906105f19190612c75565b611469565b6040516106039190612bc7565b60405180910390f35b61062660048036038101906106219190612d2f565b6114d4565b6040516106339190612bc7565b60405180910390f35b61065660048036038101906106519190612c75565b611507565b6040516106639190612bc7565b60405180910390f35b6106746115e8565b60405161068191906129c8565b60405180910390f35b610692611796565b60405161069f91906129c8565b60405180910390f35b6106b061193d565b6040516106bd9190612d6b565b60405180910390f35b6106ce611963565b6040516106db91906129c8565b60405180910390f35b6106ec611b1a565b6040516106f99190612a7c565b60405180910390f35b61071c60048036038101906107179190612c75565b611ba8565b60405161072991906129c8565b60405180910390f35b61074c60048036038101906107479190612d2f565b611c65565b6040516107599190612bc7565b60405180910390f35b61076a611c91565b6040516107779190612b9d565b60405180910390f35b61079a60048036038101906107959190612b32565b611cb3565b6040516107a791906129c8565b60405180910390f35b6107b8611d53565b6040516107c59190612bc7565b60405180910390f35b6107d6611d77565b6040516107e39190612bc7565b60405180910390f35b61080660048036038101906108019190612d2f565b611d9b565b6040516108139190612bc7565b60405180910390f35b61083660048036038101906108319190612be2565b611daf565b6040516108439190612bc7565b60405180910390f35b610854611e60565b6040516108619190612b9d565b60405180910390f35b610872611eca565b60405161087f9190612bc7565b60405180910390f35b6108a2600480360381019061089d9190612c75565b611eee565b6040516108af91906129c8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561090d5760019050610a5e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109605760019050610a5e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109b35760019050610a5e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a065760019050610a5e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a595760019050610a5e565b600090505b919050565b60058054610a7090612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90612db5565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b505050505081565b600080610afc611963565b50610b0633610fc7565b50610b10836113dc565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b9e9190612e16565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c029190612bc7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b600080600080851415610c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8890612eb8565b60405180910390fd5b838510610c9d57600080fd5b8484610ca99190612f07565b91508482610cb79190612f38565b90508084610cc59190612f92565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d00611963565b50610d0a33610fc7565b50610d14846113dc565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9f57600080fd5b610daa868684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e099190612bc7565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eaf57600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f559190612f07565b905060005b84811015610f9c57620f42408284610f729190612f38565b610f7c9190612f07565b83610f879190612f92565b92508080610f9490612fc6565b915050610f5a565b50620f42408583610fad9190612f38565b610fb79190612f07565b9250505092915050565b60075481565b600080600080600080600080610fdc89611469565b915060008214806110065750610ff0611e60565b6fffffffffffffffffffffffffffffffff168210155b1561101b5760009750505050505050506111c2565b600060018361102a9190612f92565b8154811061103b5761103a61300f565b5b90600052602060002001549650611051876111eb565b9450600085141561106c5760009750505050505050506111c2565b61107587611c65565b9550611080876114d4565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110c09190612f07565b86886110cc9190612f07565b6110d69190612f38565b6110e09190612f07565b9350620f424081856110f29190612f38565b6110fc9190612f07565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111668984612034565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111ae9190612bc7565b60405180910390a360019750505050505050505b919050565b600081815481106111d757600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661127557600080fd5b61127d611963565b5082905082600860008282546112939190612e16565b925050819055506112a48482612034565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113029190612bc7565b60405180910390a3611312612190565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826113a49190612f38565b7f00000000000000000000000000000000000000000000000000000000000000006113cf9190612e16565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef81000000008461142d9190612f38565b6114379190612f38565b6114419190612f07565b9050919050565b6000603c82426114589190612f92565b6114629190612f07565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115168561131e565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff1661153f611e60565b611549919061303e565b6fffffffffffffffffffffffffffffffff169050611597600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f10565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c89190612f38565b82846115d49190612f38565b6115de9190612f07565b9350505050919050565b60008060008060006115f8611e60565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff1684611624919061303e565b92506000836fffffffffffffffffffffffffffffffff16141561164e576000945050505050611793565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169d82846fffffffffffffffffffffffffffffffff16610f10565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161178291906130ad565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117f357600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061197c61222c565b995060006001028a141561199d5760009a5050505050505050505050611b17565b6119a68a611d9b565b97506001886119b59190612e16565b90506119c088611376565b91506119ca6115e8565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611a0782611448565b92506000831115611a3c576d04ee2d6d415b85acef8100000000611a2b8685611daf565b611a359190612f07565b9350611a59565b6d04ee2d6d415b85acef810000000085611a569190612f07565b93505b611a6860008560085484612327565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a9c8a6111eb565b96506000871415611ab757611ab08a6123b3565b9550611ad1565b611ac387600854610c49565b9550611acf868961255a565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611b009190612bc7565b60405180910390a160019a50505050505050505050505b90565b60068054611b2790612db5565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5390612db5565b8015611ba05780601f10611b7557610100808354040283529160200191611ba0565b820191906000526020600020905b815481529060010190602001808311611b8357829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c0457600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cc0611963565b50611cca33610fc7565b50611cd4846113dc565b9150611ce1338684611f90565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d409190612bc7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611df49190612f07565b905060005b84811015611e3b57620f42408284611e119190612f38565b611e1b9190612f07565b83611e269190612e16565b92508080611e3390612fc6565b915050611df9565b50620f42408583611e4c9190612f38565b611e569190612f07565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611eb19190612f92565b611ebb9190612f07565b611ec59190612e16565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4a57600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f9d8584612644565b50611fa88484612034565b50611fb1611e60565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fdf575080611fdc86611469565b14155b801561201757508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15612028576120268582612775565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000851415612095576000935050505061218a565b61209e8661131e565b925084836120ac9190612e16565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161161211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211390613114565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600060016000805490506121a79190612f92565b815481106121b8576121b761300f565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506122059190612f92565b815481106122165761221561300f565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122449190612f92565b815481106122555761225461300f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ed9190613160565b6fffffffffffffffffffffffffffffffff16905061230a82611d9b565b811161231e57600060010292505050612324565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123c486611c65565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123f69190612f38565b6124009190612f07565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124329190612f38565b61243c9190612f07565b9050838110156125085761244f86611d9b565b9250710fffffffff000000000000000000000000001960010260006001856124779190612f92565b815481106124885761248761300f565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124df9190612f92565b815481106124f0576124ef61300f565b5b90600052602060002001600082825417925050819055505b61254d600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef8100000000846125489190612f07565b612034565b5081945050505050919050565b600080600084141561257057600091505061263e565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125a39190612f92565b815481106125b4576125b361300f565b5b90600052602060002001600082825417925050819055506125fe60006001856125dd9190612f92565b815481106125ee576125ed61300f565b5b9060005260206000200154611c65565b9050612637600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126329190612f92565b612034565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008514156126a5576000935050505061276f565b6126ae8661131e565b9250848310156126f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ea906131d9565b60405180910390fd5b84836126ff9190612f92565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612846612851565b506001905092915050565b6000806000806000600160008054905061286b9190612f92565b8154811061287c5761287b61300f565b5b906000526020600020015492506001612894846111eb565b61289e9190612e16565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128fa9190612f92565b8154811061290b5761290a61300f565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61295d81612928565b811461296857600080fd5b50565b60008135905061297a81612954565b92915050565b60006020828403121561299657612995612923565b5b60006129a48482850161296b565b91505092915050565b60008115159050919050565b6129c2816129ad565b82525050565b60006020820190506129dd60008301846129b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a1d578082015181840152602081019050612a02565b83811115612a2c576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a4e826129e3565b612a5881856129ee565b9350612a688185602086016129ff565b612a7181612a32565b840191505092915050565b60006020820190508181036000830152612a968184612a43565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ac982612a9e565b9050919050565b612ad981612abe565b8114612ae457600080fd5b50565b600081359050612af681612ad0565b92915050565b6000819050919050565b612b0f81612afc565b8114612b1a57600080fd5b50565b600081359050612b2c81612b06565b92915050565b60008060408385031215612b4957612b48612923565b5b6000612b5785828601612ae7565b9250506020612b6885828601612b1d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b9781612b72565b82525050565b6000602082019050612bb26000830184612b8e565b92915050565b612bc181612afc565b82525050565b6000602082019050612bdc6000830184612bb8565b92915050565b60008060408385031215612bf957612bf8612923565b5b6000612c0785828601612b1d565b9250506020612c1885828601612b1d565b9150509250929050565b600080600060608486031215612c3b57612c3a612923565b5b6000612c4986828701612ae7565b9350506020612c5a86828701612ae7565b9250506040612c6b86828701612b1d565b9150509250925092565b600060208284031215612c8b57612c8a612923565b5b6000612c9984828501612ae7565b91505092915050565b600060208284031215612cb857612cb7612923565b5b6000612cc684828501612b1d565b91505092915050565b6000819050919050565b612ce281612ccf565b82525050565b6000602082019050612cfd6000830184612cd9565b92915050565b612d0c81612ccf565b8114612d1757600080fd5b50565b600081359050612d2981612d03565b92915050565b600060208284031215612d4557612d44612923565b5b6000612d5384828501612d1a565b91505092915050565b612d6581612abe565b82525050565b6000602082019050612d806000830184612d5c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dcd57607f821691505b60208210811415612de157612de0612d86565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e2182612afc565b9150612e2c83612afc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e6157612e60612de7565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612ea26011836129ee565b9150612ead82612e6c565b602082019050919050565b60006020820190508181036000830152612ed181612e95565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f1282612afc565b9150612f1d83612afc565b925082612f2d57612f2c612ed8565b5b828204905092915050565b6000612f4382612afc565b9150612f4e83612afc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f8757612f86612de7565b5b828202905092915050565b6000612f9d82612afc565b9150612fa883612afc565b925082821015612fbb57612fba612de7565b5b828203905092915050565b6000612fd182612afc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561300457613003612de7565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061304982612b72565b915061305483612b72565b92508282101561306757613066612de7565b5b828203905092915050565b6000819050919050565b600061309761309261308d84612b72565b613072565b612afc565b9050919050565b6130a78161307c565b82525050565b60006020820190506130c2600083018461309e565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130fe600d836129ee565b9150613109826130c8565b602082019050919050565b6000602082019050818103600083015261312d816130f1565b9050919050565b61313d81612b72565b811461314857600080fd5b50565b60008151905061315a81613134565b92915050565b60006020828403121561317657613175612923565b5b60006131848482850161314b565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131c3600d836129ee565b91506131ce8261318d565b602082019050919050565b600060208201905081810360008301526131f2816131b6565b905091905056fea2646970667358221220f9f5ec32eaff12f6c840b25f6687670a3f4334b19d564468870872734c2e758664736f6c634300080b0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c8438038062003c8483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009eb565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b602082108103620009e557620009e462000987565b5b50919050565b60805160a05160c05160e05161322062000a6460003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526132206000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a6f565b60405180910390f35b6102d260048036038101906102cd9190612b25565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b90565b60405180910390f35b61030e610c32565b60405161031b9190612bba565b60405180910390f35b61032c610c38565b6040516103399190612bba565b60405180910390f35b61035c60048036038101906103579190612bd5565b610c44565b6040516103699190612bba565b60405180910390f35b61037a610cc9565b6040516103879190612bba565b60405180910390f35b6103aa60048036038101906103a59190612c15565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c68565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bd5565b610f0a565b6040516104179190612bba565b60405180910390f35b610428610fbb565b6040516104359190612bba565b60405180910390f35b61045860048036038101906104539190612c68565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c95565b6111c0565b6040516104959190612cdb565b60405180910390f35b6104b860048036038101906104b39190612d22565b6111e4565b6040516104c59190612bba565b60405180910390f35b6104e860048036038101906104e39190612b25565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c68565b611317565b6040516105259190612bba565b60405180910390f35b61054860048036038101906105439190612c95565b61136f565b6040516105559190612bba565b60405180910390f35b6105666113cf565b6040516105739190612bba565b60405180910390f35b61059660048036038101906105919190612c95565b6113d5565b6040516105a39190612bba565b60405180910390f35b6105c660048036038101906105c19190612c95565b611441565b6040516105d39190612bba565b60405180910390f35b6105f660048036038101906105f19190612c68565b611462565b6040516106039190612bba565b60405180910390f35b61062660048036038101906106219190612d22565b6114cd565b6040516106339190612bba565b60405180910390f35b61065660048036038101906106519190612c68565b611500565b6040516106639190612bba565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d5e565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a6f565b60405180910390f35b61071c60048036038101906107179190612c68565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d22565b611c5b565b6040516107599190612bba565b60405180910390f35b61076a611c87565b6040516107779190612b90565b60405180910390f35b61079a60048036038101906107959190612b25565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bba565b60405180910390f35b6107d6611d6d565b6040516107e39190612bba565b60405180910390f35b61080660048036038101906108019190612d22565b611d91565b6040516108139190612bba565b60405180910390f35b61083660048036038101906108319190612bd5565b611da5565b6040516108439190612bba565b60405180910390f35b610854611e56565b6040516108619190612b90565b60405180910390f35b610872611ec0565b60405161087f9190612bba565b60405180910390f35b6108a2600480360381019061089d9190612c68565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612da8565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612e08565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bba565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612eaa565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ef9565b91508482610cb19190612f2a565b90508084610cbf9190612f84565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bba565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ef9565b905060005b84811015610f9657620f42408284610f6c9190612f2a565b610f769190612ef9565b83610f819190612f84565b92508080610f8e90612fb8565b915050610f54565b50620f42408583610fa79190612f2a565b610fb19190612ef9565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f84565b8154811061103557611034613000565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ef9565b86886110c59190612ef9565b6110cf9190612f2a565b6110d99190612ef9565b9350620f424081856110eb9190612f2a565b6110f59190612ef9565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bba565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612e08565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bba565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612f2a565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612e08565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612f2a565b6114309190612f2a565b61143a9190612ef9565b9050919050565b6000603c82426114519190612f84565b61145b9190612ef9565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b611542919061302f565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612f2a565b82846115cd9190612f2a565b6115d79190612ef9565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d919061302f565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061309e565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612e08565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ef9565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ef9565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bba565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612da8565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bba565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ef9565b905060005b84811015611e3157620f42408284611e079190612f2a565b611e119190612ef9565b83611e1c9190612e08565b92508080611e2990612fb8565b915050611def565b50620f42408583611e429190612f2a565b611e4c9190612ef9565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f84565b611eb19190612ef9565b611ebb9190612e08565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612e08565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890613105565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f84565b815481106121ad576121ac613000565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f84565b8154811061220b5761220a613000565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f84565b8154811061224a57612249613000565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190613151565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612f2a565b6123f59190612ef9565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612f2a565b6124319190612ef9565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f84565b8154811061247d5761247c613000565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f84565b815481106124e5576124e4613000565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ef9565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f84565b815481106125a8576125a7613000565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f84565b815481106125e2576125e1613000565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f84565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906131ca565b60405180910390fd5b84836126f29190612f84565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f84565b8154811061286f5761286e613000565b5b906000526020600020015492506001612887846111e4565b6128919190612e08565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f84565b815481106128fe576128fd613000565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b8114612ad757600080fd5b50565b600081359050612ae981612ac3565b92915050565b6000819050919050565b612b0281612aef565b8114612b0d57600080fd5b50565b600081359050612b1f81612af9565b92915050565b60008060408385031215612b3c57612b3b612916565b5b6000612b4a85828601612ada565b9250506020612b5b85828601612b10565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8a81612b65565b82525050565b6000602082019050612ba56000830184612b81565b92915050565b612bb481612aef565b82525050565b6000602082019050612bcf6000830184612bab565b92915050565b60008060408385031215612bec57612beb612916565b5b6000612bfa85828601612b10565b9250506020612c0b85828601612b10565b9150509250929050565b600080600060608486031215612c2e57612c2d612916565b5b6000612c3c86828701612ada565b9350506020612c4d86828701612ada565b9250506040612c5e86828701612b10565b9150509250925092565b600060208284031215612c7e57612c7d612916565b5b6000612c8c84828501612ada565b91505092915050565b600060208284031215612cab57612caa612916565b5b6000612cb984828501612b10565b91505092915050565b6000819050919050565b612cd581612cc2565b82525050565b6000602082019050612cf06000830184612ccc565b92915050565b612cff81612cc2565b8114612d0a57600080fd5b50565b600081359050612d1c81612cf6565b92915050565b600060208284031215612d3857612d37612916565b5b6000612d4684828501612d0d565b91505092915050565b612d5881612ab1565b82525050565b6000602082019050612d736000830184612d4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dc057607f821691505b602082108103612dd357612dd2612d79565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e1382612aef565b9150612e1e83612aef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5357612e52612dd9565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e946011836129e1565b9150612e9f82612e5e565b602082019050919050565b60006020820190508181036000830152612ec381612e87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f0482612aef565b9150612f0f83612aef565b925082612f1f57612f1e612eca565b5b828204905092915050565b6000612f3582612aef565b9150612f4083612aef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7957612f78612dd9565b5b828202905092915050565b6000612f8f82612aef565b9150612f9a83612aef565b925082821015612fad57612fac612dd9565b5b828203905092915050565b6000612fc382612aef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff557612ff4612dd9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061303a82612b65565b915061304583612b65565b92508282101561305857613057612dd9565b5b828203905092915050565b6000819050919050565b600061308861308361307e84612b65565b613063565b612aef565b9050919050565b6130988161306d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130ef600d836129e1565b91506130fa826130b9565b602082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b61312e81612b65565b811461313957600080fd5b50565b60008151905061314b81613125565b92915050565b60006020828403121561316757613166612916565b5b60006131758482850161313c565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131b4600d836129e1565b91506131bf8261317e565b602082019050919050565b600060208201905081810360008301526131e3816131a7565b905091905056fea2646970667358221220264f607b835653f036df7c03346e36a25ca6aaeba8bb51495b6669a847b0b5b164736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin index b1d17a5..06e6bd2 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b50604051620036593803806200365983398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a34565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b6020821081141562000a2e5762000a2d620009cf565b5b50919050565b60805160a05160c05160e051612bac62000aad60003960008181610ccc01528181610f1c0152611c120152600081816111be01528181611a880152611cb10152600081816111ea01528181611cd20152611d1701526000818161125d015281816112950152818161130d0152611a640152612bac6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612280565b610943565b6040516102b291906122c8565b60405180910390f35b6102c3610aee565b6040516102d0919061237c565b60405180910390f35b6102f360048036038101906102ee9190612432565b610b7c565b60405161030091906122c8565b60405180910390f35b610311610c96565b60405161031e919061249d565b60405180910390f35b61032f610cb8565b60405161033c91906124c7565b60405180910390f35b61034d610cbe565b60405161035a91906124c7565b60405180910390f35b61036b610cca565b60405161037891906124c7565b60405180910390f35b61039b600480360381019061039691906124e2565b610cee565b6040516103a891906122c8565b60405180910390f35b6103cb60048036038101906103c69190612535565b610e0e565b6040516103d891906122c8565b60405180910390f35b6103fb60048036038101906103f69190612562565b610f01565b60405161040891906124c7565b60405180910390f35b610419610fb5565b60405161042691906124c7565b60405180910390f35b610449600480360381019061044491906125a2565b610fbb565b60405161045691906125e8565b60405180910390f35b61047960048036038101906104749190612432565b610fdf565b60405161048691906122c8565b60405180910390f35b6104a960048036038101906104a49190612535565b611171565b6040516104b691906124c7565b60405180910390f35b6104d960048036038101906104d491906125a2565b6111ba565b6040516104e691906124c7565b60405180910390f35b610509600480360381019061050491906125a2565b61121a565b60405161051691906124c7565b60405180910390f35b61052761123b565b60405161053491906124c7565b60405180910390f35b610545611241565b60405161055291906124c7565b60405180910390f35b61057560048036038101906105709190612562565b611247565b60405161058291906124c7565b60405180910390f35b6105a560048036038101906105a091906125a2565b6112c8565b6040516105b291906124c7565b60405180910390f35b6105d560048036038101906105d091906125a2565b611348565b6040516105e291906124c7565b60405180910390f35b6106056004803603810190610600919061262f565b611369565b60405161061291906124c7565b60405180910390f35b61063560048036038101906106309190612535565b6113a3565b60405161064291906124c7565b60405180910390f35b61065361145b565b60405161066091906122c8565b60405180910390f35b61067161146c565b60405161067e91906122c8565b60405180910390f35b6106a1600480360381019061069c919061262f565b611613565b6040516106ae91906124c7565b60405180910390f35b6106bf611641565b6040516106cc919061266b565b60405180910390f35b6106ef60048036038101906106ea9190612535565b611667565b005b6106f9611705565b60405161070691906122c8565b60405180910390f35b61071761184f565b60405161072491906124c7565b60405180910390f35b610735611855565b604051610742919061237c565b60405180910390f35b61076560048036038101906107609190612535565b6118e3565b60405161077291906122c8565b60405180910390f35b6107956004803603810190610790919061262f565b6119a0565b6040516107a291906124c7565b60405180910390f35b6107c560048036038101906107c09190612432565b6119cc565b6040516107d291906122c8565b60405180910390f35b6107e3611a62565b6040516107f091906124c7565b60405180910390f35b610801611a86565b60405161080e91906124c7565b60405180910390f35b610831600480360381019061082c91906125a2565b611aaa565b60405161083e91906122c8565b60405180910390f35b610861600480360381019061085c919061262f565b611be3565b60405161086e91906124c7565b60405180910390f35b610891600480360381019061088c9190612562565b611bf7565b60405161089e91906124c7565b60405180910390f35b6108af611cab565b6040516108bc919061249d565b60405180910390f35b6108cd611d15565b6040516108da91906124c7565b60405180910390f35b6108fd60048036038101906108f89190612535565b611d39565b60405161090a91906122c8565b60405180910390f35b61092d60048036038101906109289190612686565b611ddb565b60405161093a91906125e8565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109985760019050610ae9565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109eb5760019050610ae9565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a3e5760019050610ae9565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a915760019050610ae9565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610ae45760019050610ae9565b600090505b919050565b60068054610afb9061271c565b80601f0160208091040260200160405190810160405280929190818152602001828054610b279061271c565b8015610b745780601f10610b4957610100808354040283529160200191610b74565b820191906000526020600020905b815481529060010190602001808311610b5757829003601f168201915b505050505081565b600080610b87611705565b50610b91836112c8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1f919061277d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c8391906124c7565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfb611705565b50610d05846112c8565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9057600080fd5b610d9b868684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dfa91906124c7565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea057600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f459190612802565b905060005b84811015610f8e5764e8d4a510008284610f649190612833565b610f6e9190612802565b83610f79919061288d565b92508080610f86906128c1565b915050610f4a565b5064e8d4a510008583610fa19190612833565b610fab9190612802565b9250505092915050565b60085481565b60008181548110610fcb57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590612956565b60405180910390fd5b600a546009548461107f919061277d565b11156110c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b7906129c2565b60405180910390fd5b6110c8611705565b506110d2836112c8565b905082600960008282546110e6919061277d565b925050819055506110f78482611e6d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115591906124c7565b60405180910390a3611165611f32565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e89190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611213919061277d565b9050919050565b6000603c824261122a919061288d565b6112349190612802565b9050919050565b600b5481565b60035481565b6000806402540be4008361125b9190612833565b7f0000000000000000000000000000000000000000000000000000000000000000611286919061288d565b846112919190612833565b90507f0000000000000000000000000000000000000000000000000000000000000000816112bf9190612802565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f991906129e2565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113379190612833565b6113419190612802565b9050919050565b6000603c8242611358919061288d565b6113629190612802565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113b285611171565b92506113bf60035461121a565b905061140b6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113f391906129e2565b6fffffffffffffffffffffffffffffffff1682610f01565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061143b9190612833565b82846114479190612833565b6114519190612802565b9350505050919050565b60006114676000611aaa565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b6000806000611621846119a0565b915061162c84611369565b90506116388282611247565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c157600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080600061171b61145b565b50611724611fd4565b975060006001028814156117435760009850505050505050505061184c565b61174c88611be3565b955060018661175b919061277d565b9050611766866111ba565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506117a482611348565b925060008311156117c0576117b98584611bf7565b93506117c4565b8493505b6117d360008560095484611ddb565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611807876120cf565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183791906124c7565b60405180910390a16001985050505050505050505b90565b600a5481565b600780546118629061271c565b80601f016020809104026020016040519081016040528092919081815260200182805461188e9061271c565b80156118db5780601f106118b0576101008083540402835291602001916118db565b820191906000526020600020905b8154815290600101906020018083116118be57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193f57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d9611705565b506119e3846112c8565b91506119f0338684611e48565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4f91906124c7565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aba60035461121a565b91506000821415611ad057600092505050611bde565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b1257508184105b15611b1b578391505b611b258183610f01565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b6a9190612833565b600354611b77919061277d565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bcf9190612a67565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3b9190612802565b905060005b84811015611c845764e8d4a510008284611c5a9190612833565b611c649190612802565b83611c6f919061277d565b92508080611c7c906128c1565b915050611c40565b5064e8d4a510008583611c979190612833565b611ca19190612802565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cfc919061288d565b611d069190612802565b611d10919061277d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d9557600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e55858461211b565b50611e608484611e6d565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611eca5760009350505050611f2c565b611ed386611171565b92508483611ee1919061277d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f50919061288d565b81548110611f6157611f60612a82565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fac919061288d565b81548110611fbd57611fbc612a82565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fec919061288d565b81548110611ffd57611ffc612a82565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120959190612add565b6fffffffffffffffffffffffffffffffff1690506120b282611be3565b81116120c6576000600102925050506120cc565b81925050505b90565b6000806120db83611613565b9050612111600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661210c836112c8565b611e6d565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415612178576000935050505061221d565b61218186611171565b9250848310156121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd90612b56565b60405180910390fd5b84836121d2919061288d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61225d81612228565b811461226857600080fd5b50565b60008135905061227a81612254565b92915050565b60006020828403121561229657612295612223565b5b60006122a48482850161226b565b91505092915050565b60008115159050919050565b6122c2816122ad565b82525050565b60006020820190506122dd60008301846122b9565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561231d578082015181840152602081019050612302565b8381111561232c576000848401525b50505050565b6000601f19601f8301169050919050565b600061234e826122e3565b61235881856122ee565b93506123688185602086016122ff565b61237181612332565b840191505092915050565b600060208201905081810360008301526123968184612343565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c98261239e565b9050919050565b6123d9816123be565b81146123e457600080fd5b50565b6000813590506123f6816123d0565b92915050565b6000819050919050565b61240f816123fc565b811461241a57600080fd5b50565b60008135905061242c81612406565b92915050565b6000806040838503121561244957612448612223565b5b6000612457858286016123e7565b92505060206124688582860161241d565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61249781612472565b82525050565b60006020820190506124b2600083018461248e565b92915050565b6124c1816123fc565b82525050565b60006020820190506124dc60008301846124b8565b92915050565b6000806000606084860312156124fb576124fa612223565b5b6000612509868287016123e7565b935050602061251a868287016123e7565b925050604061252b8682870161241d565b9150509250925092565b60006020828403121561254b5761254a612223565b5b6000612559848285016123e7565b91505092915050565b6000806040838503121561257957612578612223565b5b60006125878582860161241d565b92505060206125988582860161241d565b9150509250929050565b6000602082840312156125b8576125b7612223565b5b60006125c68482850161241d565b91505092915050565b6000819050919050565b6125e2816125cf565b82525050565b60006020820190506125fd60008301846125d9565b92915050565b61260c816125cf565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b60006020828403121561264557612644612223565b5b60006126538482850161261a565b91505092915050565b612665816123be565b82525050565b6000602082019050612680600083018461265c565b92915050565b600080600080608085870312156126a05761269f612223565b5b60006126ae8782880161241d565b94505060206126bf8782880161241d565b93505060406126d08782880161241d565b92505060606126e18782880161241d565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061273457607f821691505b60208210811415612748576127476126ed565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612788826123fc565b9150612793836123fc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127c8576127c761274e565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061280d826123fc565b9150612818836123fc565b925082612828576128276127d3565b5b828204905092915050565b600061283e826123fc565b9150612849836123fc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128825761288161274e565b5b828202905092915050565b6000612898826123fc565b91506128a3836123fc565b9250828210156128b6576128b561274e565b5b828203905092915050565b60006128cc826123fc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156128ff576128fe61274e565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612940600a836122ee565b915061294b8261290a565b602082019050919050565b6000602082019050818103600083015261296f81612933565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129ac6007836122ee565b91506129b782612976565b602082019050919050565b600060208201905081810360008301526129db8161299f565b9050919050565b60006129ed82612472565b91506129f883612472565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a2157612a2061274e565b5b828202905092915050565b6000819050919050565b6000612a51612a4c612a4784612472565b612a2c565b6123fc565b9050919050565b612a6181612a36565b82525050565b6000602082019050612a7c6000830184612a58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aba81612472565b8114612ac557600080fd5b50565b600081519050612ad781612ab1565b92915050565b600060208284031215612af357612af2612223565b5b6000612b0184828501612ac8565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b40600d836122ee565b9150612b4b82612b0a565b602082019050919050565b60006020820190508181036000830152612b6f81612b33565b905091905056fea2646970667358221220100682493d588dd205f0e53bc131ba668867313a64e728c35307651637c6757a64736f6c634300080b0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b506040516200364d3803806200364d83398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a33565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b60208210810362000a2d5762000a2c620009cf565b5b50919050565b60805160a05160c05160e051612ba162000aac60003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612ba16000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d09190612373565b60405180910390f35b6102f360048036038101906102ee9190612429565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e9190612494565b60405180910390f35b61032f610cb3565b60405161033c91906124be565b60405180910390f35b61034d610cb9565b60405161035a91906124be565b60405180910390f35b61036b610cc5565b60405161037891906124be565b60405180910390f35b61039b600480360381019061039691906124d9565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c6919061252c565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612559565b610efc565b60405161040891906124be565b60405180910390f35b610419610fb0565b60405161042691906124be565b60405180910390f35b61044960048036038101906104449190612599565b610fb6565b60405161045691906125df565b60405180910390f35b61047960048036038101906104749190612429565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a4919061252c565b61116c565b6040516104b691906124be565b60405180910390f35b6104d960048036038101906104d49190612599565b6111b5565b6040516104e691906124be565b60405180910390f35b61050960048036038101906105049190612599565b611215565b60405161051691906124be565b60405180910390f35b610527611236565b60405161053491906124be565b60405180910390f35b61054561123c565b60405161055291906124be565b60405180910390f35b61057560048036038101906105709190612559565b611242565b60405161058291906124be565b60405180910390f35b6105a560048036038101906105a09190612599565b6112c3565b6040516105b291906124be565b60405180910390f35b6105d560048036038101906105d09190612599565b611343565b6040516105e291906124be565b60405180910390f35b61060560048036038101906106009190612626565b611364565b60405161061291906124be565b60405180910390f35b6106356004803603810190610630919061252c565b61139e565b60405161064291906124be565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c9190612626565b61160e565b6040516106ae91906124be565b60405180910390f35b6106bf61163c565b6040516106cc9190612662565b60405180910390f35b6106ef60048036038101906106ea919061252c565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124be565b60405180910390f35b61073561184f565b6040516107429190612373565b60405180910390f35b6107656004803603810190610760919061252c565b6118dd565b60405161077291906122bf565b60405180910390f35b61079560048036038101906107909190612626565b61199a565b6040516107a291906124be565b60405180910390f35b6107c560048036038101906107c09190612429565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124be565b60405180910390f35b610801611a80565b60405161080e91906124be565b60405180910390f35b610831600480360381019061082c9190612599565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c9190612626565b611bdc565b60405161086e91906124be565b60405180910390f35b610891600480360381019061088c9190612559565b611bf0565b60405161089e91906124be565b60405180910390f35b6108af611ca4565b6040516108bc9190612494565b60405180910390f35b6108cd611d0e565b6040516108da91906124be565b60405180910390f35b6108fd60048036038101906108f8919061252c565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d6004803603810190610928919061267d565b611dd4565b60405161093a91906125df565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af690612713565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612713565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612773565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124be565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124be565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127f8565b905060005b84811015610f895764e8d4a510008284610f5f9190612829565b610f6991906127f8565b83610f749190612883565b92508080610f81906128b7565b915050610f45565b5064e8d4a510008583610f9c9190612829565b610fa691906127f8565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110609061294b565b60405180910390fd5b600a546009548461107a9190612773565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906129b7565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e19190612773565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124be565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e39190612829565b7f000000000000000000000000000000000000000000000000000000000000000061120e9190612773565b9050919050565b6000603c82426112259190612883565b61122f91906127f8565b9050919050565b600b5481565b60035481565b6000806402540be400836112569190612829565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612883565b8461128c9190612829565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127f8565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f491906129d7565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113329190612829565b61133c91906127f8565b9050919050565b6000603c82426113539190612883565b61135d91906127f8565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee91906129d7565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006114369190612829565b82846114429190612829565b61144c91906127f8565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b95506001866117559190612773565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124be565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c90612713565b80601f016020809104026020016040519081016040528092919081815260200182805461188890612713565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124be565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b639190612829565b600354611b709190612773565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a5c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127f8565b905060005b84811015611c7d5764e8d4a510008284611c539190612829565b611c5d91906127f8565b83611c689190612773565b92508080611c75906128b7565b915050611c39565b5064e8d4a510008583611c909190612829565b611c9a91906127f8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612883565b611cff91906127f8565b611d099190612773565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed99190612773565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612883565b81548110611f5957611f58612a77565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612883565b81548110611fb557611fb4612a77565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612883565b81548110611ff557611ff4612a77565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612ad2565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612b4b565b60405180910390fd5b84836121c99190612883565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b83811115612323576000848401525b50505050565b6000601f19601f8301169050919050565b6000612345826122da565b61234f81856122e5565b935061235f8185602086016122f6565b61236881612329565b840191505092915050565b6000602082019050818103600083015261238d818461233a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c082612395565b9050919050565b6123d0816123b5565b81146123db57600080fd5b50565b6000813590506123ed816123c7565b92915050565b6000819050919050565b612406816123f3565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b600080604083850312156124405761243f61221a565b5b600061244e858286016123de565b925050602061245f85828601612414565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248e81612469565b82525050565b60006020820190506124a96000830184612485565b92915050565b6124b8816123f3565b82525050565b60006020820190506124d360008301846124af565b92915050565b6000806000606084860312156124f2576124f161221a565b5b6000612500868287016123de565b9350506020612511868287016123de565b925050604061252286828701612414565b9150509250925092565b6000602082840312156125425761254161221a565b5b6000612550848285016123de565b91505092915050565b600080604083850312156125705761256f61221a565b5b600061257e85828601612414565b925050602061258f85828601612414565b9150509250929050565b6000602082840312156125af576125ae61221a565b5b60006125bd84828501612414565b91505092915050565b6000819050919050565b6125d9816125c6565b82525050565b60006020820190506125f460008301846125d0565b92915050565b612603816125c6565b811461260e57600080fd5b50565b600081359050612620816125fa565b92915050565b60006020828403121561263c5761263b61221a565b5b600061264a84828501612611565b91505092915050565b61265c816123b5565b82525050565b60006020820190506126776000830184612653565b92915050565b600080600080608085870312156126975761269661221a565b5b60006126a587828801612414565b94505060206126b687828801612414565b93505060406126c787828801612414565b92505060606126d887828801612414565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272b57607f821691505b60208210810361273e5761273d6126e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061277e826123f3565b9150612789836123f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127be576127bd612744565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612803826123f3565b915061280e836123f3565b92508261281e5761281d6127c9565b5b828204905092915050565b6000612834826123f3565b915061283f836123f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287857612877612744565b5b828202905092915050565b600061288e826123f3565b9150612899836123f3565b9250828210156128ac576128ab612744565b5b828203905092915050565b60006128c2826123f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128f4576128f3612744565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612935600a836122e5565b9150612940826128ff565b602082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129a16007836122e5565b91506129ac8261296b565b602082019050919050565b600060208201905081810360008301526129d081612994565b9050919050565b60006129e282612469565b91506129ed83612469565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a1657612a15612744565b5b828202905092915050565b6000819050919050565b6000612a46612a41612a3c84612469565b612a21565b6123f3565b9050919050565b612a5681612a2b565b82525050565b6000602082019050612a716000830184612a4d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aaf81612469565b8114612aba57600080fd5b50565b600081519050612acc81612aa6565b92915050565b600060208284031215612ae857612ae761221a565b5b6000612af684828501612abd565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b35600d836122e5565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b905091905056fea264697066735822122062c31e95bd6895f83a0143b8b2662ee1e29e96dcc6cdf00d59c085ca9228ddc264736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index ec2299a..05d7cf6 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000412565b6080908152503480156200003657600080fd5b506040516200354d3803806200354d83398181016040528101906200005c919062000731565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f92919062000329565b5084600790805190602001906200014892919062000329565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000412565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002bc640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a991906200095f565b600a819055505050505050505062000a15565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033790620009df565b90600052602060002090601f0160209004810192826200035b5760008555620003a7565b82601f106200037657805160ff1916838001178555620003a7565b82800160010185558215620003a7579182015b82811115620003a657825182559160200191906001019062000389565b5b509050620003b69190620003ba565b5090565b5b80821115620003d5576000816000905550600101620003bb565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041f82620003d9565b91506200042c83620003d9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004685762000467620003e3565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004dc8262000491565b810181811067ffffffffffffffff82111715620004fe57620004fd620004a2565b5b80604052505050565b60006200051362000473565b9050620005218282620004d1565b919050565b600067ffffffffffffffff821115620005445762000543620004a2565b5b6200054f8262000491565b9050602081019050919050565b60005b838110156200057c5780820151818401526020810190506200055f565b838111156200058c576000848401525b50505050565b6000620005a9620005a38462000526565b62000507565b905082815260208101848484011115620005c857620005c76200048c565b5b620005d58482856200055c565b509392505050565b600082601f830112620005f557620005f462000487565b5b81516200060784826020860162000592565b91505092915050565b600060ff82169050919050565b620006288162000610565b81146200063457600080fd5b50565b60008151905062000648816200061d565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b62000675816200064e565b81146200068157600080fd5b50565b60008151905062000695816200066a565b92915050565b620006a681620003d9565b8114620006b257600080fd5b50565b600081519050620006c6816200069b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006f982620006cc565b9050919050565b6200070b81620006ec565b81146200071757600080fd5b50565b6000815190506200072b8162000700565b92915050565b60008060008060008060c087890312156200075157620007506200047d565b5b600087015167ffffffffffffffff81111562000772576200077162000482565b5b6200078089828a01620005dd565b965050602087015167ffffffffffffffff811115620007a457620007a362000482565b5b620007b289828a01620005dd565b9550506040620007c589828a0162000637565b9450506060620007d889828a0162000684565b9350506080620007eb89828a01620006b5565b92505060a0620007fe89828a016200071a565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b60018511156200086a57808604811115620008425762000841620003e3565b5b6001851615620008525780820291505b808102905062000862856200080b565b945062000822565b94509492505050565b60008262000885576001905062000958565b8162000895576000905062000958565b8160018114620008ae5760028114620008b957620008ef565b600191505062000958565b60ff841115620008ce57620008cd620003e3565b5b8360020a915084821115620008e857620008e7620003e3565b5b5062000958565b5060208310610133831016604e8410600b8410161715620009295782820a905083811115620009235762000922620003e3565b5b62000958565b62000938848484600162000818565b92509050818404811115620009525762000951620003e3565b5b81810290505b9392505050565b60006200096c82620003d9565b91506200097983620003d9565b9250620009a87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000873565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009f857607f821691505b6020821081141562000a0f5762000a0e620009b0565b5b50919050565b60805160a05160c05160e051612abf62000a8e60003960008181610ca301528181610ef30152611b9101526000818161114301528181611a070152611c3001526000818161116f01528181611c510152611c960152600081816111e20152818161121a0152818161129201526119e30152612abf6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a05116101635780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a1461081e578063e54d63f71461084e578063e80952951461087e578063eda4e6d61461089c578063f2fde38b146108ba578063f83da35d146108ea5761027b565b80639da7d8ba14610752578063a9059cbb14610782578063ab28cea0146107b2578063b470aade146107d0578063c0ab7077146107ee5761027b565b80638da5cb5b116101275780638da5cb5b146106ac5780638f0b2d5d146106ca5780638f1df6bc146106e657806395d89b4114610704578063983b2d56146107225761027b565b80636ffa8a05146105e057806370a0823114610610578063731f237c1461064057806379ba50971461065e5780638d34855a1461067c5761027b565b8063313ce567116101fc57806351b4541c116101c057806351b4541c146104e4578063573cc5071461051457806358b2833b146105325780636721d4ef146105505780636787a9be146105805780636a2d094e146105b05761027b565b8063313ce5671461040657806340452d9114610424578063449a52f81461045457806347a50517146104845780634abfbba2146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063229ba1971461035857806323b872dd146103765780633092afd5146103a657806331333487146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a600480360381019061029591906121ff565b61091a565b6040516102a79190612247565b60405180910390f35b6102b8610ac5565b6040516102c591906122fb565b60405180910390f35b6102e860048036038101906102e391906123b1565b610b53565b6040516102f59190612247565b60405180910390f35b610306610c6d565b604051610313919061241c565b60405180910390f35b610324610c8f565b6040516103319190612446565b60405180910390f35b610342610c95565b60405161034f9190612446565b60405180910390f35b610360610ca1565b60405161036d9190612446565b60405180910390f35b610390600480360381019061038b9190612461565b610cc5565b60405161039d9190612247565b60405180910390f35b6103c060048036038101906103bb91906124b4565b610de5565b6040516103cd9190612247565b60405180910390f35b6103f060048036038101906103eb91906124e1565b610ed8565b6040516103fd9190612446565b60405180910390f35b61040e610f8c565b60405161041b9190612446565b60405180910390f35b61043e60048036038101906104399190612521565b610f92565b60405161044b9190612567565b60405180910390f35b61046e600480360381019061046991906123b1565b610fb6565b60405161047b9190612247565b60405180910390f35b61049e600480360381019061049991906124b4565b6110f6565b6040516104ab9190612446565b60405180910390f35b6104ce60048036038101906104c99190612521565b61113f565b6040516104db9190612446565b60405180910390f35b6104fe60048036038101906104f99190612521565b61119f565b60405161050b9190612446565b60405180910390f35b61051c6111c0565b6040516105299190612446565b60405180910390f35b61053a6111c6565b6040516105479190612446565b60405180910390f35b61056a600480360381019061056591906124e1565b6111cc565b6040516105779190612446565b60405180910390f35b61059a60048036038101906105959190612521565b61124d565b6040516105a79190612446565b60405180910390f35b6105ca60048036038101906105c59190612521565b6112cd565b6040516105d79190612446565b60405180910390f35b6105fa60048036038101906105f591906125ae565b6112ee565b6040516106079190612446565b60405180910390f35b61062a600480360381019061062591906124b4565b611328565b6040516106379190612446565b60405180910390f35b6106486113e0565b6040516106559190612247565b60405180910390f35b6106666113f1565b6040516106739190612247565b60405180910390f35b610696600480360381019061069191906125ae565b611598565b6040516106a39190612446565b60405180910390f35b6106b46115c6565b6040516106c191906125ea565b60405180910390f35b6106e460048036038101906106df91906124b4565b6115ec565b005b6106ee61168a565b6040516106fb9190612247565b60405180910390f35b61070c6117d4565b60405161071991906122fb565b60405180910390f35b61073c600480360381019061073791906124b4565b611862565b6040516107499190612247565b60405180910390f35b61076c600480360381019061076791906125ae565b61191f565b6040516107799190612446565b60405180910390f35b61079c600480360381019061079791906123b1565b61194b565b6040516107a99190612247565b60405180910390f35b6107ba6119e1565b6040516107c79190612446565b60405180910390f35b6107d8611a05565b6040516107e59190612446565b60405180910390f35b61080860048036038101906108039190612521565b611a29565b6040516108159190612247565b60405180910390f35b610838600480360381019061083391906125ae565b611b62565b6040516108459190612446565b60405180910390f35b610868600480360381019061086391906124e1565b611b76565b6040516108759190612446565b60405180910390f35b610886611c2a565b604051610893919061241c565b60405180910390f35b6108a4611c94565b6040516108b19190612446565b60405180910390f35b6108d460048036038101906108cf91906124b4565b611cb8565b6040516108e19190612247565b60405180910390f35b61090460048036038101906108ff9190612605565b611d5a565b6040516109119190612567565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141561096f5760019050610ac0565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614156109c25760019050610ac0565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a155760019050610ac0565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610a685760019050610ac0565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415610abb5760019050610ac0565b600090505b919050565b60068054610ad29061269b565b80601f0160208091040260200160405190810160405280929190818152602001828054610afe9061269b565b8015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b505050505081565b600080610b5e61168a565b50610b688361124d565b905080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bf691906126fc565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c5a9190612446565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cd261168a565b50610cdc8461124d565b915081600c60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d6757600080fd5b610d72868684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dd19190612446565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e6e57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e7757600080fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f1c9190612781565b905060005b84811015610f655764e8d4a510008284610f3b91906127b2565b610f459190612781565b83610f50919061280c565b92508080610f5d90612840565b915050610f21565b5064e8d4a510008583610f7891906127b2565b610f829190612781565b9250505092915050565b60085481565b60008181548110610fa257600080fd5b906000526020600020016000915090505481565b600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103c906128d5565b60405180910390fd5b61104d61168a565b506110578361124d565b9050826009600082825461106b91906126fc565b9250508190555061107c8482611dec565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110da9190612446565b60405180910390a36110ea611eb1565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261116d91906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061119891906126fc565b9050919050565b6000603c82426111af919061280c565b6111b99190612781565b9050919050565b600a5481565b60035481565b6000806402540be400836111e091906127b2565b7f000000000000000000000000000000000000000000000000000000000000000061120b919061280c565b8461121691906127b2565b90507f0000000000000000000000000000000000000000000000000000000000000000816112449190612781565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661127e91906128f5565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112bc91906127b2565b6112c69190612781565b9050919050565b6000603c82426112dd919061280c565b6112e79190612781565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600080611337856110f6565b925061134460035461119f565b90506113906402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661137891906128f5565b6fffffffffffffffffffffffffffffffff1682610ed8565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113c091906127b2565b82846113cc91906127b2565b6113d69190612781565b9350505050919050565b60006113ec6000611a29565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461144e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115a68461191f565b91506115b1846112ee565b90506115bd82826111cc565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461164657600080fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116a06113e0565b506116a9611f53565b975060006001028814156116c8576000985050505050505050506117d1565b6116d188611b62565b95506001866116e091906126fc565b90506116eb8661113f565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169450611729826112cd565b925060008311156117455761173e8584611b76565b9350611749565b8493505b61175860008560095484611d5a565b9650600087908060018154018082558091505060019003906000526020600020016000909190919091505561178c8761204e565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117bc9190612446565b60405180910390a16001985050505050505050505b90565b600780546117e19061269b565b80601f016020809104026020016040519081016040528092919081815260200182805461180d9061269b565b801561185a5780601f1061182f5761010080835404028352916020019161185a565b820191906000526020600020905b81548152906001019060200180831161183d57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118be57600080fd5b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061195861168a565b506119628461124d565b915061196f338684611dc7565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119ce9190612446565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a3960035461119f565b91506000821415611a4f57600092505050611b5d565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611a9157508184105b15611a9a578391505b611aa48183610ed8565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611ae991906127b2565b600354611af691906126fc565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b4e919061297a565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611bba9190612781565b905060005b84811015611c035764e8d4a510008284611bd991906127b2565b611be39190612781565b83611bee91906126fc565b92508080611bfb90612840565b915050611bbf565b5064e8d4a510008583611c1691906127b2565b611c209190612781565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611c7b919061280c565b611c859190612781565b611c8f91906126fc565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d1457600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611dd4858461209a565b50611ddf8484611dec565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000851415611e495760009350505050611eab565b611e52866110f6565b92508483611e6091906126fc565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611ecf919061280c565b81548110611ee057611edf612995565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f2b919061280c565b81548110611f3c57611f3b612995565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611f6b919061280c565b81548110611f7c57611f7b612995565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015611ff0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201491906129f0565b6fffffffffffffffffffffffffffffffff16905061203182611b62565b81116120455760006001029250505061204b565b81925050505b90565b60008061205a83611598565b9050612090600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661208b8361124d565b611dec565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008514156120f7576000935050505061219c565b612100866110f6565b925084831015612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c90612a69565b60405180910390fd5b8483612151919061280c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6121dc816121a7565b81146121e757600080fd5b50565b6000813590506121f9816121d3565b92915050565b600060208284031215612215576122146121a2565b5b6000612223848285016121ea565b91505092915050565b60008115159050919050565b6122418161222c565b82525050565b600060208201905061225c6000830184612238565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561229c578082015181840152602081019050612281565b838111156122ab576000848401525b50505050565b6000601f19601f8301169050919050565b60006122cd82612262565b6122d7818561226d565b93506122e781856020860161227e565b6122f0816122b1565b840191505092915050565b6000602082019050818103600083015261231581846122c2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123488261231d565b9050919050565b6123588161233d565b811461236357600080fd5b50565b6000813590506123758161234f565b92915050565b6000819050919050565b61238e8161237b565b811461239957600080fd5b50565b6000813590506123ab81612385565b92915050565b600080604083850312156123c8576123c76121a2565b5b60006123d685828601612366565b92505060206123e78582860161239c565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612416816123f1565b82525050565b6000602082019050612431600083018461240d565b92915050565b6124408161237b565b82525050565b600060208201905061245b6000830184612437565b92915050565b60008060006060848603121561247a576124796121a2565b5b600061248886828701612366565b935050602061249986828701612366565b92505060406124aa8682870161239c565b9150509250925092565b6000602082840312156124ca576124c96121a2565b5b60006124d884828501612366565b91505092915050565b600080604083850312156124f8576124f76121a2565b5b60006125068582860161239c565b92505060206125178582860161239c565b9150509250929050565b600060208284031215612537576125366121a2565b5b60006125458482850161239c565b91505092915050565b6000819050919050565b6125618161254e565b82525050565b600060208201905061257c6000830184612558565b92915050565b61258b8161254e565b811461259657600080fd5b50565b6000813590506125a881612582565b92915050565b6000602082840312156125c4576125c36121a2565b5b60006125d284828501612599565b91505092915050565b6125e48161233d565b82525050565b60006020820190506125ff60008301846125db565b92915050565b6000806000806080858703121561261f5761261e6121a2565b5b600061262d8782880161239c565b945050602061263e8782880161239c565b935050604061264f8782880161239c565b92505060606126608782880161239c565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806126b357607f821691505b602082108114156126c7576126c661266c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127078261237b565b91506127128361237b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612747576127466126cd565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061278c8261237b565b91506127978361237b565b9250826127a7576127a6612752565b5b828204905092915050565b60006127bd8261237b565b91506127c88361237b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612801576128006126cd565b5b828202905092915050565b60006128178261237b565b91506128228361237b565b925082821015612835576128346126cd565b5b828203905092915050565b600061284b8261237b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561287e5761287d6126cd565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006128bf600a8361226d565b91506128ca82612889565b602082019050919050565b600060208201905081810360008301526128ee816128b2565b9050919050565b6000612900826123f1565b915061290b836123f1565b9250816fffffffffffffffffffffffffffffffff0483118215151615612934576129336126cd565b5b828202905092915050565b6000819050919050565b600061296461295f61295a846123f1565b61293f565b61237b565b9050919050565b61297481612949565b82525050565b600060208201905061298f600083018461296b565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6129cd816123f1565b81146129d857600080fd5b50565b6000815190506129ea816129c4565b92915050565b600060208284031215612a0657612a056121a2565b5b6000612a14848285016129db565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612a53600d8361226d565b9150612a5e82612a1d565b602082019050919050565b60006020820190508181036000830152612a8281612a46565b905091905056fea264697066735822122040c7b82458bb5e6e45df5d826444d591ea75814bd7cd674b11c9026417e4d59064736f6c634300080b0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043e565b6080908152503480156200003657600080fd5b50604051620034bf380380620034bf83398181016040528101906200005c91906200075d565b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600790805190602001906200012f92919062000355565b5084600890805190602001906200014892919062000355565b508360ff166009819055504260048190555060045460a08181525050603c826200017391906200043e565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000837565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600381905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200026f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002e8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008ec565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200036390620008b7565b90600052602060002090601f016020900481019282620003875760008555620003d3565b82601f10620003a257805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d2578251825591602001919060010190620003b5565b5b509050620003e29190620003e6565b5090565b5b8082111562000401576000816000905550600101620003e7565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044b8262000405565b9150620004588362000405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200049457620004936200040f565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050882620004bd565b810181811067ffffffffffffffff821117156200052a5762000529620004ce565b5b80604052505050565b60006200053f6200049f565b90506200054d8282620004fd565b919050565b600067ffffffffffffffff82111562000570576200056f620004ce565b5b6200057b82620004bd565b9050602081019050919050565b60005b83811015620005a85780820151818401526020810190506200058b565b83811115620005b8576000848401525b50505050565b6000620005d5620005cf8462000552565b62000533565b905082815260208101848484011115620005f457620005f3620004b8565b5b6200060184828562000588565b509392505050565b600082601f830112620006215762000620620004b3565b5b815162000633848260208601620005be565b91505092915050565b600060ff82169050919050565b62000654816200063c565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620006a1816200067a565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d28162000405565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200072582620006f8565b9050919050565b620007378162000718565b81146200074357600080fd5b50565b60008151905062000757816200072c565b92915050565b60008060008060008060c087890312156200077d576200077c620004a9565b5b600087015167ffffffffffffffff8111156200079e576200079d620004ae565b5b620007ac89828a0162000609565b965050602087015167ffffffffffffffff811115620007d057620007cf620004ae565b5b620007de89828a0162000609565b9550506040620007f189828a0162000663565b94505060606200080489828a01620006b0565b93505060806200081789828a01620006e1565b92505060a06200082a89828a0162000746565b9150509295509295509295565b600062000844826200067a565b915062000851836200067a565b9250816fffffffffffffffffffffffffffffffff04831182151516156200087d576200087c6200040f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008d057607f821691505b602082108103620008e657620008e562000888565b5b50919050565b60805160a05160c05160e051612b5a6200096560003960008181610ccd01528181610f1d0152611be301526000818161116d015281816119fd0152611c8201526000818161119901528181611ca30152611ce80152600081816112060152818161123e015281816112b601526119d90152612b5a6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e578063ab28cea0116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b8063ab28cea01461078d578063b470aade146107ab578063c0ab7077146107c9578063d340ef8a146107f9578063de9b84881461081757610286565b80638f0b2d5d116101325780638f0b2d5d146106a55780638f1df6bc146106c157806395d89b41146106df578063983b2d56146106fd5780639da7d8ba1461072d578063a9059cbb1461075d57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638da5cb5b1461068757610286565b806331333487116102075780634abfbba2116101cb5780634abfbba2146104dd57806351b4541c1461050d57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b806331333487146103ff578063313ce5671461042f57806340452d911461044d578063449a52f81461047d57806347a50517146104ad57610286565b806318160ddd1161024e57806318160ddd146103455780631989c6a814610363578063229ba1971461038157806323b872dd1461039f5780633092afd5146103cf57610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c146103095780630b2472eb14610327575b600080fd5b6102a560048036038101906102a0919061225c565b610943565b6040516102b291906122a4565b60405180910390f35b6102c3610ae9565b6040516102d09190612358565b60405180910390f35b6102f360048036038101906102ee919061240e565b610b77565b60405161030091906122a4565b60405180910390f35b610311610c91565b60405161031e9190612479565b60405180910390f35b61032f610cb3565b60405161033c91906124a3565b60405180910390f35b61034d610cb9565b60405161035a91906124a3565b60405180910390f35b61036b610cbf565b60405161037891906124a3565b60405180910390f35b610389610ccb565b60405161039691906124a3565b60405180910390f35b6103b960048036038101906103b491906124be565b610cef565b6040516103c691906122a4565b60405180910390f35b6103e960048036038101906103e49190612511565b610e0f565b6040516103f691906122a4565b60405180910390f35b6104196004803603810190610414919061253e565b610f02565b60405161042691906124a3565b60405180910390f35b610437610fb6565b60405161044491906124a3565b60405180910390f35b6104676004803603810190610462919061257e565b610fbc565b60405161047491906125c4565b60405180910390f35b6104976004803603810190610492919061240e565b610fe0565b6040516104a491906122a4565b60405180910390f35b6104c760048036038101906104c29190612511565b611120565b6040516104d491906124a3565b60405180910390f35b6104f760048036038101906104f2919061257e565b611169565b60405161050491906124a3565b60405180910390f35b6105276004803603810190610522919061257e565b6111c9565b60405161053491906124a3565b60405180910390f35b6105456111ea565b60405161055291906124a3565b60405180910390f35b6105756004803603810190610570919061253e565b6111f0565b60405161058291906124a3565b60405180910390f35b6105a560048036038101906105a0919061257e565b611271565b6040516105b291906124a3565b60405180910390f35b6105d560048036038101906105d0919061257e565b6112f1565b6040516105e291906124a3565b60405180910390f35b6106056004803603810190610600919061260b565b611312565b60405161061291906124a3565b60405180910390f35b61063560048036038101906106309190612511565b61134c565b60405161064291906124a3565b60405180910390f35b610653611404565b60405161066091906122a4565b60405180910390f35b610671611415565b60405161067e91906122a4565b60405180910390f35b61068f6115bc565b60405161069c9190612647565b60405180910390f35b6106bf60048036038101906106ba9190612511565b6115e2565b005b6106c9611680565b6040516106d691906122a4565b60405180910390f35b6106e76117ca565b6040516106f49190612358565b60405180910390f35b61071760048036038101906107129190612511565b611858565b60405161072491906122a4565b60405180910390f35b6107476004803603810190610742919061260b565b611915565b60405161075491906124a3565b60405180910390f35b6107776004803603810190610772919061240e565b611941565b60405161078491906122a4565b60405180910390f35b6107956119d7565b6040516107a291906124a3565b60405180910390f35b6107b36119fb565b6040516107c091906124a3565b60405180910390f35b6107e360048036038101906107de919061257e565b611a1f565b6040516107f091906122a4565b60405180910390f35b610801611b57565b60405161080e91906124a3565b60405180910390f35b610831600480360381019061082c9190612662565b611b5d565b60405161083e91906124a3565b60405180910390f35b610861600480360381019061085c919061260b565b611bb4565b60405161086e91906124a3565b60405180910390f35b610891600480360381019061088c919061253e565b611bc8565b60405161089e91906124a3565b60405180910390f35b6108af611c7c565b6040516108bc9190612479565b60405180910390f35b6108cd611ce6565b6040516108da91906124a3565b60405180910390f35b6108fd60048036038101906108f89190612511565b611d0a565b60405161090a91906122a4565b60405180910390f35b61092d600480360381019061092891906126a2565b611dac565b60405161093a91906125c4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60078054610af690612738565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612738565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611680565b50610b8c83611271565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612798565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124a3565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60035481565b600a5481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfc611680565b50610d0684611271565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9157600080fd5b610d9c868684611e19565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dfb91906124a3565b60405180910390a380925050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea157600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f46919061281d565b905060005b84811015610f8f5764e8d4a510008284610f65919061284e565b610f6f919061281d565b83610f7a91906128a8565b92508080610f87906128dc565b915050610f4b565b5064e8d4a510008583610fa2919061284e565b610fac919061281d565b9250505092915050565b60095481565b60008181548110610fcc57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690612970565b60405180910390fd5b611077611680565b5061108183611271565b905082600a60008282546110959190612798565b925050819055506110a68482611e3e565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161110491906124a3565b60405180910390a3611114611f02565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611197919061284e565b7f00000000000000000000000000000000000000000000000000000000000000006111c29190612798565b9050919050565b6000603c82426111d991906128a8565b6111e3919061281d565b9050919050565b60045481565b6000806402540be40083611204919061284e565b7f000000000000000000000000000000000000000000000000000000000000000061122f91906128a8565b8461123a919061284e565b90507f000000000000000000000000000000000000000000000000000000000000000081611268919061281d565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112a29190612990565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112e0919061284e565b6112ea919061281d565b9050919050565b6000603c824261130191906128a8565b61130b919061281d565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061135b85611120565b92506113686004546111c9565b90506113b46402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661139c9190612990565b6fffffffffffffffffffffffffffffffff1682610f02565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113e4919061284e565b82846113f0919061284e565b6113fa919061281d565b9350505050919050565b60006114106000611a1f565b905090565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163c57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611696611404565b5061169f611fa4565b9750600060010288036116bd576000985050505050505050506117c7565b6116c688611bb4565b95506001866116d59190612798565b90506116e086611169565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061171e826112f1565b9250600083111561173a576117338584611bc8565b935061173e565b8493505b61174d600085600a5484611dac565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117828789612090565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117b291906124a3565b60405180910390a16001985050505050505050505b90565b600880546117d790612738565b80601f016020809104026020016040519081016040528092919081815260200182805461180390612738565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b505050505081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118b457600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061194e611680565b5061195884611271565b9150611965338684611e19565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119c491906124a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a2f6004546111c9565b915060008203611a4457600092505050611b52565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611a8657508184105b15611a8f578391505b611a998183610f02565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611ade919061284e565b600454611aeb9190612798565b60048190555080826004547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b439190612a15565b60405180910390a46001925050505b919050565b600b5481565b600080600080611b6c86611915565b9250611b7786611312565b9150611b8285611312565b90508181611b9091906128a8565b600354611b9d91906128a8565b9150611ba983836111f0565b935050505092915050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c0c919061281d565b905060005b84811015611c555764e8d4a510008284611c2b919061284e565b611c35919061281d565b83611c409190612798565b92508080611c4d906128dc565b915050611c11565b5064e8d4a510008583611c68919061284e565b611c72919061281d565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ccd91906128a8565b611cd7919061281d565b611ce19190612798565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d6657600080fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e2685846120f8565b50611e318484611e3e565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e9a5760009350505050611efc565b611ea386611120565b92508483611eb19190612798565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600a54905060006001600080549050611f2091906128a8565b81548110611f3157611f30612a30565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f7c91906128a8565b81548110611f8d57611f8c612a30565b5b906000526020600020018190555060019250505090565b600080600080600b5481548110611fbe57611fbd612a30565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120569190612a8b565b6fffffffffffffffffffffffffffffffff16905061207382611bb4565b81116120875760006001029250505061208d565b81925050505b90565b60008061209d8484611b5d565b90506120d3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120ce83611271565b611e3e565b506001600b60008282546120e79190612798565b925050819055508091505092915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361215457600093505050506121f9565b61215d86611120565b9250848310156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612b04565b60405180910390fd5b84836121ae91906128a8565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61223981612204565b811461224457600080fd5b50565b60008135905061225681612230565b92915050565b600060208284031215612272576122716121ff565b5b600061228084828501612247565b91505092915050565b60008115159050919050565b61229e81612289565b82525050565b60006020820190506122b96000830184612295565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b83811115612308576000848401525b50505050565b6000601f19601f8301169050919050565b600061232a826122bf565b61233481856122ca565b93506123448185602086016122db565b61234d8161230e565b840191505092915050565b60006020820190508181036000830152612372818461231f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123a58261237a565b9050919050565b6123b58161239a565b81146123c057600080fd5b50565b6000813590506123d2816123ac565b92915050565b6000819050919050565b6123eb816123d8565b81146123f657600080fd5b50565b600081359050612408816123e2565b92915050565b60008060408385031215612425576124246121ff565b5b6000612433858286016123c3565b9250506020612444858286016123f9565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124738161244e565b82525050565b600060208201905061248e600083018461246a565b92915050565b61249d816123d8565b82525050565b60006020820190506124b86000830184612494565b92915050565b6000806000606084860312156124d7576124d66121ff565b5b60006124e5868287016123c3565b93505060206124f6868287016123c3565b9250506040612507868287016123f9565b9150509250925092565b600060208284031215612527576125266121ff565b5b6000612535848285016123c3565b91505092915050565b60008060408385031215612555576125546121ff565b5b6000612563858286016123f9565b9250506020612574858286016123f9565b9150509250929050565b600060208284031215612594576125936121ff565b5b60006125a2848285016123f9565b91505092915050565b6000819050919050565b6125be816125ab565b82525050565b60006020820190506125d960008301846125b5565b92915050565b6125e8816125ab565b81146125f357600080fd5b50565b600081359050612605816125df565b92915050565b600060208284031215612621576126206121ff565b5b600061262f848285016125f6565b91505092915050565b6126418161239a565b82525050565b600060208201905061265c6000830184612638565b92915050565b60008060408385031215612679576126786121ff565b5b6000612687858286016125f6565b9250506020612698858286016125f6565b9150509250929050565b600080600080608085870312156126bc576126bb6121ff565b5b60006126ca878288016123f9565b94505060206126db878288016123f9565b93505060406126ec878288016123f9565b92505060606126fd878288016123f9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275057607f821691505b60208210810361276357612762612709565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a3826123d8565b91506127ae836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e3576127e2612769565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612828826123d8565b9150612833836123d8565b925082612843576128426127ee565b5b828204905092915050565b6000612859826123d8565b9150612864836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561289d5761289c612769565b5b828202905092915050565b60006128b3826123d8565b91506128be836123d8565b9250828210156128d1576128d0612769565b5b828203905092915050565b60006128e7826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361291957612918612769565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061295a600a836122ca565b915061296582612924565b602082019050919050565b600060208201905081810360008301526129898161294d565b9050919050565b600061299b8261244e565b91506129a68361244e565b9250816fffffffffffffffffffffffffffffffff04831182151516156129cf576129ce612769565b5b828202905092915050565b6000819050919050565b60006129ff6129fa6129f58461244e565b6129da565b6123d8565b9050919050565b612a0f816129e4565b82525050565b6000602082019050612a2a6000830184612a06565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a688161244e565b8114612a7357600080fd5b50565b600081519050612a8581612a5f565b92915050565b600060208284031215612aa157612aa06121ff565b5b6000612aaf84828501612a76565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612aee600d836122ca565b9150612af982612ab8565b602082019050919050565b60006020820190508181036000830152612b1d81612ae1565b905091905056fea2646970667358221220e550a23a0a73cec1721ab581b45ec189ebe066e3bf61f6d85aa4f40183a53a2964736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 558cd99..354a255 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumParticipantSpend","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"},{"internalType":"bytes32","name":"_redistributionPrevious","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index f1397f0..dc82024 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -38,6 +38,15 @@ class DemurrageTokenSettings: self.sink_address = None + def __str__(self): + return 'name {} demurrage level {} period minutes {} sink address {}'.format( + self.name, + self.demurrage_level, + self.period_minutes, + self.sink_address, + ) + + class DemurrageToken(ERC20): __abi = {} @@ -445,14 +454,16 @@ class DemurrageToken(ERC20): return o - def get_distribution_from_redistribution(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): + def get_distribution_from_redistribution(self, contract_address, redistribution, redistribution_previous, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('getDistributionFromRedistribution') enc.typ(ABIContractType.BYTES32) + enc.typ(ABIContractType.BYTES32) enc.bytes32(redistribution) + enc.bytes32(redistribution_previous) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index 39aafe8..e0d35c9 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -33,7 +33,7 @@ PERIOD = 10 class TestTokenDeploy: def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12): - self.tax_level = TAX_LEVEL + self.tax_level= TAX_LEVEL self.period_seconds = PERIOD * 60 self.settings = DemurrageTokenSettings() @@ -44,6 +44,7 @@ class TestTokenDeploy: self.settings.period_minutes = PERIOD self.settings.sink_address = sink_address self.sink_address = self.settings.sink_address + logg.debug('using demurrage token settings: {}'.format(self.settings)) o = block_latest() self.start_block = rpc.do(o) @@ -203,7 +204,7 @@ class TestDemurrageCap(TestDemurrage): class TestDemurrageUnit(TestDemurrage): def setUp(self): - super(TestDemurrage, self).setUp() + super(TestDemurrageUnit, self).setUp() self.tax_level = 50 self.period_seconds = 60 diff --git a/python/run_tests.sh b/python/run_tests.sh index cc4d28d..888f5ba 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -17,7 +17,12 @@ done modes=(SingleCap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py -# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py +done + +modes=(SingleNocap) # other contracts need to be updted +for m in ${modes[@]}; do + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py done modes=(MultiCap SingleCap) diff --git a/python/tests/test_redistribution.py b/python/tests/test_redistribution.py index 4bc6d16..b73c544 100644 --- a/python/tests/test_redistribution.py +++ b/python/tests/test_redistribution.py @@ -31,6 +31,78 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageDefault): + + def test_redistribution_boundaries(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + supply = self.default_supply + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) + self.rpc.do(o) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + logg.debug('balance before {} supply {}'.format(balance, supply)) + + self.backend.time_travel(self.start_time + self.period_seconds) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) + r = self.rpc.do(o) + oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) + r = self.rpc.do(o) + oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('toRedistributionDemurrageModifier') + enc.typ(ABIContractType.BYTES32) + enc.bytes32(redistribution) + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + + + + def test_whole_is_parts(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index 8a2694d..d301eb5 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -31,8 +31,9 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageUnit): + # TODO: move to "pure" test file when getdistribution is implemented in all contracts - def test_distribution(self): + def test_distribution_direct(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -40,6 +41,8 @@ class TestRedistribution(TestDemurrageUnit): demurrage = (1 - (self.tax_level / 1000000)) * (10**28) supply = self.default_supply + logg.debug('demurrage {} supply {}'.format(demurrage)) + o = c.get_distribution(self.address, supply, demurrage, sender_address=self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) @@ -51,17 +54,23 @@ class TestRedistribution(TestDemurrageUnit): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - #demurrage = (1 - (self.tax_level / 1000000)) * (10**38) - demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + demurrage_previous = (1 - (self.tax_level / 100000)) * (10**28) + demurrage = (1 - ((self.tax_level * 1.33) / 100000)) * (10**28) + + logg.debug('demurrage then {} now {}'.format(demurrage_previous, demurrage)) supply = self.default_supply - o = c.to_redistribution(self.address, 0, demurrage, supply, 1, sender_address=self.accounts[0]) + o = c.to_redistribution(self.address, 0, demurrage_previous, supply, 1, sender_address=self.accounts[0]) + redistribution_previous = self.rpc.do(o) + + o = c.to_redistribution(self.address, 0, demurrage, supply, 2, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) - o = c.get_distribution_from_redistribution(self.address, redistribution, self.accounts[0]) + o = c.get_distribution_from_redistribution(self.address, redistribution, redistribution_previous, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) expected_distribution = self.default_supply * (self.tax_level / 1000000) + logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) self.assert_within_lower(distribution, expected_distribution, 1000) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 2eea9f0..2f781b3 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -20,6 +20,8 @@ contract DemurrageTokenSingleCap { // Cached demurrage amount, ppm with 38 digit resolution uint128 public demurrageAmount; + uint256 public demurrageStart; + // Cached demurrage period; the period for which demurrageAmount was calculated //uint128 public demurragePeriod; // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated @@ -42,8 +44,11 @@ contract DemurrageTokenSingleCap { // Implements ERC20 uint256 public totalSupply; + // Last executed period + uint256 public lastPeriod; + // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - uint256 public minimumParticipantSpend; + //uint256 public minimumParticipantSpend; // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) @@ -113,7 +118,9 @@ contract DemurrageTokenSingleCap { periodDuration = _periodMinutes * 60; //demurrageAmount = 100000000000000000000000000000000000000 - _taxLevelMinute; // Represents 38 decimal places, same as resolutionFactor //demurrageAmount = 100000000000000000000000000000000000000; - demurrageAmount = 10000000000000000000000000000; + //demurrageAmount = 10000000000000000000000000000; + demurrageAmount = uint128(nanoDivider) * 100; + demurrageStart = demurrageAmount; //demurragePeriod = 1; taxLevel = _taxLevelMinute; // Represents 38 decimal places bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); @@ -121,7 +128,7 @@ contract DemurrageTokenSingleCap { // Misc settings sinkAddress = _defaultSinkAddress; - minimumParticipantSpend = 10 ** uint256(_decimals); + //minimumParticipantSpend = 10 ** uint256(_decimals); } @@ -274,7 +281,8 @@ contract DemurrageTokenSingleCap { bytes32 lastRedistribution; uint256 currentPeriod; - lastRedistribution = redistributions[redistributions.length-1]; + //lastRedistribution = redistributions[redistributions.length-1]; + lastRedistribution = redistributions[lastPeriod]; currentPeriod = this.actualPeriod(); if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { return bytes32(0x00); @@ -290,21 +298,25 @@ contract DemurrageTokenSingleCap { return difference / resolutionFactor; } - function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) { + function getDistributionFromRedistribution(bytes32 _redistribution, bytes32 _redistributionPrevious) public returns (uint256) { uint256 redistributionSupply; uint256 redistributionDemurrage; + uint256 redistributionDemurragePrevious; redistributionSupply = toRedistributionSupply(_redistribution); redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); + redistributionDemurragePrevious = toRedistributionDemurrageModifier(_redistributionPrevious); + redistributionDemurrage = demurrageStart - (redistributionDemurragePrevious - redistributionDemurrage); return getDistribution(redistributionSupply, redistributionDemurrage); } // Returns the amount sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { + function applyDefaultRedistribution(bytes32 _redistribution, bytes32 _redistributionPrevious) private returns (uint256) { uint256 unit; - unit = getDistributionFromRedistribution(_redistribution); + unit = getDistributionFromRedistribution(_redistribution, _redistributionPrevious); increaseBaseBalance(sinkAddress, toBaseAmount(unit)); + lastPeriod += 1; return unit; } @@ -388,7 +400,7 @@ contract DemurrageTokenSingleCap { nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); redistributions.push(nextRedistribution); - applyDefaultRedistribution(nextRedistribution); + applyDefaultRedistribution(nextRedistribution, currentRedistribution); emit Period(nextPeriod); return true; } From 18ee9c5f9b4046ebab2fd6ffca17b95ccc8cfc47 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 27 May 2022 12:02:27 +0000 Subject: [PATCH 06/57] Make tests pass --- python/erc20_demurrage_token/unittest/base.py | 24 +++-- python/run_tests.sh | 2 +- python/tests/test_redistribution.py | 70 --------------- python/tests/test_redistribution_single.py | 90 +++++++++++++++++++ python/tests/test_redistribution_unit.py | 13 +-- 5 files changed, 114 insertions(+), 85 deletions(-) create mode 100644 python/tests/test_redistribution_single.py diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index e0d35c9..c7eda7c 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -32,16 +32,16 @@ PERIOD = 10 class TestTokenDeploy: - def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12): - self.tax_level= TAX_LEVEL - self.period_seconds = PERIOD * 60 + def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12, tax_level=TAX_LEVEL, period=PERIOD): + self.tax_level = tax_level + self.period_seconds = period * 60 self.settings = DemurrageTokenSettings() self.settings.name = token_name self.settings.symbol = token_symbol self.settings.decimals = 6 - self.settings.demurrage_level = TAX_LEVEL * (10 ** 32) - self.settings.period_minutes = PERIOD + self.settings.demurrage_level = tax_level * (10 ** 32) + self.settings.period_minutes = period self.settings.sink_address = sink_address self.sink_address = self.settings.sink_address logg.debug('using demurrage token settings: {}'.format(self.settings)) @@ -102,7 +102,12 @@ class TestDemurrage(EthTesterCase): # self.start_time = token_deploy.start_time # self.default_supply = self.default_supply # self.default_supply_cap = self.default_supply_cap - self.deployer = TestTokenDeploy(self.rpc) + period = PERIOD + try: + period = getattr(self, 'period') + except AttributeError as e: + pass + self.deployer = TestTokenDeploy(self.rpc, period=period) self.default_supply = self.deployer.default_supply self.default_supply_cap = self.deployer.default_supply_cap self.start_block = None @@ -204,10 +209,11 @@ class TestDemurrageCap(TestDemurrage): class TestDemurrageUnit(TestDemurrage): def setUp(self): - super(TestDemurrageUnit, self).setUp() + self.period = 1 + self.period_seconds = self.period * 60 + self.tax_level = TAX_LEVEL - self.tax_level = 50 - self.period_seconds = 60 + super(TestDemurrageUnit, self).setUp() nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) self.settings = DemurrageTokenSettings() diff --git a/python/run_tests.sh b/python/run_tests.sh index 888f5ba..acab7d4 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -22,7 +22,7 @@ done modes=(SingleNocap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py + #ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done modes=(MultiCap SingleCap) diff --git a/python/tests/test_redistribution.py b/python/tests/test_redistribution.py index b73c544..7da30cc 100644 --- a/python/tests/test_redistribution.py +++ b/python/tests/test_redistribution.py @@ -32,76 +32,6 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageDefault): - def test_redistribution_boundaries(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - demurrage = (1 - (self.tax_level / 1000000)) * (10**28) - supply = self.default_supply - - (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) - self.rpc.do(o) - - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) - logg.debug('balance before {} supply {}'.format(balance, supply)) - - self.backend.time_travel(self.start_time + self.period_seconds) - (tx_hash, o) = c.change_period(self.address, self.accounts[0]) - r = self.rpc.do(o) - - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) - r = self.rpc.do(o) - oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) - - self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) - (tx_hash, o) = c.change_period(self.address, self.accounts[0]) - r = self.rpc.do(o) - - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) - r = self.rpc.do(o) - oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) - - j = JSONRPCRequest(id_generator) - o = j.template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('toRedistributionDemurrageModifier') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) - data = add_0x(enc.get()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - o['params'].append('latest') - o = j.finalize(o) - return o - - - def test_whole_is_parts(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py new file mode 100644 index 0000000..3f5ddbf --- /dev/null +++ b/python/tests/test_redistribution_single.py @@ -0,0 +1,90 @@ +# standard imports +import os +import unittest +import json +import logging + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) +from chainlib.eth.address import to_checksum_address +from hexathon import ( + strip_0x, + add_0x, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest.base import TestDemurrageDefault + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + +class TestRedistribution(TestDemurrageDefault): + + + def test_redistribution_boundaries(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + supply = self.default_supply + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) + self.rpc.do(o) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + logg.debug('balance before {} supply {}'.format(balance, supply)) + + self.backend.time_travel(self.start_time + self.period_seconds) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) + r = self.rpc.do(o) + oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) + r = self.rpc.do(o) + oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) + rr = self.rpc.do(oo) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + +if __name__ == '__main__': + unittest.main() diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index d301eb5..5181f91 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -37,12 +37,9 @@ class TestRedistribution(TestDemurrageUnit): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - #demurrage = (1 - (self.tax_level / 1000000)) * (10**38) demurrage = (1 - (self.tax_level / 1000000)) * (10**28) supply = self.default_supply - logg.debug('demurrage {} supply {}'.format(demurrage)) - o = c.get_distribution(self.address, supply, demurrage, sender_address=self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) @@ -69,12 +66,12 @@ class TestRedistribution(TestDemurrageUnit): o = c.get_distribution_from_redistribution(self.address, redistribution, redistribution_previous, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) - expected_distribution = self.default_supply * (self.tax_level / 1000000) + expected_distribution = self.default_supply * (((self.tax_level * 1.33) - self.tax_level) / 100000) logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) self.assert_within_lower(distribution, expected_distribution, 1000) - def test_single_step(self): + def test_single_step_basic(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -90,6 +87,12 @@ class TestRedistribution(TestDemurrageUnit): expected_balance = int(mint_amount - ((self.tax_level / 1000000) * mint_amount)) + o = c.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + logg.debug('balance {}'.format(balance)) + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) From 31faa783469df0e2e064a1f1be77e6e95fa0037e Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 27 May 2022 12:51:10 +0000 Subject: [PATCH 07/57] Keep cumulative sink total in state and deduct from upcoming demurrage --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 4 +- python/tests/test_redistribution_single.py | 115 ++++++++++++------ python/tests/test_redistribution_unit.py | 13 +- solidity/DemurrageTokenSingleNocap.sol | 39 ++---- 6 files changed, 99 insertions(+), 76 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 05d7cf6..c3eed68 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043e565b6080908152503480156200003657600080fd5b50604051620034bf380380620034bf83398181016040528101906200005c91906200075d565b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600790805190602001906200012f92919062000355565b5084600890805190602001906200014892919062000355565b508360ff166009819055504260048190555060045460a08181525050603c826200017391906200043e565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000837565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600381905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200026f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002e8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008ec565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200036390620008b7565b90600052602060002090601f016020900481019282620003875760008555620003d3565b82601f10620003a257805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d2578251825591602001919060010190620003b5565b5b509050620003e29190620003e6565b5090565b5b8082111562000401576000816000905550600101620003e7565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044b8262000405565b9150620004588362000405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200049457620004936200040f565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050882620004bd565b810181811067ffffffffffffffff821117156200052a5762000529620004ce565b5b80604052505050565b60006200053f6200049f565b90506200054d8282620004fd565b919050565b600067ffffffffffffffff82111562000570576200056f620004ce565b5b6200057b82620004bd565b9050602081019050919050565b60005b83811015620005a85780820151818401526020810190506200058b565b83811115620005b8576000848401525b50505050565b6000620005d5620005cf8462000552565b62000533565b905082815260208101848484011115620005f457620005f3620004b8565b5b6200060184828562000588565b509392505050565b600082601f830112620006215762000620620004b3565b5b815162000633848260208601620005be565b91505092915050565b600060ff82169050919050565b62000654816200063c565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620006a1816200067a565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d28162000405565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200072582620006f8565b9050919050565b620007378162000718565b81146200074357600080fd5b50565b60008151905062000757816200072c565b92915050565b60008060008060008060c087890312156200077d576200077c620004a9565b5b600087015167ffffffffffffffff8111156200079e576200079d620004ae565b5b620007ac89828a0162000609565b965050602087015167ffffffffffffffff811115620007d057620007cf620004ae565b5b620007de89828a0162000609565b9550506040620007f189828a0162000663565b94505060606200080489828a01620006b0565b93505060806200081789828a01620006e1565b92505060a06200082a89828a0162000746565b9150509295509295509295565b600062000844826200067a565b915062000851836200067a565b9250816fffffffffffffffffffffffffffffffff04831182151516156200087d576200087c6200040f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008d057607f821691505b602082108103620008e657620008e562000888565b5b50919050565b60805160a05160c05160e051612b5a6200096560003960008181610ccd01528181610f1d0152611be301526000818161116d015281816119fd0152611c8201526000818161119901528181611ca30152611ce80152600081816112060152818161123e015281816112b601526119d90152612b5a6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e578063ab28cea0116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b8063ab28cea01461078d578063b470aade146107ab578063c0ab7077146107c9578063d340ef8a146107f9578063de9b84881461081757610286565b80638f0b2d5d116101325780638f0b2d5d146106a55780638f1df6bc146106c157806395d89b41146106df578063983b2d56146106fd5780639da7d8ba1461072d578063a9059cbb1461075d57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638da5cb5b1461068757610286565b806331333487116102075780634abfbba2116101cb5780634abfbba2146104dd57806351b4541c1461050d57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b806331333487146103ff578063313ce5671461042f57806340452d911461044d578063449a52f81461047d57806347a50517146104ad57610286565b806318160ddd1161024e57806318160ddd146103455780631989c6a814610363578063229ba1971461038157806323b872dd1461039f5780633092afd5146103cf57610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c146103095780630b2472eb14610327575b600080fd5b6102a560048036038101906102a0919061225c565b610943565b6040516102b291906122a4565b60405180910390f35b6102c3610ae9565b6040516102d09190612358565b60405180910390f35b6102f360048036038101906102ee919061240e565b610b77565b60405161030091906122a4565b60405180910390f35b610311610c91565b60405161031e9190612479565b60405180910390f35b61032f610cb3565b60405161033c91906124a3565b60405180910390f35b61034d610cb9565b60405161035a91906124a3565b60405180910390f35b61036b610cbf565b60405161037891906124a3565b60405180910390f35b610389610ccb565b60405161039691906124a3565b60405180910390f35b6103b960048036038101906103b491906124be565b610cef565b6040516103c691906122a4565b60405180910390f35b6103e960048036038101906103e49190612511565b610e0f565b6040516103f691906122a4565b60405180910390f35b6104196004803603810190610414919061253e565b610f02565b60405161042691906124a3565b60405180910390f35b610437610fb6565b60405161044491906124a3565b60405180910390f35b6104676004803603810190610462919061257e565b610fbc565b60405161047491906125c4565b60405180910390f35b6104976004803603810190610492919061240e565b610fe0565b6040516104a491906122a4565b60405180910390f35b6104c760048036038101906104c29190612511565b611120565b6040516104d491906124a3565b60405180910390f35b6104f760048036038101906104f2919061257e565b611169565b60405161050491906124a3565b60405180910390f35b6105276004803603810190610522919061257e565b6111c9565b60405161053491906124a3565b60405180910390f35b6105456111ea565b60405161055291906124a3565b60405180910390f35b6105756004803603810190610570919061253e565b6111f0565b60405161058291906124a3565b60405180910390f35b6105a560048036038101906105a0919061257e565b611271565b6040516105b291906124a3565b60405180910390f35b6105d560048036038101906105d0919061257e565b6112f1565b6040516105e291906124a3565b60405180910390f35b6106056004803603810190610600919061260b565b611312565b60405161061291906124a3565b60405180910390f35b61063560048036038101906106309190612511565b61134c565b60405161064291906124a3565b60405180910390f35b610653611404565b60405161066091906122a4565b60405180910390f35b610671611415565b60405161067e91906122a4565b60405180910390f35b61068f6115bc565b60405161069c9190612647565b60405180910390f35b6106bf60048036038101906106ba9190612511565b6115e2565b005b6106c9611680565b6040516106d691906122a4565b60405180910390f35b6106e76117ca565b6040516106f49190612358565b60405180910390f35b61071760048036038101906107129190612511565b611858565b60405161072491906122a4565b60405180910390f35b6107476004803603810190610742919061260b565b611915565b60405161075491906124a3565b60405180910390f35b6107776004803603810190610772919061240e565b611941565b60405161078491906122a4565b60405180910390f35b6107956119d7565b6040516107a291906124a3565b60405180910390f35b6107b36119fb565b6040516107c091906124a3565b60405180910390f35b6107e360048036038101906107de919061257e565b611a1f565b6040516107f091906122a4565b60405180910390f35b610801611b57565b60405161080e91906124a3565b60405180910390f35b610831600480360381019061082c9190612662565b611b5d565b60405161083e91906124a3565b60405180910390f35b610861600480360381019061085c919061260b565b611bb4565b60405161086e91906124a3565b60405180910390f35b610891600480360381019061088c919061253e565b611bc8565b60405161089e91906124a3565b60405180910390f35b6108af611c7c565b6040516108bc9190612479565b60405180910390f35b6108cd611ce6565b6040516108da91906124a3565b60405180910390f35b6108fd60048036038101906108f89190612511565b611d0a565b60405161090a91906122a4565b60405180910390f35b61092d600480360381019061092891906126a2565b611dac565b60405161093a91906125c4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60078054610af690612738565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612738565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611680565b50610b8c83611271565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612798565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124a3565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60035481565b600a5481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfc611680565b50610d0684611271565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9157600080fd5b610d9c868684611e19565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610dfb91906124a3565b60405180910390a380925050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9857503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea157600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f46919061281d565b905060005b84811015610f8f5764e8d4a510008284610f65919061284e565b610f6f919061281d565b83610f7a91906128a8565b92508080610f87906128dc565b915050610f4b565b5064e8d4a510008583610fa2919061284e565b610fac919061281d565b9250505092915050565b60095481565b60008181548110610fcc57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661106f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106690612970565b60405180910390fd5b611077611680565b5061108183611271565b905082600a60008282546110959190612798565b925050819055506110a68482611e3e565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161110491906124a3565b60405180910390a3611114611f02565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611197919061284e565b7f00000000000000000000000000000000000000000000000000000000000000006111c29190612798565b9050919050565b6000603c82426111d991906128a8565b6111e3919061281d565b9050919050565b60045481565b6000806402540be40083611204919061284e565b7f000000000000000000000000000000000000000000000000000000000000000061122f91906128a8565b8461123a919061284e565b90507f000000000000000000000000000000000000000000000000000000000000000081611268919061281d565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112a29190612990565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112e0919061284e565b6112ea919061281d565b9050919050565b6000603c824261130191906128a8565b61130b919061281d565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061135b85611120565b92506113686004546111c9565b90506113b46402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661139c9190612990565b6fffffffffffffffffffffffffffffffff1682610f02565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113e4919061284e565b82846113f0919061284e565b6113fa919061281d565b9350505050919050565b60006114106000611a1f565b905090565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461163c57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611696611404565b5061169f611fa4565b9750600060010288036116bd576000985050505050505050506117c7565b6116c688611bb4565b95506001866116d59190612798565b90506116e086611169565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061171e826112f1565b9250600083111561173a576117338584611bc8565b935061173e565b8493505b61174d600085600a5484611dac565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117828789612090565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117b291906124a3565b60405180910390a16001985050505050505050505b90565b600880546117d790612738565b80601f016020809104026020016040519081016040528092919081815260200182805461180390612738565b80156118505780601f1061182557610100808354040283529160200191611850565b820191906000526020600020905b81548152906001019060200180831161183357829003601f168201915b505050505081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118b457600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061194e611680565b5061195884611271565b9150611965338684611e19565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119c491906124a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a2f6004546111c9565b915060008203611a4457600092505050611b52565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611a8657508184105b15611a8f578391505b611a998183610f02565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611ade919061284e565b600454611aeb9190612798565b60048190555080826004547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b439190612a15565b60405180910390a46001925050505b919050565b600b5481565b600080600080611b6c86611915565b9250611b7786611312565b9150611b8285611312565b90508181611b9091906128a8565b600354611b9d91906128a8565b9150611ba983836111f0565b935050505092915050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c0c919061281d565b905060005b84811015611c555764e8d4a510008284611c2b919061284e565b611c35919061281d565b83611c409190612798565b92508080611c4d906128dc565b915050611c11565b5064e8d4a510008583611c68919061284e565b611c72919061281d565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ccd91906128a8565b611cd7919061281d565b611ce19190612798565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d6657600080fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e2685846120f8565b50611e318484611e3e565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e9a5760009350505050611efc565b611ea386611120565b92508483611eb19190612798565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600a54905060006001600080549050611f2091906128a8565b81548110611f3157611f30612a30565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f7c91906128a8565b81548110611f8d57611f8c612a30565b5b906000526020600020018190555060019250505090565b600080600080600b5481548110611fbe57611fbd612a30565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612032573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120569190612a8b565b6fffffffffffffffffffffffffffffffff16905061207382611bb4565b81116120875760006001029250505061208d565b81925050505b90565b60008061209d8484611b5d565b90506120d3600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166120ce83611271565b611e3e565b506001600b60008282546120e79190612798565b925050819055508091505092915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361215457600093505050506121f9565b61215d86611120565b9250848310156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612b04565b60405180910390fd5b84836121ae91906128a8565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61223981612204565b811461224457600080fd5b50565b60008135905061225681612230565b92915050565b600060208284031215612272576122716121ff565b5b600061228084828501612247565b91505092915050565b60008115159050919050565b61229e81612289565b82525050565b60006020820190506122b96000830184612295565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b83811115612308576000848401525b50505050565b6000601f19601f8301169050919050565b600061232a826122bf565b61233481856122ca565b93506123448185602086016122db565b61234d8161230e565b840191505092915050565b60006020820190508181036000830152612372818461231f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123a58261237a565b9050919050565b6123b58161239a565b81146123c057600080fd5b50565b6000813590506123d2816123ac565b92915050565b6000819050919050565b6123eb816123d8565b81146123f657600080fd5b50565b600081359050612408816123e2565b92915050565b60008060408385031215612425576124246121ff565b5b6000612433858286016123c3565b9250506020612444858286016123f9565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124738161244e565b82525050565b600060208201905061248e600083018461246a565b92915050565b61249d816123d8565b82525050565b60006020820190506124b86000830184612494565b92915050565b6000806000606084860312156124d7576124d66121ff565b5b60006124e5868287016123c3565b93505060206124f6868287016123c3565b9250506040612507868287016123f9565b9150509250925092565b600060208284031215612527576125266121ff565b5b6000612535848285016123c3565b91505092915050565b60008060408385031215612555576125546121ff565b5b6000612563858286016123f9565b9250506020612574858286016123f9565b9150509250929050565b600060208284031215612594576125936121ff565b5b60006125a2848285016123f9565b91505092915050565b6000819050919050565b6125be816125ab565b82525050565b60006020820190506125d960008301846125b5565b92915050565b6125e8816125ab565b81146125f357600080fd5b50565b600081359050612605816125df565b92915050565b600060208284031215612621576126206121ff565b5b600061262f848285016125f6565b91505092915050565b6126418161239a565b82525050565b600060208201905061265c6000830184612638565b92915050565b60008060408385031215612679576126786121ff565b5b6000612687858286016125f6565b9250506020612698858286016125f6565b9150509250929050565b600080600080608085870312156126bc576126bb6121ff565b5b60006126ca878288016123f9565b94505060206126db878288016123f9565b93505060406126ec878288016123f9565b92505060606126fd878288016123f9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275057607f821691505b60208210810361276357612762612709565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127a3826123d8565b91506127ae836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127e3576127e2612769565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612828826123d8565b9150612833836123d8565b925082612843576128426127ee565b5b828204905092915050565b6000612859826123d8565b9150612864836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561289d5761289c612769565b5b828202905092915050565b60006128b3826123d8565b91506128be836123d8565b9250828210156128d1576128d0612769565b5b828203905092915050565b60006128e7826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361291957612918612769565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061295a600a836122ca565b915061296582612924565b602082019050919050565b600060208201905081810360008301526129898161294d565b9050919050565b600061299b8261244e565b91506129a68361244e565b9250816fffffffffffffffffffffffffffffffff04831182151516156129cf576129ce612769565b5b828202905092915050565b6000819050919050565b60006129ff6129fa6129f58461244e565b6129da565b6123d8565b9050919050565b612a0f816129e4565b82525050565b6000602082019050612a2a6000830184612a06565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a688161244e565b8114612a7357600080fd5b50565b600081519050612a8581612a5f565b92915050565b600060208284031215612aa157612aa06121ff565b5b6000612aaf84828501612a76565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612aee600d836122ca565b9150612af982612ab8565b602082019050919050565b60006020820190508181036000830152612b1d81612ae1565b905091905056fea2646970667358221220e550a23a0a73cec1721ab581b45ec189ebe066e3bf61f6d85aa4f40183a53a2964736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043e565b6080908152503480156200003657600080fd5b50604051620034ae380380620034ae83398181016040528101906200005c91906200075d565b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600790805190602001906200012f92919062000355565b5084600890805190602001906200014892919062000355565b508360ff166009819055504260048190555060045460a08181525050603c826200017391906200043e565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000837565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600381905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200026f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002e8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008ec565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200036390620008b7565b90600052602060002090601f016020900481019282620003875760008555620003d3565b82601f10620003a257805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d2578251825591602001919060010190620003b5565b5b509050620003e29190620003e6565b5090565b5b8082111562000401576000816000905550600101620003e7565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044b8262000405565b9150620004588362000405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200049457620004936200040f565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050882620004bd565b810181811067ffffffffffffffff821117156200052a5762000529620004ce565b5b80604052505050565b60006200053f6200049f565b90506200054d8282620004fd565b919050565b600067ffffffffffffffff82111562000570576200056f620004ce565b5b6200057b82620004bd565b9050602081019050919050565b60005b83811015620005a85780820151818401526020810190506200058b565b83811115620005b8576000848401525b50505050565b6000620005d5620005cf8462000552565b62000533565b905082815260208101848484011115620005f457620005f3620004b8565b5b6200060184828562000588565b509392505050565b600082601f830112620006215762000620620004b3565b5b815162000633848260208601620005be565b91505092915050565b600060ff82169050919050565b62000654816200063c565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620006a1816200067a565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d28162000405565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200072582620006f8565b9050919050565b620007378162000718565b81146200074357600080fd5b50565b60008151905062000757816200072c565b92915050565b60008060008060008060c087890312156200077d576200077c620004a9565b5b600087015167ffffffffffffffff8111156200079e576200079d620004ae565b5b620007ac89828a0162000609565b965050602087015167ffffffffffffffff811115620007d057620007cf620004ae565b5b620007de89828a0162000609565b9550506040620007f189828a0162000663565b94505060606200080489828a01620006b0565b93505060806200081789828a01620006e1565b92505060a06200082a89828a0162000746565b9150509295509295509295565b600062000844826200067a565b915062000851836200067a565b9250816fffffffffffffffffffffffffffffffff04831182151516156200087d576200087c6200040f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008d057607f821691505b602082108103620008e657620008e562000888565b5b50919050565b60805160a05160c05160e051612b496200096560003960008181610cf601528181610f460152611be801526000818161119601528181611a590152611c870152600081816111c201528181611ca80152611ced01526000818161122f01528181611267015281816112df0152611a350152612b496000f3fe608060405234801561001057600080fd5b5060043610610291576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b806370a0823114610626578063731f237c1461065657806374bedb951461067457806379ba5097146106925780638d34855a146106b057610291565b8063313ce5671161020757806351b4541c116101cb57806351b4541c1461051857806358b2833b146105485780636721d4ef146105665780636787a9be146105965780636a2d094e146105c65780636ffa8a05146105f657610291565b8063313ce5671461043a57806340452d9114610458578063449a52f81461048857806347a50517146104b85780634abfbba2146104e857610291565b806318160ddd1161025957806318160ddd146103505780631989c6a81461036e578063229ba1971461038c57806323b872dd146103aa5780633092afd5146103da578063313334871461040a57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c146103145780630b2472eb14610332575b600080fd5b6102b060048036038101906102ab919061228b565b61096c565b6040516102bd91906122d3565b60405180910390f35b6102ce610b12565b6040516102db9190612387565b60405180910390f35b6102fe60048036038101906102f9919061243d565b610ba0565b60405161030b91906122d3565b60405180910390f35b61031c610cba565b60405161032991906124a8565b60405180910390f35b61033a610cdc565b60405161034791906124d2565b60405180910390f35b610358610ce2565b60405161036591906124d2565b60405180910390f35b610376610ce8565b60405161038391906124d2565b60405180910390f35b610394610cf4565b6040516103a191906124d2565b60405180910390f35b6103c460048036038101906103bf91906124ed565b610d18565b6040516103d191906122d3565b60405180910390f35b6103f460048036038101906103ef9190612540565b610e38565b60405161040191906122d3565b60405180910390f35b610424600480360381019061041f919061256d565b610f2b565b60405161043191906124d2565b60405180910390f35b610442610fdf565b60405161044f91906124d2565b60405180910390f35b610472600480360381019061046d91906125ad565b610fe5565b60405161047f91906125f3565b60405180910390f35b6104a2600480360381019061049d919061243d565b611009565b6040516104af91906122d3565b60405180910390f35b6104d260048036038101906104cd9190612540565b611149565b6040516104df91906124d2565b60405180910390f35b61050260048036038101906104fd91906125ad565b611192565b60405161050f91906124d2565b60405180910390f35b610532600480360381019061052d91906125ad565b6111f2565b60405161053f91906124d2565b60405180910390f35b610550611213565b60405161055d91906124d2565b60405180910390f35b610580600480360381019061057b919061256d565b611219565b60405161058d91906124d2565b60405180910390f35b6105b060048036038101906105ab91906125ad565b61129a565b6040516105bd91906124d2565b60405180910390f35b6105e060048036038101906105db91906125ad565b61131a565b6040516105ed91906124d2565b60405180910390f35b610610600480360381019061060b919061263a565b61133b565b60405161061d91906124d2565b60405180910390f35b610640600480360381019061063b9190612540565b611375565b60405161064d91906124d2565b60405180910390f35b61065e61142d565b60405161066b91906122d3565b60405180910390f35b61067c61143e565b60405161068991906124d2565b60405180910390f35b61069a611444565b6040516106a791906122d3565b60405180910390f35b6106ca60048036038101906106c5919061263a565b6115eb565b6040516106d791906124d2565b60405180910390f35b6106e8611619565b6040516106f59190612676565b60405180910390f35b61071860048036038101906107139190612540565b61163f565b005b6107226116dd565b60405161072f91906122d3565b60405180910390f35b610740611826565b60405161074d9190612387565b60405180910390f35b610770600480360381019061076b9190612540565b6118b4565b60405161077d91906122d3565b60405180910390f35b6107a0600480360381019061079b919061263a565b611971565b6040516107ad91906124d2565b60405180910390f35b6107d060048036038101906107cb919061243d565b61199d565b6040516107dd91906122d3565b60405180910390f35b6107ee611a33565b6040516107fb91906124d2565b60405180910390f35b61080c611a57565b60405161081991906124d2565b60405180910390f35b61083c600480360381019061083791906125ad565b611a7b565b60405161084991906122d3565b60405180910390f35b61085a611bb3565b60405161086791906124d2565b60405180910390f35b61088a6004803603810190610885919061263a565b611bb9565b60405161089791906124d2565b60405180910390f35b6108ba60048036038101906108b5919061256d565b611bcd565b6040516108c791906124d2565b60405180910390f35b6108d8611c81565b6040516108e591906124a8565b60405180910390f35b6108f6611ceb565b60405161090391906124d2565b60405180910390f35b61092660048036038101906109219190612540565b611d0f565b60405161093391906122d3565b60405180910390f35b61095660048036038101906109519190612691565b611db1565b60405161096391906125f3565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60078054610b1f90612727565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612727565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116dd565b50610bb58361129a565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c439190612787565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124d2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60035481565b600a5481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d256116dd565b50610d2f8461129a565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dba57600080fd5b610dc5868684611e1e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e2491906124d2565b60405180910390a380925050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ec157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eca57600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f6f919061280c565b905060005b84811015610fb85764e8d4a510008284610f8e919061283d565b610f98919061280c565b83610fa39190612897565b92508080610fb0906128cb565b915050610f74565b5064e8d4a510008583610fcb919061283d565b610fd5919061280c565b9250505092915050565b60095481565b60008181548110610ff557600080fd5b906000526020600020016000915090505481565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f9061295f565b60405180910390fd5b6110a06116dd565b506110aa8361129a565b905082600a60008282546110be9190612787565b925050819055506110cf8482611e43565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112d91906124d2565b60405180910390a361113d611f07565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111c0919061283d565b7f00000000000000000000000000000000000000000000000000000000000000006111eb9190612787565b9050919050565b6000603c82426112029190612897565b61120c919061280c565b9050919050565b60045481565b6000806402540be4008361122d919061283d565b7f00000000000000000000000000000000000000000000000000000000000000006112589190612897565b84611263919061283d565b90507f000000000000000000000000000000000000000000000000000000000000000081611291919061280c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112cb919061297f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611309919061283d565b611313919061280c565b9050919050565b6000603c824261132a9190612897565b611334919061280c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061138485611149565b92506113916004546111f2565b90506113dd6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113c5919061297f565b6fffffffffffffffffffffffffffffffff1682610f2b565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061140d919061283d565b8284611419919061283d565b611423919061280c565b9350505050919050565b60006114396000611a7b565b905090565b600c5481565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115f984611971565b91506116048461133b565b90506116108282611219565b92505050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461169957600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116f361142d565b506116fc611fa9565b97506000600102880361171a57600098505050505050505050611823565b61172388611bb9565b95506001866117329190612787565b905061173d86611192565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061177b8261131a565b92506000831115611797576117908584611bcd565b935061179b565b8493505b6117aa600085600a5484611db1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117de87612095565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161180e91906124d2565b60405180910390a16001985050505050505050505b90565b6008805461183390612727565b80601f016020809104026020016040519081016040528092919081815260200182805461185f90612727565b80156118ac5780601f10611881576101008083540402835291602001916118ac565b820191906000526020600020905b81548152906001019060200180831161188f57829003601f168201915b505050505081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191057600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119aa6116dd565b506119b48461129a565b91506119c1338684611e1e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a2091906124d2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a8b6004546111f2565b915060008203611aa057600092505050611bae565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611ae257508184105b15611aeb578391505b611af58183610f2b565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b3a919061283d565b600454611b479190612787565b60048190555080826004547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b9f9190612a04565b60405180910390a46001925050505b919050565b600b5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c11919061280c565b905060005b84811015611c5a5764e8d4a510008284611c30919061283d565b611c3a919061280c565b83611c459190612787565b92508080611c52906128cb565b915050611c16565b5064e8d4a510008583611c6d919061283d565b611c77919061280c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cd29190612897565b611cdc919061280c565b611ce69190612787565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d6b57600080fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e2b8584612127565b50611e368484611e43565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e9f5760009350505050611f01565b611ea886611149565b92508483611eb69190612787565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600a54905060006001600080549050611f259190612897565b81548110611f3657611f35612a1f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f819190612897565b81548110611f9257611f91612a1f565b5b906000526020600020018190555060019250505090565b600080600080600b5481548110611fc357611fc2612a1f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190612a7a565b6fffffffffffffffffffffffffffffffff16905061207882611bb9565b811161208c57600060010292505050612092565b81925050505b90565b60008060006120a3846115eb565b9150600c546120b18361129a565b6120bb9190612897565b90506120e9600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e43565b506001600b60008282546120fd9190612787565b9250508190555080600c60008282546121169190612787565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121835760009350505050612228565b61218c86611149565b9250848310156121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c890612af3565b60405180910390fd5b84836121dd9190612897565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61226881612233565b811461227357600080fd5b50565b6000813590506122858161225f565b92915050565b6000602082840312156122a1576122a061222e565b5b60006122af84828501612276565b91505092915050565b60008115159050919050565b6122cd816122b8565b82525050565b60006020820190506122e860008301846122c4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561232857808201518184015260208101905061230d565b83811115612337576000848401525b50505050565b6000601f19601f8301169050919050565b6000612359826122ee565b61236381856122f9565b935061237381856020860161230a565b61237c8161233d565b840191505092915050565b600060208201905081810360008301526123a1818461234e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123d4826123a9565b9050919050565b6123e4816123c9565b81146123ef57600080fd5b50565b600081359050612401816123db565b92915050565b6000819050919050565b61241a81612407565b811461242557600080fd5b50565b60008135905061243781612411565b92915050565b600080604083850312156124545761245361222e565b5b6000612462858286016123f2565b925050602061247385828601612428565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124a28161247d565b82525050565b60006020820190506124bd6000830184612499565b92915050565b6124cc81612407565b82525050565b60006020820190506124e760008301846124c3565b92915050565b6000806000606084860312156125065761250561222e565b5b6000612514868287016123f2565b9350506020612525868287016123f2565b925050604061253686828701612428565b9150509250925092565b6000602082840312156125565761255561222e565b5b6000612564848285016123f2565b91505092915050565b600080604083850312156125845761258361222e565b5b600061259285828601612428565b92505060206125a385828601612428565b9150509250929050565b6000602082840312156125c3576125c261222e565b5b60006125d184828501612428565b91505092915050565b6000819050919050565b6125ed816125da565b82525050565b600060208201905061260860008301846125e4565b92915050565b612617816125da565b811461262257600080fd5b50565b6000813590506126348161260e565b92915050565b6000602082840312156126505761264f61222e565b5b600061265e84828501612625565b91505092915050565b612670816123c9565b82525050565b600060208201905061268b6000830184612667565b92915050565b600080600080608085870312156126ab576126aa61222e565b5b60006126b987828801612428565b94505060206126ca87828801612428565b93505060406126db87828801612428565b92505060606126ec87828801612428565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061273f57607f821691505b602082108103612752576127516126f8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279282612407565b915061279d83612407565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127d2576127d1612758565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061281782612407565b915061282283612407565b925082612832576128316127dd565b5b828204905092915050565b600061284882612407565b915061285383612407565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561288c5761288b612758565b5b828202905092915050565b60006128a282612407565b91506128ad83612407565b9250828210156128c0576128bf612758565b5b828203905092915050565b60006128d682612407565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361290857612907612758565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612949600a836122f9565b915061295482612913565b602082019050919050565b600060208201905081810360008301526129788161293c565b9050919050565b600061298a8261247d565b91506129958361247d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129be576129bd612758565b5b828202905092915050565b6000819050919050565b60006129ee6129e96129e48461247d565b6129c9565b612407565b9050919050565b6129fe816129d3565b82525050565b6000602082019050612a1960008301846129f5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a578161247d565b8114612a6257600080fd5b50565b600081519050612a7481612a4e565b92915050565b600060208284031215612a9057612a8f61222e565b5b6000612a9e84828501612a65565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612add600d836122f9565b9150612ae882612aa7565b602082019050919050565b60006020820190508181036000830152612b0c81612ad0565b905091905056fea2646970667358221220ecba5763a1067c4f87f90ee27874db9cae32767ff5c73b0d52687aa32204573f64736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 354a255..fdd6001 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"},{"internalType":"bytes32","name":"_redistributionPrevious","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index dc82024..e098451 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -454,16 +454,14 @@ class DemurrageToken(ERC20): return o - def get_distribution_from_redistribution(self, contract_address, redistribution, redistribution_previous, sender_address=ZERO_ADDRESS, id_generator=None): + def get_distribution_from_redistribution(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('getDistributionFromRedistribution') enc.typ(ABIContractType.BYTES32) - enc.typ(ABIContractType.BYTES32) enc.bytes32(redistribution) - enc.bytes32(redistribution_previous) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index 3f5ddbf..28d2d67 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -32,7 +32,7 @@ testdir = os.path.dirname(__file__) class TestRedistribution(TestDemurrageDefault): - def test_redistribution_boundaries(self): + def test_redistribution_periods(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -42,48 +42,93 @@ class TestRedistribution(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) self.rpc.do(o) - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) - logg.debug('balance before {} supply {}'.format(balance, supply)) + for i in range(1, 10): + logg.debug('execute time travel to period {}'.format(i)) + self.backend.time_travel(self.start_time + (self.period_seconds * i)) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) - self.backend.time_travel(self.start_time + self.period_seconds) - (tx_hash, o) = c.change_period(self.address, self.accounts[0]) - r = self.rpc.do(o) + o = c.redistributions(self.address, i, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage = c.parse_to_redistribution_item(r) - o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) - r = self.rpc.do(o) - oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) + o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_previous = c.parse_to_redistribution_item(r) - self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) - (tx_hash, o) = c.change_period(self.address, self.accounts[0]) - r = self.rpc.do(o) + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_sink = c.parse_balance(r) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_minter = c.parse_balance(r) - o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) - r = self.rpc.do(o) - oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) - oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) - rr = self.rpc.do(oo) + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance = c.parse_balance(r) + self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + +# def test_redistribution_boundaries(self): +# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) +# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) +# +# demurrage = (1 - (self.tax_level / 1000000)) * (10**28) +# supply = self.default_supply +# +# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) +# self.rpc.do(o) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) +# logg.debug('balance before {} supply {}'.format(balance, supply)) +# +# self.backend.time_travel(self.start_time + self.period_seconds) +# (tx_hash, o) = c.change_period(self.address, self.accounts[0]) +# r = self.rpc.do(o) +# +# o = receipt(tx_hash) +# r = self.rpc.do(o) +# self.assertEqual(r['status'], 1) +# +# o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) +# +# self.backend.time_travel(self.start_time + self.period_seconds * 2 + 1) +# (tx_hash, o) = c.change_period(self.address, self.accounts[0]) +# r = self.rpc.do(o) +# +# o = receipt(tx_hash) +# r = self.rpc.do(o) +# self.assertEqual(r['status'], 1) +# +# o = c.redistributions(self.address, 2, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# oo = c.to_redistribution_supply(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# oo = c.to_redistribution_demurrage_modifier(self.address, r, sender_address=self.accounts[0]) +# rr = self.rpc.do(oo) +# +# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# balance = c.parse_balance(r) if __name__ == '__main__': diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index 5181f91..c11bdfa 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -51,22 +51,19 @@ class TestRedistribution(TestDemurrageUnit): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - demurrage_previous = (1 - (self.tax_level / 100000)) * (10**28) - demurrage = (1 - ((self.tax_level * 1.33) / 100000)) * (10**28) + demurrage = (1 - (self.tax_level / 100000)) * (10**28) - logg.debug('demurrage then {} now {}'.format(demurrage_previous, demurrage)) + logg.debug('demurrage {}'.format(demurrage)) supply = self.default_supply - o = c.to_redistribution(self.address, 0, demurrage_previous, supply, 1, sender_address=self.accounts[0]) - redistribution_previous = self.rpc.do(o) - o = c.to_redistribution(self.address, 0, demurrage, supply, 2, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) - o = c.get_distribution_from_redistribution(self.address, redistribution, redistribution_previous, self.accounts[0]) + o = c.get_distribution_from_redistribution(self.address, redistribution, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) - expected_distribution = self.default_supply * (((self.tax_level * 1.33) - self.tax_level) / 100000) + #expected_distribution = self.default_supply * (((self.tax_level * 1.33) - self.tax_level) / 100000) + expected_distribution = (self.default_supply * self.tax_level) / 100000 logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) self.assert_within_lower(distribution, expected_distribution, 1000) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 2f781b3..fc6ec54 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -22,8 +22,6 @@ contract DemurrageTokenSingleCap { uint256 public demurrageStart; - // Cached demurrage period; the period for which demurrageAmount was calculated - //uint128 public demurragePeriod; // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated uint256 public demurrageTimestamp; @@ -47,8 +45,8 @@ contract DemurrageTokenSingleCap { // Last executed period uint256 public lastPeriod; - // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - //uint256 public minimumParticipantSpend; + // Last sink redistribution amount + uint256 public totalSink; // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) @@ -116,19 +114,14 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = block.timestamp; periodStart = demurrageTimestamp; periodDuration = _periodMinutes * 60; - //demurrageAmount = 100000000000000000000000000000000000000 - _taxLevelMinute; // Represents 38 decimal places, same as resolutionFactor - //demurrageAmount = 100000000000000000000000000000000000000; - //demurrageAmount = 10000000000000000000000000000; demurrageAmount = uint128(nanoDivider) * 100; demurrageStart = demurrageAmount; - //demurragePeriod = 1; taxLevel = _taxLevelMinute; // Represents 38 decimal places bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); // Misc settings sinkAddress = _defaultSinkAddress; - //minimumParticipantSpend = 10 ** uint256(_decimals); } @@ -160,10 +153,8 @@ contract DemurrageTokenSingleCap { baseBalance = baseBalanceOf(_account); - //periodCount = actualPeriod() - demurragePeriod; periodCount = getMinutesDelta(demurrageTimestamp); - //currentDemurragedAmount = uint128(decayBy(demurrageAmount, periodCount)); currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); @@ -281,7 +272,6 @@ contract DemurrageTokenSingleCap { bytes32 lastRedistribution; uint256 currentPeriod; - //lastRedistribution = redistributions[redistributions.length-1]; lastRedistribution = redistributions[lastPeriod]; currentPeriod = this.actualPeriod(); if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { @@ -293,30 +283,29 @@ contract DemurrageTokenSingleCap { function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { uint256 difference; - //difference = _supply * (resolutionFactor - _demurrageAmount); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider)); - difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider)); + difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); return difference / resolutionFactor; } - function getDistributionFromRedistribution(bytes32 _redistribution, bytes32 _redistributionPrevious) public returns (uint256) { + function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) { uint256 redistributionSupply; uint256 redistributionDemurrage; - uint256 redistributionDemurragePrevious; redistributionSupply = toRedistributionSupply(_redistribution); redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); - redistributionDemurragePrevious = toRedistributionDemurrageModifier(_redistributionPrevious); - redistributionDemurrage = demurrageStart - (redistributionDemurragePrevious - redistributionDemurrage); return getDistribution(redistributionSupply, redistributionDemurrage); } // Returns the amount sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution, bytes32 _redistributionPrevious) private returns (uint256) { + function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { uint256 unit; + uint256 baseUnit; - unit = getDistributionFromRedistribution(_redistribution, _redistributionPrevious); - increaseBaseBalance(sinkAddress, toBaseAmount(unit)); + unit = getDistributionFromRedistribution(_redistribution); + baseUnit = toBaseAmount(unit) - totalSink; + increaseBaseBalance(sinkAddress, baseUnit); lastPeriod += 1; + totalSink += baseUnit; return unit; } @@ -331,13 +320,9 @@ contract DemurrageTokenSingleCap { } function applyDemurrageLimited(uint256 _rounds) public returns (bool) { - //uint128 epochPeriodCount; uint256 periodCount; uint256 lastDemurrageAmount; - //epochPeriodCount = actualPeriod(); - //periodCount = epochPeriodCount - demurragePeriod; - periodCount = getMinutesDelta(demurrageTimestamp); if (periodCount == 0) { return false; @@ -400,7 +385,7 @@ contract DemurrageTokenSingleCap { nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); redistributions.push(nextRedistribution); - applyDefaultRedistribution(nextRedistribution, currentRedistribution); + applyDefaultRedistribution(nextRedistribution); emit Period(nextPeriod); return true; } @@ -435,7 +420,6 @@ contract DemurrageTokenSingleCap { // Inflates the given amount according to the current demurrage modifier function toBaseAmount(uint256 _value) public view returns (uint256) { - //return (_value * resolutionFactor) / demurrageAmount; return (_value * resolutionFactor) / (demurrageAmount * 10000000000); } @@ -486,7 +470,6 @@ contract DemurrageTokenSingleCap { decreaseBaseBalance(_from, _value); increaseBaseBalance(_to, _value); - //period = actualPeriod(); return true; } From ee871730dcf65538f925f752ba39fef9e0d6f27e Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 27 May 2022 12:53:11 +0000 Subject: [PATCH 08/57] Remove unneeded demurragestart item --- .../erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 2 +- .../erc20_demurrage_token/data/DemurrageTokenSingleNocap.json | 2 +- solidity/DemurrageTokenSingleNocap.sol | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index c3eed68..f9d352c 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043e565b6080908152503480156200003657600080fd5b50604051620034ae380380620034ae83398181016040528101906200005c91906200075d565b33600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600790805190602001906200012f92919062000355565b5084600890805190602001906200014892919062000355565b508360ff166009819055504260048190555060045460a08181525050603c826200017391906200043e565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000837565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600381905550826fffffffffffffffffffffffffffffffff1660e0818152505060006200026f6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002e8640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008ec565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200036390620008b7565b90600052602060002090601f016020900481019282620003875760008555620003d3565b82601f10620003a257805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d2578251825591602001919060010190620003b5565b5b509050620003e29190620003e6565b5090565b5b8082111562000401576000816000905550600101620003e7565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044b8262000405565b9150620004588362000405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200049457620004936200040f565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050882620004bd565b810181811067ffffffffffffffff821117156200052a5762000529620004ce565b5b80604052505050565b60006200053f6200049f565b90506200054d8282620004fd565b919050565b600067ffffffffffffffff82111562000570576200056f620004ce565b5b6200057b82620004bd565b9050602081019050919050565b60005b83811015620005a85780820151818401526020810190506200058b565b83811115620005b8576000848401525b50505050565b6000620005d5620005cf8462000552565b62000533565b905082815260208101848484011115620005f457620005f3620004b8565b5b6200060184828562000588565b509392505050565b600082601f830112620006215762000620620004b3565b5b815162000633848260208601620005be565b91505092915050565b600060ff82169050919050565b62000654816200063c565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b620006a1816200067a565b8114620006ad57600080fd5b50565b600081519050620006c18162000696565b92915050565b620006d28162000405565b8114620006de57600080fd5b50565b600081519050620006f281620006c7565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200072582620006f8565b9050919050565b620007378162000718565b81146200074357600080fd5b50565b60008151905062000757816200072c565b92915050565b60008060008060008060c087890312156200077d576200077c620004a9565b5b600087015167ffffffffffffffff8111156200079e576200079d620004ae565b5b620007ac89828a0162000609565b965050602087015167ffffffffffffffff811115620007d057620007cf620004ae565b5b620007de89828a0162000609565b9550506040620007f189828a0162000663565b94505060606200080489828a01620006b0565b93505060806200081789828a01620006e1565b92505060a06200082a89828a0162000746565b9150509295509295509295565b600062000844826200067a565b915062000851836200067a565b9250816fffffffffffffffffffffffffffffffff04831182151516156200087d576200087c6200040f565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008d057607f821691505b602082108103620008e657620008e562000888565b5b50919050565b60805160a05160c05160e051612b496200096560003960008181610cf601528181610f460152611be801526000818161119601528181611a590152611c870152600081816111c201528181611ca80152611ced01526000818161122f01528181611267015281816112df0152611a350152612b496000f3fe608060405234801561001057600080fd5b5060043610610291576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b806370a0823114610626578063731f237c1461065657806374bedb951461067457806379ba5097146106925780638d34855a146106b057610291565b8063313ce5671161020757806351b4541c116101cb57806351b4541c1461051857806358b2833b146105485780636721d4ef146105665780636787a9be146105965780636a2d094e146105c65780636ffa8a05146105f657610291565b8063313ce5671461043a57806340452d9114610458578063449a52f81461048857806347a50517146104b85780634abfbba2146104e857610291565b806318160ddd1161025957806318160ddd146103505780631989c6a81461036e578063229ba1971461038c57806323b872dd146103aa5780633092afd5146103da578063313334871461040a57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c146103145780630b2472eb14610332575b600080fd5b6102b060048036038101906102ab919061228b565b61096c565b6040516102bd91906122d3565b60405180910390f35b6102ce610b12565b6040516102db9190612387565b60405180910390f35b6102fe60048036038101906102f9919061243d565b610ba0565b60405161030b91906122d3565b60405180910390f35b61031c610cba565b60405161032991906124a8565b60405180910390f35b61033a610cdc565b60405161034791906124d2565b60405180910390f35b610358610ce2565b60405161036591906124d2565b60405180910390f35b610376610ce8565b60405161038391906124d2565b60405180910390f35b610394610cf4565b6040516103a191906124d2565b60405180910390f35b6103c460048036038101906103bf91906124ed565b610d18565b6040516103d191906122d3565b60405180910390f35b6103f460048036038101906103ef9190612540565b610e38565b60405161040191906122d3565b60405180910390f35b610424600480360381019061041f919061256d565b610f2b565b60405161043191906124d2565b60405180910390f35b610442610fdf565b60405161044f91906124d2565b60405180910390f35b610472600480360381019061046d91906125ad565b610fe5565b60405161047f91906125f3565b60405180910390f35b6104a2600480360381019061049d919061243d565b611009565b6040516104af91906122d3565b60405180910390f35b6104d260048036038101906104cd9190612540565b611149565b6040516104df91906124d2565b60405180910390f35b61050260048036038101906104fd91906125ad565b611192565b60405161050f91906124d2565b60405180910390f35b610532600480360381019061052d91906125ad565b6111f2565b60405161053f91906124d2565b60405180910390f35b610550611213565b60405161055d91906124d2565b60405180910390f35b610580600480360381019061057b919061256d565b611219565b60405161058d91906124d2565b60405180910390f35b6105b060048036038101906105ab91906125ad565b61129a565b6040516105bd91906124d2565b60405180910390f35b6105e060048036038101906105db91906125ad565b61131a565b6040516105ed91906124d2565b60405180910390f35b610610600480360381019061060b919061263a565b61133b565b60405161061d91906124d2565b60405180910390f35b610640600480360381019061063b9190612540565b611375565b60405161064d91906124d2565b60405180910390f35b61065e61142d565b60405161066b91906122d3565b60405180910390f35b61067c61143e565b60405161068991906124d2565b60405180910390f35b61069a611444565b6040516106a791906122d3565b60405180910390f35b6106ca60048036038101906106c5919061263a565b6115eb565b6040516106d791906124d2565b60405180910390f35b6106e8611619565b6040516106f59190612676565b60405180910390f35b61071860048036038101906107139190612540565b61163f565b005b6107226116dd565b60405161072f91906122d3565b60405180910390f35b610740611826565b60405161074d9190612387565b60405180910390f35b610770600480360381019061076b9190612540565b6118b4565b60405161077d91906122d3565b60405180910390f35b6107a0600480360381019061079b919061263a565b611971565b6040516107ad91906124d2565b60405180910390f35b6107d060048036038101906107cb919061243d565b61199d565b6040516107dd91906122d3565b60405180910390f35b6107ee611a33565b6040516107fb91906124d2565b60405180910390f35b61080c611a57565b60405161081991906124d2565b60405180910390f35b61083c600480360381019061083791906125ad565b611a7b565b60405161084991906122d3565b60405180910390f35b61085a611bb3565b60405161086791906124d2565b60405180910390f35b61088a6004803603810190610885919061263a565b611bb9565b60405161089791906124d2565b60405180910390f35b6108ba60048036038101906108b5919061256d565b611bcd565b6040516108c791906124d2565b60405180910390f35b6108d8611c81565b6040516108e591906124a8565b60405180910390f35b6108f6611ceb565b60405161090391906124d2565b60405180910390f35b61092660048036038101906109219190612540565b611d0f565b60405161093391906122d3565b60405180910390f35b61095660048036038101906109519190612691565b611db1565b60405161096391906125f3565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60078054610b1f90612727565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612727565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116dd565b50610bb58361129a565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c439190612787565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124d2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60035481565b600a5481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d256116dd565b50610d2f8461129a565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dba57600080fd5b610dc5868684611e1e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e2491906124d2565b60405180910390a380925050509392505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ec157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610eca57600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f6f919061280c565b905060005b84811015610fb85764e8d4a510008284610f8e919061283d565b610f98919061280c565b83610fa39190612897565b92508080610fb0906128cb565b915050610f74565b5064e8d4a510008583610fcb919061283d565b610fd5919061280c565b9250505092915050565b60095481565b60008181548110610ff557600080fd5b906000526020600020016000915090505481565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f9061295f565b60405180910390fd5b6110a06116dd565b506110aa8361129a565b905082600a60008282546110be9190612787565b925050819055506110cf8482611e43565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112d91906124d2565b60405180910390a361113d611f07565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111c0919061283d565b7f00000000000000000000000000000000000000000000000000000000000000006111eb9190612787565b9050919050565b6000603c82426112029190612897565b61120c919061280c565b9050919050565b60045481565b6000806402540be4008361122d919061283d565b7f00000000000000000000000000000000000000000000000000000000000000006112589190612897565b84611263919061283d565b90507f000000000000000000000000000000000000000000000000000000000000000081611291919061280c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112cb919061297f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611309919061283d565b611313919061280c565b9050919050565b6000603c824261132a9190612897565b611334919061280c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061138485611149565b92506113916004546111f2565b90506113dd6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113c5919061297f565b6fffffffffffffffffffffffffffffffff1682610f2b565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061140d919061283d565b8284611419919061283d565b611423919061280c565b9350505050919050565b60006114396000611a7b565b905090565b600c5481565b600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114a157600080fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115f984611971565b91506116048461133b565b90506116108282611219565b92505050919050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461169957600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116f361142d565b506116fc611fa9565b97506000600102880361171a57600098505050505050505050611823565b61172388611bb9565b95506001866117329190612787565b905061173d86611192565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061177b8261131a565b92506000831115611797576117908584611bcd565b935061179b565b8493505b6117aa600085600a5484611db1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117de87612095565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161180e91906124d2565b60405180910390a16001985050505050505050505b90565b6008805461183390612727565b80601f016020809104026020016040519081016040528092919081815260200182805461185f90612727565b80156118ac5780601f10611881576101008083540402835291602001916118ac565b820191906000526020600020905b81548152906001019060200180831161188f57829003601f168201915b505050505081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191057600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119aa6116dd565b506119b48461129a565b91506119c1338684611e1e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a2091906124d2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a8b6004546111f2565b915060008203611aa057600092505050611bae565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611ae257508184105b15611aeb578391505b611af58183610f2b565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b3a919061283d565b600454611b479190612787565b60048190555080826004547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b9f9190612a04565b60405180910390a46001925050505b919050565b600b5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c11919061280c565b905060005b84811015611c5a5764e8d4a510008284611c30919061283d565b611c3a919061280c565b83611c459190612787565b92508080611c52906128cb565b915050611c16565b5064e8d4a510008583611c6d919061283d565b611c77919061280c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cd29190612897565b611cdc919061280c565b611ce69190612787565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d6b57600080fd5b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e2b8584612127565b50611e368484611e43565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e9f5760009350505050611f01565b611ea886611149565b92508483611eb69190612787565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600a54905060006001600080549050611f259190612897565b81548110611f3657611f35612a1f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f819190612897565b81548110611f9257611f91612a1f565b5b906000526020600020018190555060019250505090565b600080600080600b5481548110611fc357611fc2612a1f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612037573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205b9190612a7a565b6fffffffffffffffffffffffffffffffff16905061207882611bb9565b811161208c57600060010292505050612092565b81925050505b90565b60008060006120a3846115eb565b9150600c546120b18361129a565b6120bb9190612897565b90506120e9600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e43565b506001600b60008282546120fd9190612787565b9250508190555080600c60008282546121169190612787565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121835760009350505050612228565b61218c86611149565b9250848310156121d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c890612af3565b60405180910390fd5b84836121dd9190612897565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61226881612233565b811461227357600080fd5b50565b6000813590506122858161225f565b92915050565b6000602082840312156122a1576122a061222e565b5b60006122af84828501612276565b91505092915050565b60008115159050919050565b6122cd816122b8565b82525050565b60006020820190506122e860008301846122c4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561232857808201518184015260208101905061230d565b83811115612337576000848401525b50505050565b6000601f19601f8301169050919050565b6000612359826122ee565b61236381856122f9565b935061237381856020860161230a565b61237c8161233d565b840191505092915050565b600060208201905081810360008301526123a1818461234e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123d4826123a9565b9050919050565b6123e4816123c9565b81146123ef57600080fd5b50565b600081359050612401816123db565b92915050565b6000819050919050565b61241a81612407565b811461242557600080fd5b50565b60008135905061243781612411565b92915050565b600080604083850312156124545761245361222e565b5b6000612462858286016123f2565b925050602061247385828601612428565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124a28161247d565b82525050565b60006020820190506124bd6000830184612499565b92915050565b6124cc81612407565b82525050565b60006020820190506124e760008301846124c3565b92915050565b6000806000606084860312156125065761250561222e565b5b6000612514868287016123f2565b9350506020612525868287016123f2565b925050604061253686828701612428565b9150509250925092565b6000602082840312156125565761255561222e565b5b6000612564848285016123f2565b91505092915050565b600080604083850312156125845761258361222e565b5b600061259285828601612428565b92505060206125a385828601612428565b9150509250929050565b6000602082840312156125c3576125c261222e565b5b60006125d184828501612428565b91505092915050565b6000819050919050565b6125ed816125da565b82525050565b600060208201905061260860008301846125e4565b92915050565b612617816125da565b811461262257600080fd5b50565b6000813590506126348161260e565b92915050565b6000602082840312156126505761264f61222e565b5b600061265e84828501612625565b91505092915050565b612670816123c9565b82525050565b600060208201905061268b6000830184612667565b92915050565b600080600080608085870312156126ab576126aa61222e565b5b60006126b987828801612428565b94505060206126ca87828801612428565b93505060406126db87828801612428565b92505060606126ec87828801612428565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061273f57607f821691505b602082108103612752576127516126f8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061279282612407565b915061279d83612407565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127d2576127d1612758565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061281782612407565b915061282283612407565b925082612832576128316127dd565b5b828204905092915050565b600061284882612407565b915061285383612407565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561288c5761288b612758565b5b828202905092915050565b60006128a282612407565b91506128ad83612407565b9250828210156128c0576128bf612758565b5b828203905092915050565b60006128d682612407565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361290857612907612758565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612949600a836122f9565b915061295482612913565b602082019050919050565b600060208201905081810360008301526129788161293c565b9050919050565b600061298a8261247d565b91506129958361247d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129be576129bd612758565b5b828202905092915050565b6000819050919050565b60006129ee6129e96129e48461247d565b6129c9565b612407565b9050919050565b6129fe816129d3565b82525050565b6000602082019050612a1960008301846129f5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a578161247d565b8114612a6257600080fd5b50565b600081519050612a7481612a4e565b92915050565b600060208284031215612a9057612a8f61222e565b5b6000612a9e84828501612a65565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612add600d836122f9565b9150612ae882612aa7565b602082019050919050565b60006020820190508181036000830152612b0c81612ad0565b905091905056fea2646970667358221220ecba5763a1067c4f87f90ee27874db9cae32767ff5c73b0d52687aa32204573f64736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034483803806200344883398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b1a6200092e60003960008181610cc701528181610f170152611bb901526000818161116701528181611a2a0152611c5801526000818161119301528181611c790152611cbe01526000818161120001528181611238015281816112b00152611a060152612b1a6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b8063a9059cbb1461078d578063ab28cea0146107bd578063b470aade146107db578063c0ab7077146107f9578063d340ef8a1461082957610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f157806395d89b411461070f578063983b2d561461072d5780639da7d8ba1461075d57610286565b806370a08231146105fd578063731f237c1461062d57806374bedb951461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef57806358b2833b1461051f5780636721d4ef1461053d5780636787a9be1461056d5780636a2d094e1461059d5780636ffa8a05146105cd57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a0919061225c565b610943565b6040516102b291906122a4565b60405180910390f35b6102c3610ae9565b6040516102d09190612358565b60405180910390f35b6102f360048036038101906102ee919061240e565b610b77565b60405161030091906122a4565b60405180910390f35b610311610c91565b60405161031e9190612479565b60405180910390f35b61032f610cb3565b60405161033c91906124a3565b60405180910390f35b61034d610cb9565b60405161035a91906124a3565b60405180910390f35b61036b610cc5565b60405161037891906124a3565b60405180910390f35b61039b600480360381019061039691906124be565b610ce9565b6040516103a891906122a4565b60405180910390f35b6103cb60048036038101906103c69190612511565b610e09565b6040516103d891906122a4565b60405180910390f35b6103fb60048036038101906103f6919061253e565b610efc565b60405161040891906124a3565b60405180910390f35b610419610fb0565b60405161042691906124a3565b60405180910390f35b6104496004803603810190610444919061257e565b610fb6565b60405161045691906125c4565b60405180910390f35b6104796004803603810190610474919061240e565b610fda565b60405161048691906122a4565b60405180910390f35b6104a960048036038101906104a49190612511565b61111a565b6040516104b691906124a3565b60405180910390f35b6104d960048036038101906104d4919061257e565b611163565b6040516104e691906124a3565b60405180910390f35b6105096004803603810190610504919061257e565b6111c3565b60405161051691906124a3565b60405180910390f35b6105276111e4565b60405161053491906124a3565b60405180910390f35b6105576004803603810190610552919061253e565b6111ea565b60405161056491906124a3565b60405180910390f35b6105876004803603810190610582919061257e565b61126b565b60405161059491906124a3565b60405180910390f35b6105b760048036038101906105b2919061257e565b6112eb565b6040516105c491906124a3565b60405180910390f35b6105e760048036038101906105e2919061260b565b61130c565b6040516105f491906124a3565b60405180910390f35b61061760048036038101906106129190612511565b611346565b60405161062491906124a3565b60405180910390f35b6106356113fe565b60405161064291906122a4565b60405180910390f35b61065361140f565b60405161066091906124a3565b60405180910390f35b610671611415565b60405161067e91906122a4565b60405180910390f35b6106a1600480360381019061069c919061260b565b6115bc565b6040516106ae91906124a3565b60405180910390f35b6106bf6115ea565b6040516106cc9190612647565b60405180910390f35b6106ef60048036038101906106ea9190612511565b611610565b005b6106f96116ae565b60405161070691906122a4565b60405180910390f35b6107176117f7565b6040516107249190612358565b60405180910390f35b61074760048036038101906107429190612511565b611885565b60405161075491906122a4565b60405180910390f35b6107776004803603810190610772919061260b565b611942565b60405161078491906124a3565b60405180910390f35b6107a760048036038101906107a2919061240e565b61196e565b6040516107b491906122a4565b60405180910390f35b6107c5611a04565b6040516107d291906124a3565b60405180910390f35b6107e3611a28565b6040516107f091906124a3565b60405180910390f35b610813600480360381019061080e919061257e565b611a4c565b60405161082091906122a4565b60405180910390f35b610831611b84565b60405161083e91906124a3565b60405180910390f35b610861600480360381019061085c919061260b565b611b8a565b60405161086e91906124a3565b60405180910390f35b610891600480360381019061088c919061253e565b611b9e565b60405161089e91906124a3565b60405180910390f35b6108af611c52565b6040516108bc9190612479565b60405180910390f35b6108cd611cbc565b6040516108da91906124a3565b60405180910390f35b6108fd60048036038101906108f89190612511565b611ce0565b60405161090a91906122a4565b60405180910390f35b61092d60048036038101906109289190612662565b611d82565b60405161093a91906125c4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af6906126f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b22906126f8565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b826116ae565b50610b8c8361126b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612758565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124a3565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf66116ae565b50610d008461126b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611def565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124a3565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127dd565b905060005b84811015610f895764e8d4a510008284610f5f919061280e565b610f6991906127dd565b83610f749190612868565b92508080610f819061289c565b915050610f45565b5064e8d4a510008583610f9c919061280e565b610fa691906127dd565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612930565b60405180910390fd5b6110716116ae565b5061107b8361126b565b9050826009600082825461108f9190612758565b925050819055506110a08482611e14565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110fe91906124a3565b60405180910390a361110e611ed8565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611191919061280e565b7f00000000000000000000000000000000000000000000000000000000000000006111bc9190612758565b9050919050565b6000603c82426111d39190612868565b6111dd91906127dd565b9050919050565b60035481565b6000806402540be400836111fe919061280e565b7f00000000000000000000000000000000000000000000000000000000000000006112299190612868565b84611234919061280e565b90507f00000000000000000000000000000000000000000000000000000000000000008161126291906127dd565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661129c9190612950565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112da919061280e565b6112e491906127dd565b9050919050565b6000603c82426112fb9190612868565b61130591906127dd565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113558561111a565b92506113626003546111c3565b90506113ae6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113969190612950565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113de919061280e565b82846113ea919061280e565b6113f491906127dd565b9350505050919050565b600061140a6000611a4c565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115ca84611942565b91506115d58461130c565b90506115e182826111ea565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166a57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116c46113fe565b506116cd611f7a565b9750600060010288036116eb576000985050505050505050506117f4565b6116f488611b8a565b95506001866117039190612758565b905061170e86611163565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061174c826112eb565b92506000831115611768576117618584611b9e565b935061176c565b8493505b61177b60008560095484611d82565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117af87612066565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117df91906124a3565b60405180910390a16001985050505050505050505b90565b60078054611804906126f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611830906126f8565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e157600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061197b6116ae565b506119858461126b565b9150611992338684611def565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119f191906124a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a5c6003546111c3565b915060008203611a7157600092505050611b7f565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611ab357508184105b15611abc578391505b611ac68183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b0b919061280e565b600354611b189190612758565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b7091906129d5565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611be291906127dd565b905060005b84811015611c2b5764e8d4a510008284611c01919061280e565b611c0b91906127dd565b83611c169190612758565b92508080611c239061289c565b915050611be7565b5064e8d4a510008583611c3e919061280e565b611c4891906127dd565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ca39190612868565b611cad91906127dd565b611cb79190612758565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d3c57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611dfc85846120f8565b50611e078484611e14565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e705760009350505050611ed2565b611e798661111a565b92508483611e879190612758565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611ef69190612868565b81548110611f0757611f066129f0565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f529190612868565b81548110611f6357611f626129f0565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611f9457611f936129f0565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202c9190612a4b565b6fffffffffffffffffffffffffffffffff16905061204982611b8a565b811161205d57600060010292505050612063565b81925050505b90565b6000806000612074846115bc565b9150600b546120828361126b565b61208c9190612868565b90506120ba600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e14565b506001600a60008282546120ce9190612758565b9250508190555080600b60008282546120e79190612758565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361215457600093505050506121f9565b61215d8661111a565b9250848310156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612ac4565b60405180910390fd5b84836121ae9190612868565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61223981612204565b811461224457600080fd5b50565b60008135905061225681612230565b92915050565b600060208284031215612272576122716121ff565b5b600061228084828501612247565b91505092915050565b60008115159050919050565b61229e81612289565b82525050565b60006020820190506122b96000830184612295565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b83811115612308576000848401525b50505050565b6000601f19601f8301169050919050565b600061232a826122bf565b61233481856122ca565b93506123448185602086016122db565b61234d8161230e565b840191505092915050565b60006020820190508181036000830152612372818461231f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123a58261237a565b9050919050565b6123b58161239a565b81146123c057600080fd5b50565b6000813590506123d2816123ac565b92915050565b6000819050919050565b6123eb816123d8565b81146123f657600080fd5b50565b600081359050612408816123e2565b92915050565b60008060408385031215612425576124246121ff565b5b6000612433858286016123c3565b9250506020612444858286016123f9565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124738161244e565b82525050565b600060208201905061248e600083018461246a565b92915050565b61249d816123d8565b82525050565b60006020820190506124b86000830184612494565b92915050565b6000806000606084860312156124d7576124d66121ff565b5b60006124e5868287016123c3565b93505060206124f6868287016123c3565b9250506040612507868287016123f9565b9150509250925092565b600060208284031215612527576125266121ff565b5b6000612535848285016123c3565b91505092915050565b60008060408385031215612555576125546121ff565b5b6000612563858286016123f9565b9250506020612574858286016123f9565b9150509250929050565b600060208284031215612594576125936121ff565b5b60006125a2848285016123f9565b91505092915050565b6000819050919050565b6125be816125ab565b82525050565b60006020820190506125d960008301846125b5565b92915050565b6125e8816125ab565b81146125f357600080fd5b50565b600081359050612605816125df565b92915050565b600060208284031215612621576126206121ff565b5b600061262f848285016125f6565b91505092915050565b6126418161239a565b82525050565b600060208201905061265c6000830184612638565b92915050565b6000806000806080858703121561267c5761267b6121ff565b5b600061268a878288016123f9565b945050602061269b878288016123f9565b93505060406126ac878288016123f9565b92505060606126bd878288016123f9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061271057607f821691505b602082108103612723576127226126c9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612763826123d8565b915061276e836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127a3576127a2612729565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127e8826123d8565b91506127f3836123d8565b925082612803576128026127ae565b5b828204905092915050565b6000612819826123d8565b9150612824836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561285d5761285c612729565b5b828202905092915050565b6000612873826123d8565b915061287e836123d8565b92508282101561289157612890612729565b5b828203905092915050565b60006128a7826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d9576128d8612729565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061291a600a836122ca565b9150612925826128e4565b602082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b600061295b8261244e565b91506129668361244e565b9250816fffffffffffffffffffffffffffffffff048311821515161561298f5761298e612729565b5b828202905092915050565b6000819050919050565b60006129bf6129ba6129b58461244e565b61299a565b6123d8565b9050919050565b6129cf816129a4565b82525050565b60006020820190506129ea60008301846129c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a288161244e565b8114612a3357600080fd5b50565b600081519050612a4581612a1f565b92915050565b600060208284031215612a6157612a606121ff565b5b6000612a6f84828501612a36565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612aae600d836122ca565b9150612ab982612a78565b602082019050919050565b60006020820190508181036000830152612add81612aa1565b905091905056fea2646970667358221220bcb99f52b4848eb84e80d8d1b7b81e0847d43a502df1061e5e47000b246eae6464736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index fdd6001..36a2e4b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index fc6ec54..ad85e20 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -20,8 +20,6 @@ contract DemurrageTokenSingleCap { // Cached demurrage amount, ppm with 38 digit resolution uint128 public demurrageAmount; - uint256 public demurrageStart; - // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated uint256 public demurrageTimestamp; @@ -115,7 +113,6 @@ contract DemurrageTokenSingleCap { periodStart = demurrageTimestamp; periodDuration = _periodMinutes * 60; demurrageAmount = uint128(nanoDivider) * 100; - demurrageStart = demurrageAmount; taxLevel = _taxLevelMinute; // Represents 38 decimal places bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); @@ -252,7 +249,6 @@ contract DemurrageTokenSingleCap { uint256 currentRedistribution; uint256 grownSupply; - //grownSupply = growBy(totalSupply, 1); grownSupply = totalSupply; currentRedistribution = uint256(redistributions[redistributions.length-1]); currentRedistribution &= (~maskRedistributionValue); From cc1a84f8189fbf24af312f2795fa9aba970aec54 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 27 May 2022 13:22:25 +0000 Subject: [PATCH 09/57] Add catch-up period test --- python/tests/test_redistribution_single.py | 50 ++++++++++++++++++++++ python/tests/test_redistribution_unit.py | 4 -- 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index 28d2d67..a980d9b 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -77,6 +77,56 @@ class TestRedistribution(TestDemurrageDefault): self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + + def test_redistribution_catchup_periods(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + demurrage = (1 - (self.tax_level / 1000000)) * (10**28) + supply = self.default_supply + + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) + self.rpc.do(o) + + self.backend.time_travel(self.start_time + (self.period_seconds * 10)) + + for i in range(1, 11): + logg.debug('checking period {}'.format(i)) + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + i = 10 + o = c.redistributions(self.address, i, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage = c.parse_to_redistribution_item(r) + + o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) + redistribution = self.rpc.do(o) + + o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) + r = self.rpc.do(o) + demurrage_previous = c.parse_to_redistribution_item(r) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_sink = c.parse_balance(r) + + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_minter = c.parse_balance(r) + + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + + self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + + # def test_redistribution_boundaries(self): # nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) # c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index c11bdfa..fdd2f9c 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -62,7 +62,6 @@ class TestRedistribution(TestDemurrageUnit): o = c.get_distribution_from_redistribution(self.address, redistribution, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) - #expected_distribution = self.default_supply * (((self.tax_level * 1.33) - self.tax_level) / 100000) expected_distribution = (self.default_supply * self.tax_level) / 100000 logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) self.assert_within_lower(distribution, expected_distribution, 1000) @@ -184,9 +183,6 @@ class TestRedistribution(TestDemurrageUnit): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) demurrage = c.parse_to_redistribution_item(r) -# o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# demurrage = c.parse_demurrage_amount(r) logg.debug('\nrediistribution {}\ndemurrage {}\nsupply {}'.format(redistribution, demurrage, supply)) expected_balance = int(supply * (self.tax_level / 1000000)) From c5de0e330018b9227473aff7bfa5a5a17c7ffd7b Mon Sep 17 00:00:00 2001 From: lash Date: Sat, 28 May 2022 09:28:10 +0000 Subject: [PATCH 10/57] Reactivate test, expose sinkaddress --- python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 2 +- .../erc20_demurrage_token/data/DemurrageTokenSingleNocap.json | 2 +- python/run_tests.sh | 2 +- solidity/DemurrageTokenSingleNocap.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index f9d352c..2828c3b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034483803806200344883398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b1a6200092e60003960008181610cc701528181610f170152611bb901526000818161116701528181611a2a0152611c5801526000818161119301528181611c790152611cbe01526000818161120001528181611238015281816112b00152611a060152612b1a6000f3fe608060405234801561001057600080fd5b5060043610610286576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b8063a9059cbb1461078d578063ab28cea0146107bd578063b470aade146107db578063c0ab7077146107f9578063d340ef8a1461082957610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f157806395d89b411461070f578063983b2d561461072d5780639da7d8ba1461075d57610286565b806370a08231146105fd578063731f237c1461062d57806374bedb951461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef57806358b2833b1461051f5780636721d4ef1461053d5780636787a9be1461056d5780636a2d094e1461059d5780636ffa8a05146105cd57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a0919061225c565b610943565b6040516102b291906122a4565b60405180910390f35b6102c3610ae9565b6040516102d09190612358565b60405180910390f35b6102f360048036038101906102ee919061240e565b610b77565b60405161030091906122a4565b60405180910390f35b610311610c91565b60405161031e9190612479565b60405180910390f35b61032f610cb3565b60405161033c91906124a3565b60405180910390f35b61034d610cb9565b60405161035a91906124a3565b60405180910390f35b61036b610cc5565b60405161037891906124a3565b60405180910390f35b61039b600480360381019061039691906124be565b610ce9565b6040516103a891906122a4565b60405180910390f35b6103cb60048036038101906103c69190612511565b610e09565b6040516103d891906122a4565b60405180910390f35b6103fb60048036038101906103f6919061253e565b610efc565b60405161040891906124a3565b60405180910390f35b610419610fb0565b60405161042691906124a3565b60405180910390f35b6104496004803603810190610444919061257e565b610fb6565b60405161045691906125c4565b60405180910390f35b6104796004803603810190610474919061240e565b610fda565b60405161048691906122a4565b60405180910390f35b6104a960048036038101906104a49190612511565b61111a565b6040516104b691906124a3565b60405180910390f35b6104d960048036038101906104d4919061257e565b611163565b6040516104e691906124a3565b60405180910390f35b6105096004803603810190610504919061257e565b6111c3565b60405161051691906124a3565b60405180910390f35b6105276111e4565b60405161053491906124a3565b60405180910390f35b6105576004803603810190610552919061253e565b6111ea565b60405161056491906124a3565b60405180910390f35b6105876004803603810190610582919061257e565b61126b565b60405161059491906124a3565b60405180910390f35b6105b760048036038101906105b2919061257e565b6112eb565b6040516105c491906124a3565b60405180910390f35b6105e760048036038101906105e2919061260b565b61130c565b6040516105f491906124a3565b60405180910390f35b61061760048036038101906106129190612511565b611346565b60405161062491906124a3565b60405180910390f35b6106356113fe565b60405161064291906122a4565b60405180910390f35b61065361140f565b60405161066091906124a3565b60405180910390f35b610671611415565b60405161067e91906122a4565b60405180910390f35b6106a1600480360381019061069c919061260b565b6115bc565b6040516106ae91906124a3565b60405180910390f35b6106bf6115ea565b6040516106cc9190612647565b60405180910390f35b6106ef60048036038101906106ea9190612511565b611610565b005b6106f96116ae565b60405161070691906122a4565b60405180910390f35b6107176117f7565b6040516107249190612358565b60405180910390f35b61074760048036038101906107429190612511565b611885565b60405161075491906122a4565b60405180910390f35b6107776004803603810190610772919061260b565b611942565b60405161078491906124a3565b60405180910390f35b6107a760048036038101906107a2919061240e565b61196e565b6040516107b491906122a4565b60405180910390f35b6107c5611a04565b6040516107d291906124a3565b60405180910390f35b6107e3611a28565b6040516107f091906124a3565b60405180910390f35b610813600480360381019061080e919061257e565b611a4c565b60405161082091906122a4565b60405180910390f35b610831611b84565b60405161083e91906124a3565b60405180910390f35b610861600480360381019061085c919061260b565b611b8a565b60405161086e91906124a3565b60405180910390f35b610891600480360381019061088c919061253e565b611b9e565b60405161089e91906124a3565b60405180910390f35b6108af611c52565b6040516108bc9190612479565b60405180910390f35b6108cd611cbc565b6040516108da91906124a3565b60405180910390f35b6108fd60048036038101906108f89190612511565b611ce0565b60405161090a91906122a4565b60405180910390f35b61092d60048036038101906109289190612662565b611d82565b60405161093a91906125c4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af6906126f8565b80601f0160208091040260200160405190810160405280929190818152602001828054610b22906126f8565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b826116ae565b50610b8c8361126b565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612758565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124a3565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf66116ae565b50610d008461126b565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611def565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124a3565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127dd565b905060005b84811015610f895764e8d4a510008284610f5f919061280e565b610f6991906127dd565b83610f749190612868565b92508080610f819061289c565b915050610f45565b5064e8d4a510008583610f9c919061280e565b610fa691906127dd565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612930565b60405180910390fd5b6110716116ae565b5061107b8361126b565b9050826009600082825461108f9190612758565b925050819055506110a08482611e14565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516110fe91906124a3565b60405180910390a361110e611ed8565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611191919061280e565b7f00000000000000000000000000000000000000000000000000000000000000006111bc9190612758565b9050919050565b6000603c82426111d39190612868565b6111dd91906127dd565b9050919050565b60035481565b6000806402540be400836111fe919061280e565b7f00000000000000000000000000000000000000000000000000000000000000006112299190612868565b84611234919061280e565b90507f00000000000000000000000000000000000000000000000000000000000000008161126291906127dd565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661129c9190612950565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836112da919061280e565b6112e491906127dd565b9050919050565b6000603c82426112fb9190612868565b61130591906127dd565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113558561111a565b92506113626003546111c3565b90506113ae6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113969190612950565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006113de919061280e565b82846113ea919061280e565b6113f491906127dd565b9350505050919050565b600061140a6000611a4c565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b60008060006115ca84611942565b91506115d58461130c565b90506115e182826111ea565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461166a57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060008060008060006116c46113fe565b506116cd611f7a565b9750600060010288036116eb576000985050505050505050506117f4565b6116f488611b8a565b95506001866117039190612758565b905061170e86611163565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061174c826112eb565b92506000831115611768576117618584611b9e565b935061176c565b8493505b61177b60008560095484611d82565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117af87612066565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516117df91906124a3565b60405180910390a16001985050505050505050505b90565b60078054611804906126f8565b80601f0160208091040260200160405190810160405280929190818152602001828054611830906126f8565b801561187d5780601f106118525761010080835404028352916020019161187d565b820191906000526020600020905b81548152906001019060200180831161186057829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118e157600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600080600061197b6116ae565b506119858461126b565b9150611992338684611def565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516119f191906124a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611a5c6003546111c3565b915060008203611a7157600092505050611b7f565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611ab357508184105b15611abc578391505b611ac68183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b0b919061280e565b600354611b189190612758565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611b7091906129d5565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611be291906127dd565b905060005b84811015611c2b5764e8d4a510008284611c01919061280e565b611c0b91906127dd565b83611c169190612758565b92508080611c239061289c565b915050611be7565b5064e8d4a510008583611c3e919061280e565b611c4891906127dd565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ca39190612868565b611cad91906127dd565b611cb79190612758565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d3c57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611dfc85846120f8565b50611e078484611e14565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611e705760009350505050611ed2565b611e798661111a565b92508483611e879190612758565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611ef69190612868565b81548110611f0757611f066129f0565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611f529190612868565b81548110611f6357611f626129f0565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611f9457611f936129f0565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612008573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202c9190612a4b565b6fffffffffffffffffffffffffffffffff16905061204982611b8a565b811161205d57600060010292505050612063565b81925050505b90565b6000806000612074846115bc565b9150600b546120828361126b565b61208c9190612868565b90506120ba600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e14565b506001600a60008282546120ce9190612758565b9250508190555080600b60008282546120e79190612758565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361215457600093505050506121f9565b61215d8661111a565b9250848310156121a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219990612ac4565b60405180910390fd5b84836121ae9190612868565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61223981612204565b811461224457600080fd5b50565b60008135905061225681612230565b92915050565b600060208284031215612272576122716121ff565b5b600061228084828501612247565b91505092915050565b60008115159050919050565b61229e81612289565b82525050565b60006020820190506122b96000830184612295565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122f95780820151818401526020810190506122de565b83811115612308576000848401525b50505050565b6000601f19601f8301169050919050565b600061232a826122bf565b61233481856122ca565b93506123448185602086016122db565b61234d8161230e565b840191505092915050565b60006020820190508181036000830152612372818461231f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123a58261237a565b9050919050565b6123b58161239a565b81146123c057600080fd5b50565b6000813590506123d2816123ac565b92915050565b6000819050919050565b6123eb816123d8565b81146123f657600080fd5b50565b600081359050612408816123e2565b92915050565b60008060408385031215612425576124246121ff565b5b6000612433858286016123c3565b9250506020612444858286016123f9565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124738161244e565b82525050565b600060208201905061248e600083018461246a565b92915050565b61249d816123d8565b82525050565b60006020820190506124b86000830184612494565b92915050565b6000806000606084860312156124d7576124d66121ff565b5b60006124e5868287016123c3565b93505060206124f6868287016123c3565b9250506040612507868287016123f9565b9150509250925092565b600060208284031215612527576125266121ff565b5b6000612535848285016123c3565b91505092915050565b60008060408385031215612555576125546121ff565b5b6000612563858286016123f9565b9250506020612574858286016123f9565b9150509250929050565b600060208284031215612594576125936121ff565b5b60006125a2848285016123f9565b91505092915050565b6000819050919050565b6125be816125ab565b82525050565b60006020820190506125d960008301846125b5565b92915050565b6125e8816125ab565b81146125f357600080fd5b50565b600081359050612605816125df565b92915050565b600060208284031215612621576126206121ff565b5b600061262f848285016125f6565b91505092915050565b6126418161239a565b82525050565b600060208201905061265c6000830184612638565b92915050565b6000806000806080858703121561267c5761267b6121ff565b5b600061268a878288016123f9565b945050602061269b878288016123f9565b93505060406126ac878288016123f9565b92505060606126bd878288016123f9565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061271057607f821691505b602082108103612723576127226126c9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612763826123d8565b915061276e836123d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127a3576127a2612729565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127e8826123d8565b91506127f3836123d8565b925082612803576128026127ae565b5b828204905092915050565b6000612819826123d8565b9150612824836123d8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561285d5761285c612729565b5b828202905092915050565b6000612873826123d8565b915061287e836123d8565b92508282101561289157612890612729565b5b828203905092915050565b60006128a7826123d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128d9576128d8612729565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061291a600a836122ca565b9150612925826128e4565b602082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b600061295b8261244e565b91506129668361244e565b9250816fffffffffffffffffffffffffffffffff048311821515161561298f5761298e612729565b5b828202905092915050565b6000819050919050565b60006129bf6129ba6129b58461244e565b61299a565b6123d8565b9050919050565b6129cf816129a4565b82525050565b60006020820190506129ea60008301846129c6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a288161244e565b8114612a3357600080fd5b50565b600081519050612a4581612a1f565b92915050565b600060208284031215612a6157612a606121ff565b5b6000612a6f84828501612a36565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612aae600d836122ca565b9150612ab982612a78565b602082019050919050565b60006020820190508181036000830152612add81612aa1565b905091905056fea2646970667358221220bcb99f52b4848eb84e80d8d1b7b81e0847d43a502df1061e5e47000b246eae6464736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034973803806200349783398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b696200092e60003960008181610cf001528181610f400152611c0801526000818161119001528181611a790152611ca70152600081816111bc01528181611cc80152611d0d01526000818161122901528181611261015281816112d90152611a550152612b696000f3fe608060405234801561001057600080fd5b5060043610610291576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b8063731f237c1461063857806374bedb951461065657806379ba50971461067457806384dde4af146106925780638d34855a146106b057610291565b806340452d911161020757806358b2833b116101cb57806358b2833b1461052a5780636721d4ef146105485780636787a9be146105785780636a2d094e146105a85780636ffa8a05146105d857806370a082311461060857610291565b806340452d911461043a578063449a52f81461046a57806347a505171461049a5780634abfbba2146104ca57806351b4541c146104fa57610291565b80631989c6a8116102595780631989c6a814610350578063229ba1971461036e57806323b872dd1461038c5780633092afd5146103bc57806331333487146103ec578063313ce5671461041c57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c1461031457806318160ddd14610332575b600080fd5b6102b060048036038101906102ab91906122ab565b61096c565b6040516102bd91906122f3565b60405180910390f35b6102ce610b12565b6040516102db91906123a7565b60405180910390f35b6102fe60048036038101906102f9919061245d565b610ba0565b60405161030b91906122f3565b60405180910390f35b61031c610cba565b60405161032991906124c8565b60405180910390f35b61033a610cdc565b60405161034791906124f2565b60405180910390f35b610358610ce2565b60405161036591906124f2565b60405180910390f35b610376610cee565b60405161038391906124f2565b60405180910390f35b6103a660048036038101906103a1919061250d565b610d12565b6040516103b391906122f3565b60405180910390f35b6103d660048036038101906103d19190612560565b610e32565b6040516103e391906122f3565b60405180910390f35b6104066004803603810190610401919061258d565b610f25565b60405161041391906124f2565b60405180910390f35b610424610fd9565b60405161043191906124f2565b60405180910390f35b610454600480360381019061044f91906125cd565b610fdf565b6040516104619190612613565b60405180910390f35b610484600480360381019061047f919061245d565b611003565b60405161049191906122f3565b60405180910390f35b6104b460048036038101906104af9190612560565b611143565b6040516104c191906124f2565b60405180910390f35b6104e460048036038101906104df91906125cd565b61118c565b6040516104f191906124f2565b60405180910390f35b610514600480360381019061050f91906125cd565b6111ec565b60405161052191906124f2565b60405180910390f35b61053261120d565b60405161053f91906124f2565b60405180910390f35b610562600480360381019061055d919061258d565b611213565b60405161056f91906124f2565b60405180910390f35b610592600480360381019061058d91906125cd565b611294565b60405161059f91906124f2565b60405180910390f35b6105c260048036038101906105bd91906125cd565b611314565b6040516105cf91906124f2565b60405180910390f35b6105f260048036038101906105ed919061265a565b611335565b6040516105ff91906124f2565b60405180910390f35b610622600480360381019061061d9190612560565b61136f565b60405161062f91906124f2565b60405180910390f35b610640611427565b60405161064d91906122f3565b60405180910390f35b61065e611438565b60405161066b91906124f2565b60405180910390f35b61067c61143e565b60405161068991906122f3565b60405180910390f35b61069a6115e5565b6040516106a79190612696565b60405180910390f35b6106ca60048036038101906106c5919061265a565b61160b565b6040516106d791906124f2565b60405180910390f35b6106e8611639565b6040516106f59190612696565b60405180910390f35b61071860048036038101906107139190612560565b61165f565b005b6107226116fd565b60405161072f91906122f3565b60405180910390f35b610740611846565b60405161074d91906123a7565b60405180910390f35b610770600480360381019061076b9190612560565b6118d4565b60405161077d91906122f3565b60405180910390f35b6107a0600480360381019061079b919061265a565b611991565b6040516107ad91906124f2565b60405180910390f35b6107d060048036038101906107cb919061245d565b6119bd565b6040516107dd91906122f3565b60405180910390f35b6107ee611a53565b6040516107fb91906124f2565b60405180910390f35b61080c611a77565b60405161081991906124f2565b60405180910390f35b61083c600480360381019061083791906125cd565b611a9b565b60405161084991906122f3565b60405180910390f35b61085a611bd3565b60405161086791906124f2565b60405180910390f35b61088a6004803603810190610885919061265a565b611bd9565b60405161089791906124f2565b60405180910390f35b6108ba60048036038101906108b5919061258d565b611bed565b6040516108c791906124f2565b60405180910390f35b6108d8611ca1565b6040516108e591906124c8565b60405180910390f35b6108f6611d0b565b60405161090391906124f2565b60405180910390f35b61092660048036038101906109219190612560565b611d2f565b60405161093391906122f3565b60405180910390f35b610956600480360381019061095191906126b1565b611dd1565b6040516109639190612613565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60068054610b1f90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612747565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116fd565b50610bb583611294565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4391906127a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124f2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d1f6116fd565b50610d2984611294565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610db457600080fd5b610dbf868684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e1e91906124f2565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ebb57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ec457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f69919061282c565b905060005b84811015610fb25764e8d4a510008284610f88919061285d565b610f92919061282c565b83610f9d91906128b7565b92508080610faa906128eb565b915050610f6e565b5064e8d4a510008583610fc5919061285d565b610fcf919061282c565b9250505092915050565b60085481565b60008181548110610fef57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061297f565b60405180910390fd5b61109a6116fd565b506110a483611294565b905082600960008282546110b891906127a7565b925050819055506110c98482611e63565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112791906124f2565b60405180910390a3611137611f27565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111ba919061285d565b7f00000000000000000000000000000000000000000000000000000000000000006111e591906127a7565b9050919050565b6000603c82426111fc91906128b7565b611206919061282c565b9050919050565b60035481565b6000806402540be40083611227919061285d565b7f000000000000000000000000000000000000000000000000000000000000000061125291906128b7565b8461125d919061285d565b90507f00000000000000000000000000000000000000000000000000000000000000008161128b919061282c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112c5919061299f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611303919061285d565b61130d919061282c565b9050919050565b6000603c824261132491906128b7565b61132e919061282c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061137e85611143565b925061138b6003546111ec565b90506113d76402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113bf919061299f565b6fffffffffffffffffffffffffffffffff1682610f25565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611407919061285d565b8284611413919061285d565b61141d919061282c565b9350505050919050565b60006114336000611a9b565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061161984611991565b915061162484611335565b90506116308282611213565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b957600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611713611427565b5061171c611fc9565b97506000600102880361173a57600098505050505050505050611843565b61174388611bd9565b955060018661175291906127a7565b905061175d8661118c565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179b82611314565b925060008311156117b7576117b08584611bed565b93506117bb565b8493505b6117ca60008560095484611dd1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117fe876120b5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161182e91906124f2565b60405180910390a16001985050505050505050505b90565b6007805461185390612747565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612747565b80156118cc5780601f106118a1576101008083540402835291602001916118cc565b820191906000526020600020905b8154815290600101906020018083116118af57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193057600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119ca6116fd565b506119d484611294565b91506119e1338684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4091906124f2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aab6003546111ec565b915060008203611ac057600092505050611bce565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0257508184105b15611b0b578391505b611b158183610f25565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b5a919061285d565b600354611b6791906127a7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bbf9190612a24565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c31919061282c565b905060005b84811015611c7a5764e8d4a510008284611c50919061285d565b611c5a919061282c565b83611c6591906127a7565b92508080611c72906128eb565b915050611c36565b5064e8d4a510008583611c8d919061285d565b611c97919061282c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf291906128b7565b611cfc919061282c565b611d0691906127a7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4b8584612147565b50611e568484611e63565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ebf5760009350505050611f21565b611ec886611143565b92508483611ed691906127a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f4591906128b7565b81548110611f5657611f55612a3f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa191906128b7565b81548110611fb257611fb1612a3f565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611fe357611fe2612a3f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190612a9a565b6fffffffffffffffffffffffffffffffff16905061209882611bd9565b81116120ac576000600102925050506120b2565b81925050505b90565b60008060006120c38461160b565b9150600b546120d183611294565b6120db91906128b7565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e63565b506001600a600082825461211d91906127a7565b9250508190555080600b600082825461213691906127a7565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121a35760009350505050612248565b6121ac86611143565b9250848310156121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890612b13565b60405180910390fd5b84836121fd91906128b7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61228881612253565b811461229357600080fd5b50565b6000813590506122a58161227f565b92915050565b6000602082840312156122c1576122c061224e565b5b60006122cf84828501612296565b91505092915050565b60008115159050919050565b6122ed816122d8565b82525050565b600060208201905061230860008301846122e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561234857808201518184015260208101905061232d565b83811115612357576000848401525b50505050565b6000601f19601f8301169050919050565b60006123798261230e565b6123838185612319565b935061239381856020860161232a565b61239c8161235d565b840191505092915050565b600060208201905081810360008301526123c1818461236e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f4826123c9565b9050919050565b612404816123e9565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000819050919050565b61243a81612427565b811461244557600080fd5b50565b60008135905061245781612431565b92915050565b600080604083850312156124745761247361224e565b5b600061248285828601612412565b925050602061249385828601612448565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124c28161249d565b82525050565b60006020820190506124dd60008301846124b9565b92915050565b6124ec81612427565b82525050565b600060208201905061250760008301846124e3565b92915050565b6000806000606084860312156125265761252561224e565b5b600061253486828701612412565b935050602061254586828701612412565b925050604061255686828701612448565b9150509250925092565b6000602082840312156125765761257561224e565b5b600061258484828501612412565b91505092915050565b600080604083850312156125a4576125a361224e565b5b60006125b285828601612448565b92505060206125c385828601612448565b9150509250929050565b6000602082840312156125e3576125e261224e565b5b60006125f184828501612448565b91505092915050565b6000819050919050565b61260d816125fa565b82525050565b60006020820190506126286000830184612604565b92915050565b612637816125fa565b811461264257600080fd5b50565b6000813590506126548161262e565b92915050565b6000602082840312156126705761266f61224e565b5b600061267e84828501612645565b91505092915050565b612690816123e9565b82525050565b60006020820190506126ab6000830184612687565b92915050565b600080600080608085870312156126cb576126ca61224e565b5b60006126d987828801612448565b94505060206126ea87828801612448565b93505060406126fb87828801612448565b925050606061270c87828801612448565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275f57607f821691505b60208210810361277257612771612718565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127b282612427565b91506127bd83612427565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127f2576127f1612778565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283782612427565b915061284283612427565b925082612852576128516127fd565b5b828204905092915050565b600061286882612427565b915061287383612427565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128ac576128ab612778565b5b828202905092915050565b60006128c282612427565b91506128cd83612427565b9250828210156128e0576128df612778565b5b828203905092915050565b60006128f682612427565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361292857612927612778565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612969600a83612319565b915061297482612933565b602082019050919050565b600060208201905081810360008301526129988161295c565b9050919050565b60006129aa8261249d565b91506129b58361249d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129de576129dd612778565b5b828202905092915050565b6000819050919050565b6000612a0e612a09612a048461249d565b6129e9565b612427565b9050919050565b612a1e816129f3565b82525050565b6000602082019050612a396000830184612a15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a778161249d565b8114612a8257600080fd5b50565b600081519050612a9481612a6e565b92915050565b600060208284031215612ab057612aaf61224e565b5b6000612abe84828501612a85565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612afd600d83612319565b9150612b0882612ac7565b602082019050919050565b60006020820190508181036000830152612b2c81612af0565b905091905056fea264697066735822122065b90287fa7f2775639ada07b04e464a1dddb8f8c5f37cf825ec850b55ac7deb64736f6c634300080d0033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 36a2e4b..d4ed49d 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/run_tests.sh b/python/run_tests.sh index acab7d4..4f3e2de 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -22,7 +22,7 @@ done modes=(SingleNocap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py - #ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py + ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done modes=(MultiCap SingleCap) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index ad85e20..e4cc11c 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -72,7 +72,7 @@ contract DemurrageTokenSingleCap { mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage) // Address to send unallocated redistribution tokens - address sinkAddress; + address public sinkAddress; // Implements ERC20 event Transfer(address indexed _from, address indexed _to, uint256 _value); From 84b1a5b439f59340caddb7feee134e28213654c0 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 8 Feb 2023 08:44:37 +0000 Subject: [PATCH 11/57] Return redistributions type correctly --- .../data/DemurrageTokenMultiCap.bin | 2 +- .../data/DemurrageTokenMultiNocap.bin | 2 +- .../data/DemurrageTokenSingleCap.bin | 2 +- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/demurrage.py | 3 +- python/erc20_demurrage_token/token.py | 173 +++++++++--- python/run_tests.sh | 9 +- python/tests/test_basic.py | 53 +++- python/tests/test_growth.py | 36 +-- python/tests/test_redistribution_single.py | 25 +- python/tests/test_redistribution_unit.py | 1 + solidity/DemurrageTokenSingleNocap.sol | 259 +++++++++++++----- 13 files changed, 420 insertions(+), 149 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin index 66b6ceb..98b7c28 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiCap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200040d565b6080908152503480156200003757600080fd5b5060405162003c0d38038062003c0d83398181016040528101906200005d9190620006df565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200013092919062000324565b5085600790805190602001906200014992919062000324565b508460ff166008819055504260038190555060035460a08181525050603c836200017491906200040d565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200019a91906200040d565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001ff6000620f42406000600162000298640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000284919062000924565b600b819055505050505050505050620009d9565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033290620009a4565b90600052602060002090601f016020900481019282620003565760008555620003a2565b82601f106200037157805160ff1916838001178555620003a2565b82800160010185558215620003a2579182015b82811115620003a157825182559160200191906001019062000384565b5b509050620003b19190620003b5565b5090565b5b80821115620003d0576000816000905550600101620003b6565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041a82620003d4565b91506200042783620003d4565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620004635762000462620003de565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d7826200048c565b810181811067ffffffffffffffff82111715620004f957620004f86200049d565b5b80604052505050565b60006200050e6200046e565b90506200051c8282620004cc565b919050565b600067ffffffffffffffff8211156200053f576200053e6200049d565b5b6200054a826200048c565b9050602081019050919050565b60005b83811015620005775780820151818401526020810190506200055a565b8381111562000587576000848401525b50505050565b6000620005a46200059e8462000521565b62000502565b905082815260208101848484011115620005c357620005c262000487565b5b620005d084828562000557565b509392505050565b600082601f830112620005f057620005ef62000482565b5b8151620006028482602086016200058d565b91505092915050565b600060ff82169050919050565b62000623816200060b565b81146200062f57600080fd5b50565b600081519050620006438162000618565b92915050565b6200065481620003d4565b81146200066057600080fd5b50565b600081519050620006748162000649565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006a7826200067a565b9050919050565b620006b9816200069a565b8114620006c557600080fd5b50565b600081519050620006d981620006ae565b92915050565b600080600080600080600060e0888a03121562000701576200070062000478565b5b600088015167ffffffffffffffff8111156200072257620007216200047d565b5b620007308a828b01620005d8565b975050602088015167ffffffffffffffff8111156200075457620007536200047d565b5b620007628a828b01620005d8565b9650506040620007758a828b0162000632565b9550506060620007888a828b0162000663565b94505060806200079b8a828b0162000663565b93505060a0620007ae8a828b01620006c8565b92505060c0620007c18a828b0162000663565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200082f57808604811115620008075762000806620003de565b5b6001851615620008175780820291505b80810290506200082785620007d0565b9450620007e7565b94509492505050565b6000826200084a57600190506200091d565b816200085a57600090506200091d565b81600181146200087357600281146200087e57620008b4565b60019150506200091d565b60ff841115620008935762000892620003de565b5b8360020a915084821115620008ad57620008ac620003de565b5b506200091d565b5060208310610133831016604e8410600b8410161715620008ee5782820a905083811115620008e857620008e7620003de565b5b6200091d565b620008fd8484846001620007dd565b92509050818404811115620009175762000916620003de565b5b81810290505b9392505050565b60006200093182620003d4565b91506200093e83620003d4565b92506200096d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000838565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009bd57607f821691505b602082108103620009d357620009d262000975565b5b50919050565b60805160a05160c05160e0516131bb62000a5260003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131bb6000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a3e565b60405180910390f35b6102e860048036038101906102e39190612af4565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b5f565b60405180910390f35b610324610c96565b6040516103319190612b89565b60405180910390f35b610342610c9c565b60405161034f9190612b89565b60405180910390f35b610372600480360381019061036d9190612ba4565b610ca8565b60405161037f9190612b89565b60405180910390f35b610390610d2d565b60405161039d9190612b89565b60405180910390f35b6103c060048036038101906103bb9190612be4565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c37565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612ba4565b610f6e565b60405161042d9190612b89565b60405180910390f35b61043e61101f565b60405161044b9190612b89565b60405180910390f35b61046e60048036038101906104699190612c37565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c64565b611224565b6040516104ab9190612caa565b60405180910390f35b6104ce60048036038101906104c99190612cf1565b611248565b6040516104db9190612b89565b60405180910390f35b6104fe60048036038101906104f99190612af4565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c37565b61139f565b60405161053b9190612b89565b60405180910390f35b61055e60048036038101906105599190612c64565b6113f7565b60405161056b9190612b89565b60405180910390f35b61058e60048036038101906105899190612c64565b611457565b60405161059b9190612b89565b60405180910390f35b6105ac611478565b6040516105b99190612b89565b60405180910390f35b6105ca61147e565b6040516105d79190612b89565b60405180910390f35b6105fa60048036038101906105f59190612c64565b611484565b6040516106079190612b89565b60405180910390f35b61062a60048036038101906106259190612c64565b6114f0565b6040516106379190612b89565b60405180910390f35b61065a60048036038101906106559190612c37565b611511565b6040516106679190612b89565b60405180910390f35b61068a60048036038101906106859190612cf1565b61157c565b6040516106979190612b89565b60405180910390f35b6106ba60048036038101906106b59190612c37565b6115af565b6040516106c79190612b89565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d2d565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b89565b60405180910390f35b61076e611b01565b60405161077b9190612a3e565b60405180910390f35b61079e60048036038101906107999190612c37565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612cf1565b611c4c565b6040516107db9190612b89565b60405180910390f35b6107fe60048036038101906107f99190612af4565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b89565b60405180910390f35b61083a611d3c565b6040516108479190612b89565b60405180910390f35b61086a60048036038101906108659190612cf1565b611d60565b6040516108779190612b89565b60405180910390f35b61089a60048036038101906108959190612ba4565b611d74565b6040516108a79190612b89565b60405180910390f35b6108b8611e25565b6040516108c59190612b5f565b60405180910390f35b6108d6611e8f565b6040516108e39190612b89565b60405180910390f35b61090660048036038101906109019190612c37565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d77565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dd7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b89565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e79565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612ec8565b91508482610d159190612ef9565b90508084610d239190612f53565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b89565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612ec8565b905060005b84811015610ffa57620f42408284610fd09190612ef9565b610fda9190612ec8565b83610fe59190612f53565b92508080610ff290612f87565b915050610fb8565b50620f4240858361100b9190612ef9565b6110159190612ec8565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f53565b8154811061109957611098612fcf565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612ec8565b86886111299190612ec8565b6111339190612ef9565b61113d9190612ec8565b9350620f4240818561114f9190612ef9565b6111599190612ec8565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b89565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dd7565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dd7565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b89565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ef9565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dd7565b9050919050565b6000603c82426114679190612f53565b6114719190612ec8565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ef9565b6114df9190612ef9565b6114e99190612ec8565b9050919050565b6000603c82426115009190612f53565b61150a9190612ec8565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ef9565b82846116449190612ef9565b61164e9190612ec8565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ef9565b60035461170e9190612dd7565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190613039565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dd7565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612ec8565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612ec8565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b89565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d77565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d77565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b89565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612ec8565b905060005b84811015611e0057620f42408284611dd69190612ef9565b611de09190612ec8565b83611deb9190612dd7565b92508080611df890612f87565b915050611dbe565b50620f42408583611e119190612ef9565b611e1b9190612ec8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f53565b611e809190612ec8565b611e8a9190612dd7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dd7565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d7906130a0565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f53565b8154811061217c5761217b612fcf565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f53565b815481106121da576121d9612fcf565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f53565b8154811061221957612218612fcf565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130ec565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ef9565b6123c49190612ec8565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ef9565b6124009190612ec8565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f53565b8154811061244c5761244b612fcf565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f53565b815481106124b4576124b3612fcf565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612ec8565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f53565b8154811061257757612576612fcf565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f53565b815481106125b1576125b0612fcf565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f53565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613165565b60405180910390fd5b84836126c19190612f53565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f53565b8154811061283e5761283d612fcf565b5b90600052602060002001549250600161285684611248565b6128609190612dd7565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f53565b815481106128cd576128cc612fcf565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b838111156129ee576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a10826129a5565b612a1a81856129b0565b9350612a2a8185602086016129c1565b612a33816129f4565b840191505092915050565b60006020820190508181036000830152612a588184612a05565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8b82612a60565b9050919050565b612a9b81612a80565b8114612aa657600080fd5b50565b600081359050612ab881612a92565b92915050565b6000819050919050565b612ad181612abe565b8114612adc57600080fd5b50565b600081359050612aee81612ac8565b92915050565b60008060408385031215612b0b57612b0a6128e5565b5b6000612b1985828601612aa9565b9250506020612b2a85828601612adf565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5981612b34565b82525050565b6000602082019050612b746000830184612b50565b92915050565b612b8381612abe565b82525050565b6000602082019050612b9e6000830184612b7a565b92915050565b60008060408385031215612bbb57612bba6128e5565b5b6000612bc985828601612adf565b9250506020612bda85828601612adf565b9150509250929050565b600080600060608486031215612bfd57612bfc6128e5565b5b6000612c0b86828701612aa9565b9350506020612c1c86828701612aa9565b9250506040612c2d86828701612adf565b9150509250925092565b600060208284031215612c4d57612c4c6128e5565b5b6000612c5b84828501612aa9565b91505092915050565b600060208284031215612c7a57612c796128e5565b5b6000612c8884828501612adf565b91505092915050565b6000819050919050565b612ca481612c91565b82525050565b6000602082019050612cbf6000830184612c9b565b92915050565b612cce81612c91565b8114612cd957600080fd5b50565b600081359050612ceb81612cc5565b92915050565b600060208284031215612d0757612d066128e5565b5b6000612d1584828501612cdc565b91505092915050565b612d2781612a80565b82525050565b6000602082019050612d426000830184612d1e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8f57607f821691505b602082108103612da257612da1612d48565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612de282612abe565b9150612ded83612abe565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e2257612e21612da8565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e636011836129b0565b9150612e6e82612e2d565b602082019050919050565b60006020820190508181036000830152612e9281612e56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed382612abe565b9150612ede83612abe565b925082612eee57612eed612e99565b5b828204905092915050565b6000612f0482612abe565b9150612f0f83612abe565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f4857612f47612da8565b5b828202905092915050565b6000612f5e82612abe565b9150612f6983612abe565b925082821015612f7c57612f7b612da8565b5b828203905092915050565b6000612f9282612abe565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fc457612fc3612da8565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061302361301e61301984612b34565b612ffe565b612abe565b9050919050565b61303381613008565b82525050565b600060208201905061304e600083018461302a565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b600061308a600d836129b0565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b6130c981612b34565b81146130d457600080fd5b50565b6000815190506130e6816130c0565b92915050565b600060208284031215613102576131016128e5565b5b6000613110848285016130d7565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061314f600d836129b0565b915061315a82613119565b602082019050919050565b6000602082019050818103600083015261317e81613142565b905091905056fea2646970667358221220584c6761a6f53a48d12b32828df80bf173ed868c2802527ff2ebbdb3cc94fd7664736f6c634300080d0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef81000000006200002491906200034f565b6080908152503480156200003757600080fd5b5060405162003db638038062003db683398181016040528101906200005d919062000601565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000129919062000939565b5085600790816200013b919062000939565b508460ff166008819055504260038190555060035460a08181525050603c836200016691906200034f565b60c08181525050620f42406d04ee2d6d415b85acef81000000006200018c91906200034f565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508360e081815250506000620001f16000620f4240600060016200028a640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a62000276919062000b74565b600b81905550505050505050505062000bc5565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200035c8262000316565b9150620003698362000316565b9250828202620003798162000316565b9150828204841483151762000393576200039262000320565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200040382620003b8565b810181811067ffffffffffffffff82111715620004255762000424620003c9565b5b80604052505050565b60006200043a6200039a565b9050620004488282620003f8565b919050565b600067ffffffffffffffff8211156200046b576200046a620003c9565b5b6200047682620003b8565b9050602081019050919050565b60005b83811015620004a357808201518184015260208101905062000486565b60008484015250505050565b6000620004c6620004c0846200044d565b6200042e565b905082815260208101848484011115620004e557620004e4620003b3565b5b620004f284828562000483565b509392505050565b600082601f830112620005125762000511620003ae565b5b815162000524848260208601620004af565b91505092915050565b600060ff82169050919050565b62000545816200052d565b81146200055157600080fd5b50565b60008151905062000565816200053a565b92915050565b620005768162000316565b81146200058257600080fd5b50565b60008151905062000596816200056b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005c9826200059c565b9050919050565b620005db81620005bc565b8114620005e757600080fd5b50565b600081519050620005fb81620005d0565b92915050565b600080600080600080600060e0888a031215620006235762000622620003a4565b5b600088015167ffffffffffffffff811115620006445762000643620003a9565b5b620006528a828b01620004fa565b975050602088015167ffffffffffffffff811115620006765762000675620003a9565b5b620006848a828b01620004fa565b9650506040620006978a828b0162000554565b9550506060620006aa8a828b0162000585565b9450506080620006bd8a828b0162000585565b93505060a0620006d08a828b01620005ea565b92505060c0620006e38a828b0162000585565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200074557607f821691505b6020821081036200075b576200075a620006fd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007c87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000786565b620007d4868362000786565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000817620008116200080b8462000316565b620007ec565b62000316565b9050919050565b6000819050919050565b6200083383620007f6565b6200084b62000842826200081e565b84845462000796565b825550505050565b600090565b6200086262000853565b6200086f81848462000828565b505050565b5b8181101562000897576200088b60008262000858565b60018101905062000875565b5050565b601f821115620008e657620008b08162000761565b620008bb8462000776565b81016020851015620008cb578190505b620008e3620008da8562000776565b83018262000874565b50505b505050565b60008160020a8304905092915050565b60006200090e60001984600802620008eb565b1980831691505092915050565b6000620009298383620008fb565b9150826002028217905092915050565b6200094482620006f2565b67ffffffffffffffff81111562000960576200095f620003c9565b5b6200096c82546200072c565b620009798282856200089b565b600060209050601f831160018114620009b157600084156200099c578287015190505b620009a885826200091b565b86555062000a18565b601f198416620009c18662000761565b60005b82811015620009eb57848901518255600182019150602085019450602081019050620009c4565b8683101562000a0b578489015162000a07601f891682620008fb565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000a7f5780860481111562000a575762000a5662000320565b5b600185161562000a675780820291505b808102905062000a778562000a20565b945062000a37565b94509492505050565b60008262000a9a576001905062000b6d565b8162000aaa576000905062000b6d565b816001811462000ac3576002811462000ace5762000b04565b600191505062000b6d565b60ff84111562000ae35762000ae262000320565b5b8360020a91508482111562000afd5762000afc62000320565b5b5062000b6d565b5060208310610133831016604e8410600b841016171562000b3e5782820a90508381111562000b385762000b3762000320565b5b62000b6d565b62000b4d848484600162000a2d565b9250905081840481111562000b675762000b6662000320565b5b81810290505b9392505050565b600062000b818262000316565b915062000b8e8362000316565b925062000bbd7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000a88565b905092915050565b60805160a05160c05160e05161317862000c3e60003960008181610d2f01528181610f8a015281816110f401528181611d900152818161239001526123c80152600081816113fb01528181611d3e0152611e2b01526000818161142701528181611e4c0152611e9101526000611d1a01526131786000f3fe608060405234801561001057600080fd5b506004361061027b576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be1161016357806395d89b41116100e0578063b470aade116100a4578063b470aade14610832578063e3ab207a14610850578063e54d63f714610880578063e8095295146108b0578063eda4e6d6146108ce578063f2fde38b146108ec5761027b565b806395d89b4114610766578063983b2d56146107845780639da7d8ba146107b4578063a9059cbb146107e4578063ab28cea0146108145761027b565b8063731f237c11610127578063731f237c146106d057806379ba5097146106ee5780638da5cb5b1461070c5780638f1df6bc1461072a5780638f770ad0146107485761027b565b80636787a9be146105e05780636a2d094e146106105780636d5055a6146106405780636ffa8a051461067057806370a08231146106a05761027b565b806331333487116101fc578063449a52f8116101c0578063449a52f8146104e457806347a50517146105145780634abfbba21461054457806351b4541c14610574578063573cc507146105a457806358b2833b146105c25761027b565b80633133348714610406578063313ce5671461043657806335b16eb81461045457806340452d911461048457806340fc89f5146104b45761027b565b80631989c6a8116102435780631989c6a81461033a578063216ea5ec14610358578063229ba1971461038857806323b872dd146103a65780633092afd5146103d65761027b565b806301ffc9a71461028057806306fdde03146102b0578063095ea7b3146102ce57806309f28f3c146102fe57806318160ddd1461031c575b600080fd5b61029a60048036038101906102959190612942565b61091c565b6040516102a7919061298a565b60405180910390f35b6102b8610ac2565b6040516102c59190612a35565b60405180910390f35b6102e860048036038101906102e39190612aeb565b610b50565b6040516102f5919061298a565b60405180910390f35b610306610c74565b6040516103139190612b56565b60405180910390f35b610324610c96565b6040516103319190612b80565b60405180910390f35b610342610c9c565b60405161034f9190612b80565b60405180910390f35b610372600480360381019061036d9190612b9b565b610ca8565b60405161037f9190612b80565b60405180910390f35b610390610d2d565b60405161039d9190612b80565b60405180910390f35b6103c060048036038101906103bb9190612bdb565b610d51565b6040516103cd919061298a565b60405180910390f35b6103f060048036038101906103eb9190612c2e565b610e7b565b6040516103fd919061298a565b60405180910390f35b610420600480360381019061041b9190612b9b565b610f6e565b60405161042d9190612b80565b60405180910390f35b61043e61101f565b60405161044b9190612b80565b60405180910390f35b61046e60048036038101906104699190612c2e565b611025565b60405161047b919061298a565b60405180910390f35b61049e60048036038101906104999190612c5b565b611224565b6040516104ab9190612ca1565b60405180910390f35b6104ce60048036038101906104c99190612ce8565b611248565b6040516104db9190612b80565b60405180910390f35b6104fe60048036038101906104f99190612aeb565b611279565b60405161050b919061298a565b60405180910390f35b61052e60048036038101906105299190612c2e565b61139f565b60405161053b9190612b80565b60405180910390f35b61055e60048036038101906105599190612c5b565b6113f7565b60405161056b9190612b80565b60405180910390f35b61058e60048036038101906105899190612c5b565b611457565b60405161059b9190612b80565b60405180910390f35b6105ac611478565b6040516105b99190612b80565b60405180910390f35b6105ca61147e565b6040516105d79190612b80565b60405180910390f35b6105fa60048036038101906105f59190612c5b565b611484565b6040516106079190612b80565b60405180910390f35b61062a60048036038101906106259190612c5b565b6114f0565b6040516106379190612b80565b60405180910390f35b61065a60048036038101906106559190612c2e565b611511565b6040516106679190612b80565b60405180910390f35b61068a60048036038101906106859190612ce8565b61157c565b6040516106979190612b80565b60405180910390f35b6106ba60048036038101906106b59190612c2e565b6115af565b6040516106c79190612b80565b60405180910390f35b6106d8611658565b6040516106e5919061298a565b60405180910390f35b6106f6611779565b604051610703919061298a565b60405180910390f35b610714611920565b6040516107219190612d24565b60405180910390f35b610732611946565b60405161073f919061298a565b60405180910390f35b610750611afb565b60405161075d9190612b80565b60405180910390f35b61076e611b01565b60405161077b9190612a35565b60405180910390f35b61079e60048036038101906107999190612c2e565b611b8f565b6040516107ab919061298a565b60405180910390f35b6107ce60048036038101906107c99190612ce8565b611c4c565b6040516107db9190612b80565b60405180910390f35b6107fe60048036038101906107f99190612aeb565b611c78565b60405161080b919061298a565b60405180910390f35b61081c611d18565b6040516108299190612b80565b60405180910390f35b61083a611d3c565b6040516108479190612b80565b60405180910390f35b61086a60048036038101906108659190612ce8565b611d60565b6040516108779190612b80565b60405180910390f35b61089a60048036038101906108959190612b9b565b611d74565b6040516108a79190612b80565b60405180910390f35b6108b8611e25565b6040516108c59190612b56565b60405180910390f35b6108d6611e8f565b6040516108e39190612b80565b60405180910390f35b61090660048036038101906109019190612c2e565b611eb3565b604051610913919061298a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109705760019050610abd565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c25760019050610abd565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a145760019050610abd565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a665760019050610abd565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab85760019050610abd565b600090505b919050565b60068054610acf90612d6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610afb90612d6e565b8015610b485780601f10610b1d57610100808354040283529160200191610b48565b820191906000526020600020905b815481529060010190602001808311610b2b57829003601f168201915b505050505081565b600080610b5b611946565b50610b6533611025565b50610b6f83611484565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610bfd9190612dce565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c619190612b80565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b6000806000808503610cef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce690612e4e565b60405180910390fd5b838510610cfb57600080fd5b8484610d079190612e9d565b91508482610d159190612ece565b90508084610d239190612f10565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d5e611946565b50610d6833611025565b50610d7284611484565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610dfd57600080fd5b610e08868684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e679190612b80565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610f0d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610fb39190612e9d565b905060005b84811015610ffa57620f42408284610fd09190612ece565b610fda9190612e9d565b83610fe59190612f10565b92508080610ff290612f44565b915050610fb8565b50620f4240858361100b9190612ece565b6110159190612e9d565b9250505092915050565b60085481565b60008060008060008060008061103a89611511565b91506000821480611064575061104e611e25565b6fffffffffffffffffffffffffffffffff168210155b1561107957600097505050505050505061121f565b60006001836110889190612f10565b8154811061109957611098612f8c565b5b906000526020600020015496506110af87611248565b9450600085036110c957600097505050505050505061121f565b6110d287611c4c565b95506110dd8761157c565b90506d04ee2d6d415b85acef8100000000620f42407f000000000000000000000000000000000000000000000000000000000000000061111d9190612e9d565b86886111299190612e9d565b6111339190612ece565b61113d9190612e9d565b9350620f4240818561114f9190612ece565b6111599190612e9d565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506111c38984611ff9565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38560405161120b9190612b80565b60405180910390a360019750505050505050505b919050565b6000818154811061123457600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166112d257600080fd5b600a54600954846112e39190612dce565b11156112ee57600080fd5b6112f6611946565b5061130083611484565b905082600960008282546113149190612dce565b925050819055506113258482611ff9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516113839190612b80565b60405180910390a3611393612154565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826114259190612ece565b7f00000000000000000000000000000000000000000000000000000000000000006114509190612dce565b9050919050565b6000603c82426114679190612f10565b6114719190612e9d565b9050919050565b600b5481565b60035481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114d59190612ece565b6114df9190612ece565b6114e99190612e9d565b9050919050565b6000603c82426115009190612f10565b61150a9190612e9d565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806115be8561139f565b92506115cb600354611457565b9050611607600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f6e565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006116389190612ece565b82846116449190612ece565b61164e9190612e9d565b9350505050919050565b600080600080611669600354611457565b92506000830361167f5760009350505050611776565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1691506116bc8284610f6e565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c836117019190612ece565b60035461170e9190612dce565b60038190555081836003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516117669190612ff6565b60405180910390a4600193505050505b90565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117d657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600080600080600080600061195f611658565b506119686121f0565b995060006001028a036119885760009a5050505050505050505050611af8565b6119918a611d60565b97506001886119a09190612dce565b90506119ab886113f7565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119e9826114f0565b92506000831115611a1e576d04ee2d6d415b85acef8100000000611a0d8685611d74565b611a179190612e9d565b9350611a3b565b6d04ee2d6d415b85acef810000000085611a389190612e9d565b93505b611a4a600085600954846122eb565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a7e8a611248565b965060008703611a9857611a918a612377565b9550611ab2565b611aa487600954610ca8565b9550611ab0868961251e565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611ae19190612b80565b60405180910390a160019a50505050505050505050505b90565b600a5481565b60078054611b0e90612d6e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3a90612d6e565b8015611b875780601f10611b5c57610100808354040283529160200191611b87565b820191906000526020600020905b815481529060010190602001808311611b6a57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611beb57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b6000806000611c85611946565b50611c8f33611025565b50611c9984611484565b9150611ca6338684611f55565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d059190612b80565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611db99190612e9d565b905060005b84811015611e0057620f42408284611dd69190612ece565b611de09190612e9d565b83611deb9190612dce565b92508080611df890612f44565b915050611dbe565b50620f42408583611e119190612ece565b611e1b9190612e9d565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611e769190612f10565b611e809190612e9d565b611e8a9190612dce565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0f57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f628584612607565b50611f6d8484611ff9565b50611f76611e25565b6fffffffffffffffffffffffffffffffff169050600b548310158015611fa4575080611fa186611511565b14155b8015611fdc57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b15611fed57611feb8582612737565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004905060008503612059576000935050505061214e565b6120628661139f565b925084836120709190612dce565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16116120e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d79061305d565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061216b9190612f10565b8154811061217c5761217b612f8c565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166009549060020a028117905080600102600060016000805490506121c99190612f10565b815481106121da576121d9612f8c565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122089190612f10565b8154811061221957612218612f8c565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b191906130a9565b6fffffffffffffffffffffffffffffffff1690506122ce82611d60565b81116122e2576000600102925050506122e8565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080600080600061238886611c4c565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123ba9190612ece565b6123c49190612e9d565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836123f69190612ece565b6124009190612e9d565b9050838110156124cc5761241386611d60565b9250710fffffffff0000000000000000000000000019600102600060018561243b9190612f10565b8154811061244c5761244b612f8c565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124a39190612f10565b815481106124b4576124b3612f8c565b5b90600052602060002001600082825417925050819055505b612511600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461250c9190612e9d565b611ff9565b5081945050505050919050565b60008060008403612533576000915050612601565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125669190612f10565b8154811061257757612576612f8c565b5b90600052602060002001600082825417925050819055506125c160006001856125a09190612f10565b815481106125b1576125b0612f8c565b5b9060005260206000200154611c4c565b90506125fa600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836125f59190612f10565b611ff9565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126675760009350505050612731565b6126708661139f565b9250848310156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90613122565b60405180910390fd5b84836126c19190612f10565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612808612813565b506001905092915050565b6000806000806000600160008054905061282d9190612f10565b8154811061283e5761283d612f8c565b5b90600052602060002001549250600161285684611248565b6128609190612dce565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128bc9190612f10565b815481106128cd576128cc612f8c565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61291f816128ea565b811461292a57600080fd5b50565b60008135905061293c81612916565b92915050565b600060208284031215612958576129576128e5565b5b60006129668482850161292d565b91505092915050565b60008115159050919050565b6129848161296f565b82525050565b600060208201905061299f600083018461297b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129df5780820151818401526020810190506129c4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a07826129a5565b612a1181856129b0565b9350612a218185602086016129c1565b612a2a816129eb565b840191505092915050565b60006020820190508181036000830152612a4f81846129fc565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a8282612a57565b9050919050565b612a9281612a77565b8114612a9d57600080fd5b50565b600081359050612aaf81612a89565b92915050565b6000819050919050565b612ac881612ab5565b8114612ad357600080fd5b50565b600081359050612ae581612abf565b92915050565b60008060408385031215612b0257612b016128e5565b5b6000612b1085828601612aa0565b9250506020612b2185828601612ad6565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b5081612b2b565b82525050565b6000602082019050612b6b6000830184612b47565b92915050565b612b7a81612ab5565b82525050565b6000602082019050612b956000830184612b71565b92915050565b60008060408385031215612bb257612bb16128e5565b5b6000612bc085828601612ad6565b9250506020612bd185828601612ad6565b9150509250929050565b600080600060608486031215612bf457612bf36128e5565b5b6000612c0286828701612aa0565b9350506020612c1386828701612aa0565b9250506040612c2486828701612ad6565b9150509250925092565b600060208284031215612c4457612c436128e5565b5b6000612c5284828501612aa0565b91505092915050565b600060208284031215612c7157612c706128e5565b5b6000612c7f84828501612ad6565b91505092915050565b6000819050919050565b612c9b81612c88565b82525050565b6000602082019050612cb66000830184612c92565b92915050565b612cc581612c88565b8114612cd057600080fd5b50565b600081359050612ce281612cbc565b92915050565b600060208284031215612cfe57612cfd6128e5565b5b6000612d0c84828501612cd3565b91505092915050565b612d1e81612a77565b82525050565b6000602082019050612d396000830184612d15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612d8657607f821691505b602082108103612d9957612d98612d3f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612dd982612ab5565b9150612de483612ab5565b9250828201905080821115612dfc57612dfb612d9f565b5b92915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e386011836129b0565b9150612e4382612e02565b602082019050919050565b60006020820190508181036000830152612e6781612e2b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ea882612ab5565b9150612eb383612ab5565b925082612ec357612ec2612e6e565b5b828204905092915050565b6000612ed982612ab5565b9150612ee483612ab5565b9250828202612ef281612ab5565b91508282048414831517612f0957612f08612d9f565b5b5092915050565b6000612f1b82612ab5565b9150612f2683612ab5565b9250828203905081811115612f3e57612f3d612d9f565b5b92915050565b6000612f4f82612ab5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f8157612f80612d9f565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6000612fe0612fdb612fd684612b2b565b612fbb565b612ab5565b9050919050565b612ff081612fc5565b82525050565b600060208201905061300b6000830184612fe7565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b6000613047600d836129b0565b915061305282613011565b602082019050919050565b600060208201905081810360008301526130768161303a565b9050919050565b61308681612b2b565b811461309157600080fd5b50565b6000815190506130a38161307d565b92915050565b6000602082840312156130bf576130be6128e5565b5b60006130cd84828501613094565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061310c600d836129b0565b9150613117826130d6565b602082019050919050565b6000602082019050818103600083015261313b816130ff565b905091905056fea2646970667358221220f6c3f7ce7176aeb3def8a31a0be044e8d2b1243b776f0138f0c813c02be2c1e364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin index 229aa27..e094bfe 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenMultiNocap.bin @@ -1 +1 @@ -610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000436565b6080908152503480156200003757600080fd5b5060405162003c8438038062003c8483398181016040528101906200005d919062000708565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560059080519060200190620001309291906200034d565b508460069080519060200190620001499291906200034d565b508360ff166007819055504260a08181525050603c826200016b919062000436565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000191919062000436565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002306000620f424060006001620002c1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002ae919062000936565b60098190555050505050505050620009eb565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200035b90620009b6565b90600052602060002090601f0160209004810192826200037f5760008555620003cb565b82601f106200039a57805160ff1916838001178555620003cb565b82800160010185558215620003cb579182015b82811115620003ca578251825591602001919060010190620003ad565b5b509050620003da9190620003de565b5090565b5b80821115620003f9576000816000905550600101620003df565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200044382620003fd565b91506200045083620003fd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200048c576200048b62000407565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200050082620004b5565b810181811067ffffffffffffffff82111715620005225762000521620004c6565b5b80604052505050565b60006200053762000497565b9050620005458282620004f5565b919050565b600067ffffffffffffffff821115620005685762000567620004c6565b5b6200057382620004b5565b9050602081019050919050565b60005b83811015620005a057808201518184015260208101905062000583565b83811115620005b0576000848401525b50505050565b6000620005cd620005c7846200054a565b6200052b565b905082815260208101848484011115620005ec57620005eb620004b0565b5b620005f984828562000580565b509392505050565b600082601f830112620006195762000618620004ab565b5b81516200062b848260208601620005b6565b91505092915050565b600060ff82169050919050565b6200064c8162000634565b81146200065857600080fd5b50565b6000815190506200066c8162000641565b92915050565b6200067d81620003fd565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006d082620006a3565b9050919050565b620006e281620006c3565b8114620006ee57600080fd5b50565b6000815190506200070281620006d7565b92915050565b60008060008060008060c08789031215620007285762000727620004a1565b5b600087015167ffffffffffffffff811115620007495762000748620004a6565b5b6200075789828a0162000601565b965050602087015167ffffffffffffffff8111156200077b576200077a620004a6565b5b6200078989828a0162000601565b95505060406200079c89828a016200065b565b9450506060620007af89828a016200068c565b9350506080620007c289828a016200068c565b92505060a0620007d589828a01620006f1565b9150509295509295509295565b6000600282049050919050565b6000808291508390505b6001851115620008415780860481111562000819576200081862000407565b5b6001851615620008295780820291505b80810290506200083985620007e2565b9450620007f9565b94509492505050565b6000826200085c57600190506200092f565b816200086c57600090506200092f565b81600181146200088557600281146200089057620008c6565b60019150506200092f565b60ff841115620008a557620008a462000407565b5b8360020a915084821115620008bf57620008be62000407565b5b506200092f565b5060208310610133831016604e8410600b8410161715620009005782820a905083811115620008fa57620008f962000407565b5b6200092f565b6200090f8484846001620007ef565b9250905081840481111562000929576200092862000407565b5b81810290505b9392505050565b60006200094382620003fd565b91506200095083620003fd565b92506200097f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846200084a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009cf57607f821691505b602082108103620009e557620009e462000987565b5b50919050565b60805160a05160c05160e05161322062000a6460003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526132206000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a6f565b60405180910390f35b6102d260048036038101906102cd9190612b25565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b90565b60405180910390f35b61030e610c32565b60405161031b9190612bba565b60405180910390f35b61032c610c38565b6040516103399190612bba565b60405180910390f35b61035c60048036038101906103579190612bd5565b610c44565b6040516103699190612bba565b60405180910390f35b61037a610cc9565b6040516103879190612bba565b60405180910390f35b6103aa60048036038101906103a59190612c15565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c68565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bd5565b610f0a565b6040516104179190612bba565b60405180910390f35b610428610fbb565b6040516104359190612bba565b60405180910390f35b61045860048036038101906104539190612c68565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c95565b6111c0565b6040516104959190612cdb565b60405180910390f35b6104b860048036038101906104b39190612d22565b6111e4565b6040516104c59190612bba565b60405180910390f35b6104e860048036038101906104e39190612b25565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c68565b611317565b6040516105259190612bba565b60405180910390f35b61054860048036038101906105439190612c95565b61136f565b6040516105559190612bba565b60405180910390f35b6105666113cf565b6040516105739190612bba565b60405180910390f35b61059660048036038101906105919190612c95565b6113d5565b6040516105a39190612bba565b60405180910390f35b6105c660048036038101906105c19190612c95565b611441565b6040516105d39190612bba565b60405180910390f35b6105f660048036038101906105f19190612c68565b611462565b6040516106039190612bba565b60405180910390f35b61062660048036038101906106219190612d22565b6114cd565b6040516106339190612bba565b60405180910390f35b61065660048036038101906106519190612c68565b611500565b6040516106639190612bba565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d5e565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a6f565b60405180910390f35b61071c60048036038101906107179190612c68565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d22565b611c5b565b6040516107599190612bba565b60405180910390f35b61076a611c87565b6040516107779190612b90565b60405180910390f35b61079a60048036038101906107959190612b25565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bba565b60405180910390f35b6107d6611d6d565b6040516107e39190612bba565b60405180910390f35b61080660048036038101906108019190612d22565b611d91565b6040516108139190612bba565b60405180910390f35b61083660048036038101906108319190612bd5565b611da5565b6040516108439190612bba565b60405180910390f35b610854611e56565b6040516108619190612b90565b60405180910390f35b610872611ec0565b60405161087f9190612bba565b60405180910390f35b6108a2600480360381019061089d9190612c68565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612da8565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612e08565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bba565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612eaa565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ef9565b91508482610cb19190612f2a565b90508084610cbf9190612f84565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bba565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ef9565b905060005b84811015610f9657620f42408284610f6c9190612f2a565b610f769190612ef9565b83610f819190612f84565b92508080610f8e90612fb8565b915050610f54565b50620f42408583610fa79190612f2a565b610fb19190612ef9565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f84565b8154811061103557611034613000565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ef9565b86886110c59190612ef9565b6110cf9190612f2a565b6110d99190612ef9565b9350620f424081856110eb9190612f2a565b6110f59190612ef9565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bba565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612e08565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bba565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612f2a565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612e08565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612f2a565b6114309190612f2a565b61143a9190612ef9565b9050919050565b6000603c82426114519190612f84565b61145b9190612ef9565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b611542919061302f565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612f2a565b82846115cd9190612f2a565b6115d79190612ef9565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d919061302f565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061309e565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612e08565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ef9565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ef9565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bba565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612da8565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612da8565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bba565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ef9565b905060005b84811015611e3157620f42408284611e079190612f2a565b611e119190612ef9565b83611e1c9190612e08565b92508080611e2990612fb8565b915050611def565b50620f42408583611e429190612f2a565b611e4c9190612ef9565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f84565b611eb19190612ef9565b611ebb9190612e08565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612e08565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210890613105565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f84565b815481106121ad576121ac613000565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f84565b8154811061220b5761220a613000565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f84565b8154811061224a57612249613000565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e29190613151565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612f2a565b6123f59190612ef9565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612f2a565b6124319190612ef9565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f84565b8154811061247d5761247c613000565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f84565b815481106124e5576124e4613000565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ef9565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f84565b815481106125a8576125a7613000565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f84565b815481106125e2576125e1613000565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f84565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd906131ca565b60405180910390fd5b84836126f29190612f84565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f84565b8154811061286f5761286e613000565b5b906000526020600020015492506001612887846111e4565b6128919190612e08565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f84565b815481106128fe576128fd613000565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b83811115612a1f576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a41826129d6565b612a4b81856129e1565b9350612a5b8185602086016129f2565b612a6481612a25565b840191505092915050565b60006020820190508181036000830152612a898184612a36565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612abc82612a91565b9050919050565b612acc81612ab1565b8114612ad757600080fd5b50565b600081359050612ae981612ac3565b92915050565b6000819050919050565b612b0281612aef565b8114612b0d57600080fd5b50565b600081359050612b1f81612af9565b92915050565b60008060408385031215612b3c57612b3b612916565b5b6000612b4a85828601612ada565b9250506020612b5b85828601612b10565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8a81612b65565b82525050565b6000602082019050612ba56000830184612b81565b92915050565b612bb481612aef565b82525050565b6000602082019050612bcf6000830184612bab565b92915050565b60008060408385031215612bec57612beb612916565b5b6000612bfa85828601612b10565b9250506020612c0b85828601612b10565b9150509250929050565b600080600060608486031215612c2e57612c2d612916565b5b6000612c3c86828701612ada565b9350506020612c4d86828701612ada565b9250506040612c5e86828701612b10565b9150509250925092565b600060208284031215612c7e57612c7d612916565b5b6000612c8c84828501612ada565b91505092915050565b600060208284031215612cab57612caa612916565b5b6000612cb984828501612b10565b91505092915050565b6000819050919050565b612cd581612cc2565b82525050565b6000602082019050612cf06000830184612ccc565b92915050565b612cff81612cc2565b8114612d0a57600080fd5b50565b600081359050612d1c81612cf6565b92915050565b600060208284031215612d3857612d37612916565b5b6000612d4684828501612d0d565b91505092915050565b612d5881612ab1565b82525050565b6000602082019050612d736000830184612d4f565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612dc057607f821691505b602082108103612dd357612dd2612d79565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e1382612aef565b9150612e1e83612aef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e5357612e52612dd9565b5b828201905092915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e946011836129e1565b9150612e9f82612e5e565b602082019050919050565b60006020820190508181036000830152612ec381612e87565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f0482612aef565b9150612f0f83612aef565b925082612f1f57612f1e612eca565b5b828204905092915050565b6000612f3582612aef565b9150612f4083612aef565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f7957612f78612dd9565b5b828202905092915050565b6000612f8f82612aef565b9150612f9a83612aef565b925082821015612fad57612fac612dd9565b5b828203905092915050565b6000612fc382612aef565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff557612ff4612dd9565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061303a82612b65565b915061304583612b65565b92508282101561305857613057612dd9565b5b828203905092915050565b6000819050919050565b600061308861308361307e84612b65565b613063565b612aef565b9050919050565b6130988161306d565b82525050565b60006020820190506130b3600083018461308f565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130ef600d836129e1565b91506130fa826130b9565b602082019050919050565b6000602082019050818103600083015261311e816130e2565b9050919050565b61312e81612b65565b811461313957600080fd5b50565b60008151905061314b81613125565b92915050565b60006020828403121561316757613166612916565b5b60006131758482850161313c565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006131b4600d836129e1565b91506131bf8261317e565b602082019050919050565b600060208201905081810360008301526131e3816131a7565b905091905056fea2646970667358221220264f607b835653f036df7c03346e36a25ca6aaeba8bb51495b6669a847b0b5b164736f6c634300080d0033 \ No newline at end of file +610100604052620f42406d04ee2d6d415b85acef810000000062000024919062000378565b6080908152503480156200003757600080fd5b5060405162003e3d38038062003e3d83398181016040528101906200005d91906200062a565b33600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600a6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600590816200012991906200094b565b5084600690816200013b91906200094b565b508360ff166007819055504260a08181525050603c826200015d919062000378565b60c08181525050620f42406d04ee2d6d415b85acef810000000062000183919062000378565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508260e081815250506000620002226000620f424060006001620002b3640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460ff16600a620002a0919062000b86565b6009819055505050505050505062000bd7565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000385826200033f565b915062000392836200033f565b9250828202620003a2816200033f565b91508282048414831517620003bc57620003bb62000349565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200042c82620003e1565b810181811067ffffffffffffffff821117156200044e576200044d620003f2565b5b80604052505050565b600062000463620003c3565b905062000471828262000421565b919050565b600067ffffffffffffffff821115620004945762000493620003f2565b5b6200049f82620003e1565b9050602081019050919050565b60005b83811015620004cc578082015181840152602081019050620004af565b60008484015250505050565b6000620004ef620004e98462000476565b62000457565b9050828152602081018484840111156200050e576200050d620003dc565b5b6200051b848285620004ac565b509392505050565b600082601f8301126200053b576200053a620003d7565b5b81516200054d848260208601620004d8565b91505092915050565b600060ff82169050919050565b6200056e8162000556565b81146200057a57600080fd5b50565b6000815190506200058e8162000563565b92915050565b6200059f816200033f565b8114620005ab57600080fd5b50565b600081519050620005bf8162000594565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005f282620005c5565b9050919050565b6200060481620005e5565b81146200061057600080fd5b50565b6000815190506200062481620005f9565b92915050565b60008060008060008060c087890312156200064a5762000649620003cd565b5b600087015167ffffffffffffffff8111156200066b576200066a620003d2565b5b6200067989828a0162000523565b965050602087015167ffffffffffffffff8111156200069d576200069c620003d2565b5b620006ab89828a0162000523565b9550506040620006be89828a016200057d565b9450506060620006d189828a01620005ae565b9350506080620006e489828a01620005ae565b92505060a0620006f789828a0162000613565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200075757607f821691505b6020821081036200076d576200076c6200070f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620007da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000798565b620007e6868362000798565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000829620008236200081d846200033f565b620007fe565b6200033f565b9050919050565b6000819050919050565b620008458362000808565b6200085d620008548262000830565b848454620007a8565b825550505050565b600090565b6200087462000865565b620008818184846200083a565b505050565b5b81811015620008a9576200089d6000826200086a565b60018101905062000887565b5050565b601f821115620008f857620008c28162000773565b620008cd8462000788565b81016020851015620008dd578190505b620008f5620008ec8562000788565b83018262000886565b50505b505050565b60008160020a8304905092915050565b60006200092060001984600802620008fd565b1980831691505092915050565b60006200093b83836200090d565b9150826002028217905092915050565b620009568262000704565b67ffffffffffffffff811115620009725762000971620003f2565b5b6200097e82546200073e565b6200098b828285620008ad565b600060209050601f831160018114620009c35760008415620009ae578287015190505b620009ba85826200092d565b86555062000a2a565b601f198416620009d38662000773565b60005b82811015620009fd57848901518255600182019150602085019450602081019050620009d6565b8683101562000a1d578489015162000a19601f8916826200090d565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000a915780860481111562000a695762000a6862000349565b5b600185161562000a795780820291505b808102905062000a898562000a32565b945062000a49565b94509492505050565b60008262000aac576001905062000b7f565b8162000abc576000905062000b7f565b816001811462000ad5576002811462000ae05762000b16565b600191505062000b7f565b60ff84111562000af55762000af462000349565b5b8360020a91508482111562000b0f5762000b0e62000349565b5b5062000b7f565b5060208310610133831016604e8410600b841016171562000b505782820a90508381111562000b4a5762000b4962000349565b5b62000b7f565b62000b5f848484600162000a3f565b9250905081840481111562000b795762000b7862000349565b5b81810290505b9392505050565b600062000b93826200033f565b915062000ba0836200033f565b925062000bcf7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000a9a565b905092915050565b60805160a05160c05160e0516131ed62000c5060003960008181610ccb01528181610f260152818161109001528181611dc1015281816123c101526123f901526000818161137301528181611d6f0152611e5c01526000818161139f01528181611e7d0152611ec201526000611d4b01526131ed6000f3fe608060405234801561001057600080fd5b5060043610610265576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101585780639da7d8ba116100d5578063e3ab207a11610099578063e3ab207a146107ec578063e54d63f71461081c578063e80952951461084c578063eda4e6d61461086a578063f2fde38b1461088857610265565b80639da7d8ba14610732578063a2119e2f14610762578063a9059cbb14610780578063ab28cea0146107b0578063b470aade146107ce57610265565b806379ba50971161011c57806379ba50971461068a5780638da5cb5b146106a85780638f1df6bc146106c657806395d89b41146106e4578063983b2d561461070257610265565b80636a2d094e146105ac5780636d5055a6146105dc5780636ffa8a051461060c57806370a082311461063c578063731f237c1461066c57610265565b806331333487116101e6578063449a52f8116101aa578063449a52f8146104ce57806347a50517146104fe5780634abfbba21461052e578063573cc5071461055e5780636787a9be1461057c57610265565b806331333487146103f0578063313ce5671461042057806335b16eb81461043e57806340452d911461046e57806340fc89f51461049e57610265565b80631989c6a81161022d5780631989c6a814610324578063216ea5ec14610342578063229ba1971461037257806323b872dd146103905780633092afd5146103c057610265565b806301ffc9a71461026a57806306fdde031461029a578063095ea7b3146102b857806309f28f3c146102e857806318160ddd14610306575b600080fd5b610284600480360381019061027f9190612973565b6108b8565b60405161029191906129bb565b60405180910390f35b6102a2610a5e565b6040516102af9190612a66565b60405180910390f35b6102d260048036038101906102cd9190612b1c565b610aec565b6040516102df91906129bb565b60405180910390f35b6102f0610c10565b6040516102fd9190612b87565b60405180910390f35b61030e610c32565b60405161031b9190612bb1565b60405180910390f35b61032c610c38565b6040516103399190612bb1565b60405180910390f35b61035c60048036038101906103579190612bcc565b610c44565b6040516103699190612bb1565b60405180910390f35b61037a610cc9565b6040516103879190612bb1565b60405180910390f35b6103aa60048036038101906103a59190612c0c565b610ced565b6040516103b791906129bb565b60405180910390f35b6103da60048036038101906103d59190612c5f565b610e17565b6040516103e791906129bb565b60405180910390f35b61040a60048036038101906104059190612bcc565b610f0a565b6040516104179190612bb1565b60405180910390f35b610428610fbb565b6040516104359190612bb1565b60405180910390f35b61045860048036038101906104539190612c5f565b610fc1565b60405161046591906129bb565b60405180910390f35b61048860048036038101906104839190612c8c565b6111c0565b6040516104959190612cd2565b60405180910390f35b6104b860048036038101906104b39190612d19565b6111e4565b6040516104c59190612bb1565b60405180910390f35b6104e860048036038101906104e39190612b1c565b611215565b6040516104f591906129bb565b60405180910390f35b61051860048036038101906105139190612c5f565b611317565b6040516105259190612bb1565b60405180910390f35b61054860048036038101906105439190612c8c565b61136f565b6040516105559190612bb1565b60405180910390f35b6105666113cf565b6040516105739190612bb1565b60405180910390f35b61059660048036038101906105919190612c8c565b6113d5565b6040516105a39190612bb1565b60405180910390f35b6105c660048036038101906105c19190612c8c565b611441565b6040516105d39190612bb1565b60405180910390f35b6105f660048036038101906105f19190612c5f565b611462565b6040516106039190612bb1565b60405180910390f35b61062660048036038101906106219190612d19565b6114cd565b6040516106339190612bb1565b60405180910390f35b61065660048036038101906106519190612c5f565b611500565b6040516106639190612bb1565b60405180910390f35b6106746115e1565b60405161068191906129bb565b60405180910390f35b61069261178e565b60405161069f91906129bb565b60405180910390f35b6106b0611935565b6040516106bd9190612d55565b60405180910390f35b6106ce61195b565b6040516106db91906129bb565b60405180910390f35b6106ec611b10565b6040516106f99190612a66565b60405180910390f35b61071c60048036038101906107179190612c5f565b611b9e565b60405161072991906129bb565b60405180910390f35b61074c60048036038101906107479190612d19565b611c5b565b6040516107599190612bb1565b60405180910390f35b61076a611c87565b6040516107779190612b87565b60405180910390f35b61079a60048036038101906107959190612b1c565b611ca9565b6040516107a791906129bb565b60405180910390f35b6107b8611d49565b6040516107c59190612bb1565b60405180910390f35b6107d6611d6d565b6040516107e39190612bb1565b60405180910390f35b61080660048036038101906108019190612d19565b611d91565b6040516108139190612bb1565b60405180910390f35b61083660048036038101906108319190612bcc565b611da5565b6040516108439190612bb1565b60405180910390f35b610854611e56565b6040516108619190612b87565b60405180910390f35b610872611ec0565b60405161087f9190612bb1565b60405180910390f35b6108a2600480360381019061089d9190612c5f565b611ee4565b6040516108af91906129bb565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090c5760019050610a59565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095e5760019050610a59565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109b05760019050610a59565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a025760019050610a59565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a545760019050610a59565b600090505b919050565b60058054610a6b90612d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9790612d9f565b8015610ae45780601f10610ab957610100808354040283529160200191610ae4565b820191906000526020600020905b815481529060010190602001808311610ac757829003601f168201915b505050505081565b600080610af761195b565b50610b0133610fc1565b50610b0b836113d5565b905080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b999190612dff565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610bfd9190612bb1565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60085481565b60008080549050905090565b6000806000808503610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8290612e7f565b60405180910390fd5b838510610c9757600080fd5b8484610ca39190612ece565b91508482610cb19190612eff565b90508084610cbf9190612f41565b9250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cfa61195b565b50610d0433610fc1565b50610d0e846113d5565b915081600b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d9957600080fd5b610da4868684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e039190612bb1565b60405180910390a380925050509392505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ea057503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ea957600080fd5b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000610f4f9190612ece565b905060005b84811015610f9657620f42408284610f6c9190612eff565b610f769190612ece565b83610f819190612f41565b92508080610f8e90612f75565b915050610f54565b50620f42408583610fa79190612eff565b610fb19190612ece565b9250505092915050565b60075481565b600080600080600080600080610fd689611462565b915060008214806110005750610fea611e56565b6fffffffffffffffffffffffffffffffff168210155b156110155760009750505050505050506111bb565b60006001836110249190612f41565b8154811061103557611034612fbd565b5b9060005260206000200154965061104b876111e4565b9450600085036110655760009750505050505050506111bb565b61106e87611c5b565b9550611079876114cd565b90506d04ee2d6d415b85acef8100000000620f42407f00000000000000000000000000000000000000000000000000000000000000006110b99190612ece565b86886110c59190612ece565b6110cf9190612eff565b6110d99190612ece565b9350620f424081856110eb9190612eff565b6110f59190612ece565b92506cffffffff00000000000000000019600102600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254169250508190555061115f898461202a565b50818973ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3856040516111a79190612bb1565b60405180910390a360019750505050505050505b919050565b600081815481106111d057600080fd5b906000526020600020016000915090505481565b6000606860ff16710fffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b600080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661126e57600080fd5b61127661195b565b50829050826008600082825461128c9190612dff565b9250508190555061129d848261202a565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516112fb9190612bb1565b60405180910390a361130b612185565b50600191505092915050565b600068ffffffffffffffffff600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460019004169050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261139d9190612eff565b7f00000000000000000000000000000000000000000000000000000000000000006113c89190612dff565b9050919050565b60095481565b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16620f42406d04ee2d6d415b85acef8100000000846114269190612eff565b6114309190612eff565b61143a9190612ece565b9050919050565b6000603c82426114519190612f41565b61145b9190612ece565b9050919050565b6000604860ff166cffffffff000000000000000000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900416908060020a82049150509050919050565b6000608c60ff1673fffff00000000000000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061150f85611317565b9250600260109054906101000a90046fffffffffffffffffffffffffffffffff16611538611e56565b6115429190612fec565b6fffffffffffffffffffffffffffffffff169050611590600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1682610f0a565b6fffffffffffffffffffffffffffffffff169150620f42406d04ee2d6d415b85acef81000000006115c19190612eff565b82846115cd9190612eff565b6115d79190612ece565b9350505050919050565b60008060008060006115f1611e56565b9350600260109054906101000a90046fffffffffffffffffffffffffffffffff168461161d9190612fec565b92506000836fffffffffffffffffffffffffffffffff160361164657600094505050505061178b565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16915061169582846fffffffffffffffffffffffffffffffff16610f0a565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600260106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555081836fffffffffffffffffffffffffffffffff16856fffffffffffffffffffffffffffffffff167fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff1660405161177a919061306b565b60405180910390a460019450505050505b90565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806000806000806000806000806000611974612221565b995060006001028a036119945760009a5050505050505050505050611b0d565b61199d8a611d91565b97506001886119ac9190612dff565b90506119b78861136f565b91506119c16115e1565b50600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1694506119fe82611441565b92506000831115611a33576d04ee2d6d415b85acef8100000000611a228685611da5565b611a2c9190612ece565b9350611a50565b6d04ee2d6d415b85acef810000000085611a4d9190612ece565b93505b611a5f6000856008548461231c565b98506000899080600181540180825580915050600190039060005260206000200160009091909190915055611a938a6111e4565b965060008703611aad57611aa68a6123a8565b9550611ac7565b611ab987600854610c44565b9550611ac5868961254f565b505b7f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611af69190612bb1565b60405180910390a160019a50505050505050505050505b90565b60068054611b1d90612d9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4990612d9f565b8015611b965780601f10611b6b57610100808354040283529160200191611b96565b820191906000526020600020905b815481529060010190602001808311611b7957829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfa57600080fd5b6001600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b600260109054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000806000611cb661195b565b50611cc033610fc1565b50611cca846113d5565b9150611cd7338684611f86565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611d369190612bb1565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600063ffffffff8260019004169050919050565b6000806000620f424091506d04ee2d6d415b85acef81000000007f0000000000000000000000000000000000000000000000000000000000000000611dea9190612ece565b905060005b84811015611e3157620f42408284611e079190612eff565b611e119190612ece565b83611e1c9190612dff565b92508080611e2990612f75565b915050611def565b50620f42408583611e429190612eff565b611e4c9190612ece565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611ea79190612f41565b611eb19190612ece565b611ebb9190612dff565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b81600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b600080611f938584612638565b50611f9e848461202a565b50611fa7611e56565b6fffffffffffffffffffffffffffffffff1690506009548310158015611fd5575080611fd286611462565b14155b801561200d57508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b1561201e5761201c8582612768565b505b60019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546001900490506000850361208a576000935050505061217f565b61209386611317565b925084836120a19190612dff565b91508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1611612111576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612108906130d2565b60405180910390fd5b68ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600160008054905061219c9190612f41565b815481106121ad576121ac612fbd565b5b90600052602060002001546001900490506cffffffffffffffffff000000001981169050602060ff166008549060020a028117905080600102600060016000805490506121fa9190612f41565b8154811061220b5761220a612fbd565b5b9060005260206000200181905550600191505090565b60008060008060016000805490506122399190612f41565b8154811061224a57612249612fbd565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156122be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e2919061311e565b6fffffffffffffffffffffffffffffffff1690506122ff82611d91565b811161231357600060010292505050612319565b81925050505b90565b60008073fffff00000000000000000000000000000000000608c60ff16869060020a021660010281179050710fffffffff00000000000000000000000000606860ff16879060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b60008060008060006123b986611c5b565b9350620f42407f0000000000000000000000000000000000000000000000000000000000000000856123eb9190612eff565b6123f59190612ece565b91507f0000000000000000000000000000000000000000000000000000000000000000620f4240836124279190612eff565b6124319190612ece565b9050838110156124fd5761244486611d91565b9250710fffffffff0000000000000000000000000019600102600060018561246c9190612f41565b8154811061247d5761247c612fbd565b5b9060005260206000200160008282541692505081905550606860ff1660019060020a027f80000000000000000000000000000000000000000000000000000000000000001760010260006001856124d49190612f41565b815481106124e5576124e4612fbd565b5b90600052602060002001600082825417925050819055505b612542600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166d04ee2d6d415b85acef81000000008461253d9190612ece565b61202a565b5081945050505050919050565b60008060008403612564576000915050612632565b7f800000000000000000000000000000000000000000000000000000000000000060010260006001856125979190612f41565b815481106125a8576125a7612fbd565b5b90600052602060002001600082825417925050819055506125f260006001856125d19190612f41565b815481106125e2576125e1612fbd565b5b9060005260206000200154611c5b565b905061262b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685836126269190612f41565b61202a565b5060019150505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600190049050600085036126985760009350505050612762565b6126a186611317565b9250848310156126e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126dd90613197565b60405180910390fd5b84836126f29190612f41565b915068ffffffffffffffffff198116905068ffffffffffffffffff82168117905080600102600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006cffffffff00000000000000000019600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825416925050819055506cffffffff000000000000000000604860ff16839060020a0216600102600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282541792505081905550612839612844565b506001905092915050565b6000806000806000600160008054905061285e9190612f41565b8154811061286f5761286e612fbd565b5b906000526020600020015492506001612887846111e4565b6128919190612dff565b905082600190049150710fffffffff000000000000000000000000001982169150710fffffffff00000000000000000000000000606860ff16829060020a02168217915081600102600060016000805490506128ed9190612f41565b815481106128fe576128fd612fbd565b5b90600052602060002001819055506001935050505090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129508161291b565b811461295b57600080fd5b50565b60008135905061296d81612947565b92915050565b60006020828403121561298957612988612916565b5b60006129978482850161295e565b91505092915050565b60008115159050919050565b6129b5816129a0565b82525050565b60006020820190506129d060008301846129ac565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a105780820151818401526020810190506129f5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612a38826129d6565b612a4281856129e1565b9350612a528185602086016129f2565b612a5b81612a1c565b840191505092915050565b60006020820190508181036000830152612a808184612a2d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ab382612a88565b9050919050565b612ac381612aa8565b8114612ace57600080fd5b50565b600081359050612ae081612aba565b92915050565b6000819050919050565b612af981612ae6565b8114612b0457600080fd5b50565b600081359050612b1681612af0565b92915050565b60008060408385031215612b3357612b32612916565b5b6000612b4185828601612ad1565b9250506020612b5285828601612b07565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612b8181612b5c565b82525050565b6000602082019050612b9c6000830184612b78565b92915050565b612bab81612ae6565b82525050565b6000602082019050612bc66000830184612ba2565b92915050565b60008060408385031215612be357612be2612916565b5b6000612bf185828601612b07565b9250506020612c0285828601612b07565b9150509250929050565b600080600060608486031215612c2557612c24612916565b5b6000612c3386828701612ad1565b9350506020612c4486828701612ad1565b9250506040612c5586828701612b07565b9150509250925092565b600060208284031215612c7557612c74612916565b5b6000612c8384828501612ad1565b91505092915050565b600060208284031215612ca257612ca1612916565b5b6000612cb084828501612b07565b91505092915050565b6000819050919050565b612ccc81612cb9565b82525050565b6000602082019050612ce76000830184612cc3565b92915050565b612cf681612cb9565b8114612d0157600080fd5b50565b600081359050612d1381612ced565b92915050565b600060208284031215612d2f57612d2e612916565b5b6000612d3d84828501612d04565b91505092915050565b612d4f81612aa8565b82525050565b6000602082019050612d6a6000830184612d46565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612db757607f821691505b602082108103612dca57612dc9612d70565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e0a82612ae6565b9150612e1583612ae6565b9250828201905080821115612e2d57612e2c612dd0565b5b92915050565b7f4552525f4e554d50415254535f5a45524f000000000000000000000000000000600082015250565b6000612e696011836129e1565b9150612e7482612e33565b602082019050919050565b60006020820190508181036000830152612e9881612e5c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612ed982612ae6565b9150612ee483612ae6565b925082612ef457612ef3612e9f565b5b828204905092915050565b6000612f0a82612ae6565b9150612f1583612ae6565b9250828202612f2381612ae6565b91508282048414831517612f3a57612f39612dd0565b5b5092915050565b6000612f4c82612ae6565b9150612f5783612ae6565b9250828203905081811115612f6f57612f6e612dd0565b5b92915050565b6000612f8082612ae6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612fb257612fb1612dd0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ff782612b5c565b915061300283612b5c565b925082820390506fffffffffffffffffffffffffffffffff81111561302a57613029612dd0565b5b92915050565b6000819050919050565b600061305561305061304b84612b5c565b613030565b612ae6565b9050919050565b6130658161303a565b82525050565b6000602082019050613080600083018461305c565b92915050565b7f4552525f574f554c445752415000000000000000000000000000000000000000600082015250565b60006130bc600d836129e1565b91506130c782613086565b602082019050919050565b600060208201905081810360008301526130eb816130af565b9050919050565b6130fb81612b5c565b811461310657600080fd5b50565b600081519050613118816130f2565b92915050565b60006020828403121561313457613133612916565b5b600061314284828501613109565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000613181600d836129e1565b915061318c8261314b565b602082019050919050565b600060208201905081810360008301526131b081613174565b905091905056fea2646970667358221220f2d0778aaedf04ef72fd5734950fa534481c2c6e30df88849802da83cc11813664736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin index 06e6bd2..c831e0c 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleCap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200041a565b6080908152503480156200003657600080fd5b506040516200364d3803806200364d83398181016040528101906200005c919062000739565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555086600690805190602001906200012f92919062000331565b5085600790805190602001906200014892919062000331565b508460ff166008819055504260038190555060035460a08181525050603c836200017391906200041a565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200022b6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002c4640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002b091906200097e565b600b81905550505050505050505062000a33565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200033f90620009fe565b90600052602060002090601f016020900481019282620003635760008555620003af565b82601f106200037e57805160ff1916838001178555620003af565b82800160010185558215620003af579182015b82811115620003ae57825182559160200191906001019062000391565b5b509050620003be9190620003c2565b5090565b5b80821115620003dd576000816000905550600101620003c3565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200042782620003e1565b91506200043483620003e1565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000470576200046f620003eb565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004e48262000499565b810181811067ffffffffffffffff82111715620005065762000505620004aa565b5b80604052505050565b60006200051b6200047b565b9050620005298282620004d9565b919050565b600067ffffffffffffffff8211156200054c576200054b620004aa565b5b620005578262000499565b9050602081019050919050565b60005b838110156200058457808201518184015260208101905062000567565b8381111562000594576000848401525b50505050565b6000620005b1620005ab846200052e565b6200050f565b905082815260208101848484011115620005d057620005cf62000494565b5b620005dd84828562000564565b509392505050565b600082601f830112620005fd57620005fc6200048f565b5b81516200060f8482602086016200059a565b91505092915050565b600060ff82169050919050565b620006308162000618565b81146200063c57600080fd5b50565b600081519050620006508162000625565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067d8162000656565b81146200068957600080fd5b50565b6000815190506200069d8162000672565b92915050565b620006ae81620003e1565b8114620006ba57600080fd5b50565b600081519050620006ce81620006a3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070182620006d4565b9050919050565b6200071381620006f4565b81146200071f57600080fd5b50565b600081519050620007338162000708565b92915050565b600080600080600080600060e0888a0312156200075b576200075a62000485565b5b600088015167ffffffffffffffff8111156200077c576200077b6200048a565b5b6200078a8a828b01620005e5565b975050602088015167ffffffffffffffff811115620007ae57620007ad6200048a565b5b620007bc8a828b01620005e5565b9650506040620007cf8a828b016200063f565b9550506060620007e28a828b016200068c565b9450506080620007f58a828b01620006bd565b93505060a0620008088a828b0162000722565b92505060c06200081b8a828b01620006bd565b91505092959891949750929550565b6000600282049050919050565b6000808291508390505b60018511156200088957808604811115620008615762000860620003eb565b5b6001851615620008715780820291505b808102905062000881856200082a565b945062000841565b94509492505050565b600082620008a4576001905062000977565b81620008b4576000905062000977565b8160018114620008cd5760028114620008d8576200090e565b600191505062000977565b60ff841115620008ed57620008ec620003eb565b5b8360020a915084821115620009075762000906620003eb565b5b5062000977565b5060208310610133831016604e8410600b8410161715620009485782820a905083811115620009425762000941620003eb565b5b62000977565b62000957848484600162000837565b92509050818404811115620009715762000970620003eb565b5b81810290505b9392505050565b60006200098b82620003e1565b91506200099883620003e1565b9250620009c77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000892565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a1757607f821691505b60208210810362000a2d5762000a2c620009cf565b5b50919050565b60805160a05160c05160e051612ba162000aac60003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612ba16000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d09190612373565b60405180910390f35b6102f360048036038101906102ee9190612429565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e9190612494565b60405180910390f35b61032f610cb3565b60405161033c91906124be565b60405180910390f35b61034d610cb9565b60405161035a91906124be565b60405180910390f35b61036b610cc5565b60405161037891906124be565b60405180910390f35b61039b600480360381019061039691906124d9565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c6919061252c565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612559565b610efc565b60405161040891906124be565b60405180910390f35b610419610fb0565b60405161042691906124be565b60405180910390f35b61044960048036038101906104449190612599565b610fb6565b60405161045691906125df565b60405180910390f35b61047960048036038101906104749190612429565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a4919061252c565b61116c565b6040516104b691906124be565b60405180910390f35b6104d960048036038101906104d49190612599565b6111b5565b6040516104e691906124be565b60405180910390f35b61050960048036038101906105049190612599565b611215565b60405161051691906124be565b60405180910390f35b610527611236565b60405161053491906124be565b60405180910390f35b61054561123c565b60405161055291906124be565b60405180910390f35b61057560048036038101906105709190612559565b611242565b60405161058291906124be565b60405180910390f35b6105a560048036038101906105a09190612599565b6112c3565b6040516105b291906124be565b60405180910390f35b6105d560048036038101906105d09190612599565b611343565b6040516105e291906124be565b60405180910390f35b61060560048036038101906106009190612626565b611364565b60405161061291906124be565b60405180910390f35b6106356004803603810190610630919061252c565b61139e565b60405161064291906124be565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c9190612626565b61160e565b6040516106ae91906124be565b60405180910390f35b6106bf61163c565b6040516106cc9190612662565b60405180910390f35b6106ef60048036038101906106ea919061252c565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124be565b60405180910390f35b61073561184f565b6040516107429190612373565b60405180910390f35b6107656004803603810190610760919061252c565b6118dd565b60405161077291906122bf565b60405180910390f35b61079560048036038101906107909190612626565b61199a565b6040516107a291906124be565b60405180910390f35b6107c560048036038101906107c09190612429565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124be565b60405180910390f35b610801611a80565b60405161080e91906124be565b60405180910390f35b610831600480360381019061082c9190612599565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c9190612626565b611bdc565b60405161086e91906124be565b60405180910390f35b610891600480360381019061088c9190612559565b611bf0565b60405161089e91906124be565b60405180910390f35b6108af611ca4565b6040516108bc9190612494565b60405180910390f35b6108cd611d0e565b6040516108da91906124be565b60405180910390f35b6108fd60048036038101906108f8919061252c565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d6004803603810190610928919061267d565b611dd4565b60405161093a91906125df565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af690612713565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2290612713565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a9190612773565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124be565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124be565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127f8565b905060005b84811015610f895764e8d4a510008284610f5f9190612829565b610f6991906127f8565b83610f749190612883565b92508080610f81906128b7565b915050610f45565b5064e8d4a510008583610f9c9190612829565b610fa691906127f8565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110609061294b565b60405180910390fd5b600a546009548461107a9190612773565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b2906129b7565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e19190612773565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124be565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e39190612829565b7f000000000000000000000000000000000000000000000000000000000000000061120e9190612773565b9050919050565b6000603c82426112259190612883565b61122f91906127f8565b9050919050565b600b5481565b60035481565b6000806402540be400836112569190612829565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612883565b8461128c9190612829565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127f8565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f491906129d7565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836113329190612829565b61133c91906127f8565b9050919050565b6000603c82426113539190612883565b61135d91906127f8565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee91906129d7565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006114369190612829565b82846114429190612829565b61144c91906127f8565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b95506001866117559190612773565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124be565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c90612713565b80601f016020809104026020016040519081016040528092919081815260200182805461188890612713565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124be565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b639190612829565b600354611b709190612773565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a5c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127f8565b905060005b84811015611c7d5764e8d4a510008284611c539190612829565b611c5d91906127f8565b83611c689190612773565b92508080611c75906128b7565b915050611c39565b5064e8d4a510008583611c909190612829565b611c9a91906127f8565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612883565b611cff91906127f8565b611d099190612773565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed99190612773565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612883565b81548110611f5957611f58612a77565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612883565b81548110611fb557611fb4612a77565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612883565b81548110611ff557611ff4612a77565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612ad2565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612b4b565b60405180910390fd5b84836121c99190612883565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b83811115612323576000848401525b50505050565b6000601f19601f8301169050919050565b6000612345826122da565b61234f81856122e5565b935061235f8185602086016122f6565b61236881612329565b840191505092915050565b6000602082019050818103600083015261238d818461233a565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123c082612395565b9050919050565b6123d0816123b5565b81146123db57600080fd5b50565b6000813590506123ed816123c7565b92915050565b6000819050919050565b612406816123f3565b811461241157600080fd5b50565b600081359050612423816123fd565b92915050565b600080604083850312156124405761243f61221a565b5b600061244e858286016123de565b925050602061245f85828601612414565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248e81612469565b82525050565b60006020820190506124a96000830184612485565b92915050565b6124b8816123f3565b82525050565b60006020820190506124d360008301846124af565b92915050565b6000806000606084860312156124f2576124f161221a565b5b6000612500868287016123de565b9350506020612511868287016123de565b925050604061252286828701612414565b9150509250925092565b6000602082840312156125425761254161221a565b5b6000612550848285016123de565b91505092915050565b600080604083850312156125705761256f61221a565b5b600061257e85828601612414565b925050602061258f85828601612414565b9150509250929050565b6000602082840312156125af576125ae61221a565b5b60006125bd84828501612414565b91505092915050565b6000819050919050565b6125d9816125c6565b82525050565b60006020820190506125f460008301846125d0565b92915050565b612603816125c6565b811461260e57600080fd5b50565b600081359050612620816125fa565b92915050565b60006020828403121561263c5761263b61221a565b5b600061264a84828501612611565b91505092915050565b61265c816123b5565b82525050565b60006020820190506126776000830184612653565b92915050565b600080600080608085870312156126975761269661221a565b5b60006126a587828801612414565b94505060206126b687828801612414565b93505060406126c787828801612414565b92505060606126d887828801612414565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272b57607f821691505b60208210810361273e5761273d6126e4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061277e826123f3565b9150612789836123f3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127be576127bd612744565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612803826123f3565b915061280e836123f3565b92508261281e5761281d6127c9565b5b828204905092915050565b6000612834826123f3565b915061283f836123f3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561287857612877612744565b5b828202905092915050565b600061288e826123f3565b9150612899836123f3565b9250828210156128ac576128ab612744565b5b828203905092915050565b60006128c2826123f3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128f4576128f3612744565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612935600a836122e5565b9150612940826128ff565b602082019050919050565b6000602082019050818103600083015261296481612928565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b60006129a16007836122e5565b91506129ac8261296b565b602082019050919050565b600060208201905081810360008301526129d081612994565b9050919050565b60006129e282612469565b91506129ed83612469565b9250816fffffffffffffffffffffffffffffffff0483118215151615612a1657612a15612744565b5b828202905092915050565b6000819050919050565b6000612a46612a41612a3c84612469565b612a21565b6123f3565b9050919050565b612a5681612a2b565b82525050565b6000602082019050612a716000830184612a4d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612aaf81612469565b8114612aba57600080fd5b50565b600081519050612acc81612aa6565b92915050565b600060208284031215612ae857612ae761221a565b5b6000612af684828501612abd565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612b35600d836122e5565b9150612b4082612aff565b602082019050919050565b60006020820190508181036000830152612b6481612b28565b905091905056fea264697066735822122062c31e95bd6895f83a0143b8b2662ee1e29e96dcc6cdf00d59c085ca9228ddc264736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200035c565b6080908152503480156200003657600080fd5b50604051620037e9380380620037e983398181016040528101906200005c91906200065b565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000128919062000993565b5085600790816200013a919062000993565b508460ff166008819055504260038190555060035460a08181525050603c836200016591906200035c565b60c081815250506b204fce5e3e25026110000000600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e0818152505060006200021d6000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b6640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600a8190555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560ff16600a620002a2919062000bce565b600b81905550505050505050505062000c1f565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620003698262000323565b9150620003768362000323565b9250828202620003868162000323565b91508282048414831517620003a0576200039f6200032d565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200041082620003c5565b810181811067ffffffffffffffff82111715620004325762000431620003d6565b5b80604052505050565b600062000447620003a7565b905062000455828262000405565b919050565b600067ffffffffffffffff821115620004785762000477620003d6565b5b6200048382620003c5565b9050602081019050919050565b60005b83811015620004b057808201518184015260208101905062000493565b60008484015250505050565b6000620004d3620004cd846200045a565b6200043b565b905082815260208101848484011115620004f257620004f1620003c0565b5b620004ff84828562000490565b509392505050565b600082601f8301126200051f576200051e620003bb565b5b815162000531848260208601620004bc565b91505092915050565b600060ff82169050919050565b62000552816200053a565b81146200055e57600080fd5b50565b600081519050620005728162000547565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200059f8162000578565b8114620005ab57600080fd5b50565b600081519050620005bf8162000594565b92915050565b620005d08162000323565b8114620005dc57600080fd5b50565b600081519050620005f081620005c5565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200062382620005f6565b9050919050565b620006358162000616565b81146200064157600080fd5b50565b60008151905062000655816200062a565b92915050565b600080600080600080600060e0888a0312156200067d576200067c620003b1565b5b600088015167ffffffffffffffff8111156200069e576200069d620003b6565b5b620006ac8a828b0162000507565b975050602088015167ffffffffffffffff811115620006d057620006cf620003b6565b5b620006de8a828b0162000507565b9650506040620006f18a828b0162000561565b9550506060620007048a828b01620005ae565b9450506080620007178a828b01620005df565b93505060a06200072a8a828b0162000644565b92505060c06200073d8a828b01620005df565b91505092959891949750929550565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200079f57607f821691505b602082108103620007b557620007b462000757565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008227fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620007e0565b6200082e8683620007e0565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620008716200086b620008658462000323565b62000846565b62000323565b9050919050565b6000819050919050565b6200088d8362000850565b620008a56200089c8262000878565b848454620007f0565b825550505050565b600090565b620008bc620008ad565b620008c981848462000882565b505050565b5b81811015620008f157620008e5600082620008b2565b600181019050620008cf565b5050565b601f82111562000940576200090a81620007bb565b6200091584620007d0565b8101602085101562000925578190505b6200093d6200093485620007d0565b830182620008ce565b50505b505050565b60008160020a8304905092915050565b6000620009686000198460080262000945565b1980831691505092915050565b600062000983838362000955565b9150826002028217905092915050565b6200099e826200074c565b67ffffffffffffffff811115620009ba57620009b9620003d6565b5b620009c6825462000786565b620009d3828285620008f5565b600060209050601f83116001811462000a0b5760008415620009f6578287015190505b62000a02858262000975565b86555062000a72565b601f19841662000a1b86620007bb565b60005b8281101562000a455784890151825560018201915060208501945060208101905062000a1e565b8683101562000a65578489015162000a61601f89168262000955565b8355505b6001600288020188555050505b505050505050565b6000600282049050919050565b6000808291508390505b600185111562000ad95780860481111562000ab15762000ab06200032d565b5b600185161562000ac15780820291505b808102905062000ad18562000a7a565b945062000a91565b94509492505050565b60008262000af4576001905062000bc7565b8162000b04576000905062000bc7565b816001811462000b1d576002811462000b285762000b5e565b600191505062000bc7565b60ff84111562000b3d5762000b3c6200032d565b5b8360020a91508482111562000b575762000b566200032d565b5b5062000bc7565b5060208310610133831016604e8410600b841016171562000b985782820a90508381111562000b925762000b916200032d565b5b62000bc7565b62000ba7848484600162000a87565b9250905081840481111562000bc15762000bc06200032d565b5b81810290505b9392505050565b600062000bdb8262000323565b915062000be88362000323565b925062000c177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000ae2565b905092915050565b60805160a05160c05160e051612b5162000c9860003960008181610cc701528181610f170152611c0b0152600081816111b901528181611a820152611caa0152600081816111e501528181611ccb0152611d1001526000818161125801528181611290015281816113080152611a5e0152612b516000f3fe608060405234801561001057600080fd5b5060043610610286576000357c0100000000000000000000000000000000000000000000000000000000900480636ffa8a051161016e5780639da7d8ba116100e0578063e3ab207a116100a4578063e3ab207a14610847578063e54d63f714610877578063e8095295146108a7578063eda4e6d6146108c5578063f2fde38b146108e3578063f83da35d1461091357610286565b80639da7d8ba1461077b578063a9059cbb146107ab578063ab28cea0146107db578063b470aade146107f9578063c0ab70771461081757610286565b80638da5cb5b116101325780638da5cb5b146106b75780638f0b2d5d146106d55780638f1df6bc146106f15780638f770ad01461070f57806395d89b411461072d578063983b2d561461074b57610286565b80636ffa8a05146105eb57806370a082311461061b578063731f237c1461064b57806379ba5097146106695780638d34855a1461068757610286565b8063313ce5671161020757806351b4541c116101cb57806351b4541c146104ef578063573cc5071461051f57806358b2833b1461053d5780636721d4ef1461055b5780636787a9be1461058b5780636a2d094e146105bb57610286565b8063313ce5671461041157806340452d911461042f578063449a52f81461045f57806347a505171461048f5780634abfbba2146104bf57610286565b80631989c6a81161024e5780631989c6a814610345578063229ba1971461036357806323b872dd146103815780633092afd5146103b157806331333487146103e157610286565b806301ffc9a71461028b57806306fdde03146102bb578063095ea7b3146102d957806309f28f3c1461030957806318160ddd14610327575b600080fd5b6102a560048036038101906102a09190612277565b610943565b6040516102b291906122bf565b60405180910390f35b6102c3610ae9565b6040516102d0919061236a565b60405180910390f35b6102f360048036038101906102ee9190612420565b610b77565b60405161030091906122bf565b60405180910390f35b610311610c91565b60405161031e919061248b565b60405180910390f35b61032f610cb3565b60405161033c91906124b5565b60405180910390f35b61034d610cb9565b60405161035a91906124b5565b60405180910390f35b61036b610cc5565b60405161037891906124b5565b60405180910390f35b61039b600480360381019061039691906124d0565b610ce9565b6040516103a891906122bf565b60405180910390f35b6103cb60048036038101906103c69190612523565b610e09565b6040516103d891906122bf565b60405180910390f35b6103fb60048036038101906103f69190612550565b610efc565b60405161040891906124b5565b60405180910390f35b610419610fb0565b60405161042691906124b5565b60405180910390f35b61044960048036038101906104449190612590565b610fb6565b60405161045691906125d6565b60405180910390f35b61047960048036038101906104749190612420565b610fda565b60405161048691906122bf565b60405180910390f35b6104a960048036038101906104a49190612523565b61116c565b6040516104b691906124b5565b60405180910390f35b6104d960048036038101906104d49190612590565b6111b5565b6040516104e691906124b5565b60405180910390f35b61050960048036038101906105049190612590565b611215565b60405161051691906124b5565b60405180910390f35b610527611236565b60405161053491906124b5565b60405180910390f35b61054561123c565b60405161055291906124b5565b60405180910390f35b61057560048036038101906105709190612550565b611242565b60405161058291906124b5565b60405180910390f35b6105a560048036038101906105a09190612590565b6112c3565b6040516105b291906124b5565b60405180910390f35b6105d560048036038101906105d09190612590565b611343565b6040516105e291906124b5565b60405180910390f35b6106056004803603810190610600919061261d565b611364565b60405161061291906124b5565b60405180910390f35b61063560048036038101906106309190612523565b61139e565b60405161064291906124b5565b60405180910390f35b610653611456565b60405161066091906122bf565b60405180910390f35b610671611467565b60405161067e91906122bf565b60405180910390f35b6106a1600480360381019061069c919061261d565b61160e565b6040516106ae91906124b5565b60405180910390f35b6106bf61163c565b6040516106cc9190612659565b60405180910390f35b6106ef60048036038101906106ea9190612523565b611662565b005b6106f9611700565b60405161070691906122bf565b60405180910390f35b610717611849565b60405161072491906124b5565b60405180910390f35b61073561184f565b604051610742919061236a565b60405180910390f35b61076560048036038101906107609190612523565b6118dd565b60405161077291906122bf565b60405180910390f35b6107956004803603810190610790919061261d565b61199a565b6040516107a291906124b5565b60405180910390f35b6107c560048036038101906107c09190612420565b6119c6565b6040516107d291906122bf565b60405180910390f35b6107e3611a5c565b6040516107f091906124b5565b60405180910390f35b610801611a80565b60405161080e91906124b5565b60405180910390f35b610831600480360381019061082c9190612590565b611aa4565b60405161083e91906122bf565b60405180910390f35b610861600480360381019061085c919061261d565b611bdc565b60405161086e91906124b5565b60405180910390f35b610891600480360381019061088c9190612550565b611bf0565b60405161089e91906124b5565b60405180910390f35b6108af611ca4565b6040516108bc919061248b565b60405180910390f35b6108cd611d0e565b6040516108da91906124b5565b60405180910390f35b6108fd60048036038101906108f89190612523565b611d32565b60405161090a91906122bf565b60405180910390f35b61092d60048036038101906109289190612674565b611dd4565b60405161093a91906125d6565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109975760019050610ae4565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109e95760019050610ae4565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a3b5760019050610ae4565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a8d5760019050610ae4565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610adf5760019050610ae4565b600090505b919050565b60068054610af69061270a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b229061270a565b8015610b6f5780601f10610b4457610100808354040283529160200191610b6f565b820191906000526020600020905b815481529060010190602001808311610b5257829003601f168201915b505050505081565b600080610b82611700565b50610b8c836112c3565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c1a919061276a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c7e91906124b5565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610cf6611700565b50610d00846112c3565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610d8b57600080fd5b610d96868684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610df591906124b5565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610e9257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610e9b57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f4091906127cd565b905060005b84811015610f895764e8d4a510008284610f5f91906127fe565b610f6991906127cd565b83610f749190612840565b92508080610f8190612874565b915050610f45565b5064e8d4a510008583610f9c91906127fe565b610fa691906127cd565b9250505092915050565b60085481565b60008181548110610fc657600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106090612908565b60405180910390fd5b600a546009548461107a919061276a565b11156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612974565b60405180910390fd5b6110c3611700565b506110cd836112c3565b905082600960008282546110e1919061276a565b925050819055506110f28482611e66565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161115091906124b5565b60405180910390a3611160611f2a565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111e391906127fe565b7f000000000000000000000000000000000000000000000000000000000000000061120e919061276a565b9050919050565b6000603c82426112259190612840565b61122f91906127cd565b9050919050565b600b5481565b60035481565b6000806402540be4008361125691906127fe565b7f00000000000000000000000000000000000000000000000000000000000000006112819190612840565b8461128c91906127fe565b90507f0000000000000000000000000000000000000000000000000000000000000000816112ba91906127cd565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112f49190612994565b6fffffffffffffffffffffffffffffffff167f00000000000000000000000000000000000000000000000000000000000000008361133291906127fe565b61133c91906127cd565b9050919050565b6000603c82426113539190612840565b61135d91906127cd565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b6000806000806113ad8561116c565b92506113ba600354611215565b90506114066402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113ee9190612994565b6fffffffffffffffffffffffffffffffff1682610efc565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e400000061143691906127fe565b828461144291906127fe565b61144c91906127cd565b9350505050919050565b60006114626000611aa4565b905090565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600080600061161c8461199a565b915061162784611364565b90506116338282611242565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116bc57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611716611456565b5061171f611fcc565b97506000600102880361173d57600098505050505050505050611846565b61174688611bdc565b9550600186611755919061276a565b9050611760866111b5565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179e82611343565b925060008311156117ba576117b38584611bf0565b93506117be565b8493505b6117cd60008560095484611dd4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915055611801876120c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161183191906124b5565b60405180910390a16001985050505050505050505b90565b600a5481565b6007805461185c9061270a565b80601f01602080910402602001604051908101604052809291908181526020018280546118889061270a565b80156118d55780601f106118aa576101008083540402835291602001916118d5565b820191906000526020600020905b8154815290600101906020018083116118b857829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193957600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119d3611700565b506119dd846112c3565b91506119ea338684611e41565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4991906124b5565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611ab4600354611215565b915060008203611ac957600092505050611bd7565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0b57508184105b15611b14578391505b611b1e8183610efc565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b6391906127fe565b600354611b70919061276a565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bc89190612a0c565b60405180910390a46001925050505b919050565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c3491906127cd565b905060005b84811015611c7d5764e8d4a510008284611c5391906127fe565b611c5d91906127cd565b83611c68919061276a565b92508080611c7590612874565b915050611c39565b5064e8d4a510008583611c9091906127fe565b611c9a91906127cd565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf59190612840565b611cff91906127cd565b611d09919061276a565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4e8584612113565b50611e598484611e66565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ec25760009350505050611f24565b611ecb8661116c565b92508483611ed9919061276a565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f489190612840565b81548110611f5957611f58612a27565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa49190612840565b81548110611fb557611fb4612a27565b5b906000526020600020018190555060019250505090565b6000806000806001600080549050611fe49190612840565b81548110611ff557611ff4612a27565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061208d9190612a82565b6fffffffffffffffffffffffffffffffff1690506120aa82611bdc565b81116120be576000600102925050506120c4565b81925050505b90565b6000806120d38361160e565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612104836112c3565b611e66565b5080915050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361216f5760009350505050612214565b6121788661116c565b9250848310156121bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b490612afb565b60405180910390fd5b84836121c99190612840565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122548161221f565b811461225f57600080fd5b50565b6000813590506122718161224b565b92915050565b60006020828403121561228d5761228c61221a565b5b600061229b84828501612262565b91505092915050565b60008115159050919050565b6122b9816122a4565b82525050565b60006020820190506122d460008301846122b0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123145780820151818401526020810190506122f9565b60008484015250505050565b6000601f19601f8301169050919050565b600061233c826122da565b61234681856122e5565b93506123568185602086016122f6565b61235f81612320565b840191505092915050565b600060208201905081810360008301526123848184612331565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123b78261238c565b9050919050565b6123c7816123ac565b81146123d257600080fd5b50565b6000813590506123e4816123be565b92915050565b6000819050919050565b6123fd816123ea565b811461240857600080fd5b50565b60008135905061241a816123f4565b92915050565b600080604083850312156124375761243661221a565b5b6000612445858286016123d5565b92505060206124568582860161240b565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61248581612460565b82525050565b60006020820190506124a0600083018461247c565b92915050565b6124af816123ea565b82525050565b60006020820190506124ca60008301846124a6565b92915050565b6000806000606084860312156124e9576124e861221a565b5b60006124f7868287016123d5565b9350506020612508868287016123d5565b92505060406125198682870161240b565b9150509250925092565b6000602082840312156125395761253861221a565b5b6000612547848285016123d5565b91505092915050565b600080604083850312156125675761256661221a565b5b60006125758582860161240b565b92505060206125868582860161240b565b9150509250929050565b6000602082840312156125a6576125a561221a565b5b60006125b48482850161240b565b91505092915050565b6000819050919050565b6125d0816125bd565b82525050565b60006020820190506125eb60008301846125c7565b92915050565b6125fa816125bd565b811461260557600080fd5b50565b600081359050612617816125f1565b92915050565b6000602082840312156126335761263261221a565b5b600061264184828501612608565b91505092915050565b612653816123ac565b82525050565b600060208201905061266e600083018461264a565b92915050565b6000806000806080858703121561268e5761268d61221a565b5b600061269c8782880161240b565b94505060206126ad8782880161240b565b93505060406126be8782880161240b565b92505060606126cf8782880161240b565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061272257607f821691505b602082108103612735576127346126db565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612775826123ea565b9150612780836123ea565b92508282019050808211156127985761279761273b565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006127d8826123ea565b91506127e3836123ea565b9250826127f3576127f261279e565b5b828204905092915050565b6000612809826123ea565b9150612814836123ea565b9250828202612822816123ea565b915082820484148315176128395761283861273b565b5b5092915050565b600061284b826123ea565b9150612856836123ea565b925082820390508181111561286e5761286d61273b565b5b92915050565b600061287f826123ea565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128b1576128b061273b565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006128f2600a836122e5565b91506128fd826128bc565b602082019050919050565b60006020820190508181036000830152612921816128e5565b9050919050565b7f4552525f43415000000000000000000000000000000000000000000000000000600082015250565b600061295e6007836122e5565b915061296982612928565b602082019050919050565b6000602082019050818103600083015261298d81612951565b9050919050565b600061299f82612460565b91506129aa83612460565b92508282026129b881612460565b91508082146129ca576129c961273b565b5b5092915050565b6000819050919050565b60006129f66129f16129ec84612460565b6129d1565b6123ea565b9050919050565b612a06816129db565b82525050565b6000602082019050612a2160008301846129fd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a5f81612460565b8114612a6a57600080fd5b50565b600081519050612a7c81612a56565b92915050565b600060208284031215612a9857612a9761221a565b5b6000612aa684828501612a6d565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612ae5600d836122e5565b9150612af082612aaf565b602082019050919050565b60006020820190508181036000830152612b1481612ad8565b905091905056fea26469706673582212205a3fc58caf4d1c522f4f61ec2bbe096063676ac1ce8fe3918ede741dfb777b8164736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 2828c3b..855f028 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e400000062000023919062000407565b6080908152503480156200003657600080fd5b50604051620034973803806200349783398181016040528101906200005c919062000726565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555085600690805190602001906200012f9291906200031e565b508460079080519060200190620001489291906200031e565b508360ff166008819055504260038190555060035460a08181525050603c8262000173919062000407565b60c0818152505060646a52b7d2dcc80cd2e400000062000194919062000800565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff1660e081815250506000620002386000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1660006001620002b1640100000000026401000000009004565b9050600081908060018154018082558091505060019003906000526020600020016000909190919091505581600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050620008b5565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b8280546200032c9062000880565b90600052602060002090601f0160209004810192826200035057600085556200039c565b82601f106200036b57805160ff19168380011785556200039c565b828001600101855582156200039c579182015b828111156200039b5782518255916020019190600101906200037e565b5b509050620003ab9190620003af565b5090565b5b80821115620003ca576000816000905550600101620003b0565b5090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200041482620003ce565b91506200042183620003ce565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200045d576200045c620003d8565b5b828202905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004d18262000486565b810181811067ffffffffffffffff82111715620004f357620004f262000497565b5b80604052505050565b60006200050862000468565b9050620005168282620004c6565b919050565b600067ffffffffffffffff82111562000539576200053862000497565b5b620005448262000486565b9050602081019050919050565b60005b838110156200057157808201518184015260208101905062000554565b8381111562000581576000848401525b50505050565b60006200059e62000598846200051b565b620004fc565b905082815260208101848484011115620005bd57620005bc62000481565b5b620005ca84828562000551565b509392505050565b600082601f830112620005ea57620005e96200047c565b5b8151620005fc84826020860162000587565b91505092915050565b600060ff82169050919050565b6200061d8162000605565b81146200062957600080fd5b50565b6000815190506200063d8162000612565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200066a8162000643565b81146200067657600080fd5b50565b6000815190506200068a816200065f565b92915050565b6200069b81620003ce565b8114620006a757600080fd5b50565b600081519050620006bb8162000690565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ee82620006c1565b9050919050565b6200070081620006e1565b81146200070c57600080fd5b50565b6000815190506200072081620006f5565b92915050565b60008060008060008060c0878903121562000746576200074562000472565b5b600087015167ffffffffffffffff81111562000767576200076662000477565b5b6200077589828a01620005d2565b965050602087015167ffffffffffffffff81111562000799576200079862000477565b5b620007a789828a01620005d2565b9550506040620007ba89828a016200062c565b9450506060620007cd89828a0162000679565b9350506080620007e089828a01620006aa565b92505060a0620007f389828a016200070f565b9150509295509295509295565b60006200080d8262000643565b91506200081a8362000643565b9250816fffffffffffffffffffffffffffffffff0483118215151615620008465762000845620003d8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200089957607f821691505b602082108103620008af57620008ae62000851565b5b50919050565b60805160a05160c05160e051612b696200092e60003960008181610cf001528181610f400152611c0801526000818161119001528181611a790152611ca70152600081816111bc01528181611cc80152611d0d01526000818161122901528181611261015281816112d90152611a550152612b696000f3fe608060405234801561001057600080fd5b5060043610610291576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016e578063a9059cbb116100e0578063e3ab207a116100a4578063e3ab207a14610870578063e54d63f7146108a0578063e8095295146108d0578063eda4e6d6146108ee578063f2fde38b1461090c578063f83da35d1461093c57610291565b8063a9059cbb146107b6578063ab28cea0146107e6578063b470aade14610804578063c0ab707714610822578063d340ef8a1461085257610291565b80638da5cb5b116101325780638da5cb5b146106e05780638f0b2d5d146106fe5780638f1df6bc1461071a57806395d89b4114610738578063983b2d56146107565780639da7d8ba1461078657610291565b8063731f237c1461063857806374bedb951461065657806379ba50971461067457806384dde4af146106925780638d34855a146106b057610291565b806340452d911161020757806358b2833b116101cb57806358b2833b1461052a5780636721d4ef146105485780636787a9be146105785780636a2d094e146105a85780636ffa8a05146105d857806370a082311461060857610291565b806340452d911461043a578063449a52f81461046a57806347a505171461049a5780634abfbba2146104ca57806351b4541c146104fa57610291565b80631989c6a8116102595780631989c6a814610350578063229ba1971461036e57806323b872dd1461038c5780633092afd5146103bc57806331333487146103ec578063313ce5671461041c57610291565b806301ffc9a71461029657806306fdde03146102c6578063095ea7b3146102e457806309f28f3c1461031457806318160ddd14610332575b600080fd5b6102b060048036038101906102ab91906122ab565b61096c565b6040516102bd91906122f3565b60405180910390f35b6102ce610b12565b6040516102db91906123a7565b60405180910390f35b6102fe60048036038101906102f9919061245d565b610ba0565b60405161030b91906122f3565b60405180910390f35b61031c610cba565b60405161032991906124c8565b60405180910390f35b61033a610cdc565b60405161034791906124f2565b60405180910390f35b610358610ce2565b60405161036591906124f2565b60405180910390f35b610376610cee565b60405161038391906124f2565b60405180910390f35b6103a660048036038101906103a1919061250d565b610d12565b6040516103b391906122f3565b60405180910390f35b6103d660048036038101906103d19190612560565b610e32565b6040516103e391906122f3565b60405180910390f35b6104066004803603810190610401919061258d565b610f25565b60405161041391906124f2565b60405180910390f35b610424610fd9565b60405161043191906124f2565b60405180910390f35b610454600480360381019061044f91906125cd565b610fdf565b6040516104619190612613565b60405180910390f35b610484600480360381019061047f919061245d565b611003565b60405161049191906122f3565b60405180910390f35b6104b460048036038101906104af9190612560565b611143565b6040516104c191906124f2565b60405180910390f35b6104e460048036038101906104df91906125cd565b61118c565b6040516104f191906124f2565b60405180910390f35b610514600480360381019061050f91906125cd565b6111ec565b60405161052191906124f2565b60405180910390f35b61053261120d565b60405161053f91906124f2565b60405180910390f35b610562600480360381019061055d919061258d565b611213565b60405161056f91906124f2565b60405180910390f35b610592600480360381019061058d91906125cd565b611294565b60405161059f91906124f2565b60405180910390f35b6105c260048036038101906105bd91906125cd565b611314565b6040516105cf91906124f2565b60405180910390f35b6105f260048036038101906105ed919061265a565b611335565b6040516105ff91906124f2565b60405180910390f35b610622600480360381019061061d9190612560565b61136f565b60405161062f91906124f2565b60405180910390f35b610640611427565b60405161064d91906122f3565b60405180910390f35b61065e611438565b60405161066b91906124f2565b60405180910390f35b61067c61143e565b60405161068991906122f3565b60405180910390f35b61069a6115e5565b6040516106a79190612696565b60405180910390f35b6106ca60048036038101906106c5919061265a565b61160b565b6040516106d791906124f2565b60405180910390f35b6106e8611639565b6040516106f59190612696565b60405180910390f35b61071860048036038101906107139190612560565b61165f565b005b6107226116fd565b60405161072f91906122f3565b60405180910390f35b610740611846565b60405161074d91906123a7565b60405180910390f35b610770600480360381019061076b9190612560565b6118d4565b60405161077d91906122f3565b60405180910390f35b6107a0600480360381019061079b919061265a565b611991565b6040516107ad91906124f2565b60405180910390f35b6107d060048036038101906107cb919061245d565b6119bd565b6040516107dd91906122f3565b60405180910390f35b6107ee611a53565b6040516107fb91906124f2565b60405180910390f35b61080c611a77565b60405161081991906124f2565b60405180910390f35b61083c600480360381019061083791906125cd565b611a9b565b60405161084991906122f3565b60405180910390f35b61085a611bd3565b60405161086791906124f2565b60405180910390f35b61088a6004803603810190610885919061265a565b611bd9565b60405161089791906124f2565b60405180910390f35b6108ba60048036038101906108b5919061258d565b611bed565b6040516108c791906124f2565b60405180910390f35b6108d8611ca1565b6040516108e591906124c8565b60405180910390f35b6108f6611d0b565b60405161090391906124f2565b60405180910390f35b61092660048036038101906109219190612560565b611d2f565b60405161093391906122f3565b60405180910390f35b610956600480360381019061095191906126b1565b611dd1565b6040516109639190612613565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109c05760019050610b0d565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a125760019050610b0d565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a645760019050610b0d565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ab65760019050610b0d565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b085760019050610b0d565b600090505b919050565b60068054610b1f90612747565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4b90612747565b8015610b985780601f10610b6d57610100808354040283529160200191610b98565b820191906000526020600020905b815481529060010190602001808311610b7b57829003601f168201915b505050505081565b600080610bab6116fd565b50610bb583611294565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4391906127a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610ca791906124f2565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b60095481565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610d1f6116fd565b50610d2984611294565b915081600d60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610db457600080fd5b610dbf868684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610e1e91906124f2565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ebb57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ec457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000610f69919061282c565b905060005b84811015610fb25764e8d4a510008284610f88919061285d565b610f92919061282c565b83610f9d91906128b7565b92508080610faa906128eb565b915050610f6e565b5064e8d4a510008583610fc5919061285d565b610fcf919061282c565b9250505092915050565b60085481565b60008181548110610fef57600080fd5b906000526020600020016000915090505481565b600080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611092576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110899061297f565b60405180910390fd5b61109a6116fd565b506110a483611294565b905082600960008282546110b891906127a7565b925050819055506110c98482611e63565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161112791906124f2565b60405180910390a3611137611f27565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826111ba919061285d565b7f00000000000000000000000000000000000000000000000000000000000000006111e591906127a7565b9050919050565b6000603c82426111fc91906128b7565b611206919061282c565b9050919050565b60035481565b6000806402540be40083611227919061285d565b7f000000000000000000000000000000000000000000000000000000000000000061125291906128b7565b8461125d919061285d565b90507f00000000000000000000000000000000000000000000000000000000000000008161128b919061282c565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166112c5919061299f565b6fffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000083611303919061285d565b61130d919061282c565b9050919050565b6000603c824261132491906128b7565b61132e919061282c565b9050919050565b6000606860ff167affffffffffffffffffffffffffff00000000000000000000000000836001900416908060020a82049150509050919050565b60008060008061137e85611143565b925061138b6003546111ec565b90506113d76402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166113bf919061299f565b6fffffffffffffffffffffffffffffffff1682610f25565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e4000000611407919061285d565b8284611413919061285d565b61141d919061282c565b9350505050919050565b60006114336000611a9b565b905090565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461149b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600061161984611991565b915061162484611335565b90506116308282611213565b92505050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116b957600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000806000806000611713611427565b5061171c611fc9565b97506000600102880361173a57600098505050505050505050611843565b61174388611bd9565b955060018661175291906127a7565b905061175d8661118c565b9150600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16945061179b82611314565b925060008311156117b7576117b08584611bed565b93506117bb565b8493505b6117ca60008560095484611dd1565b965060008790806001815401808255809150506001900390600052602060002001600090919091909150556117fe876120b5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161182e91906124f2565b60405180910390a16001985050505050505050505b90565b6007805461185390612747565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612747565b80156118cc5780601f106118a1576101008083540402835291602001916118cc565b820191906000526020600020905b8154815290600101906020018083116118af57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193057600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000602060ff166cffffffffffffffffff00000000836001900416908060020a82049150509050919050565b60008060006119ca6116fd565b506119d484611294565b91506119e1338684611e3e565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611a4091906124f2565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000611aab6003546111ec565b915060008203611ac057600092505050611bce565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050600084118015611b0257508184105b15611b0b578391505b611b158183610f25565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c82611b5a919061285d565b600354611b6791906127a7565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff16604051611bbf9190612a24565b60405180910390a46001925050505b919050565b600a5481565b600063ffffffff8260019004169050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f0000000000000000000000000000000000000000000000000000000000000000611c31919061282c565b905060005b84811015611c7a5764e8d4a510008284611c50919061285d565b611c5a919061282c565b83611c6591906127a7565b92508080611c72906128eb565b915050611c36565b5064e8d4a510008583611c8d919061285d565b611c97919061282c565b9250505092915050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611cf291906128b7565b611cfc919061282c565b611d0691906127a7565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d8b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000807affffffffffffffffffffffffffff00000000000000000000000000606860ff16869060020a0216600102811790506cffffffffffffffffff00000000602060ff16859060020a02166001028117905063ffffffff83166001028117905080915050949350505050565b600080611e4b8584612147565b50611e568484611e63565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611ebf5760009350505050611f21565b611ec886611143565b92508483611ed691906127a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000806000600954905060006001600080549050611f4591906128b7565b81548110611f5657611f55612a3f565b5b90600052602060002001546001900491506cffffffffffffffffff000000001982169150602060ff16819060020a02821791508160010260006001600080549050611fa191906128b7565b81548110611fb257611fb1612a3f565b5b906000526020600020018190555060019250505090565b600080600080600a5481548110611fe357611fe2612a3f565b5b906000526020600020015491503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207b9190612a9a565b6fffffffffffffffffffffffffffffffff16905061209882611bd9565b81116120ac576000600102925050506120b2565b81925050505b90565b60008060006120c38461160b565b9150600b546120d183611294565b6120db91906128b7565b9050612109600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682611e63565b506001600a600082825461211d91906127a7565b9250508190555080600b600082825461213691906127a7565b925050819055508192505050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036121a35760009350505050612248565b6121ac86611143565b9250848310156121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890612b13565b60405180910390fd5b84836121fd91906128b7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61228881612253565b811461229357600080fd5b50565b6000813590506122a58161227f565b92915050565b6000602082840312156122c1576122c061224e565b5b60006122cf84828501612296565b91505092915050565b60008115159050919050565b6122ed816122d8565b82525050565b600060208201905061230860008301846122e4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561234857808201518184015260208101905061232d565b83811115612357576000848401525b50505050565b6000601f19601f8301169050919050565b60006123798261230e565b6123838185612319565b935061239381856020860161232a565b61239c8161235d565b840191505092915050565b600060208201905081810360008301526123c1818461236e565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123f4826123c9565b9050919050565b612404816123e9565b811461240f57600080fd5b50565b600081359050612421816123fb565b92915050565b6000819050919050565b61243a81612427565b811461244557600080fd5b50565b60008135905061245781612431565b92915050565b600080604083850312156124745761247361224e565b5b600061248285828601612412565b925050602061249385828601612448565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6124c28161249d565b82525050565b60006020820190506124dd60008301846124b9565b92915050565b6124ec81612427565b82525050565b600060208201905061250760008301846124e3565b92915050565b6000806000606084860312156125265761252561224e565b5b600061253486828701612412565b935050602061254586828701612412565b925050604061255686828701612448565b9150509250925092565b6000602082840312156125765761257561224e565b5b600061258484828501612412565b91505092915050565b600080604083850312156125a4576125a361224e565b5b60006125b285828601612448565b92505060206125c385828601612448565b9150509250929050565b6000602082840312156125e3576125e261224e565b5b60006125f184828501612448565b91505092915050565b6000819050919050565b61260d816125fa565b82525050565b60006020820190506126286000830184612604565b92915050565b612637816125fa565b811461264257600080fd5b50565b6000813590506126548161262e565b92915050565b6000602082840312156126705761266f61224e565b5b600061267e84828501612645565b91505092915050565b612690816123e9565b82525050565b60006020820190506126ab6000830184612687565b92915050565b600080600080608085870312156126cb576126ca61224e565b5b60006126d987828801612448565b94505060206126ea87828801612448565b93505060406126fb87828801612448565b925050606061270c87828801612448565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275f57607f821691505b60208210810361277257612771612718565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006127b282612427565b91506127bd83612427565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156127f2576127f1612778565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061283782612427565b915061284283612427565b925082612852576128516127fd565b5b828204905092915050565b600061286882612427565b915061287383612427565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156128ac576128ab612778565b5b828202905092915050565b60006128c282612427565b91506128cd83612427565b9250828210156128e0576128df612778565b5b828203905092915050565b60006128f682612427565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361292857612927612778565b5b600182019050919050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000612969600a83612319565b915061297482612933565b602082019050919050565b600060208201905081810360008301526129988161295c565b9050919050565b60006129aa8261249d565b91506129b58361249d565b9250816fffffffffffffffffffffffffffffffff04831182151516156129de576129dd612778565b5b828202905092915050565b6000819050919050565b6000612a0e612a09612a048461249d565b6129e9565b612427565b9050919050565b612a1e816129f3565b82525050565b6000602082019050612a396000830184612a15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b612a778161249d565b8114612a8257600080fd5b50565b600081519050612a9481612a6e565b92915050565b600060208284031215612ab057612aaf61224e565b5b6000612abe84828501612a85565b91505092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000612afd600d83612319565b9150612b0882612ac7565b602082019050919050565b60006020820190508181036000830152612b2c81612af0565b905091905056fea264697066735822122065b90287fa7f2775639ada07b04e464a1dddb8f8c5f37cf825ec850b55ac7deb64736f6c634300080d0033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043b565b6080908152503480156200003657600080fd5b506040516200448a3803806200448a83398181016040528101906200005c91906200073a565b62000066620003c1565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000132919062000a5b565b50856007908162000144919062000a5b565b508460ff166008819055504260038190555060035460a08181525050603c836200016f91906200043b565b60c0818152505060646a52b7d2dcc80cd2e400000062000190919062000b42565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e08181525050620002326000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600060016200033d640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550505081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b88565b62000347620003c1565b62000351620003c1565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004488262000402565b9150620004558362000402565b9250828202620004658162000402565b915082820484148315176200047f576200047e6200040c565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ef82620004a4565b810181811067ffffffffffffffff82111715620005115762000510620004b5565b5b80604052505050565b60006200052662000486565b9050620005348282620004e4565b919050565b600067ffffffffffffffff821115620005575762000556620004b5565b5b6200056282620004a4565b9050602081019050919050565b60005b838110156200058f57808201518184015260208101905062000572565b60008484015250505050565b6000620005b2620005ac8462000539565b6200051a565b905082815260208101848484011115620005d157620005d06200049f565b5b620005de8482856200056f565b509392505050565b600082601f830112620005fe57620005fd6200049a565b5b8151620006108482602086016200059b565b91505092915050565b600060ff82169050919050565b620006318162000619565b81146200063d57600080fd5b50565b600081519050620006518162000626565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067e8162000657565b81146200068a57600080fd5b50565b6000815190506200069e8162000673565b92915050565b620006af8162000402565b8114620006bb57600080fd5b50565b600081519050620006cf81620006a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070282620006d5565b9050919050565b6200071481620006f5565b81146200072057600080fd5b50565b600081519050620007348162000709565b92915050565b60008060008060008060c087890312156200075a576200075962000490565b5b600087015167ffffffffffffffff8111156200077b576200077a62000495565b5b6200078989828a01620005e6565b965050602087015167ffffffffffffffff811115620007ad57620007ac62000495565b5b620007bb89828a01620005e6565b9550506040620007ce89828a0162000640565b9450506060620007e189828a016200068d565b9350506080620007f489828a01620006be565b92505060a06200080789828a0162000723565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086757607f821691505b6020821081036200087d576200087c6200081f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a8565b620008f68683620008a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000939620009336200092d8462000402565b6200090e565b62000402565b9050919050565b6000819050919050565b620009558362000918565b6200096d620009648262000940565b848454620008b8565b825550505050565b600090565b6200098462000975565b620009918184846200094a565b505050565b5b81811015620009b957620009ad6000826200097a565b60018101905062000997565b5050565b601f82111562000a0857620009d28162000883565b620009dd8462000898565b81016020851015620009ed578190505b62000a05620009fc8562000898565b83018262000996565b50505b505050565b60008160020a8304905092915050565b600062000a306000198460080262000a0d565b1980831691505092915050565b600062000a4b838362000a1d565b9150826002028217905092915050565b62000a668262000814565b67ffffffffffffffff81111562000a825762000a81620004b5565b5b62000a8e82546200084e565b62000a9b828285620009bd565b600060209050601f83116001811462000ad3576000841562000abe578287015190505b62000aca858262000a3d565b86555062000b3a565b601f19841662000ae38662000883565b60005b8281101562000b0d5784890151825560018201915060208501945060208101905062000ae6565b8683101562000b2d578489015162000b29601f89168262000a1d565b8355505b6001600288020188555050505b505050505050565b600062000b4f8262000657565b915062000b5c8362000657565b925082820262000b6c8162000657565b915080821462000b815762000b806200040c565b5b5092915050565b60805160a05160c05160e05161388962000c0160003960008181610eb9015261119c01526000818161170001528181611dbe0152818161236b015261250801526000818161172c01528181612529015261256e0152600081816118060152818161183e015281816118b6015261234701526138896000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a9059cbb11610106578063d397de60116100bf578063eda4e6d611610099578063eda4e6d6146109bf578063f2fde38b146109dd578063f83da35d14610a0d578063f84e521314610a3d576102d8565b8063d397de6014610953578063d89135cd14610983578063e8095295146109a1576102d8565b8063a9059cbb14610869578063ab28cea014610899578063b470aade146108b7578063c0ab7077146108d5578063c7a7f89a14610905578063d340ef8a14610935576102d8565b80638f0b2d5d116101585780638f0b2d5d146107815780638f1df6bc1461079d578063936d9e7a146107bb57806395d89b41146107eb578063983b2d5614610809578063a457c2d714610839576102d8565b8063731f237c146106cd57806373f42561146106eb57806374bedb951461070957806379ba50971461072757806384dde4af146107455780638da5cb5b14610763576102d8565b806340452d911161024357806351b4541c116101fc57806351b4541c146105bf57806358b2833b146105ef5780636721d4ef1461060d5780636787a9be1461063d5780636a2d094e1461066d57806370a082311461069d576102d8565b806340452d91146104b157806342966c68146104e3578063449a52f8146104ff57806347a505171461052f5780634abfbba21461055f5780634d0df4fd1461058f576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612d7b565b610a6d565b6040516103049190612dc3565b60405180910390f35b610315610c13565b6040516103229190612e6e565b60405180910390f35b61034560048036038101906103409190612f24565b610ca1565b6040516103529190612dc3565b60405180910390f35b610363610e72565b6040516103709190612f8f565b60405180910390f35b610381610e94565b60405161038e9190612fb9565b60405180910390f35b61039f610eab565b6040516103ac9190612fb9565b60405180910390f35b6103bd610eb7565b6040516103ca9190612fb9565b60405180910390f35b6103ed60048036038101906103e89190612fd4565b610edb565b6040516103fa9190612dc3565b60405180910390f35b61041d60048036038101906104189190613027565b61108e565b60405161042a9190612dc3565b60405180910390f35b61044d60048036038101906104489190613054565b611181565b60405161045a9190612fb9565b60405180910390f35b61046b611235565b6040516104789190612fb9565b60405180910390f35b61049b60048036038101906104969190612f24565b61123b565b6040516104a89190612dc3565b60405180910390f35b6104cb60048036038101906104c69190613094565b6113d1565b6040516104da9392919061312c565b60405180910390f35b6104fd60048036038101906104f89190613094565b611445565b005b61051960048036038101906105149190612f24565b611573565b6040516105269190612dc3565b60405180910390f35b61054960048036038101906105449190613027565b6116b3565b6040516105569190612fb9565b60405180910390f35b61057960048036038101906105749190613094565b6116fc565b6040516105869190612fb9565b60405180910390f35b6105a960048036038101906105a491906132cb565b61175c565b6040516105b69190612dc3565b60405180910390f35b6105d960048036038101906105d49190613094565b6117c9565b6040516105e69190612fb9565b60405180910390f35b6105f76117ea565b6040516106049190612fb9565b60405180910390f35b61062760048036038101906106229190613054565b6117f0565b6040516106349190612fb9565b60405180910390f35b61065760048036038101906106529190613094565b611871565b6040516106649190612fb9565b60405180910390f35b61068760048036038101906106829190613094565b6118f1565b6040516106949190612fb9565b60405180910390f35b6106b760048036038101906106b29190613027565b611912565b6040516106c49190612fb9565b60405180910390f35b6106d56119ca565b6040516106e29190612dc3565b60405180910390f35b6106f36119db565b6040516107009190612fb9565b60405180910390f35b6107116119e1565b60405161071e9190612fb9565b60405180910390f35b61072f6119e7565b60405161073c9190612dc3565b60405180910390f35b61074d611b8e565b60405161075a9190613307565b60405180910390f35b61076b611bb4565b6040516107789190613307565b60405180910390f35b61079b60048036038101906107969190613027565b611bda565b005b6107a5611c78565b6040516107b29190612dc3565b60405180910390f35b6107d560048036038101906107d091906132cb565b611f17565b6040516107e29190612fb9565b60405180910390f35b6107f3611f45565b6040516108009190612e6e565b60405180910390f35b610823600480360381019061081e9190613027565b611fd3565b6040516108309190612dc3565b60405180910390f35b610853600480360381019061084e9190612f24565b612090565b6040516108609190612dc3565b60405180910390f35b610883600480360381019061087e9190612f24565b6122af565b6040516108909190612dc3565b60405180910390f35b6108a1612345565b6040516108ae9190612fb9565b60405180910390f35b6108bf612369565b6040516108cc9190612fb9565b60405180910390f35b6108ef60048036038101906108ea9190613094565b61238d565b6040516108fc9190612dc3565b60405180910390f35b61091f600480360381019061091a91906132cb565b6124c5565b60405161092c9190612fb9565b60405180910390f35b61093d6124de565b60405161094a9190612fb9565b60405180910390f35b61096d600480360381019061096891906132cb565b6124e4565b60405161097a9190612fb9565b60405180910390f35b61098b6124f8565b6040516109989190612fb9565b60405180910390f35b6109a9612502565b6040516109b69190612f8f565b60405180910390f35b6109c761256c565b6040516109d49190612fb9565b60405180910390f35b6109f760048036038101906109f29190613027565b612590565b604051610a049190612dc3565b60405180910390f35b610a276004803603810190610a229190613322565b612632565b604051610a3491906133f8565b60405180910390f35b610a576004803603810190610a5291906132cb565b6126b2565b604051610a649190612fb9565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ac15760019050610c0e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b135760019050610c0e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b655760019050610c0e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb75760019050610c0e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c095760019050610c0e565b600090505b919050565b60068054610c2090613442565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c90613442565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6d5760008314610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906134bf565b60405180910390fd5b5b610d75611c78565b50610d7f83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5f9190612fb9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea6919061350e565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee8611c78565b50610ef284611871565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7d57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611009919061350e565b9250508190555061101b8686846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161107a9190612fb9565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61112057600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c59190613571565b905060005b8481101561120e5764e8d4a5100082846111e491906135a2565b6111ee9190613571565b836111f9919061350e565b92508080611206906135e4565b9150506111ca565b5064e8d4a51000858361122191906135a2565b61122b9190613571565b9250505092915050565b60085481565b600080611246611c78565b5061125083611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061362c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113be9190612fb9565b60405180910390a3600191505092915050565b600081815481106113e157600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff16905083565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661149b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156114e757600080fd5b60006114f282611871565b90506114fc6119ca565b5061150733826126f4565b5081600c600082825461151a919061362c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115679190612fb9565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906136ac565b60405180910390fd5b61160a611c78565b5061161483611871565b90508260096000828254611628919061362c565b9250508190555061163984826127fb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116979190612fb9565b60405180910390a36116a76128bf565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261172a91906135a2565b7f0000000000000000000000000000000000000000000000000000000000000000611755919061362c565b9050919050565b600080826000015163ffffffff16111561177957600090506117c4565b6000826020015168ffffffffffffffffff16111561179a57600090506117c4565b600082604001516cffffffffffffffffffffffffff1611156117bf57600090506117c4565b600190505b919050565b6000603c82426117d9919061350e565b6117e39190613571565b9050919050565b60035481565b6000806402540be4008361180491906135a2565b7f000000000000000000000000000000000000000000000000000000000000000061182f919061350e565b8461183a91906135a2565b90507f0000000000000000000000000000000000000000000000000000000000000000816118689190613571565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118a291906136cc565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118e091906135a2565b6118ea9190613571565b9050919050565b6000603c8242611901919061350e565b61190b9190613571565b9050919050565b600080600080611921856116b3565b925061192e6003546117c9565b905061197a6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661196291906136cc565b6fffffffffffffffffffffffffffffffff1682611181565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119aa91906135a2565b82846119b691906135a2565b6119c09190613571565b9350505050919050565b60006119d6600061238d565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3457600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c82612cd3565b611c8a612cd3565b611c92612cd3565b6000806000806000611ca26119ca565b50611cab612a9c565b9750611cb68861175c565b15611ccc57600098505050505050505050611f14565b6000600a5481548110611ce257611ce1613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff16815250509550611d9e886124e4565b9450600185611dad919061362c565b9050611db8866126b2565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611de79190613571565b9150611df38483611181565b9250611e09600084611e03610e94565b84612632565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff1602179055505050611ecf87612c41565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611eff9190612fb9565b60405180910390a16001985050505050505050505b90565b6000806000611f25846124c5565b9150611f30846126b2565b9050611f3c82826117f0565b92505050919050565b60078054611f5290613442565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90613442565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461202f57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061209c83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212757600080fd5b61212f611c78565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bc919061350e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161229c9190612fb9565b60405180910390a3600191505092915050565b60008060006122bc611c78565b506122c684611871565b91506122d33386846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516123329190612fb9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061239d6003546117c9565b9150600082036123b2576000925050506124c0565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000841180156123f457508184105b156123fd578391505b6124078183611181565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261244c91906135a2565b600354612459919061362c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516124b19190613773565b60405180910390a46001925050505b919050565b6000816020015168ffffffffffffffffff169050919050565b600a5481565b6000816000015163ffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612553919061350e565b61255d9190613571565b612567919061362c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ec57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61263a612cd3565b612642612cd3565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b600081604001516cffffffffffffffffffffffffff169050919050565b6000806126dc85846126f4565b506126e784846127fb565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361275057600093505050506127f5565b612759866116b3565b92508483101561279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906137da565b60405180910390fd5b84836127aa919061350e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361285757600093505050506128b9565b612860866116b3565b9250848361286e919061362c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006128c9612cd3565b60006128d3610e94565b9050600060016000805490506128e9919061350e565b815481106128fa576128f9613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506129e4919061350e565b815481106129f5576129f4613709565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff16021790555090505060019250505090565b612aa4612cd3565b612aac612cd3565b612ab4612cd3565b600080600a5481548110612acb57612aca613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c099190613826565b6fffffffffffffffffffffffffffffffff169050612c26836124e4565b8111612c3757819350505050612c3e565b8293505050505b90565b6000806000612c4f84611f17565b9150600b54612c5d83611871565b612c67919061350e565b9050612c95600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127fb565b506001600a6000828254612ca9919061362c565b9250508190555080600b6000828254612cc2919061362c565b925050819055508192505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5881612d23565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b600060208284031215612d9157612d90612d1e565b5b6000612d9f84828501612d66565b91505092915050565b60008115159050919050565b612dbd81612da8565b82525050565b6000602082019050612dd86000830184612db4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e18578082015181840152602081019050612dfd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4082612dde565b612e4a8185612de9565b9350612e5a818560208601612dfa565b612e6381612e24565b840191505092915050565b60006020820190508181036000830152612e888184612e35565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ebb82612e90565b9050919050565b612ecb81612eb0565b8114612ed657600080fd5b50565b600081359050612ee881612ec2565b92915050565b6000819050919050565b612f0181612eee565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d1e565b5b6000612f4985828601612ed9565b9250506020612f5a85828601612f0f565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612f8981612f64565b82525050565b6000602082019050612fa46000830184612f80565b92915050565b612fb381612eee565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b600080600060608486031215612fed57612fec612d1e565b5b6000612ffb86828701612ed9565b935050602061300c86828701612ed9565b925050604061301d86828701612f0f565b9150509250925092565b60006020828403121561303d5761303c612d1e565b5b600061304b84828501612ed9565b91505092915050565b6000806040838503121561306b5761306a612d1e565b5b600061307985828601612f0f565b925050602061308a85828601612f0f565b9150509250929050565b6000602082840312156130aa576130a9612d1e565b5b60006130b884828501612f0f565b91505092915050565b600063ffffffff82169050919050565b6130da816130c1565b82525050565b600068ffffffffffffffffff82169050919050565b6130fe816130e0565b82525050565b60006cffffffffffffffffffffffffff82169050919050565b61312681613104565b82525050565b600060608201905061314160008301866130d1565b61314e60208301856130f5565b61315b604083018461311d565b949350505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131a082612e24565b810181811067ffffffffffffffff821117156131bf576131be613168565b5b80604052505050565b60006131d2612d14565b90506131de8282613197565b919050565b6131ec816130c1565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b613218816130e0565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b61324481613104565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006060828403121561327d5761327c613163565b5b61328760606131c8565b90506000613297848285016131fa565b60008301525060206132ab84828501613226565b60208301525060406132bf84828501613252565b60408301525092915050565b6000606082840312156132e1576132e0612d1e565b5b60006132ef84828501613267565b91505092915050565b61330181612eb0565b82525050565b600060208201905061331c60008301846132f8565b92915050565b6000806000806080858703121561333c5761333b612d1e565b5b600061334a87828801612f0f565b945050602061335b87828801612f0f565b935050604061336c87828801612f0f565b925050606061337d87828801612f0f565b91505092959194509250565b613392816130c1565b82525050565b6133a1816130e0565b82525050565b6133b081613104565b82525050565b6060820160008201516133cc6000850182613389565b5060208201516133df6020850182613398565b5060408201516133f260408501826133a7565b50505050565b600060608201905061340d60008301846133b6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345a57607f821691505b60208210810361346d5761346c613413565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006134a9600a83612de9565b91506134b482613473565b602082019050919050565b600060208201905081810360008301526134d88161349c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351982612eee565b915061352483612eee565b925082820390508181111561353c5761353b6134df565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061357c82612eee565b915061358783612eee565b92508261359757613596613542565b5b828204905092915050565b60006135ad82612eee565b91506135b883612eee565b92508282026135c681612eee565b915082820484148315176135dd576135dc6134df565b5b5092915050565b60006135ef82612eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613621576136206134df565b5b600182019050919050565b600061363782612eee565b915061364283612eee565b925082820190508082111561365a576136596134df565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000613696600a83612de9565b91506136a182613660565b602082019050919050565b600060208201905081810360008301526136c581613689565b9050919050565b60006136d782612f64565b91506136e283612f64565b92508282026136f081612f64565b9150808214613702576137016134df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061375d61375861375384612f64565b613738565b612eee565b9050919050565b61376d81613742565b82525050565b60006020820190506137886000830184613764565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006137c4600d83612de9565b91506137cf8261378e565b602082019050919050565b600060208201905081810360008301526137f3816137b7565b9050919050565b61380381612f64565b811461380e57600080fd5b50565b600081519050613820816137fa565b92915050565b60006020828403121561383c5761383b612d1e565b5b600061384a84828501613811565b9150509291505056fea2646970667358221220a45105fb2aa83528b6489fb5be816bc33624d5fca0a1d7bf35e11168aaa4858964736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index d4ed49d..202030e 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_redistribution","type":"bytes32"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"growBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"redistribution","type":"bytes32"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/demurrage.py b/python/erc20_demurrage_token/demurrage.py index 7941ee2..50bad93 100644 --- a/python/erc20_demurrage_token/demurrage.py +++ b/python/erc20_demurrage_token/demurrage.py @@ -9,8 +9,7 @@ from chainlib.eth.constant import ZERO_ADDRESS # local imports from .token import DemurrageToken -logging.basicConfig(level=logging.DEBUG) -logg = logging.getLogger() +logg = logging.getLogger(__name__) class DemurrageCalculator: diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index e098451..cb2d33c 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -10,6 +10,7 @@ from chainlib.eth.tx import ( from chainlib.hash import keccak256_string_to_hex from chainlib.eth.contract import ( ABIContractEncoder, + ABIContractDecoder, ABIContractType, abi_decode_single, ) @@ -117,6 +118,34 @@ class DemurrageToken(ERC20): return DemurrageToken.__bytecode[name] + def increase_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('increaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def decrease_allowance(self, contract_address, sender_address, address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('decreaseAllowance') + enc.typ(ABIContractType.ADDRESS) + enc.typ(ABIContractType.UINT256) + enc.address(address) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('addMinter') @@ -155,6 +184,33 @@ class DemurrageToken(ERC20): return tx + def burn(self, contract_address, sender_address, value, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('burn') + enc.typ(ABIContractType.UINT256) + enc.uint256(value) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def total_burned(self, contract_address, sender_address=ZERO_ADDRESS, id_generator=None): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('totalBurned') + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + + def to_base_amount(self, contract_address, value, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() @@ -255,8 +311,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionPeriod') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -266,22 +325,26 @@ class DemurrageToken(ERC20): return o - def to_redistribution_participants(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): - j = JSONRPCRequest(id_generator) - o = j.template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('toRedistributionParticipants') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) - data = add_0x(enc.get()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - o['params'].append('latest') - o = j.finalize(o) - return o - +# def to_redistribution_participants(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): +# j = JSONRPCRequest(id_generator) +# o = j.template() +# o['method'] = 'eth_call' +# enc = ABIContractEncoder() +# enc.method('toRedistributionParticipants') +# v = strip_0x(redistribution) +# enc.typ_literal('(uint32,uint72,uint104)') +# #enc.typ(ABIContractType.BYTES32) +# enc.bytes32(v[:64]) +# enc.bytes32(v[64:128]) +# enc.bytes32(v[128:192]) +# data = add_0x(enc.get()) +# tx = self.template(sender_address, contract_address) +# tx = self.set_code(tx, data) +# o['params'].append(self.normalize(tx)) +# o['params'].append('latest') +# o = j.finalize(o) +# return o +# def to_redistribution_supply(self, contract_address, redistribution, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) @@ -289,8 +352,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionSupply') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -306,8 +372,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistributionDemurrageModifier') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -397,24 +466,24 @@ class DemurrageToken(ERC20): return self.call_noarg('supplyCap', contract_address, sender_address=sender_address) - def grow_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): - j = JSONRPCRequest(id_generator) - o = j.template() - o['method'] = 'eth_call' - enc = ABIContractEncoder() - enc.method('growBy') - enc.typ(ABIContractType.UINT256) - enc.typ(ABIContractType.UINT256) - enc.uint256(value) - enc.uint256(period) - data = add_0x(enc.get()) - tx = self.template(sender_address, contract_address) - tx = self.set_code(tx, data) - o['params'].append(self.normalize(tx)) - o['params'].append('latest') - o = j.finalize(o) - return o - +# def grow_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): +# j = JSONRPCRequest(id_generator) +# o = j.template() +# o['method'] = 'eth_call' +# enc = ABIContractEncoder() +# enc.method('growBy') +# enc.typ(ABIContractType.UINT256) +# enc.typ(ABIContractType.UINT256) +# enc.uint256(value) +# enc.uint256(period) +# data = add_0x(enc.get()) +# tx = self.template(sender_address, contract_address) +# tx = self.set_code(tx, data) +# o['params'].append(self.normalize(tx)) +# o['params'].append('latest') +# o = j.finalize(o) +# return o +# def decay_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) @@ -460,8 +529,11 @@ class DemurrageToken(ERC20): o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('getDistributionFromRedistribution') - enc.typ(ABIContractType.BYTES32) - enc.bytes32(redistribution) + v = strip_0x(redistribution) + enc.typ_literal('(uint32,uint72,uint104)') + enc.bytes32(v[:64]) + enc.bytes32(v[64:128]) + enc.bytes32(v[128:192]) data = add_0x(enc.get()) tx = self.template(sender_address, contract_address) tx = self.set_code(tx, data) @@ -504,7 +576,16 @@ class DemurrageToken(ERC20): @classmethod def parse_redistributions(self, v): - return abi_decode_single(ABIContractType.BYTES32, v) + d = ABIContractDecoder() + v = strip_0x(v) + d.typ(ABIContractType.BYTES32) + d.typ(ABIContractType.BYTES32) + d.typ(ABIContractType.BYTES32) + d.val(v[:64]) + d.val(v[64:128]) + d.val(v[128:192]) + r = d.decode() + return ''.join(r) @classmethod @@ -526,6 +607,7 @@ class DemurrageToken(ERC20): def parse_supply_cap(self, v): return abi_decode_single(ABIContractType.UINT256, v) + @classmethod def parse_grow_by(self, v): return abi_decode_single(ABIContractType.UINT256, v) @@ -549,3 +631,8 @@ class DemurrageToken(ERC20): @classmethod def parse_resolution_factor(self, v): return abi_decode_single(ABIContractType.UINT256, v) + + + @classmethod + def parse_total_burned(self, v): + return abi_decode_single(ABIContractType.UINT256, v) diff --git a/python/run_tests.sh b/python/run_tests.sh index 4f3e2de..80affd3 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -6,7 +6,8 @@ set -e export PYTHONPATH=. #modes=(MultiNocap MultiCap SingleCap SingleNocap) -modes=(SingleCap SingleNocap) # other contracts need to be updted +#modes=(SingleCap SingleNocap) # other contracts need to be updted +modes=(SingleNocap) # other contracts need to be updted for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_growth.py @@ -14,7 +15,8 @@ for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_single.py done -modes=(SingleCap) # other contracts need to be updted +#modes=(SingleCap) # other contracts need to be updted +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py done @@ -25,7 +27,8 @@ for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py done -modes=(MultiCap SingleCap) +#modes=(MultiCap SingleCap) +modes=() for m in ${modes[@]}; do ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_cap.py done diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 44fc556..52221d6 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -276,7 +276,52 @@ class TestBasic(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - + + def test_approve(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 500) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 0) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 600) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.increase_allowance(self.address, self.accounts[0], self.accounts[1], 200) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.decrease_allowance(self.address, self.accounts[0], self.accounts[1], 800) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.approve(self.address, self.accounts[0], self.accounts[1], 42) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + def test_transfer_from(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) @@ -315,6 +360,12 @@ class TestBasic(TestDemurrageDefault): balance = c.parse_balance_of(r) self.assertEqual(balance, 500) + (tx_hash, o) = c.transfer_from(self.address, self.accounts[2], self.accounts[1], self.accounts[3], 1) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_growth.py b/python/tests/test_growth.py index 9412e90..dafca13 100644 --- a/python/tests/test_growth.py +++ b/python/tests/test_growth.py @@ -28,23 +28,23 @@ testdir = os.path.dirname(__file__) class TestGrowth(TestDemurrageDefault): - def test_grow_by(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - growth_factor = (1000000 + self.tax_level) / 1000000 - v = 1000000000 - o = c.grow_by(self.address, v, 1, sender_address=self.accounts[0]) - r = self.rpc.do(o) - g = c.parse_grow_by(r) - self.assertEqual(int(v * growth_factor), g) - - period = 10 - growth_factor = (1 + (self.tax_level) / 1000000) ** period - o = c.grow_by(self.address, v, period, sender_address=self.accounts[0]) - r = self.rpc.do(o) - g = c.parse_grow_by(r) - self.assertEqual(int(v * growth_factor), g) +# def test_grow_by(self): +# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) +# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) +# +# growth_factor = (1000000 + self.tax_level) / 1000000 +# v = 1000000000 +# o = c.grow_by(self.address, v, 1, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# g = c.parse_grow_by(r) +# self.assertEqual(int(v * growth_factor), g) +# +# period = 10 +# growth_factor = (1 + (self.tax_level) / 1000000) ** period +# o = c.grow_by(self.address, v, period, sender_address=self.accounts[0]) +# r = self.rpc.do(o) +# g = c.parse_grow_by(r) +# self.assertEqual(int(v * growth_factor), g) def test_decay_by(self): @@ -63,7 +63,7 @@ class TestGrowth(TestDemurrageDefault): o = c.decay_by(self.address, v, period, sender_address=self.accounts[0]) r = self.rpc.do(o) g = c.parse_decay_by(r) - self.assertEqual(int(v * growth_factor), g) + self.assertEqual(int(v * growth_factor), g) if __name__ == '__main__': diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index a980d9b..b911cab 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -24,7 +24,7 @@ from erc20_demurrage_token import DemurrageToken # test imports from erc20_demurrage_token.unittest.base import TestDemurrageDefault -logging.basicConfig(level=logging.DEBUG) +logging.basicConfig(level=logging.INFO) logg = logging.getLogger() testdir = os.path.dirname(__file__) @@ -88,18 +88,31 @@ class TestRedistribution(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) self.rpc.do(o) - self.backend.time_travel(self.start_time + (self.period_seconds * 10)) + self.backend.time_travel(self.start_time + (self.period_seconds * 100)) - for i in range(1, 11): - logg.debug('checking period {}'.format(i)) + balance_minter = None + balance_sink = None + real_supply = None + for i in range(1, 101): (tx_hash, o) = c.change_period(self.address, self.accounts[0]) self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) - i = 10 + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_sink = c.parse_balance(r) + + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance_minter = c.parse_balance(r) + + real_supply = balance_sink + balance_minter + logg.info('period {} testing sink {} mint {} adds up to supply {} of original {} (delta {})'.format(i, balance_sink, balance_minter, real_supply, supply, supply - real_supply)) + + i = 100 o = c.redistributions(self.address, i, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) @@ -122,7 +135,7 @@ class TestRedistribution(TestDemurrageDefault): r = self.rpc.do(o) balance_minter = c.parse_balance(r) - logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, real_supply, demurrage_previous, demurrage)) self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index fdd2f9c..11b88ea 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -177,6 +177,7 @@ class TestRedistribution(TestDemurrageUnit): o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) + logg.debug('redistribution {}'.format(redistribution)) o = c.to_redistribution_supply(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_to_redistribution_item(r) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index e4cc11c..81aeba0 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -1,18 +1,24 @@ -pragma solidity > 0.6.11; +pragma solidity >= 0.8.0; + // SPDX-License-Identifier: GPL-3.0-or-later - contract DemurrageTokenSingleCap { + struct redistributionItem { + uint32 period; + uint72 value; + uint104 demurrage; + } + redistributionItem[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) // Redistribution bit field, with associated shifts and masks // (Uses sub-byte boundaries) - bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - uint8 constant shiftRedistributionPeriod = 0; - uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 - uint8 constant shiftRedistributionValue = 32; - uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 - uint8 constant shiftRedistributionDemurrage = 104; - uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140 +// bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) +// uint8 constant shiftRedistributionPeriod = 0; +// uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 +// uint8 constant shiftRedistributionValue = 32; +// uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 +// uint8 constant shiftRedistributionDemurrage = 104; +// uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 36) - 1) << 140 // Account balances mapping (address => uint256) account; @@ -38,7 +44,8 @@ contract DemurrageTokenSingleCap { uint256 public decimals; // Implements ERC20 - uint256 public totalSupply; + //uint256 public totalSupply; + uint256 supply; // Last executed period uint256 public lastPeriod; @@ -46,6 +53,9 @@ contract DemurrageTokenSingleCap { // Last sink redistribution amount uint256 public totalSink; + // Value of burnt tokens (burnt tokens do not decay) + uint256 public burned; + // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less @@ -95,10 +105,15 @@ contract DemurrageTokenSingleCap { // Temporary event used in development, will be removed on prod event Debug(bytes32 _foo); + // Emitted when tokens are burned + event Burn(address indexed _burner, uint256 _value); + // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 constructor(string memory _name, string memory _symbol, uint8 _decimals, uint128 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public { + redistributionItem memory initialRedistribution; + // ACL setup owner = msg.sender; minter[owner] = true; @@ -114,7 +129,7 @@ contract DemurrageTokenSingleCap { periodDuration = _periodMinutes * 60; demurrageAmount = uint128(nanoDivider) * 100; taxLevel = _taxLevelMinute; // Represents 38 decimal places - bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); + initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); // Misc settings @@ -206,7 +221,7 @@ contract DemurrageTokenSingleCap { changePeriod(); baseAmount = toBaseAmount(_amount); - totalSupply += _amount; + supply += _amount; increaseBaseBalance(_beneficiary, baseAmount); emit Mint(msg.sender, _beneficiary, _amount); saveRedistributionSupply(); @@ -215,46 +230,82 @@ contract DemurrageTokenSingleCap { // Deserializes the redistribution word // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { - bytes32 redistribution; +// function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { +// bytes32 redistribution; +// +// redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); +// redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); +// redistribution |= bytes32(_period & maskRedistributionPeriod); +// return redistribution; +// } - redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); - redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); - redistribution |= bytes32(_period & maskRedistributionPeriod); + function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { + redistributionItem memory redistribution; + + redistribution.period = uint32(_period); + redistribution.value = uint72(_value); + redistribution.demurrage = uint104(_demurrageModifierPpm); return redistribution; + + } +// +// // Serializes the demurrage period part of the redistribution word +// function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { +// return uint256(redistribution) & maskRedistributionPeriod; +// } +// + + function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.period); } - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution) & maskRedistributionPeriod; +// // Serializes the supply part of the redistribution word +// function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { +// return (uint256(redistribution) & kkRedistributionValue) >> shiftRedistributionValue; +// } + + function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.value); } - // Serializes the supply part of the redistribution word - function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionValue) >> shiftRedistributionValue; +// +// // Serializes the number of participants part of the redistribution word +// function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { +// return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; +// } + + function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.demurrage); } - // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; - } // Client accessor to the redistributions array length function redistributionCount() public view returns (uint256) { return redistributions.length; } - - // Save the current total supply amount to the current redistribution period +// +// // Save the current total supply amount to the current redistribution period +// function saveRedistributionSupply() private returns (bool) { +// uint256 currentRedistribution; +// uint256 grownSupply; +// +// grownSupply = totalSupply(); +// currentRedistribution = uint256(redistributions[redistributions.length-1]); +// currentRedistribution &= (~maskRedistributionValue); +// currentRedistribution |= (grownSupply << shiftRedistributionValue); +// +// redistributions[redistributions.length-1] = bytes32(currentRedistribution); +// return true; +// } function saveRedistributionSupply() private returns (bool) { - uint256 currentRedistribution; + redistributionItem memory currentRedistribution; uint256 grownSupply; - grownSupply = totalSupply; - currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= (~maskRedistributionValue); - currentRedistribution |= (grownSupply << shiftRedistributionValue); + grownSupply = totalSupply(); + currentRedistribution = redistributions[redistributions.length-1]; + currentRedistribution.value = uint72(grownSupply); - redistributions[redistributions.length-1] = bytes32(currentRedistribution); + redistributions[redistributions.length-1] = currentRedistribution; return true; } @@ -263,15 +314,16 @@ contract DemurrageTokenSingleCap { return uint128((block.timestamp - periodStart) / periodDuration + 1); } - // Add an entered demurrage period to the redistribution array - function checkPeriod() private view returns (bytes32) { - bytes32 lastRedistribution; + // Retrieve next redistribution if the period threshold has been crossed + function checkPeriod() private view returns (redistributionItem memory) { + redistributionItem memory lastRedistribution; + redistributionItem memory emptyRedistribution; uint256 currentPeriod; lastRedistribution = redistributions[lastPeriod]; currentPeriod = this.actualPeriod(); if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return bytes32(0x00); + return emptyRedistribution; } return lastRedistribution; } @@ -283,7 +335,7 @@ contract DemurrageTokenSingleCap { return difference / resolutionFactor; } - function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) { + function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { uint256 redistributionSupply; uint256 redistributionDemurrage; @@ -293,7 +345,7 @@ contract DemurrageTokenSingleCap { } // Returns the amount sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { + function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { uint256 unit; uint256 baseUnit; @@ -348,37 +400,46 @@ contract DemurrageTokenSingleCap { return (block.timestamp - _target) / 60; } + function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { + if (_redistribution.period > 0) { + return false; + } + if (_redistribution.value > 0) { + return false; + } + if (_redistribution.demurrage > 0) { + return false; + } + return true; + } + // Recalculate the demurrage modifier for the new period + // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. function changePeriod() public returns (bool) { - bytes32 currentRedistribution; - bytes32 nextRedistribution; + redistributionItem memory currentRedistribution; + redistributionItem memory nextRedistribution; + redistributionItem memory lastRedistribution; uint256 currentPeriod; - uint256 currentDemurrageAmount; + uint256 lastDemurrageAmount; uint256 nextRedistributionDemurrage; uint256 demurrageCounts; - uint256 periodTimestamp; uint256 nextPeriod; applyDemurrage(); currentRedistribution = checkPeriod(); - if (currentRedistribution == bytes32(0x00)) { + if (isEmptyRedistribution(currentRedistribution)) { return false; } + // calculate the decay from previous redistributino + lastRedistribution = redistributions[lastPeriod]; currentPeriod = toRedistributionPeriod(currentRedistribution); nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts); - } else { - nextRedistributionDemurrage = currentDemurrageAmount; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); + lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); + demurrageCounts = periodDuration / 60; + nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); + + nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); redistributions.push(nextRedistribution); applyDefaultRedistribution(nextRedistribution); @@ -387,18 +448,18 @@ contract DemurrageTokenSingleCap { } // Reverse a value reduced by demurrage by the given period to its original value - function growBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = growthResolutionFactor; - truncatedTaxLevel = taxLevel / nanoDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); - } - return (valueFactor * _value) / growthResolutionFactor; - } +// function growBy(uint256 _value, uint256 _period) public view returns (uint256) { +// uint256 valueFactor; +// uint256 truncatedTaxLevel; +// +// valueFactor = growthResolutionFactor; +// truncatedTaxLevel = taxLevel / nanoDivider; +// +// for (uint256 i = 0; i < _period; i++) { +// valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); +// } +// return (valueFactor * _value) / growthResolutionFactor; +// } // Calculate a value reduced by demurrage by the given period function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { @@ -423,14 +484,45 @@ contract DemurrageTokenSingleCap { function approve(address _spender, uint256 _value) public returns (bool) { uint256 baseValue; + if (allowance[msg.sender][_spender] > 0) { + require(_value == 0, 'ZERO_FIRST'); + } + changePeriod(); baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] += baseValue; + allowance[msg.sender][_spender] = baseValue; emit Approval(msg.sender, _spender, _value); return true; } + // Reduce allowance by amount + function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + baseValue = toBaseAmount(_value); + require(allowance[msg.sender][_spender] >= baseValue); + + changePeriod(); + + allowance[msg.sender][_spender] -= baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Increase allowance by amount + function increaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + changePeriod(); + + baseValue = toBaseAmount(_value); + + allowance[msg.sender][_spender] += baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + // Implements ERC20, triggers tax and/or redistribution function transfer(address _to, uint256 _value) public returns (bool) { uint256 baseValue; @@ -454,7 +546,9 @@ contract DemurrageTokenSingleCap { baseValue = toBaseAmount(_value); require(allowance[_from][msg.sender] >= baseValue); + allowance[_from][msg.sender] -= baseValue; result = transferBase(_from, _to, baseValue); + emit Transfer(_from, _to, _value); return result; } @@ -486,6 +580,29 @@ contract DemurrageTokenSingleCap { emit OwnershipTransferred(oldOwner, owner); } + // Explicitly and irretrievably burn tokens + // Only token minters can burn tokens + function burn(uint256 _value) public { + require(minter[msg.sender]); + require(_value <= account[msg.sender]); + uint256 _delta = toBaseAmount(_value); + + applyDemurrage(); + decreaseBaseBalance(msg.sender, _delta); + burned += _value; + emit Burn(msg.sender, _value); + } + + // Implements ERC20 + function totalSupply() public view returns (uint256) { + return supply - burned; + } + + // Return total number of burned tokens + function totalBurned() public view returns (uint256) { + return burned; + } + // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xc6bb4b70) { // ERC20 From bcc957f86162993a2c92adf7aa7525475450c219 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 8 Feb 2023 08:51:57 +0000 Subject: [PATCH 12/57] Remove commented contract code, makefile single nocap only --- .../data/DemurrageTokenSingleNocap.bin | 2 +- solidity/DemurrageTokenSingleNocap.sol | 55 ++----------------- solidity/Makefile | 5 +- 3 files changed, 9 insertions(+), 53 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 855f028..e5b25b0 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043b565b6080908152503480156200003657600080fd5b506040516200448a3803806200448a83398181016040528101906200005c91906200073a565b62000066620003c1565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000132919062000a5b565b50856007908162000144919062000a5b565b508460ff166008819055504260038190555060035460a08181525050603c836200016f91906200043b565b60c0818152505060646a52b7d2dcc80cd2e400000062000190919062000b42565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e08181525050620002326000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600060016200033d640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550505081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b88565b62000347620003c1565b62000351620003c1565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004488262000402565b9150620004558362000402565b9250828202620004658162000402565b915082820484148315176200047f576200047e6200040c565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ef82620004a4565b810181811067ffffffffffffffff82111715620005115762000510620004b5565b5b80604052505050565b60006200052662000486565b9050620005348282620004e4565b919050565b600067ffffffffffffffff821115620005575762000556620004b5565b5b6200056282620004a4565b9050602081019050919050565b60005b838110156200058f57808201518184015260208101905062000572565b60008484015250505050565b6000620005b2620005ac8462000539565b6200051a565b905082815260208101848484011115620005d157620005d06200049f565b5b620005de8482856200056f565b509392505050565b600082601f830112620005fe57620005fd6200049a565b5b8151620006108482602086016200059b565b91505092915050565b600060ff82169050919050565b620006318162000619565b81146200063d57600080fd5b50565b600081519050620006518162000626565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067e8162000657565b81146200068a57600080fd5b50565b6000815190506200069e8162000673565b92915050565b620006af8162000402565b8114620006bb57600080fd5b50565b600081519050620006cf81620006a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070282620006d5565b9050919050565b6200071481620006f5565b81146200072057600080fd5b50565b600081519050620007348162000709565b92915050565b60008060008060008060c087890312156200075a576200075962000490565b5b600087015167ffffffffffffffff8111156200077b576200077a62000495565b5b6200078989828a01620005e6565b965050602087015167ffffffffffffffff811115620007ad57620007ac62000495565b5b620007bb89828a01620005e6565b9550506040620007ce89828a0162000640565b9450506060620007e189828a016200068d565b9350506080620007f489828a01620006be565b92505060a06200080789828a0162000723565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086757607f821691505b6020821081036200087d576200087c6200081f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a8565b620008f68683620008a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000939620009336200092d8462000402565b6200090e565b62000402565b9050919050565b6000819050919050565b620009558362000918565b6200096d620009648262000940565b848454620008b8565b825550505050565b600090565b6200098462000975565b620009918184846200094a565b505050565b5b81811015620009b957620009ad6000826200097a565b60018101905062000997565b5050565b601f82111562000a0857620009d28162000883565b620009dd8462000898565b81016020851015620009ed578190505b62000a05620009fc8562000898565b83018262000996565b50505b505050565b60008160020a8304905092915050565b600062000a306000198460080262000a0d565b1980831691505092915050565b600062000a4b838362000a1d565b9150826002028217905092915050565b62000a668262000814565b67ffffffffffffffff81111562000a825762000a81620004b5565b5b62000a8e82546200084e565b62000a9b828285620009bd565b600060209050601f83116001811462000ad3576000841562000abe578287015190505b62000aca858262000a3d565b86555062000b3a565b601f19841662000ae38662000883565b60005b8281101562000b0d5784890151825560018201915060208501945060208101905062000ae6565b8683101562000b2d578489015162000b29601f89168262000a1d565b8355505b6001600288020188555050505b505050505050565b600062000b4f8262000657565b915062000b5c8362000657565b925082820262000b6c8162000657565b915080821462000b815762000b806200040c565b5b5092915050565b60805160a05160c05160e05161388962000c0160003960008181610eb9015261119c01526000818161170001528181611dbe0152818161236b015261250801526000818161172c01528181612529015261256e0152600081816118060152818161183e015281816118b6015261234701526138896000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a9059cbb11610106578063d397de60116100bf578063eda4e6d611610099578063eda4e6d6146109bf578063f2fde38b146109dd578063f83da35d14610a0d578063f84e521314610a3d576102d8565b8063d397de6014610953578063d89135cd14610983578063e8095295146109a1576102d8565b8063a9059cbb14610869578063ab28cea014610899578063b470aade146108b7578063c0ab7077146108d5578063c7a7f89a14610905578063d340ef8a14610935576102d8565b80638f0b2d5d116101585780638f0b2d5d146107815780638f1df6bc1461079d578063936d9e7a146107bb57806395d89b41146107eb578063983b2d5614610809578063a457c2d714610839576102d8565b8063731f237c146106cd57806373f42561146106eb57806374bedb951461070957806379ba50971461072757806384dde4af146107455780638da5cb5b14610763576102d8565b806340452d911161024357806351b4541c116101fc57806351b4541c146105bf57806358b2833b146105ef5780636721d4ef1461060d5780636787a9be1461063d5780636a2d094e1461066d57806370a082311461069d576102d8565b806340452d91146104b157806342966c68146104e3578063449a52f8146104ff57806347a505171461052f5780634abfbba21461055f5780634d0df4fd1461058f576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612d7b565b610a6d565b6040516103049190612dc3565b60405180910390f35b610315610c13565b6040516103229190612e6e565b60405180910390f35b61034560048036038101906103409190612f24565b610ca1565b6040516103529190612dc3565b60405180910390f35b610363610e72565b6040516103709190612f8f565b60405180910390f35b610381610e94565b60405161038e9190612fb9565b60405180910390f35b61039f610eab565b6040516103ac9190612fb9565b60405180910390f35b6103bd610eb7565b6040516103ca9190612fb9565b60405180910390f35b6103ed60048036038101906103e89190612fd4565b610edb565b6040516103fa9190612dc3565b60405180910390f35b61041d60048036038101906104189190613027565b61108e565b60405161042a9190612dc3565b60405180910390f35b61044d60048036038101906104489190613054565b611181565b60405161045a9190612fb9565b60405180910390f35b61046b611235565b6040516104789190612fb9565b60405180910390f35b61049b60048036038101906104969190612f24565b61123b565b6040516104a89190612dc3565b60405180910390f35b6104cb60048036038101906104c69190613094565b6113d1565b6040516104da9392919061312c565b60405180910390f35b6104fd60048036038101906104f89190613094565b611445565b005b61051960048036038101906105149190612f24565b611573565b6040516105269190612dc3565b60405180910390f35b61054960048036038101906105449190613027565b6116b3565b6040516105569190612fb9565b60405180910390f35b61057960048036038101906105749190613094565b6116fc565b6040516105869190612fb9565b60405180910390f35b6105a960048036038101906105a491906132cb565b61175c565b6040516105b69190612dc3565b60405180910390f35b6105d960048036038101906105d49190613094565b6117c9565b6040516105e69190612fb9565b60405180910390f35b6105f76117ea565b6040516106049190612fb9565b60405180910390f35b61062760048036038101906106229190613054565b6117f0565b6040516106349190612fb9565b60405180910390f35b61065760048036038101906106529190613094565b611871565b6040516106649190612fb9565b60405180910390f35b61068760048036038101906106829190613094565b6118f1565b6040516106949190612fb9565b60405180910390f35b6106b760048036038101906106b29190613027565b611912565b6040516106c49190612fb9565b60405180910390f35b6106d56119ca565b6040516106e29190612dc3565b60405180910390f35b6106f36119db565b6040516107009190612fb9565b60405180910390f35b6107116119e1565b60405161071e9190612fb9565b60405180910390f35b61072f6119e7565b60405161073c9190612dc3565b60405180910390f35b61074d611b8e565b60405161075a9190613307565b60405180910390f35b61076b611bb4565b6040516107789190613307565b60405180910390f35b61079b60048036038101906107969190613027565b611bda565b005b6107a5611c78565b6040516107b29190612dc3565b60405180910390f35b6107d560048036038101906107d091906132cb565b611f17565b6040516107e29190612fb9565b60405180910390f35b6107f3611f45565b6040516108009190612e6e565b60405180910390f35b610823600480360381019061081e9190613027565b611fd3565b6040516108309190612dc3565b60405180910390f35b610853600480360381019061084e9190612f24565b612090565b6040516108609190612dc3565b60405180910390f35b610883600480360381019061087e9190612f24565b6122af565b6040516108909190612dc3565b60405180910390f35b6108a1612345565b6040516108ae9190612fb9565b60405180910390f35b6108bf612369565b6040516108cc9190612fb9565b60405180910390f35b6108ef60048036038101906108ea9190613094565b61238d565b6040516108fc9190612dc3565b60405180910390f35b61091f600480360381019061091a91906132cb565b6124c5565b60405161092c9190612fb9565b60405180910390f35b61093d6124de565b60405161094a9190612fb9565b60405180910390f35b61096d600480360381019061096891906132cb565b6124e4565b60405161097a9190612fb9565b60405180910390f35b61098b6124f8565b6040516109989190612fb9565b60405180910390f35b6109a9612502565b6040516109b69190612f8f565b60405180910390f35b6109c761256c565b6040516109d49190612fb9565b60405180910390f35b6109f760048036038101906109f29190613027565b612590565b604051610a049190612dc3565b60405180910390f35b610a276004803603810190610a229190613322565b612632565b604051610a3491906133f8565b60405180910390f35b610a576004803603810190610a5291906132cb565b6126b2565b604051610a649190612fb9565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ac15760019050610c0e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b135760019050610c0e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b655760019050610c0e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb75760019050610c0e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c095760019050610c0e565b600090505b919050565b60068054610c2090613442565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c90613442565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6d5760008314610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906134bf565b60405180910390fd5b5b610d75611c78565b50610d7f83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5f9190612fb9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea6919061350e565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee8611c78565b50610ef284611871565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7d57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611009919061350e565b9250508190555061101b8686846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161107a9190612fb9565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61112057600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c59190613571565b905060005b8481101561120e5764e8d4a5100082846111e491906135a2565b6111ee9190613571565b836111f9919061350e565b92508080611206906135e4565b9150506111ca565b5064e8d4a51000858361122191906135a2565b61122b9190613571565b9250505092915050565b60085481565b600080611246611c78565b5061125083611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061362c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113be9190612fb9565b60405180910390a3600191505092915050565b600081815481106113e157600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff16905083565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661149b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156114e757600080fd5b60006114f282611871565b90506114fc6119ca565b5061150733826126f4565b5081600c600082825461151a919061362c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115679190612fb9565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906136ac565b60405180910390fd5b61160a611c78565b5061161483611871565b90508260096000828254611628919061362c565b9250508190555061163984826127fb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116979190612fb9565b60405180910390a36116a76128bf565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261172a91906135a2565b7f0000000000000000000000000000000000000000000000000000000000000000611755919061362c565b9050919050565b600080826000015163ffffffff16111561177957600090506117c4565b6000826020015168ffffffffffffffffff16111561179a57600090506117c4565b600082604001516cffffffffffffffffffffffffff1611156117bf57600090506117c4565b600190505b919050565b6000603c82426117d9919061350e565b6117e39190613571565b9050919050565b60035481565b6000806402540be4008361180491906135a2565b7f000000000000000000000000000000000000000000000000000000000000000061182f919061350e565b8461183a91906135a2565b90507f0000000000000000000000000000000000000000000000000000000000000000816118689190613571565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118a291906136cc565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118e091906135a2565b6118ea9190613571565b9050919050565b6000603c8242611901919061350e565b61190b9190613571565b9050919050565b600080600080611921856116b3565b925061192e6003546117c9565b905061197a6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661196291906136cc565b6fffffffffffffffffffffffffffffffff1682611181565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119aa91906135a2565b82846119b691906135a2565b6119c09190613571565b9350505050919050565b60006119d6600061238d565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3457600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c82612cd3565b611c8a612cd3565b611c92612cd3565b6000806000806000611ca26119ca565b50611cab612a9c565b9750611cb68861175c565b15611ccc57600098505050505050505050611f14565b6000600a5481548110611ce257611ce1613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff16815250509550611d9e886124e4565b9450600185611dad919061362c565b9050611db8866126b2565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611de79190613571565b9150611df38483611181565b9250611e09600084611e03610e94565b84612632565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff1602179055505050611ecf87612c41565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611eff9190612fb9565b60405180910390a16001985050505050505050505b90565b6000806000611f25846124c5565b9150611f30846126b2565b9050611f3c82826117f0565b92505050919050565b60078054611f5290613442565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90613442565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461202f57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061209c83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212757600080fd5b61212f611c78565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bc919061350e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161229c9190612fb9565b60405180910390a3600191505092915050565b60008060006122bc611c78565b506122c684611871565b91506122d33386846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516123329190612fb9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061239d6003546117c9565b9150600082036123b2576000925050506124c0565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000841180156123f457508184105b156123fd578391505b6124078183611181565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261244c91906135a2565b600354612459919061362c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516124b19190613773565b60405180910390a46001925050505b919050565b6000816020015168ffffffffffffffffff169050919050565b600a5481565b6000816000015163ffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612553919061350e565b61255d9190613571565b612567919061362c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ec57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61263a612cd3565b612642612cd3565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b600081604001516cffffffffffffffffffffffffff169050919050565b6000806126dc85846126f4565b506126e784846127fb565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361275057600093505050506127f5565b612759866116b3565b92508483101561279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906137da565b60405180910390fd5b84836127aa919061350e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361285757600093505050506128b9565b612860866116b3565b9250848361286e919061362c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006128c9612cd3565b60006128d3610e94565b9050600060016000805490506128e9919061350e565b815481106128fa576128f9613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506129e4919061350e565b815481106129f5576129f4613709565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff16021790555090505060019250505090565b612aa4612cd3565b612aac612cd3565b612ab4612cd3565b600080600a5481548110612acb57612aca613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c099190613826565b6fffffffffffffffffffffffffffffffff169050612c26836124e4565b8111612c3757819350505050612c3e565b8293505050505b90565b6000806000612c4f84611f17565b9150600b54612c5d83611871565b612c67919061350e565b9050612c95600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127fb565b506001600a6000828254612ca9919061362c565b9250508190555080600b6000828254612cc2919061362c565b925050819055508192505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5881612d23565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b600060208284031215612d9157612d90612d1e565b5b6000612d9f84828501612d66565b91505092915050565b60008115159050919050565b612dbd81612da8565b82525050565b6000602082019050612dd86000830184612db4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e18578082015181840152602081019050612dfd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4082612dde565b612e4a8185612de9565b9350612e5a818560208601612dfa565b612e6381612e24565b840191505092915050565b60006020820190508181036000830152612e888184612e35565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ebb82612e90565b9050919050565b612ecb81612eb0565b8114612ed657600080fd5b50565b600081359050612ee881612ec2565b92915050565b6000819050919050565b612f0181612eee565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d1e565b5b6000612f4985828601612ed9565b9250506020612f5a85828601612f0f565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612f8981612f64565b82525050565b6000602082019050612fa46000830184612f80565b92915050565b612fb381612eee565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b600080600060608486031215612fed57612fec612d1e565b5b6000612ffb86828701612ed9565b935050602061300c86828701612ed9565b925050604061301d86828701612f0f565b9150509250925092565b60006020828403121561303d5761303c612d1e565b5b600061304b84828501612ed9565b91505092915050565b6000806040838503121561306b5761306a612d1e565b5b600061307985828601612f0f565b925050602061308a85828601612f0f565b9150509250929050565b6000602082840312156130aa576130a9612d1e565b5b60006130b884828501612f0f565b91505092915050565b600063ffffffff82169050919050565b6130da816130c1565b82525050565b600068ffffffffffffffffff82169050919050565b6130fe816130e0565b82525050565b60006cffffffffffffffffffffffffff82169050919050565b61312681613104565b82525050565b600060608201905061314160008301866130d1565b61314e60208301856130f5565b61315b604083018461311d565b949350505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131a082612e24565b810181811067ffffffffffffffff821117156131bf576131be613168565b5b80604052505050565b60006131d2612d14565b90506131de8282613197565b919050565b6131ec816130c1565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b613218816130e0565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b61324481613104565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006060828403121561327d5761327c613163565b5b61328760606131c8565b90506000613297848285016131fa565b60008301525060206132ab84828501613226565b60208301525060406132bf84828501613252565b60408301525092915050565b6000606082840312156132e1576132e0612d1e565b5b60006132ef84828501613267565b91505092915050565b61330181612eb0565b82525050565b600060208201905061331c60008301846132f8565b92915050565b6000806000806080858703121561333c5761333b612d1e565b5b600061334a87828801612f0f565b945050602061335b87828801612f0f565b935050604061336c87828801612f0f565b925050606061337d87828801612f0f565b91505092959194509250565b613392816130c1565b82525050565b6133a1816130e0565b82525050565b6133b081613104565b82525050565b6060820160008201516133cc6000850182613389565b5060208201516133df6020850182613398565b5060408201516133f260408501826133a7565b50505050565b600060608201905061340d60008301846133b6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345a57607f821691505b60208210810361346d5761346c613413565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006134a9600a83612de9565b91506134b482613473565b602082019050919050565b600060208201905081810360008301526134d88161349c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351982612eee565b915061352483612eee565b925082820390508181111561353c5761353b6134df565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061357c82612eee565b915061358783612eee565b92508261359757613596613542565b5b828204905092915050565b60006135ad82612eee565b91506135b883612eee565b92508282026135c681612eee565b915082820484148315176135dd576135dc6134df565b5b5092915050565b60006135ef82612eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613621576136206134df565b5b600182019050919050565b600061363782612eee565b915061364283612eee565b925082820190508082111561365a576136596134df565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000613696600a83612de9565b91506136a182613660565b602082019050919050565b600060208201905081810360008301526136c581613689565b9050919050565b60006136d782612f64565b91506136e283612f64565b92508282026136f081612f64565b9150808214613702576137016134df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061375d61375861375384612f64565b613738565b612eee565b9050919050565b61376d81613742565b82525050565b60006020820190506137886000830184613764565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006137c4600d83612de9565b91506137cf8261378e565b602082019050919050565b600060208201905081810360008301526137f3816137b7565b9050919050565b61380381612f64565b811461380e57600080fd5b50565b600081519050613820816137fa565b92915050565b60006020828403121561383c5761383b612d1e565b5b600061384a84828501613811565b9150509291505056fea2646970667358221220a45105fb2aa83528b6489fb5be816bc33624d5fca0a1d7bf35e11168aaa4858964736f6c63430008110033 \ No newline at end of file +61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043b565b6080908152503480156200003657600080fd5b506040516200448a3803806200448a83398181016040528101906200005c91906200073a565b62000066620003c1565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000132919062000a5b565b50856007908162000144919062000a5b565b508460ff166008819055504260038190555060035460a08181525050603c836200016f91906200043b565b60c0818152505060646a52b7d2dcc80cd2e400000062000190919062000b42565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e08181525050620002326000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600060016200033d640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550505081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b88565b62000347620003c1565b62000351620003c1565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004488262000402565b9150620004558362000402565b9250828202620004658162000402565b915082820484148315176200047f576200047e6200040c565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ef82620004a4565b810181811067ffffffffffffffff82111715620005115762000510620004b5565b5b80604052505050565b60006200052662000486565b9050620005348282620004e4565b919050565b600067ffffffffffffffff821115620005575762000556620004b5565b5b6200056282620004a4565b9050602081019050919050565b60005b838110156200058f57808201518184015260208101905062000572565b60008484015250505050565b6000620005b2620005ac8462000539565b6200051a565b905082815260208101848484011115620005d157620005d06200049f565b5b620005de8482856200056f565b509392505050565b600082601f830112620005fe57620005fd6200049a565b5b8151620006108482602086016200059b565b91505092915050565b600060ff82169050919050565b620006318162000619565b81146200063d57600080fd5b50565b600081519050620006518162000626565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067e8162000657565b81146200068a57600080fd5b50565b6000815190506200069e8162000673565b92915050565b620006af8162000402565b8114620006bb57600080fd5b50565b600081519050620006cf81620006a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070282620006d5565b9050919050565b6200071481620006f5565b81146200072057600080fd5b50565b600081519050620007348162000709565b92915050565b60008060008060008060c087890312156200075a576200075962000490565b5b600087015167ffffffffffffffff8111156200077b576200077a62000495565b5b6200078989828a01620005e6565b965050602087015167ffffffffffffffff811115620007ad57620007ac62000495565b5b620007bb89828a01620005e6565b9550506040620007ce89828a0162000640565b9450506060620007e189828a016200068d565b9350506080620007f489828a01620006be565b92505060a06200080789828a0162000723565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086757607f821691505b6020821081036200087d576200087c6200081f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a8565b620008f68683620008a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000939620009336200092d8462000402565b6200090e565b62000402565b9050919050565b6000819050919050565b620009558362000918565b6200096d620009648262000940565b848454620008b8565b825550505050565b600090565b6200098462000975565b620009918184846200094a565b505050565b5b81811015620009b957620009ad6000826200097a565b60018101905062000997565b5050565b601f82111562000a0857620009d28162000883565b620009dd8462000898565b81016020851015620009ed578190505b62000a05620009fc8562000898565b83018262000996565b50505b505050565b60008160020a8304905092915050565b600062000a306000198460080262000a0d565b1980831691505092915050565b600062000a4b838362000a1d565b9150826002028217905092915050565b62000a668262000814565b67ffffffffffffffff81111562000a825762000a81620004b5565b5b62000a8e82546200084e565b62000a9b828285620009bd565b600060209050601f83116001811462000ad3576000841562000abe578287015190505b62000aca858262000a3d565b86555062000b3a565b601f19841662000ae38662000883565b60005b8281101562000b0d5784890151825560018201915060208501945060208101905062000ae6565b8683101562000b2d578489015162000b29601f89168262000a1d565b8355505b6001600288020188555050505b505050505050565b600062000b4f8262000657565b915062000b5c8362000657565b925082820262000b6c8162000657565b915080821462000b815762000b806200040c565b5b5092915050565b60805160a05160c05160e05161388962000c0160003960008181610eb9015261119c01526000818161170001528181611dbe0152818161236b015261250801526000818161172c01528181612529015261256e0152600081816118060152818161183e015281816118b6015261234701526138896000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a9059cbb11610106578063d397de60116100bf578063eda4e6d611610099578063eda4e6d6146109bf578063f2fde38b146109dd578063f83da35d14610a0d578063f84e521314610a3d576102d8565b8063d397de6014610953578063d89135cd14610983578063e8095295146109a1576102d8565b8063a9059cbb14610869578063ab28cea014610899578063b470aade146108b7578063c0ab7077146108d5578063c7a7f89a14610905578063d340ef8a14610935576102d8565b80638f0b2d5d116101585780638f0b2d5d146107815780638f1df6bc1461079d578063936d9e7a146107bb57806395d89b41146107eb578063983b2d5614610809578063a457c2d714610839576102d8565b8063731f237c146106cd57806373f42561146106eb57806374bedb951461070957806379ba50971461072757806384dde4af146107455780638da5cb5b14610763576102d8565b806340452d911161024357806351b4541c116101fc57806351b4541c146105bf57806358b2833b146105ef5780636721d4ef1461060d5780636787a9be1461063d5780636a2d094e1461066d57806370a082311461069d576102d8565b806340452d91146104b157806342966c68146104e3578063449a52f8146104ff57806347a505171461052f5780634abfbba21461055f5780634d0df4fd1461058f576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612d7b565b610a6d565b6040516103049190612dc3565b60405180910390f35b610315610c13565b6040516103229190612e6e565b60405180910390f35b61034560048036038101906103409190612f24565b610ca1565b6040516103529190612dc3565b60405180910390f35b610363610e72565b6040516103709190612f8f565b60405180910390f35b610381610e94565b60405161038e9190612fb9565b60405180910390f35b61039f610eab565b6040516103ac9190612fb9565b60405180910390f35b6103bd610eb7565b6040516103ca9190612fb9565b60405180910390f35b6103ed60048036038101906103e89190612fd4565b610edb565b6040516103fa9190612dc3565b60405180910390f35b61041d60048036038101906104189190613027565b61108e565b60405161042a9190612dc3565b60405180910390f35b61044d60048036038101906104489190613054565b611181565b60405161045a9190612fb9565b60405180910390f35b61046b611235565b6040516104789190612fb9565b60405180910390f35b61049b60048036038101906104969190612f24565b61123b565b6040516104a89190612dc3565b60405180910390f35b6104cb60048036038101906104c69190613094565b6113d1565b6040516104da9392919061312c565b60405180910390f35b6104fd60048036038101906104f89190613094565b611445565b005b61051960048036038101906105149190612f24565b611573565b6040516105269190612dc3565b60405180910390f35b61054960048036038101906105449190613027565b6116b3565b6040516105569190612fb9565b60405180910390f35b61057960048036038101906105749190613094565b6116fc565b6040516105869190612fb9565b60405180910390f35b6105a960048036038101906105a491906132cb565b61175c565b6040516105b69190612dc3565b60405180910390f35b6105d960048036038101906105d49190613094565b6117c9565b6040516105e69190612fb9565b60405180910390f35b6105f76117ea565b6040516106049190612fb9565b60405180910390f35b61062760048036038101906106229190613054565b6117f0565b6040516106349190612fb9565b60405180910390f35b61065760048036038101906106529190613094565b611871565b6040516106649190612fb9565b60405180910390f35b61068760048036038101906106829190613094565b6118f1565b6040516106949190612fb9565b60405180910390f35b6106b760048036038101906106b29190613027565b611912565b6040516106c49190612fb9565b60405180910390f35b6106d56119ca565b6040516106e29190612dc3565b60405180910390f35b6106f36119db565b6040516107009190612fb9565b60405180910390f35b6107116119e1565b60405161071e9190612fb9565b60405180910390f35b61072f6119e7565b60405161073c9190612dc3565b60405180910390f35b61074d611b8e565b60405161075a9190613307565b60405180910390f35b61076b611bb4565b6040516107789190613307565b60405180910390f35b61079b60048036038101906107969190613027565b611bda565b005b6107a5611c78565b6040516107b29190612dc3565b60405180910390f35b6107d560048036038101906107d091906132cb565b611f17565b6040516107e29190612fb9565b60405180910390f35b6107f3611f45565b6040516108009190612e6e565b60405180910390f35b610823600480360381019061081e9190613027565b611fd3565b6040516108309190612dc3565b60405180910390f35b610853600480360381019061084e9190612f24565b612090565b6040516108609190612dc3565b60405180910390f35b610883600480360381019061087e9190612f24565b6122af565b6040516108909190612dc3565b60405180910390f35b6108a1612345565b6040516108ae9190612fb9565b60405180910390f35b6108bf612369565b6040516108cc9190612fb9565b60405180910390f35b6108ef60048036038101906108ea9190613094565b61238d565b6040516108fc9190612dc3565b60405180910390f35b61091f600480360381019061091a91906132cb565b6124c5565b60405161092c9190612fb9565b60405180910390f35b61093d6124de565b60405161094a9190612fb9565b60405180910390f35b61096d600480360381019061096891906132cb565b6124e4565b60405161097a9190612fb9565b60405180910390f35b61098b6124f8565b6040516109989190612fb9565b60405180910390f35b6109a9612502565b6040516109b69190612f8f565b60405180910390f35b6109c761256c565b6040516109d49190612fb9565b60405180910390f35b6109f760048036038101906109f29190613027565b612590565b604051610a049190612dc3565b60405180910390f35b610a276004803603810190610a229190613322565b612632565b604051610a3491906133f8565b60405180910390f35b610a576004803603810190610a5291906132cb565b6126b2565b604051610a649190612fb9565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ac15760019050610c0e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b135760019050610c0e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b655760019050610c0e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb75760019050610c0e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c095760019050610c0e565b600090505b919050565b60068054610c2090613442565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c90613442565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6d5760008314610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906134bf565b60405180910390fd5b5b610d75611c78565b50610d7f83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5f9190612fb9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea6919061350e565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee8611c78565b50610ef284611871565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7d57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611009919061350e565b9250508190555061101b8686846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161107a9190612fb9565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61112057600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c59190613571565b905060005b8481101561120e5764e8d4a5100082846111e491906135a2565b6111ee9190613571565b836111f9919061350e565b92508080611206906135e4565b9150506111ca565b5064e8d4a51000858361122191906135a2565b61122b9190613571565b9250505092915050565b60085481565b600080611246611c78565b5061125083611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061362c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113be9190612fb9565b60405180910390a3600191505092915050565b600081815481106113e157600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff16905083565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661149b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156114e757600080fd5b60006114f282611871565b90506114fc6119ca565b5061150733826126f4565b5081600c600082825461151a919061362c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115679190612fb9565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906136ac565b60405180910390fd5b61160a611c78565b5061161483611871565b90508260096000828254611628919061362c565b9250508190555061163984826127fb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116979190612fb9565b60405180910390a36116a76128bf565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261172a91906135a2565b7f0000000000000000000000000000000000000000000000000000000000000000611755919061362c565b9050919050565b600080826000015163ffffffff16111561177957600090506117c4565b6000826020015168ffffffffffffffffff16111561179a57600090506117c4565b600082604001516cffffffffffffffffffffffffff1611156117bf57600090506117c4565b600190505b919050565b6000603c82426117d9919061350e565b6117e39190613571565b9050919050565b60035481565b6000806402540be4008361180491906135a2565b7f000000000000000000000000000000000000000000000000000000000000000061182f919061350e565b8461183a91906135a2565b90507f0000000000000000000000000000000000000000000000000000000000000000816118689190613571565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118a291906136cc565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118e091906135a2565b6118ea9190613571565b9050919050565b6000603c8242611901919061350e565b61190b9190613571565b9050919050565b600080600080611921856116b3565b925061192e6003546117c9565b905061197a6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661196291906136cc565b6fffffffffffffffffffffffffffffffff1682611181565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119aa91906135a2565b82846119b691906135a2565b6119c09190613571565b9350505050919050565b60006119d6600061238d565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3457600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c82612cd3565b611c8a612cd3565b611c92612cd3565b6000806000806000611ca26119ca565b50611cab612a9c565b9750611cb68861175c565b15611ccc57600098505050505050505050611f14565b6000600a5481548110611ce257611ce1613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff16815250509550611d9e886124e4565b9450600185611dad919061362c565b9050611db8866126b2565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611de79190613571565b9150611df38483611181565b9250611e09600084611e03610e94565b84612632565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff1602179055505050611ecf87612c41565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611eff9190612fb9565b60405180910390a16001985050505050505050505b90565b6000806000611f25846124c5565b9150611f30846126b2565b9050611f3c82826117f0565b92505050919050565b60078054611f5290613442565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90613442565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461202f57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061209c83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212757600080fd5b61212f611c78565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bc919061350e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161229c9190612fb9565b60405180910390a3600191505092915050565b60008060006122bc611c78565b506122c684611871565b91506122d33386846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516123329190612fb9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061239d6003546117c9565b9150600082036123b2576000925050506124c0565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000841180156123f457508184105b156123fd578391505b6124078183611181565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261244c91906135a2565b600354612459919061362c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516124b19190613773565b60405180910390a46001925050505b919050565b6000816020015168ffffffffffffffffff169050919050565b600a5481565b6000816000015163ffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612553919061350e565b61255d9190613571565b612567919061362c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ec57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61263a612cd3565b612642612cd3565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b600081604001516cffffffffffffffffffffffffff169050919050565b6000806126dc85846126f4565b506126e784846127fb565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361275057600093505050506127f5565b612759866116b3565b92508483101561279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906137da565b60405180910390fd5b84836127aa919061350e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361285757600093505050506128b9565b612860866116b3565b9250848361286e919061362c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006128c9612cd3565b60006128d3610e94565b9050600060016000805490506128e9919061350e565b815481106128fa576128f9613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506129e4919061350e565b815481106129f5576129f4613709565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff16021790555090505060019250505090565b612aa4612cd3565b612aac612cd3565b612ab4612cd3565b600080600a5481548110612acb57612aca613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c099190613826565b6fffffffffffffffffffffffffffffffff169050612c26836124e4565b8111612c3757819350505050612c3e565b8293505050505b90565b6000806000612c4f84611f17565b9150600b54612c5d83611871565b612c67919061350e565b9050612c95600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127fb565b506001600a6000828254612ca9919061362c565b9250508190555080600b6000828254612cc2919061362c565b925050819055508192505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5881612d23565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b600060208284031215612d9157612d90612d1e565b5b6000612d9f84828501612d66565b91505092915050565b60008115159050919050565b612dbd81612da8565b82525050565b6000602082019050612dd86000830184612db4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e18578082015181840152602081019050612dfd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4082612dde565b612e4a8185612de9565b9350612e5a818560208601612dfa565b612e6381612e24565b840191505092915050565b60006020820190508181036000830152612e888184612e35565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ebb82612e90565b9050919050565b612ecb81612eb0565b8114612ed657600080fd5b50565b600081359050612ee881612ec2565b92915050565b6000819050919050565b612f0181612eee565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d1e565b5b6000612f4985828601612ed9565b9250506020612f5a85828601612f0f565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612f8981612f64565b82525050565b6000602082019050612fa46000830184612f80565b92915050565b612fb381612eee565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b600080600060608486031215612fed57612fec612d1e565b5b6000612ffb86828701612ed9565b935050602061300c86828701612ed9565b925050604061301d86828701612f0f565b9150509250925092565b60006020828403121561303d5761303c612d1e565b5b600061304b84828501612ed9565b91505092915050565b6000806040838503121561306b5761306a612d1e565b5b600061307985828601612f0f565b925050602061308a85828601612f0f565b9150509250929050565b6000602082840312156130aa576130a9612d1e565b5b60006130b884828501612f0f565b91505092915050565b600063ffffffff82169050919050565b6130da816130c1565b82525050565b600068ffffffffffffffffff82169050919050565b6130fe816130e0565b82525050565b60006cffffffffffffffffffffffffff82169050919050565b61312681613104565b82525050565b600060608201905061314160008301866130d1565b61314e60208301856130f5565b61315b604083018461311d565b949350505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131a082612e24565b810181811067ffffffffffffffff821117156131bf576131be613168565b5b80604052505050565b60006131d2612d14565b90506131de8282613197565b919050565b6131ec816130c1565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b613218816130e0565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b61324481613104565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006060828403121561327d5761327c613163565b5b61328760606131c8565b90506000613297848285016131fa565b60008301525060206132ab84828501613226565b60208301525060406132bf84828501613252565b60408301525092915050565b6000606082840312156132e1576132e0612d1e565b5b60006132ef84828501613267565b91505092915050565b61330181612eb0565b82525050565b600060208201905061331c60008301846132f8565b92915050565b6000806000806080858703121561333c5761333b612d1e565b5b600061334a87828801612f0f565b945050602061335b87828801612f0f565b935050604061336c87828801612f0f565b925050606061337d87828801612f0f565b91505092959194509250565b613392816130c1565b82525050565b6133a1816130e0565b82525050565b6133b081613104565b82525050565b6060820160008201516133cc6000850182613389565b5060208201516133df6020850182613398565b5060408201516133f260408501826133a7565b50505050565b600060608201905061340d60008301846133b6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345a57607f821691505b60208210810361346d5761346c613413565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006134a9600a83612de9565b91506134b482613473565b602082019050919050565b600060208201905081810360008301526134d88161349c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351982612eee565b915061352483612eee565b925082820390508181111561353c5761353b6134df565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061357c82612eee565b915061358783612eee565b92508261359757613596613542565b5b828204905092915050565b60006135ad82612eee565b91506135b883612eee565b92508282026135c681612eee565b915082820484148315176135dd576135dc6134df565b5b5092915050565b60006135ef82612eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613621576136206134df565b5b600182019050919050565b600061363782612eee565b915061364283612eee565b925082820190508082111561365a576136596134df565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000613696600a83612de9565b91506136a182613660565b602082019050919050565b600060208201905081810360008301526136c581613689565b9050919050565b60006136d782612f64565b91506136e283612f64565b92508282026136f081612f64565b9150808214613702576137016134df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061375d61375861375384612f64565b613738565b612eee565b9050919050565b61376d81613742565b82525050565b60006020820190506137886000830184613764565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006137c4600d83612de9565b91506137cf8261378e565b602082019050919050565b600060208201905081810360008301526137f3816137b7565b9050919050565b61380381612f64565b811461380e57600080fd5b50565b600081519050613820816137fa565b92915050565b60006020828403121561383c5761383b612d1e565b5b600061384a84828501613811565b9150509291505056fea264697066735822122008caebcd04cc1bb42095504e6580d634464818fdc889058130c22a47ada837f064736f6c63430008110033 \ No newline at end of file diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 81aeba0..51bf9b6 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -10,15 +10,6 @@ contract DemurrageTokenSingleCap { uint104 demurrage; } redistributionItem[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - // Redistribution bit field, with associated shifts and masks - // (Uses sub-byte boundaries) -// bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) -// uint8 constant shiftRedistributionPeriod = 0; -// uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 -// uint8 constant shiftRedistributionValue = 32; -// uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 -// uint8 constant shiftRedistributionDemurrage = 104; -// uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 36) - 1) << 140 // Account balances mapping (address => uint256) account; @@ -229,16 +220,6 @@ contract DemurrageTokenSingleCap { } // Deserializes the redistribution word - // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) -// function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { -// bytes32 redistribution; -// -// redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); -// redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); -// redistribution |= bytes32(_period & maskRedistributionPeriod); -// return redistribution; -// } - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { redistributionItem memory redistribution; @@ -248,32 +229,18 @@ contract DemurrageTokenSingleCap { return redistribution; } -// -// // Serializes the demurrage period part of the redistribution word -// function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { -// return uint256(redistribution) & maskRedistributionPeriod; -// } -// + // Serializes the demurrage period part of the redistribution word function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { return uint256(_redistribution.period); } -// // Serializes the supply part of the redistribution word -// function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { -// return (uint256(redistribution) & kkRedistributionValue) >> shiftRedistributionValue; -// } - + // Serializes the supply part of the redistribution word function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { return uint256(_redistribution.value); } -// -// // Serializes the number of participants part of the redistribution word -// function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { -// return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; -// } - + // Serializes the number of participants part of the redistribution word function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { return uint256(_redistribution.demurrage); } @@ -283,20 +250,8 @@ contract DemurrageTokenSingleCap { function redistributionCount() public view returns (uint256) { return redistributions.length; } -// -// // Save the current total supply amount to the current redistribution period -// function saveRedistributionSupply() private returns (bool) { -// uint256 currentRedistribution; -// uint256 grownSupply; -// -// grownSupply = totalSupply(); -// currentRedistribution = uint256(redistributions[redistributions.length-1]); -// currentRedistribution &= (~maskRedistributionValue); -// currentRedistribution |= (grownSupply << shiftRedistributionValue); -// -// redistributions[redistributions.length-1] = bytes32(currentRedistribution); -// return true; -// } + + // Save the current total supply amount to the current redistribution period function saveRedistributionSupply() private returns (bool) { redistributionItem memory currentRedistribution; uint256 grownSupply; diff --git a/solidity/Makefile b/solidity/Makefile index b2f4bbc..f942848 100644 --- a/solidity/Makefile +++ b/solidity/Makefile @@ -1,6 +1,6 @@ SOLC = /usr/bin/solc -all: multi single +all: single_nocap multi_nocap: $(SOLC) DemurrageTokenMultiNocap.sol --abi --evm-version byzantium | awk 'NR>3' > DemurrageTokenMultiNocap.json @@ -33,6 +33,7 @@ test: all python ../python/tests/test_pure.py install: all - cp -v DemurrageToken*.{json,bin} ../python/erc20_demurrage_token/data/ + cp -v DemurrageToken*.json ../python/erc20_demurrage_token/data/ + cp -v DemurrageToken*.bin ../python/erc20_demurrage_token/data/ .PHONY: test install From ffc041c1a3618e7f58836ca21a3015a4f0b23dd0 Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 9 Feb 2023 05:09:45 +0000 Subject: [PATCH 13/57] WIP Implement abdk math contract for constructor, decay --- solidity/DemurrageTokenSingleNocap.sol | 857 +++++++++++++------------ solidity/Makefile | 4 +- 2 files changed, 444 insertions(+), 417 deletions(-) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 51bf9b6..7983b5d 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -1,13 +1,15 @@ pragma solidity >= 0.8.0; +import "aux/ABDKMath64x64.sol"; + // SPDX-License-Identifier: GPL-3.0-or-later contract DemurrageTokenSingleCap { struct redistributionItem { uint32 period; uint72 value; - uint104 demurrage; + uint40 demurrage; } redistributionItem[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) @@ -15,7 +17,8 @@ contract DemurrageTokenSingleCap { mapping (address => uint256) account; // Cached demurrage amount, ppm with 38 digit resolution - uint128 public demurrageAmount; + //uint128 public demurrageAmount; + int128 public demurrageAmount; // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated uint256 public demurrageTimestamp; @@ -49,13 +52,13 @@ contract DemurrageTokenSingleCap { // 128 bit resolution of the demurrage divisor // (this constant x 1000000 is contained within 128 bits) - uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less + //uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less // remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay - uint256 constant growthResolutionFactor = 1000000000000; + //uint256 constant growthResolutionFactor = 1000000000000; // demurrage decimal width; 38 places - uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; + //uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; // Timestamp of start of periods (time which contract constructor was called) uint256 public immutable periodStart; @@ -64,7 +67,9 @@ contract DemurrageTokenSingleCap { uint256 public immutable periodDuration; // Demurrage in ppm per minute - uint256 public immutable taxLevel; + //uint256 public immutable taxLevel; + // 64x64 + int128 public taxLevel; // Addresses allowed to mint new tokens mapping (address => bool) minter; @@ -102,9 +107,12 @@ contract DemurrageTokenSingleCap { // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - constructor(string memory _name, string memory _symbol, uint8 _decimals, uint128 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public { + constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { + require(_taxLevel < (1 << 64)); redistributionItem memory initialRedistribution; + //require(ABDKMath64x64.toUInt(_taxLevel) == 0); + // ACL setup owner = msg.sender; minter[owner] = true; @@ -118,9 +126,11 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = block.timestamp; periodStart = demurrageTimestamp; periodDuration = _periodMinutes * 60; - demurrageAmount = uint128(nanoDivider) * 100; - taxLevel = _taxLevelMinute; // Represents 38 decimal places - initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); + demurrageAmount = ABDKMath64x64.fromUInt(1); + + //taxLevel = ABDKMath64x64.mul(ABDKMath64x64.ln(ABDKMath64x64.sub(demurrageAmount, , ABDKMath64x64.fromUInt(_periodMinutes)); + taxLevel = ABDKMath64x64.ln(_taxLevel); + initialRedistribution = toRedistribution(0, uint40(uint128(demurrageAmount)), 0, 1); redistributions.push(initialRedistribution); // Misc settings @@ -128,96 +138,96 @@ contract DemurrageTokenSingleCap { } - // Change sink address for redistribution - function setSinkAddress(address _sinkAddress) public { - require(msg.sender == owner); - sinkAddress = _sinkAddress; - } - - // Given address will be allowed to call the mintTo() function - function addMinter(address _minter) public returns (bool) { - require(msg.sender == owner); - minter[_minter] = true; - return true; - } - - // Given address will no longer be allowed to call the mintTo() function - function removeMinter(address _minter) public returns (bool) { - require(msg.sender == owner || _minter == msg.sender); - minter[_minter] = false; - return true; - } - - /// Implements ERC20 - function balanceOf(address _account) public view returns (uint256) { - uint256 baseBalance; - uint256 currentDemurragedAmount; - uint256 periodCount; - - baseBalance = baseBalanceOf(_account); - - periodCount = getMinutesDelta(demurrageTimestamp); - - currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); - - return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); - } - - /// Balance unmodified by demurrage - function baseBalanceOf(address _account) public view returns (uint256) { - return account[_account]; - } - - /// Increases base balance for a single account - function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - account[_account] = oldBalance + _delta; - return true; - } - - /// Decreases base balance for a single account - function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard - account[_account] = oldBalance - _delta; - return true; - } - - // Creates new tokens out of thin air, and allocates them to the given address - // Triggers tax - function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { - uint256 baseAmount; - - require(minter[msg.sender], 'ERR_ACCESS'); - - changePeriod(); - baseAmount = toBaseAmount(_amount); - supply += _amount; - increaseBaseBalance(_beneficiary, baseAmount); - emit Mint(msg.sender, _beneficiary, _amount); - saveRedistributionSupply(); - return true; - } +// // Change sink address for redistribution +// function setSinkAddress(address _sinkAddress) public { +// require(msg.sender == owner); +// sinkAddress = _sinkAddress; +// } +// +// // Given address will be allowed to call the mintTo() function +// function addMinter(address _minter) public returns (bool) { +// require(msg.sender == owner); +// minter[_minter] = true; +// return true; +// } +// +// // Given address will no longer be allowed to call the mintTo() function +// function removeMinter(address _minter) public returns (bool) { +// require(msg.sender == owner || _minter == msg.sender); +// minter[_minter] = false; +// return true; +// } +// +// /// Implements ERC20 +// function balanceOf(address _account) public view returns (uint256) { +// uint256 baseBalance; +// uint256 currentDemurragedAmount; +// uint256 periodCount; +// +// baseBalance = baseBalanceOf(_account); +// +// periodCount = getMinutesDelta(demurrageTimestamp); +// +// currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); +// +// return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); +// } +// +// /// Balance unmodified by demurrage +// function baseBalanceOf(address _account) public view returns (uint256) { +// return account[_account]; +// } +// +// /// Increases base balance for a single account +// function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { +// uint256 oldBalance; +// uint256 newBalance; +// uint256 workAccount; +// +// workAccount = uint256(account[_account]); +// +// if (_delta == 0) { +// return false; +// } +// +// oldBalance = baseBalanceOf(_account); +// account[_account] = oldBalance + _delta; +// return true; +// } +// +// /// Decreases base balance for a single account +// function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { +// uint256 oldBalance; +// uint256 newBalance; +// uint256 workAccount; +// +// workAccount = uint256(account[_account]); +// +// if (_delta == 0) { +// return false; +// } +// +// oldBalance = baseBalanceOf(_account); +// require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard +// account[_account] = oldBalance - _delta; +// return true; +// } +// +// // Creates new tokens out of thin air, and allocates them to the given address +// // Triggers tax +// function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { +// uint256 baseAmount; +// +// require(minter[msg.sender], 'ERR_ACCESS'); +// +// changePeriod(); +// baseAmount = toBaseAmount(_amount); +// supply += _amount; +// increaseBaseBalance(_beneficiary, baseAmount); +// emit Mint(msg.sender, _beneficiary, _amount); +// saveRedistributionSupply(); +// return true; +// } // Deserializes the redistribution word function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { @@ -225,185 +235,199 @@ contract DemurrageTokenSingleCap { redistribution.period = uint32(_period); redistribution.value = uint72(_value); - redistribution.demurrage = uint104(_demurrageModifierPpm); + redistribution.demurrage = uint40(_demurrageModifierPpm); return redistribution; } - - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { - return uint256(_redistribution.period); - } - - // Serializes the supply part of the redistribution word - function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { - return uint256(_redistribution.value); - } - - // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { - return uint256(_redistribution.demurrage); - } - - - // Client accessor to the redistributions array length - function redistributionCount() public view returns (uint256) { - return redistributions.length; - } - - // Save the current total supply amount to the current redistribution period - function saveRedistributionSupply() private returns (bool) { - redistributionItem memory currentRedistribution; - uint256 grownSupply; - - grownSupply = totalSupply(); - currentRedistribution = redistributions[redistributions.length-1]; - currentRedistribution.value = uint72(grownSupply); - - redistributions[redistributions.length-1] = currentRedistribution; - return true; - } - - // Get the demurrage period of the current block number - function actualPeriod() public view returns (uint128) { - return uint128((block.timestamp - periodStart) / periodDuration + 1); - } - - // Retrieve next redistribution if the period threshold has been crossed - function checkPeriod() private view returns (redistributionItem memory) { - redistributionItem memory lastRedistribution; - redistributionItem memory emptyRedistribution; - uint256 currentPeriod; - - lastRedistribution = redistributions[lastPeriod]; - currentPeriod = this.actualPeriod(); - if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return emptyRedistribution; - } - return lastRedistribution; - } - - function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { - uint256 difference; - - difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); - return difference / resolutionFactor; - } - - function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { - uint256 redistributionSupply; - uint256 redistributionDemurrage; - - redistributionSupply = toRedistributionSupply(_redistribution); - redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); - return getDistribution(redistributionSupply, redistributionDemurrage); - } - - // Returns the amount sent to the sink address - function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { - uint256 unit; - uint256 baseUnit; - - unit = getDistributionFromRedistribution(_redistribution); - baseUnit = toBaseAmount(unit) - totalSink; - increaseBaseBalance(sinkAddress, baseUnit); - lastPeriod += 1; - totalSink += baseUnit; - return unit; - } - - // Calculate the time delta in whole minutes passed between given timestamp and current timestamp - function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { - return (block.timestamp - _lastTimestamp) / 60; - } - - // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (bool) { - return applyDemurrageLimited(0); - } - - function applyDemurrageLimited(uint256 _rounds) public returns (bool) { - uint256 periodCount; - uint256 lastDemurrageAmount; - - periodCount = getMinutesDelta(demurrageTimestamp); - if (periodCount == 0) { - return false; - } - lastDemurrageAmount = demurrageAmount; - - // safety limit for exponential calculation to ensure that we can always - // execute this code no matter how much time passes. - if (_rounds > 0 && _rounds < periodCount) { - periodCount = _rounds; - } - - demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); - //demurragePeriod = epochPeriodCount; - demurrageTimestamp = demurrageTimestamp + (periodCount * 60); - emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return true; - } - - // Return timestamp of start of period threshold - function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { - return periodStart + (_periodCount * periodDuration); - } - - // Amount of demurrage cycles inbetween the current timestamp and the given target time - function demurrageCycles(uint256 _target) public view returns (uint256) { - return (block.timestamp - _target) / 60; - } - - function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { - if (_redistribution.period > 0) { - return false; - } - if (_redistribution.value > 0) { - return false; - } - if (_redistribution.demurrage > 0) { - return false; - } - return true; - } - - // Recalculate the demurrage modifier for the new period - // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. - function changePeriod() public returns (bool) { - redistributionItem memory currentRedistribution; - redistributionItem memory nextRedistribution; - redistributionItem memory lastRedistribution; - uint256 currentPeriod; - uint256 lastDemurrageAmount; - uint256 nextRedistributionDemurrage; - uint256 demurrageCounts; - uint256 nextPeriod; - - applyDemurrage(); - currentRedistribution = checkPeriod(); - if (isEmptyRedistribution(currentRedistribution)) { - return false; - } - - // calculate the decay from previous redistributino - lastRedistribution = redistributions[lastPeriod]; - currentPeriod = toRedistributionPeriod(currentRedistribution); - nextPeriod = currentPeriod + 1; - lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); - demurrageCounts = periodDuration / 60; - nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); - redistributions.push(nextRedistribution); - - applyDefaultRedistribution(nextRedistribution); - emit Period(nextPeriod); - return true; - } - - // Reverse a value reduced by demurrage by the given period to its original value -// function growBy(uint256 _value, uint256 _period) public view returns (uint256) { +// +// // Serializes the demurrage period part of the redistribution word +// function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { +// return uint256(_redistribution.period); +// } +// +// // Serializes the supply part of the redistribution word +// function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { +// return uint256(_redistribution.value); +// } +// +// // Serializes the number of participants part of the redistribution word +// function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { +// return uint256(_redistribution.demurrage); +// } +// +// +// // Client accessor to the redistributions array length +// function redistributionCount() public view returns (uint256) { +// return redistributions.length; +// } +// +// // Save the current total supply amount to the current redistribution period +// function saveRedistributionSupply() private returns (bool) { +// redistributionItem memory currentRedistribution; +// uint256 grownSupply; +// +// grownSupply = totalSupply(); +// currentRedistribution = redistributions[redistributions.length-1]; +// currentRedistribution.value = uint72(grownSupply); +// +// redistributions[redistributions.length-1] = currentRedistribution; +// return true; +// } +// +// // Get the demurrage period of the current block number +// function actualPeriod() public view returns (uint128) { +// return uint128((block.timestamp - periodStart) / periodDuration + 1); +// } +// +// // Retrieve next redistribution if the period threshold has been crossed +// function checkPeriod() private view returns (redistributionItem memory) { +// redistributionItem memory lastRedistribution; +// redistributionItem memory emptyRedistribution; +// uint256 currentPeriod; +// +// lastRedistribution = redistributions[lastPeriod]; +// currentPeriod = this.actualPeriod(); +// if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { +// return emptyRedistribution; +// } +// return lastRedistribution; +// } +// +// function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { +// uint256 difference; +// +// difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); +// return difference / resolutionFactor; +// } +// +// function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { +// uint256 redistributionSupply; +// uint256 redistributionDemurrage; +// +// redistributionSupply = toRedistributionSupply(_redistribution); +// redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); +// return getDistribution(redistributionSupply, redistributionDemurrage); +// } +// +// // Returns the amount sent to the sink address +// function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { +// uint256 unit; +// uint256 baseUnit; +// +// unit = getDistributionFromRedistribution(_redistribution); +// baseUnit = toBaseAmount(unit) - totalSink; +// increaseBaseBalance(sinkAddress, baseUnit); +// lastPeriod += 1; +// totalSink += baseUnit; +// return unit; +// } +// +// // Calculate the time delta in whole minutes passed between given timestamp and current timestamp +// function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { +// return (block.timestamp - _lastTimestamp) / 60; +// } +// +// // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call +// function applyDemurrage() public returns (bool) { +// return applyDemurrageLimited(0); +// } +// +// function applyDemurrageLimited(uint256 _rounds) public returns (bool) { +// uint256 periodCount; +// uint256 lastDemurrageAmount; +// +// periodCount = getMinutesDelta(demurrageTimestamp); +// if (periodCount == 0) { +// return false; +// } +// lastDemurrageAmount = demurrageAmount; +// +// // safety limit for exponential calculation to ensure that we can always +// // execute this code no matter how much time passes. +// if (_rounds > 0 && _rounds < periodCount) { +// periodCount = _rounds; +// } +// +// demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); +// //demurragePeriod = epochPeriodCount; +// demurrageTimestamp = demurrageTimestamp + (periodCount * 60); +// emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); +// return true; +// } +// +// // Return timestamp of start of period threshold +// function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { +// return periodStart + (_periodCount * periodDuration); +// } +// +// // Amount of demurrage cycles inbetween the current timestamp and the given target time +// function demurrageCycles(uint256 _target) public view returns (uint256) { +// return (block.timestamp - _target) / 60; +// } +// +// function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { +// if (_redistribution.period > 0) { +// return false; +// } +// if (_redistribution.value > 0) { +// return false; +// } +// if (_redistribution.demurrage > 0) { +// return false; +// } +// return true; +// } +// +// // Recalculate the demurrage modifier for the new period +// // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. +// function changePeriod() public returns (bool) { +// redistributionItem memory currentRedistribution; +// redistributionItem memory nextRedistribution; +// redistributionItem memory lastRedistribution; +// uint256 currentPeriod; +// uint256 lastDemurrageAmount; +// uint256 nextRedistributionDemurrage; +// uint256 demurrageCounts; +// uint256 nextPeriod; +// +// applyDemurrage(); +// currentRedistribution = checkPeriod(); +// if (isEmptyRedistribution(currentRedistribution)) { +// return false; +// } +// +// // calculate the decay from previous redistributino +// lastRedistribution = redistributions[lastPeriod]; +// currentPeriod = toRedistributionPeriod(currentRedistribution); +// nextPeriod = currentPeriod + 1; +// lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); +// demurrageCounts = periodDuration / 60; +// nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); +// +// nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); +// redistributions.push(nextRedistribution); +// +// applyDefaultRedistribution(nextRedistribution); +// emit Period(nextPeriod); +// return true; +// } +// +// // Reverse a value reduced by demurrage by the given period to its original value +//// function growBy(uint256 _value, uint256 _period) public view returns (uint256) { +//// uint256 valueFactor; +//// uint256 truncatedTaxLevel; +//// +//// valueFactor = growthResolutionFactor; +//// truncatedTaxLevel = taxLevel / nanoDivider; +//// +//// for (uint256 i = 0; i < _period; i++) { +//// valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); +//// } +//// return (valueFactor * _value) / growthResolutionFactor; +//// } +// +// // Calculate a value reduced by demurrage by the given period +// function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { // uint256 valueFactor; // uint256 truncatedTaxLevel; // @@ -411,152 +435,155 @@ contract DemurrageTokenSingleCap { // truncatedTaxLevel = taxLevel / nanoDivider; // // for (uint256 i = 0; i < _period; i++) { -// valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); +// valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); // } // return (valueFactor * _value) / growthResolutionFactor; // } - // Calculate a value reduced by demurrage by the given period - function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = growthResolutionFactor; - truncatedTaxLevel = taxLevel / nanoDivider; + function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { + int128 valuePoint; + int128 periodPoint; + int128 v; + + valuePoint = ABDKMath64x64.fromUInt(_value); + periodPoint = ABDKMath64x64.fromUInt(_period); - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); - } - return (valueFactor * _value) / growthResolutionFactor; + //valuePoint -= ABDKMath64x64.mul(ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, periodPoint)), valuePoint); + //valuePoint -= ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, periodPoint)); + v = ABDKMath64x64.mul(taxLevel, periodPoint); + v = ABDKMath64x64.exp(v); + v = ABDKMath64x64.mul(valuePoint, v); + return ABDKMath64x64.toUInt(v); } - // Inflates the given amount according to the current demurrage modifier - function toBaseAmount(uint256 _value) public view returns (uint256) { - return (_value * resolutionFactor) / (demurrageAmount * 10000000000); - } - - // Implements ERC20, triggers tax and/or redistribution - function approve(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - if (allowance[msg.sender][_spender] > 0) { - require(_value == 0, 'ZERO_FIRST'); - } - - changePeriod(); - - baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] = baseValue; - emit Approval(msg.sender, _spender, _value); - return true; - } - - // Reduce allowance by amount - function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - baseValue = toBaseAmount(_value); - require(allowance[msg.sender][_spender] >= baseValue); - - changePeriod(); - - allowance[msg.sender][_spender] -= baseValue; - emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); - return true; - } - - // Increase allowance by amount - function increaseAllowance(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - changePeriod(); - - baseValue = toBaseAmount(_value); - - allowance[msg.sender][_spender] += baseValue; - emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); - return true; - } - - // Implements ERC20, triggers tax and/or redistribution - function transfer(address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - - baseValue = toBaseAmount(_value); - result = transferBase(msg.sender, _to, baseValue); - emit Transfer(msg.sender, _to, _value); - return result; - } - - // Implements ERC20, triggers tax and/or redistribution - function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - - baseValue = toBaseAmount(_value); - require(allowance[_from][msg.sender] >= baseValue); - - allowance[_from][msg.sender] -= baseValue; - result = transferBase(_from, _to, baseValue); - - emit Transfer(_from, _to, _value); - return result; - } - - // ERC20 transfer backend for transfer, transferFrom - function transferBase(address _from, address _to, uint256 _value) private returns (bool) { - uint256 period; - - decreaseBaseBalance(_from, _value); - increaseBaseBalance(_to, _value); - - return true; - } - - // Implements EIP173 - function transferOwnership(address _newOwner) public returns (bool) { - require(msg.sender == owner); - newOwner = _newOwner; - } - - // Implements OwnedAccepter - function acceptOwnership() public returns (bool) { - address oldOwner; - - require(msg.sender == newOwner); - oldOwner = owner; - owner = newOwner; - newOwner = address(0); - emit OwnershipTransferred(oldOwner, owner); - } - - // Explicitly and irretrievably burn tokens - // Only token minters can burn tokens - function burn(uint256 _value) public { - require(minter[msg.sender]); - require(_value <= account[msg.sender]); - uint256 _delta = toBaseAmount(_value); - - applyDemurrage(); - decreaseBaseBalance(msg.sender, _delta); - burned += _value; - emit Burn(msg.sender, _value); - } - - // Implements ERC20 - function totalSupply() public view returns (uint256) { - return supply - burned; - } - - // Return total number of burned tokens - function totalBurned() public view returns (uint256) { - return burned; - } +// +// // Inflates the given amount according to the current demurrage modifier +// function toBaseAmount(uint256 _value) public view returns (uint256) { +// return (_value * resolutionFactor) / (demurrageAmount * 10000000000); +// } +// +// // Implements ERC20, triggers tax and/or redistribution +// function approve(address _spender, uint256 _value) public returns (bool) { +// uint256 baseValue; +// +// if (allowance[msg.sender][_spender] > 0) { +// require(_value == 0, 'ZERO_FIRST'); +// } +// +// changePeriod(); +// +// baseValue = toBaseAmount(_value); +// allowance[msg.sender][_spender] = baseValue; +// emit Approval(msg.sender, _spender, _value); +// return true; +// } +// +// // Reduce allowance by amount +// function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { +// uint256 baseValue; +// +// baseValue = toBaseAmount(_value); +// require(allowance[msg.sender][_spender] >= baseValue); +// +// changePeriod(); +// +// allowance[msg.sender][_spender] -= baseValue; +// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); +// return true; +// } +// +// // Increase allowance by amount +// function increaseAllowance(address _spender, uint256 _value) public returns (bool) { +// uint256 baseValue; +// +// changePeriod(); +// +// baseValue = toBaseAmount(_value); +// +// allowance[msg.sender][_spender] += baseValue; +// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); +// return true; +// } +// +// // Implements ERC20, triggers tax and/or redistribution +// function transfer(address _to, uint256 _value) public returns (bool) { +// uint256 baseValue; +// bool result; +// +// changePeriod(); +// +// baseValue = toBaseAmount(_value); +// result = transferBase(msg.sender, _to, baseValue); +// emit Transfer(msg.sender, _to, _value); +// return result; +// } +// +// // Implements ERC20, triggers tax and/or redistribution +// function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { +// uint256 baseValue; +// bool result; +// +// changePeriod(); +// +// baseValue = toBaseAmount(_value); +// require(allowance[_from][msg.sender] >= baseValue); +// +// allowance[_from][msg.sender] -= baseValue; +// result = transferBase(_from, _to, baseValue); +// +// emit Transfer(_from, _to, _value); +// return result; +// } +// +// // ERC20 transfer backend for transfer, transferFrom +// function transferBase(address _from, address _to, uint256 _value) private returns (bool) { +// uint256 period; +// +// decreaseBaseBalance(_from, _value); +// increaseBaseBalance(_to, _value); +// +// return true; +// } +// +// // Implements EIP173 +// function transferOwnership(address _newOwner) public returns (bool) { +// require(msg.sender == owner); +// newOwner = _newOwner; +// } +// +// // Implements OwnedAccepter +// function acceptOwnership() public returns (bool) { +// address oldOwner; +// +// require(msg.sender == newOwner); +// oldOwner = owner; +// owner = newOwner; +// newOwner = address(0); +// emit OwnershipTransferred(oldOwner, owner); +// } +// +// // Explicitly and irretrievably burn tokens +// // Only token minters can burn tokens +// function burn(uint256 _value) public { +// require(minter[msg.sender]); +// require(_value <= account[msg.sender]); +// uint256 _delta = toBaseAmount(_value); +// +// applyDemurrage(); +// decreaseBaseBalance(msg.sender, _delta); +// burned += _value; +// emit Burn(msg.sender, _value); +// } +// +// // Implements ERC20 +// function totalSupply() public view returns (uint256) { +// return supply - burned; +// } +// +// // Return total number of burned tokens +// function totalBurned() public view returns (uint256) { +// return burned; +// } // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { diff --git a/solidity/Makefile b/solidity/Makefile index f942848..ae47778 100644 --- a/solidity/Makefile +++ b/solidity/Makefile @@ -15,8 +15,8 @@ multi_cap: multi: multi_nocap multi_cap single_nocap: - $(SOLC) DemurrageTokenSingleNocap.sol --abi --evm-version byzantium | awk 'NR>3' > DemurrageTokenSingleNocap.json - $(SOLC) DemurrageTokenSingleNocap.sol --bin --evm-version byzantium | awk 'NR>3' > DemurrageTokenSingleNocap.bin + $(SOLC) DemurrageTokenSingleNocap.sol --abi --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.json + $(SOLC) DemurrageTokenSingleNocap.sol --bin --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.bin truncate -s -1 DemurrageTokenSingleNocap.bin single_cap: From ae2c1b41240487ed47674a32276240451c9c31fa Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 9 Feb 2023 06:49:18 +0000 Subject: [PATCH 14/57] Rewrite base unittest module, reinstate more contract methods --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- .../unittest/__init__.py | 2 +- .../erc20_demurrage_token/unittest/newbase.py | 134 ++++++ python/requirements.txt | 4 +- solidity/DemurrageTokenSingleNocap.sol | 433 +++++++++--------- 6 files changed, 351 insertions(+), 226 deletions(-) create mode 100644 python/erc20_demurrage_token/unittest/newbase.py diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index e5b25b0..dc1b1ca 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -61010060405264e8d4a510006a52b7d2dcc80cd2e40000006200002391906200043b565b6080908152503480156200003657600080fd5b506040516200448a3803806200448a83398181016040528101906200005c91906200073a565b62000066620003c1565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600d6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000132919062000a5b565b50856007908162000144919062000a5b565b508460ff166008819055504260038190555060035460a08181525050603c836200016f91906200043b565b60c0818152505060646a52b7d2dcc80cd2e400000062000190919062000b42565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836fffffffffffffffffffffffffffffffff1660e08181525050620002326000600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff16600060016200033d640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff160217905550505081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000b88565b62000347620003c1565b62000351620003c1565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620004488262000402565b9150620004558362000402565b9250828202620004658162000402565b915082820484148315176200047f576200047e6200040c565b5b5092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620004ef82620004a4565b810181811067ffffffffffffffff82111715620005115762000510620004b5565b5b80604052505050565b60006200052662000486565b9050620005348282620004e4565b919050565b600067ffffffffffffffff821115620005575762000556620004b5565b5b6200056282620004a4565b9050602081019050919050565b60005b838110156200058f57808201518184015260208101905062000572565b60008484015250505050565b6000620005b2620005ac8462000539565b6200051a565b905082815260208101848484011115620005d157620005d06200049f565b5b620005de8482856200056f565b509392505050565b600082601f830112620005fe57620005fd6200049a565b5b8151620006108482602086016200059b565b91505092915050565b600060ff82169050919050565b620006318162000619565b81146200063d57600080fd5b50565b600081519050620006518162000626565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6200067e8162000657565b81146200068a57600080fd5b50565b6000815190506200069e8162000673565b92915050565b620006af8162000402565b8114620006bb57600080fd5b50565b600081519050620006cf81620006a4565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200070282620006d5565b9050919050565b6200071481620006f5565b81146200072057600080fd5b50565b600081519050620007348162000709565b92915050565b60008060008060008060c087890312156200075a576200075962000490565b5b600087015167ffffffffffffffff8111156200077b576200077a62000495565b5b6200078989828a01620005e6565b965050602087015167ffffffffffffffff811115620007ad57620007ac62000495565b5b620007bb89828a01620005e6565b9550506040620007ce89828a0162000640565b9450506060620007e189828a016200068d565b9350506080620007f489828a01620006be565b92505060a06200080789828a0162000723565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200086757607f821691505b6020821081036200087d576200087c6200081f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620008ea7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008a8565b620008f68683620008a8565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000939620009336200092d8462000402565b6200090e565b62000402565b9050919050565b6000819050919050565b620009558362000918565b6200096d620009648262000940565b848454620008b8565b825550505050565b600090565b6200098462000975565b620009918184846200094a565b505050565b5b81811015620009b957620009ad6000826200097a565b60018101905062000997565b5050565b601f82111562000a0857620009d28162000883565b620009dd8462000898565b81016020851015620009ed578190505b62000a05620009fc8562000898565b83018262000996565b50505b505050565b60008160020a8304905092915050565b600062000a306000198460080262000a0d565b1980831691505092915050565b600062000a4b838362000a1d565b9150826002028217905092915050565b62000a668262000814565b67ffffffffffffffff81111562000a825762000a81620004b5565b5b62000a8e82546200084e565b62000a9b828285620009bd565b600060209050601f83116001811462000ad3576000841562000abe578287015190505b62000aca858262000a3d565b86555062000b3a565b601f19841662000ae38662000883565b60005b8281101562000b0d5784890151825560018201915060208501945060208101905062000ae6565b8683101562000b2d578489015162000b29601f89168262000a1d565b8355505b6001600288020188555050505b505050505050565b600062000b4f8262000657565b915062000b5c8362000657565b925082820262000b6c8162000657565b915080821462000b815762000b806200040c565b5b5092915050565b60805160a05160c05160e05161388962000c0160003960008181610eb9015261119c01526000818161170001528181611dbe0152818161236b015261250801526000818161172c01528181612529015261256e0152600081816118060152818161183e015281816118b6015261234701526138896000f3fe608060405234801561001057600080fd5b50600436106102d8576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161019f578063a9059cbb11610106578063d397de60116100bf578063eda4e6d611610099578063eda4e6d6146109bf578063f2fde38b146109dd578063f83da35d14610a0d578063f84e521314610a3d576102d8565b8063d397de6014610953578063d89135cd14610983578063e8095295146109a1576102d8565b8063a9059cbb14610869578063ab28cea014610899578063b470aade146108b7578063c0ab7077146108d5578063c7a7f89a14610905578063d340ef8a14610935576102d8565b80638f0b2d5d116101585780638f0b2d5d146107815780638f1df6bc1461079d578063936d9e7a146107bb57806395d89b41146107eb578063983b2d5614610809578063a457c2d714610839576102d8565b8063731f237c146106cd57806373f42561146106eb57806374bedb951461070957806379ba50971461072757806384dde4af146107455780638da5cb5b14610763576102d8565b806340452d911161024357806351b4541c116101fc57806351b4541c146105bf57806358b2833b146105ef5780636721d4ef1461060d5780636787a9be1461063d5780636a2d094e1461066d57806370a082311461069d576102d8565b806340452d91146104b157806342966c68146104e3578063449a52f8146104ff57806347a505171461052f5780634abfbba21461055f5780634d0df4fd1461058f576102d8565b8063229ba19711610295578063229ba197146103b557806323b872dd146103d35780633092afd5146104035780633133348714610433578063313ce567146104635780633950935114610481576102d8565b806301ffc9a7146102dd57806306fdde031461030d578063095ea7b31461032b57806309f28f3c1461035b57806318160ddd146103795780631989c6a814610397575b600080fd5b6102f760048036038101906102f29190612d7b565b610a6d565b6040516103049190612dc3565b60405180910390f35b610315610c13565b6040516103229190612e6e565b60405180910390f35b61034560048036038101906103409190612f24565b610ca1565b6040516103529190612dc3565b60405180910390f35b610363610e72565b6040516103709190612f8f565b60405180910390f35b610381610e94565b60405161038e9190612fb9565b60405180910390f35b61039f610eab565b6040516103ac9190612fb9565b60405180910390f35b6103bd610eb7565b6040516103ca9190612fb9565b60405180910390f35b6103ed60048036038101906103e89190612fd4565b610edb565b6040516103fa9190612dc3565b60405180910390f35b61041d60048036038101906104189190613027565b61108e565b60405161042a9190612dc3565b60405180910390f35b61044d60048036038101906104489190613054565b611181565b60405161045a9190612fb9565b60405180910390f35b61046b611235565b6040516104789190612fb9565b60405180910390f35b61049b60048036038101906104969190612f24565b61123b565b6040516104a89190612dc3565b60405180910390f35b6104cb60048036038101906104c69190613094565b6113d1565b6040516104da9392919061312c565b60405180910390f35b6104fd60048036038101906104f89190613094565b611445565b005b61051960048036038101906105149190612f24565b611573565b6040516105269190612dc3565b60405180910390f35b61054960048036038101906105449190613027565b6116b3565b6040516105569190612fb9565b60405180910390f35b61057960048036038101906105749190613094565b6116fc565b6040516105869190612fb9565b60405180910390f35b6105a960048036038101906105a491906132cb565b61175c565b6040516105b69190612dc3565b60405180910390f35b6105d960048036038101906105d49190613094565b6117c9565b6040516105e69190612fb9565b60405180910390f35b6105f76117ea565b6040516106049190612fb9565b60405180910390f35b61062760048036038101906106229190613054565b6117f0565b6040516106349190612fb9565b60405180910390f35b61065760048036038101906106529190613094565b611871565b6040516106649190612fb9565b60405180910390f35b61068760048036038101906106829190613094565b6118f1565b6040516106949190612fb9565b60405180910390f35b6106b760048036038101906106b29190613027565b611912565b6040516106c49190612fb9565b60405180910390f35b6106d56119ca565b6040516106e29190612dc3565b60405180910390f35b6106f36119db565b6040516107009190612fb9565b60405180910390f35b6107116119e1565b60405161071e9190612fb9565b60405180910390f35b61072f6119e7565b60405161073c9190612dc3565b60405180910390f35b61074d611b8e565b60405161075a9190613307565b60405180910390f35b61076b611bb4565b6040516107789190613307565b60405180910390f35b61079b60048036038101906107969190613027565b611bda565b005b6107a5611c78565b6040516107b29190612dc3565b60405180910390f35b6107d560048036038101906107d091906132cb565b611f17565b6040516107e29190612fb9565b60405180910390f35b6107f3611f45565b6040516108009190612e6e565b60405180910390f35b610823600480360381019061081e9190613027565b611fd3565b6040516108309190612dc3565b60405180910390f35b610853600480360381019061084e9190612f24565b612090565b6040516108609190612dc3565b60405180910390f35b610883600480360381019061087e9190612f24565b6122af565b6040516108909190612dc3565b60405180910390f35b6108a1612345565b6040516108ae9190612fb9565b60405180910390f35b6108bf612369565b6040516108cc9190612fb9565b60405180910390f35b6108ef60048036038101906108ea9190613094565b61238d565b6040516108fc9190612dc3565b60405180910390f35b61091f600480360381019061091a91906132cb565b6124c5565b60405161092c9190612fb9565b60405180910390f35b61093d6124de565b60405161094a9190612fb9565b60405180910390f35b61096d600480360381019061096891906132cb565b6124e4565b60405161097a9190612fb9565b60405180910390f35b61098b6124f8565b6040516109989190612fb9565b60405180910390f35b6109a9612502565b6040516109b69190612f8f565b60405180910390f35b6109c761256c565b6040516109d49190612fb9565b60405180910390f35b6109f760048036038101906109f29190613027565b612590565b604051610a049190612dc3565b60405180910390f35b610a276004803603810190610a229190613322565b612632565b604051610a3491906133f8565b60405180910390f35b610a576004803603810190610a5291906132cb565b6126b2565b604051610a649190612fb9565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ac15760019050610c0e565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b135760019050610c0e565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b655760019050610c0e565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bb75760019050610c0e565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c095760019050610c0e565b600090505b919050565b60068054610c2090613442565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4c90613442565b8015610c995780601f10610c6e57610100808354040283529160200191610c99565b820191906000526020600020905b815481529060010190602001808311610c7c57829003601f168201915b505050505081565b6000806000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d6d5760008314610d6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d63906134bf565b60405180910390fd5b5b610d75611c78565b50610d7f83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e5f9190612fb9565b60405180910390a3600191505092915050565b600260009054906101000a90046fffffffffffffffffffffffffffffffff1681565b6000600c54600954610ea6919061350e565b905090565b60008080549050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000610ee8611c78565b50610ef284611871565b915081600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610f7d57600080fd5b81600e60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611009919061350e565b9250508190555061101b8686846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161107a9190612fb9565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061111757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61112057600080fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600064e8d4a5100091506a52b7d2dcc80cd2e40000007f00000000000000000000000000000000000000000000000000000000000000006111c59190613571565b905060005b8481101561120e5764e8d4a5100082846111e491906135a2565b6111ee9190613571565b836111f9919061350e565b92508080611206906135e4565b9150506111ca565b5064e8d4a51000858361122191906135a2565b61122b9190613571565b9250505092915050565b60085481565b600080611246611c78565b5061125083611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112de919061362c565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516113be9190612fb9565b60405180910390a3600191505092915050565b600081815481106113e157600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a90046cffffffffffffffffffffffffff16905083565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661149b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156114e757600080fd5b60006114f282611871565b90506114fc6119ca565b5061150733826126f4565b5081600c600082825461151a919061362c565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115679190612fb9565b60405180910390a25050565b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f9906136ac565b60405180910390fd5b61160a611c78565b5061161483611871565b90508260096000828254611628919061362c565b9250508190555061163984826127fb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116979190612fb9565b60405180910390a36116a76128bf565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261172a91906135a2565b7f0000000000000000000000000000000000000000000000000000000000000000611755919061362c565b9050919050565b600080826000015163ffffffff16111561177957600090506117c4565b6000826020015168ffffffffffffffffff16111561179a57600090506117c4565b600082604001516cffffffffffffffffffffffffff1611156117bf57600090506117c4565b600190505b919050565b6000603c82426117d9919061350e565b6117e39190613571565b9050919050565b60035481565b6000806402540be4008361180491906135a2565b7f000000000000000000000000000000000000000000000000000000000000000061182f919061350e565b8461183a91906135a2565b90507f0000000000000000000000000000000000000000000000000000000000000000816118689190613571565b91505092915050565b60006402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff166118a291906136cc565b6fffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000836118e091906135a2565b6118ea9190613571565b9050919050565b6000603c8242611901919061350e565b61190b9190613571565b9050919050565b600080600080611921856116b3565b925061192e6003546117c9565b905061197a6402540be400600260009054906101000a90046fffffffffffffffffffffffffffffffff1661196291906136cc565b6fffffffffffffffffffffffffffffffff1682611181565b6fffffffffffffffffffffffffffffffff16915064e8d4a510006a52b7d2dcc80cd2e40000006119aa91906135a2565b82846119b691906135a2565b6119c09190613571565b9350505050919050565b60006119d6600061238d565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a4457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611c3457600080fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c82612cd3565b611c8a612cd3565b611c92612cd3565b6000806000806000611ca26119ca565b50611cab612a9c565b9750611cb68861175c565b15611ccc57600098505050505050505050611f14565b6000600a5481548110611ce257611ce1613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff16815250509550611d9e886124e4565b9450600185611dad919061362c565b9050611db8866126b2565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611de79190613571565b9150611df38483611181565b9250611e09600084611e03610e94565b84612632565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff1602179055505050611ecf87612c41565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611eff9190612fb9565b60405180910390a16001985050505050505050505b90565b6000806000611f25846124c5565b9150611f30846126b2565b9050611f3c82826117f0565b92505050919050565b60078054611f5290613442565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7e90613442565b8015611fcb5780601f10611fa057610100808354040283529160200191611fcb565b820191906000526020600020905b815481529060010190602001808311611fae57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461202f57600080fd5b6001600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061209c83611871565b905080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561212757600080fd5b61212f611c78565b5080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121bc919061350e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161229c9190612fb9565b60405180910390a3600191505092915050565b60008060006122bc611c78565b506122c684611871565b91506122d33386846126cf565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516123329190612fb9565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061239d6003546117c9565b9150600082036123b2576000925050506124c0565b600260009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000841180156123f457508184105b156123fd578391505b6124078183611181565b600260006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550603c8261244c91906135a2565b600354612459919061362c565b60038190555080826003547fa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755600260009054906101000a90046fffffffffffffffffffffffffffffffff166040516124b19190613773565b60405180910390a46001925050505b919050565b6000816020015168ffffffffffffffffff169050919050565b600a5481565b6000816000015163ffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612553919061350e565b61255d9190613571565b612567919061362c565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146125ec57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61263a612cd3565b612642612cd3565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508481604001906cffffffffffffffffffffffffff1690816cffffffffffffffffffffffffff168152505080915050949350505050565b600081604001516cffffffffffffffffffffffffff169050919050565b6000806126dc85846126f4565b506126e784846127fb565b5060019150509392505050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361275057600093505050506127f5565b612759866116b3565b92508483101561279e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612795906137da565b60405180910390fd5b84836127aa919061350e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361285757600093505050506128b9565b612860866116b3565b9250848361286e919061362c565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006128c9612cd3565b60006128d3610e94565b9050600060016000805490506128e9919061350e565b815481106128fa576128f9613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506129e4919061350e565b815481106129f5576129f4613709565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a8154816cffffffffffffffffffffffffff02191690836cffffffffffffffffffffffffff16021790555090505060019250505090565b612aa4612cd3565b612aac612cd3565b612ab4612cd3565b600080600a5481548110612acb57612aca613709565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a90046cffffffffffffffffffffffffff166cffffffffffffffffffffffffff166cffffffffffffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612be5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c099190613826565b6fffffffffffffffffffffffffffffffff169050612c26836124e4565b8111612c3757819350505050612c3e565b8293505050505b90565b6000806000612c4f84611f17565b9150600b54612c5d83611871565b612c67919061350e565b9050612c95600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826127fb565b506001600a6000828254612ca9919061362c565b9250508190555080600b6000828254612cc2919061362c565b925050819055508192505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff16815260200160006cffffffffffffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612d5881612d23565b8114612d6357600080fd5b50565b600081359050612d7581612d4f565b92915050565b600060208284031215612d9157612d90612d1e565b5b6000612d9f84828501612d66565b91505092915050565b60008115159050919050565b612dbd81612da8565b82525050565b6000602082019050612dd86000830184612db4565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e18578082015181840152602081019050612dfd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612e4082612dde565b612e4a8185612de9565b9350612e5a818560208601612dfa565b612e6381612e24565b840191505092915050565b60006020820190508181036000830152612e888184612e35565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ebb82612e90565b9050919050565b612ecb81612eb0565b8114612ed657600080fd5b50565b600081359050612ee881612ec2565b92915050565b6000819050919050565b612f0181612eee565b8114612f0c57600080fd5b50565b600081359050612f1e81612ef8565b92915050565b60008060408385031215612f3b57612f3a612d1e565b5b6000612f4985828601612ed9565b9250506020612f5a85828601612f0f565b9150509250929050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612f8981612f64565b82525050565b6000602082019050612fa46000830184612f80565b92915050565b612fb381612eee565b82525050565b6000602082019050612fce6000830184612faa565b92915050565b600080600060608486031215612fed57612fec612d1e565b5b6000612ffb86828701612ed9565b935050602061300c86828701612ed9565b925050604061301d86828701612f0f565b9150509250925092565b60006020828403121561303d5761303c612d1e565b5b600061304b84828501612ed9565b91505092915050565b6000806040838503121561306b5761306a612d1e565b5b600061307985828601612f0f565b925050602061308a85828601612f0f565b9150509250929050565b6000602082840312156130aa576130a9612d1e565b5b60006130b884828501612f0f565b91505092915050565b600063ffffffff82169050919050565b6130da816130c1565b82525050565b600068ffffffffffffffffff82169050919050565b6130fe816130e0565b82525050565b60006cffffffffffffffffffffffffff82169050919050565b61312681613104565b82525050565b600060608201905061314160008301866130d1565b61314e60208301856130f5565b61315b604083018461311d565b949350505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6131a082612e24565b810181811067ffffffffffffffff821117156131bf576131be613168565b5b80604052505050565b60006131d2612d14565b90506131de8282613197565b919050565b6131ec816130c1565b81146131f757600080fd5b50565b600081359050613209816131e3565b92915050565b613218816130e0565b811461322357600080fd5b50565b6000813590506132358161320f565b92915050565b61324481613104565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006060828403121561327d5761327c613163565b5b61328760606131c8565b90506000613297848285016131fa565b60008301525060206132ab84828501613226565b60208301525060406132bf84828501613252565b60408301525092915050565b6000606082840312156132e1576132e0612d1e565b5b60006132ef84828501613267565b91505092915050565b61330181612eb0565b82525050565b600060208201905061331c60008301846132f8565b92915050565b6000806000806080858703121561333c5761333b612d1e565b5b600061334a87828801612f0f565b945050602061335b87828801612f0f565b935050604061336c87828801612f0f565b925050606061337d87828801612f0f565b91505092959194509250565b613392816130c1565b82525050565b6133a1816130e0565b82525050565b6133b081613104565b82525050565b6060820160008201516133cc6000850182613389565b5060208201516133df6020850182613398565b5060408201516133f260408501826133a7565b50505050565b600060608201905061340d60008301846133b6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061345a57607f821691505b60208210810361346d5761346c613413565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006134a9600a83612de9565b91506134b482613473565b602082019050919050565b600060208201905081810360008301526134d88161349c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061351982612eee565b915061352483612eee565b925082820390508181111561353c5761353b6134df565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061357c82612eee565b915061358783612eee565b92508261359757613596613542565b5b828204905092915050565b60006135ad82612eee565b91506135b883612eee565b92508282026135c681612eee565b915082820484148315176135dd576135dc6134df565b5b5092915050565b60006135ef82612eee565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613621576136206134df565b5b600182019050919050565b600061363782612eee565b915061364283612eee565b925082820190508082111561365a576136596134df565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000613696600a83612de9565b91506136a182613660565b602082019050919050565b600060208201905081810360008301526136c581613689565b9050919050565b60006136d782612f64565b91506136e283612f64565b92508282026136f081612f64565b9150808214613702576137016134df565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061375d61375861375384612f64565b613738565b612eee565b9050919050565b61376d81613742565b82525050565b60006020820190506137886000830184613764565b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006137c4600d83612de9565b91506137cf8261378e565b602082019050919050565b600060208201905081810360008301526137f3816137b7565b9050919050565b61380381612f64565b811461380e57600080fd5b50565b600081519050613820816137fa565b92915050565b60006020828403121561383c5761383b612d1e565b5b600061384a84828501613811565b9150509291505056fea264697066735822122008caebcd04cc1bb42095504e6580d634464818fdc889058130c22a47ada837f064736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162004360380380620043608339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a60016200035064010000000002620016b0176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620016d6176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a0516135a562000dbb60003960008181610f15015281816114c50152611516015260008181610f4101528181611537015261157c01526135a56000f3fe608060405234801561001057600080fd5b506004361061024f576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161014d57806395d89b41116100d5578063d89135cd11610099578063d89135cd14610750578063e80952951461076e578063eda4e6d61461078c578063f2fde38b146107aa578063f83da35d146107da5761024f565b806395d89b4114610696578063983b2d56146106b4578063b470aade146106e4578063d340ef8a14610702578063d4792037146107205761024f565b806384dde4af1161011c57806384dde4af146105de5780638b8ff2d6146105fc5780638da5cb5b1461062c5780638f0b2d5d1461064a57806394c8a69a146106665761024f565b806370a082311461055457806373f425611461058457806374bedb95146105a257806379ba5097146105c05761024f565b8063313ce567116101db5780634abfbba21161019f5780634abfbba21461047657806351b4541c146104a657806358b2833b146104d65780636787a9be146104f45780636a2d094e146105245761024f565b8063313ce567146103aa57806340452d91146103c857806342966c68146103fa578063449a52f81461041657806347a50517146104465761024f565b806318160ddd1161022257806318160ddd146102f05780631989c6a81461030e578063229ba1971461032c5780633092afd51461034a578063313334871461037a5761024f565b806301ffc9a71461025457806306fdde031461028457806309f28f3c146102a257806310a10f37146102c0575b600080fd5b61026e60048036038101906102699190612c5b565b61080a565b60405161027b9190612ca3565b60405180910390f35b61028c6109b0565b6040516102999190612d4e565b60405180910390f35b6102aa610a3e565b6040516102b79190612d8c565b60405180910390f35b6102da60048036038101906102d59190612f45565b610a51565b6040516102e79190612f8b565b60405180910390f35b6102f8610a65565b6040516103059190612f8b565b60405180910390f35b610316610a7c565b6040516103239190612f8b565b60405180910390f35b610334610a88565b6040516103419190612d8c565b60405180910390f35b610364600480360381019061035f9190613004565b610a9b565b6040516103719190612ca3565b60405180910390f35b610394600480360381019061038f919061305d565b610b8e565b6040516103a19190612f8b565b60405180910390f35b6103b2610bfa565b6040516103bf9190612f8b565b60405180910390f35b6103e260048036038101906103dd919061309d565b610c00565b6040516103f1939291906130f7565b60405180910390f35b610414600480360381019061040f919061309d565b610c6c565b005b610430600480360381019061042b919061312e565b610d91565b60405161043d9190612ca3565b60405180910390f35b610460600480360381019061045b9190613004565b610ec8565b60405161046d9190612f8b565b60405180910390f35b610490600480360381019061048b919061309d565b610f11565b60405161049d9190612f8b565b60405180910390f35b6104c060048036038101906104bb919061309d565b610f71565b6040516104cd9190612f8b565b60405180910390f35b6104de610f92565b6040516104eb9190612f8b565b60405180910390f35b61050e6004803603810190610509919061309d565b610f98565b60405161051b9190612f8b565b60405180910390f35b61053e6004803603810190610539919061309d565b610fd9565b60405161054b9190612f8b565b60405180910390f35b61056e60048036038101906105699190613004565b610ffa565b60405161057b9190612f8b565b60405180910390f35b61058c611061565b6040516105999190612f8b565b60405180910390f35b6105aa611067565b6040516105b79190612f8b565b60405180910390f35b6105c861106d565b6040516105d59190612ca3565b60405180910390f35b6105e6611214565b6040516105f3919061317d565b60405180910390f35b61061660048036038101906106119190612f45565b61123a565b6040516106239190612f8b565b60405180910390f35b61063461124f565b604051610641919061317d565b60405180910390f35b610664600480360381019061065f9190613004565b611275565b005b610680600480360381019061067b9190612f45565b611313565b60405161068d9190612ca3565b60405180910390f35b61069e611378565b6040516106ab9190612d4e565b60405180910390f35b6106ce60048036038101906106c99190613004565b611406565b6040516106db9190612ca3565b60405180910390f35b6106ec6114c3565b6040516106f99190612f8b565b60405180910390f35b61070a6114e7565b6040516107179190612f8b565b60405180910390f35b61073a60048036038101906107359190612f45565b6114ed565b6040516107479190612f8b565b60405180910390f35b610758611506565b6040516107659190612f8b565b60405180910390f35b610776611510565b60405161078391906131c3565b60405180910390f35b61079461157a565b6040516107a19190612f8b565b60405180910390f35b6107c460048036038101906107bf9190613004565b61159e565b6040516107d19190612ca3565b60405180910390f35b6107f460048036038101906107ef91906131de565b611640565b60405161080191906132b4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361085e57600190506109ab565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108b057600190506109ab565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090257600190506109ab565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095457600190506109ab565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109a657600190506109ab565b600090505b919050565b600680546109bd906132fe565b80601f01602080910402602001604051908101604052809291908181526020018280546109e9906132fe565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b505050505081565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610a77919061335e565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610b2d57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600080610b9d866116b0565b9250610ba8856116b0565b9150610bc3600d60009054906101000a9004600f0b83611718565b9050610bce81611797565b9050610bda8382611718565b9050610be581611824565b67ffffffffffffffff16935050505092915050565b60085481565b60008181548110610c1057600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cc257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d0e57600080fd5b6000610d1982610f98565b9050610d253382611859565b5081600c6000828254610d389190613392565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610d859190612f8b565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613412565b60405180910390fd5b610e2983610f98565b90508260096000828254610e3d9190613392565b92505081905550610e4e8482611960565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610eac9190612f8b565b60405180910390a3610ebc611a24565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610f3f9190613432565b7f0000000000000000000000000000000000000000000000000000000000000000610f6a9190613392565b9050919050565b6000603c8242610f81919061335e565b610f8b91906134a3565b9050919050565b60035481565b600080610fbc600260009054906101000a9004600f0b610fb7856116b0565b611718565b9050610fc781611824565b67ffffffffffffffff16915050919050565b6000603c8242610fe9919061335e565b610ff391906134a3565b9050919050565b60008060008061101161100c86610ec8565b6116b0565b925061101e600354610f71565b905061103983600260009054906101000a9004600f0b611718565b915061105761104783611824565b67ffffffffffffffff1682610b8e565b9350505050919050565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ca57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112cf57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080826000015163ffffffff1611156113305760009050611373565b6000826020015168ffffffffffffffffff1611156113515760009050611373565b6000826040015164ffffffffff16111561136e5760009050611373565b600190505b919050565b60078054611385906132fe565b80601f01602080910402602001604051908101604052809291908181526020018280546113b1906132fe565b80156113fe5780601f106113d3576101008083540402835291602001916113fe565b820191906000526020600020905b8154815290600101906020018083116113e157829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461146257600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611561919061335e565b61156b91906134a3565b6115759190613392565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fa57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b611648612bbb565b611650612bbb565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156116c757600080fd5b6040829060020a029050919050565b60008082600f0b136116e757600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af61170384611bd9565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561178457506f7fffffffffffffffffffffffffffffff600f0b8113155b61178d57600080fd5b8091505092915050565b60006840000000000000000082600f0b126117b157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156117e5576000905061181f565b61181c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050611d9f565b90505b919050565b60008082600f0b121561183657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036118b5576000935050505061195a565b6118be86610ec8565b925084831015611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613520565b60405180910390fd5b848361190f919061335e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036119bc5760009350505050611a1e565b6119c586610ec8565b925084836119d39190613392565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000611a2e612bbb565b6000611a38610a65565b905060006001600080549050611a4e919061335e565b81548110611a5f57611a5e613540565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050611b31919061335e565b81548110611b4257611b41613540565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b13611bea57600080fd5b60008083600f0b9050680100000000000000008112611c25576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112611c53576020819060008212600003808260020a82851804189250505090506020820191505b620100008112611c7f576010819060008212600003808260020a82851804189250505090506010820191505b6101008112611caa576008819060008212600003808260020a82851804189250505090506008820191505b60108112611cd4576004819060008212600003808260020a82851804189250505090506004820191505b60048112611cfe576002819060008212600003808260020a82851804189250505090506002820191505b60028112611d0d576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315611d92578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050611d3a565b5081945050505050919050565b60006840000000000000000082600f0b12611db957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215611ded5760009050612bb6565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315611e3b57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315611e745760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315611ead5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315611ee657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315611f1f5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315611f58576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315611f9157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315611fca576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561200257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b131561203a5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612072576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156120aa5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156120e2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561211a57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156121525760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561218a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156121c15760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156121f8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561222f57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612266576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561229d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156122d45760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561230b576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156123425760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612378576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b13156123ae57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156123e45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561241a57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156124505760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315612486576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156124bc57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156124f2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561252757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b131561255c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315612591576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156125c65760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156125fb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561263057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156126655760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561269a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156126ce5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315612702576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561273657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561276a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561279e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156127d25760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315612806576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b131561283a5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561286d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156128a057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156128d35760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561290657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156129395760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561296c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561299f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156129d2576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315612a0457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315612a365760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315612a68576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315612a9a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315612acc576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315612afe57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315612b305760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315612b6257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115612bb157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bfe565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d2082612cbe565b612d2a8185612cc9565b9350612d3a818560208601612cda565b612d4381612d04565b840191505092915050565b60006020820190508181036000830152612d688184612d15565b905092915050565b600081600f0b9050919050565b612d8681612d70565b82525050565b6000602082019050612da16000830184612d7d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612de482612d04565b810181811067ffffffffffffffff82111715612e0357612e02612dac565b5b80604052505050565b6000612e16612bf4565b9050612e228282612ddb565b919050565b600063ffffffff82169050919050565b612e4081612e27565b8114612e4b57600080fd5b50565b600081359050612e5d81612e37565b92915050565b600068ffffffffffffffffff82169050919050565b612e8181612e63565b8114612e8c57600080fd5b50565b600081359050612e9e81612e78565b92915050565b600064ffffffffff82169050919050565b612ebe81612ea4565b8114612ec957600080fd5b50565b600081359050612edb81612eb5565b92915050565b600060608284031215612ef757612ef6612da7565b5b612f016060612e0c565b90506000612f1184828501612e4e565b6000830152506020612f2584828501612e8f565b6020830152506040612f3984828501612ecc565b60408301525092915050565b600060608284031215612f5b57612f5a612bfe565b5b6000612f6984828501612ee1565b91505092915050565b6000819050919050565b612f8581612f72565b82525050565b6000602082019050612fa06000830184612f7c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fd182612fa6565b9050919050565b612fe181612fc6565b8114612fec57600080fd5b50565b600081359050612ffe81612fd8565b92915050565b60006020828403121561301a57613019612bfe565b5b600061302884828501612fef565b91505092915050565b61303a81612f72565b811461304557600080fd5b50565b60008135905061305781613031565b92915050565b6000806040838503121561307457613073612bfe565b5b600061308285828601613048565b925050602061309385828601613048565b9150509250929050565b6000602082840312156130b3576130b2612bfe565b5b60006130c184828501613048565b91505092915050565b6130d381612e27565b82525050565b6130e281612e63565b82525050565b6130f181612ea4565b82525050565b600060608201905061310c60008301866130ca565b61311960208301856130d9565b61312660408301846130e8565b949350505050565b6000806040838503121561314557613144612bfe565b5b600061315385828601612fef565b925050602061316485828601613048565b9150509250929050565b61317781612fc6565b82525050565b6000602082019050613192600083018461316e565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6131bd81613198565b82525050565b60006020820190506131d860008301846131b4565b92915050565b600080600080608085870312156131f8576131f7612bfe565b5b600061320687828801613048565b945050602061321787828801613048565b935050604061322887828801613048565b925050606061323987828801613048565b91505092959194509250565b61324e81612e27565b82525050565b61325d81612e63565b82525050565b61326c81612ea4565b82525050565b6060820160008201516132886000850182613245565b50602082015161329b6020850182613254565b5060408201516132ae6040850182613263565b50505050565b60006060820190506132c96000830184613272565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061331657607f821691505b602082108103613329576133286132cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061336982612f72565b915061337483612f72565b925082820390508181111561338c5761338b61332f565b5b92915050565b600061339d82612f72565b91506133a883612f72565b92508282019050808211156133c0576133bf61332f565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006133fc600a83612cc9565b9150613407826133c6565b602082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b600061343d82612f72565b915061344883612f72565b925082820261345681612f72565b9150828204841483151761346d5761346c61332f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134ae82612f72565b91506134b983612f72565b9250826134c9576134c8613474565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061350a600d83612cc9565b9150613515826134d4565b602082019050919050565b60006020820190508181036000830152613539816134fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212204b75a1346dc9b6fd8022d4b7843ef48d6a1dcba4ee1022ef5799e0df78620e2364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 202030e..2d4394b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"uint128","name":"_taxLevelMinute","type":"uint128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_demurrageAmount","type":"uint256"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resolutionFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint104","name":"demurrage","type":"uint104"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/unittest/__init__.py b/python/erc20_demurrage_token/unittest/__init__.py index 9b5ed21..61f6a46 100644 --- a/python/erc20_demurrage_token/unittest/__init__.py +++ b/python/erc20_demurrage_token/unittest/__init__.py @@ -1 +1 @@ -from .base import * +from .newbase import * diff --git a/python/erc20_demurrage_token/unittest/newbase.py b/python/erc20_demurrage_token/unittest/newbase.py new file mode 100644 index 0000000..b18f42b --- /dev/null +++ b/python/erc20_demurrage_token/unittest/newbase.py @@ -0,0 +1,134 @@ +# standard imports +import logging +import os + +# external imports +from chainlib.eth.unittest.ethtester import EthTesterCase +from chainlib.eth.tx import ( + receipt, + ) +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.constant import ZERO_ADDRESS + +# local imports +from erc20_demurrage_token import ( + DemurrageTokenSettings, + DemurrageToken, + ) + +logg = logging.getLogger() + +#BLOCKTIME = 5 # seconds +TAX_LEVEL = int(10000 * 2) # 2% +# calc "1-(0.98)^(1/518400)" <- 518400 = 30 days of blocks +# 0.00000003897127107225 +#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month +PERIOD = 10 + + +class TestTokenDeploy: + + """tax level is ppm, 1000000 = 100%""" + def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12, tax_level=TAX_LEVEL, period=PERIOD): + self.tax_level = tax_level + self.period_seconds = period * 60 + + self.settings = DemurrageTokenSettings() + self.settings.name = token_name + self.settings.symbol = token_symbol + self.settings.decimals = 6 + self.settings.demurrage_level = tax_level ** (1 / period) + self.settings.period_minutes = period + self.settings.sink_address = sink_address + self.sink_address = self.settings.sink_address + logg.debug('using demurrage token settings: {}'.format(self.settings)) + + o = block_latest() + self.start_block = rpc.do(o) + + o = block_by_number(self.start_block, include_tx=False) + r = rpc.do(o) + + try: + self.start_time = int(r['timestamp'], 16) + except TypeError: + self.start_time = int(r['timestamp']) + + self.default_supply = supply + #self.default_supply_cap = int(self.default_supply * 10) + self.default_supply_cap = 0 + + + def deploy(self, rpc, deployer_address, interface, mode, supply_cap=0): + tx_hash = None + o = None + (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=0) + + r = rpc.do(o) + o = receipt(tx_hash) + r = rpc.do(o) + assert r['status'] == 1 + self.start_block = r['block_number'] + self.address = r['contract_address'] + + o = block_by_number(r['block_number']) + r = rpc.do(o) + self.start_time = r['timestamp'] + + return self.address + + +class TestDemurrage(EthTesterCase): + + def setUp(self): + super(TestDemurrage, self).setUp() + period = PERIOD + try: + period = getattr(self, 'period') + except AttributeError as e: + pass + self.deployer = TestTokenDeploy(self.rpc, period=period) + self.default_supply = self.deployer.default_supply + self.default_supply_cap = self.deployer.default_supply_cap + self.start_block = None + self.address = None + self.start_time = None + + + def deploy(self, interface): + self.address = self.deployer.deploy(self.rpc, self.accounts[0], interface, mode, supply_cap=self.default_supply_cap) + self.start_block = self.deployer.start_block + self.start_time = self.deployer.start_time + self.tax_level = self.deployer.tax_level + self.period_seconds = self.deployer.period_seconds + self.sink_address = self.deployer.sink_address + + logg.debug('contract address {} start block {} start time {}'.format(self.address, self.start_block, self.start_time)) + + + def assert_within_lower(self, v, target, tolerance_ppm): + lower_target = target - (target * (tolerance_ppm / 1000000)) + self.assertGreaterEqual(v, lower_target) + self.assertLessEqual(v, target) + logg.debug('asserted within lower {} <= {} <= {}'.format(lower_target, v, target)) + + + def tearDown(self): + pass + + +class TestDemurrageDefault(TestDemurrage): + + def setUp(self): + super(TestDemurrageDefault, self).setUp() + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + self.deploy(c) + + logg.info('deployed with mode {}'.format(self.mode)) diff --git a/python/requirements.txt b/python/requirements.txt index 59502b2..8cc5de0 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,3 +1,3 @@ -chainlib-eth>=0.1.0,<0.2.0 -eth-erc20~=0.3.0 +chainlib-eth~=0.4.11 +eth-erc20~=0.5.0 funga-eth~=0.6.0 diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 7983b5d..98bc5c8 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -138,96 +138,97 @@ contract DemurrageTokenSingleCap { } -// // Change sink address for redistribution -// function setSinkAddress(address _sinkAddress) public { -// require(msg.sender == owner); -// sinkAddress = _sinkAddress; -// } -// -// // Given address will be allowed to call the mintTo() function -// function addMinter(address _minter) public returns (bool) { -// require(msg.sender == owner); -// minter[_minter] = true; -// return true; -// } -// -// // Given address will no longer be allowed to call the mintTo() function -// function removeMinter(address _minter) public returns (bool) { -// require(msg.sender == owner || _minter == msg.sender); -// minter[_minter] = false; -// return true; -// } -// -// /// Implements ERC20 -// function balanceOf(address _account) public view returns (uint256) { -// uint256 baseBalance; -// uint256 currentDemurragedAmount; -// uint256 periodCount; -// -// baseBalance = baseBalanceOf(_account); -// -// periodCount = getMinutesDelta(demurrageTimestamp); -// -// currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); -// -// return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); -// } -// -// /// Balance unmodified by demurrage -// function baseBalanceOf(address _account) public view returns (uint256) { -// return account[_account]; -// } -// -// /// Increases base balance for a single account -// function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { -// uint256 oldBalance; -// uint256 newBalance; -// uint256 workAccount; -// -// workAccount = uint256(account[_account]); -// -// if (_delta == 0) { -// return false; -// } -// -// oldBalance = baseBalanceOf(_account); -// account[_account] = oldBalance + _delta; -// return true; -// } -// -// /// Decreases base balance for a single account -// function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { -// uint256 oldBalance; -// uint256 newBalance; -// uint256 workAccount; -// -// workAccount = uint256(account[_account]); -// -// if (_delta == 0) { -// return false; -// } -// -// oldBalance = baseBalanceOf(_account); -// require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard -// account[_account] = oldBalance - _delta; -// return true; -// } -// -// // Creates new tokens out of thin air, and allocates them to the given address -// // Triggers tax -// function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { -// uint256 baseAmount; -// -// require(minter[msg.sender], 'ERR_ACCESS'); -// -// changePeriod(); -// baseAmount = toBaseAmount(_amount); -// supply += _amount; -// increaseBaseBalance(_beneficiary, baseAmount); -// emit Mint(msg.sender, _beneficiary, _amount); -// saveRedistributionSupply(); -// return true; -// } + // Change sink address for redistribution + function setSinkAddress(address _sinkAddress) public { + require(msg.sender == owner); + sinkAddress = _sinkAddress; + } + + // Given address will be allowed to call the mintTo() function + function addMinter(address _minter) public returns (bool) { + require(msg.sender == owner); + minter[_minter] = true; + return true; + } + + // Given address will no longer be allowed to call the mintTo() function + function removeMinter(address _minter) public returns (bool) { + require(msg.sender == owner || _minter == msg.sender); + minter[_minter] = false; + return true; + } + + /// Implements ERC20 + function balanceOf(address _account) public view returns (uint256) { + int128 baseBalance; + int128 currentDemurragedAmount; + uint256 periodCount; + + baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account)); + + periodCount = getMinutesDelta(demurrageTimestamp); + + currentDemurragedAmount = ABDKMath64x64.mul(baseBalance, demurrageAmount); + return decayBy(ABDKMath64x64.toUInt(currentDemurragedAmount), periodCount); + + //return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); + } + + // Balance unmodified by demurrage + function baseBalanceOf(address _account) public view returns (uint256) { + return account[_account]; + } + + /// Increases base balance for a single account + function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { + uint256 oldBalance; + uint256 newBalance; + uint256 workAccount; + + workAccount = uint256(account[_account]); + + if (_delta == 0) { + return false; + } + + oldBalance = baseBalanceOf(_account); + account[_account] = oldBalance + _delta; + return true; + } + + /// Decreases base balance for a single account + function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { + uint256 oldBalance; + uint256 newBalance; + uint256 workAccount; + + workAccount = uint256(account[_account]); + + if (_delta == 0) { + return false; + } + + oldBalance = baseBalanceOf(_account); + require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard + account[_account] = oldBalance - _delta; + return true; + } + + // Creates new tokens out of thin air, and allocates them to the given address + // Triggers tax + function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { + uint256 baseAmount; + + require(minter[msg.sender], 'ERR_ACCESS'); + + //changePeriod(); + baseAmount = toBaseAmount(_amount); + supply += _amount; + increaseBaseBalance(_beneficiary, baseAmount); + emit Mint(msg.sender, _beneficiary, _amount); + saveRedistributionSupply(); + return true; + } // Deserializes the redistribution word function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { @@ -239,46 +240,46 @@ contract DemurrageTokenSingleCap { return redistribution; } -// -// // Serializes the demurrage period part of the redistribution word -// function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { -// return uint256(_redistribution.period); -// } -// -// // Serializes the supply part of the redistribution word -// function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { -// return uint256(_redistribution.value); -// } -// -// // Serializes the number of participants part of the redistribution word -// function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { -// return uint256(_redistribution.demurrage); -// } -// -// -// // Client accessor to the redistributions array length -// function redistributionCount() public view returns (uint256) { -// return redistributions.length; -// } -// -// // Save the current total supply amount to the current redistribution period -// function saveRedistributionSupply() private returns (bool) { -// redistributionItem memory currentRedistribution; -// uint256 grownSupply; -// -// grownSupply = totalSupply(); -// currentRedistribution = redistributions[redistributions.length-1]; -// currentRedistribution.value = uint72(grownSupply); -// -// redistributions[redistributions.length-1] = currentRedistribution; -// return true; -// } -// -// // Get the demurrage period of the current block number -// function actualPeriod() public view returns (uint128) { -// return uint128((block.timestamp - periodStart) / periodDuration + 1); -// } -// + + // Serializes the demurrage period part of the redistribution word + function toRedistributionPeriod(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.period); + } + + // Serializes the supply part of the redistribution word + function toRedistributionSupply(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.value); + } + + // Serializes the number of participants part of the redistribution word + function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { + return uint256(_redistribution.demurrage); + } + + + // Client accessor to the redistributions array length + function redistributionCount() public view returns (uint256) { + return redistributions.length; + } + + // Save the current total supply amount to the current redistribution period + function saveRedistributionSupply() private returns (bool) { + redistributionItem memory currentRedistribution; + uint256 grownSupply; + + grownSupply = totalSupply(); + currentRedistribution = redistributions[redistributions.length-1]; + currentRedistribution.value = uint72(grownSupply); + + redistributions[redistributions.length-1] = currentRedistribution; + return true; + } + + // Get the demurrage period of the current block number + function actualPeriod() public view returns (uint128) { + return uint128((block.timestamp - periodStart) / periodDuration + 1); + } + // // Retrieve next redistribution if the period threshold has been crossed // function checkPeriod() private view returns (redistributionItem memory) { // redistributionItem memory lastRedistribution; @@ -292,14 +293,14 @@ contract DemurrageTokenSingleCap { // } // return lastRedistribution; // } -// + // function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { // uint256 difference; // // difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); // return difference / resolutionFactor; // } -// + // function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { // uint256 redistributionSupply; // uint256 redistributionDemurrage; @@ -321,12 +322,12 @@ contract DemurrageTokenSingleCap { // totalSink += baseUnit; // return unit; // } -// -// // Calculate the time delta in whole minutes passed between given timestamp and current timestamp -// function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { -// return (block.timestamp - _lastTimestamp) / 60; -// } -// + + // Calculate the time delta in whole minutes passed between given timestamp and current timestamp + function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { + return (block.timestamp - _lastTimestamp) / 60; + } + // // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call // function applyDemurrage() public returns (bool) { // return applyDemurrageLimited(0); @@ -354,30 +355,30 @@ contract DemurrageTokenSingleCap { // emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); // return true; // } -// -// // Return timestamp of start of period threshold -// function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { -// return periodStart + (_periodCount * periodDuration); -// } -// -// // Amount of demurrage cycles inbetween the current timestamp and the given target time -// function demurrageCycles(uint256 _target) public view returns (uint256) { -// return (block.timestamp - _target) / 60; -// } -// -// function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { -// if (_redistribution.period > 0) { -// return false; -// } -// if (_redistribution.value > 0) { -// return false; -// } -// if (_redistribution.demurrage > 0) { -// return false; -// } -// return true; -// } -// + + // Return timestamp of start of period threshold + function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { + return periodStart + (_periodCount * periodDuration); + } + + // Amount of demurrage cycles inbetween the current timestamp and the given target time + function demurrageCycles(uint256 _target) public view returns (uint256) { + return (block.timestamp - _target) / 60; + } + + function isEmptyRedistribution(redistributionItem memory _redistribution) public pure returns(bool) { + if (_redistribution.period > 0) { + return false; + } + if (_redistribution.value > 0) { + return false; + } + if (_redistribution.demurrage > 0) { + return false; + } + return true; + } + // // Recalculate the demurrage modifier for the new period // // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. // function changePeriod() public returns (bool) { @@ -425,21 +426,8 @@ contract DemurrageTokenSingleCap { //// } //// return (valueFactor * _value) / growthResolutionFactor; //// } -// -// // Calculate a value reduced by demurrage by the given period -// function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { -// uint256 valueFactor; -// uint256 truncatedTaxLevel; -// -// valueFactor = growthResolutionFactor; -// truncatedTaxLevel = taxLevel / nanoDivider; -// -// for (uint256 i = 0; i < _period; i++) { -// valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); -// } -// return (valueFactor * _value) / growthResolutionFactor; -// } + // Calculate a value reduced by demurrage by the given period function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { int128 valuePoint; int128 periodPoint; @@ -456,11 +444,14 @@ contract DemurrageTokenSingleCap { return ABDKMath64x64.toUInt(v); } -// -// // Inflates the given amount according to the current demurrage modifier -// function toBaseAmount(uint256 _value) public view returns (uint256) { -// return (_value * resolutionFactor) / (demurrageAmount * 10000000000); -// } + + // Inflates the given amount according to the current demurrage modifier + function toBaseAmount(uint256 _value) public view returns (uint256) { + int128 r; + //return (_value * resolutionFactor) / (demurrageAmount * 10000000000); + r = ABDKMath64x64.mul(demurrageAmount, ABDKMath64x64.fromUInt(_value)); + return ABDKMath64x64.toUInt(r); + } // // // Implements ERC20, triggers tax and/or redistribution // function approve(address _spender, uint256 _value) public returns (bool) { @@ -544,46 +535,46 @@ contract DemurrageTokenSingleCap { // // return true; // } -// -// // Implements EIP173 -// function transferOwnership(address _newOwner) public returns (bool) { -// require(msg.sender == owner); -// newOwner = _newOwner; -// } -// -// // Implements OwnedAccepter -// function acceptOwnership() public returns (bool) { -// address oldOwner; -// -// require(msg.sender == newOwner); -// oldOwner = owner; -// owner = newOwner; -// newOwner = address(0); -// emit OwnershipTransferred(oldOwner, owner); -// } -// -// // Explicitly and irretrievably burn tokens -// // Only token minters can burn tokens -// function burn(uint256 _value) public { -// require(minter[msg.sender]); -// require(_value <= account[msg.sender]); -// uint256 _delta = toBaseAmount(_value); -// -// applyDemurrage(); -// decreaseBaseBalance(msg.sender, _delta); -// burned += _value; -// emit Burn(msg.sender, _value); -// } -// -// // Implements ERC20 -// function totalSupply() public view returns (uint256) { -// return supply - burned; -// } -// -// // Return total number of burned tokens -// function totalBurned() public view returns (uint256) { -// return burned; -// } + + // Implements EIP173 + function transferOwnership(address _newOwner) public returns (bool) { + require(msg.sender == owner); + newOwner = _newOwner; + } + + // Implements OwnedAccepter + function acceptOwnership() public returns (bool) { + address oldOwner; + + require(msg.sender == newOwner); + oldOwner = owner; + owner = newOwner; + newOwner = address(0); + emit OwnershipTransferred(oldOwner, owner); + } + + // Explicitly and irretrievably burn tokens + // Only token minters can burn tokens + function burn(uint256 _value) public { + require(minter[msg.sender]); + require(_value <= account[msg.sender]); + uint256 _delta = toBaseAmount(_value); + + //applyDemurrage(); + decreaseBaseBalance(msg.sender, _delta); + burned += _value; + emit Burn(msg.sender, _value); + } + + // Implements ERC20 + function totalSupply() public view returns (uint256) { + return supply - burned; + } + + // Return total number of burned tokens + function totalBurned() public view returns (uint256) { + return burned; + } // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { From f785925eb5950076da2fd4821d1d1c1b96cfc156 Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 9 Feb 2023 11:44:20 +0000 Subject: [PATCH 15/57] WIP rehabilitating test basic --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 10 ++- .../erc20_demurrage_token/unittest/newbase.py | 24 ++++--- python/tests/test_basic.py | 51 +++++--------- solidity/DemurrageTokenSingleNocap.sol | 69 ++++++++++--------- 6 files changed, 81 insertions(+), 77 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index dc1b1ca..f63a845 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162004360380380620043608339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a60016200035064010000000002620016b0176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620016d6176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a0516135a562000dbb60003960008181610f15015281816114c50152611516015260008181610f4101528181611537015261157c01526135a56000f3fe608060405234801561001057600080fd5b506004361061024f576000357c01000000000000000000000000000000000000000000000000000000009004806370a082311161014d57806395d89b41116100d5578063d89135cd11610099578063d89135cd14610750578063e80952951461076e578063eda4e6d61461078c578063f2fde38b146107aa578063f83da35d146107da5761024f565b806395d89b4114610696578063983b2d56146106b4578063b470aade146106e4578063d340ef8a14610702578063d4792037146107205761024f565b806384dde4af1161011c57806384dde4af146105de5780638b8ff2d6146105fc5780638da5cb5b1461062c5780638f0b2d5d1461064a57806394c8a69a146106665761024f565b806370a082311461055457806373f425611461058457806374bedb95146105a257806379ba5097146105c05761024f565b8063313ce567116101db5780634abfbba21161019f5780634abfbba21461047657806351b4541c146104a657806358b2833b146104d65780636787a9be146104f45780636a2d094e146105245761024f565b8063313ce567146103aa57806340452d91146103c857806342966c68146103fa578063449a52f81461041657806347a50517146104465761024f565b806318160ddd1161022257806318160ddd146102f05780631989c6a81461030e578063229ba1971461032c5780633092afd51461034a578063313334871461037a5761024f565b806301ffc9a71461025457806306fdde031461028457806309f28f3c146102a257806310a10f37146102c0575b600080fd5b61026e60048036038101906102699190612c5b565b61080a565b60405161027b9190612ca3565b60405180910390f35b61028c6109b0565b6040516102999190612d4e565b60405180910390f35b6102aa610a3e565b6040516102b79190612d8c565b60405180910390f35b6102da60048036038101906102d59190612f45565b610a51565b6040516102e79190612f8b565b60405180910390f35b6102f8610a65565b6040516103059190612f8b565b60405180910390f35b610316610a7c565b6040516103239190612f8b565b60405180910390f35b610334610a88565b6040516103419190612d8c565b60405180910390f35b610364600480360381019061035f9190613004565b610a9b565b6040516103719190612ca3565b60405180910390f35b610394600480360381019061038f919061305d565b610b8e565b6040516103a19190612f8b565b60405180910390f35b6103b2610bfa565b6040516103bf9190612f8b565b60405180910390f35b6103e260048036038101906103dd919061309d565b610c00565b6040516103f1939291906130f7565b60405180910390f35b610414600480360381019061040f919061309d565b610c6c565b005b610430600480360381019061042b919061312e565b610d91565b60405161043d9190612ca3565b60405180910390f35b610460600480360381019061045b9190613004565b610ec8565b60405161046d9190612f8b565b60405180910390f35b610490600480360381019061048b919061309d565b610f11565b60405161049d9190612f8b565b60405180910390f35b6104c060048036038101906104bb919061309d565b610f71565b6040516104cd9190612f8b565b60405180910390f35b6104de610f92565b6040516104eb9190612f8b565b60405180910390f35b61050e6004803603810190610509919061309d565b610f98565b60405161051b9190612f8b565b60405180910390f35b61053e6004803603810190610539919061309d565b610fd9565b60405161054b9190612f8b565b60405180910390f35b61056e60048036038101906105699190613004565b610ffa565b60405161057b9190612f8b565b60405180910390f35b61058c611061565b6040516105999190612f8b565b60405180910390f35b6105aa611067565b6040516105b79190612f8b565b60405180910390f35b6105c861106d565b6040516105d59190612ca3565b60405180910390f35b6105e6611214565b6040516105f3919061317d565b60405180910390f35b61061660048036038101906106119190612f45565b61123a565b6040516106239190612f8b565b60405180910390f35b61063461124f565b604051610641919061317d565b60405180910390f35b610664600480360381019061065f9190613004565b611275565b005b610680600480360381019061067b9190612f45565b611313565b60405161068d9190612ca3565b60405180910390f35b61069e611378565b6040516106ab9190612d4e565b60405180910390f35b6106ce60048036038101906106c99190613004565b611406565b6040516106db9190612ca3565b60405180910390f35b6106ec6114c3565b6040516106f99190612f8b565b60405180910390f35b61070a6114e7565b6040516107179190612f8b565b60405180910390f35b61073a60048036038101906107359190612f45565b6114ed565b6040516107479190612f8b565b60405180910390f35b610758611506565b6040516107659190612f8b565b60405180910390f35b610776611510565b60405161078391906131c3565b60405180910390f35b61079461157a565b6040516107a19190612f8b565b60405180910390f35b6107c460048036038101906107bf9190613004565b61159e565b6040516107d19190612ca3565b60405180910390f35b6107f460048036038101906107ef91906131de565b611640565b60405161080191906132b4565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361085e57600190506109ab565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108b057600190506109ab565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361090257600190506109ab565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361095457600190506109ab565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109a657600190506109ab565b600090505b919050565b600680546109bd906132fe565b80601f01602080910402602001604051908101604052809291908181526020018280546109e9906132fe565b8015610a365780601f10610a0b57610100808354040283529160200191610a36565b820191906000526020600020905b815481529060010190602001808311610a1957829003601f168201915b505050505081565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610a77919061335e565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b2457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610b2d57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600080610b9d866116b0565b9250610ba8856116b0565b9150610bc3600d60009054906101000a9004600f0b83611718565b9050610bce81611797565b9050610bda8382611718565b9050610be581611824565b67ffffffffffffffff16935050505092915050565b60085481565b60008181548110610c1057600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610cc257600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d0e57600080fd5b6000610d1982610f98565b9050610d253382611859565b5081600c6000828254610d389190613392565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610d859190612f8b565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1790613412565b60405180910390fd5b610e2983610f98565b90508260096000828254610e3d9190613392565b92505081905550610e4e8482611960565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610eac9190612f8b565b60405180910390a3610ebc611a24565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610f3f9190613432565b7f0000000000000000000000000000000000000000000000000000000000000000610f6a9190613392565b9050919050565b6000603c8242610f81919061335e565b610f8b91906134a3565b9050919050565b60035481565b600080610fbc600260009054906101000a9004600f0b610fb7856116b0565b611718565b9050610fc781611824565b67ffffffffffffffff16915050919050565b6000603c8242610fe9919061335e565b610ff391906134a3565b9050919050565b60008060008061101161100c86610ec8565b6116b0565b925061101e600354610f71565b905061103983600260009054906101000a9004600f0b611718565b915061105761104783611824565b67ffffffffffffffff1682610b8e565b9350505050919050565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110ca57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112cf57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080826000015163ffffffff1611156113305760009050611373565b6000826020015168ffffffffffffffffff1611156113515760009050611373565b6000826040015164ffffffffff16111561136e5760009050611373565b600190505b919050565b60078054611385906132fe565b80601f01602080910402602001604051908101604052809291908181526020018280546113b1906132fe565b80156113fe5780601f106113d3576101008083540402835291602001916113fe565b820191906000526020600020905b8154815290600101906020018083116113e157829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461146257600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611561919061335e565b61156b91906134a3565b6115759190613392565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fa57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b611648612bbb565b611650612bbb565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156116c757600080fd5b6040829060020a029050919050565b60008082600f0b136116e757600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af61170384611bd9565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561178457506f7fffffffffffffffffffffffffffffff600f0b8113155b61178d57600080fd5b8091505092915050565b60006840000000000000000082600f0b126117b157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156117e5576000905061181f565b61181c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050611d9f565b90505b919050565b60008082600f0b121561183657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036118b5576000935050505061195a565b6118be86610ec8565b925084831015611903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118fa90613520565b60405180910390fd5b848361190f919061335e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036119bc5760009350505050611a1e565b6119c586610ec8565b925084836119d39190613392565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000611a2e612bbb565b6000611a38610a65565b905060006001600080549050611a4e919061335e565b81548110611a5f57611a5e613540565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050611b31919061335e565b81548110611b4257611b41613540565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b13611bea57600080fd5b60008083600f0b9050680100000000000000008112611c25576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112611c53576020819060008212600003808260020a82851804189250505090506020820191505b620100008112611c7f576010819060008212600003808260020a82851804189250505090506010820191505b6101008112611caa576008819060008212600003808260020a82851804189250505090506008820191505b60108112611cd4576004819060008212600003808260020a82851804189250505090506004820191505b60048112611cfe576002819060008212600003808260020a82851804189250505090506002820191505b60028112611d0d576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315611d92578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050611d3a565b5081945050505050919050565b60006840000000000000000082600f0b12611db957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215611ded5760009050612bb6565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315611e3b57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315611e745760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315611ead5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315611ee657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315611f1f5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315611f58576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315611f9157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315611fca576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561200257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b131561203a5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612072576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156120aa5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156120e2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561211a57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156121525760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561218a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156121c15760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156121f8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561222f57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612266576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561229d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156122d45760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b131561230b576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156123425760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612378576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b13156123ae57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156123e45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561241a57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156124505760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315612486576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156124bc57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156124f2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561252757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b131561255c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315612591576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156125c65760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156125fb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561263057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156126655760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561269a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156126ce5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315612702576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561273657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561276a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561279e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156127d25760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315612806576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b131561283a5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561286d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156128a057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156128d35760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561290657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156129395760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561296c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561299f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156129d2576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315612a0457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315612a365760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315612a68576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315612a9a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315612acc576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315612afe57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315612b305760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315612b6257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115612bb157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c3881612c03565b8114612c4357600080fd5b50565b600081359050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612bfe565b5b6000612c7f84828501612c46565b91505092915050565b60008115159050919050565b612c9d81612c88565b82525050565b6000602082019050612cb86000830184612c94565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cf8578082015181840152602081019050612cdd565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d2082612cbe565b612d2a8185612cc9565b9350612d3a818560208601612cda565b612d4381612d04565b840191505092915050565b60006020820190508181036000830152612d688184612d15565b905092915050565b600081600f0b9050919050565b612d8681612d70565b82525050565b6000602082019050612da16000830184612d7d565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612de482612d04565b810181811067ffffffffffffffff82111715612e0357612e02612dac565b5b80604052505050565b6000612e16612bf4565b9050612e228282612ddb565b919050565b600063ffffffff82169050919050565b612e4081612e27565b8114612e4b57600080fd5b50565b600081359050612e5d81612e37565b92915050565b600068ffffffffffffffffff82169050919050565b612e8181612e63565b8114612e8c57600080fd5b50565b600081359050612e9e81612e78565b92915050565b600064ffffffffff82169050919050565b612ebe81612ea4565b8114612ec957600080fd5b50565b600081359050612edb81612eb5565b92915050565b600060608284031215612ef757612ef6612da7565b5b612f016060612e0c565b90506000612f1184828501612e4e565b6000830152506020612f2584828501612e8f565b6020830152506040612f3984828501612ecc565b60408301525092915050565b600060608284031215612f5b57612f5a612bfe565b5b6000612f6984828501612ee1565b91505092915050565b6000819050919050565b612f8581612f72565b82525050565b6000602082019050612fa06000830184612f7c565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612fd182612fa6565b9050919050565b612fe181612fc6565b8114612fec57600080fd5b50565b600081359050612ffe81612fd8565b92915050565b60006020828403121561301a57613019612bfe565b5b600061302884828501612fef565b91505092915050565b61303a81612f72565b811461304557600080fd5b50565b60008135905061305781613031565b92915050565b6000806040838503121561307457613073612bfe565b5b600061308285828601613048565b925050602061309385828601613048565b9150509250929050565b6000602082840312156130b3576130b2612bfe565b5b60006130c184828501613048565b91505092915050565b6130d381612e27565b82525050565b6130e281612e63565b82525050565b6130f181612ea4565b82525050565b600060608201905061310c60008301866130ca565b61311960208301856130d9565b61312660408301846130e8565b949350505050565b6000806040838503121561314557613144612bfe565b5b600061315385828601612fef565b925050602061316485828601613048565b9150509250929050565b61317781612fc6565b82525050565b6000602082019050613192600083018461316e565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6131bd81613198565b82525050565b60006020820190506131d860008301846131b4565b92915050565b600080600080608085870312156131f8576131f7612bfe565b5b600061320687828801613048565b945050602061321787828801613048565b935050604061322887828801613048565b925050606061323987828801613048565b91505092959194509250565b61324e81612e27565b82525050565b61325d81612e63565b82525050565b61326c81612ea4565b82525050565b6060820160008201516132886000850182613245565b50602082015161329b6020850182613254565b5060408201516132ae6040850182613263565b50505050565b60006060820190506132c96000830184613272565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061331657607f821691505b602082108103613329576133286132cf565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061336982612f72565b915061337483612f72565b925082820390508181111561338c5761338b61332f565b5b92915050565b600061339d82612f72565b91506133a883612f72565b92508282019050808211156133c0576133bf61332f565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006133fc600a83612cc9565b9150613407826133c6565b602082019050919050565b6000602082019050818103600083015261342b816133ef565b9050919050565b600061343d82612f72565b915061344883612f72565b925082820261345681612f72565b9150828204841483151761346d5761346c61332f565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134ae82612f72565b91506134b983612f72565b9250826134c9576134c8613474565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061350a600d83612cc9565b9150613515826134d4565b602082019050919050565b60006020820190508181036000830152613539816134fd565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212204b75a1346dc9b6fd8022d4b7843ef48d6a1dcba4ee1022ef5799e0df78620e2364736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162004551380380620045518339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a60016200035064010000000002620018a1176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620018c7176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a05161379662000dbb60003960008181610f96015281816115620152611707015260008181610fc201528181611728015261176d01526137966000f3fe608060405234801561001057600080fd5b5060043610610270576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016357806395d89b41116100e0578063d4792037116100a4578063d479203714610799578063d89135cd146107c9578063e8095295146107e7578063eda4e6d614610805578063f2fde38b14610823578063f83da35d1461085357610270565b806395d89b41146106df578063983b2d56146106fd578063b470aade1461072d578063c0ab70771461074b578063d340ef8a1461077b57610270565b80638b8ff2d6116101275780638b8ff2d61461063b5780638da5cb5b1461066b5780638f0b2d5d146106895780638f1df6bc146106a557806394c8a69a146106af57610270565b8063731f237c146105a557806373f42561146105c357806374bedb95146105e157806379ba5097146105ff57806384dde4af1461061d57610270565b806340452d91116101f157806351b4541c116101b557806351b4541c146104c757806358b2833b146104f75780636787a9be146105155780636a2d094e1461054557806370a082311461057557610270565b806340452d91146103e957806342966c681461041b578063449a52f81461043757806347a50517146104675780634abfbba21461049757610270565b80631989c6a8116102385780631989c6a81461032f578063229ba1971461034d5780633092afd51461036b578063313334871461039b578063313ce567146103cb57610270565b806301ffc9a71461027557806306fdde03146102a557806309f28f3c146102c357806310a10f37146102e157806318160ddd14610311575b600080fd5b61028f600480360381019061028a9190612e4c565b610883565b60405161029c9190612e94565b60405180910390f35b6102ad610a29565b6040516102ba9190612f3f565b60405180910390f35b6102cb610ab7565b6040516102d89190612f7d565b60405180910390f35b6102fb60048036038101906102f69190613136565b610aca565b604051610308919061317c565b60405180910390f35b610319610ade565b604051610326919061317c565b60405180910390f35b610337610af5565b604051610344919061317c565b60405180910390f35b610355610b01565b6040516103629190612f7d565b60405180910390f35b610385600480360381019061038091906131f5565b610b14565b6040516103929190612e94565b60405180910390f35b6103b560048036038101906103b0919061324e565b610c07565b6040516103c2919061317c565b60405180910390f35b6103d3610c73565b6040516103e0919061317c565b60405180910390f35b61040360048036038101906103fe919061328e565b610c79565b604051610412939291906132e8565b60405180910390f35b6104356004803603810190610430919061328e565b610ce5565b005b610451600480360381019061044c919061331f565b610e0a565b60405161045e9190612e94565b60405180910390f35b610481600480360381019061047c91906131f5565b610f49565b60405161048e919061317c565b60405180910390f35b6104b160048036038101906104ac919061328e565b610f92565b6040516104be919061317c565b60405180910390f35b6104e160048036038101906104dc919061328e565b610ff2565b6040516104ee919061317c565b60405180910390f35b6104ff611013565b60405161050c919061317c565b60405180910390f35b61052f600480360381019061052a919061328e565b611019565b60405161053c919061317c565b60405180910390f35b61055f600480360381019061055a919061328e565b61105a565b60405161056c919061317c565b60405180910390f35b61058f600480360381019061058a91906131f5565b61107b565b60405161059c919061317c565b60405180910390f35b6105ad6110e2565b6040516105ba919061317c565b60405180910390f35b6105cb6110f3565b6040516105d8919061317c565b60405180910390f35b6105e96110f9565b6040516105f6919061317c565b60405180910390f35b6106076110ff565b6040516106149190612e94565b60405180910390f35b6106256112a6565b604051610632919061336e565b60405180910390f35b61065560048036038101906106509190613136565b6112cc565b604051610662919061317c565b60405180910390f35b6106736112e1565b604051610680919061336e565b60405180910390f35b6106a3600480360381019061069e91906131f5565b611307565b005b6106ad6113a5565b005b6106c960048036038101906106c49190613136565b6113b0565b6040516106d69190612e94565b60405180910390f35b6106e7611415565b6040516106f49190612f3f565b60405180910390f35b610717600480360381019061071291906131f5565b6114a3565b6040516107249190612e94565b60405180910390f35b610735611560565b604051610742919061317c565b60405180910390f35b6107656004803603810190610760919061328e565b611584565b604051610772919061317c565b60405180910390f35b6107836116d8565b604051610790919061317c565b60405180910390f35b6107b360048036038101906107ae9190613136565b6116de565b6040516107c0919061317c565b60405180910390f35b6107d16116f7565b6040516107de919061317c565b60405180910390f35b6107ef611701565b6040516107fc91906133b4565b60405180910390f35b61080d61176b565b60405161081a919061317c565b60405180910390f35b61083d600480360381019061083891906131f5565b61178f565b60405161084a9190612e94565b60405180910390f35b61086d600480360381019061086891906133cf565b611831565b60405161087a91906134a5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d75760019050610a24565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109295760019050610a24565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361097b5760019050610a24565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109cd5760019050610a24565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a1f5760019050610a24565b600090505b919050565b60068054610a36906134ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610a62906134ef565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b505050505081565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610af0919061354f565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ba657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600080610c16866118a1565b9250610c21856118a1565b9150610c3c600d60009054906101000a9004600f0b83611909565b9050610c4781611988565b9050610c538382611909565b9050610c5e81611a15565b67ffffffffffffffff16935050505092915050565b60085481565b60008181548110610c8957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d3b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d8757600080fd5b6000610d9282611019565b9050610d9e3382611a4a565b5081600c6000828254610db19190613583565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610dfe919061317c565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090613603565b60405180910390fd5b610ea16113a5565b610eaa83611019565b90508260096000828254610ebe9190613583565b92505081905550610ecf8482611b51565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f2d919061317c565b60405180910390a3610f3d611c15565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610fc09190613623565b7f0000000000000000000000000000000000000000000000000000000000000000610feb9190613583565b9050919050565b6000603c8242611002919061354f565b61100c9190613694565b9050919050565b60035481565b60008061103d600260009054906101000a9004600f0b611038856118a1565b611909565b905061104881611a15565b67ffffffffffffffff16915050919050565b6000603c824261106a919061354f565b6110749190613694565b9050919050565b60008060008061109261108d86610f49565b6118a1565b925061109f600354610ff2565b90506110ba83600260009054906101000a9004600f0b611909565b91506110d86110c883611a15565b67ffffffffffffffff1682610c07565b9350505050919050565b60006110ee6000611584565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461115c57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113ad6110e2565b50565b600080826000015163ffffffff1611156113cd5760009050611410565b6000826020015168ffffffffffffffffff1611156113ee5760009050611410565b6000826040015164ffffffffff16111561140b5760009050611410565b600190505b919050565b60078054611422906134ef565b80601f016020809104026020016040519081016040528092919081815260200182805461144e906134ef565b801561149b5780601f106114705761010080835404028352916020019161149b565b820191906000526020600020905b81548152906001019060200180831161147e57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ff57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611597600354610ff2565b9250600083036115ae5760009450505050506116d3565b600260009054906101000a9004600f0b90506000861180156115cf57508286105b156115d8578592505b6115e1836118a1565b91506115fc600d60009054906101000a9004600f0b83611909565b935061160784611988565b9350611622600260009054906101000a9004600f0b85611909565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361166a9190613623565b6003546116779190613583565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516116c39190612f7d565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611752919061354f565b61175c9190613694565b6117669190613583565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b611839612dac565b611841612dac565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156118b857600080fd5b6040829060020a029050919050565b60008082600f0b136118d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6118f484611dca565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561197557506f7fffffffffffffffffffffffffffffff600f0b8113155b61197e57600080fd5b8091505092915050565b60006840000000000000000082600f0b126119a257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156119d65760009050611a10565b611a0d6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050611f90565b90505b919050565b60008082600f0b1215611a2757600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611aa65760009350505050611b4b565b611aaf86610f49565b925084831015611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90613711565b60405180910390fd5b8483611b00919061354f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611bad5760009350505050611c0f565b611bb686610f49565b92508483611bc49190613583565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000611c1f612dac565b6000611c29610ade565b905060006001600080549050611c3f919061354f565b81548110611c5057611c4f613731565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050611d22919061354f565b81548110611d3357611d32613731565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b13611ddb57600080fd5b60008083600f0b9050680100000000000000008112611e16576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112611e44576020819060008212600003808260020a82851804189250505090506020820191505b620100008112611e70576010819060008212600003808260020a82851804189250505090506010820191505b6101008112611e9b576008819060008212600003808260020a82851804189250505090506008820191505b60108112611ec5576004819060008212600003808260020a82851804189250505090506004820191505b60048112611eef576002819060008212600003808260020a82851804189250505090506002820191505b60028112611efe576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315611f83578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050611f2b565b5081945050505050919050565b60006840000000000000000082600f0b12611faa57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215611fde5760009050612da7565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561202c57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156120655760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561209e5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156120d757608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156121105760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612149576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561218257608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156121bb576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156121f357608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b131561222b5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612263576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561229b5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156122d3576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561230b57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156123435760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561237b57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156123b25760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156123e9576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561242057608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612457576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561248e57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156124c55760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156124fc576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156125335760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612569576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561259f57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156125d55760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561260b57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156126415760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315612677576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156126ad57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156126e3576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561271857608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b131561274d5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315612782576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156127b75760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156127ec576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561282157608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156128565760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561288b57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156128bf5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156128f3576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561292757608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561295b576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561298f57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156129c35760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156129f7576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315612a2b5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315612a5e576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315612a9157608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315612ac45760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315612af757608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315612b2a5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315612b5d576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315612b9057608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315612bc3576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315612bf557608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315612c275760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315612c59576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315612c8b5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315612cbd576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315612cef57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315612d215760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315612d5357608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115612da257600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2981612df4565b8114612e3457600080fd5b50565b600081359050612e4681612e20565b92915050565b600060208284031215612e6257612e61612def565b5b6000612e7084828501612e37565b91505092915050565b60008115159050919050565b612e8e81612e79565b82525050565b6000602082019050612ea96000830184612e85565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee9578082015181840152602081019050612ece565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f1182612eaf565b612f1b8185612eba565b9350612f2b818560208601612ecb565b612f3481612ef5565b840191505092915050565b60006020820190508181036000830152612f598184612f06565b905092915050565b600081600f0b9050919050565b612f7781612f61565b82525050565b6000602082019050612f926000830184612f6e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fd582612ef5565b810181811067ffffffffffffffff82111715612ff457612ff3612f9d565b5b80604052505050565b6000613007612de5565b90506130138282612fcc565b919050565b600063ffffffff82169050919050565b61303181613018565b811461303c57600080fd5b50565b60008135905061304e81613028565b92915050565b600068ffffffffffffffffff82169050919050565b61307281613054565b811461307d57600080fd5b50565b60008135905061308f81613069565b92915050565b600064ffffffffff82169050919050565b6130af81613095565b81146130ba57600080fd5b50565b6000813590506130cc816130a6565b92915050565b6000606082840312156130e8576130e7612f98565b5b6130f26060612ffd565b905060006131028482850161303f565b600083015250602061311684828501613080565b602083015250604061312a848285016130bd565b60408301525092915050565b60006060828403121561314c5761314b612def565b5b600061315a848285016130d2565b91505092915050565b6000819050919050565b61317681613163565b82525050565b6000602082019050613191600083018461316d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131c282613197565b9050919050565b6131d2816131b7565b81146131dd57600080fd5b50565b6000813590506131ef816131c9565b92915050565b60006020828403121561320b5761320a612def565b5b6000613219848285016131e0565b91505092915050565b61322b81613163565b811461323657600080fd5b50565b60008135905061324881613222565b92915050565b6000806040838503121561326557613264612def565b5b600061327385828601613239565b925050602061328485828601613239565b9150509250929050565b6000602082840312156132a4576132a3612def565b5b60006132b284828501613239565b91505092915050565b6132c481613018565b82525050565b6132d381613054565b82525050565b6132e281613095565b82525050565b60006060820190506132fd60008301866132bb565b61330a60208301856132ca565b61331760408301846132d9565b949350505050565b6000806040838503121561333657613335612def565b5b6000613344858286016131e0565b925050602061335585828601613239565b9150509250929050565b613368816131b7565b82525050565b6000602082019050613383600083018461335f565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6133ae81613389565b82525050565b60006020820190506133c960008301846133a5565b92915050565b600080600080608085870312156133e9576133e8612def565b5b60006133f787828801613239565b945050602061340887828801613239565b935050604061341987828801613239565b925050606061342a87828801613239565b91505092959194509250565b61343f81613018565b82525050565b61344e81613054565b82525050565b61345d81613095565b82525050565b6060820160008201516134796000850182613436565b50602082015161348c6020850182613445565b50604082015161349f6040850182613454565b50505050565b60006060820190506134ba6000830184613463565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061350757607f821691505b60208210810361351a576135196134c0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061355a82613163565b915061356583613163565b925082820390508181111561357d5761357c613520565b5b92915050565b600061358e82613163565b915061359983613163565b92508282019050808211156135b1576135b0613520565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006135ed600a83612eba565b91506135f8826135b7565b602082019050919050565b6000602082019050818103600083015261361c816135e0565b9050919050565b600061362e82613163565b915061363983613163565b925082820261364781613163565b9150828204841483151761365e5761365d613520565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061369f82613163565b91506136aa83613163565b9250826136ba576136b9613665565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006136fb600d83612eba565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212208df54ffd702147c322212cd37b0275e383e20c53759279c0428de609c2666e1e64736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 2d4394b..eff2e80 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_oldAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newAmount","type":"uint256"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index cb2d33c..75e1426 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -24,6 +24,7 @@ from hexathon import ( # local imports from erc20_demurrage_token.data import data_dir +from erc20_demurrage_token.fixed import from_fixed logg = logging.getLogger(__name__) @@ -100,7 +101,8 @@ class DemurrageToken(ERC20): @staticmethod def abi(multi=True, cap=False): - name = DemurrageToken.__to_contract_name(multi, cap) + #name = DemurrageToken.__to_contract_name(multi, cap) + name = 'DemurrageTokenSingleNocap' if DemurrageToken.__abi.get(name) == None: f = open(os.path.join(data_dir, name + '.json'), 'r') DemurrageToken.__abi[name] = json.load(f) @@ -110,7 +112,8 @@ class DemurrageToken(ERC20): @staticmethod def bytecode(multi=True, cap=False): - name = DemurrageToken.__to_contract_name(multi, cap) + #name = DemurrageToken.__to_contract_name(multi, cap) + name = 'DemurrageTokenSingleNocap' if DemurrageToken.__bytecode.get(name) == None: f = open(os.path.join(data_dir, name + '.bin'), 'r') DemurrageToken.__bytecode[name] = f.read() @@ -561,7 +564,8 @@ class DemurrageToken(ERC20): @classmethod def parse_demurrage_amount(self, v): - return abi_decode_single(ABIContractType.UINT256, v) + # return abi_decode_single(ABIContractType.UINT256, v) + return from_fixed(v) @classmethod diff --git a/python/erc20_demurrage_token/unittest/newbase.py b/python/erc20_demurrage_token/unittest/newbase.py index b18f42b..ceb404e 100644 --- a/python/erc20_demurrage_token/unittest/newbase.py +++ b/python/erc20_demurrage_token/unittest/newbase.py @@ -1,6 +1,7 @@ # standard imports import logging import os +import math # external imports from chainlib.eth.unittest.ethtester import EthTesterCase @@ -19,6 +20,10 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, DemurrageToken, ) +from erc20_demurrage_token.fixed import ( + to_fixed, + from_fixed, + ) logg = logging.getLogger() @@ -26,8 +31,7 @@ logg = logging.getLogger() TAX_LEVEL = int(10000 * 2) # 2% # calc "1-(0.98)^(1/518400)" <- 518400 = 30 days of blocks # 0.00000003897127107225 -#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month -PERIOD = 10 +PERIOD = 43200 class TestTokenDeploy: @@ -41,7 +45,8 @@ class TestTokenDeploy: self.settings.name = token_name self.settings.symbol = token_symbol self.settings.decimals = 6 - self.settings.demurrage_level = tax_level ** (1 / period) + tax_level_input = to_fixed((1 - (tax_level / 1000000)) ** (1 / period)) + self.settings.demurrage_level = tax_level_input self.settings.period_minutes = period self.settings.sink_address = sink_address self.sink_address = self.settings.sink_address @@ -59,11 +64,10 @@ class TestTokenDeploy: self.start_time = int(r['timestamp']) self.default_supply = supply - #self.default_supply_cap = int(self.default_supply * 10) self.default_supply_cap = 0 - def deploy(self, rpc, deployer_address, interface, mode, supply_cap=0): + def deploy(self, rpc, deployer_address, interface, supply_cap=0): tx_hash = None o = None (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=0) @@ -100,7 +104,7 @@ class TestDemurrage(EthTesterCase): def deploy(self, interface): - self.address = self.deployer.deploy(self.rpc, self.accounts[0], interface, mode, supply_cap=self.default_supply_cap) + self.address = self.deployer.deploy(self.rpc, self.accounts[0], interface, supply_cap=self.default_supply_cap) self.start_block = self.deployer.start_block self.start_time = self.deployer.start_time self.tax_level = self.deployer.tax_level @@ -117,6 +121,12 @@ class TestDemurrage(EthTesterCase): logg.debug('asserted within lower {} <= {} <= {}'.format(lower_target, v, target)) + def assert_equal_decimals(self, v, target, precision): + target = int(target * (10 ** precision)) + target = target / (10 ** precision) + self.assertEqual(v, target) + + def tearDown(self): pass @@ -130,5 +140,3 @@ class TestDemurrageDefault(TestDemurrage): c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) self.deploy(c) - - logg.info('deployed with mode {}'.format(self.mode)) diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 52221d6..749b545 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -18,7 +18,7 @@ from chainlib.eth.block import ( from erc20_demurrage_token import DemurrageToken # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -55,7 +55,8 @@ class TestBasic(TestDemurrageDefault): def test_apply_demurrage_limited(self): - modifier = (10 ** 28) + #modifier = (10 ** 28) + modifier = 1 nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -65,8 +66,8 @@ class TestBasic(TestDemurrageDefault): demurrage_amount = c.parse_demurrage_amount(r) self.assertEqual(modifier, demurrage_amount) - self.backend.time_travel(self.start_time + 120) - (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0], limit=1) + self.backend.time_travel(self.start_time + (60 * 43200)) + (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0], limit=20000) r = self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) @@ -75,13 +76,12 @@ class TestBasic(TestDemurrageDefault): o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) demurrage_amount = c.parse_demurrage_amount(r) - modifier_base = 1000000 - self.tax_level - modifier = int(modifier_base * (10 ** 22)) # 38 decimal places minus 6 (1000000) - self.assertEqual(modifier, demurrage_amount) + self.assert_equal_decimals(0.9906, demurrage_amount, 4) def test_apply_demurrage(self): - modifier = (10 ** 28) + #modifier = (10 ** 28) + modifier = 1 nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -97,7 +97,7 @@ class TestBasic(TestDemurrageDefault): b = self.rpc.do(o) logg.debug('block {} start {}'.format(b['timestamp'], self.start_time)) - self.backend.time_travel(self.start_time + 2) + self.backend.time_travel(self.start_time + (60 * 43200)) (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) o = receipt(tx_hash) @@ -107,9 +107,9 @@ class TestBasic(TestDemurrageDefault): o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) demurrage_amount = c.parse_demurrage_amount(r) - self.assertEqual(modifier, demurrage_amount) + self.assert_equal_decimals(0.98, demurrage_amount, 2) - self.backend.time_travel(self.start_time + 61) + self.backend.time_travel(self.start_time + (60 * 43200 * 2)) (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) o = receipt(tx_hash) @@ -120,28 +120,10 @@ class TestBasic(TestDemurrageDefault): demurrage_amount = c.parse_demurrage_amount(r) modifier_base = 1000000 - self.tax_level modifier = int(modifier_base * (10 ** 22)) # 38 decimal places minus 6 (1000000) - self.assertEqual(modifier, demurrage_amount) - - self.backend.time_travel(self.start_time + 601) - (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - o = c.demurrage_amount(self.address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - demurrage_amount = c.parse_demurrage_amount(r) - modifier_base = ((1000000 - self.tax_level) / 1000000) ** 10 - logg.warning('mod base {}'.format(modifier_base)) - modifier = int(modifier_base * (10 ** 12)) - - rounding_tolerance_nano = 4000000 # 0.000004% precision - demurrage_amount_truncate = int(demurrage_amount / (10 ** 16)) # equals 38 decimal places - 14 for the modifier magniture - 2 for percent int calc + 6 for token decimals <- TODO verify this calc - self.assertGreaterEqual(modifier, demurrage_amount_truncate - rounding_tolerance_nano) - self.assertLessEqual(modifier, demurrage_amount_truncate) + self.assert_equal_decimals(0.9604, demurrage_amount, 4) - def test_mint(self): + def test_mint_balance(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) @@ -160,16 +142,19 @@ class TestBasic(TestDemurrageDefault): o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) - o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance_of(r) self.assertEqual(balance, 2000) - self.backend.time_travel(self.start_time + 61) + self.backend.time_travel(self.start_time + (60 * 43200)) (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance_of(r) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 98bc5c8..d19f218 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -90,7 +90,7 @@ contract DemurrageTokenSingleCap { event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); // New demurrage cache milestone calculated - event Decayed(uint256 indexed _period, uint256 indexed _periodCount, uint256 indexed _oldAmount, uint256 _newAmount); + event Decayed(uint256 indexed _period, uint256 indexed _periodCount, int128 indexed _oldAmount, int128 _newAmount); // When a new period threshold has been crossed event Period(uint256 _period); @@ -214,6 +214,10 @@ contract DemurrageTokenSingleCap { return true; } + function changePeriod() public { + applyDemurrage(); + } + // Creates new tokens out of thin air, and allocates them to the given address // Triggers tax function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { @@ -221,7 +225,7 @@ contract DemurrageTokenSingleCap { require(minter[msg.sender], 'ERR_ACCESS'); - //changePeriod(); + changePeriod(); baseAmount = toBaseAmount(_amount); supply += _amount; increaseBaseBalance(_beneficiary, baseAmount); @@ -328,33 +332,38 @@ contract DemurrageTokenSingleCap { return (block.timestamp - _lastTimestamp) / 60; } -// // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call -// function applyDemurrage() public returns (bool) { -// return applyDemurrageLimited(0); -// } -// -// function applyDemurrageLimited(uint256 _rounds) public returns (bool) { -// uint256 periodCount; -// uint256 lastDemurrageAmount; -// -// periodCount = getMinutesDelta(demurrageTimestamp); -// if (periodCount == 0) { -// return false; -// } -// lastDemurrageAmount = demurrageAmount; -// -// // safety limit for exponential calculation to ensure that we can always -// // execute this code no matter how much time passes. -// if (_rounds > 0 && _rounds < periodCount) { -// periodCount = _rounds; -// } -// -// demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); -// //demurragePeriod = epochPeriodCount; -// demurrageTimestamp = demurrageTimestamp + (periodCount * 60); -// emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); -// return true; -// } + // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call + function applyDemurrage() public returns (uint256) { + return applyDemurrageLimited(0); + } + + function applyDemurrageLimited(uint256 _rounds) public returns (uint256) { + int128 v; + uint256 periodCount; + int128 periodPoint; + int128 lastDemurrageAmount; + + periodCount = getMinutesDelta(demurrageTimestamp); + if (periodCount == 0) { + return 0; + } + lastDemurrageAmount = demurrageAmount; + + // safety limit for exponential calculation to ensure that we can always + // execute this code no matter how much time passes. + if (_rounds > 0 && _rounds < periodCount) { + periodCount = _rounds; + } + + periodPoint = ABDKMath64x64.fromUInt(periodCount); + v = ABDKMath64x64.mul(taxLevel, periodPoint); + v = ABDKMath64x64.exp(v); + + demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v); + demurrageTimestamp = demurrageTimestamp + (periodCount * 60); + emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); + return periodCount; + } // Return timestamp of start of period threshold function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { @@ -436,8 +445,6 @@ contract DemurrageTokenSingleCap { valuePoint = ABDKMath64x64.fromUInt(_value); periodPoint = ABDKMath64x64.fromUInt(_period); - //valuePoint -= ABDKMath64x64.mul(ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, periodPoint)), valuePoint); - //valuePoint -= ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, periodPoint)); v = ABDKMath64x64.mul(taxLevel, periodPoint); v = ABDKMath64x64.exp(v); v = ABDKMath64x64.mul(valuePoint, v); From e74a9cb5946ee7708290f5ba9239e0c449881621 Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 9 Feb 2023 12:08:28 +0000 Subject: [PATCH 16/57] test basic passes --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/tests/test_basic.py | 2 +- solidity/DemurrageTokenSingleNocap.sol | 169 +++++++++--------- 4 files changed, 87 insertions(+), 88 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index f63a845..a12d65d 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162004551380380620045518339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a60016200035064010000000002620018a1176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620018c7176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a05161379662000dbb60003960008181610f96015281816115620152611707015260008181610fc201528181611728015261176d01526137966000f3fe608060405234801561001057600080fd5b5060043610610270576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c1161016357806395d89b41116100e0578063d4792037116100a4578063d479203714610799578063d89135cd146107c9578063e8095295146107e7578063eda4e6d614610805578063f2fde38b14610823578063f83da35d1461085357610270565b806395d89b41146106df578063983b2d56146106fd578063b470aade1461072d578063c0ab70771461074b578063d340ef8a1461077b57610270565b80638b8ff2d6116101275780638b8ff2d61461063b5780638da5cb5b1461066b5780638f0b2d5d146106895780638f1df6bc146106a557806394c8a69a146106af57610270565b8063731f237c146105a557806373f42561146105c357806374bedb95146105e157806379ba5097146105ff57806384dde4af1461061d57610270565b806340452d91116101f157806351b4541c116101b557806351b4541c146104c757806358b2833b146104f75780636787a9be146105155780636a2d094e1461054557806370a082311461057557610270565b806340452d91146103e957806342966c681461041b578063449a52f81461043757806347a50517146104675780634abfbba21461049757610270565b80631989c6a8116102385780631989c6a81461032f578063229ba1971461034d5780633092afd51461036b578063313334871461039b578063313ce567146103cb57610270565b806301ffc9a71461027557806306fdde03146102a557806309f28f3c146102c357806310a10f37146102e157806318160ddd14610311575b600080fd5b61028f600480360381019061028a9190612e4c565b610883565b60405161029c9190612e94565b60405180910390f35b6102ad610a29565b6040516102ba9190612f3f565b60405180910390f35b6102cb610ab7565b6040516102d89190612f7d565b60405180910390f35b6102fb60048036038101906102f69190613136565b610aca565b604051610308919061317c565b60405180910390f35b610319610ade565b604051610326919061317c565b60405180910390f35b610337610af5565b604051610344919061317c565b60405180910390f35b610355610b01565b6040516103629190612f7d565b60405180910390f35b610385600480360381019061038091906131f5565b610b14565b6040516103929190612e94565b60405180910390f35b6103b560048036038101906103b0919061324e565b610c07565b6040516103c2919061317c565b60405180910390f35b6103d3610c73565b6040516103e0919061317c565b60405180910390f35b61040360048036038101906103fe919061328e565b610c79565b604051610412939291906132e8565b60405180910390f35b6104356004803603810190610430919061328e565b610ce5565b005b610451600480360381019061044c919061331f565b610e0a565b60405161045e9190612e94565b60405180910390f35b610481600480360381019061047c91906131f5565b610f49565b60405161048e919061317c565b60405180910390f35b6104b160048036038101906104ac919061328e565b610f92565b6040516104be919061317c565b60405180910390f35b6104e160048036038101906104dc919061328e565b610ff2565b6040516104ee919061317c565b60405180910390f35b6104ff611013565b60405161050c919061317c565b60405180910390f35b61052f600480360381019061052a919061328e565b611019565b60405161053c919061317c565b60405180910390f35b61055f600480360381019061055a919061328e565b61105a565b60405161056c919061317c565b60405180910390f35b61058f600480360381019061058a91906131f5565b61107b565b60405161059c919061317c565b60405180910390f35b6105ad6110e2565b6040516105ba919061317c565b60405180910390f35b6105cb6110f3565b6040516105d8919061317c565b60405180910390f35b6105e96110f9565b6040516105f6919061317c565b60405180910390f35b6106076110ff565b6040516106149190612e94565b60405180910390f35b6106256112a6565b604051610632919061336e565b60405180910390f35b61065560048036038101906106509190613136565b6112cc565b604051610662919061317c565b60405180910390f35b6106736112e1565b604051610680919061336e565b60405180910390f35b6106a3600480360381019061069e91906131f5565b611307565b005b6106ad6113a5565b005b6106c960048036038101906106c49190613136565b6113b0565b6040516106d69190612e94565b60405180910390f35b6106e7611415565b6040516106f49190612f3f565b60405180910390f35b610717600480360381019061071291906131f5565b6114a3565b6040516107249190612e94565b60405180910390f35b610735611560565b604051610742919061317c565b60405180910390f35b6107656004803603810190610760919061328e565b611584565b604051610772919061317c565b60405180910390f35b6107836116d8565b604051610790919061317c565b60405180910390f35b6107b360048036038101906107ae9190613136565b6116de565b6040516107c0919061317c565b60405180910390f35b6107d16116f7565b6040516107de919061317c565b60405180910390f35b6107ef611701565b6040516107fc91906133b4565b60405180910390f35b61080d61176b565b60405161081a919061317c565b60405180910390f35b61083d600480360381019061083891906131f5565b61178f565b60405161084a9190612e94565b60405180910390f35b61086d600480360381019061086891906133cf565b611831565b60405161087a91906134a5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036108d75760019050610a24565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109295760019050610a24565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361097b5760019050610a24565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109cd5760019050610a24565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a1f5760019050610a24565b600090505b919050565b60068054610a36906134ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610a62906134ef565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b505050505081565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610af0919061354f565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b610ba657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080600080610c16866118a1565b9250610c21856118a1565b9150610c3c600d60009054906101000a9004600f0b83611909565b9050610c4781611988565b9050610c538382611909565b9050610c5e81611a15565b67ffffffffffffffff16935050505092915050565b60085481565b60008181548110610c8957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d3b57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054811115610d8757600080fd5b6000610d9282611019565b9050610d9e3382611a4a565b5081600c6000828254610db19190613583565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051610dfe919061317c565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9090613603565b60405180910390fd5b610ea16113a5565b610eaa83611019565b90508260096000828254610ebe9190613583565b92505081905550610ecf8482611b51565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051610f2d919061317c565b60405180910390a3610f3d611c15565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082610fc09190613623565b7f0000000000000000000000000000000000000000000000000000000000000000610feb9190613583565b9050919050565b6000603c8242611002919061354f565b61100c9190613694565b9050919050565b60035481565b60008061103d600260009054906101000a9004600f0b611038856118a1565b611909565b905061104881611a15565b67ffffffffffffffff16915050919050565b6000603c824261106a919061354f565b6110749190613694565b9050919050565b60008060008061109261108d86610f49565b6118a1565b925061109f600354610ff2565b90506110ba83600260009054906101000a9004600f0b611909565b91506110d86110c883611a15565b67ffffffffffffffff1682610c07565b9350505050919050565b60006110ee6000611584565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461115c57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461136157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6113ad6110e2565b50565b600080826000015163ffffffff1611156113cd5760009050611410565b6000826020015168ffffffffffffffffff1611156113ee5760009050611410565b6000826040015164ffffffffff16111561140b5760009050611410565b600190505b919050565b60078054611422906134ef565b80601f016020809104026020016040519081016040528092919081815260200182805461144e906134ef565b801561149b5780601f106114705761010080835404028352916020019161149b565b820191906000526020600020905b81548152906001019060200180831161147e57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ff57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611597600354610ff2565b9250600083036115ae5760009450505050506116d3565b600260009054906101000a9004600f0b90506000861180156115cf57508286105b156115d8578592505b6115e1836118a1565b91506115fc600d60009054906101000a9004600f0b83611909565b935061160784611988565b9350611622600260009054906101000a9004600f0b85611909565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361166a9190613623565b6003546116779190613583565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516116c39190612f7d565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042611752919061354f565b61175c9190613694565b6117669190613583565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117eb57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b611839612dac565b611841612dac565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156118b857600080fd5b6040829060020a029050919050565b60008082600f0b136118d857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6118f484611dca565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561197557506f7fffffffffffffffffffffffffffffff600f0b8113155b61197e57600080fd5b8091505092915050565b60006840000000000000000082600f0b126119a257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156119d65760009050611a10565b611a0d6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050611f90565b90505b919050565b60008082600f0b1215611a2757600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611aa65760009350505050611b4b565b611aaf86610f49565b925084831015611af4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aeb90613711565b60405180910390fd5b8483611b00919061354f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503611bad5760009350505050611c0f565b611bb686610f49565b92508483611bc49190613583565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000611c1f612dac565b6000611c29610ade565b905060006001600080549050611c3f919061354f565b81548110611c5057611c4f613731565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050611d22919061354f565b81548110611d3357611d32613731565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b13611ddb57600080fd5b60008083600f0b9050680100000000000000008112611e16576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112611e44576020819060008212600003808260020a82851804189250505090506020820191505b620100008112611e70576010819060008212600003808260020a82851804189250505090506010820191505b6101008112611e9b576008819060008212600003808260020a82851804189250505090506008820191505b60108112611ec5576004819060008212600003808260020a82851804189250505090506004820191505b60048112611eef576002819060008212600003808260020a82851804189250505090506002820191505b60028112611efe576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315611f83578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050611f2b565b5081945050505050919050565b60006840000000000000000082600f0b12611faa57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215611fde5760009050612da7565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561202c57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156120655760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561209e5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156120d757608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156121105760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612149576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561218257608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156121bb576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156121f357608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b131561222b5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612263576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561229b5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156122d3576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561230b57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156123435760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561237b57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156123b25760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156123e9576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561242057608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612457576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561248e57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156124c55760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156124fc576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156125335760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612569576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561259f57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156125d55760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561260b57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156126415760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315612677576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156126ad57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156126e3576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561271857608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b131561274d5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315612782576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156127b75760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156127ec576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561282157608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156128565760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561288b57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156128bf5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156128f3576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561292757608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561295b576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561298f57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156129c35760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156129f7576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315612a2b5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315612a5e576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315612a9157608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315612ac45760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315612af757608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315612b2a5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315612b5d576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315612b9057608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315612bc3576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315612bf557608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315612c275760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315612c59576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315612c8b5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315612cbd576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315612cef57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315612d215760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315612d5357608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115612da257600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2981612df4565b8114612e3457600080fd5b50565b600081359050612e4681612e20565b92915050565b600060208284031215612e6257612e61612def565b5b6000612e7084828501612e37565b91505092915050565b60008115159050919050565b612e8e81612e79565b82525050565b6000602082019050612ea96000830184612e85565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ee9578082015181840152602081019050612ece565b60008484015250505050565b6000601f19601f8301169050919050565b6000612f1182612eaf565b612f1b8185612eba565b9350612f2b818560208601612ecb565b612f3481612ef5565b840191505092915050565b60006020820190508181036000830152612f598184612f06565b905092915050565b600081600f0b9050919050565b612f7781612f61565b82525050565b6000602082019050612f926000830184612f6e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fd582612ef5565b810181811067ffffffffffffffff82111715612ff457612ff3612f9d565b5b80604052505050565b6000613007612de5565b90506130138282612fcc565b919050565b600063ffffffff82169050919050565b61303181613018565b811461303c57600080fd5b50565b60008135905061304e81613028565b92915050565b600068ffffffffffffffffff82169050919050565b61307281613054565b811461307d57600080fd5b50565b60008135905061308f81613069565b92915050565b600064ffffffffff82169050919050565b6130af81613095565b81146130ba57600080fd5b50565b6000813590506130cc816130a6565b92915050565b6000606082840312156130e8576130e7612f98565b5b6130f26060612ffd565b905060006131028482850161303f565b600083015250602061311684828501613080565b602083015250604061312a848285016130bd565b60408301525092915050565b60006060828403121561314c5761314b612def565b5b600061315a848285016130d2565b91505092915050565b6000819050919050565b61317681613163565b82525050565b6000602082019050613191600083018461316d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131c282613197565b9050919050565b6131d2816131b7565b81146131dd57600080fd5b50565b6000813590506131ef816131c9565b92915050565b60006020828403121561320b5761320a612def565b5b6000613219848285016131e0565b91505092915050565b61322b81613163565b811461323657600080fd5b50565b60008135905061324881613222565b92915050565b6000806040838503121561326557613264612def565b5b600061327385828601613239565b925050602061328485828601613239565b9150509250929050565b6000602082840312156132a4576132a3612def565b5b60006132b284828501613239565b91505092915050565b6132c481613018565b82525050565b6132d381613054565b82525050565b6132e281613095565b82525050565b60006060820190506132fd60008301866132bb565b61330a60208301856132ca565b61331760408301846132d9565b949350505050565b6000806040838503121561333657613335612def565b5b6000613344858286016131e0565b925050602061335585828601613239565b9150509250929050565b613368816131b7565b82525050565b6000602082019050613383600083018461335f565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b6133ae81613389565b82525050565b60006020820190506133c960008301846133a5565b92915050565b600080600080608085870312156133e9576133e8612def565b5b60006133f787828801613239565b945050602061340887828801613239565b935050604061341987828801613239565b925050606061342a87828801613239565b91505092959194509250565b61343f81613018565b82525050565b61344e81613054565b82525050565b61345d81613095565b82525050565b6060820160008201516134796000850182613436565b50602082015161348c6020850182613445565b50604082015161349f6040850182613454565b50505050565b60006060820190506134ba6000830184613463565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061350757607f821691505b60208210810361351a576135196134c0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061355a82613163565b915061356583613163565b925082820390508181111561357d5761357c613520565b5b92915050565b600061358e82613163565b915061359983613163565b92508282019050808211156135b1576135b0613520565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006135ed600a83612eba565b91506135f8826135b7565b602082019050919050565b6000602082019050818103600083015261361c816135e0565b9050919050565b600061362e82613163565b915061363983613163565b925082820261364781613163565b9150828204841483151761365e5761365d613520565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061369f82613163565b91506136aa83613163565b9250826136ba576136b9613665565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006136fb600d83612eba565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212208df54ffd702147c322212cd37b0275e383e20c53759279c0428de609c2666e1e64736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162004fb238038062004fb28339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a6001620003506401000000000262002192176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620021b8176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a0516141f762000dbb600039600081816115d401528181611e530152611ff801526000818161160001528181612019015261205e01526141f76000f3fe608060405234801561001057600080fd5b50600436106102a7576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c11610179578063983b2d56116100eb578063d4792037116100a4578063d4792037146108c0578063d89135cd146108f0578063e80952951461090e578063eda4e6d61461092c578063f2fde38b1461094a578063f83da35d1461097a576102a7565b8063983b2d56146107c4578063a457c2d7146107f4578063a9059cbb14610824578063b470aade14610854578063c0ab707714610872578063d340ef8a146108a2576102a7565b80638b8ff2d61161013d5780638b8ff2d6146107025780638da5cb5b146107325780638f0b2d5d146107505780638f1df6bc1461076c57806394c8a69a1461077657806395d89b41146107a6576102a7565b8063731f237c1461066c57806373f425611461068a57806374bedb95146106a857806379ba5097146106c657806384dde4af146106e4576102a7565b8063313ce5671161021d5780634abfbba2116101d65780634abfbba21461055e57806351b4541c1461058e57806358b2833b146105be5780636787a9be146105dc5780636a2d094e1461060c57806370a082311461063c576102a7565b8063313ce56714610462578063395093511461048057806340452d91146104b057806342966c68146104e2578063449a52f8146104fe57806347a505171461052e576102a7565b806318160ddd1161026f57806318160ddd146103785780631989c6a814610396578063229ba197146103b457806323b872dd146103d25780633092afd5146104025780633133348714610432576102a7565b806301ffc9a7146102ac57806306fdde03146102dc578063095ea7b3146102fa57806309f28f3c1461032a57806310a10f3714610348575b600080fd5b6102c660048036038101906102c191906137ee565b6109aa565b6040516102d39190613836565b60405180910390f35b6102e4610b50565b6040516102f191906138e1565b60405180910390f35b610314600480360381019061030f9190613997565b610bde565b6040516103219190613836565b60405180910390f35b610332610dae565b60405161033f91906139f3565b60405180910390f35b610362600480360381019061035d9190613bac565b610dc1565b60405161036f9190613be8565b60405180910390f35b610380610dd5565b60405161038d9190613be8565b60405180910390f35b61039e610dec565b6040516103ab9190613be8565b60405180910390f35b6103bc610df8565b6040516103c991906139f3565b60405180910390f35b6103ec60048036038101906103e79190613c03565b610e0b565b6040516103f99190613836565b60405180910390f35b61041c60048036038101906104179190613c56565b610fbd565b6040516104299190613836565b60405180910390f35b61044c60048036038101906104479190613c83565b6110b0565b6040516104599190613be8565b60405180910390f35b61046a61111c565b6040516104779190613be8565b60405180910390f35b61049a60048036038101906104959190613997565b611122565b6040516104a79190613836565b60405180910390f35b6104ca60048036038101906104c59190613cc3565b6112b7565b6040516104d993929190613d1d565b60405180910390f35b6104fc60048036038101906104f79190613cc3565b611323565b005b61051860048036038101906105139190613997565b611448565b6040516105259190613836565b60405180910390f35b61054860048036038101906105439190613c56565b611587565b6040516105559190613be8565b60405180910390f35b61057860048036038101906105739190613cc3565b6115d0565b6040516105859190613be8565b60405180910390f35b6105a860048036038101906105a39190613cc3565b611630565b6040516105b59190613be8565b60405180910390f35b6105c6611651565b6040516105d39190613be8565b60405180910390f35b6105f660048036038101906105f19190613cc3565b611657565b6040516106039190613be8565b60405180910390f35b61062660048036038101906106219190613cc3565b611698565b6040516106339190613be8565b60405180910390f35b61065660048036038101906106519190613c56565b6116b9565b6040516106639190613be8565b60405180910390f35b610674611720565b6040516106819190613be8565b60405180910390f35b610692611731565b60405161069f9190613be8565b60405180910390f35b6106b0611737565b6040516106bd9190613be8565b60405180910390f35b6106ce61173d565b6040516106db9190613836565b60405180910390f35b6106ec6118e4565b6040516106f99190613d63565b60405180910390f35b61071c60048036038101906107179190613bac565b61190a565b6040516107299190613be8565b60405180910390f35b61073a61191f565b6040516107479190613d63565b60405180910390f35b61076a60048036038101906107659190613c56565b611945565b005b6107746119e3565b005b610790600480360381019061078b9190613bac565b6119ee565b60405161079d9190613836565b60405180910390f35b6107ae611a53565b6040516107bb91906138e1565b60405180910390f35b6107de60048036038101906107d99190613c56565b611ae1565b6040516107eb9190613836565b60405180910390f35b61080e60048036038101906108099190613997565b611b9e565b60405161081b9190613836565b60405180910390f35b61083e60048036038101906108399190613997565b611dbc565b60405161084b9190613836565b60405180910390f35b61085c611e51565b6040516108699190613be8565b60405180910390f35b61088c60048036038101906108879190613cc3565b611e75565b6040516108999190613be8565b60405180910390f35b6108aa611fc9565b6040516108b79190613be8565b60405180910390f35b6108da60048036038101906108d59190613bac565b611fcf565b6040516108e79190613be8565b60405180910390f35b6108f8611fe8565b6040516109059190613be8565b60405180910390f35b610916611ff2565b6040516109239190613da9565b60405180910390f35b61093461205c565b6040516109419190613be8565b60405180910390f35b610964600480360381019061095f9190613c56565b612080565b6040516109719190613836565b60405180910390f35b610994600480360381019061098f9190613dc4565b612122565b6040516109a19190613e9a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109fe5760019050610b4b565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a505760019050610b4b565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610aa25760019050610b4b565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610af45760019050610b4b565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b465760019050610b4b565b600090505b919050565b60068054610b5d90613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ee4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610caa5760008314610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613f61565b60405180910390fd5b5b610cb26119e3565b610cbb83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d9b9190613be8565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610de79190613fb0565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000806000610e186119e3565b610e2184611657565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610eac57600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f389190613fb0565b92505081905550610f4a8686846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610fa99190613be8565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061104657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61104f57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806110bf86612192565b92506110ca85612192565b91506110e5600d60009054906101000a9004600f0b8361221f565b90506110f08161229e565b90506110fc838261221f565b90506111078161232b565b67ffffffffffffffff16935050505092915050565b60085481565b60008061112d6119e3565b61113683611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111c49190613fe4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516112a49190613be8565b60405180910390a3600191505092915050565b600081815481106112c757600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661137957600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156113c557600080fd5b60006113d082611657565b90506113dc3382612360565b5081600c60008282546113ef9190613fe4565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161143c9190613be8565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614064565b60405180910390fd5b6114df6119e3565b6114e883611657565b905082600960008282546114fc9190613fe4565b9250508190555061150d8482612467565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161156b9190613be8565b60405180910390a361157b61252b565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826115fe9190614084565b7f00000000000000000000000000000000000000000000000000000000000000006116299190613fe4565b9050919050565b6000603c82426116409190613fb0565b61164a91906140f5565b9050919050565b60035481565b60008061167b61166684612192565b600260009054906101000a9004600f0b6126e0565b90506116868161232b565b67ffffffffffffffff16915050919050565b6000603c82426116a89190613fb0565b6116b291906140f5565b9050919050565b6000806000806116d06116cb86611587565b612192565b92506116dd600354611630565b90506116f883600260009054906101000a9004600f0b61221f565b91506117166117068361232b565b67ffffffffffffffff16826110b0565b9350505050919050565b600061172c6000611e75565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461199f57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119eb611720565b50565b600080826000015163ffffffff161115611a0b5760009050611a4e565b6000826020015168ffffffffffffffffff161115611a2c5760009050611a4e565b6000826040015164ffffffffff161115611a495760009050611a4e565b600190505b919050565b60078054611a6090613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c90613ee4565b8015611ad95780601f10611aae57610100808354040283529160200191611ad9565b820191906000526020600020905b815481529060010190602001808311611abc57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3d57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611baa83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611c3557600080fd5b611c3d6119e3565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc99190613fb0565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611da99190613be8565b60405180910390a3600191505092915050565b6000806000611dc96119e3565b611dd284611657565b9150611ddf3386846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611e3e9190613be8565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611e88600354611630565b925060008303611e9f576000945050505050611fc4565b600260009054906101000a9004600f0b9050600086118015611ec057508286105b15611ec9578592505b611ed283612192565b9150611eed600d60009054906101000a9004600f0b8361221f565b9350611ef88461229e565b9350611f13600260009054906101000a9004600f0b8561221f565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83611f5b9190614084565b600354611f689190613fe4565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051611fb491906139f3565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426120439190613fb0565b61204d91906140f5565b6120579190613fe4565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120dc57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61212a61374e565b61213261374e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156121a957600080fd5b6040829060020a029050919050565b60008082600f0b136121c957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6121e58461276c565b600f0b02908060020a82049150509050919050565b6000806122078584612360565b506122128484612467565b5060019150509392505050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561228b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61229457600080fd5b8091505092915050565b60006840000000000000000082600f0b126122b857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156122ec5760009050612326565b6123236080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050612932565b90505b919050565b60008082600f0b121561233d57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036123bc5760009350505050612461565b6123c586611587565b92508483101561240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190614172565b60405180910390fd5b84836124169190613fb0565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036124c35760009350505050612525565b6124cc86611587565b925084836124da9190613fe4565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061253561374e565b600061253f610dd5565b9050600060016000805490506125559190613fb0565b8154811061256657612565614192565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506126389190613fb0565b8154811061264957612648614192565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b036126f157600080fd5b600082600f0b604085600f0b9060020a02816127105761270f6140c6565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561275957506f7fffffffffffffffffffffffffffffff600f0b8113155b61276257600080fd5b8091505092915050565b60008082600f0b1361277d57600080fd5b60008083600f0b90506801000000000000000081126127b8576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126127e6576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612812576010819060008212600003808260020a82851804189250505090506010820191505b610100811261283d576008819060008212600003808260020a82851804189250505090506008820191505b60108112612867576004819060008212600003808260020a82851804189250505090506004820191505b60048112612891576002819060008212600003808260020a82851804189250505090506002820191505b600281126128a0576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315612925578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506128cd565b5081945050505050919050565b60006840000000000000000082600f0b1261294c57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156129805760009050613749565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156129ce57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315612a075760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315612a405760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315612a7957608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315612ab25760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612aeb576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315612b2457608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315612b5d576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315612b9557608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315612bcd5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612c05576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315612c3d5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315612c75576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315612cad57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315612ce55760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315612d1d57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315612d545760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315612d8b576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315612dc257608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612df9576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315612e3057608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315612e675760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315612e9e576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315612ed55760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612f0b576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315612f4157608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315612f775760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315612fad57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315612fe35760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613019576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561304f57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613085576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156130ba57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156130ef5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613124576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156131595760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561318e576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156131c357608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156131f85760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561322d57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156132615760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613295576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156132c957608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156132fd576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561333157608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156133655760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613399576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156133cd5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613400576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561343357608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156134665760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561349957608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156134cc5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156134ff576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561353257608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613565576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561359757608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156135c95760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156135fb576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561362d5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561365f576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561369157608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156136c35760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156136f557608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561374457600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137cb81613796565b81146137d657600080fd5b50565b6000813590506137e8816137c2565b92915050565b60006020828403121561380457613803613791565b5b6000613812848285016137d9565b91505092915050565b60008115159050919050565b6138308161381b565b82525050565b600060208201905061384b6000830184613827565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561388b578082015181840152602081019050613870565b60008484015250505050565b6000601f19601f8301169050919050565b60006138b382613851565b6138bd818561385c565b93506138cd81856020860161386d565b6138d681613897565b840191505092915050565b600060208201905081810360008301526138fb81846138a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061392e82613903565b9050919050565b61393e81613923565b811461394957600080fd5b50565b60008135905061395b81613935565b92915050565b6000819050919050565b61397481613961565b811461397f57600080fd5b50565b6000813590506139918161396b565b92915050565b600080604083850312156139ae576139ad613791565b5b60006139bc8582860161394c565b92505060206139cd85828601613982565b9150509250929050565b600081600f0b9050919050565b6139ed816139d7565b82525050565b6000602082019050613a0860008301846139e4565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4b82613897565b810181811067ffffffffffffffff82111715613a6a57613a69613a13565b5b80604052505050565b6000613a7d613787565b9050613a898282613a42565b919050565b600063ffffffff82169050919050565b613aa781613a8e565b8114613ab257600080fd5b50565b600081359050613ac481613a9e565b92915050565b600068ffffffffffffffffff82169050919050565b613ae881613aca565b8114613af357600080fd5b50565b600081359050613b0581613adf565b92915050565b600064ffffffffff82169050919050565b613b2581613b0b565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060608284031215613b5e57613b5d613a0e565b5b613b686060613a73565b90506000613b7884828501613ab5565b6000830152506020613b8c84828501613af6565b6020830152506040613ba084828501613b33565b60408301525092915050565b600060608284031215613bc257613bc1613791565b5b6000613bd084828501613b48565b91505092915050565b613be281613961565b82525050565b6000602082019050613bfd6000830184613bd9565b92915050565b600080600060608486031215613c1c57613c1b613791565b5b6000613c2a8682870161394c565b9350506020613c3b8682870161394c565b9250506040613c4c86828701613982565b9150509250925092565b600060208284031215613c6c57613c6b613791565b5b6000613c7a8482850161394c565b91505092915050565b60008060408385031215613c9a57613c99613791565b5b6000613ca885828601613982565b9250506020613cb985828601613982565b9150509250929050565b600060208284031215613cd957613cd8613791565b5b6000613ce784828501613982565b91505092915050565b613cf981613a8e565b82525050565b613d0881613aca565b82525050565b613d1781613b0b565b82525050565b6000606082019050613d326000830186613cf0565b613d3f6020830185613cff565b613d4c6040830184613d0e565b949350505050565b613d5d81613923565b82525050565b6000602082019050613d786000830184613d54565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b613da381613d7e565b82525050565b6000602082019050613dbe6000830184613d9a565b92915050565b60008060008060808587031215613dde57613ddd613791565b5b6000613dec87828801613982565b9450506020613dfd87828801613982565b9350506040613e0e87828801613982565b9250506060613e1f87828801613982565b91505092959194509250565b613e3481613a8e565b82525050565b613e4381613aca565b82525050565b613e5281613b0b565b82525050565b606082016000820151613e6e6000850182613e2b565b506020820151613e816020850182613e3a565b506040820151613e946040850182613e49565b50505050565b6000606082019050613eaf6000830184613e58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613efc57607f821691505b602082108103613f0f57613f0e613eb5565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000613f4b600a8361385c565b9150613f5682613f15565b602082019050919050565b60006020820190508181036000830152613f7a81613f3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fbb82613961565b9150613fc683613961565b9250828203905081811115613fde57613fdd613f81565b5b92915050565b6000613fef82613961565b9150613ffa83613961565b925082820190508082111561401257614011613f81565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061404e600a8361385c565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b600061408f82613961565b915061409a83613961565b92508282026140a881613961565b915082820484148315176140bf576140be613f81565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410082613961565b915061410b83613961565b92508261411b5761411a6140c6565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061415c600d8361385c565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220f8be9800a1ef4a4f2ad33ef73ea179ef5a5d6b997ee73427bdf03aa8ae0861e364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index eff2e80..927d32d 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/tests/test_basic.py b/python/tests/test_basic.py index 749b545..d693662 100644 --- a/python/tests/test_basic.py +++ b/python/tests/test_basic.py @@ -219,7 +219,7 @@ class TestBasic(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) self.rpc.do(o) - self.backend.time_travel(self.start_time + 61) + self.backend.time_travel(self.start_time + (60 * 43200)) (tx_hash, o) = c.apply_demurrage(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) o = c.to_base_amount(self.address, 1000, sender_address=self.accounts[0]) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index d19f218..af463a0 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -455,93 +455,92 @@ contract DemurrageTokenSingleCap { // Inflates the given amount according to the current demurrage modifier function toBaseAmount(uint256 _value) public view returns (uint256) { int128 r; - //return (_value * resolutionFactor) / (demurrageAmount * 10000000000); - r = ABDKMath64x64.mul(demurrageAmount, ABDKMath64x64.fromUInt(_value)); + r = ABDKMath64x64.div(ABDKMath64x64.fromUInt(_value), demurrageAmount); return ABDKMath64x64.toUInt(r); } -// -// // Implements ERC20, triggers tax and/or redistribution -// function approve(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// if (allowance[msg.sender][_spender] > 0) { -// require(_value == 0, 'ZERO_FIRST'); -// } -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// allowance[msg.sender][_spender] = baseValue; -// emit Approval(msg.sender, _spender, _value); -// return true; -// } -// -// // Reduce allowance by amount -// function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// baseValue = toBaseAmount(_value); -// require(allowance[msg.sender][_spender] >= baseValue); -// -// changePeriod(); -// -// allowance[msg.sender][_spender] -= baseValue; -// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); -// return true; -// } -// -// // Increase allowance by amount -// function increaseAllowance(address _spender, uint256 _value) public returns (bool) { -// uint256 baseValue; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// -// allowance[msg.sender][_spender] += baseValue; -// emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); -// return true; -// } -// -// // Implements ERC20, triggers tax and/or redistribution -// function transfer(address _to, uint256 _value) public returns (bool) { -// uint256 baseValue; -// bool result; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// result = transferBase(msg.sender, _to, baseValue); -// emit Transfer(msg.sender, _to, _value); -// return result; -// } -// -// // Implements ERC20, triggers tax and/or redistribution -// function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { -// uint256 baseValue; -// bool result; -// -// changePeriod(); -// -// baseValue = toBaseAmount(_value); -// require(allowance[_from][msg.sender] >= baseValue); -// -// allowance[_from][msg.sender] -= baseValue; -// result = transferBase(_from, _to, baseValue); -// -// emit Transfer(_from, _to, _value); -// return result; -// } -// -// // ERC20 transfer backend for transfer, transferFrom -// function transferBase(address _from, address _to, uint256 _value) private returns (bool) { -// uint256 period; -// -// decreaseBaseBalance(_from, _value); -// increaseBaseBalance(_to, _value); -// -// return true; -// } + + // Implements ERC20, triggers tax and/or redistribution + function approve(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + if (allowance[msg.sender][_spender] > 0) { + require(_value == 0, 'ZERO_FIRST'); + } + + changePeriod(); + + baseValue = toBaseAmount(_value); + allowance[msg.sender][_spender] = baseValue; + emit Approval(msg.sender, _spender, _value); + return true; + } + + // Reduce allowance by amount + function decreaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + baseValue = toBaseAmount(_value); + require(allowance[msg.sender][_spender] >= baseValue); + + changePeriod(); + + allowance[msg.sender][_spender] -= baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Increase allowance by amount + function increaseAllowance(address _spender, uint256 _value) public returns (bool) { + uint256 baseValue; + + changePeriod(); + + baseValue = toBaseAmount(_value); + + allowance[msg.sender][_spender] += baseValue; + emit Approval(msg.sender, _spender, allowance[msg.sender][_spender]); + return true; + } + + // Implements ERC20, triggers tax and/or redistribution + function transfer(address _to, uint256 _value) public returns (bool) { + uint256 baseValue; + bool result; + + changePeriod(); + + baseValue = toBaseAmount(_value); + result = transferBase(msg.sender, _to, baseValue); + emit Transfer(msg.sender, _to, _value); + return result; + } + + // Implements ERC20, triggers tax and/or redistribution + function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { + uint256 baseValue; + bool result; + + changePeriod(); + + baseValue = toBaseAmount(_value); + require(allowance[_from][msg.sender] >= baseValue); + + allowance[_from][msg.sender] -= baseValue; + result = transferBase(_from, _to, baseValue); + + emit Transfer(_from, _to, _value); + return result; + } + + // ERC20 transfer backend for transfer, transferFrom + function transferBase(address _from, address _to, uint256 _value) private returns (bool) { + uint256 period; + + decreaseBaseBalance(_from, _value); + increaseBaseBalance(_to, _value); + + return true; + } // Implements EIP173 function transferOwnership(address _newOwner) public returns (bool) { From 3333d50f98b3370859d56372782f9987df799878 Mon Sep 17 00:00:00 2001 From: lash Date: Thu, 9 Feb 2023 12:26:13 +0000 Subject: [PATCH 17/57] Rehabilitate test growth and amounts --- python/tests/test_amounts.py | 38 ++++++++++++++++++------------------ python/tests/test_growth.py | 34 ++++++-------------------------- 2 files changed, 25 insertions(+), 47 deletions(-) diff --git a/python/tests/test_amounts.py b/python/tests/test_amounts.py index bec18f5..0c745eb 100644 --- a/python/tests/test_amounts.py +++ b/python/tests/test_amounts.py @@ -13,7 +13,7 @@ from chainlib.eth.tx import receipt from erc20_demurrage_token import DemurrageToken # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -36,7 +36,7 @@ class TestAmounts(TestDemurrageDefault): o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assertEqual(balance, 817) + self.assertEqual(balance, 980) (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1000) r = self.rpc.do(o) @@ -44,7 +44,7 @@ class TestAmounts(TestDemurrageDefault): o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assert_within_lower(balance, 1817, 750) + self.assert_within_lower(balance, 1980, 750) self.backend.time_travel(self.start_time + self.period_seconds * 2) @@ -57,8 +57,8 @@ class TestAmounts(TestDemurrageDefault): expected_balance = ((1 - self.tax_level / 1000000) ** 10) * 1000 expected_balance += ((1 - self.tax_level / 1000000) ** 20) * 1000 - self.assert_within_lower(balance, expected_balance, 500) - + #self.assert_within_lower(balance, expected_balance, 500) + self.assertEqual(balance, 1940) def test_transfers(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) @@ -74,7 +74,7 @@ class TestAmounts(TestDemurrageDefault): o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assertEqual(balance, 1634) + self.assertEqual(balance, 1960) nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -84,7 +84,7 @@ class TestAmounts(TestDemurrageDefault): o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assertEqual(balance, 1134) + self.assertEqual(balance, 1460) o = c.balance_of(self.address, self.accounts[2], sender_address=self.accounts[0]) r = self.rpc.do(o) @@ -99,24 +99,24 @@ class TestAmounts(TestDemurrageDefault): r = self.rpc.do(o) cases = [ - (61, 1960), - (121, 1920), - (181, 1882), - (241, 1844), - (301, 1807), - (361, 1771), - (421, 1736), - (481, 1701), - (541, 1667), - (601, 1634), + (60, 1960), + (120, 1920), + (180, 1882), + (240, 1844), + (300, 1807), + (360, 1771), + (420, 1736), + (480, 1701), + (540, 1667), + (600, 1634), ] for case in cases: - self.backend.time_travel(self.start_time + case[0]) + self.backend.time_travel(self.start_time + int(case[0] * (self.period_seconds / 60))) o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assertEqual(balance, case[1]) + self.assert_within_lower(balance, case[1], 10000) if __name__ == '__main__': diff --git a/python/tests/test_growth.py b/python/tests/test_growth.py index dafca13..df321d0 100644 --- a/python/tests/test_growth.py +++ b/python/tests/test_growth.py @@ -18,7 +18,7 @@ from chainlib.eth.block import ( from erc20_demurrage_token import DemurrageToken # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -28,42 +28,20 @@ testdir = os.path.dirname(__file__) class TestGrowth(TestDemurrageDefault): -# def test_grow_by(self): -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# -# growth_factor = (1000000 + self.tax_level) / 1000000 -# v = 1000000000 -# o = c.grow_by(self.address, v, 1, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# g = c.parse_grow_by(r) -# self.assertEqual(int(v * growth_factor), g) -# -# period = 10 -# growth_factor = (1 + (self.tax_level) / 1000000) ** period -# o = c.grow_by(self.address, v, period, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# g = c.parse_grow_by(r) -# self.assertEqual(int(v * growth_factor), g) - - def test_decay_by(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - growth_factor = (1000000 - self.tax_level) / 1000000 v = 1000000000 - o = c.decay_by(self.address, v, 1, sender_address=self.accounts[0]) + o = c.decay_by(self.address, v, 20000, sender_address=self.accounts[0]) r = self.rpc.do(o) g = c.parse_decay_by(r) - self.assertEqual(int(v * growth_factor), g) - - period = 10 - growth_factor = (1 - (self.tax_level) / 1000000) ** period - o = c.decay_by(self.address, v, period, sender_address=self.accounts[0]) + self.assertEqual(int(g), 990690498) + + o = c.decay_by(self.address, v, 43200, sender_address=self.accounts[0]) r = self.rpc.do(o) g = c.parse_decay_by(r) - self.assertEqual(int(v * growth_factor), g) + self.assertEqual(int(g), 980000000) if __name__ == '__main__': From 555b0b17244099ee653871aa51a20a700e353029 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 05:02:24 +0000 Subject: [PATCH 18/57] Rehabilitate change period --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 51 +++-- python/tests/test_period.py | 13 +- python/tests/test_single.py | 9 +- solidity/DemurrageTokenSingleNocap.sol | 190 +++++++++--------- 6 files changed, 138 insertions(+), 129 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index a12d65d..27592f6 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162004fb238038062004fb28339818101604052810190620000379190620008f7565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200060f565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c18565b50856007908162000138919062000c18565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d2e565b60a081815250506200018a6001620003506401000000000262002192176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037764010000000002620021b8176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620002556000600260009054906101000a9004600f0b64ffffffffff1660006001620003cb640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d79565b6000677fffffffffffffff8211156200036857600080fd5b6040829060020a029050919050565b60008082600f0b136200038957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b6846200043f640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d56200060f565b620003df6200060f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b60008082600f0b136200045157600080fd5b60008083600f0b90506801000000000000000081126200048d576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004bc576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004e9576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000515576008819060008212600003808260020a82851804189250505090506008820191505b6010811262000540576004819060008212600003808260020a82851804189250505090506004820191505b600481126200056b576002819060008212600003808260020a82851804189250505090506002820191505b600281126200057b576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000602578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005a8565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006b18262000666565b810181811067ffffffffffffffff82111715620006d357620006d262000677565b5b80604052505050565b6000620006e862000648565b9050620006f68282620006a6565b919050565b600067ffffffffffffffff82111562000719576200071862000677565b5b620007248262000666565b9050602081019050919050565b60005b838110156200075157808201518184015260208101905062000734565b60008484015250505050565b6000620007746200076e84620006fb565b620006dc565b90508281526020810184848401111562000793576200079262000661565b5b620007a084828562000731565b509392505050565b600082601f830112620007c057620007bf6200065c565b5b8151620007d28482602086016200075d565b91505092915050565b600060ff82169050919050565b620007f381620007db565b8114620007ff57600080fd5b50565b6000815190506200081381620007e8565b92915050565b600081600f0b9050919050565b620008318162000819565b81146200083d57600080fd5b50565b600081519050620008518162000826565b92915050565b6000819050919050565b6200086c8162000857565b81146200087857600080fd5b50565b6000815190506200088c8162000861565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008bf8262000892565b9050919050565b620008d181620008b2565b8114620008dd57600080fd5b50565b600081519050620008f181620008c6565b92915050565b60008060008060008060c0878903121562000917576200091662000652565b5b600087015167ffffffffffffffff81111562000938576200093762000657565b5b6200094689828a01620007a8565b965050602087015167ffffffffffffffff8111156200096a576200096962000657565b5b6200097889828a01620007a8565b95505060406200098b89828a0162000802565b94505060606200099e89828a0162000840565b9350506080620009b189828a016200087b565b92505060a0620009c489828a01620008e0565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a2457607f821691505b60208210810362000a3a5762000a39620009dc565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000aa77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a65565b62000ab3868362000a65565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000af662000af062000aea8462000857565b62000acb565b62000857565b9050919050565b6000819050919050565b62000b128362000ad5565b62000b2a62000b218262000afd565b84845462000a75565b825550505050565b600090565b62000b4162000b32565b62000b4e81848462000b07565b505050565b5b8181101562000b765762000b6a60008262000b37565b60018101905062000b54565b5050565b601f82111562000bc55762000b8f8162000a40565b62000b9a8462000a55565b8101602085101562000baa578190505b62000bc262000bb98562000a55565b83018262000b53565b50505b505050565b60008160020a8304905092915050565b600062000bed6000198460080262000bca565b1980831691505092915050565b600062000c08838362000bda565b9150826002028217905092915050565b62000c2382620009d1565b67ffffffffffffffff81111562000c3f5762000c3e62000677565b5b62000c4b825462000a0b565b62000c5882828562000b7a565b600060209050601f83116001811462000c90576000841562000c7b578287015190505b62000c87858262000bfa565b86555062000cf7565b601f19841662000ca08662000a40565b60005b8281101562000cca5784890151825560018201915060208501945060208101905062000ca3565b8683101562000cea578489015162000ce6601f89168262000bda565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d3b8262000857565b915062000d488362000857565b925082820262000d588162000857565b9150828204841483151762000d725762000d7162000cff565b5b5092915050565b60805160a0516141f762000dbb600039600081816115d401528181611e530152611ff801526000818161160001528181612019015261205e01526141f76000f3fe608060405234801561001057600080fd5b50600436106102a7576000357c010000000000000000000000000000000000000000000000000000000090048063731f237c11610179578063983b2d56116100eb578063d4792037116100a4578063d4792037146108c0578063d89135cd146108f0578063e80952951461090e578063eda4e6d61461092c578063f2fde38b1461094a578063f83da35d1461097a576102a7565b8063983b2d56146107c4578063a457c2d7146107f4578063a9059cbb14610824578063b470aade14610854578063c0ab707714610872578063d340ef8a146108a2576102a7565b80638b8ff2d61161013d5780638b8ff2d6146107025780638da5cb5b146107325780638f0b2d5d146107505780638f1df6bc1461076c57806394c8a69a1461077657806395d89b41146107a6576102a7565b8063731f237c1461066c57806373f425611461068a57806374bedb95146106a857806379ba5097146106c657806384dde4af146106e4576102a7565b8063313ce5671161021d5780634abfbba2116101d65780634abfbba21461055e57806351b4541c1461058e57806358b2833b146105be5780636787a9be146105dc5780636a2d094e1461060c57806370a082311461063c576102a7565b8063313ce56714610462578063395093511461048057806340452d91146104b057806342966c68146104e2578063449a52f8146104fe57806347a505171461052e576102a7565b806318160ddd1161026f57806318160ddd146103785780631989c6a814610396578063229ba197146103b457806323b872dd146103d25780633092afd5146104025780633133348714610432576102a7565b806301ffc9a7146102ac57806306fdde03146102dc578063095ea7b3146102fa57806309f28f3c1461032a57806310a10f3714610348575b600080fd5b6102c660048036038101906102c191906137ee565b6109aa565b6040516102d39190613836565b60405180910390f35b6102e4610b50565b6040516102f191906138e1565b60405180910390f35b610314600480360381019061030f9190613997565b610bde565b6040516103219190613836565b60405180910390f35b610332610dae565b60405161033f91906139f3565b60405180910390f35b610362600480360381019061035d9190613bac565b610dc1565b60405161036f9190613be8565b60405180910390f35b610380610dd5565b60405161038d9190613be8565b60405180910390f35b61039e610dec565b6040516103ab9190613be8565b60405180910390f35b6103bc610df8565b6040516103c991906139f3565b60405180910390f35b6103ec60048036038101906103e79190613c03565b610e0b565b6040516103f99190613836565b60405180910390f35b61041c60048036038101906104179190613c56565b610fbd565b6040516104299190613836565b60405180910390f35b61044c60048036038101906104479190613c83565b6110b0565b6040516104599190613be8565b60405180910390f35b61046a61111c565b6040516104779190613be8565b60405180910390f35b61049a60048036038101906104959190613997565b611122565b6040516104a79190613836565b60405180910390f35b6104ca60048036038101906104c59190613cc3565b6112b7565b6040516104d993929190613d1d565b60405180910390f35b6104fc60048036038101906104f79190613cc3565b611323565b005b61051860048036038101906105139190613997565b611448565b6040516105259190613836565b60405180910390f35b61054860048036038101906105439190613c56565b611587565b6040516105559190613be8565b60405180910390f35b61057860048036038101906105739190613cc3565b6115d0565b6040516105859190613be8565b60405180910390f35b6105a860048036038101906105a39190613cc3565b611630565b6040516105b59190613be8565b60405180910390f35b6105c6611651565b6040516105d39190613be8565b60405180910390f35b6105f660048036038101906105f19190613cc3565b611657565b6040516106039190613be8565b60405180910390f35b61062660048036038101906106219190613cc3565b611698565b6040516106339190613be8565b60405180910390f35b61065660048036038101906106519190613c56565b6116b9565b6040516106639190613be8565b60405180910390f35b610674611720565b6040516106819190613be8565b60405180910390f35b610692611731565b60405161069f9190613be8565b60405180910390f35b6106b0611737565b6040516106bd9190613be8565b60405180910390f35b6106ce61173d565b6040516106db9190613836565b60405180910390f35b6106ec6118e4565b6040516106f99190613d63565b60405180910390f35b61071c60048036038101906107179190613bac565b61190a565b6040516107299190613be8565b60405180910390f35b61073a61191f565b6040516107479190613d63565b60405180910390f35b61076a60048036038101906107659190613c56565b611945565b005b6107746119e3565b005b610790600480360381019061078b9190613bac565b6119ee565b60405161079d9190613836565b60405180910390f35b6107ae611a53565b6040516107bb91906138e1565b60405180910390f35b6107de60048036038101906107d99190613c56565b611ae1565b6040516107eb9190613836565b60405180910390f35b61080e60048036038101906108099190613997565b611b9e565b60405161081b9190613836565b60405180910390f35b61083e60048036038101906108399190613997565b611dbc565b60405161084b9190613836565b60405180910390f35b61085c611e51565b6040516108699190613be8565b60405180910390f35b61088c60048036038101906108879190613cc3565b611e75565b6040516108999190613be8565b60405180910390f35b6108aa611fc9565b6040516108b79190613be8565b60405180910390f35b6108da60048036038101906108d59190613bac565b611fcf565b6040516108e79190613be8565b60405180910390f35b6108f8611fe8565b6040516109059190613be8565b60405180910390f35b610916611ff2565b6040516109239190613da9565b60405180910390f35b61093461205c565b6040516109419190613be8565b60405180910390f35b610964600480360381019061095f9190613c56565b612080565b6040516109719190613836565b60405180910390f35b610994600480360381019061098f9190613dc4565b612122565b6040516109a19190613e9a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036109fe5760019050610b4b565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a505760019050610b4b565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610aa25760019050610b4b565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610af45760019050610b4b565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b465760019050610b4b565b600090505b919050565b60068054610b5d90613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8990613ee4565b8015610bd65780601f10610bab57610100808354040283529160200191610bd6565b820191906000526020600020905b815481529060010190602001808311610bb957829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610caa5760008314610ca9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca090613f61565b60405180910390fd5b5b610cb26119e3565b610cbb83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610d9b9190613be8565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b6000816000015163ffffffff169050919050565b6000600c54600954610de79190613fb0565b905090565b60008080549050905090565b600d60009054906101000a9004600f0b81565b6000806000610e186119e3565b610e2184611657565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610eac57600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f389190613fb0565b92505081905550610f4a8686846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051610fa99190613be8565b60405180910390a380925050509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061104657503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61104f57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806110bf86612192565b92506110ca85612192565b91506110e5600d60009054906101000a9004600f0b8361221f565b90506110f08161229e565b90506110fc838261221f565b90506111078161232b565b67ffffffffffffffff16935050505092915050565b60085481565b60008061112d6119e3565b61113683611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111c49190613fe4565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516112a49190613be8565b60405180910390a3600191505092915050565b600081815481106112c757600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900464ffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661137957600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156113c557600080fd5b60006113d082611657565b90506113dc3382612360565b5081600c60008282546113ef9190613fe4565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161143c9190613be8565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce90614064565b60405180910390fd5b6114df6119e3565b6114e883611657565b905082600960008282546114fc9190613fe4565b9250508190555061150d8482612467565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161156b9190613be8565b60405180910390a361157b61252b565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826115fe9190614084565b7f00000000000000000000000000000000000000000000000000000000000000006116299190613fe4565b9050919050565b6000603c82426116409190613fb0565b61164a91906140f5565b9050919050565b60035481565b60008061167b61166684612192565b600260009054906101000a9004600f0b6126e0565b90506116868161232b565b67ffffffffffffffff16915050919050565b6000603c82426116a89190613fb0565b6116b291906140f5565b9050919050565b6000806000806116d06116cb86611587565b612192565b92506116dd600354611630565b90506116f883600260009054906101000a9004600f0b61221f565b91506117166117068361232b565b67ffffffffffffffff16826110b0565b9350505050919050565b600061172c6000611e75565b905090565b600c5481565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461179a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000816040015164ffffffffff169050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461199f57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6119eb611720565b50565b600080826000015163ffffffff161115611a0b5760009050611a4e565b6000826020015168ffffffffffffffffff161115611a2c5760009050611a4e565b6000826040015164ffffffffff161115611a495760009050611a4e565b600190505b919050565b60078054611a6090613ee4565b80601f0160208091040260200160405190810160405280929190818152602001828054611a8c90613ee4565b8015611ad95780601f10611aae57610100808354040283529160200191611ad9565b820191906000526020600020905b815481529060010190602001808311611abc57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3d57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611baa83611657565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611c3557600080fd5b611c3d6119e3565b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cc99190613fb0565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611da99190613be8565b60405180910390a3600191505092915050565b6000806000611dc96119e3565b611dd284611657565b9150611ddf3386846121fa565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051611e3e9190613be8565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000611e88600354611630565b925060008303611e9f576000945050505050611fc4565b600260009054906101000a9004600f0b9050600086118015611ec057508286105b15611ec9578592505b611ed283612192565b9150611eed600d60009054906101000a9004600f0b8361221f565b9350611ef88461229e565b9350611f13600260009054906101000a9004600f0b8561221f565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83611f5b9190614084565b600354611f689190613fe4565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051611fb491906139f3565b60405180910390a4829450505050505b919050565b600a5481565b6000816020015168ffffffffffffffffff169050919050565b6000600c54905090565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426120439190613fb0565b61204d91906140f5565b6120579190613fe4565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146120dc57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b61212a61374e565b61213261374e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505084816040019064ffffffffff16908164ffffffffff168152505080915050949350505050565b6000677fffffffffffffff8211156121a957600080fd5b6040829060020a029050919050565b60008082600f0b136121c957600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6121e58461276c565b600f0b02908060020a82049150509050919050565b6000806122078584612360565b506122128484612467565b5060019150509392505050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561228b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61229457600080fd5b8091505092915050565b60006840000000000000000082600f0b126122b857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156122ec5760009050612326565b6123236080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050612932565b90505b919050565b60008082600f0b121561233d57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036123bc5760009350505050612461565b6123c586611587565b92508483101561240a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240190614172565b60405180910390fd5b84836124169190613fb0565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036124c35760009350505050612525565b6124cc86611587565b925084836124da9190613fe4565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061253561374e565b600061253f610dd5565b9050600060016000805490506125559190613fb0565b8154811061256657612565614192565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506126389190613fb0565b8154811061264957612648614192565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548164ffffffffff021916908364ffffffffff16021790555090505060019250505090565b60008082600f0b036126f157600080fd5b600082600f0b604085600f0b9060020a02816127105761270f6140c6565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561275957506f7fffffffffffffffffffffffffffffff600f0b8113155b61276257600080fd5b8091505092915050565b60008082600f0b1361277d57600080fd5b60008083600f0b90506801000000000000000081126127b8576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126127e6576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612812576010819060008212600003808260020a82851804189250505090506010820191505b610100811261283d576008819060008212600003808260020a82851804189250505090506008820191505b60108112612867576004819060008212600003808260020a82851804189250505090506004820191505b60048112612891576002819060008212600003808260020a82851804189250505090506002820191505b600281126128a0576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315612925578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506128cd565b5081945050505050919050565b60006840000000000000000082600f0b1261294c57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156129805760009050613749565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156129ce57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315612a075760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315612a405760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315612a7957608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315612ab25760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315612aeb576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315612b2457608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315612b5d576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315612b9557608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315612bcd5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315612c05576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315612c3d5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315612c75576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315612cad57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315612ce55760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315612d1d57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315612d545760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315612d8b576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315612dc257608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315612df9576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315612e3057608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315612e675760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315612e9e576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315612ed55760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315612f0b576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315612f4157608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315612f775760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315612fad57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315612fe35760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613019576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561304f57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613085576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156130ba57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156130ef5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613124576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156131595760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561318e576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156131c357608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156131f85760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561322d57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156132615760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613295576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156132c957608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156132fd576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561333157608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156133655760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613399576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156133cd5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613400576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561343357608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156134665760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561349957608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156134cc5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156134ff576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561353257608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613565576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561359757608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156135c95760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156135fb576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561362d5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561365f576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561369157608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156136c35760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156136f557608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561374457600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600064ffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6137cb81613796565b81146137d657600080fd5b50565b6000813590506137e8816137c2565b92915050565b60006020828403121561380457613803613791565b5b6000613812848285016137d9565b91505092915050565b60008115159050919050565b6138308161381b565b82525050565b600060208201905061384b6000830184613827565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561388b578082015181840152602081019050613870565b60008484015250505050565b6000601f19601f8301169050919050565b60006138b382613851565b6138bd818561385c565b93506138cd81856020860161386d565b6138d681613897565b840191505092915050565b600060208201905081810360008301526138fb81846138a8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061392e82613903565b9050919050565b61393e81613923565b811461394957600080fd5b50565b60008135905061395b81613935565b92915050565b6000819050919050565b61397481613961565b811461397f57600080fd5b50565b6000813590506139918161396b565b92915050565b600080604083850312156139ae576139ad613791565b5b60006139bc8582860161394c565b92505060206139cd85828601613982565b9150509250929050565b600081600f0b9050919050565b6139ed816139d7565b82525050565b6000602082019050613a0860008301846139e4565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4b82613897565b810181811067ffffffffffffffff82111715613a6a57613a69613a13565b5b80604052505050565b6000613a7d613787565b9050613a898282613a42565b919050565b600063ffffffff82169050919050565b613aa781613a8e565b8114613ab257600080fd5b50565b600081359050613ac481613a9e565b92915050565b600068ffffffffffffffffff82169050919050565b613ae881613aca565b8114613af357600080fd5b50565b600081359050613b0581613adf565b92915050565b600064ffffffffff82169050919050565b613b2581613b0b565b8114613b3057600080fd5b50565b600081359050613b4281613b1c565b92915050565b600060608284031215613b5e57613b5d613a0e565b5b613b686060613a73565b90506000613b7884828501613ab5565b6000830152506020613b8c84828501613af6565b6020830152506040613ba084828501613b33565b60408301525092915050565b600060608284031215613bc257613bc1613791565b5b6000613bd084828501613b48565b91505092915050565b613be281613961565b82525050565b6000602082019050613bfd6000830184613bd9565b92915050565b600080600060608486031215613c1c57613c1b613791565b5b6000613c2a8682870161394c565b9350506020613c3b8682870161394c565b9250506040613c4c86828701613982565b9150509250925092565b600060208284031215613c6c57613c6b613791565b5b6000613c7a8482850161394c565b91505092915050565b60008060408385031215613c9a57613c99613791565b5b6000613ca885828601613982565b9250506020613cb985828601613982565b9150509250929050565b600060208284031215613cd957613cd8613791565b5b6000613ce784828501613982565b91505092915050565b613cf981613a8e565b82525050565b613d0881613aca565b82525050565b613d1781613b0b565b82525050565b6000606082019050613d326000830186613cf0565b613d3f6020830185613cff565b613d4c6040830184613d0e565b949350505050565b613d5d81613923565b82525050565b6000602082019050613d786000830184613d54565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b613da381613d7e565b82525050565b6000602082019050613dbe6000830184613d9a565b92915050565b60008060008060808587031215613dde57613ddd613791565b5b6000613dec87828801613982565b9450506020613dfd87828801613982565b9350506040613e0e87828801613982565b9250506060613e1f87828801613982565b91505092959194509250565b613e3481613a8e565b82525050565b613e4381613aca565b82525050565b613e5281613b0b565b82525050565b606082016000820151613e6e6000850182613e2b565b506020820151613e816020850182613e3a565b506040820151613e946040850182613e49565b50505050565b6000606082019050613eaf6000830184613e58565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613efc57607f821691505b602082108103613f0f57613f0e613eb5565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000613f4b600a8361385c565b9150613f5682613f15565b602082019050919050565b60006020820190508181036000830152613f7a81613f3e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613fbb82613961565b9150613fc683613961565b9250828203905081811115613fde57613fdd613f81565b5b92915050565b6000613fef82613961565b9150613ffa83613961565b925082820190508082111561401257614011613f81565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061404e600a8361385c565b915061405982614018565b602082019050919050565b6000602082019050818103600083015261407d81614041565b9050919050565b600061408f82613961565b915061409a83613961565b92508282026140a881613961565b915082820484148315176140bf576140be613f81565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061410082613961565b915061410b83613961565b92508261411b5761411a6140c6565b5b828204905092915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061415c600d8361385c565b915061416782614126565b602082019050919050565b6000602082019050818103600083015261418b8161414f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220f8be9800a1ef4a4f2ad33ef73ea179ef5a5d6b997ee73427bdf03aa8ae0861e364736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b506040516200578238038062005782833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002564176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e48462000376640100000000026200258a176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516149ae62000dd46000396000818161173d01528181611c9c0152818161221a015261243a0152600081816117690152818161245b01526124a001526149ae6000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613e75565b610a34565b6040516102e99190613ebd565b60405180910390f35b6102fa610bda565b6040516103079190613f68565b60405180910390f35b61032a6004803603810190610325919061401e565b610c68565b6040516103379190613ebd565b60405180910390f35b610348610e39565b604051610355919061407a565b60405180910390f35b610378600480360381019061037391906140c1565b610e4c565b6040516103859190614110565b60405180910390f35b610396610e7f565b6040516103a39190614110565b60405180910390f35b6103b4610e96565b6040516103c19190614110565b60405180910390f35b6103e460048036038101906103df91906142cc565b610ea2565b6040516103f19190614110565b60405180910390f35b610402610ebb565b60405161040f919061407a565b60405180910390f35b610432600480360381019061042d91906142cc565b610ece565b60405161043f9190613ebd565b60405180910390f35b610462600480360381019061045d91906142f9565b610f36565b60405161046f9190613ebd565b60405180910390f35b610492600480360381019061048d91906142cc565b6110e9565b60405161049f919061407a565b60405180910390f35b6104c260048036038101906104bd919061434c565b611121565b6040516104cf9190613ebd565b60405180910390f35b6104f260048036038101906104ed9190614379565b611214565b6040516104ff9190614110565b60405180910390f35b610510611280565b60405161051d9190614110565b60405180910390f35b610540600480360381019061053b919061401e565b611286565b60405161054d9190613ebd565b60405180910390f35b610570600480360381019061056b91906143b9565b61141c565b60405161057f93929190614413565b60405180910390f35b6105a2600480360381019061059d91906143b9565b61148b565b005b6105be60048036038101906105b9919061401e565b6115b0565b6040516105cb9190613ebd565b60405180910390f35b6105ee60048036038101906105e9919061434c565b6116f0565b6040516105fb9190614110565b60405180910390f35b61061e600480360381019061061991906143b9565b611739565b60405161062b9190614110565b60405180910390f35b61064e600480360381019061064991906143b9565b611799565b60405161065b9190614110565b60405180910390f35b61066c6117ba565b6040516106799190614110565b60405180910390f35b61069c600480360381019061069791906143b9565b6117c0565b6040516106a99190614110565b60405180910390f35b6106cc60048036038101906106c791906143b9565b611801565b6040516106d99190614110565b60405180910390f35b6106fc60048036038101906106f7919061434c565b611822565b6040516107099190614110565b60405180910390f35b61071a611889565b6040516107279190614110565b60405180910390f35b61073861189a565b6040516107459190614110565b60405180910390f35b610768600480360381019061076391906142cc565b6118a0565b6040516107759190614110565b60405180910390f35b6107866118ce565b6040516107939190614110565b60405180910390f35b6107a46118d4565b6040516107b19190613ebd565b60405180910390f35b6107c2611a7b565b6040516107cf9190614459565b60405180910390f35b6107e0611aa1565b6040516107ed9190614459565b60405180910390f35b610810600480360381019061080b919061434c565b611ac7565b005b61081a611b65565b6040516108279190613ebd565b60405180910390f35b610838611e18565b6040516108459190613f68565b60405180910390f35b6108686004803603810190610863919061434c565b611ea6565b6040516108759190613ebd565b60405180910390f35b6108986004803603810190610893919061401e565b611f63565b6040516108a59190613ebd565b60405180910390f35b6108c860048036038101906108c3919061401e565b612182565b6040516108d59190613ebd565b60405180910390f35b6108e6612218565b6040516108f39190614110565b60405180910390f35b610916600480360381019061091191906143b9565b61223c565b6040516109239190614110565b60405180910390f35b610934612390565b6040516109419190614110565b60405180910390f35b610952612396565b60405161095f9190614110565b60405180910390f35b610982600480360381019061097d91906142cc565b6123a0565b60405161098f9190614110565b60405180910390f35b6109b260048036038101906109ad9190614474565b6123b4565b6040516109bf919061454a565b60405180910390f35b6109d0612434565b6040516109dd9190614590565b60405180910390f35b6109ee61249e565b6040516109fb9190614110565b60405180910390f35b610a1e6004803603810190610a19919061434c565b6124c2565b604051610a2b9190613ebd565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be7906145da565b80601f0160208091040260200160405190810160405280929190818152602001828054610c13906145da565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614657565b60405180910390fd5b5b610d3c611b65565b50610d46836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e269190614110565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e61610e5b85612564565b846125cc565b9050610e6c8161264b565b67ffffffffffffffff1691505092915050565b6000600c54600954610e9191906146a6565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610eeb5760009050610f31565b6000826020015168ffffffffffffffffff161115610f0c5760009050610f31565b6000826040015167ffffffffffffffff161115610f2c5760009050610f31565b600190505b919050565b6000806000610f43611b65565b50610f4d846117c0565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610fd857600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106491906146a6565b92505081905550611076868684612680565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110d59190614110565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611118576111156001612564565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111aa57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111b357600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061122386612564565b925061122e85612564565b9150611249600d60009054906101000a9004600f0b836125cc565b9050611254816126a5565b905061126083826125cc565b905061126b8161264b565b67ffffffffffffffff16935050505092915050565b60085481565b600080611291611b65565b5061129b836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132991906146da565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516114099190614110565b60405180910390a3600191505092915050565b6000818154811061142c57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114e157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561152d57600080fd5b6000611538826117c0565b90506115443382612732565b5081600c600082825461155791906146da565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115a49190614110565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661163f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116369061475a565b60405180910390fd5b611647611b65565b50611651836117c0565b9050826009600082825461166591906146da565b925050819055506116768482612839565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116d49190614110565b60405180910390a36116e46128fd565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611767919061477a565b7f000000000000000000000000000000000000000000000000000000000000000061179291906146da565b9050919050565b6000603c82426117a991906146a6565b6117b391906147eb565b9050919050565b60035481565b6000806117e46117cf84612564565b600260009054906101000a9004600f0b612ac1565b90506117ef8161264b565b67ffffffffffffffff16915050919050565b6000603c824261181191906146a6565b61181b91906147eb565b9050919050565b600080600080611839611834866116f0565b612564565b9250611846600354611799565b905061186183600260009054906101000a9004600f0b6125cc565b915061187f61186f8361264b565b67ffffffffffffffff1682611214565b9350505050919050565b6000611895600061223c565b905090565b600c5481565b60008060006118ae84610ea2565b91506118b9846110e9565b90506118c58282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b2157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b6f613dd2565b611b77613dd2565b611b7f613dd2565b6000806000806000611b8f611889565b50611b98612b4d565b9750611ba388610ece565b15611bb957600098505050505050505050611e15565b6000600a5481548110611bcf57611bce61481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c7c886123a0565b9450600185611c8b91906146da565b9050611c96866110e9565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611cc591906147eb565b9150611ce8600d60009054906101000a9004600f0b611ce384612564565b6125cc565b9250611cf3836126a5565b84611cfe919061484b565b9250611d14600084611d0e610e7f565b846123b4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611dd087612ce3565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e009190614110565b60405180910390a16001985050505050505050505b90565b60078054611e25906145da565b80601f0160208091040260200160405190810160405280929190818152602001828054611e51906145da565b8015611e9e5780601f10611e7357610100808354040283529160200191611e9e565b820191906000526020600020905b815481529060010190602001808311611e8157829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0257600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f6f836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611ffa57600080fd5b612002611b65565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208f91906146a6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161216f9190614110565b60405180910390a3600191505092915050565b600080600061218f611b65565b50612199846117c0565b91506121a6338684612680565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516122059190614110565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600061224f600354611799565b92506000830361226657600094505050505061238b565b600260009054906101000a9004600f0b905060008611801561228757508286105b15612290578592505b61229983612564565b91506122b4600d60009054906101000a9004600f0b836125cc565b93506122bf846126a5565b93506122da600260009054906101000a9004600f0b856125cc565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612322919061477a565b60035461232f91906146da565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161237b919061407a565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123bc613dd2565b6123c4613dd2565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004261248591906146a6565b61248f91906147eb565b61249991906146da565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561257b57600080fd5b6040829060020a029050919050565b60008082600f0b1361259b57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125b784612df0565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263857506f7fffffffffffffffffffffffffffffff600f0b8113155b61264157600080fd5b8091505092915050565b60008082600f0b121561265d57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061268d8584612732565b506126988484612839565b5060019150509392505050565b60006840000000000000000082600f0b126126bf57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156126f3576000905061272d565b61272a6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050612fb6565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361278e5760009350505050612833565b612797866116f0565b9250848310156127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d3906148ff565b60405180910390fd5b84836127e891906146a6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361289557600093505050506128f7565b61289e866116f0565b925084836128ac91906146da565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612907613dd2565b6000612911610e7f565b90506000600160008054905061292791906146a6565b815481106129385761293761481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a1391906146a6565b81548110612a2457612a2361481c565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612ad257600080fd5b600082600f0b604085600f0b9060020a0281612af157612af06147bc565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612b3a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612b4357600080fd5b8091505092915050565b612b55613dd2565b612b5d613dd2565b612b65613dd2565b600080600a5481548110612b7c57612b7b61481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab919061494b565b6fffffffffffffffffffffffffffffffff169050612cc8836123a0565b8111612cd957819350505050612ce0565b8293505050505b90565b6000806000612cf1846118a0565b9150600b54612cff836117c0565b612d0991906146a6565b9050612d37601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612839565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612dab9190614110565b60405180910390a36001600a6000828254612dc691906146da565b9250508190555080600b6000828254612ddf91906146da565b925050819055508192505050919050565b60008082600f0b13612e0157600080fd5b60008083600f0b9050680100000000000000008112612e3c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612e6a576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612e96576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612ec1576008819060008212600003808260020a82851804189250505090506008820191505b60108112612eeb576004819060008212600003808260020a82851804189250505090506004820191505b60048112612f15576002819060008212600003808260020a82851804189250505090506002820191505b60028112612f24576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315612fa9578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612f51565b5081945050505050919050565b60006840000000000000000082600f0b12612fd057600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130045760009050613dcd565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561305257608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561308b5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156130c45760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156130fd57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131365760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b131561316f576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156131a857608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156131e1576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561321957608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132515760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613289576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156132c15760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156132f9576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561333157608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133695760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b13156133a157608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156133d85760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b131561340f576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561344657608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b131561347d576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b13156134b457608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156134eb5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613522576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135595760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561358f576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b13156135c557608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156135fb5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561363157608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136675760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561369d576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156136d357608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613709576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561373e57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156137735760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156137a8576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156137dd5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613812576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561384757608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561387c5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156138b157608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156138e55760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613919576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561394d57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613981576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156139b557608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156139e95760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613a1d576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613a515760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613a84576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613ab757608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613aea5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613b1d57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613b505760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613b83576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613bb657608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613be9576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613c1b57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613c4d5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613c7f576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613cb15760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613ce3576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613d1557608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613d475760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613d7957608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613dc857600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5281613e1d565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613e18565b5b6000613e9984828501613e60565b91505092915050565b60008115159050919050565b613eb781613ea2565b82525050565b6000602082019050613ed26000830184613eae565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f12578082015181840152602081019050613ef7565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f3a82613ed8565b613f448185613ee3565b9350613f54818560208601613ef4565b613f5d81613f1e565b840191505092915050565b60006020820190508181036000830152613f828184613f2f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fb582613f8a565b9050919050565b613fc581613faa565b8114613fd057600080fd5b50565b600081359050613fe281613fbc565b92915050565b6000819050919050565b613ffb81613fe8565b811461400657600080fd5b50565b60008135905061401881613ff2565b92915050565b6000806040838503121561403557614034613e18565b5b600061404385828601613fd3565b925050602061405485828601614009565b9150509250929050565b600081600f0b9050919050565b6140748161405e565b82525050565b600060208201905061408f600083018461406b565b92915050565b61409e8161405e565b81146140a957600080fd5b50565b6000813590506140bb81614095565b92915050565b600080604083850312156140d8576140d7613e18565b5b60006140e685828601614009565b92505060206140f7858286016140ac565b9150509250929050565b61410a81613fe8565b82525050565b60006020820190506141256000830184614101565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61416882613f1e565b810181811067ffffffffffffffff8211171561418757614186614130565b5b80604052505050565b600061419a613e0e565b90506141a6828261415f565b919050565b600063ffffffff82169050919050565b6141c4816141ab565b81146141cf57600080fd5b50565b6000813590506141e1816141bb565b92915050565b600068ffffffffffffffffff82169050919050565b614205816141e7565b811461421057600080fd5b50565b600081359050614222816141fc565b92915050565b600067ffffffffffffffff82169050919050565b61424581614228565b811461425057600080fd5b50565b6000813590506142628161423c565b92915050565b60006060828403121561427e5761427d61412b565b5b6142886060614190565b90506000614298848285016141d2565b60008301525060206142ac84828501614213565b60208301525060406142c084828501614253565b60408301525092915050565b6000606082840312156142e2576142e1613e18565b5b60006142f084828501614268565b91505092915050565b60008060006060848603121561431257614311613e18565b5b600061432086828701613fd3565b935050602061433186828701613fd3565b925050604061434286828701614009565b9150509250925092565b60006020828403121561436257614361613e18565b5b600061437084828501613fd3565b91505092915050565b600080604083850312156143905761438f613e18565b5b600061439e85828601614009565b92505060206143af85828601614009565b9150509250929050565b6000602082840312156143cf576143ce613e18565b5b60006143dd84828501614009565b91505092915050565b6143ef816141ab565b82525050565b6143fe816141e7565b82525050565b61440d81614228565b82525050565b600060608201905061442860008301866143e6565b61443560208301856143f5565b6144426040830184614404565b949350505050565b61445381613faa565b82525050565b600060208201905061446e600083018461444a565b92915050565b6000806000806080858703121561448e5761448d613e18565b5b600061449c87828801614009565b94505060206144ad878288016140ac565b93505060406144be87828801614009565b92505060606144cf87828801614009565b91505092959194509250565b6144e4816141ab565b82525050565b6144f3816141e7565b82525050565b61450281614228565b82525050565b60608201600082015161451e60008501826144db565b50602082015161453160208501826144ea565b50604082015161454460408501826144f9565b50505050565b600060608201905061455f6000830184614508565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61458a81614565565b82525050565b60006020820190506145a56000830184614581565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145f257607f821691505b602082108103614605576146046145ab565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614641600a83613ee3565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146b182613fe8565b91506146bc83613fe8565b92508282039050818111156146d4576146d3614677565b5b92915050565b60006146e582613fe8565b91506146f083613fe8565b925082820190508082111561470857614707614677565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614744600a83613ee3565b915061474f8261470e565b602082019050919050565b6000602082019050818103600083015261477381614737565b9050919050565b600061478582613fe8565b915061479083613fe8565b925082820261479e81613fe8565b915082820484148315176147b5576147b4614677565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147f682613fe8565b915061480183613fe8565b925082614811576148106147bc565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148568261405e565b91506148618361405e565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff80000000000000000000000000000000821217156148ad576148ac614677565b5b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006148e9600d83613ee3565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b61492881614565565b811461493357600080fd5b50565b6000815190506149458161491f565b92915050565b60006020828403121561496157614960613e18565b5b600061496f84828501614936565b9150509291505056fea2646970667358221220a9e3443175ce41be43aa23b47125e748c6e2ef68ed49a2c95e7a6fd161f9c0b164736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 927d32d..34749c9 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_foo","type":"bytes32"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"uint256","name":"_demurrageModifierPpm","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint40","name":"demurrage","type":"uint40"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 75e1426..d102a79 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -29,6 +29,28 @@ from erc20_demurrage_token.fixed import from_fixed logg = logging.getLogger(__name__) +class DemurrageRedistribution: + + def __init__(self, v): + d = ABIContractDecoder() + v = strip_0x(v) + d.typ(ABIContractType.UINT256) + d.typ(ABIContractType.UINT256) + d.typ(ABIContractType.BYTES32) + d.val(v[:64]) + d.val(v[64:128]) + d.val(v[128:192]) + r = d.decode() + + self.period = r[0] + self.value = r[1] + self.demurrage = from_fixed(r[2]) + + + def __str__(self): + return 'period {} value {} demurrage {}'.format(self.period, self.value, self.demurrage) + + class DemurrageTokenSettings: def __init__(self): @@ -315,7 +337,7 @@ class DemurrageToken(ERC20): enc = ABIContractEncoder() enc.method('toRedistributionPeriod') v = strip_0x(redistribution) - enc.typ_literal('(uint32,uint72,uint104)') + enc.typ_literal('(uint32,uint72,uint64)') enc.bytes32(v[:64]) enc.bytes32(v[64:128]) enc.bytes32(v[128:192]) @@ -356,7 +378,7 @@ class DemurrageToken(ERC20): enc = ABIContractEncoder() enc.method('toRedistributionSupply') v = strip_0x(redistribution) - enc.typ_literal('(uint32,uint72,uint104)') + enc.typ_literal('(uint32,uint72,uint64)') enc.bytes32(v[:64]) enc.bytes32(v[64:128]) enc.bytes32(v[128:192]) @@ -376,7 +398,7 @@ class DemurrageToken(ERC20): enc = ABIContractEncoder() enc.method('toRedistributionDemurrageModifier') v = strip_0x(redistribution) - enc.typ_literal('(uint32,uint72,uint104)') + enc.typ_literal('(uint32,uint72,uint64)') enc.bytes32(v[:64]) enc.bytes32(v[64:128]) enc.bytes32(v[128:192]) @@ -580,16 +602,18 @@ class DemurrageToken(ERC20): @classmethod def parse_redistributions(self, v): - d = ABIContractDecoder() - v = strip_0x(v) - d.typ(ABIContractType.BYTES32) - d.typ(ABIContractType.BYTES32) - d.typ(ABIContractType.BYTES32) - d.val(v[:64]) - d.val(v[64:128]) - d.val(v[128:192]) - r = d.decode() - return ''.join(r) + return strip_0x(v) + #return DemurrageRedistribution(v) +# d = ABIContractDecoder() +# v = strip_0x(v) +# d.typ(ABIContractType.BYTES32) +# d.typ(ABIContractType.BYTES32) +# d.typ(ABIContractType.BYTES32) +# d.val(v[:64]) +# d.val(v[64:128]) +# d.val(v[128:192]) +# r = d.decode() +# return ''.join(r) @classmethod @@ -640,3 +664,4 @@ class DemurrageToken(ERC20): @classmethod def parse_total_burned(self, v): return abi_decode_single(ABIContractType.UINT256, v) + diff --git a/python/tests/test_period.py b/python/tests/test_period.py index 53c9d24..4ff5457 100644 --- a/python/tests/test_period.py +++ b/python/tests/test_period.py @@ -19,9 +19,10 @@ from chainlib.eth.contract import ( # local imports from erc20_demurrage_token import DemurrageToken +from erc20_demurrage_token.token import DemurrageRedistribution # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -57,15 +58,6 @@ class TestPeriod(TestDemurrageDefault): period = c.parse_to_redistribution_period(r) self.assertEqual(2, period) - o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) - r = self.rpc.do(o) - redistribution = c.parse_redistributions(r) - - o = c.to_redistribution_period(self.address, redistribution, sender_address=self.accounts[0]) - r = self.rpc.do(o) - period = c.parse_to_redistribution_period(r) - self.assertEqual(2, period) - o = c.actual_period(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) period = c.parse_actual_period(r) @@ -74,6 +66,7 @@ class TestPeriod(TestDemurrageDefault): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) period = c.parse_to_redistribution_item(r) + redistro = DemurrageRedistribution(redistribution) # allow test code float rounding error to billionth modifier = (1 - (self.tax_level / 1000000)) ** (self.period_seconds / 60) diff --git a/python/tests/test_single.py b/python/tests/test_single.py index b1250e4..508ca07 100644 --- a/python/tests/test_single.py +++ b/python/tests/test_single.py @@ -18,7 +18,8 @@ from hexathon import ( from erc20_demurrage_token import DemurrageToken # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageSingle +from erc20_demurrage_token.unittest import TestDemurrageDefault +from erc20_demurrage_token.fixed import to_fixed logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -26,11 +27,9 @@ logg = logging.getLogger() testdir = os.path.dirname(__file__) -class TestRedistributionSingle(TestDemurrageSingle): - +class TestRedistributionSingle(TestDemurrageDefault): def test_single_even_if_multiple(self): - mint_amount = 100000000 nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) @@ -64,7 +63,7 @@ class TestRedistributionSingle(TestDemurrageSingle): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - tax_modifier = (1 - (self.tax_level / 1000000)) ** 10 + tax_modifier = 0.98 o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index af463a0..4bfb278 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -9,7 +9,7 @@ contract DemurrageTokenSingleCap { struct redistributionItem { uint32 period; uint72 value; - uint40 demurrage; + uint64 demurrage; } redistributionItem[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) @@ -99,7 +99,8 @@ contract DemurrageTokenSingleCap { event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value); // Temporary event used in development, will be removed on prod - event Debug(bytes32 _foo); + //event Debug(bytes32 _foo); + event Debug(int128 indexed _foo, uint256 indexed _bar); // Emitted when tokens are burned event Burn(address indexed _burner, uint256 _value); @@ -128,9 +129,8 @@ contract DemurrageTokenSingleCap { periodDuration = _periodMinutes * 60; demurrageAmount = ABDKMath64x64.fromUInt(1); - //taxLevel = ABDKMath64x64.mul(ABDKMath64x64.ln(ABDKMath64x64.sub(demurrageAmount, , ABDKMath64x64.fromUInt(_periodMinutes)); taxLevel = ABDKMath64x64.ln(_taxLevel); - initialRedistribution = toRedistribution(0, uint40(uint128(demurrageAmount)), 0, 1); + initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); // Misc settings @@ -170,8 +170,6 @@ contract DemurrageTokenSingleCap { currentDemurragedAmount = ABDKMath64x64.mul(baseBalance, demurrageAmount); return decayBy(ABDKMath64x64.toUInt(currentDemurragedAmount), periodCount); - - //return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); } // Balance unmodified by demurrage @@ -214,10 +212,6 @@ contract DemurrageTokenSingleCap { return true; } - function changePeriod() public { - applyDemurrage(); - } - // Creates new tokens out of thin air, and allocates them to the given address // Triggers tax function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { @@ -235,12 +229,12 @@ contract DemurrageTokenSingleCap { } // Deserializes the redistribution word - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { + function toRedistribution(uint256 _participants, int128 _demurrageModifier, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { redistributionItem memory redistribution; redistribution.period = uint32(_period); redistribution.value = uint72(_value); - redistribution.demurrage = uint40(_demurrageModifierPpm); + redistribution.demurrage = uint64(uint128(_demurrageModifier) & 0xffffffffffffffff); return redistribution; } @@ -256,8 +250,14 @@ contract DemurrageTokenSingleCap { } // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (uint256) { - return uint256(_redistribution.demurrage); + function toRedistributionDemurrageModifier(redistributionItem memory _redistribution) public pure returns (int128) { + int128 r; + + r = int128(int64(_redistribution.demurrage) & int128(0x0000000000000000ffffffffffffffff)); + if (r == 0) { + r = ABDKMath64x64.fromUInt(1); + } + return r; } @@ -284,48 +284,87 @@ contract DemurrageTokenSingleCap { return uint128((block.timestamp - periodStart) / periodDuration + 1); } -// // Retrieve next redistribution if the period threshold has been crossed -// function checkPeriod() private view returns (redistributionItem memory) { -// redistributionItem memory lastRedistribution; -// redistributionItem memory emptyRedistribution; -// uint256 currentPeriod; -// -// lastRedistribution = redistributions[lastPeriod]; -// currentPeriod = this.actualPeriod(); -// if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { -// return emptyRedistribution; -// } -// return lastRedistribution; -// } + // Retrieve next redistribution if the period threshold has been crossed + function checkPeriod() private view returns (redistributionItem memory) { + redistributionItem memory lastRedistribution; + redistributionItem memory emptyRedistribution; + uint256 currentPeriod; + + lastRedistribution = redistributions[lastPeriod]; + currentPeriod = this.actualPeriod(); + if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { + return emptyRedistribution; + } + return lastRedistribution; + } + + function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) { + int128 difference; -// function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { -// uint256 difference; -// // difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); // return difference / resolutionFactor; -// } + difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), _demurrageAmount); + return ABDKMath64x64.toUInt(difference); + //return _supply; + + } -// function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { -// uint256 redistributionSupply; -// uint256 redistributionDemurrage; -// -// redistributionSupply = toRedistributionSupply(_redistribution); -// redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); -// return getDistribution(redistributionSupply, redistributionDemurrage); -// } -// -// // Returns the amount sent to the sink address -// function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { -// uint256 unit; -// uint256 baseUnit; -// -// unit = getDistributionFromRedistribution(_redistribution); -// baseUnit = toBaseAmount(unit) - totalSink; -// increaseBaseBalance(sinkAddress, baseUnit); -// lastPeriod += 1; -// totalSink += baseUnit; -// return unit; -// } + function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { + uint256 redistributionSupply; + int128 redistributionDemurrage; + + redistributionSupply = toRedistributionSupply(_redistribution); + redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); + return getDistribution(redistributionSupply, redistributionDemurrage); + } + + // Returns the amount sent to the sink address + function applyDefaultRedistribution(redistributionItem memory _redistribution) private returns (uint256) { + uint256 unit; + uint256 baseUnit; + + unit = getDistributionFromRedistribution(_redistribution); + baseUnit = toBaseAmount(unit) - totalSink; + increaseBaseBalance(sinkAddress, baseUnit); + emit Redistribution(sinkAddress, _redistribution.period, unit); + lastPeriod += 1; + totalSink += baseUnit; + return unit; + } + + // Recalculate the demurrage modifier for the new period + // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. + function changePeriod() public returns (bool) { + redistributionItem memory currentRedistribution; + redistributionItem memory nextRedistribution; + redistributionItem memory lastRedistribution; + uint256 currentPeriod; + int128 lastDemurrageAmount; + int128 nextRedistributionDemurrage; + uint256 demurrageCounts; + uint256 nextPeriod; + + applyDemurrage(); + currentRedistribution = checkPeriod(); + if (isEmptyRedistribution(currentRedistribution)) { + return false; + } + + // calculate the decay from previous redistributino + lastRedistribution = redistributions[lastPeriod]; + currentPeriod = toRedistributionPeriod(currentRedistribution); + nextPeriod = currentPeriod + 1; + lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); + demurrageCounts = periodDuration / 60; + nextRedistributionDemurrage = ABDKMath64x64.mul(taxLevel, ABDKMath64x64.fromUInt(demurrageCounts)); + nextRedistributionDemurrage = lastDemurrageAmount - ABDKMath64x64.exp(nextRedistributionDemurrage); + nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); + redistributions.push(nextRedistribution); + + applyDefaultRedistribution(nextRedistribution); + emit Period(nextPeriod); + return true; + } // Calculate the time delta in whole minutes passed between given timestamp and current timestamp function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { @@ -388,53 +427,6 @@ contract DemurrageTokenSingleCap { return true; } -// // Recalculate the demurrage modifier for the new period -// // Note that the supply for the consecutive period will be taken at the time of code execution, and thus not necessarily at the time when the redistribution period threshold was crossed. -// function changePeriod() public returns (bool) { -// redistributionItem memory currentRedistribution; -// redistributionItem memory nextRedistribution; -// redistributionItem memory lastRedistribution; -// uint256 currentPeriod; -// uint256 lastDemurrageAmount; -// uint256 nextRedistributionDemurrage; -// uint256 demurrageCounts; -// uint256 nextPeriod; -// -// applyDemurrage(); -// currentRedistribution = checkPeriod(); -// if (isEmptyRedistribution(currentRedistribution)) { -// return false; -// } -// -// // calculate the decay from previous redistributino -// lastRedistribution = redistributions[lastPeriod]; -// currentPeriod = toRedistributionPeriod(currentRedistribution); -// nextPeriod = currentPeriod + 1; -// lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); -// demurrageCounts = periodDuration / 60; -// nextRedistributionDemurrage = decayBy(lastDemurrageAmount, demurrageCounts); -// -// nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); -// redistributions.push(nextRedistribution); -// -// applyDefaultRedistribution(nextRedistribution); -// emit Period(nextPeriod); -// return true; -// } -// -// // Reverse a value reduced by demurrage by the given period to its original value -//// function growBy(uint256 _value, uint256 _period) public view returns (uint256) { -//// uint256 valueFactor; -//// uint256 truncatedTaxLevel; -//// -//// valueFactor = growthResolutionFactor; -//// truncatedTaxLevel = taxLevel / nanoDivider; -//// -//// for (uint256 i = 0; i < _period; i++) { -//// valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); -//// } -//// return (valueFactor * _value) / growthResolutionFactor; -//// } // Calculate a value reduced by demurrage by the given period function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { From 34af3b1b303311e3d9706555dd7099dbbb743410 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 06:21:32 +0000 Subject: [PATCH 19/57] Rehabilitate redistribution unit --- python/erc20_demurrage_token/__init__.py | 1 + .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 10 +++---- .../erc20_demurrage_token/unittest/newbase.py | 11 +++++++ python/tests/test_redistribution_unit.py | 29 ++++++++++--------- solidity/DemurrageTokenSingleNocap.sol | 9 ++---- 7 files changed, 38 insertions(+), 26 deletions(-) diff --git a/python/erc20_demurrage_token/__init__.py b/python/erc20_demurrage_token/__init__.py index 11d46d8..cca6191 100644 --- a/python/erc20_demurrage_token/__init__.py +++ b/python/erc20_demurrage_token/__init__.py @@ -1,4 +1,5 @@ from .token import ( DemurrageToken, DemurrageTokenSettings, + DemurrageRedistribution, ) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 27592f6..da318e5 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b506040516200578238038062005782833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002564176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e48462000376640100000000026200258a176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516149ae62000dd46000396000818161173d01528181611c9c0152818161221a015261243a0152600081816117690152818161245b01526124a001526149ae6000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613e75565b610a34565b6040516102e99190613ebd565b60405180910390f35b6102fa610bda565b6040516103079190613f68565b60405180910390f35b61032a6004803603810190610325919061401e565b610c68565b6040516103379190613ebd565b60405180910390f35b610348610e39565b604051610355919061407a565b60405180910390f35b610378600480360381019061037391906140c1565b610e4c565b6040516103859190614110565b60405180910390f35b610396610e7f565b6040516103a39190614110565b60405180910390f35b6103b4610e96565b6040516103c19190614110565b60405180910390f35b6103e460048036038101906103df91906142cc565b610ea2565b6040516103f19190614110565b60405180910390f35b610402610ebb565b60405161040f919061407a565b60405180910390f35b610432600480360381019061042d91906142cc565b610ece565b60405161043f9190613ebd565b60405180910390f35b610462600480360381019061045d91906142f9565b610f36565b60405161046f9190613ebd565b60405180910390f35b610492600480360381019061048d91906142cc565b6110e9565b60405161049f919061407a565b60405180910390f35b6104c260048036038101906104bd919061434c565b611121565b6040516104cf9190613ebd565b60405180910390f35b6104f260048036038101906104ed9190614379565b611214565b6040516104ff9190614110565b60405180910390f35b610510611280565b60405161051d9190614110565b60405180910390f35b610540600480360381019061053b919061401e565b611286565b60405161054d9190613ebd565b60405180910390f35b610570600480360381019061056b91906143b9565b61141c565b60405161057f93929190614413565b60405180910390f35b6105a2600480360381019061059d91906143b9565b61148b565b005b6105be60048036038101906105b9919061401e565b6115b0565b6040516105cb9190613ebd565b60405180910390f35b6105ee60048036038101906105e9919061434c565b6116f0565b6040516105fb9190614110565b60405180910390f35b61061e600480360381019061061991906143b9565b611739565b60405161062b9190614110565b60405180910390f35b61064e600480360381019061064991906143b9565b611799565b60405161065b9190614110565b60405180910390f35b61066c6117ba565b6040516106799190614110565b60405180910390f35b61069c600480360381019061069791906143b9565b6117c0565b6040516106a99190614110565b60405180910390f35b6106cc60048036038101906106c791906143b9565b611801565b6040516106d99190614110565b60405180910390f35b6106fc60048036038101906106f7919061434c565b611822565b6040516107099190614110565b60405180910390f35b61071a611889565b6040516107279190614110565b60405180910390f35b61073861189a565b6040516107459190614110565b60405180910390f35b610768600480360381019061076391906142cc565b6118a0565b6040516107759190614110565b60405180910390f35b6107866118ce565b6040516107939190614110565b60405180910390f35b6107a46118d4565b6040516107b19190613ebd565b60405180910390f35b6107c2611a7b565b6040516107cf9190614459565b60405180910390f35b6107e0611aa1565b6040516107ed9190614459565b60405180910390f35b610810600480360381019061080b919061434c565b611ac7565b005b61081a611b65565b6040516108279190613ebd565b60405180910390f35b610838611e18565b6040516108459190613f68565b60405180910390f35b6108686004803603810190610863919061434c565b611ea6565b6040516108759190613ebd565b60405180910390f35b6108986004803603810190610893919061401e565b611f63565b6040516108a59190613ebd565b60405180910390f35b6108c860048036038101906108c3919061401e565b612182565b6040516108d59190613ebd565b60405180910390f35b6108e6612218565b6040516108f39190614110565b60405180910390f35b610916600480360381019061091191906143b9565b61223c565b6040516109239190614110565b60405180910390f35b610934612390565b6040516109419190614110565b60405180910390f35b610952612396565b60405161095f9190614110565b60405180910390f35b610982600480360381019061097d91906142cc565b6123a0565b60405161098f9190614110565b60405180910390f35b6109b260048036038101906109ad9190614474565b6123b4565b6040516109bf919061454a565b60405180910390f35b6109d0612434565b6040516109dd9190614590565b60405180910390f35b6109ee61249e565b6040516109fb9190614110565b60405180910390f35b610a1e6004803603810190610a19919061434c565b6124c2565b604051610a2b9190613ebd565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be7906145da565b80601f0160208091040260200160405190810160405280929190818152602001828054610c13906145da565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90614657565b60405180910390fd5b5b610d3c611b65565b50610d46836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e269190614110565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e61610e5b85612564565b846125cc565b9050610e6c8161264b565b67ffffffffffffffff1691505092915050565b6000600c54600954610e9191906146a6565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610eeb5760009050610f31565b6000826020015168ffffffffffffffffff161115610f0c5760009050610f31565b6000826040015167ffffffffffffffff161115610f2c5760009050610f31565b600190505b919050565b6000806000610f43611b65565b50610f4d846117c0565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610fd857600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461106491906146a6565b92505081905550611076868684612680565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110d59190614110565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611118576111156001612564565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111aa57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111b357600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061122386612564565b925061122e85612564565b9150611249600d60009054906101000a9004600f0b836125cc565b9050611254816126a5565b905061126083826125cc565b905061126b8161264b565b67ffffffffffffffff16935050505092915050565b60085481565b600080611291611b65565b5061129b836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461132991906146da565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516114099190614110565b60405180910390a3600191505092915050565b6000818154811061142c57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114e157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561152d57600080fd5b6000611538826117c0565b90506115443382612732565b5081600c600082825461155791906146da565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115a49190614110565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661163f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116369061475a565b60405180910390fd5b611647611b65565b50611651836117c0565b9050826009600082825461166591906146da565b925050819055506116768482612839565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116d49190614110565b60405180910390a36116e46128fd565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611767919061477a565b7f000000000000000000000000000000000000000000000000000000000000000061179291906146da565b9050919050565b6000603c82426117a991906146a6565b6117b391906147eb565b9050919050565b60035481565b6000806117e46117cf84612564565b600260009054906101000a9004600f0b612ac1565b90506117ef8161264b565b67ffffffffffffffff16915050919050565b6000603c824261181191906146a6565b61181b91906147eb565b9050919050565b600080600080611839611834866116f0565b612564565b9250611846600354611799565b905061186183600260009054906101000a9004600f0b6125cc565b915061187f61186f8361264b565b67ffffffffffffffff1682611214565b9350505050919050565b6000611895600061223c565b905090565b600c5481565b60008060006118ae84610ea2565b91506118b9846110e9565b90506118c58282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b2157600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b6f613dd2565b611b77613dd2565b611b7f613dd2565b6000806000806000611b8f611889565b50611b98612b4d565b9750611ba388610ece565b15611bb957600098505050505050505050611e15565b6000600a5481548110611bcf57611bce61481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c7c886123a0565b9450600185611c8b91906146da565b9050611c96866110e9565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611cc591906147eb565b9150611ce8600d60009054906101000a9004600f0b611ce384612564565b6125cc565b9250611cf3836126a5565b84611cfe919061484b565b9250611d14600084611d0e610e7f565b846123b4565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611dd087612ce3565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e009190614110565b60405180910390a16001985050505050505050505b90565b60078054611e25906145da565b80601f0160208091040260200160405190810160405280929190818152602001828054611e51906145da565b8015611e9e5780601f10611e7357610100808354040283529160200191611e9e565b820191906000526020600020905b815481529060010190602001808311611e8157829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f0257600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f6f836117c0565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015611ffa57600080fd5b612002611b65565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461208f91906146a6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161216f9190614110565b60405180910390a3600191505092915050565b600080600061218f611b65565b50612199846117c0565b91506121a6338684612680565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516122059190614110565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600061224f600354611799565b92506000830361226657600094505050505061238b565b600260009054906101000a9004600f0b905060008611801561228757508286105b15612290578592505b61229983612564565b91506122b4600d60009054906101000a9004600f0b836125cc565b93506122bf846126a5565b93506122da600260009054906101000a9004600f0b856125cc565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612322919061477a565b60035461232f91906146da565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161237b919061407a565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123bc613dd2565b6123c4613dd2565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004261248591906146a6565b61248f91906147eb565b61249991906146da565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461251e57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561257b57600080fd5b6040829060020a029050919050565b60008082600f0b1361259b57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125b784612df0565b600f0b02908060020a82049150509050919050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263857506f7fffffffffffffffffffffffffffffff600f0b8113155b61264157600080fd5b8091505092915050565b60008082600f0b121561265d57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061268d8584612732565b506126988484612839565b5060019150509392505050565b60006840000000000000000082600f0b126126bf57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156126f3576000905061272d565b61272a6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050612fb6565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361278e5760009350505050612833565b612797866116f0565b9250848310156127dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127d3906148ff565b60405180910390fd5b84836127e891906146a6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361289557600093505050506128f7565b61289e866116f0565b925084836128ac91906146da565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612907613dd2565b6000612911610e7f565b90506000600160008054905061292791906146a6565b815481106129385761293761481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a1391906146a6565b81548110612a2457612a2361481c565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612ad257600080fd5b600082600f0b604085600f0b9060020a0281612af157612af06147bc565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612b3a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612b4357600080fd5b8091505092915050565b612b55613dd2565b612b5d613dd2565b612b65613dd2565b600080600a5481548110612b7c57612b7b61481c565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612c87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cab919061494b565b6fffffffffffffffffffffffffffffffff169050612cc8836123a0565b8111612cd957819350505050612ce0565b8293505050505b90565b6000806000612cf1846118a0565b9150600b54612cff836117c0565b612d0991906146a6565b9050612d37601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612839565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612dab9190614110565b60405180910390a36001600a6000828254612dc691906146da565b9250508190555080600b6000828254612ddf91906146da565b925050819055508192505050919050565b60008082600f0b13612e0157600080fd5b60008083600f0b9050680100000000000000008112612e3c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612e6a576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612e96576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612ec1576008819060008212600003808260020a82851804189250505090506008820191505b60108112612eeb576004819060008212600003808260020a82851804189250505090506004820191505b60048112612f15576002819060008212600003808260020a82851804189250505090506002820191505b60028112612f24576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315612fa9578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612f51565b5081945050505050919050565b60006840000000000000000082600f0b12612fd057600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130045760009050613dcd565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561305257608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561308b5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156130c45760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156130fd57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131365760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b131561316f576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156131a857608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156131e1576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561321957608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132515760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613289576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156132c15760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156132f9576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b131561333157608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133695760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b13156133a157608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b13156133d85760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b131561340f576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b131561344657608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b131561347d576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b13156134b457608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b13156134eb5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613522576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135595760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b131561358f576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b13156135c557608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156135fb5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561363157608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136675760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b131561369d576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156136d357608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613709576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561373e57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156137735760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156137a8576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156137dd5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613812576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561384757608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561387c5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156138b157608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156138e55760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613919576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561394d57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613981576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156139b557608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156139e95760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613a1d576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613a515760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613a84576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613ab757608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613aea5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613b1d57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613b505760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613b83576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613bb657608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613be9576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613c1b57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613c4d5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613c7f576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613cb15760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613ce3576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613d1557608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613d475760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613d7957608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613dc857600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613e5281613e1d565b8114613e5d57600080fd5b50565b600081359050613e6f81613e49565b92915050565b600060208284031215613e8b57613e8a613e18565b5b6000613e9984828501613e60565b91505092915050565b60008115159050919050565b613eb781613ea2565b82525050565b6000602082019050613ed26000830184613eae565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f12578082015181840152602081019050613ef7565b60008484015250505050565b6000601f19601f8301169050919050565b6000613f3a82613ed8565b613f448185613ee3565b9350613f54818560208601613ef4565b613f5d81613f1e565b840191505092915050565b60006020820190508181036000830152613f828184613f2f565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613fb582613f8a565b9050919050565b613fc581613faa565b8114613fd057600080fd5b50565b600081359050613fe281613fbc565b92915050565b6000819050919050565b613ffb81613fe8565b811461400657600080fd5b50565b60008135905061401881613ff2565b92915050565b6000806040838503121561403557614034613e18565b5b600061404385828601613fd3565b925050602061405485828601614009565b9150509250929050565b600081600f0b9050919050565b6140748161405e565b82525050565b600060208201905061408f600083018461406b565b92915050565b61409e8161405e565b81146140a957600080fd5b50565b6000813590506140bb81614095565b92915050565b600080604083850312156140d8576140d7613e18565b5b60006140e685828601614009565b92505060206140f7858286016140ac565b9150509250929050565b61410a81613fe8565b82525050565b60006020820190506141256000830184614101565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61416882613f1e565b810181811067ffffffffffffffff8211171561418757614186614130565b5b80604052505050565b600061419a613e0e565b90506141a6828261415f565b919050565b600063ffffffff82169050919050565b6141c4816141ab565b81146141cf57600080fd5b50565b6000813590506141e1816141bb565b92915050565b600068ffffffffffffffffff82169050919050565b614205816141e7565b811461421057600080fd5b50565b600081359050614222816141fc565b92915050565b600067ffffffffffffffff82169050919050565b61424581614228565b811461425057600080fd5b50565b6000813590506142628161423c565b92915050565b60006060828403121561427e5761427d61412b565b5b6142886060614190565b90506000614298848285016141d2565b60008301525060206142ac84828501614213565b60208301525060406142c084828501614253565b60408301525092915050565b6000606082840312156142e2576142e1613e18565b5b60006142f084828501614268565b91505092915050565b60008060006060848603121561431257614311613e18565b5b600061432086828701613fd3565b935050602061433186828701613fd3565b925050604061434286828701614009565b9150509250925092565b60006020828403121561436257614361613e18565b5b600061437084828501613fd3565b91505092915050565b600080604083850312156143905761438f613e18565b5b600061439e85828601614009565b92505060206143af85828601614009565b9150509250929050565b6000602082840312156143cf576143ce613e18565b5b60006143dd84828501614009565b91505092915050565b6143ef816141ab565b82525050565b6143fe816141e7565b82525050565b61440d81614228565b82525050565b600060608201905061442860008301866143e6565b61443560208301856143f5565b6144426040830184614404565b949350505050565b61445381613faa565b82525050565b600060208201905061446e600083018461444a565b92915050565b6000806000806080858703121561448e5761448d613e18565b5b600061449c87828801614009565b94505060206144ad878288016140ac565b93505060406144be87828801614009565b92505060606144cf87828801614009565b91505092959194509250565b6144e4816141ab565b82525050565b6144f3816141e7565b82525050565b61450281614228565b82525050565b60608201600082015161451e60008501826144db565b50602082015161453160208501826144ea565b50604082015161454460408501826144f9565b50505050565b600060608201905061455f6000830184614508565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61458a81614565565b82525050565b60006020820190506145a56000830184614581565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806145f257607f821691505b602082108103614605576146046145ab565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614641600a83613ee3565b915061464c8261460b565b602082019050919050565b6000602082019050818103600083015261467081614634565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006146b182613fe8565b91506146bc83613fe8565b92508282039050818111156146d4576146d3614677565b5b92915050565b60006146e582613fe8565b91506146f083613fe8565b925082820190508082111561470857614707614677565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614744600a83613ee3565b915061474f8261470e565b602082019050919050565b6000602082019050818103600083015261477381614737565b9050919050565b600061478582613fe8565b915061479083613fe8565b925082820261479e81613fe8565b915082820484148315176147b5576147b4614677565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006147f682613fe8565b915061480183613fe8565b925082614811576148106147bc565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148568261405e565b91506148618361405e565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff80000000000000000000000000000000821217156148ad576148ac614677565b5b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006148e9600d83613ee3565b91506148f4826148b3565b602082019050919050565b60006020820190508181036000830152614918816148dc565b9050919050565b61492881614565565b811461493357600080fd5b50565b6000815190506149458161491f565b92915050565b60006020828403121561496157614960613e18565b5b600061496f84828501614936565b9150509291505056fea2646970667358221220a9e3443175ce41be43aa23b47125e748c6e2ef68ed49a2c95e7a6fd161f9c0b164736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b506040516200580638038062005806833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002581176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037664010000000002620025a7176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a051614a3262000dd46000396000818161175a01528181611cb90152818161223701526124570152600081816117860152818161247801526124bd0152614a326000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613ef9565b610a34565b6040516102e99190613f41565b60405180910390f35b6102fa610bda565b6040516103079190613fec565b60405180910390f35b61032a600480360381019061032591906140a2565b610c68565b6040516103379190613f41565b60405180910390f35b610348610e39565b60405161035591906140fe565b60405180910390f35b61037860048036038101906103739190614145565b610e4c565b6040516103859190614194565b60405180910390f35b610396610e9c565b6040516103a39190614194565b60405180910390f35b6103b4610eb3565b6040516103c19190614194565b60405180910390f35b6103e460048036038101906103df9190614350565b610ebf565b6040516103f19190614194565b60405180910390f35b610402610ed8565b60405161040f91906140fe565b60405180910390f35b610432600480360381019061042d9190614350565b610eeb565b60405161043f9190613f41565b60405180910390f35b610462600480360381019061045d919061437d565b610f53565b60405161046f9190613f41565b60405180910390f35b610492600480360381019061048d9190614350565b611106565b60405161049f91906140fe565b60405180910390f35b6104c260048036038101906104bd91906143d0565b61113e565b6040516104cf9190613f41565b60405180910390f35b6104f260048036038101906104ed91906143fd565b611231565b6040516104ff9190614194565b60405180910390f35b61051061129d565b60405161051d9190614194565b60405180910390f35b610540600480360381019061053b91906140a2565b6112a3565b60405161054d9190613f41565b60405180910390f35b610570600480360381019061056b919061443d565b611439565b60405161057f93929190614497565b60405180910390f35b6105a2600480360381019061059d919061443d565b6114a8565b005b6105be60048036038101906105b991906140a2565b6115cd565b6040516105cb9190613f41565b60405180910390f35b6105ee60048036038101906105e991906143d0565b61170d565b6040516105fb9190614194565b60405180910390f35b61061e6004803603810190610619919061443d565b611756565b60405161062b9190614194565b60405180910390f35b61064e6004803603810190610649919061443d565b6117b6565b60405161065b9190614194565b60405180910390f35b61066c6117d7565b6040516106799190614194565b60405180910390f35b61069c6004803603810190610697919061443d565b6117dd565b6040516106a99190614194565b60405180910390f35b6106cc60048036038101906106c7919061443d565b61181e565b6040516106d99190614194565b60405180910390f35b6106fc60048036038101906106f791906143d0565b61183f565b6040516107099190614194565b60405180910390f35b61071a6118a6565b6040516107279190614194565b60405180910390f35b6107386118b7565b6040516107459190614194565b60405180910390f35b61076860048036038101906107639190614350565b6118bd565b6040516107759190614194565b60405180910390f35b6107866118eb565b6040516107939190614194565b60405180910390f35b6107a46118f1565b6040516107b19190613f41565b60405180910390f35b6107c2611a98565b6040516107cf91906144dd565b60405180910390f35b6107e0611abe565b6040516107ed91906144dd565b60405180910390f35b610810600480360381019061080b91906143d0565b611ae4565b005b61081a611b82565b6040516108279190613f41565b60405180910390f35b610838611e35565b6040516108459190613fec565b60405180910390f35b610868600480360381019061086391906143d0565b611ec3565b6040516108759190613f41565b60405180910390f35b610898600480360381019061089391906140a2565b611f80565b6040516108a59190613f41565b60405180910390f35b6108c860048036038101906108c391906140a2565b61219f565b6040516108d59190613f41565b60405180910390f35b6108e6612235565b6040516108f39190614194565b60405180910390f35b6109166004803603810190610911919061443d565b612259565b6040516109239190614194565b60405180910390f35b6109346123ad565b6040516109419190614194565b60405180910390f35b6109526123b3565b60405161095f9190614194565b60405180910390f35b610982600480360381019061097d9190614350565b6123bd565b60405161098f9190614194565b60405180910390f35b6109b260048036038101906109ad91906144f8565b6123d1565b6040516109bf91906145ce565b60405180910390f35b6109d0612451565b6040516109dd9190614614565b60405180910390f35b6109ee6124bb565b6040516109fb9190614194565b60405180910390f35b610a1e6004803603810190610a1991906143d0565b6124df565b604051610a2b9190613f41565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be79061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c139061465e565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906146db565b60405180910390fd5b5b610d3c611b82565b50610d46836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e269190614194565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e73610e5b85612581565b610e6e610e686001612581565b866125e9565b612650565b9050610e7e816126cf565b67ffffffffffffffff1684610e93919061472a565b91505092915050565b6000600c54600954610eae919061472a565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610f085760009050610f4e565b6000826020015168ffffffffffffffffff161115610f295760009050610f4e565b6000826040015167ffffffffffffffff161115610f495760009050610f4e565b600190505b919050565b6000806000610f60611b82565b50610f6a846117dd565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ff557600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611081919061472a565b92505081905550611093868684612704565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110f29190614194565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611135576111326001612581565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111c757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111d057600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061124086612581565b925061124b85612581565b9150611266600d60009054906101000a9004600f0b83612650565b905061127181612729565b905061127d8382612650565b9050611288816126cf565b67ffffffffffffffff16935050505092915050565b60085481565b6000806112ae611b82565b506112b8836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611346919061475e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516114269190614194565b60405180910390a3600191505092915050565b6000818154811061144957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114fe57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561154a57600080fd5b6000611555826117dd565b905061156133826127b6565b5081600c6000828254611574919061475e565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115c19190614194565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906147de565b60405180910390fd5b611664611b82565b5061166e836117dd565b90508260096000828254611682919061475e565b9250508190555061169384826128bd565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116f19190614194565b60405180910390a3611701612981565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261178491906147fe565b7f00000000000000000000000000000000000000000000000000000000000000006117af919061475e565b9050919050565b6000603c82426117c6919061472a565b6117d0919061486f565b9050919050565b60035481565b6000806118016117ec84612581565b600260009054906101000a9004600f0b612b45565b905061180c816126cf565b67ffffffffffffffff16915050919050565b6000603c824261182e919061472a565b611838919061486f565b9050919050565b6000806000806118566118518661170d565b612581565b92506118636003546117b6565b905061187e83600260009054906101000a9004600f0b612650565b915061189c61188c836126cf565b67ffffffffffffffff1682611231565b9350505050919050565b60006118b26000612259565b905090565b600c5481565b60008060006118cb84610ebf565b91506118d684611106565b90506118e28282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b8c613e56565b611b94613e56565b611b9c613e56565b6000806000806000611bac6118a6565b50611bb5612bd1565b9750611bc088610eeb565b15611bd657600098505050505050505050611e32565b6000600a5481548110611bec57611beb6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c99886123bd565b9450600185611ca8919061475e565b9050611cb386611106565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611ce2919061486f565b9150611d05600d60009054906101000a9004600f0b611d0084612581565b612650565b9250611d1083612729565b84611d1b91906148cf565b9250611d31600084611d2b610e9c565b846123d1565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611ded87612d67565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e1d9190614194565b60405180910390a16001985050505050505050505b90565b60078054611e429061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6e9061465e565b8015611ebb5780601f10611e9057610100808354040283529160200191611ebb565b820191906000526020600020905b815481529060010190602001808311611e9e57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1f57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f8c836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561201757600080fd5b61201f611b82565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ac919061472a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161218c9190614194565b60405180910390a3600191505092915050565b60008060006121ac611b82565b506121b6846117dd565b91506121c3338684612704565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516122229190614194565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600061226c6003546117b6565b9250600083036122835760009450505050506123a8565b600260009054906101000a9004600f0b90506000861180156122a457508286105b156122ad578592505b6122b683612581565b91506122d1600d60009054906101000a9004600f0b83612650565b93506122dc84612729565b93506122f7600260009054906101000a9004600f0b85612650565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361233f91906147fe565b60035461234c919061475e565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161239891906140fe565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123d9613e56565b6123e1613e56565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426124a2919061472a565b6124ac919061486f565b6124b6919061475e565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561259857600080fd5b6040829060020a029050919050565b60008082600f0b136125b857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125d484612e74565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263d57506f7fffffffffffffffffffffffffffffff600f0b8113155b61264657600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156126bc57506f7fffffffffffffffffffffffffffffff600f0b8113155b6126c557600080fd5b8091505092915050565b60008082600f0b12156126e157600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061271185846127b6565b5061271c84846128bd565b5060019150509392505050565b60006840000000000000000082600f0b1261274357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561277757600090506127b1565b6127ae6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061303a565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361281257600093505050506128b7565b61281b8661170d565b925084831015612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614983565b60405180910390fd5b848361286c919061472a565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612919576000935050505061297b565b6129228661170d565b92508483612930919061475e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061298b613e56565b6000612995610e9c565b9050600060016000805490506129ab919061472a565b815481106129bc576129bb6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a97919061472a565b81548110612aa857612aa76148a0565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612b5657600080fd5b600082600f0b604085600f0b9060020a0281612b7557612b74614840565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612bbe57506f7fffffffffffffffffffffffffffffff600f0b8113155b612bc757600080fd5b8091505092915050565b612bd9613e56565b612be1613e56565b612be9613e56565b600080600a5481548110612c0057612bff6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2f91906149cf565b6fffffffffffffffffffffffffffffffff169050612d4c836123bd565b8111612d5d57819350505050612d64565b8293505050505b90565b6000806000612d75846118bd565b9150600b54612d83836117dd565b612d8d919061472a565b9050612dbb601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826128bd565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612e2f9190614194565b60405180910390a36001600a6000828254612e4a919061475e565b9250508190555080600b6000828254612e63919061475e565b925050819055508192505050919050565b60008082600f0b13612e8557600080fd5b60008083600f0b9050680100000000000000008112612ec0576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612eee576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612f1a576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612f45576008819060008212600003808260020a82851804189250505090506008820191505b60108112612f6f576004819060008212600003808260020a82851804189250505090506004820191505b60048112612f99576002819060008212600003808260020a82851804189250505090506002820191505b60028112612fa8576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561302d578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612fd5565b5081945050505050919050565b60006840000000000000000082600f0b1261305457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130885760009050613e51565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156130d657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561310f5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156131485760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561318157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131ba5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156131f3576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561322c57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613265576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561329d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132d55760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561330d576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156133455760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561337d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156133b557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133ed5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561342557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b131561345c5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613493576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156134ca57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613501576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561353857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b131561356f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156135a6576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135dd5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613613576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561364957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b131561367f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156136b557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136eb5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613721576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561375757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561378d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156137c257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156137f75760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561382c576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156138615760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613896576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156138cb57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156139005760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561393557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156139695760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561399d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156139d157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613a05576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b1315613a3957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b1315613a6d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613aa1576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613ad55760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613b08576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613b3b57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613b6e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613ba157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613bd45760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613c07576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613c3a57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613c6d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613c9f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613cd15760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613d03576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613d355760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613d67576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613d9957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613dcb5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613dfd57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613e4c57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ed681613ea1565b8114613ee157600080fd5b50565b600081359050613ef381613ecd565b92915050565b600060208284031215613f0f57613f0e613e9c565b5b6000613f1d84828501613ee4565b91505092915050565b60008115159050919050565b613f3b81613f26565b82525050565b6000602082019050613f566000830184613f32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f96578082015181840152602081019050613f7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbe82613f5c565b613fc88185613f67565b9350613fd8818560208601613f78565b613fe181613fa2565b840191505092915050565b600060208201905081810360008301526140068184613fb3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140398261400e565b9050919050565b6140498161402e565b811461405457600080fd5b50565b60008135905061406681614040565b92915050565b6000819050919050565b61407f8161406c565b811461408a57600080fd5b50565b60008135905061409c81614076565b92915050565b600080604083850312156140b9576140b8613e9c565b5b60006140c785828601614057565b92505060206140d88582860161408d565b9150509250929050565b600081600f0b9050919050565b6140f8816140e2565b82525050565b600060208201905061411360008301846140ef565b92915050565b614122816140e2565b811461412d57600080fd5b50565b60008135905061413f81614119565b92915050565b6000806040838503121561415c5761415b613e9c565b5b600061416a8582860161408d565b925050602061417b85828601614130565b9150509250929050565b61418e8161406c565b82525050565b60006020820190506141a96000830184614185565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ec82613fa2565b810181811067ffffffffffffffff8211171561420b5761420a6141b4565b5b80604052505050565b600061421e613e92565b905061422a82826141e3565b919050565b600063ffffffff82169050919050565b6142488161422f565b811461425357600080fd5b50565b6000813590506142658161423f565b92915050565b600068ffffffffffffffffff82169050919050565b6142898161426b565b811461429457600080fd5b50565b6000813590506142a681614280565b92915050565b600067ffffffffffffffff82169050919050565b6142c9816142ac565b81146142d457600080fd5b50565b6000813590506142e6816142c0565b92915050565b600060608284031215614302576143016141af565b5b61430c6060614214565b9050600061431c84828501614256565b600083015250602061433084828501614297565b6020830152506040614344848285016142d7565b60408301525092915050565b60006060828403121561436657614365613e9c565b5b6000614374848285016142ec565b91505092915050565b60008060006060848603121561439657614395613e9c565b5b60006143a486828701614057565b93505060206143b586828701614057565b92505060406143c68682870161408d565b9150509250925092565b6000602082840312156143e6576143e5613e9c565b5b60006143f484828501614057565b91505092915050565b6000806040838503121561441457614413613e9c565b5b60006144228582860161408d565b92505060206144338582860161408d565b9150509250929050565b60006020828403121561445357614452613e9c565b5b60006144618482850161408d565b91505092915050565b6144738161422f565b82525050565b6144828161426b565b82525050565b614491816142ac565b82525050565b60006060820190506144ac600083018661446a565b6144b96020830185614479565b6144c66040830184614488565b949350505050565b6144d78161402e565b82525050565b60006020820190506144f260008301846144ce565b92915050565b6000806000806080858703121561451257614511613e9c565b5b60006145208782880161408d565b945050602061453187828801614130565b93505060406145428782880161408d565b92505060606145538782880161408d565b91505092959194509250565b6145688161422f565b82525050565b6145778161426b565b82525050565b614586816142ac565b82525050565b6060820160008201516145a2600085018261455f565b5060208201516145b5602085018261456e565b5060408201516145c8604085018261457d565b50505050565b60006060820190506145e3600083018461458c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61460e816145e9565b82525050565b60006020820190506146296000830184614605565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061467657607f821691505b6020821081036146895761468861462f565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006146c5600a83613f67565b91506146d08261468f565b602082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147358261406c565b91506147408361406c565b9250828203905081811115614758576147576146fb565b5b92915050565b60006147698261406c565b91506147748361406c565b925082820190508082111561478c5761478b6146fb565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006147c8600a83613f67565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b60006148098261406c565b91506148148361406c565b92508282026148228161406c565b91508282048414831517614839576148386146fb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061487a8261406c565b91506148858361406c565b92508261489557614894614840565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148da826140e2565b91506148e5836140e2565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff8000000000000000000000000000000082121715614931576149306146fb565b5b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061496d600d83613f67565b915061497882614937565b602082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b6149ac816145e9565b81146149b757600080fd5b50565b6000815190506149c9816149a3565b92915050565b6000602082840312156149e5576149e4613e9c565b5b60006149f3848285016149ba565b9150509291505056fea2646970667358221220210942c9adc51a33335140be7e0c9e00222987d437835e159de8102de2abb8f064736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 34749c9..fe72472 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index d102a79..8168173 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -306,18 +306,18 @@ class DemurrageToken(ERC20): return o - def to_redistribution(self, contract_address, participants, demurrage_modifier_ppm, value, period, sender_address=ZERO_ADDRESS, id_generator=None): + def to_redistribution(self, contract_address, participants, demurrage_modifier, value, period, sender_address=ZERO_ADDRESS, id_generator=None): j = JSONRPCRequest(id_generator) o = j.template() o['method'] = 'eth_call' enc = ABIContractEncoder() enc.method('toRedistribution') enc.typ(ABIContractType.UINT256) - enc.typ(ABIContractType.UINT256) + enc.typ_literal('int128') enc.typ(ABIContractType.UINT256) enc.typ(ABIContractType.UINT256) enc.uint256(participants) - enc.uint256(demurrage_modifier_ppm) + enc.uint256(demurrage_modifier) enc.uint256(value) enc.uint256(period) data = add_0x(enc.get()) @@ -536,7 +536,7 @@ class DemurrageToken(ERC20): enc = ABIContractEncoder() enc.method('getDistribution') enc.typ(ABIContractType.UINT256) - enc.typ(ABIContractType.UINT256) + enc.typ_literal('int128') enc.uint256(supply) enc.uint256(demurrage_amount) data = add_0x(enc.get()) @@ -555,7 +555,7 @@ class DemurrageToken(ERC20): enc = ABIContractEncoder() enc.method('getDistributionFromRedistribution') v = strip_0x(redistribution) - enc.typ_literal('(uint32,uint72,uint104)') + enc.typ_literal('(uint32,uint72,uint64)') enc.bytes32(v[:64]) enc.bytes32(v[64:128]) enc.bytes32(v[128:192]) diff --git a/python/erc20_demurrage_token/unittest/newbase.py b/python/erc20_demurrage_token/unittest/newbase.py index ceb404e..a06fae1 100644 --- a/python/erc20_demurrage_token/unittest/newbase.py +++ b/python/erc20_demurrage_token/unittest/newbase.py @@ -114,6 +114,17 @@ class TestDemurrage(EthTesterCase): logg.debug('contract address {} start block {} start time {}'.format(self.address, self.start_block, self.start_time)) + def assert_within(self, v, target, tolerance_ppm): + lower_target = target - (target * (tolerance_ppm / 1000000)) + higher_target = target + (target * (tolerance_ppm / 1000000)) + #self.assertGreaterEqual(v, lower_target) + #self.assertLessEqual(v, higher_target) + if v >= lower_target and v <= higher_target: + logg.debug('asserted within {} <= {} <= {}'.format(lower_target, v, higher_target)) + return + raise AssertionError('{} not within lower {} and higher {}'.format(v, lower_target, higher_target)) + + def assert_within_lower(self, v, target, tolerance_ppm): lower_target = target - (target * (tolerance_ppm / 1000000)) self.assertGreaterEqual(v, lower_target) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index 11b88ea..a2a7ebe 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -19,9 +19,11 @@ from hexathon import ( # local imports from erc20_demurrage_token import DemurrageToken +from erc20_demurrage_token.fixed import to_fixed +from erc20_demurrage_token import DemurrageRedistribution # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageUnit +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -29,7 +31,7 @@ logg = logging.getLogger() testdir = os.path.dirname(__file__) -class TestRedistribution(TestDemurrageUnit): +class TestRedistribution(TestDemurrageDefault): # TODO: move to "pure" test file when getdistribution is implemented in all contracts @@ -40,11 +42,12 @@ class TestRedistribution(TestDemurrageUnit): demurrage = (1 - (self.tax_level / 1000000)) * (10**28) supply = self.default_supply - o = c.get_distribution(self.address, supply, demurrage, sender_address=self.accounts[0]) + #o = c.get_distribution(self.address, supply, demurrage, sender_address=self.accounts[0]) + o = c.get_distribution(self.address, supply, to_fixed(self.tax_level / 1000000), sender_address=self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) expected_distribution = self.default_supply * (self.tax_level / 1000000) - self.assert_within_lower(distribution, expected_distribution, 1000) + self.assert_within(distribution, expected_distribution, 100) def test_distribution_from_redistribution(self): @@ -53,18 +56,17 @@ class TestRedistribution(TestDemurrageUnit): demurrage = (1 - (self.tax_level / 100000)) * (10**28) - logg.debug('demurrage {}'.format(demurrage)) supply = self.default_supply - o = c.to_redistribution(self.address, 0, demurrage, supply, 2, sender_address=self.accounts[0]) + o = c.to_redistribution(self.address, 0, to_fixed(self.tax_level / 1000000), supply, 2, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) o = c.get_distribution_from_redistribution(self.address, redistribution, self.accounts[0]) r = self.rpc.do(o) distribution = c.parse_get_distribution(r) - expected_distribution = (self.default_supply * self.tax_level) / 100000 + expected_distribution = (self.default_supply * (self.tax_level / 1000000)) logg.debug('distribution {} supply {}'.format(distribution, self.default_supply)) - self.assert_within_lower(distribution, expected_distribution, 1000) + self.assert_within(distribution, expected_distribution, 1000) def test_single_step_basic(self): @@ -124,7 +126,7 @@ class TestRedistribution(TestDemurrageUnit): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - mint_amount = 100000000 + mint_amount = self.default_supply half_mint_amount = int(mint_amount / 2) (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], mint_amount) @@ -156,7 +158,7 @@ class TestRedistribution(TestDemurrageUnit): o = c.balance_of(self.address, self.accounts[2], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) - self.assertEqual(balance, expected_balance) + self.assert_within(balance, expected_balance, 10) half_demurrage_amount = int((self.tax_level / 1000000) * half_mint_amount) @@ -177,14 +179,15 @@ class TestRedistribution(TestDemurrageUnit): o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) - logg.debug('redistribution {}'.format(redistribution)) o = c.to_redistribution_supply(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) supply = c.parse_to_redistribution_item(r) o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - demurrage = c.parse_to_redistribution_item(r) - logg.debug('\nrediistribution {}\ndemurrage {}\nsupply {}'.format(redistribution, demurrage, supply)) + #demurrage = c.parse_to_redistribution_item(r) + #logg.debug('\nrediistribution {}\ndemurrage {}\nsupply {}'.format(redistribution, demurrage, supply)) + redistro_item = DemurrageRedistribution(redistribution) + logg.debug('redistribution {}'.format(redistro_item)) expected_balance = int(supply * (self.tax_level / 1000000)) expected_balance_tolerance = 1 diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 4bfb278..1e00fa0 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -298,14 +298,11 @@ contract DemurrageTokenSingleCap { return lastRedistribution; } - function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) { + function getDistribution(uint256 _supply, int128 _demurrageAmount) public view returns (uint256) { int128 difference; -// difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); -// return difference / resolutionFactor; - difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), _demurrageAmount); - return ABDKMath64x64.toUInt(difference); - //return _supply; + difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), ABDKMath64x64.sub(ABDKMath64x64.fromUInt(1), _demurrageAmount)); + return _supply - ABDKMath64x64.toUInt(difference); } From 5317573b4713e154c2233e841917e41868b83bda Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 09:06:04 +0000 Subject: [PATCH 20/57] All tests pass! --- .../data/DemurrageTokenSingleNocap.bin | 2 +- python/tests/test_growth.py | 18 +++++ python/tests/test_period.py | 68 +++++++++++++++---- python/tests/test_redistribution_single.py | 25 ++++--- solidity/DemurrageTokenSingleNocap.sol | 10 +-- 5 files changed, 97 insertions(+), 26 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index da318e5..aa23994 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b506040516200580638038062005806833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002581176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037664010000000002620025a7176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a051614a3262000dd46000396000818161175a01528181611cb90152818161223701526124570152600081816117860152818161247801526124bd0152614a326000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613ef9565b610a34565b6040516102e99190613f41565b60405180910390f35b6102fa610bda565b6040516103079190613fec565b60405180910390f35b61032a600480360381019061032591906140a2565b610c68565b6040516103379190613f41565b60405180910390f35b610348610e39565b60405161035591906140fe565b60405180910390f35b61037860048036038101906103739190614145565b610e4c565b6040516103859190614194565b60405180910390f35b610396610e9c565b6040516103a39190614194565b60405180910390f35b6103b4610eb3565b6040516103c19190614194565b60405180910390f35b6103e460048036038101906103df9190614350565b610ebf565b6040516103f19190614194565b60405180910390f35b610402610ed8565b60405161040f91906140fe565b60405180910390f35b610432600480360381019061042d9190614350565b610eeb565b60405161043f9190613f41565b60405180910390f35b610462600480360381019061045d919061437d565b610f53565b60405161046f9190613f41565b60405180910390f35b610492600480360381019061048d9190614350565b611106565b60405161049f91906140fe565b60405180910390f35b6104c260048036038101906104bd91906143d0565b61113e565b6040516104cf9190613f41565b60405180910390f35b6104f260048036038101906104ed91906143fd565b611231565b6040516104ff9190614194565b60405180910390f35b61051061129d565b60405161051d9190614194565b60405180910390f35b610540600480360381019061053b91906140a2565b6112a3565b60405161054d9190613f41565b60405180910390f35b610570600480360381019061056b919061443d565b611439565b60405161057f93929190614497565b60405180910390f35b6105a2600480360381019061059d919061443d565b6114a8565b005b6105be60048036038101906105b991906140a2565b6115cd565b6040516105cb9190613f41565b60405180910390f35b6105ee60048036038101906105e991906143d0565b61170d565b6040516105fb9190614194565b60405180910390f35b61061e6004803603810190610619919061443d565b611756565b60405161062b9190614194565b60405180910390f35b61064e6004803603810190610649919061443d565b6117b6565b60405161065b9190614194565b60405180910390f35b61066c6117d7565b6040516106799190614194565b60405180910390f35b61069c6004803603810190610697919061443d565b6117dd565b6040516106a99190614194565b60405180910390f35b6106cc60048036038101906106c7919061443d565b61181e565b6040516106d99190614194565b60405180910390f35b6106fc60048036038101906106f791906143d0565b61183f565b6040516107099190614194565b60405180910390f35b61071a6118a6565b6040516107279190614194565b60405180910390f35b6107386118b7565b6040516107459190614194565b60405180910390f35b61076860048036038101906107639190614350565b6118bd565b6040516107759190614194565b60405180910390f35b6107866118eb565b6040516107939190614194565b60405180910390f35b6107a46118f1565b6040516107b19190613f41565b60405180910390f35b6107c2611a98565b6040516107cf91906144dd565b60405180910390f35b6107e0611abe565b6040516107ed91906144dd565b60405180910390f35b610810600480360381019061080b91906143d0565b611ae4565b005b61081a611b82565b6040516108279190613f41565b60405180910390f35b610838611e35565b6040516108459190613fec565b60405180910390f35b610868600480360381019061086391906143d0565b611ec3565b6040516108759190613f41565b60405180910390f35b610898600480360381019061089391906140a2565b611f80565b6040516108a59190613f41565b60405180910390f35b6108c860048036038101906108c391906140a2565b61219f565b6040516108d59190613f41565b60405180910390f35b6108e6612235565b6040516108f39190614194565b60405180910390f35b6109166004803603810190610911919061443d565b612259565b6040516109239190614194565b60405180910390f35b6109346123ad565b6040516109419190614194565b60405180910390f35b6109526123b3565b60405161095f9190614194565b60405180910390f35b610982600480360381019061097d9190614350565b6123bd565b60405161098f9190614194565b60405180910390f35b6109b260048036038101906109ad91906144f8565b6123d1565b6040516109bf91906145ce565b60405180910390f35b6109d0612451565b6040516109dd9190614614565b60405180910390f35b6109ee6124bb565b6040516109fb9190614194565b60405180910390f35b610a1e6004803603810190610a1991906143d0565b6124df565b604051610a2b9190613f41565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be79061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c139061465e565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906146db565b60405180910390fd5b5b610d3c611b82565b50610d46836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e269190614194565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e73610e5b85612581565b610e6e610e686001612581565b866125e9565b612650565b9050610e7e816126cf565b67ffffffffffffffff1684610e93919061472a565b91505092915050565b6000600c54600954610eae919061472a565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610f085760009050610f4e565b6000826020015168ffffffffffffffffff161115610f295760009050610f4e565b6000826040015167ffffffffffffffff161115610f495760009050610f4e565b600190505b919050565b6000806000610f60611b82565b50610f6a846117dd565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ff557600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611081919061472a565b92505081905550611093868684612704565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110f29190614194565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611135576111326001612581565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111c757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111d057600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061124086612581565b925061124b85612581565b9150611266600d60009054906101000a9004600f0b83612650565b905061127181612729565b905061127d8382612650565b9050611288816126cf565b67ffffffffffffffff16935050505092915050565b60085481565b6000806112ae611b82565b506112b8836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611346919061475e565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516114269190614194565b60405180910390a3600191505092915050565b6000818154811061144957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114fe57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561154a57600080fd5b6000611555826117dd565b905061156133826127b6565b5081600c6000828254611574919061475e565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115c19190614194565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906147de565b60405180910390fd5b611664611b82565b5061166e836117dd565b90508260096000828254611682919061475e565b9250508190555061169384826128bd565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116f19190614194565b60405180910390a3611701612981565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f00000000000000000000000000000000000000000000000000000000000000008261178491906147fe565b7f00000000000000000000000000000000000000000000000000000000000000006117af919061475e565b9050919050565b6000603c82426117c6919061472a565b6117d0919061486f565b9050919050565b60035481565b6000806118016117ec84612581565b600260009054906101000a9004600f0b612b45565b905061180c816126cf565b67ffffffffffffffff16915050919050565b6000603c824261182e919061472a565b611838919061486f565b9050919050565b6000806000806118566118518661170d565b612581565b92506118636003546117b6565b905061187e83600260009054906101000a9004600f0b612650565b915061189c61188c836126cf565b67ffffffffffffffff1682611231565b9350505050919050565b60006118b26000612259565b905090565b600c5481565b60008060006118cb84610ebf565b91506118d684611106565b90506118e28282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b8c613e56565b611b94613e56565b611b9c613e56565b6000806000806000611bac6118a6565b50611bb5612bd1565b9750611bc088610eeb565b15611bd657600098505050505050505050611e32565b6000600a5481548110611bec57611beb6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c99886123bd565b9450600185611ca8919061475e565b9050611cb386611106565b9350603c7f0000000000000000000000000000000000000000000000000000000000000000611ce2919061486f565b9150611d05600d60009054906101000a9004600f0b611d0084612581565b612650565b9250611d1083612729565b84611d1b91906148cf565b9250611d31600084611d2b610e9c565b846123d1565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611ded87612d67565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e1d9190614194565b60405180910390a16001985050505050505050505b90565b60078054611e429061465e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6e9061465e565b8015611ebb5780601f10611e9057610100808354040283529160200191611ebb565b820191906000526020600020905b815481529060010190602001808311611e9e57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1f57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f8c836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561201757600080fd5b61201f611b82565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120ac919061472a565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161218c9190614194565b60405180910390a3600191505092915050565b60008060006121ac611b82565b506121b6846117dd565b91506121c3338684612704565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516122229190614194565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600080600061226c6003546117b6565b9250600083036122835760009450505050506123a8565b600260009054906101000a9004600f0b90506000861180156122a457508286105b156122ad578592505b6122b683612581565b91506122d1600d60009054906101000a9004600f0b83612650565b93506122dc84612729565b93506122f7600260009054906101000a9004600f0b85612650565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361233f91906147fe565b60035461234c919061475e565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161239891906140fe565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123d9613e56565b6123e1613e56565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000426124a2919061472a565b6124ac919061486f565b6124b6919061475e565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561259857600080fd5b6040829060020a029050919050565b60008082600f0b136125b857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125d484612e74565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263d57506f7fffffffffffffffffffffffffffffff600f0b8113155b61264657600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156126bc57506f7fffffffffffffffffffffffffffffff600f0b8113155b6126c557600080fd5b8091505092915050565b60008082600f0b12156126e157600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061271185846127b6565b5061271c84846128bd565b5060019150509392505050565b60006840000000000000000082600f0b1261274357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561277757600090506127b1565b6127ae6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061303a565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361281257600093505050506128b7565b61281b8661170d565b925084831015612860576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285790614983565b60405180910390fd5b848361286c919061472a565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612919576000935050505061297b565b6129228661170d565b92508483612930919061475e565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061298b613e56565b6000612995610e9c565b9050600060016000805490506129ab919061472a565b815481106129bc576129bb6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a97919061472a565b81548110612aa857612aa76148a0565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612b5657600080fd5b600082600f0b604085600f0b9060020a0281612b7557612b74614840565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612bbe57506f7fffffffffffffffffffffffffffffff600f0b8113155b612bc757600080fd5b8091505092915050565b612bd9613e56565b612be1613e56565b612be9613e56565b600080600a5481548110612c0057612bff6148a0565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612d0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2f91906149cf565b6fffffffffffffffffffffffffffffffff169050612d4c836123bd565b8111612d5d57819350505050612d64565b8293505050505b90565b6000806000612d75846118bd565b9150600b54612d83836117dd565b612d8d919061472a565b9050612dbb601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826128bd565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612e2f9190614194565b60405180910390a36001600a6000828254612e4a919061475e565b9250508190555080600b6000828254612e63919061475e565b925050819055508192505050919050565b60008082600f0b13612e8557600080fd5b60008083600f0b9050680100000000000000008112612ec0576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612eee576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612f1a576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612f45576008819060008212600003808260020a82851804189250505090506008820191505b60108112612f6f576004819060008212600003808260020a82851804189250505090506004820191505b60048112612f99576002819060008212600003808260020a82851804189250505090506002820191505b60028112612fa8576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561302d578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612fd5565b5081945050505050919050565b60006840000000000000000082600f0b1261305457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130885760009050613e51565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156130d657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561310f5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156131485760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561318157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131ba5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156131f3576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561322c57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613265576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561329d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132d55760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561330d576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156133455760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561337d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156133b557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133ed5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561342557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b131561345c5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613493576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156134ca57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613501576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561353857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b131561356f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156135a6576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135dd5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613613576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561364957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b131561367f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156136b557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136eb5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613721576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561375757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561378d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156137c257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156137f75760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561382c576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156138615760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613896576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156138cb57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156139005760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561393557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156139695760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561399d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156139d157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613a05576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b1315613a3957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b1315613a6d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613aa1576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613ad55760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613b08576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613b3b57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613b6e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613ba157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613bd45760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613c07576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613c3a57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613c6d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613c9f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613cd15760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613d03576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613d355760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613d67576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613d9957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613dcb5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613dfd57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613e4c57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ed681613ea1565b8114613ee157600080fd5b50565b600081359050613ef381613ecd565b92915050565b600060208284031215613f0f57613f0e613e9c565b5b6000613f1d84828501613ee4565b91505092915050565b60008115159050919050565b613f3b81613f26565b82525050565b6000602082019050613f566000830184613f32565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f96578082015181840152602081019050613f7b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fbe82613f5c565b613fc88185613f67565b9350613fd8818560208601613f78565b613fe181613fa2565b840191505092915050565b600060208201905081810360008301526140068184613fb3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140398261400e565b9050919050565b6140498161402e565b811461405457600080fd5b50565b60008135905061406681614040565b92915050565b6000819050919050565b61407f8161406c565b811461408a57600080fd5b50565b60008135905061409c81614076565b92915050565b600080604083850312156140b9576140b8613e9c565b5b60006140c785828601614057565b92505060206140d88582860161408d565b9150509250929050565b600081600f0b9050919050565b6140f8816140e2565b82525050565b600060208201905061411360008301846140ef565b92915050565b614122816140e2565b811461412d57600080fd5b50565b60008135905061413f81614119565b92915050565b6000806040838503121561415c5761415b613e9c565b5b600061416a8582860161408d565b925050602061417b85828601614130565b9150509250929050565b61418e8161406c565b82525050565b60006020820190506141a96000830184614185565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141ec82613fa2565b810181811067ffffffffffffffff8211171561420b5761420a6141b4565b5b80604052505050565b600061421e613e92565b905061422a82826141e3565b919050565b600063ffffffff82169050919050565b6142488161422f565b811461425357600080fd5b50565b6000813590506142658161423f565b92915050565b600068ffffffffffffffffff82169050919050565b6142898161426b565b811461429457600080fd5b50565b6000813590506142a681614280565b92915050565b600067ffffffffffffffff82169050919050565b6142c9816142ac565b81146142d457600080fd5b50565b6000813590506142e6816142c0565b92915050565b600060608284031215614302576143016141af565b5b61430c6060614214565b9050600061431c84828501614256565b600083015250602061433084828501614297565b6020830152506040614344848285016142d7565b60408301525092915050565b60006060828403121561436657614365613e9c565b5b6000614374848285016142ec565b91505092915050565b60008060006060848603121561439657614395613e9c565b5b60006143a486828701614057565b93505060206143b586828701614057565b92505060406143c68682870161408d565b9150509250925092565b6000602082840312156143e6576143e5613e9c565b5b60006143f484828501614057565b91505092915050565b6000806040838503121561441457614413613e9c565b5b60006144228582860161408d565b92505060206144338582860161408d565b9150509250929050565b60006020828403121561445357614452613e9c565b5b60006144618482850161408d565b91505092915050565b6144738161422f565b82525050565b6144828161426b565b82525050565b614491816142ac565b82525050565b60006060820190506144ac600083018661446a565b6144b96020830185614479565b6144c66040830184614488565b949350505050565b6144d78161402e565b82525050565b60006020820190506144f260008301846144ce565b92915050565b6000806000806080858703121561451257614511613e9c565b5b60006145208782880161408d565b945050602061453187828801614130565b93505060406145428782880161408d565b92505060606145538782880161408d565b91505092959194509250565b6145688161422f565b82525050565b6145778161426b565b82525050565b614586816142ac565b82525050565b6060820160008201516145a2600085018261455f565b5060208201516145b5602085018261456e565b5060408201516145c8604085018261457d565b50505050565b60006060820190506145e3600083018461458c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61460e816145e9565b82525050565b60006020820190506146296000830184614605565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061467657607f821691505b6020821081036146895761468861462f565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006146c5600a83613f67565b91506146d08261468f565b602082019050919050565b600060208201905081810360008301526146f4816146b8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147358261406c565b91506147408361406c565b9250828203905081811115614758576147576146fb565b5b92915050565b60006147698261406c565b91506147748361406c565b925082820190508082111561478c5761478b6146fb565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006147c8600a83613f67565b91506147d382614792565b602082019050919050565b600060208201905081810360008301526147f7816147bb565b9050919050565b60006148098261406c565b91506148148361406c565b92508282026148228161406c565b91508282048414831517614839576148386146fb565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061487a8261406c565b91506148858361406c565b92508261489557614894614840565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006148da826140e2565b91506148e5836140e2565b925082820390506f7fffffffffffffffffffffffffffffff81137fffffffffffffffffffffffffffffffff8000000000000000000000000000000082121715614931576149306146fb565b5b92915050565b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061496d600d83613f67565b915061497882614937565b602082019050919050565b6000602082019050818103600083015261499c81614960565b9050919050565b6149ac816145e9565b81146149b757600080fd5b50565b6000815190506149c9816149a3565b92915050565b6000602082840312156149e5576149e4613e9c565b5b60006149f3848285016149ba565b9150509291505056fea2646970667358221220210942c9adc51a33335140be7e0c9e00222987d437835e159de8102de2abb8f064736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b50604051620057ad380380620057ad833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f640100000000026200257e176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037664010000000002620025a4176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516149d962000dd46000396000818161175a01528181611cba0152818161223401526124540152600081816117860152818161247501526124ba01526149d96000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613f08565b610a34565b6040516102e99190613f50565b60405180910390f35b6102fa610bda565b6040516103079190613ffb565b60405180910390f35b61032a600480360381019061032591906140b1565b610c68565b6040516103379190613f50565b60405180910390f35b610348610e39565b604051610355919061410d565b60405180910390f35b61037860048036038101906103739190614154565b610e4c565b60405161038591906141a3565b60405180910390f35b610396610e9c565b6040516103a391906141a3565b60405180910390f35b6103b4610eb3565b6040516103c191906141a3565b60405180910390f35b6103e460048036038101906103df919061435f565b610ebf565b6040516103f191906141a3565b60405180910390f35b610402610ed8565b60405161040f919061410d565b60405180910390f35b610432600480360381019061042d919061435f565b610eeb565b60405161043f9190613f50565b60405180910390f35b610462600480360381019061045d919061438c565b610f53565b60405161046f9190613f50565b60405180910390f35b610492600480360381019061048d919061435f565b611106565b60405161049f919061410d565b60405180910390f35b6104c260048036038101906104bd91906143df565b61113e565b6040516104cf9190613f50565b60405180910390f35b6104f260048036038101906104ed919061440c565b611231565b6040516104ff91906141a3565b60405180910390f35b61051061129d565b60405161051d91906141a3565b60405180910390f35b610540600480360381019061053b91906140b1565b6112a3565b60405161054d9190613f50565b60405180910390f35b610570600480360381019061056b919061444c565b611439565b60405161057f939291906144a6565b60405180910390f35b6105a2600480360381019061059d919061444c565b6114a8565b005b6105be60048036038101906105b991906140b1565b6115cd565b6040516105cb9190613f50565b60405180910390f35b6105ee60048036038101906105e991906143df565b61170d565b6040516105fb91906141a3565b60405180910390f35b61061e6004803603810190610619919061444c565b611756565b60405161062b91906141a3565b60405180910390f35b61064e6004803603810190610649919061444c565b6117b6565b60405161065b91906141a3565b60405180910390f35b61066c6117d7565b60405161067991906141a3565b60405180910390f35b61069c6004803603810190610697919061444c565b6117dd565b6040516106a991906141a3565b60405180910390f35b6106cc60048036038101906106c7919061444c565b61181e565b6040516106d991906141a3565b60405180910390f35b6106fc60048036038101906106f791906143df565b61183f565b60405161070991906141a3565b60405180910390f35b61071a6118a6565b60405161072791906141a3565b60405180910390f35b6107386118b7565b60405161074591906141a3565b60405180910390f35b6107686004803603810190610763919061435f565b6118bd565b60405161077591906141a3565b60405180910390f35b6107866118eb565b60405161079391906141a3565b60405180910390f35b6107a46118f1565b6040516107b19190613f50565b60405180910390f35b6107c2611a98565b6040516107cf91906144ec565b60405180910390f35b6107e0611abe565b6040516107ed91906144ec565b60405180910390f35b610810600480360381019061080b91906143df565b611ae4565b005b61081a611b82565b6040516108279190613f50565b60405180910390f35b610838611e32565b6040516108459190613ffb565b60405180910390f35b610868600480360381019061086391906143df565b611ec0565b6040516108759190613f50565b60405180910390f35b610898600480360381019061089391906140b1565b611f7d565b6040516108a59190613f50565b60405180910390f35b6108c860048036038101906108c391906140b1565b61219c565b6040516108d59190613f50565b60405180910390f35b6108e6612232565b6040516108f391906141a3565b60405180910390f35b6109166004803603810190610911919061444c565b612256565b60405161092391906141a3565b60405180910390f35b6109346123aa565b60405161094191906141a3565b60405180910390f35b6109526123b0565b60405161095f91906141a3565b60405180910390f35b610982600480360381019061097d919061435f565b6123ba565b60405161098f91906141a3565b60405180910390f35b6109b260048036038101906109ad9190614507565b6123ce565b6040516109bf91906145dd565b60405180910390f35b6109d061244e565b6040516109dd9190614623565b60405180910390f35b6109ee6124b8565b6040516109fb91906141a3565b60405180910390f35b610a1e6004803603810190610a1991906143df565b6124dc565b604051610a2b9190613f50565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be79061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c139061466d565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906146ea565b60405180910390fd5b5b610d3c611b82565b50610d46836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e2691906141a3565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e73610e5b8561257e565b610e6e610e68600161257e565b866125e6565b61264d565b9050610e7e816126cc565b67ffffffffffffffff1684610e939190614739565b91505092915050565b6000600c54600954610eae9190614739565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610f085760009050610f4e565b6000826020015168ffffffffffffffffff161115610f295760009050610f4e565b6000826040015167ffffffffffffffff161115610f495760009050610f4e565b600190505b919050565b6000806000610f60611b82565b50610f6a846117dd565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ff557600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110819190614739565b92505081905550611093868684612701565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110f291906141a3565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361113557611132600161257e565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111c757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111d057600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806112408661257e565b925061124b8561257e565b9150611266600d60009054906101000a9004600f0b8361264d565b905061127181612726565b905061127d838261264d565b9050611288816126cc565b67ffffffffffffffff16935050505092915050565b60085481565b6000806112ae611b82565b506112b8836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611346919061476d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161142691906141a3565b60405180910390a3600191505092915050565b6000818154811061144957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114fe57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561154a57600080fd5b6000611555826117dd565b905061156133826127b3565b5081600c6000828254611574919061476d565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115c191906141a3565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906147ed565b60405180910390fd5b611664611b82565b5061166e836117dd565b90508260096000828254611682919061476d565b9250508190555061169384826128ba565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116f191906141a3565b60405180910390a361170161297e565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611784919061480d565b7f00000000000000000000000000000000000000000000000000000000000000006117af919061476d565b9050919050565b6000603c82426117c69190614739565b6117d0919061487e565b9050919050565b60035481565b6000806118016117ec8461257e565b600260009054906101000a9004600f0b612b42565b905061180c816126cc565b67ffffffffffffffff16915050919050565b6000603c824261182e9190614739565b611838919061487e565b9050919050565b6000806000806118566118518661170d565b61257e565b92506118636003546117b6565b905061187e83600260009054906101000a9004600f0b61264d565b915061189c61188c836126cc565b67ffffffffffffffff1682611231565b9350505050919050565b60006118b26000612256565b905090565b600c5481565b60008060006118cb84610ebf565b91506118d684611106565b90506118e28282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b8c613e65565b611b94613e65565b611b9c613e65565b6000806000806000611bac6118a6565b50611bb5612bce565b9750611bc088610eeb565b15611bd657600098505050505050505050611e2f565b6000600a5481548110611bec57611beb6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c99886123ba565b9450600185611ca8919061476d565b9050611cb386611106565b9350603c857f0000000000000000000000000000000000000000000000000000000000000000611ce3919061480d565b611ced919061487e565b9150611d18611d13600d60009054906101000a9004600f0b611d0e8561257e565b61264d565b612726565b9250611d2e600084611d28610e9c565b846123ce565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611dea87612d64565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e1a91906141a3565b60405180910390a16001985050505050505050505b90565b60078054611e3f9061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b9061466d565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1c57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f89836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561201457600080fd5b61201c611b82565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a99190614739565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161218991906141a3565b60405180910390a3600191505092915050565b60008060006121a9611b82565b506121b3846117dd565b91506121c0338684612701565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161221f91906141a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060006122696003546117b6565b9250600083036122805760009450505050506123a5565b600260009054906101000a9004600f0b90506000861180156122a157508286105b156122aa578592505b6122b38361257e565b91506122ce600d60009054906101000a9004600f0b8361264d565b93506122d984612726565b93506122f4600260009054906101000a9004600f0b8561264d565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361233c919061480d565b600354612349919061476d565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612395919061410d565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123d6613e65565b6123de613e65565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004261249f9190614739565b6124a9919061487e565b6124b3919061476d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253857600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561259557600080fd5b6040829060020a029050919050565b60008082600f0b136125b557600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125d184612e83565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263a57506f7fffffffffffffffffffffffffffffff600f0b8113155b61264357600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156126b957506f7fffffffffffffffffffffffffffffff600f0b8113155b6126c257600080fd5b8091505092915050565b60008082600f0b12156126de57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061270e85846127b3565b5061271984846128ba565b5060019150509392505050565b60006840000000000000000082600f0b1261274057600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561277457600090506127ae565b6127ab6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613049565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361280f57600093505050506128b4565b6128188661170d565b92508483101561285d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128549061492a565b60405180910390fd5b84836128699190614739565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036129165760009350505050612978565b61291f8661170d565b9250848361292d919061476d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612988613e65565b6000612992610e9c565b9050600060016000805490506129a89190614739565b815481106129b9576129b86148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a949190614739565b81548110612aa557612aa46148af565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612b5357600080fd5b600082600f0b604085600f0b9060020a0281612b7257612b7161484f565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612bbb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612bc457600080fd5b8091505092915050565b612bd6613e65565b612bde613e65565b612be6613e65565b600080600a5481548110612bfd57612bfc6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2c9190614976565b6fffffffffffffffffffffffffffffffff169050612d49836123ba565b8111612d5a57819350505050612d61565b8293505050505b90565b6000806000612d72846118bd565b612d7a610e9c565b612d849190614739565b9150600b54612d92836117dd565b612d9c9190614739565b9050612dca601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826128ba565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612e3e91906141a3565b60405180910390a36001600a6000828254612e59919061476d565b9250508190555080600b6000828254612e72919061476d565b925050819055508192505050919050565b60008082600f0b13612e9457600080fd5b60008083600f0b9050680100000000000000008112612ecf576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612efd576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612f29576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612f54576008819060008212600003808260020a82851804189250505090506008820191505b60108112612f7e576004819060008212600003808260020a82851804189250505090506004820191505b60048112612fa8576002819060008212600003808260020a82851804189250505090506002820191505b60028112612fb7576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561303c578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612fe4565b5081945050505050919050565b60006840000000000000000082600f0b1261306357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130975760009050613e60565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156130e557608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561311e5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156131575760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561319057608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131c95760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613202576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561323b57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613274576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156132ac57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132e45760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561331c576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156133545760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561338c576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156133c457608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133fc5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561343457608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b131561346b5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156134a2576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156134d957608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613510576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561354757608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b131561357e5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156135b5576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135ec5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613622576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561365857608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b131561368e5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156136c457608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136fa5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613730576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561376657608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561379c576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156137d157608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156138065760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561383b576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156138705760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156138a5576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156138da57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561390f5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561394457608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156139785760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156139ac576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156139e057608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613a14576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b1315613a4857608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b1315613a7c5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613ab0576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613ae45760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613b17576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613b4a57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613b7d5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613bb057608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613be35760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613c16576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613c4957608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613c7c576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613cae57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613ce05760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613d12576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613d445760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613d76576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613da857608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613dda5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613e0c57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613e5b57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ee581613eb0565b8114613ef057600080fd5b50565b600081359050613f0281613edc565b92915050565b600060208284031215613f1e57613f1d613eab565b5b6000613f2c84828501613ef3565b91505092915050565b60008115159050919050565b613f4a81613f35565b82525050565b6000602082019050613f656000830184613f41565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fa5578082015181840152602081019050613f8a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fcd82613f6b565b613fd78185613f76565b9350613fe7818560208601613f87565b613ff081613fb1565b840191505092915050565b600060208201905081810360008301526140158184613fc2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140488261401d565b9050919050565b6140588161403d565b811461406357600080fd5b50565b6000813590506140758161404f565b92915050565b6000819050919050565b61408e8161407b565b811461409957600080fd5b50565b6000813590506140ab81614085565b92915050565b600080604083850312156140c8576140c7613eab565b5b60006140d685828601614066565b92505060206140e78582860161409c565b9150509250929050565b600081600f0b9050919050565b614107816140f1565b82525050565b600060208201905061412260008301846140fe565b92915050565b614131816140f1565b811461413c57600080fd5b50565b60008135905061414e81614128565b92915050565b6000806040838503121561416b5761416a613eab565b5b60006141798582860161409c565b925050602061418a8582860161413f565b9150509250929050565b61419d8161407b565b82525050565b60006020820190506141b86000830184614194565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141fb82613fb1565b810181811067ffffffffffffffff8211171561421a576142196141c3565b5b80604052505050565b600061422d613ea1565b905061423982826141f2565b919050565b600063ffffffff82169050919050565b6142578161423e565b811461426257600080fd5b50565b6000813590506142748161424e565b92915050565b600068ffffffffffffffffff82169050919050565b6142988161427a565b81146142a357600080fd5b50565b6000813590506142b58161428f565b92915050565b600067ffffffffffffffff82169050919050565b6142d8816142bb565b81146142e357600080fd5b50565b6000813590506142f5816142cf565b92915050565b600060608284031215614311576143106141be565b5b61431b6060614223565b9050600061432b84828501614265565b600083015250602061433f848285016142a6565b6020830152506040614353848285016142e6565b60408301525092915050565b60006060828403121561437557614374613eab565b5b6000614383848285016142fb565b91505092915050565b6000806000606084860312156143a5576143a4613eab565b5b60006143b386828701614066565b93505060206143c486828701614066565b92505060406143d58682870161409c565b9150509250925092565b6000602082840312156143f5576143f4613eab565b5b600061440384828501614066565b91505092915050565b6000806040838503121561442357614422613eab565b5b60006144318582860161409c565b92505060206144428582860161409c565b9150509250929050565b60006020828403121561446257614461613eab565b5b60006144708482850161409c565b91505092915050565b6144828161423e565b82525050565b6144918161427a565b82525050565b6144a0816142bb565b82525050565b60006060820190506144bb6000830186614479565b6144c86020830185614488565b6144d56040830184614497565b949350505050565b6144e68161403d565b82525050565b600060208201905061450160008301846144dd565b92915050565b6000806000806080858703121561452157614520613eab565b5b600061452f8782880161409c565b94505060206145408782880161413f565b93505060406145518782880161409c565b92505060606145628782880161409c565b91505092959194509250565b6145778161423e565b82525050565b6145868161427a565b82525050565b614595816142bb565b82525050565b6060820160008201516145b1600085018261456e565b5060208201516145c4602085018261457d565b5060408201516145d7604085018261458c565b50505050565b60006060820190506145f2600083018461459b565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61461d816145f8565b82525050565b60006020820190506146386000830184614614565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468557607f821691505b6020821081036146985761469761463e565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006146d4600a83613f76565b91506146df8261469e565b602082019050919050565b60006020820190508181036000830152614703816146c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147448261407b565b915061474f8361407b565b92508282039050818111156147675761476661470a565b5b92915050565b60006147788261407b565b91506147838361407b565b925082820190508082111561479b5761479a61470a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006147d7600a83613f76565b91506147e2826147a1565b602082019050919050565b60006020820190508181036000830152614806816147ca565b9050919050565b60006148188261407b565b91506148238361407b565b92508282026148318161407b565b915082820484148315176148485761484761470a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148898261407b565b91506148948361407b565b9250826148a4576148a361484f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000614914600d83613f76565b915061491f826148de565b602082019050919050565b6000602082019050818103600083015261494381614907565b9050919050565b614953816145f8565b811461495e57600080fd5b50565b6000815190506149708161494a565b92915050565b60006020828403121561498c5761498b613eab565b5b600061499a84828501614961565b9150509291505056fea26469706673582212202f9fd5ae905e4e9dbc4084dd07c38e2c49d286e79910182ef402212c49c2eb2864736f6c63430008110033 \ No newline at end of file diff --git a/python/tests/test_growth.py b/python/tests/test_growth.py index df321d0..cccfa25 100644 --- a/python/tests/test_growth.py +++ b/python/tests/test_growth.py @@ -44,5 +44,23 @@ class TestGrowth(TestDemurrageDefault): self.assertEqual(int(g), 980000000) + def test_decay_steps(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + v = 1000000000 + o = c.decay_by(self.address, v, 43200, sender_address=self.accounts[0]) + r = self.rpc.do(o) + gr = c.parse_decay_by(r) + + v = 1000000000 + for i in range(100): + o = c.decay_by(self.address, v, 432, sender_address=self.accounts[0]) + r = self.rpc.do(o) + v = c.parse_decay_by(r) + + self.assert_within_lower(int(v), int(gr), 0.1) + + if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_period.py b/python/tests/test_period.py index 4ff5457..1b0b16e 100644 --- a/python/tests/test_period.py +++ b/python/tests/test_period.py @@ -16,10 +16,13 @@ from chainlib.eth.contract import ( ABIContractEncoder, ABIContractType, ) +from hexathon import same as hex_same +from hexathon import strip_0x # local imports from erc20_demurrage_token import DemurrageToken -from erc20_demurrage_token.token import DemurrageRedistribution +from erc20_demurrage_token import DemurrageRedistribution +from erc20_demurrage_token.fixed import from_fixed # test imports from erc20_demurrage_token.unittest import TestDemurrageDefault @@ -31,6 +34,55 @@ testdir = os.path.dirname(__file__) class TestPeriod(TestDemurrageDefault): + def test_period_and_amount(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + for i in range(100): + self.backend.time_travel(self.start_time + int((self.period_seconds / 100) * (i + 1))) + (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[0], 0) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + for lg in r['logs']: + if hex_same(lg['topics'][0], '1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736'): + self.assert_equal_decimals(0.98, from_fixed(strip_0x(lg['data'])), 2) + + + def test_period_demurrage(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + self.backend.time_travel(self.start_time + self.period_seconds + int(self.period_seconds / 2)) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + for lg in r['logs']: + if hex_same(lg['topics'][0], '1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736'): + self.assert_equal_decimals(0.9701, from_fixed(strip_0x(lg['data'])), 4) + + o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) + r = self.rpc.do(o) + redistribution_data = c.parse_redistributions(r) + redistribution = DemurrageRedistribution(redistribution_data) + logg.debug('fixxx {}'.format(redistribution.demurrage)) + + def test_period(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -65,17 +117,9 @@ class TestPeriod(TestDemurrageDefault): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - period = c.parse_to_redistribution_item(r) + period = from_fixed(r) redistro = DemurrageRedistribution(redistribution) - - # allow test code float rounding error to billionth - modifier = (1 - (self.tax_level / 1000000)) ** (self.period_seconds / 60) - modifier *= 10 ** 9 - modifier = int(modifier) * (10 ** (28 - 9)) - - period /= (10 ** (28 - 9)) - period = int(period) * (10 ** (28 - 9)) - self.assertEqual(modifier, period) + logg.debug('redistro {} {}'.format(redistro, period)) self.backend.time_travel(self.start_time + self.period_seconds * 2) @@ -92,7 +136,7 @@ class TestPeriod(TestDemurrageDefault): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - period = c.parse_to_redistribution_item(r) + period = from_fixed(r) # allow test code float rounding error to billionth modifier = (1 - (self.tax_level / 1000000)) ** ((self.period_seconds * 2) / 60) diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index b911cab..a3420b1 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -16,13 +16,15 @@ from chainlib.eth.address import to_checksum_address from hexathon import ( strip_0x, add_0x, + same as hex_same, ) # local imports from erc20_demurrage_token import DemurrageToken +from erc20_demurrage_token.fixed import from_fixed # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.INFO) logg = logging.getLogger() @@ -42,8 +44,8 @@ class TestRedistribution(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], supply) self.rpc.do(o) - for i in range(1, 10): - logg.debug('execute time travel to period {}'.format(i)) + for i in range(1, 100): + logg.info('execute time travel to period {}'.format(i)) self.backend.time_travel(self.start_time + (self.period_seconds * i)) (tx_hash, o) = c.change_period(self.address, self.accounts[0]) self.rpc.do(o) @@ -51,19 +53,26 @@ class TestRedistribution(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) + redistribution_value = 0 + for lg in r['logs']: + if hex_same(lg['topics'][0], '0x9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3'): + redistribution_value = int(strip_0x(lg['data']), 16) + o = c.redistributions(self.address, i, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - demurrage = c.parse_to_redistribution_item(r) + #demurrage = c.parse_to_redistribution_item(r) + demurrage = from_fixed(r) o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) redistribution = self.rpc.do(o) o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - demurrage_previous = c.parse_to_redistribution_item(r) + #demurrage_previous = c.parse_to_redistribution_item(r) + demurrage_previous = from_fixed(r) o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) r = self.rpc.do(o) @@ -73,9 +82,9 @@ class TestRedistribution(TestDemurrageDefault): r = self.rpc.do(o) balance_minter = c.parse_balance(r) - logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, supply, demurrage_previous, demurrage)) + logg.info('testing redistro {} sink {} mint {} adds up to {} supply {} with demurrage between {} and {}'.format(redistribution_value, balance_sink, balance_minter, balance_sink + balance_minter, supply, demurrage_previous, demurrage)) - self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + self.assert_within(balance_minter + balance_sink, supply, 10) def test_redistribution_catchup_periods(self): @@ -137,7 +146,7 @@ class TestRedistribution(TestDemurrageDefault): logg.debug('testing sink {} mint {} adds up to supply {} with demurrage between {} and {}'.format(balance_sink, balance_minter, real_supply, demurrage_previous, demurrage)) - self.assert_within_lower(balance_minter + balance_sink, supply, 0.001) + self.assert_within_lower(balance_minter + balance_sink, supply, 0.1) # def test_redistribution_boundaries(self): diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 1e00fa0..13ea730 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -320,7 +320,7 @@ contract DemurrageTokenSingleCap { uint256 unit; uint256 baseUnit; - unit = getDistributionFromRedistribution(_redistribution); + unit = totalSupply() - getDistributionFromRedistribution(_redistribution); baseUnit = toBaseAmount(unit) - totalSink; increaseBaseBalance(sinkAddress, baseUnit); emit Redistribution(sinkAddress, _redistribution.period, unit); @@ -352,9 +352,9 @@ contract DemurrageTokenSingleCap { currentPeriod = toRedistributionPeriod(currentRedistribution); nextPeriod = currentPeriod + 1; lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); - demurrageCounts = periodDuration / 60; - nextRedistributionDemurrage = ABDKMath64x64.mul(taxLevel, ABDKMath64x64.fromUInt(demurrageCounts)); - nextRedistributionDemurrage = lastDemurrageAmount - ABDKMath64x64.exp(nextRedistributionDemurrage); + demurrageCounts = (periodDuration * currentPeriod) / 60; + // TODO refactor decayby to take int128 then DRY with it + nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, ABDKMath64x64.fromUInt(demurrageCounts))); nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); redistributions.push(nextRedistribution); @@ -394,8 +394,8 @@ contract DemurrageTokenSingleCap { periodPoint = ABDKMath64x64.fromUInt(periodCount); v = ABDKMath64x64.mul(taxLevel, periodPoint); v = ABDKMath64x64.exp(v); - demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v); + demurrageTimestamp = demurrageTimestamp + (periodCount * 60); emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); return periodCount; From dc891ce9bb897659ced9d9fcc312b873fc05a06c Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 10:05:10 +0000 Subject: [PATCH 21/57] Rehabilitate deployer cli script --- .../erc20_demurrage_token/runnable/deploy.py | 145 ++-- python/erc20_demurrage_token/token.py | 19 +- .../unittest/__init__.py | 2 +- python/erc20_demurrage_token/unittest/base.py | 167 +--- .../erc20_demurrage_token/unittest/newbase.py | 11 +- python/requirements.txt | 1 + python/tests/test_period.py | 2 +- python/tests/test_redistribution_single.py | 4 +- python/tests/test_redistribution_unit.py | 2 +- python/tests/test_single.py | 2 +- solidity/aux/ABDKMath64x64.sol | 752 ++++++++++++++++++ 11 files changed, 886 insertions(+), 221 deletions(-) create mode 100644 solidity/aux/ABDKMath64x64.sol diff --git a/python/erc20_demurrage_token/runnable/deploy.py b/python/erc20_demurrage_token/runnable/deploy.py index 71b8060..487b26f 100644 --- a/python/erc20_demurrage_token/runnable/deploy.py +++ b/python/erc20_demurrage_token/runnable/deploy.py @@ -29,6 +29,21 @@ from chainlib.eth.connection import EthHTTPConnection from chainlib.eth.tx import receipt from chainlib.eth.constant import ZERO_ADDRESS import chainlib.eth.cli +from chainlib.eth.cli.arg import ( + Arg, + ArgFlag, + process_args, + ) +from chainlib.eth.cli.config import ( + Config, + process_config, + ) +from chainlib.eth.cli.log import process_log +from chainlib.eth.settings import process_settings +from chainlib.eth.address import to_checksum_address +from chainlib.settings import ChainSettings + +from dexif import to_fixed # local imports import erc20_demurrage_token @@ -37,7 +52,6 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, ) -logging.basicConfig(level=logging.WARNING) logg = logging.getLogger() script_dir = os.path.dirname(__file__) @@ -45,76 +59,103 @@ data_dir = os.path.join(script_dir, '..', 'data') config_dir = os.path.join(data_dir, 'config') -arg_flags = chainlib.eth.cli.argflag_std_write + +def process_config_local(config, arg, args, flags): + config.add(args.token_name, 'TOKEN_NAME') + config.add(args.token_symbol, 'TOKEN_SYMBOL') + config.add(args.token_decimals, 'TOKEN_DECIMALS') + sink_address = to_checksum_address(args.sink_address) + config.add(sink_address, 'TOKEN_SINK_ADDRESS') + config.add(args.redistribution_period, 'TOKEN_REDISTRIBUTION_PERIOD') + + v = args.demurrage_level / 1000000 + if v >= 1.0: + raise ValueError('demurrage level must be less than 100%') + demurrage_level = to_fixed(v) + config.add(demurrage_level, 'TOKEN_DEMURRAGE_LEVEL') + return config + + +arg_flags = ArgFlag() +arg = Arg(arg_flags) +flags = arg_flags.STD_WRITE | arg_flags.WALLET + argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser = process_args(argparser, arg, flags) argparser.add_argument('--name', dest='token_name', type=str, help='Token name') argparser.add_argument('--symbol', dest='token_symbol', required=True, type=str, help='Token symbol') argparser.add_argument('--decimals', dest='token_decimals', type=int, help='Token decimals') argparser.add_argument('--sink-address', dest='sink_address', type=str, help='demurrage level,ppm per minute') -argparser.add_argument('--supply-limit', dest='supply_limit', type=int, help='token supply limit (0 = no limit)') argparser.add_argument('--redistribution-period', type=int, help='redistribution period, minutes (0 = deactivate)') # default 10080 = week -argparser.add_argument('--multi', action='store_true', help='automatic redistribution') -argparser.add_argument('--demurrage-level', dest='demurrage_level', type=int, help='demurrage level, ppm per minute') +argparser.add_argument('--demurrage-level', dest='demurrage_level', type=int, help='demurrage level, ppm per period') args = argparser.parse_args() -arg_flags = chainlib.eth.cli.argflag_std_write +logg = process_log(args, logg) -extra_args = { - 'redistribution_period': 'TOKEN_REDISTRIBUTION_PERIOD', - 'demurrage_level': 'TOKEN_DEMURRAGE_LEVEL', - 'supply_limit': 'TOKEN_SUPPLY_LIMIT', - 'token_name': 'TOKEN_NAME', - 'token_symbol': 'TOKEN_SYMBOL', - 'token_decimals': 'TOKEN_DECIMALS', - 'sink_address': 'TOKEN_SINK_ADDRESS', - 'multi': None, - } -config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) - -if not bool(config.get('TOKEN_NAME')): - logg.info('token name not set, using symbol {} as name'.format(config.get('TOKEN_SYMBOL'))) - config.add(config.get('TOKEN_SYMBOL'), 'TOKEN_NAME', True) - -if config.get('TOKEN_SUPPLY_LIMIT') == None: - config.add(0, 'TOKEN_SUPPLY_LIMIT', True) - -if config.get('TOKEN_REDISTRIBUTION_PERIOD') == None: - config.add(10800, 'TOKEN_REDISTRIBUTION_PERIOD', True) +config = Config() +config = process_config(config, arg, args, flags) +config = process_config_local(config, arg, args, flags) logg.debug('config loaded:\n{}'.format(config)) -wallet = chainlib.eth.cli.Wallet() -wallet.from_config(config) +settings = ChainSettings() +settings = process_settings(settings, config) +logg.debug('settings loaded:\n{}'.format(settings)) -rpc = chainlib.eth.cli.Rpc(wallet=wallet) -conn = rpc.connect_by_config(config) -chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) +#extra_args = { +# 'redistribution_period': 'TOKEN_REDISTRIBUTION_PERIOD', +# 'demurrage_level': 'TOKEN_DEMURRAGE_LEVEL', +# 'supply_limit': 'TOKEN_SUPPLY_LIMIT', +# 'token_name': 'TOKEN_NAME', +# 'token_symbol': 'TOKEN_SYMBOL', +# 'token_decimals': 'TOKEN_DECIMALS', +# 'sink_address': 'TOKEN_SINK_ADDRESS', +# 'multi': None, +# } +#config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) +# +#if not bool(config.get('TOKEN_NAME')): +# logg.info('token name not set, using symbol {} as name'.format(config.get('TOKEN_SYMBOL'))) +# config.add(config.get('TOKEN_SYMBOL'), 'TOKEN_NAME', True) +# +#if config.get('TOKEN_SUPPLY_LIMIT') == None: +# config.add(0, 'TOKEN_SUPPLY_LIMIT', True) +# +#if config.get('TOKEN_REDISTRIBUTION_PERIOD') == None: +# config.add(10800, 'TOKEN_REDISTRIBUTION_PERIOD', True) +#logg.debug('config loaded:\n{}'.format(config)) +# +#wallet = chainlib.eth.cli.Wallet() +#wallet.from_config(config) +# +#rpc = chainlib.eth.cli.Rpc(wallet=wallet) +#conn = rpc.connect_by_config(config) +# +#chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) def main(): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() - - gas_oracle = rpc.get_gas_oracle() - nonce_oracle = rpc.get_nonce_oracle() - - c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) - settings = DemurrageTokenSettings() - settings.name = config.get('TOKEN_NAME') - settings.symbol = config.get('TOKEN_SYMBOL') - settings.decimals = int(config.get('TOKEN_DECIMALS')) - settings.demurrage_level = int(config.get('TOKEN_DEMURRAGE_LEVEL')) - settings.period_minutes = int(config.get('TOKEN_REDISTRIBUTION_PERIOD')) - settings.sink_address = config.get('TOKEN_SINK_ADDRESS') + conn = settings.get('CONN') + c = DemurrageToken( + settings.get('CHAIN_SPEC'), + signer=settings.get('SIGNER'), + gas_oracle=settings.get('FEE_ORACLE'), + nonce_oracle=settings.get('NONCE_ORACLE'), + ) + token_settings = DemurrageTokenSettings() + token_settings.name = config.get('TOKEN_NAME') + token_settings.symbol = config.get('TOKEN_SYMBOL') + token_settings.decimals = int(config.get('TOKEN_DECIMALS')) + token_settings.demurrage_level = int(config.get('TOKEN_DEMURRAGE_LEVEL')) + token_settings.period_minutes = int(config.get('TOKEN_REDISTRIBUTION_PERIOD')) + token_settings.sink_address = config.get('TOKEN_SINK_ADDRESS') (tx_hash_hex, o) = c.constructor( - signer_address, - settings, - redistribute=config.true('_MULTI'), - cap=int(config.get('TOKEN_SUPPLY_LIMIT')), + settings.get('SENDER_ADDRESS'), + token_settings, ) - if config.get('_RPC_SEND'): + if settings.get('RPC_SEND'): conn.do(o) - if config.get('_WAIT'): + if config.true('_WAIT'): r = conn.wait(tx_hash_hex) if r['status'] == 0: sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 8168173..2053256 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -21,10 +21,10 @@ from hexathon import ( add_0x, strip_0x, ) +from dexif import from_fixed # local imports from erc20_demurrage_token.data import data_dir -from erc20_demurrage_token.fixed import from_fixed logg = logging.getLogger(__name__) @@ -82,10 +82,10 @@ class DemurrageToken(ERC20): 'SingleCap', ] - def constructor(self, sender_address, settings, redistribute=True, cap=0, tx_format=TxFormat.JSONRPC): + def constructor(self, sender_address, settings, cap=0, tx_format=TxFormat.JSONRPC): if int(cap) < 0: raise ValueError('cap must be 0 or positive integer') - code = DemurrageToken.bytecode(multi=redistribute, cap=cap>0) + code = DemurrageToken.bytecode() enc = ABIContractEncoder() enc.string(settings.name) enc.string(settings.symbol) @@ -603,18 +603,7 @@ class DemurrageToken(ERC20): @classmethod def parse_redistributions(self, v): return strip_0x(v) - #return DemurrageRedistribution(v) -# d = ABIContractDecoder() -# v = strip_0x(v) -# d.typ(ABIContractType.BYTES32) -# d.typ(ABIContractType.BYTES32) -# d.typ(ABIContractType.BYTES32) -# d.val(v[:64]) -# d.val(v[64:128]) -# d.val(v[128:192]) -# r = d.decode() -# return ''.join(r) - + @classmethod def parse_account_period(self, v): diff --git a/python/erc20_demurrage_token/unittest/__init__.py b/python/erc20_demurrage_token/unittest/__init__.py index 61f6a46..9b5ed21 100644 --- a/python/erc20_demurrage_token/unittest/__init__.py +++ b/python/erc20_demurrage_token/unittest/__init__.py @@ -1 +1 @@ -from .newbase import * +from .base import * diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index c7eda7c..d9979c2 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -1,6 +1,7 @@ # standard imports import logging import os +import math # external imports from chainlib.eth.unittest.ethtester import EthTesterCase @@ -19,6 +20,7 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, DemurrageToken, ) +from dexif import * logg = logging.getLogger() @@ -26,12 +28,12 @@ logg = logging.getLogger() TAX_LEVEL = int(10000 * 2) # 2% # calc "1-(0.98)^(1/518400)" <- 518400 = 30 days of blocks # 0.00000003897127107225 -#PERIOD = int(60/BLOCKTIME) * 60 * 24 * 30 # month -PERIOD = 10 +PERIOD = 43200 class TestTokenDeploy: + """tax level is ppm, 1000000 = 100%""" def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12, tax_level=TAX_LEVEL, period=PERIOD): self.tax_level = tax_level self.period_seconds = period * 60 @@ -40,7 +42,8 @@ class TestTokenDeploy: self.settings.name = token_name self.settings.symbol = token_symbol self.settings.decimals = 6 - self.settings.demurrage_level = tax_level * (10 ** 32) + tax_level_input = to_fixed((1 - (tax_level / 1000000)) ** (1 / period)) + self.settings.demurrage_level = tax_level_input self.settings.period_minutes = period self.settings.sink_address = sink_address self.sink_address = self.settings.sink_address @@ -58,24 +61,13 @@ class TestTokenDeploy: self.start_time = int(r['timestamp']) self.default_supply = supply - self.default_supply_cap = int(self.default_supply * 10) + self.default_supply_cap = 0 - def deploy(self, rpc, deployer_address, interface, mode, supply_cap=10**12): + def deploy(self, rpc, deployer_address, interface, supply_cap=0): tx_hash = None o = None - logg.debug('mode {} {}'.format(mode, self.settings)) - self.mode = mode - if mode == 'MultiNocap': - (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=True, cap=0) - elif mode == 'SingleNocap': - (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=0) - elif mode == 'MultiCap': - (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=True, cap=supply_cap) - elif mode == 'SingleCap': - (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=supply_cap) - else: - raise ValueError('Invalid mode "{}", valid are {}'.format(mode, DemurrageToken.valid_modes)) + (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=0) r = rpc.do(o) o = receipt(tx_hash) @@ -95,13 +87,6 @@ class TestDemurrage(EthTesterCase): def setUp(self): super(TestDemurrage, self).setUp() -# token_deploy = TestTokenDeploy() -# self.settings = token_deploy.settings -# self.sink_address = token_deploy.sink_address -# self.start_block = token_deploy.start_block -# self.start_time = token_deploy.start_time -# self.default_supply = self.default_supply -# self.default_supply_cap = self.default_supply_cap period = PERIOD try: period = getattr(self, 'period') @@ -115,8 +100,8 @@ class TestDemurrage(EthTesterCase): self.start_time = None - def deploy(self, interface, mode): - self.address = self.deployer.deploy(self.rpc, self.accounts[0], interface, mode, supply_cap=self.default_supply_cap) + def deploy(self, interface): + self.address = self.deployer.deploy(self.rpc, self.accounts[0], interface, supply_cap=self.default_supply_cap) self.start_block = self.deployer.start_block self.start_time = self.deployer.start_time self.tax_level = self.deployer.tax_level @@ -126,6 +111,17 @@ class TestDemurrage(EthTesterCase): logg.debug('contract address {} start block {} start time {}'.format(self.address, self.start_block, self.start_time)) + def assert_within(self, v, target, tolerance_ppm): + lower_target = target - (target * (tolerance_ppm / 1000000)) + higher_target = target + (target * (tolerance_ppm / 1000000)) + #self.assertGreaterEqual(v, lower_target) + #self.assertLessEqual(v, higher_target) + if v >= lower_target and v <= higher_target: + logg.debug('asserted within {} <= {} <= {}'.format(lower_target, v, higher_target)) + return + raise AssertionError('{} not within lower {} and higher {}'.format(v, lower_target, higher_target)) + + def assert_within_lower(self, v, target, tolerance_ppm): lower_target = target - (target * (tolerance_ppm / 1000000)) self.assertGreaterEqual(v, lower_target) @@ -133,6 +129,12 @@ class TestDemurrage(EthTesterCase): logg.debug('asserted within lower {} <= {} <= {}'.format(lower_target, v, target)) + def assert_equal_decimals(self, v, target, precision): + target = int(target * (10 ** precision)) + target = target / (10 ** precision) + self.assertEqual(v, target) + + def tearDown(self): pass @@ -145,115 +147,4 @@ class TestDemurrageDefault(TestDemurrage): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') - if self.mode == None: - self.mode = 'MultiNocap' - logg.debug('executing test setup default mode {}'.format(self.mode)) - - self.deploy(c, self.mode) - - logg.info('deployed with mode {}'.format(self.mode)) - - -class TestDemurrageSingle(TestDemurrage): - - def setUp(self): - super(TestDemurrageSingle, self).setUp() - - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') - single_valid_modes = [ - 'SingleNocap', - 'SingleCap', - ] - if self.mode != None: - if self.mode not in single_valid_modes: - raise ValueError('Invalid mode "{}" for "single" contract tests, valid are {}'.format(self.mode, single_valid_modes)) - else: - self.mode = 'SingleNocap' - logg.debug('executing test setup demurragesingle mode {}'.format(self.mode)) - - self.deploy(c, self.mode) - - logg.info('deployed with mode {}'.format(self.mode)) - - -class TestDemurrageCap(TestDemurrage): - - def setUp(self): - super(TestDemurrageCap, self).setUp() - - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') - cap_valid_modes = [ - 'MultiCap', - 'SingleCap', - ] - if self.mode != None: - if self.mode not in cap_valid_modes: - raise ValueError('Invalid mode "{}" for "cap" contract tests, valid are {}'.format(self.mode, cap_valid_modes)) - else: - self.mode = 'MultiCap' - logg.debug('executing test setup demurragecap mode {}'.format(self.mode)) - - self.deploy(c, self.mode) - - logg.info('deployed with mode {}'.format(self.mode)) - - - -class TestDemurrageUnit(TestDemurrage): - - def setUp(self): - self.period = 1 - self.period_seconds = self.period * 60 - self.tax_level = TAX_LEVEL - - super(TestDemurrageUnit, self).setUp() - - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - self.settings = DemurrageTokenSettings() - self.settings.name = 'Foo Token' - self.settings.symbol = 'FOO' - self.settings.decimals = 6 - self.settings.demurrage_level = self.tax_level * (10 ** 32) - self.settings.period_minutes = int(self.period_seconds/60) - self.settings.sink_address = self.accounts[9] - self.sink_address = self.settings.sink_address - - o = block_latest() - self.start_block = self.rpc.do(o) - - o = block_by_number(self.start_block, include_tx=False) - r = self.rpc.do(o) - - try: - self.start_time = int(r['timestamp'], 16) - except TypeError: - self.start_time = int(r['timestamp']) - - self.default_supply = 1000000000000 - self.default_supply_cap = int(self.default_supply * 10) - - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - self.mode = os.environ.get('ERC20_DEMURRAGE_TOKEN_TEST_MODE') - unit_valid_modes = [ - 'SingleNocap', - 'SingleCap', - ] - if self.mode != None: - if self.mode not in unit_valid_modes: - raise ValueError('Invalid mode "{}" for "unit" contract tests, valid are {}'.format(self.mode, unit_valid_modes)) - else: - self.mode = 'SingleNocap' - logg.debug('executing test setup unit mode {}'.format(self.mode)) - - self.deploy(c, self.mode) - - logg.info('deployed with mode {}'.format(self.mode)) + self.deploy(c) diff --git a/python/erc20_demurrage_token/unittest/newbase.py b/python/erc20_demurrage_token/unittest/newbase.py index a06fae1..ae177bc 100644 --- a/python/erc20_demurrage_token/unittest/newbase.py +++ b/python/erc20_demurrage_token/unittest/newbase.py @@ -20,19 +20,12 @@ from erc20_demurrage_token import ( DemurrageTokenSettings, DemurrageToken, ) -from erc20_demurrage_token.fixed import ( - to_fixed, - from_fixed, - ) +from dexif import * logg = logging.getLogger() -#BLOCKTIME = 5 # seconds TAX_LEVEL = int(10000 * 2) # 2% -# calc "1-(0.98)^(1/518400)" <- 518400 = 30 days of blocks -# 0.00000003897127107225 -PERIOD = 43200 - +PERIOD = 43200 # 30 days in minutes class TestTokenDeploy: diff --git a/python/requirements.txt b/python/requirements.txt index 8cc5de0..9dbeab8 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,3 +1,4 @@ chainlib-eth~=0.4.11 eth-erc20~=0.5.0 funga-eth~=0.6.0 +dexif~=0.0.1 diff --git a/python/tests/test_period.py b/python/tests/test_period.py index 1b0b16e..9fc6da5 100644 --- a/python/tests/test_period.py +++ b/python/tests/test_period.py @@ -18,11 +18,11 @@ from chainlib.eth.contract import ( ) from hexathon import same as hex_same from hexathon import strip_0x +from dexif import from_fixed # local imports from erc20_demurrage_token import DemurrageToken from erc20_demurrage_token import DemurrageRedistribution -from erc20_demurrage_token.fixed import from_fixed # test imports from erc20_demurrage_token.unittest import TestDemurrageDefault diff --git a/python/tests/test_redistribution_single.py b/python/tests/test_redistribution_single.py index a3420b1..c45bcc2 100644 --- a/python/tests/test_redistribution_single.py +++ b/python/tests/test_redistribution_single.py @@ -18,10 +18,10 @@ from hexathon import ( add_0x, same as hex_same, ) +from dexif import from_fixed # local imports from erc20_demurrage_token import DemurrageToken -from erc20_demurrage_token.fixed import from_fixed # test imports from erc20_demurrage_token.unittest import TestDemurrageDefault @@ -63,7 +63,6 @@ class TestRedistribution(TestDemurrageDefault): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - #demurrage = c.parse_to_redistribution_item(r) demurrage = from_fixed(r) o = c.redistributions(self.address, i-1, sender_address=self.accounts[0]) @@ -71,7 +70,6 @@ class TestRedistribution(TestDemurrageDefault): o = c.to_redistribution_demurrage_modifier(self.address, redistribution, sender_address=self.accounts[0]) r = self.rpc.do(o) - #demurrage_previous = c.parse_to_redistribution_item(r) demurrage_previous = from_fixed(r) o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) diff --git a/python/tests/test_redistribution_unit.py b/python/tests/test_redistribution_unit.py index a2a7ebe..386fb23 100644 --- a/python/tests/test_redistribution_unit.py +++ b/python/tests/test_redistribution_unit.py @@ -16,10 +16,10 @@ from hexathon import ( strip_0x, add_0x, ) +from dexif import to_fixed # local imports from erc20_demurrage_token import DemurrageToken -from erc20_demurrage_token.fixed import to_fixed from erc20_demurrage_token import DemurrageRedistribution # test imports diff --git a/python/tests/test_single.py b/python/tests/test_single.py index 508ca07..230c644 100644 --- a/python/tests/test_single.py +++ b/python/tests/test_single.py @@ -13,13 +13,13 @@ from hexathon import ( strip_0x, add_0x, ) +from dexif import to_fixed # local imports from erc20_demurrage_token import DemurrageToken # test imports from erc20_demurrage_token.unittest import TestDemurrageDefault -from erc20_demurrage_token.fixed import to_fixed logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() diff --git a/solidity/aux/ABDKMath64x64.sol b/solidity/aux/ABDKMath64x64.sol new file mode 100644 index 0000000..8b53809 --- /dev/null +++ b/solidity/aux/ABDKMath64x64.sol @@ -0,0 +1,752 @@ +// SPDX-License-Identifier: BSD-4-Clause +/* + * ABDK Math 64.64 Smart Contract Library. Copyright © 2019 by ABDK Consulting. + * Author: Mikhail Vladimirov + */ +pragma solidity ^0.8.0; + +/** + * Smart contract library of mathematical functions operating with signed + * 64.64-bit fixed point numbers. Signed 64.64-bit fixed point number is + * basically a simple fraction whose numerator is signed 128-bit integer and + * denominator is 2^64. As long as denominator is always the same, there is no + * need to store it, thus in Solidity signed 64.64-bit fixed point numbers are + * represented by int128 type holding only the numerator. + */ +library ABDKMath64x64 { + /* + * Minimum value signed 64.64-bit fixed point number may have. + */ + int128 private constant MIN_64x64 = -0x80000000000000000000000000000000; + + /* + * Maximum value signed 64.64-bit fixed point number may have. + */ + int128 private constant MAX_64x64 = 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; + + /** + * Convert signed 256-bit integer number into signed 64.64-bit fixed point + * number. Revert on overflow. + * + * @param x signed 256-bit integer number + * @return signed 64.64-bit fixed point number + */ + function fromInt (int256 x) internal pure returns (int128) { + unchecked { + require (x >= -0x8000000000000000 && x <= 0x7FFFFFFFFFFFFFFF); + return int128 (x << 64); + } + } + + /** + * Convert signed 64.64 fixed point number into signed 64-bit integer number + * rounding down. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64-bit integer number + */ + function toInt (int128 x) internal pure returns (int64) { + unchecked { + return int64 (x >> 64); + } + } + + /** + * Convert unsigned 256-bit integer number into signed 64.64-bit fixed point + * number. Revert on overflow. + * + * @param x unsigned 256-bit integer number + * @return signed 64.64-bit fixed point number + */ + function fromUInt (uint256 x) internal pure returns (int128) { + unchecked { + require (x <= 0x7FFFFFFFFFFFFFFF); + return int128 (int256 (x << 64)); + } + } + + /** + * Convert signed 64.64 fixed point number into unsigned 64-bit integer + * number rounding down. Revert on underflow. + * + * @param x signed 64.64-bit fixed point number + * @return unsigned 64-bit integer number + */ + function toUInt (int128 x) internal pure returns (uint64) { + unchecked { + require (x >= 0); + return uint64 (uint128 (x >> 64)); + } + } + + /** + * Convert signed 128.128 fixed point number into signed 64.64-bit fixed point + * number rounding down. Revert on overflow. + * + * @param x signed 128.128-bin fixed point number + * @return signed 64.64-bit fixed point number + */ + function from128x128 (int256 x) internal pure returns (int128) { + unchecked { + int256 result = x >> 64; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Convert signed 64.64 fixed point number into signed 128.128 fixed point + * number. + * + * @param x signed 64.64-bit fixed point number + * @return signed 128.128 fixed point number + */ + function to128x128 (int128 x) internal pure returns (int256) { + unchecked { + return int256 (x) << 64; + } + } + + /** + * Calculate x + y. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function add (int128 x, int128 y) internal pure returns (int128) { + unchecked { + int256 result = int256(x) + y; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate x - y. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function sub (int128 x, int128 y) internal pure returns (int128) { + unchecked { + int256 result = int256(x) - y; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate x * y rounding down. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function mul (int128 x, int128 y) internal pure returns (int128) { + unchecked { + int256 result = int256(x) * y >> 64; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate x * y rounding towards zero, where x is signed 64.64 fixed point + * number and y is signed 256-bit integer number. Revert on overflow. + * + * @param x signed 64.64 fixed point number + * @param y signed 256-bit integer number + * @return signed 256-bit integer number + */ + function muli (int128 x, int256 y) internal pure returns (int256) { + unchecked { + if (x == MIN_64x64) { + require (y >= -0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF && + y <= 0x1000000000000000000000000000000000000000000000000); + return -y << 63; + } else { + bool negativeResult = false; + if (x < 0) { + x = -x; + negativeResult = true; + } + if (y < 0) { + y = -y; // We rely on overflow behavior here + negativeResult = !negativeResult; + } + uint256 absoluteResult = mulu (x, uint256 (y)); + if (negativeResult) { + require (absoluteResult <= + 0x8000000000000000000000000000000000000000000000000000000000000000); + return -int256 (absoluteResult); // We rely on overflow behavior here + } else { + require (absoluteResult <= + 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return int256 (absoluteResult); + } + } + } + } + + /** + * Calculate x * y rounding down, where x is signed 64.64 fixed point number + * and y is unsigned 256-bit integer number. Revert on overflow. + * + * @param x signed 64.64 fixed point number + * @param y unsigned 256-bit integer number + * @return unsigned 256-bit integer number + */ + function mulu (int128 x, uint256 y) internal pure returns (uint256) { + unchecked { + if (y == 0) return 0; + + require (x >= 0); + + uint256 lo = (uint256 (int256 (x)) * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)) >> 64; + uint256 hi = uint256 (int256 (x)) * (y >> 128); + + require (hi <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + hi <<= 64; + + require (hi <= + 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF - lo); + return hi + lo; + } + } + + /** + * Calculate x / y rounding towards zero. Revert on overflow or when y is + * zero. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function div (int128 x, int128 y) internal pure returns (int128) { + unchecked { + require (y != 0); + int256 result = (int256 (x) << 64) / y; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate x / y rounding towards zero, where x and y are signed 256-bit + * integer numbers. Revert on overflow or when y is zero. + * + * @param x signed 256-bit integer number + * @param y signed 256-bit integer number + * @return signed 64.64-bit fixed point number + */ + function divi (int256 x, int256 y) internal pure returns (int128) { + unchecked { + require (y != 0); + + bool negativeResult = false; + if (x < 0) { + x = -x; // We rely on overflow behavior here + negativeResult = true; + } + if (y < 0) { + y = -y; // We rely on overflow behavior here + negativeResult = !negativeResult; + } + uint128 absoluteResult = divuu (uint256 (x), uint256 (y)); + if (negativeResult) { + require (absoluteResult <= 0x80000000000000000000000000000000); + return -int128 (absoluteResult); // We rely on overflow behavior here + } else { + require (absoluteResult <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return int128 (absoluteResult); // We rely on overflow behavior here + } + } + } + + /** + * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit + * integer numbers. Revert on overflow or when y is zero. + * + * @param x unsigned 256-bit integer number + * @param y unsigned 256-bit integer number + * @return signed 64.64-bit fixed point number + */ + function divu (uint256 x, uint256 y) internal pure returns (int128) { + unchecked { + require (y != 0); + uint128 result = divuu (x, y); + require (result <= uint128 (MAX_64x64)); + return int128 (result); + } + } + + /** + * Calculate -x. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function neg (int128 x) internal pure returns (int128) { + unchecked { + require (x != MIN_64x64); + return -x; + } + } + + /** + * Calculate |x|. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function abs (int128 x) internal pure returns (int128) { + unchecked { + require (x != MIN_64x64); + return x < 0 ? -x : x; + } + } + + /** + * Calculate 1 / x rounding towards zero. Revert on overflow or when x is + * zero. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function inv (int128 x) internal pure returns (int128) { + unchecked { + require (x != 0); + int256 result = int256 (0x100000000000000000000000000000000) / x; + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate arithmetics average of x and y, i.e. (x + y) / 2 rounding down. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function avg (int128 x, int128 y) internal pure returns (int128) { + unchecked { + return int128 ((int256 (x) + int256 (y)) >> 1); + } + } + + /** + * Calculate geometric average of x and y, i.e. sqrt (x * y) rounding down. + * Revert on overflow or in case x * y is negative. + * + * @param x signed 64.64-bit fixed point number + * @param y signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function gavg (int128 x, int128 y) internal pure returns (int128) { + unchecked { + int256 m = int256 (x) * int256 (y); + require (m >= 0); + require (m < + 0x4000000000000000000000000000000000000000000000000000000000000000); + return int128 (sqrtu (uint256 (m))); + } + } + + /** + * Calculate x^y assuming 0^0 is 1, where x is signed 64.64 fixed point number + * and y is unsigned 256-bit integer number. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @param y uint256 value + * @return signed 64.64-bit fixed point number + */ + function pow (int128 x, uint256 y) internal pure returns (int128) { + unchecked { + bool negative = x < 0 && y & 1 == 1; + + uint256 absX = uint128 (x < 0 ? -x : x); + uint256 absResult; + absResult = 0x100000000000000000000000000000000; + + if (absX <= 0x10000000000000000) { + absX <<= 63; + while (y != 0) { + if (y & 0x1 != 0) { + absResult = absResult * absX >> 127; + } + absX = absX * absX >> 127; + + if (y & 0x2 != 0) { + absResult = absResult * absX >> 127; + } + absX = absX * absX >> 127; + + if (y & 0x4 != 0) { + absResult = absResult * absX >> 127; + } + absX = absX * absX >> 127; + + if (y & 0x8 != 0) { + absResult = absResult * absX >> 127; + } + absX = absX * absX >> 127; + + y >>= 4; + } + + absResult >>= 64; + } else { + uint256 absXShift = 63; + if (absX < 0x1000000000000000000000000) { absX <<= 32; absXShift -= 32; } + if (absX < 0x10000000000000000000000000000) { absX <<= 16; absXShift -= 16; } + if (absX < 0x1000000000000000000000000000000) { absX <<= 8; absXShift -= 8; } + if (absX < 0x10000000000000000000000000000000) { absX <<= 4; absXShift -= 4; } + if (absX < 0x40000000000000000000000000000000) { absX <<= 2; absXShift -= 2; } + if (absX < 0x80000000000000000000000000000000) { absX <<= 1; absXShift -= 1; } + + uint256 resultShift = 0; + while (y != 0) { + require (absXShift < 64); + + if (y & 0x1 != 0) { + absResult = absResult * absX >> 127; + resultShift += absXShift; + if (absResult > 0x100000000000000000000000000000000) { + absResult >>= 1; + resultShift += 1; + } + } + absX = absX * absX >> 127; + absXShift <<= 1; + if (absX >= 0x100000000000000000000000000000000) { + absX >>= 1; + absXShift += 1; + } + + y >>= 1; + } + + require (resultShift < 64); + absResult >>= 64 - resultShift; + } + int256 result = negative ? -int256 (absResult) : int256 (absResult); + require (result >= MIN_64x64 && result <= MAX_64x64); + return int128 (result); + } + } + + /** + * Calculate sqrt (x) rounding down. Revert if x < 0. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function sqrt (int128 x) internal pure returns (int128) { + unchecked { + require (x >= 0); + return int128 (sqrtu (uint256 (int256 (x)) << 64)); + } + } + + /** + * Calculate binary logarithm of x. Revert if x <= 0. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function log_2 (int128 x) internal pure returns (int128) { + unchecked { + require (x > 0); + + int256 msb = 0; + int256 xc = x; + if (xc >= 0x10000000000000000) { xc >>= 64; msb += 64; } + if (xc >= 0x100000000) { xc >>= 32; msb += 32; } + if (xc >= 0x10000) { xc >>= 16; msb += 16; } + if (xc >= 0x100) { xc >>= 8; msb += 8; } + if (xc >= 0x10) { xc >>= 4; msb += 4; } + if (xc >= 0x4) { xc >>= 2; msb += 2; } + if (xc >= 0x2) msb += 1; // No need to shift xc anymore + + int256 result = msb - 64 << 64; + uint256 ux = uint256 (int256 (x)) << uint256 (127 - msb); + for (int256 bit = 0x8000000000000000; bit > 0; bit >>= 1) { + ux *= ux; + uint256 b = ux >> 255; + ux >>= 127 + b; + result += bit * int256 (b); + } + + return int128 (result); + } + } + + /** + * Calculate natural logarithm of x. Revert if x <= 0. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function ln (int128 x) internal pure returns (int128) { + unchecked { + require (x > 0); + + return int128 (int256 ( + uint256 (int256 (log_2 (x))) * 0xB17217F7D1CF79ABC9E3B39803F2F6AF >> 128)); + } + } + + /** + * Calculate binary exponent of x. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function exp_2 (int128 x) internal pure returns (int128) { + unchecked { + require (x < 0x400000000000000000); // Overflow + + if (x < -0x400000000000000000) return 0; // Underflow + + uint256 result = 0x80000000000000000000000000000000; + + if (x & 0x8000000000000000 > 0) + result = result * 0x16A09E667F3BCC908B2FB1366EA957D3E >> 128; + if (x & 0x4000000000000000 > 0) + result = result * 0x1306FE0A31B7152DE8D5A46305C85EDEC >> 128; + if (x & 0x2000000000000000 > 0) + result = result * 0x1172B83C7D517ADCDF7C8C50EB14A791F >> 128; + if (x & 0x1000000000000000 > 0) + result = result * 0x10B5586CF9890F6298B92B71842A98363 >> 128; + if (x & 0x800000000000000 > 0) + result = result * 0x1059B0D31585743AE7C548EB68CA417FD >> 128; + if (x & 0x400000000000000 > 0) + result = result * 0x102C9A3E778060EE6F7CACA4F7A29BDE8 >> 128; + if (x & 0x200000000000000 > 0) + result = result * 0x10163DA9FB33356D84A66AE336DCDFA3F >> 128; + if (x & 0x100000000000000 > 0) + result = result * 0x100B1AFA5ABCBED6129AB13EC11DC9543 >> 128; + if (x & 0x80000000000000 > 0) + result = result * 0x10058C86DA1C09EA1FF19D294CF2F679B >> 128; + if (x & 0x40000000000000 > 0) + result = result * 0x1002C605E2E8CEC506D21BFC89A23A00F >> 128; + if (x & 0x20000000000000 > 0) + result = result * 0x100162F3904051FA128BCA9C55C31E5DF >> 128; + if (x & 0x10000000000000 > 0) + result = result * 0x1000B175EFFDC76BA38E31671CA939725 >> 128; + if (x & 0x8000000000000 > 0) + result = result * 0x100058BA01FB9F96D6CACD4B180917C3D >> 128; + if (x & 0x4000000000000 > 0) + result = result * 0x10002C5CC37DA9491D0985C348C68E7B3 >> 128; + if (x & 0x2000000000000 > 0) + result = result * 0x1000162E525EE054754457D5995292026 >> 128; + if (x & 0x1000000000000 > 0) + result = result * 0x10000B17255775C040618BF4A4ADE83FC >> 128; + if (x & 0x800000000000 > 0) + result = result * 0x1000058B91B5BC9AE2EED81E9B7D4CFAB >> 128; + if (x & 0x400000000000 > 0) + result = result * 0x100002C5C89D5EC6CA4D7C8ACC017B7C9 >> 128; + if (x & 0x200000000000 > 0) + result = result * 0x10000162E43F4F831060E02D839A9D16D >> 128; + if (x & 0x100000000000 > 0) + result = result * 0x100000B1721BCFC99D9F890EA06911763 >> 128; + if (x & 0x80000000000 > 0) + result = result * 0x10000058B90CF1E6D97F9CA14DBCC1628 >> 128; + if (x & 0x40000000000 > 0) + result = result * 0x1000002C5C863B73F016468F6BAC5CA2B >> 128; + if (x & 0x20000000000 > 0) + result = result * 0x100000162E430E5A18F6119E3C02282A5 >> 128; + if (x & 0x10000000000 > 0) + result = result * 0x1000000B1721835514B86E6D96EFD1BFE >> 128; + if (x & 0x8000000000 > 0) + result = result * 0x100000058B90C0B48C6BE5DF846C5B2EF >> 128; + if (x & 0x4000000000 > 0) + result = result * 0x10000002C5C8601CC6B9E94213C72737A >> 128; + if (x & 0x2000000000 > 0) + result = result * 0x1000000162E42FFF037DF38AA2B219F06 >> 128; + if (x & 0x1000000000 > 0) + result = result * 0x10000000B17217FBA9C739AA5819F44F9 >> 128; + if (x & 0x800000000 > 0) + result = result * 0x1000000058B90BFCDEE5ACD3C1CEDC823 >> 128; + if (x & 0x400000000 > 0) + result = result * 0x100000002C5C85FE31F35A6A30DA1BE50 >> 128; + if (x & 0x200000000 > 0) + result = result * 0x10000000162E42FF0999CE3541B9FFFCF >> 128; + if (x & 0x100000000 > 0) + result = result * 0x100000000B17217F80F4EF5AADDA45554 >> 128; + if (x & 0x80000000 > 0) + result = result * 0x10000000058B90BFBF8479BD5A81B51AD >> 128; + if (x & 0x40000000 > 0) + result = result * 0x1000000002C5C85FDF84BD62AE30A74CC >> 128; + if (x & 0x20000000 > 0) + result = result * 0x100000000162E42FEFB2FED257559BDAA >> 128; + if (x & 0x10000000 > 0) + result = result * 0x1000000000B17217F7D5A7716BBA4A9AE >> 128; + if (x & 0x8000000 > 0) + result = result * 0x100000000058B90BFBE9DDBAC5E109CCE >> 128; + if (x & 0x4000000 > 0) + result = result * 0x10000000002C5C85FDF4B15DE6F17EB0D >> 128; + if (x & 0x2000000 > 0) + result = result * 0x1000000000162E42FEFA494F1478FDE05 >> 128; + if (x & 0x1000000 > 0) + result = result * 0x10000000000B17217F7D20CF927C8E94C >> 128; + if (x & 0x800000 > 0) + result = result * 0x1000000000058B90BFBE8F71CB4E4B33D >> 128; + if (x & 0x400000 > 0) + result = result * 0x100000000002C5C85FDF477B662B26945 >> 128; + if (x & 0x200000 > 0) + result = result * 0x10000000000162E42FEFA3AE53369388C >> 128; + if (x & 0x100000 > 0) + result = result * 0x100000000000B17217F7D1D351A389D40 >> 128; + if (x & 0x80000 > 0) + result = result * 0x10000000000058B90BFBE8E8B2D3D4EDE >> 128; + if (x & 0x40000 > 0) + result = result * 0x1000000000002C5C85FDF4741BEA6E77E >> 128; + if (x & 0x20000 > 0) + result = result * 0x100000000000162E42FEFA39FE95583C2 >> 128; + if (x & 0x10000 > 0) + result = result * 0x1000000000000B17217F7D1CFB72B45E1 >> 128; + if (x & 0x8000 > 0) + result = result * 0x100000000000058B90BFBE8E7CC35C3F0 >> 128; + if (x & 0x4000 > 0) + result = result * 0x10000000000002C5C85FDF473E242EA38 >> 128; + if (x & 0x2000 > 0) + result = result * 0x1000000000000162E42FEFA39F02B772C >> 128; + if (x & 0x1000 > 0) + result = result * 0x10000000000000B17217F7D1CF7D83C1A >> 128; + if (x & 0x800 > 0) + result = result * 0x1000000000000058B90BFBE8E7BDCBE2E >> 128; + if (x & 0x400 > 0) + result = result * 0x100000000000002C5C85FDF473DEA871F >> 128; + if (x & 0x200 > 0) + result = result * 0x10000000000000162E42FEFA39EF44D91 >> 128; + if (x & 0x100 > 0) + result = result * 0x100000000000000B17217F7D1CF79E949 >> 128; + if (x & 0x80 > 0) + result = result * 0x10000000000000058B90BFBE8E7BCE544 >> 128; + if (x & 0x40 > 0) + result = result * 0x1000000000000002C5C85FDF473DE6ECA >> 128; + if (x & 0x20 > 0) + result = result * 0x100000000000000162E42FEFA39EF366F >> 128; + if (x & 0x10 > 0) + result = result * 0x1000000000000000B17217F7D1CF79AFA >> 128; + if (x & 0x8 > 0) + result = result * 0x100000000000000058B90BFBE8E7BCD6D >> 128; + if (x & 0x4 > 0) + result = result * 0x10000000000000002C5C85FDF473DE6B2 >> 128; + if (x & 0x2 > 0) + result = result * 0x1000000000000000162E42FEFA39EF358 >> 128; + if (x & 0x1 > 0) + result = result * 0x10000000000000000B17217F7D1CF79AB >> 128; + + result >>= uint256 (int256 (63 - (x >> 64))); + require (result <= uint256 (int256 (MAX_64x64))); + + return int128 (int256 (result)); + } + } + + /** + * Calculate natural exponent of x. Revert on overflow. + * + * @param x signed 64.64-bit fixed point number + * @return signed 64.64-bit fixed point number + */ + function exp (int128 x) internal pure returns (int128) { + unchecked { + require (x < 0x400000000000000000); // Overflow + + if (x < -0x400000000000000000) return 0; // Underflow + + return exp_2 ( + int128 (int256 (x) * 0x171547652B82FE1777D0FFDA0D23A7D12 >> 128)); + } + } + + /** + * Calculate x / y rounding towards zero, where x and y are unsigned 256-bit + * integer numbers. Revert on overflow or when y is zero. + * + * @param x unsigned 256-bit integer number + * @param y unsigned 256-bit integer number + * @return unsigned 64.64-bit fixed point number + */ + function divuu (uint256 x, uint256 y) private pure returns (uint128) { + unchecked { + require (y != 0); + + uint256 result; + + if (x <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF) + result = (x << 64) / y; + else { + uint256 msb = 192; + uint256 xc = x >> 192; + if (xc >= 0x100000000) { xc >>= 32; msb += 32; } + if (xc >= 0x10000) { xc >>= 16; msb += 16; } + if (xc >= 0x100) { xc >>= 8; msb += 8; } + if (xc >= 0x10) { xc >>= 4; msb += 4; } + if (xc >= 0x4) { xc >>= 2; msb += 2; } + if (xc >= 0x2) msb += 1; // No need to shift xc anymore + + result = (x << 255 - msb) / ((y - 1 >> msb - 191) + 1); + require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + + uint256 hi = result * (y >> 128); + uint256 lo = result * (y & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + + uint256 xh = x >> 192; + uint256 xl = x << 64; + + if (xl < lo) xh -= 1; + xl -= lo; // We rely on overflow behavior here + lo = hi << 128; + if (xl < lo) xh -= 1; + xl -= lo; // We rely on overflow behavior here + + assert (xh == hi >> 128); + + result += xl / y; + } + + require (result <= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); + return uint128 (result); + } + } + + /** + * Calculate sqrt (x) rounding down, where x is unsigned 256-bit integer + * number. + * + * @param x unsigned 256-bit integer number + * @return unsigned 128-bit integer number + */ + function sqrtu (uint256 x) private pure returns (uint128) { + unchecked { + if (x == 0) return 0; + else { + uint256 xx = x; + uint256 r = 1; + if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } + if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } + if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } + if (xx >= 0x10000) { xx >>= 16; r <<= 8; } + if (xx >= 0x100) { xx >>= 8; r <<= 4; } + if (xx >= 0x10) { xx >>= 4; r <<= 2; } + if (xx >= 0x4) { r <<= 1; } + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; + r = (r + x / r) >> 1; // Seven iterations should be enough + uint256 r1 = x / r; + return uint128 (r < r1 ? r : r1); + } + } + } +} From 550c0d60cd141284519a8772a28b22e88443c22b Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 10:08:24 +0000 Subject: [PATCH 22/57] Add license to solidity aux dir (abdk-math) --- README.md | 2 ++ solidity/aux/LICENSE.md | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 solidity/aux/LICENSE.md diff --git a/README.md b/README.md index 9ac2c99..ec4b12e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # RedistributedDemurrageToken +**this documentation is obsolete, will rewrite asap** + ## Use Case * Network / Basic Income Token * 100 Sarafu is distributed to anyone in Kenya after user validation by the owner of a faucet which mints new Sarafu. diff --git a/solidity/aux/LICENSE.md b/solidity/aux/LICENSE.md new file mode 100644 index 0000000..838d74e --- /dev/null +++ b/solidity/aux/LICENSE.md @@ -0,0 +1,28 @@ +Copyright (c) 2019, [ABDK Consulting](https://abdk.consulting/) + +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. +3. All advertising materials mentioning features or use of this software must + display the following acknowledgement: This product includes software + developed by ABDK Consulting. +4. Neither the name of ABDK Consulting nor the names of its contributors may be + used to endorse or promote products derived from this software without + specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY ABDK CONSULTING ''AS IS'' AND ANY EXPRESS OR +IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT +SHALL ABDK CONSULTING BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT +OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING +IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. From 008a6ecfba4440b5d88280da0e4993e2e84edbd2 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 10:14:06 +0000 Subject: [PATCH 23/57] Remove redundant apply script --- .../erc20_demurrage_token/runnable/apply.py | 144 ------------------ 1 file changed, 144 deletions(-) delete mode 100644 python/erc20_demurrage_token/runnable/apply.py diff --git a/python/erc20_demurrage_token/runnable/apply.py b/python/erc20_demurrage_token/runnable/apply.py deleted file mode 100644 index 270c0f4..0000000 --- a/python/erc20_demurrage_token/runnable/apply.py +++ /dev/null @@ -1,144 +0,0 @@ -"""Deploy sarafu token - -.. moduleauthor:: Louis Holbrook -.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 - -""" - -# standard imports -import sys -import os -import json -import argparse -import logging -import datetime -import math - -# external imports -import confini -from funga.eth.signer import EIP155Signer -from funga.eth.keystore.dict import DictKeystore -from chainlib.chain import ChainSpec -from chainlib.eth.nonce import ( - RPCNonceOracle, - OverrideNonceOracle, - ) -from chainlib.eth.gas import ( - RPCGasOracle, - OverrideGasOracle, - ) -from chainlib.eth.block import ( - block_latest, - block_by_number, - Block, - ) -from chainlib.eth.connection import EthHTTPConnection -from chainlib.eth.tx import receipt -from chainlib.eth.constant import ZERO_ADDRESS -import chainlib.eth.cli -from hexathon import to_int as hex_to_int - -# local imports -import erc20_demurrage_token -from erc20_demurrage_token import ( - DemurrageToken, - DemurrageTokenSettings, - ) - -logging.basicConfig(level=logging.WARNING) -logg = logging.getLogger() - -script_dir = os.path.dirname(__file__) -data_dir = os.path.join(script_dir, '..', 'data') - -config_dir = os.path.join(data_dir, 'config') - -arg_flags = chainlib.eth.cli.argflag_std_write | chainlib.eth.cli.Flag.EXEC -argparser = chainlib.eth.cli.ArgumentParser(arg_flags) -argparser.add_argument('--steps', type=int, default=0, help='Max demurrage steps to apply per round') -args = argparser.parse_args() -config = chainlib.eth.cli.Config.from_args(args, arg_flags, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) -config.add(args.steps, '_STEPS', False) -logg.debug('config loaded:\n{}'.format(config)) - -wallet = chainlib.eth.cli.Wallet() -wallet.from_config(config) - -rpc = chainlib.eth.cli.Rpc(wallet=wallet) -conn = rpc.connect_by_config(config) - -chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) - - -def main(): - o = block_latest() - r = conn.do(o) - - block_start_number = None - try: - block_start_number = hex_to_int(r) - except TypeError: - block_start_number = int(r) - - o = block_by_number(block_start_number) - r = conn.do(o) - - block_start = Block(r) - block_start_timestamp = block_start.timestamp - block_start_datetime = datetime.datetime.fromtimestamp(block_start_timestamp) - - gas_oracle = rpc.get_gas_oracle() - c = DemurrageToken(chain_spec, gas_oracle=gas_oracle) - o = c.demurrage_timestamp(config.get('_EXEC_ADDRESS')) - r = conn.do(o) - - demurrage_timestamp = None - try: - demurrage_timestamp = hex_to_int(r) - except TypeError: - demurrage_timestamp = int(r) - demurrage_datetime = datetime.datetime.fromtimestamp(demurrage_timestamp) - - total_seconds = block_start_timestamp - demurrage_timestamp - total_steps = total_seconds / 60 - - if total_steps < 1.0: - logg.error('only {} seconds since last demurrage application, skipping'.format(total_seconds)) - return - - logg.debug('block start is at {} demurrage is at {} -> {} minutes'.format( - block_start_datetime, - demurrage_datetime, - total_steps, - )) - - rounds = 1 - if config.get('_STEPS') > 0: - rounds = math.ceil(total_steps / config.get('_STEPS')) - - logg.info('will perform {} rounds of {} steps'.format(rounds, config.get('_STEPS'))) - - last_tx_hash = None - for i in range(rounds): - signer = rpc.get_signer() - signer_address = rpc.get_sender_address() - - nonce_oracle = rpc.get_nonce_oracle() - - c = DemurrageToken(chain_spec, signer=signer, gas_oracle=gas_oracle, nonce_oracle=nonce_oracle) - (tx_hash_hex, o) = c.apply_demurrage(config.get('_EXEC_ADDRESS'), signer_address, limit=config.get('_STEPS')) - if config.get('_RPC_SEND'): - print(tx_hash_hex) - conn.do(o) - if config.get('_WAIT_ALL') or (i == rounds - 1 and config.get('_WAIT')): - r = conn.wait(tx_hash_hex) - if r['status'] == 0: - sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') - sys.exit(1) - else: - print(o) - - - -if __name__ == '__main__': - main() From 4dbbf2c9bc659bfc74990929178b810a98e20e23 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 10:25:43 +0000 Subject: [PATCH 24/57] Remove redistribute parameter in unittest constructor --- python/erc20_demurrage_token/unittest/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index d9979c2..29b6811 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -67,7 +67,7 @@ class TestTokenDeploy: def deploy(self, rpc, deployer_address, interface, supply_cap=0): tx_hash = None o = None - (tx_hash, o) = interface.constructor(deployer_address, self.settings, redistribute=False, cap=0) + (tx_hash, o) = interface.constructor(deployer_address, self.settings, cap=0) r = rpc.do(o) o = receipt(tx_hash) From c25e018cd16f6ec13c47874cacae910ff11b6f21 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 10:57:38 +0000 Subject: [PATCH 25/57] Add benchmark for gas usage --- python/tests/{bench.py => bench.old} | 0 python/tests/bench_gas.py | 167 +++++++++++++++++++++++++++ 2 files changed, 167 insertions(+) rename python/tests/{bench.py => bench.old} (100%) create mode 100644 python/tests/bench_gas.py diff --git a/python/tests/bench.py b/python/tests/bench.old similarity index 100% rename from python/tests/bench.py rename to python/tests/bench.old diff --git a/python/tests/bench_gas.py b/python/tests/bench_gas.py new file mode 100644 index 0000000..696456a --- /dev/null +++ b/python/tests/bench_gas.py @@ -0,0 +1,167 @@ +# standard imports +import os +import unittest +import json +import logging +import datetime + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest import TestDemurrageDefault + +logging.basicConfig(level=logging.INFO) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + + + +class BenchBasic(TestDemurrageDefault): + + def setUp(self): + super(BenchBasic, self).setUp() + self.bench = { + 'mint': None, + 'transfer_light': None, + 'transfer_heavy': None, + 'approve': None, + 'transfer_from': None, + 'period_light': None, + 'period_heavy': None, + 'period_catchup': None, + 'demurrage': None, + } + + + def test_bench_min(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1024) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.bench['mint'] = r['gas_used'] + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.accounts[1], self.accounts[2], 512) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.bench['transfer_light'] = r['gas_used'] + + (tx_hash, o) = c.approve(self.address, self.accounts[1], self.accounts[0], 512) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.bench['approve'] = r['gas_used'] + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer_from(self.address, self.accounts[0], self.accounts[1], self.accounts[3], 256) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.bench['transfer_from'] = r['gas_used'] + + z = 0 + for i in range(100): + self.backend.time_travel(self.start_time + int(self.period_seconds / 2) + (10 * (i * (i + 1)))) + (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + z += r['gas_used'] + logg.info('demurrage round {} gas {}'.format(i, r['gas_used'])) + z /= 100 + self.bench['demurrage'] = int(z) + + z = 0 + for i in range(100): + self.backend.time_travel(self.start_time + (self.period_seconds * (i + 1))) + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + z += r['gas_used'] + logg.info('period with demurrage round {} gas {}'.format(i, r['gas_used'])) + + z /= 100 + self.bench['period_heavy'] = int(z) + + z = 0 + for i in range(100): + self.backend.time_travel(self.start_time + (self.period_seconds * ((i + 101)))) + (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + z += r['gas_used'] + logg.info('period without demurrage round {} gas {}'.format(i, r['gas_used'])) + + z /= 100 + self.bench['period_light'] = int(z) + + z = 0 + self.backend.time_travel(self.start_time + (self.period_seconds * 401)) + for i in range(100): + (tx_hash, o) = c.change_period(self.address, self.accounts[0]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + z += r['gas_used'] + logg.info('period catchup round {} gas {}'.format(i, r['gas_used'])) + + z /= 100 + self.bench['period_catchup'] = int(z) + + self.backend.time_travel(self.start_time + (self.period_seconds * 501)) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[2], 1024) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.backend.time_travel(self.start_time + (self.period_seconds * 502)) + + nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.accounts[2], self.accounts[4], 1) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + self.bench['transfer_heavy'] = r['gas_used'] + + print(json.dumps(self.bench)) + + + + + +if __name__ == '__main__': + unittest.main() From 23de062ab92d89872db82861482368bb9b4adf29 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 12:22:50 +0000 Subject: [PATCH 26/57] Add expiry implementation, after expire sink gets all --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 6 +- python/erc20_demurrage_token/unittest/base.py | 2 +- solidity/DemurrageTokenSingleNocap.sol | 91 ++++++++++++++++++- 5 files changed, 95 insertions(+), 8 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index aa23994..8678f07 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b50604051620057ad380380620057ad833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f640100000000026200257e176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e4846200037664010000000002620025a4176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516149d962000dd46000396000818161175a01528181611cba0152818161223401526124540152600081816117860152818161247501526124ba01526149d96000f3fe608060405234801561001057600080fd5b50600436106102bd576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610184578063983b2d56116100eb578063d89135cd116100a4578063d89135cd1461094a578063e54063a614610968578063e69571af14610998578063e8095295146109c8578063eda4e6d6146109e6578063f2fde38b14610a04576102bd565b8063983b2d561461084e578063a457c2d71461087e578063a9059cbb146108ae578063b470aade146108de578063c0ab7077146108fc578063d340ef8a1461092c576102bd565b806379ba50971161013d57806379ba50971461079c57806384dde4af146107ba5780638da5cb5b146107d85780638f0b2d5d146107f65780638f1df6bc1461081257806395d89b4114610830576102bd565b80636a2d094e146106b257806370a08231146106e2578063731f237c1461071257806373f42561146107305780637445e33a1461074e57806374bedb951461077e576102bd565b80633092afd511610228578063449a52f8116101e1578063449a52f8146105a457806347a50517146105d45780634abfbba21461060457806351b4541c1461063457806358b2833b146106645780636787a9be14610682576102bd565b80633092afd5146104a857806331333487146104d8578063313ce56714610508578063395093511461052657806340452d911461055657806342966c6814610588576102bd565b80631989c6a81161027a5780631989c6a8146103ac578063213d1e1e146103ca578063229ba197146103fa57806323a859441461041857806323b872dd146104485780632a7aec0914610478576102bd565b806301ffc9a7146102c257806306fdde03146102f2578063095ea7b31461031057806309f28f3c1461034057806311c566151461035e57806318160ddd1461038e575b600080fd5b6102dc60048036038101906102d79190613f08565b610a34565b6040516102e99190613f50565b60405180910390f35b6102fa610bda565b6040516103079190613ffb565b60405180910390f35b61032a600480360381019061032591906140b1565b610c68565b6040516103379190613f50565b60405180910390f35b610348610e39565b604051610355919061410d565b60405180910390f35b61037860048036038101906103739190614154565b610e4c565b60405161038591906141a3565b60405180910390f35b610396610e9c565b6040516103a391906141a3565b60405180910390f35b6103b4610eb3565b6040516103c191906141a3565b60405180910390f35b6103e460048036038101906103df919061435f565b610ebf565b6040516103f191906141a3565b60405180910390f35b610402610ed8565b60405161040f919061410d565b60405180910390f35b610432600480360381019061042d919061435f565b610eeb565b60405161043f9190613f50565b60405180910390f35b610462600480360381019061045d919061438c565b610f53565b60405161046f9190613f50565b60405180910390f35b610492600480360381019061048d919061435f565b611106565b60405161049f919061410d565b60405180910390f35b6104c260048036038101906104bd91906143df565b61113e565b6040516104cf9190613f50565b60405180910390f35b6104f260048036038101906104ed919061440c565b611231565b6040516104ff91906141a3565b60405180910390f35b61051061129d565b60405161051d91906141a3565b60405180910390f35b610540600480360381019061053b91906140b1565b6112a3565b60405161054d9190613f50565b60405180910390f35b610570600480360381019061056b919061444c565b611439565b60405161057f939291906144a6565b60405180910390f35b6105a2600480360381019061059d919061444c565b6114a8565b005b6105be60048036038101906105b991906140b1565b6115cd565b6040516105cb9190613f50565b60405180910390f35b6105ee60048036038101906105e991906143df565b61170d565b6040516105fb91906141a3565b60405180910390f35b61061e6004803603810190610619919061444c565b611756565b60405161062b91906141a3565b60405180910390f35b61064e6004803603810190610649919061444c565b6117b6565b60405161065b91906141a3565b60405180910390f35b61066c6117d7565b60405161067991906141a3565b60405180910390f35b61069c6004803603810190610697919061444c565b6117dd565b6040516106a991906141a3565b60405180910390f35b6106cc60048036038101906106c7919061444c565b61181e565b6040516106d991906141a3565b60405180910390f35b6106fc60048036038101906106f791906143df565b61183f565b60405161070991906141a3565b60405180910390f35b61071a6118a6565b60405161072791906141a3565b60405180910390f35b6107386118b7565b60405161074591906141a3565b60405180910390f35b6107686004803603810190610763919061435f565b6118bd565b60405161077591906141a3565b60405180910390f35b6107866118eb565b60405161079391906141a3565b60405180910390f35b6107a46118f1565b6040516107b19190613f50565b60405180910390f35b6107c2611a98565b6040516107cf91906144ec565b60405180910390f35b6107e0611abe565b6040516107ed91906144ec565b60405180910390f35b610810600480360381019061080b91906143df565b611ae4565b005b61081a611b82565b6040516108279190613f50565b60405180910390f35b610838611e32565b6040516108459190613ffb565b60405180910390f35b610868600480360381019061086391906143df565b611ec0565b6040516108759190613f50565b60405180910390f35b610898600480360381019061089391906140b1565b611f7d565b6040516108a59190613f50565b60405180910390f35b6108c860048036038101906108c391906140b1565b61219c565b6040516108d59190613f50565b60405180910390f35b6108e6612232565b6040516108f391906141a3565b60405180910390f35b6109166004803603810190610911919061444c565b612256565b60405161092391906141a3565b60405180910390f35b6109346123aa565b60405161094191906141a3565b60405180910390f35b6109526123b0565b60405161095f91906141a3565b60405180910390f35b610982600480360381019061097d919061435f565b6123ba565b60405161098f91906141a3565b60405180910390f35b6109b260048036038101906109ad9190614507565b6123ce565b6040516109bf91906145dd565b60405180910390f35b6109d061244e565b6040516109dd9190614623565b60405180910390f35b6109ee6124b8565b6040516109fb91906141a3565b60405180910390f35b610a1e6004803603810190610a1991906143df565b6124dc565b604051610a2b9190613f50565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610a885760019050610bd5565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ada5760019050610bd5565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b2c5760019050610bd5565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610b7e5760019050610bd5565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610bd05760019050610bd5565b600090505b919050565b60068054610be79061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054610c139061466d565b8015610c605780601f10610c3557610100808354040283529160200191610c60565b820191906000526020600020905b815481529060010190602001808311610c4357829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610d345760008314610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a906146ea565b60405180910390fd5b5b610d3c611b82565b50610d46836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610e2691906141a3565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b600080610e73610e5b8561257e565b610e6e610e68600161257e565b866125e6565b61264d565b9050610e7e816126cc565b67ffffffffffffffff1684610e939190614739565b91505092915050565b6000600c54600954610eae9190614739565b905090565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115610f085760009050610f4e565b6000826020015168ffffffffffffffffff161115610f295760009050610f4e565b6000826040015167ffffffffffffffff161115610f495760009050610f4e565b600190505b919050565b6000806000610f60611b82565b50610f6a846117dd565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610ff557600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546110819190614739565b92505081905550611093868684612701565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516110f291906141a3565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b0361113557611132600161257e565b90505b80915050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111c757503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6111d057600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806112408661257e565b925061124b8561257e565b9150611266600d60009054906101000a9004600f0b8361264d565b905061127181612726565b905061127d838261264d565b9050611288816126cc565b67ffffffffffffffff16935050505092915050565b60085481565b6000806112ae611b82565b506112b8836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611346919061476d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161142691906141a3565b60405180910390a3600191505092915050565b6000818154811061144957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166114fe57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561154a57600080fd5b6000611555826117dd565b905061156133826127b3565b5081600c6000828254611574919061476d565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516115c191906141a3565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661165c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611653906147ed565b60405180910390fd5b611664611b82565b5061166e836117dd565b90508260096000828254611682919061476d565b9250508190555061169384826128ba565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516116f191906141a3565b60405180910390a361170161297e565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611784919061480d565b7f00000000000000000000000000000000000000000000000000000000000000006117af919061476d565b9050919050565b6000603c82426117c69190614739565b6117d0919061487e565b9050919050565b60035481565b6000806118016117ec8461257e565b600260009054906101000a9004600f0b612b42565b905061180c816126cc565b67ffffffffffffffff16915050919050565b6000603c824261182e9190614739565b611838919061487e565b9050919050565b6000806000806118566118518661170d565b61257e565b92506118636003546117b6565b905061187e83600260009054906101000a9004600f0b61264d565b915061189c61188c836126cc565b67ffffffffffffffff1682611231565b9350505050919050565b60006118b26000612256565b905090565b600c5481565b60008060006118cb84610ebf565b91506118d684611106565b90506118e28282610e4c565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461194e57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b3e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611b8c613e65565b611b94613e65565b611b9c613e65565b6000806000806000611bac6118a6565b50611bb5612bce565b9750611bc088610eeb565b15611bd657600098505050505050505050611e2f565b6000600a5481548110611bec57611beb6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509550611c99886123ba565b9450600185611ca8919061476d565b9050611cb386611106565b9350603c857f0000000000000000000000000000000000000000000000000000000000000000611ce3919061480d565b611ced919061487e565b9150611d18611d13600d60009054906101000a9004600f0b611d0e8561257e565b61264d565b612726565b9250611d2e600084611d28610e9c565b846123ce565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050611dea87612d64565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051611e1a91906141a3565b60405180910390a16001985050505050505050505b90565b60078054611e3f9061466d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e6b9061466d565b8015611eb85780601f10611e8d57610100808354040283529160200191611eb8565b820191906000526020600020905b815481529060010190602001808311611e9b57829003601f168201915b505050505081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1c57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b600080611f89836117dd565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561201457600080fd5b61201c611b82565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120a99190614739565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161218991906141a3565b60405180910390a3600191505092915050565b60008060006121a9611b82565b506121b3846117dd565b91506121c0338684612701565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8660405161221f91906141a3565b60405180910390a3809250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008060008060006122696003546117b6565b9250600083036122805760009450505050506123a5565b600260009054906101000a9004600f0b90506000861180156122a157508286105b156122aa578592505b6122b38361257e565b91506122ce600d60009054906101000a9004600f0b8361264d565b93506122d984612726565b93506122f4600260009054906101000a9004600f0b8561264d565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361233c919061480d565b600354612349919061476d565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612395919061410d565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b6123d6613e65565b6123de613e65565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004261249f9190614739565b6124a9919061487e565b6124b3919061476d565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461253857600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff82111561259557600080fd5b6040829060020a029050919050565b60008082600f0b136125b557600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6125d184612e83565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561263a57506f7fffffffffffffffffffffffffffffff600f0b8113155b61264357600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156126b957506f7fffffffffffffffffffffffffffffff600f0b8113155b6126c257600080fd5b8091505092915050565b60008082600f0b12156126de57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60008061270e85846127b3565b5061271984846128ba565b5060019150509392505050565b60006840000000000000000082600f0b1261274057600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561277457600090506127ae565b6127ab6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613049565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361280f57600093505050506128b4565b6128188661170d565b92508483101561285d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128549061492a565b60405180910390fd5b84836128699190614739565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036129165760009350505050612978565b61291f8661170d565b9250848361292d919061476d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612988613e65565b6000612992610e9c565b9050600060016000805490506129a89190614739565b815481106129b9576129b86148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050612a949190614739565b81548110612aa557612aa46148af565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b03612b5357600080fd5b600082600f0b604085600f0b9060020a0281612b7257612b7161484f565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612bbb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612bc457600080fd5b8091505092915050565b612bd6613e65565b612bde613e65565b612be6613e65565b600080600a5481548110612bfd57612bfc6148af565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015612d08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d2c9190614976565b6fffffffffffffffffffffffffffffffff169050612d49836123ba565b8111612d5a57819350505050612d61565b8293505050505b90565b6000806000612d72846118bd565b612d7a610e9c565b612d849190614739565b9150600b54612d92836117dd565b612d9c9190614739565b9050612dca601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826128ba565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051612e3e91906141a3565b60405180910390a36001600a6000828254612e59919061476d565b9250508190555080600b6000828254612e72919061476d565b925050819055508192505050919050565b60008082600f0b13612e9457600080fd5b60008083600f0b9050680100000000000000008112612ecf576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112612efd576020819060008212600003808260020a82851804189250505090506020820191505b620100008112612f29576010819060008212600003808260020a82851804189250505090506010820191505b6101008112612f54576008819060008212600003808260020a82851804189250505090506008820191505b60108112612f7e576004819060008212600003808260020a82851804189250505090506004820191505b60048112612fa8576002819060008212600003808260020a82851804189250505090506002820191505b60028112612fb7576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561303c578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050612fe4565b5081945050505050919050565b60006840000000000000000082600f0b1261306357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130975760009050613e60565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156130e557608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561311e5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156131575760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561319057608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156131c95760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613202576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561323b57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613274576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156132ac57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156132e45760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561331c576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156133545760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561338c576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156133c457608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b13156133fc5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b131561343457608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b131561346b5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b13156134a2576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b13156134d957608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613510576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b131561354757608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b131561357e5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b13156135b5576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b13156135ec5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613622576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561365857608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b131561368e5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b13156136c457608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156136fa5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613730576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561376657608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561379c576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b13156137d157608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156138065760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561383b576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156138705760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156138a5576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156138da57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561390f5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561394457608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156139785760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156139ac576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156139e057608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315613a14576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b1315613a4857608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b1315613a7c5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315613ab0576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b1315613ae45760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315613b17576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b1315613b4a57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b1315613b7d5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b1315613bb057608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b1315613be35760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315613c16576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b1315613c4957608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315613c7c576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b1315613cae57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b1315613ce05760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315613d12576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b1315613d445760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315613d76576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b1315613da857608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b1315613dda5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b1315613e0c57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b811115613e5b57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ee581613eb0565b8114613ef057600080fd5b50565b600081359050613f0281613edc565b92915050565b600060208284031215613f1e57613f1d613eab565b5b6000613f2c84828501613ef3565b91505092915050565b60008115159050919050565b613f4a81613f35565b82525050565b6000602082019050613f656000830184613f41565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fa5578082015181840152602081019050613f8a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fcd82613f6b565b613fd78185613f76565b9350613fe7818560208601613f87565b613ff081613fb1565b840191505092915050565b600060208201905081810360008301526140158184613fc2565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140488261401d565b9050919050565b6140588161403d565b811461406357600080fd5b50565b6000813590506140758161404f565b92915050565b6000819050919050565b61408e8161407b565b811461409957600080fd5b50565b6000813590506140ab81614085565b92915050565b600080604083850312156140c8576140c7613eab565b5b60006140d685828601614066565b92505060206140e78582860161409c565b9150509250929050565b600081600f0b9050919050565b614107816140f1565b82525050565b600060208201905061412260008301846140fe565b92915050565b614131816140f1565b811461413c57600080fd5b50565b60008135905061414e81614128565b92915050565b6000806040838503121561416b5761416a613eab565b5b60006141798582860161409c565b925050602061418a8582860161413f565b9150509250929050565b61419d8161407b565b82525050565b60006020820190506141b86000830184614194565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6141fb82613fb1565b810181811067ffffffffffffffff8211171561421a576142196141c3565b5b80604052505050565b600061422d613ea1565b905061423982826141f2565b919050565b600063ffffffff82169050919050565b6142578161423e565b811461426257600080fd5b50565b6000813590506142748161424e565b92915050565b600068ffffffffffffffffff82169050919050565b6142988161427a565b81146142a357600080fd5b50565b6000813590506142b58161428f565b92915050565b600067ffffffffffffffff82169050919050565b6142d8816142bb565b81146142e357600080fd5b50565b6000813590506142f5816142cf565b92915050565b600060608284031215614311576143106141be565b5b61431b6060614223565b9050600061432b84828501614265565b600083015250602061433f848285016142a6565b6020830152506040614353848285016142e6565b60408301525092915050565b60006060828403121561437557614374613eab565b5b6000614383848285016142fb565b91505092915050565b6000806000606084860312156143a5576143a4613eab565b5b60006143b386828701614066565b93505060206143c486828701614066565b92505060406143d58682870161409c565b9150509250925092565b6000602082840312156143f5576143f4613eab565b5b600061440384828501614066565b91505092915050565b6000806040838503121561442357614422613eab565b5b60006144318582860161409c565b92505060206144428582860161409c565b9150509250929050565b60006020828403121561446257614461613eab565b5b60006144708482850161409c565b91505092915050565b6144828161423e565b82525050565b6144918161427a565b82525050565b6144a0816142bb565b82525050565b60006060820190506144bb6000830186614479565b6144c86020830185614488565b6144d56040830184614497565b949350505050565b6144e68161403d565b82525050565b600060208201905061450160008301846144dd565b92915050565b6000806000806080858703121561452157614520613eab565b5b600061452f8782880161409c565b94505060206145408782880161413f565b93505060406145518782880161409c565b92505060606145628782880161409c565b91505092959194509250565b6145778161423e565b82525050565b6145868161427a565b82525050565b614595816142bb565b82525050565b6060820160008201516145b1600085018261456e565b5060208201516145c4602085018261457d565b5060408201516145d7604085018261458c565b50505050565b60006060820190506145f2600083018461459b565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61461d816145f8565b82525050565b60006020820190506146386000830184614614565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061468557607f821691505b6020821081036146985761469761463e565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b60006146d4600a83613f76565b91506146df8261469e565b602082019050919050565b60006020820190508181036000830152614703816146c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006147448261407b565b915061474f8361407b565b92508282039050818111156147675761476661470a565b5b92915050565b60006147788261407b565b91506147838361407b565b925082820190508082111561479b5761479a61470a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006147d7600a83613f76565b91506147e2826147a1565b602082019050919050565b60006020820190508181036000830152614806816147ca565b9050919050565b60006148188261407b565b91506148238361407b565b92508282026148318161407b565b915082820484148315176148485761484761470a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006148898261407b565b91506148948361407b565b9250826148a4576148a361484f565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000614914600d83613f76565b915061491f826148de565b602082019050919050565b6000602082019050818103600083015261494381614907565b9050919050565b614953816145f8565b811461495e57600080fd5b50565b6000815190506149708161494a565b92915050565b60006020828403121561498c5761498b613eab565b5b600061499a84828501614961565b9150509291505056fea26469706673582212202f9fd5ae905e4e9dbc4084dd07c38e2c49d286e79910182ef402212c49c2eb2864736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162005ed238038062005ed2833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b94176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bba176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516150fe62000dd4600039600081816119ab01528181612158015281816126ef01526129d50152600081816119d7015281816129f60152612a3b01526150fe6000f3fe608060405234801561001057600080fd5b5060043610610395576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101f0578063a457c2d711610121578063d89135cd116100bf578063e809529511610099578063e809529514610ba8578063eda4e6d614610bc6578063f2fde38b14610be4578063f629620b14610c1457610395565b8063d89135cd14610b2a578063e54063a614610b48578063e69571af14610b7857610395565b8063b470aade116100fb578063b470aade14610a8e578063bb8a357414610aac578063c0ab707714610adc578063d340ef8a14610b0c57610395565b8063a457c2d714610a10578063a9059cbb14610a40578063b1cb0db314610a7057610395565b806384dde4af1161018e5780638f0b2d5d116101685780638f0b2d5d146109885780638f1df6bc146109a457806395d89b41146109c2578063983b2d56146109e057610395565b806384dde4af1461091c57806386fe212d1461093a5780638da5cb5b1461096a57610395565b806373f42561116101ca57806373f42561146108925780637445e33a146108b057806374bedb95146108e057806379ba5097146108fe57610395565b80636a2d094e1461081457806370a0823114610844578063731f237c1461087457610395565b80633092afd5116102ca578063449a52f81161026857806351b4541c1161024257806351b4541c1461077857806358b2833b146107a85780635f408c04146107c65780636787a9be146107e457610395565b8063449a52f8146106e857806347a50517146107185780634abfbba21461074857610395565b806331a5995d116102a457806331a5995d1461064c578063395093511461066a57806340452d911461069a57806342966c68146106cc57610395565b80633092afd5146105ce57806331333487146105fe578063313ce5671461062e57610395565b80631989c6a81161033757806323a859441161031157806323a859441461050e57806323b872dd1461053e5780632a7aec091461056e5780632c1758c11461059e57610395565b80631989c6a8146104a2578063213d1e1e146104c0578063229ba197146104f057610395565b806309f28f3c1161037357806309f28f3c1461041857806311c566151461043657806318160ddd1461046657806318cbbcfc1461048457610395565b806301ffc9a71461039a57806306fdde03146103ca578063095ea7b3146103e8575b600080fd5b6103b460048036038101906103af919061451e565b610c30565b6040516103c19190614566565b60405180910390f35b6103d2610dd6565b6040516103df9190614611565b60405180910390f35b61040260048036038101906103fd91906146c7565b610e64565b60405161040f9190614566565b60405180910390f35b610420611035565b60405161042d9190614723565b60405180910390f35b610450600480360381019061044b919061476a565b611048565b60405161045d91906147b9565b60405180910390f35b61046e611098565b60405161047b91906147b9565b60405180910390f35b61048c6110af565b60405161049991906147b9565b60405180910390f35b6104aa6110b4565b6040516104b791906147b9565b60405180910390f35b6104da60048036038101906104d59190614975565b6110c0565b6040516104e791906147b9565b60405180910390f35b6104f86110d9565b6040516105059190614723565b60405180910390f35b61052860048036038101906105239190614975565b6110ec565b6040516105359190614566565b60405180910390f35b610558600480360381019061055391906149a2565b611154565b6040516105659190614566565b60405180910390f35b61058860048036038101906105839190614975565b611307565b6040516105959190614723565b60405180910390f35b6105b860048036038101906105b391906149f5565b61133f565b6040516105c59190614566565b60405180910390f35b6105e860048036038101906105e39190614a22565b611372565b6040516105f59190614566565b60405180910390f35b61061860048036038101906106139190614a4f565b61147c565b60405161062591906147b9565b60405180910390f35b6106366114e8565b60405161064391906147b9565b60405180910390f35b6106546114ee565b60405161066191906147b9565b60405180910390f35b610684600480360381019061067f91906146c7565b6114f4565b6040516106919190614566565b60405180910390f35b6106b460048036038101906106af91906149f5565b61168a565b6040516106c393929190614abc565b60405180910390f35b6106e660048036038101906106e191906149f5565b6116f9565b005b61070260048036038101906106fd91906146c7565b61181e565b60405161070f9190614566565b60405180910390f35b610732600480360381019061072d9190614a22565b61195e565b60405161073f91906147b9565b60405180910390f35b610762600480360381019061075d91906149f5565b6119a7565b60405161076f91906147b9565b60405180910390f35b610792600480360381019061078d91906149f5565b611a07565b60405161079f91906147b9565b60405180910390f35b6107b0611a28565b6040516107bd91906147b9565b60405180910390f35b6107ce611a2e565b6040516107db9190614566565b60405180910390f35b6107fe60048036038101906107f991906149f5565b611b40565b60405161080b91906147b9565b60405180910390f35b61082e600480360381019061082991906149f5565b611b81565b60405161083b91906147b9565b60405180910390f35b61085e60048036038101906108599190614a22565b611ba2565b60405161086b91906147b9565b60405180910390f35b61087c611c4e565b6040516108899190614566565b60405180910390f35b61089a611c5f565b6040516108a791906147b9565b60405180910390f35b6108ca60048036038101906108c59190614975565b611c65565b6040516108d791906147b9565b60405180910390f35b6108e8611c93565b6040516108f591906147b9565b60405180910390f35b610906611c99565b6040516109139190614566565b60405180910390f35b610924611e40565b6040516109319190614b02565b60405180910390f35b610954600480360381019061094f91906149f5565b611e66565b60405161096191906147b9565b60405180910390f35b610972611f45565b60405161097f9190614b02565b60405180910390f35b6109a2600480360381019061099d9190614a22565b611f6b565b005b6109ac612020565b6040516109b99190614566565b60405180910390f35b6109ca6122d0565b6040516109d79190614611565b60405180910390f35b6109fa60048036038101906109f59190614a22565b61235e565b604051610a079190614566565b60405180910390f35b610a2a6004803603810190610a2591906146c7565b612432565b604051610a379190614566565b60405180910390f35b610a5a6004803603810190610a5591906146c7565b612651565b604051610a679190614566565b60405180910390f35b610a786126e7565b604051610a8591906147b9565b60405180910390f35b610a966126ed565b604051610aa391906147b9565b60405180910390f35b610ac66004803603810190610ac19190614a22565b612711565b604051610ad39190614b39565b60405180910390f35b610af66004803603810190610af191906149f5565b6127c4565b604051610b039190614566565b60405180910390f35b610b1461292b565b604051610b2191906147b9565b60405180910390f35b610b32612931565b604051610b3f91906147b9565b60405180910390f35b610b626004803603810190610b5d9190614975565b61293b565b604051610b6f91906147b9565b60405180910390f35b610b926004803603810190610b8d9190614b54565b61294f565b604051610b9f9190614c2a565b60405180910390f35b610bb06129cf565b604051610bbd9190614c70565b60405180910390f35b610bce612a39565b604051610bdb91906147b9565b60405180910390f35b610bfe6004803603810190610bf99190614a22565b612a5d565b604051610c0b9190614566565b60405180910390f35b610c2e6004803603810190610c2991906149f5565b612aff565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c845760019050610dd1565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cd65760019050610dd1565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d285760019050610dd1565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d7a5760019050610dd1565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dcc5760019050610dd1565b600090505b919050565b60068054610de390614cba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f90614cba565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f305760008314610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614d37565b60405180910390fd5b5b610f38612020565b50610f4283611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161102291906147b9565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b60008061106f61105785612b94565b61106a6110646001612b94565b86612bfc565b612c63565b905061107a81612ce2565b67ffffffffffffffff168461108f9190614d86565b91505092915050565b6000600c546009546110aa9190614d86565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611109576000905061114f565b6000826020015168ffffffffffffffffff16111561112a576000905061114f565b6000826040015167ffffffffffffffff16111561114a576000905061114f565b600190505b919050565b6000806000611161612020565b5061116b84611b40565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111f657600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112829190614d86565b92505081905550611294868684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112f391906147b9565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611336576113336001612b94565b90505b80915050919050565b6000600f821061134e57600080fd5b6000820361136357600f60135414905061136d565b8160135483161490505b919050565b6000611381600160ff1661133f565b1561138b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061141257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61141b57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061148b86612b94565b925061149685612b94565b91506114b1600d60009054906101000a9004600f0b83612c63565b90506114bc81612d3c565b90506114c88382612c63565b90506114d381612ce2565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b6000806114ff612020565b5061150983611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115979190614dba565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161167791906147b9565b60405180910390a3600191505092915050565b6000818154811061169a57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174f57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561179b57600080fd5b60006117a682611b40565b90506117b23382612dc9565b5081600c60008282546117c59190614dba565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161181291906147b9565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614e3a565b60405180910390fd5b6118b5612020565b506118bf83611b40565b905082600960008282546118d39190614dba565b925050819055506118e48482612ed0565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161194291906147b9565b60405180910390a3611952612f94565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826119d59190614e5a565b7f0000000000000000000000000000000000000000000000000000000000000000611a009190614dba565b9050919050565b6000603c8242611a179190614d86565b611a219190614ecb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611a4e5760019050611b3d565b600060115403611a615760009050611b3d565b6011544210611b2a57611a72611098565b60016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b2191906147b9565b60405180910390a15b601260009054906101000a900460ff1690505b90565b600080611b64611b4f84612b94565b600260009054906101000a9004600f0b613158565b9050611b6f81612ce2565b67ffffffffffffffff16915050919050565b6000603c8242611b919190614d86565b611b9b9190614ecb565b9050919050565b6000806000806000611bb386612711565b905060018160ff1603611bcd576000945050505050611c49565b60028160ff1603611beb57611be0611098565b945050505050611c49565b611bfc611bf78761195e565b612b94565b9350611c09600354611a07565b9150611c2484600260009054906101000a9004600f0b612c63565b9250611c42611c3284612ce2565b67ffffffffffffffff168361147c565b9450505050505b919050565b6000611c5a60006127c4565b905090565b600c5481565b6000806000611c73846110c0565b9150611c7e84611307565b9050611c8a8282611048565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614f48565b60405180910390fd5b6000601354831614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614fb4565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f3391906147b9565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f78600260ff1661133f565b15611f8257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061202a61447b565b61203261447b565b61203a61447b565b600080600080600061204a611c4e565b506120536131e4565b975061205e886110ec565b15612074576000985050505050505050506122cd565b6000600a548154811061208a57612089614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506121378861293b565b94506001856121469190614dba565b905061215186611307565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121819190614e5a565b61218b9190614ecb565b91506121b66121b1600d60009054906101000a9004600f0b6121ac85612b94565b612c63565b612d3c565b92506121cc6000846121c6611098565b8461294f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122888761337a565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122b891906147b9565b60405180910390a16001985050505050505050505b90565b600780546122dd90614cba565b80601f016020809104026020016040519081016040528092919081815260200182805461230990614cba565b80156123565780601f1061232b57610100808354040283529160200191612356565b820191906000526020600020905b81548152906001019060200180831161233957829003601f168201915b505050505081565b600061236d600160ff1661133f565b1561237757600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d157600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061243e83611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124c957600080fd5b6124d1612020565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255e9190614d86565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161263e91906147b9565b60405180910390a3600191505092915050565b600080600061265e612020565b5061266884611b40565b9150612675338684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126d491906147b9565b60405180910390a3809250505092915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080601260009054906101000a900460ff16156127325760019050612751565b600060115411801561274657506011544210155b1561275057600190505b5b60008160ff161180156127b15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156127bb57600290505b80915050919050565b60008060008060006127d4611a2e565b156127de57600080fd5b6127e9600354611a07565b925060008303612800576000945050505050612926565b600260009054906101000a9004600f0b905060008611801561282157508286105b1561282a578592505b61283383612b94565b915061284e600d60009054906101000a9004600f0b83612c63565b935061285984612d3c565b9350612874600260009054906101000a9004600f0b85612c63565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128bc9190614e5a565b6003546128c99190614dba565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129159190614723565b60405180910390a460009450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b61295761447b565b61295f61447b565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a209190614d86565b612a2a9190614ecb565b612a349190614dba565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b0c600460ff1661133f565b15612b1657600080fd5b601260009054906101000a900460ff1615612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b8060118190555050565b6000677fffffffffffffff821115612bab57600080fd5b6040829060020a029050919050565b60008082600f0b13612bcb57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be784613499565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c5057506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5957600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ccf57506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd857600080fd5b8091505092915050565b60008082600f0b1215612cf457600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d248584612dc9565b50612d2f8484612ed0565b5060019150509392505050565b60006840000000000000000082600f0b12612d5657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d8a5760009050612dc4565b612dc16080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061365f565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e255760009350505050612eca565b612e2e8661195e565b925084831015612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a9061504f565b60405180910390fd5b8483612e7f9190614d86565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f2c5760009350505050612f8e565b612f358661195e565b92508483612f439190614dba565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f9e61447b565b6000612fa8611098565b905060006001600080549050612fbe9190614d86565b81548110612fcf57612fce614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130aa9190614d86565b815481106130bb576130ba614fd4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316957600080fd5b600082600f0b604085600f0b9060020a028161318857613187614e9c565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131d157506f7fffffffffffffffffffffffffffffff600f0b8113155b6131da57600080fd5b8091505092915050565b6131ec61447b565b6131f461447b565b6131fc61447b565b600080600a548154811061321357613212614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613342919061509b565b6fffffffffffffffffffffffffffffffff16905061335f8361293b565b811161337057819350505050613377565b8293505050505b90565b600080600061338884611c65565b613390611098565b61339a9190614d86565b9150600b546133a883611b40565b6133b29190614d86565b90506133e0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ed0565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161345491906147b9565b60405180910390a36001600a600082825461346f9190614dba565b9250508190555080600b60008282546134889190614dba565b925050819055508192505050919050565b60008082600f0b136134aa57600080fd5b60008083600f0b90506801000000000000000081126134e5576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613513576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261353f576010819060008212600003808260020a82851804189250505090506010820191505b610100811261356a576008819060008212600003808260020a82851804189250505090506008820191505b60108112613594576004819060008212600003808260020a82851804189250505090506004820191505b600481126135be576002819060008212600003808260020a82851804189250505090506002820191505b600281126135cd576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613652578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135fa565b5081945050505050919050565b60006840000000000000000082600f0b1261367957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136ad5760009050614476565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136fb57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137345760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561376d5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137a657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137df5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613818576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561385157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b131561388a576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138c257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138fa5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613932576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561396a5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139a2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139da57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a125760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a815760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613aef57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b26576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b945760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bcb576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c025760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c38576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6e57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ca45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cda57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d105760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d46576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7c57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613db2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e1c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e51576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e865760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613ebb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ef057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f255760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f8e5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fc2576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613ff657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561402a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140925760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140c6576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140fa5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561412d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561416057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141935760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141c657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f95760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561422c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614292576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142c457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142f65760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614328576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561435a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561438c576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143be57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143f05760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561442257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561447157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144fb816144c6565b811461450657600080fd5b50565b600081359050614518816144f2565b92915050565b600060208284031215614534576145336144c1565b5b600061454284828501614509565b91505092915050565b60008115159050919050565b6145608161454b565b82525050565b600060208201905061457b6000830184614557565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145bb5780820151818401526020810190506145a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006145e382614581565b6145ed818561458c565b93506145fd81856020860161459d565b614606816145c7565b840191505092915050565b6000602082019050818103600083015261462b81846145d8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061465e82614633565b9050919050565b61466e81614653565b811461467957600080fd5b50565b60008135905061468b81614665565b92915050565b6000819050919050565b6146a481614691565b81146146af57600080fd5b50565b6000813590506146c18161469b565b92915050565b600080604083850312156146de576146dd6144c1565b5b60006146ec8582860161467c565b92505060206146fd858286016146b2565b9150509250929050565b600081600f0b9050919050565b61471d81614707565b82525050565b60006020820190506147386000830184614714565b92915050565b61474781614707565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b60008060408385031215614781576147806144c1565b5b600061478f858286016146b2565b92505060206147a085828601614755565b9150509250929050565b6147b381614691565b82525050565b60006020820190506147ce60008301846147aa565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614811826145c7565b810181811067ffffffffffffffff821117156148305761482f6147d9565b5b80604052505050565b60006148436144b7565b905061484f8282614808565b919050565b600063ffffffff82169050919050565b61486d81614854565b811461487857600080fd5b50565b60008135905061488a81614864565b92915050565b600068ffffffffffffffffff82169050919050565b6148ae81614890565b81146148b957600080fd5b50565b6000813590506148cb816148a5565b92915050565b600067ffffffffffffffff82169050919050565b6148ee816148d1565b81146148f957600080fd5b50565b60008135905061490b816148e5565b92915050565b600060608284031215614927576149266147d4565b5b6149316060614839565b905060006149418482850161487b565b6000830152506020614955848285016148bc565b6020830152506040614969848285016148fc565b60408301525092915050565b60006060828403121561498b5761498a6144c1565b5b600061499984828501614911565b91505092915050565b6000806000606084860312156149bb576149ba6144c1565b5b60006149c98682870161467c565b93505060206149da8682870161467c565b92505060406149eb868287016146b2565b9150509250925092565b600060208284031215614a0b57614a0a6144c1565b5b6000614a19848285016146b2565b91505092915050565b600060208284031215614a3857614a376144c1565b5b6000614a468482850161467c565b91505092915050565b60008060408385031215614a6657614a656144c1565b5b6000614a74858286016146b2565b9250506020614a85858286016146b2565b9150509250929050565b614a9881614854565b82525050565b614aa781614890565b82525050565b614ab6816148d1565b82525050565b6000606082019050614ad16000830186614a8f565b614ade6020830185614a9e565b614aeb6040830184614aad565b949350505050565b614afc81614653565b82525050565b6000602082019050614b176000830184614af3565b92915050565b600060ff82169050919050565b614b3381614b1d565b82525050565b6000602082019050614b4e6000830184614b2a565b92915050565b60008060008060808587031215614b6e57614b6d6144c1565b5b6000614b7c878288016146b2565b9450506020614b8d87828801614755565b9350506040614b9e878288016146b2565b9250506060614baf878288016146b2565b91505092959194509250565b614bc481614854565b82525050565b614bd381614890565b82525050565b614be2816148d1565b82525050565b606082016000820151614bfe6000850182614bbb565b506020820151614c116020850182614bca565b506040820151614c246040850182614bd9565b50505050565b6000606082019050614c3f6000830184614be8565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6a81614c45565b82525050565b6000602082019050614c856000830184614c61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cd257607f821691505b602082108103614ce557614ce4614c8b565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d21600a8361458c565b9150614d2c82614ceb565b602082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9182614691565b9150614d9c83614691565b9250828203905081811115614db457614db3614d57565b5b92915050565b6000614dc582614691565b9150614dd083614691565b9250828201905080821115614de857614de7614d57565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e24600a8361458c565b9150614e2f82614dee565b602082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b6000614e6582614691565b9150614e7083614691565b9250828202614e7e81614691565b91508282048414831517614e9557614e94614d57565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed682614691565b9150614ee183614691565b925082614ef157614ef0614e9c565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f3260118361458c565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000614f9e60128361458c565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615039600d8361458c565b915061504482615003565b602082019050919050565b600060208201905081810360008301526150688161502c565b9050919050565b61507881614c45565b811461508357600080fd5b50565b6000815190506150958161506f565b92915050565b6000602082840312156150b1576150b06144c1565b5b60006150bf84828501615086565b9150509291505056fea2646970667358221220deb9ffdd6f8295131fcadbe267d10dc29511296956a3a18e1f86da744d4481d464736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index fe72472..77f229a 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExpiredAccount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expires","type":"uint256"}],"name":"setExpires","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 2053256..12c70cf 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -25,6 +25,8 @@ from dexif import from_fixed # local imports from erc20_demurrage_token.data import data_dir +from erc20_demurrage_token.seal import SealedContract +from erc20_demurrage_token.expiry import ExpiryContract logg = logging.getLogger(__name__) @@ -71,7 +73,7 @@ class DemurrageTokenSettings: ) -class DemurrageToken(ERC20): +class DemurrageToken(ERC20, SealedContract, ExpiryContract): __abi = {} __bytecode = {} @@ -459,6 +461,8 @@ class DemurrageToken(ERC20): return tx + + def tax_level(self, contract_address, sender_address=ZERO_ADDRESS): return self.call_noarg('taxLevel', contract_address, sender_address=sender_address) diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index 29b6811..4e54765 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -92,7 +92,7 @@ class TestDemurrage(EthTesterCase): period = getattr(self, 'period') except AttributeError as e: pass - self.deployer = TestTokenDeploy(self.rpc, period=period) + self.deployer = TestTokenDeploy(self.rpc, period=period, sink_address=self.accounts[9]) self.default_supply = self.deployer.default_supply self.default_supply_cap = self.deployer.default_supply_cap self.start_block = None diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 13ea730..a21caf8 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -80,6 +80,10 @@ contract DemurrageTokenSingleCap { // Address to send unallocated redistribution tokens address public sinkAddress; + // timestamp when token contract expires + uint256 public expires; + bool expired; + // Implements ERC20 event Transfer(address indexed _from, address indexed _to, uint256 _value); @@ -108,6 +112,19 @@ contract DemurrageTokenSingleCap { // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 + event SealStateChange(uint256 _sealState); + + event Expired(uint256 _timestamp); + + // property sealing + uint256 public sealState; + uint8 constant MINTER_STATE = 1; + uint8 constant SINK_STATE = 2; + uint8 constant EXPIRY_STATE = 4; + uint8 constant CAP_STATE = 8; + uint256 constant public maxSealState = 15; + + constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { require(_taxLevel < (1 << 64)); redistributionItem memory initialRedistribution; @@ -137,15 +154,69 @@ contract DemurrageTokenSingleCap { sinkAddress = _defaultSinkAddress; } + function seal(uint256 _state) public returns(uint256) { + require(_state < 8, 'ERR_INVALID_STATE'); + require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); + sealState |= _state; + emit SealStateChange(sealState); + return uint256(sealState); + } + + function isSealed(uint256 _state) public returns(bool) { + require(_state < maxSealState); + if (_state == 0) { + return sealState == maxSealState; + } + return _state & sealState == _state; + } + + function setExpires(uint256 _expires) public { + require(!isSealed(EXPIRY_STATE)); + require(!expired); + require(msg.sender == owner); + expires = _expires; + } + // Change sink address for redistribution function setSinkAddress(address _sinkAddress) public { + require(!isSealed(SINK_STATE)); require(msg.sender == owner); sinkAddress = _sinkAddress; } + function applyExpiry() public returns(bool) { + if (expired) { + return true; + } + if (expires == 0) { + return false; + } + if (block.timestamp >= expires) { + account[sinkAddress] = totalSupply(); + expired = true; + emit Expired(block.timestamp); + } + return expired; + } + + function isExpiredAccount(address _account) public view returns(uint8) { + uint8 expiry_state; + + if (expired) { + expiry_state = 1; + } else if (expires > 0 && block.timestamp >= expires) { + expiry_state = 1; + } + if (expiry_state > 0 && _account == sinkAddress) { + expiry_state = 2; + } + return expiry_state; + } + // Given address will be allowed to call the mintTo() function function addMinter(address _minter) public returns (bool) { + require(!isSealed(MINTER_STATE)); require(msg.sender == owner); minter[_minter] = true; return true; @@ -153,6 +224,7 @@ contract DemurrageTokenSingleCap { // Given address will no longer be allowed to call the mintTo() function function removeMinter(address _minter) public returns (bool) { + require(!isSealed(MINTER_STATE)); require(msg.sender == owner || _minter == msg.sender); minter[_minter] = false; return true; @@ -163,6 +235,14 @@ contract DemurrageTokenSingleCap { int128 baseBalance; int128 currentDemurragedAmount; uint256 periodCount; + uint8 expiryState; + + expiryState = isExpiredAccount(_account); + if (expiryState == 1) { + return 0; + } else if (expiryState == 2) { + return totalSupply(); + } baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account)); @@ -369,19 +449,22 @@ contract DemurrageTokenSingleCap { } // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (uint256) { + function applyDemurrage() public returns (bool) { return applyDemurrageLimited(0); } - function applyDemurrageLimited(uint256 _rounds) public returns (uint256) { + // returns true if expired + function applyDemurrageLimited(uint256 _rounds) public returns (bool) { int128 v; uint256 periodCount; int128 periodPoint; int128 lastDemurrageAmount; + require(!applyExpiry()); + periodCount = getMinutesDelta(demurrageTimestamp); if (periodCount == 0) { - return 0; + return false; } lastDemurrageAmount = demurrageAmount; @@ -398,7 +481,7 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = demurrageTimestamp + (periodCount * 60); emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return periodCount; + return false; } // Return timestamp of start of period threshold From 2717e29d91dd2b5f4a7efd14e28a44a11f14c66d Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 13:44:35 +0000 Subject: [PATCH 27/57] Freeze accounts balances at expiry --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- solidity/DemurrageTokenSingleNocap.sol | 69 ++++++++++--------- 3 files changed, 39 insertions(+), 34 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 8678f07..9e8189f 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162005ed238038062005ed2833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b94176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bba176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516150fe62000dd4600039600081816119ab01528181612158015281816126ef01526129d50152600081816119d7015281816129f60152612a3b01526150fe6000f3fe608060405234801561001057600080fd5b5060043610610395576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101f0578063a457c2d711610121578063d89135cd116100bf578063e809529511610099578063e809529514610ba8578063eda4e6d614610bc6578063f2fde38b14610be4578063f629620b14610c1457610395565b8063d89135cd14610b2a578063e54063a614610b48578063e69571af14610b7857610395565b8063b470aade116100fb578063b470aade14610a8e578063bb8a357414610aac578063c0ab707714610adc578063d340ef8a14610b0c57610395565b8063a457c2d714610a10578063a9059cbb14610a40578063b1cb0db314610a7057610395565b806384dde4af1161018e5780638f0b2d5d116101685780638f0b2d5d146109885780638f1df6bc146109a457806395d89b41146109c2578063983b2d56146109e057610395565b806384dde4af1461091c57806386fe212d1461093a5780638da5cb5b1461096a57610395565b806373f42561116101ca57806373f42561146108925780637445e33a146108b057806374bedb95146108e057806379ba5097146108fe57610395565b80636a2d094e1461081457806370a0823114610844578063731f237c1461087457610395565b80633092afd5116102ca578063449a52f81161026857806351b4541c1161024257806351b4541c1461077857806358b2833b146107a85780635f408c04146107c65780636787a9be146107e457610395565b8063449a52f8146106e857806347a50517146107185780634abfbba21461074857610395565b806331a5995d116102a457806331a5995d1461064c578063395093511461066a57806340452d911461069a57806342966c68146106cc57610395565b80633092afd5146105ce57806331333487146105fe578063313ce5671461062e57610395565b80631989c6a81161033757806323a859441161031157806323a859441461050e57806323b872dd1461053e5780632a7aec091461056e5780632c1758c11461059e57610395565b80631989c6a8146104a2578063213d1e1e146104c0578063229ba197146104f057610395565b806309f28f3c1161037357806309f28f3c1461041857806311c566151461043657806318160ddd1461046657806318cbbcfc1461048457610395565b806301ffc9a71461039a57806306fdde03146103ca578063095ea7b3146103e8575b600080fd5b6103b460048036038101906103af919061451e565b610c30565b6040516103c19190614566565b60405180910390f35b6103d2610dd6565b6040516103df9190614611565b60405180910390f35b61040260048036038101906103fd91906146c7565b610e64565b60405161040f9190614566565b60405180910390f35b610420611035565b60405161042d9190614723565b60405180910390f35b610450600480360381019061044b919061476a565b611048565b60405161045d91906147b9565b60405180910390f35b61046e611098565b60405161047b91906147b9565b60405180910390f35b61048c6110af565b60405161049991906147b9565b60405180910390f35b6104aa6110b4565b6040516104b791906147b9565b60405180910390f35b6104da60048036038101906104d59190614975565b6110c0565b6040516104e791906147b9565b60405180910390f35b6104f86110d9565b6040516105059190614723565b60405180910390f35b61052860048036038101906105239190614975565b6110ec565b6040516105359190614566565b60405180910390f35b610558600480360381019061055391906149a2565b611154565b6040516105659190614566565b60405180910390f35b61058860048036038101906105839190614975565b611307565b6040516105959190614723565b60405180910390f35b6105b860048036038101906105b391906149f5565b61133f565b6040516105c59190614566565b60405180910390f35b6105e860048036038101906105e39190614a22565b611372565b6040516105f59190614566565b60405180910390f35b61061860048036038101906106139190614a4f565b61147c565b60405161062591906147b9565b60405180910390f35b6106366114e8565b60405161064391906147b9565b60405180910390f35b6106546114ee565b60405161066191906147b9565b60405180910390f35b610684600480360381019061067f91906146c7565b6114f4565b6040516106919190614566565b60405180910390f35b6106b460048036038101906106af91906149f5565b61168a565b6040516106c393929190614abc565b60405180910390f35b6106e660048036038101906106e191906149f5565b6116f9565b005b61070260048036038101906106fd91906146c7565b61181e565b60405161070f9190614566565b60405180910390f35b610732600480360381019061072d9190614a22565b61195e565b60405161073f91906147b9565b60405180910390f35b610762600480360381019061075d91906149f5565b6119a7565b60405161076f91906147b9565b60405180910390f35b610792600480360381019061078d91906149f5565b611a07565b60405161079f91906147b9565b60405180910390f35b6107b0611a28565b6040516107bd91906147b9565b60405180910390f35b6107ce611a2e565b6040516107db9190614566565b60405180910390f35b6107fe60048036038101906107f991906149f5565b611b40565b60405161080b91906147b9565b60405180910390f35b61082e600480360381019061082991906149f5565b611b81565b60405161083b91906147b9565b60405180910390f35b61085e60048036038101906108599190614a22565b611ba2565b60405161086b91906147b9565b60405180910390f35b61087c611c4e565b6040516108899190614566565b60405180910390f35b61089a611c5f565b6040516108a791906147b9565b60405180910390f35b6108ca60048036038101906108c59190614975565b611c65565b6040516108d791906147b9565b60405180910390f35b6108e8611c93565b6040516108f591906147b9565b60405180910390f35b610906611c99565b6040516109139190614566565b60405180910390f35b610924611e40565b6040516109319190614b02565b60405180910390f35b610954600480360381019061094f91906149f5565b611e66565b60405161096191906147b9565b60405180910390f35b610972611f45565b60405161097f9190614b02565b60405180910390f35b6109a2600480360381019061099d9190614a22565b611f6b565b005b6109ac612020565b6040516109b99190614566565b60405180910390f35b6109ca6122d0565b6040516109d79190614611565b60405180910390f35b6109fa60048036038101906109f59190614a22565b61235e565b604051610a079190614566565b60405180910390f35b610a2a6004803603810190610a2591906146c7565b612432565b604051610a379190614566565b60405180910390f35b610a5a6004803603810190610a5591906146c7565b612651565b604051610a679190614566565b60405180910390f35b610a786126e7565b604051610a8591906147b9565b60405180910390f35b610a966126ed565b604051610aa391906147b9565b60405180910390f35b610ac66004803603810190610ac19190614a22565b612711565b604051610ad39190614b39565b60405180910390f35b610af66004803603810190610af191906149f5565b6127c4565b604051610b039190614566565b60405180910390f35b610b1461292b565b604051610b2191906147b9565b60405180910390f35b610b32612931565b604051610b3f91906147b9565b60405180910390f35b610b626004803603810190610b5d9190614975565b61293b565b604051610b6f91906147b9565b60405180910390f35b610b926004803603810190610b8d9190614b54565b61294f565b604051610b9f9190614c2a565b60405180910390f35b610bb06129cf565b604051610bbd9190614c70565b60405180910390f35b610bce612a39565b604051610bdb91906147b9565b60405180910390f35b610bfe6004803603810190610bf99190614a22565b612a5d565b604051610c0b9190614566565b60405180910390f35b610c2e6004803603810190610c2991906149f5565b612aff565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c845760019050610dd1565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cd65760019050610dd1565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d285760019050610dd1565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d7a5760019050610dd1565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dcc5760019050610dd1565b600090505b919050565b60068054610de390614cba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0f90614cba565b8015610e5c5780601f10610e3157610100808354040283529160200191610e5c565b820191906000526020600020905b815481529060010190602001808311610e3f57829003601f168201915b505050505081565b6000806000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f305760008314610f2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2690614d37565b60405180910390fd5b5b610f38612020565b50610f4283611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161102291906147b9565b60405180910390a3600191505092915050565b600260009054906101000a9004600f0b81565b60008061106f61105785612b94565b61106a6110646001612b94565b86612bfc565b612c63565b905061107a81612ce2565b67ffffffffffffffff168461108f9190614d86565b91505092915050565b6000600c546009546110aa9190614d86565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611109576000905061114f565b6000826020015168ffffffffffffffffff16111561112a576000905061114f565b6000826040015167ffffffffffffffff16111561114a576000905061114f565b600190505b919050565b6000806000611161612020565b5061116b84611b40565b915081600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156111f657600080fd5b81600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112829190614d86565b92505081905550611294868684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516112f391906147b9565b60405180910390a380925050509392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611336576113336001612b94565b90505b80915050919050565b6000600f821061134e57600080fd5b6000820361136357600f60135414905061136d565b8160135483161490505b919050565b6000611381600160ff1661133f565b1561138b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061141257503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61141b57600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061148b86612b94565b925061149685612b94565b91506114b1600d60009054906101000a9004600f0b83612c63565b90506114bc81612d3c565b90506114c88382612c63565b90506114d381612ce2565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b6000806114ff612020565b5061150983611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115979190614dba565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161167791906147b9565b60405180910390a3600191505092915050565b6000818154811061169a57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661174f57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561179b57600080fd5b60006117a682611b40565b90506117b23382612dc9565b5081600c60008282546117c59190614dba565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161181291906147b9565b60405180910390a25050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a490614e3a565b60405180910390fd5b6118b5612020565b506118bf83611b40565b905082600960008282546118d39190614dba565b925050819055506118e48482612ed0565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f88560405161194291906147b9565b60405180910390a3611952612f94565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000826119d59190614e5a565b7f0000000000000000000000000000000000000000000000000000000000000000611a009190614dba565b9050919050565b6000603c8242611a179190614d86565b611a219190614ecb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611a4e5760019050611b3d565b600060115403611a615760009050611b3d565b6011544210611b2a57611a72611098565b60016000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b2191906147b9565b60405180910390a15b601260009054906101000a900460ff1690505b90565b600080611b64611b4f84612b94565b600260009054906101000a9004600f0b613158565b9050611b6f81612ce2565b67ffffffffffffffff16915050919050565b6000603c8242611b919190614d86565b611b9b9190614ecb565b9050919050565b6000806000806000611bb386612711565b905060018160ff1603611bcd576000945050505050611c49565b60028160ff1603611beb57611be0611098565b945050505050611c49565b611bfc611bf78761195e565b612b94565b9350611c09600354611a07565b9150611c2484600260009054906101000a9004600f0b612c63565b9250611c42611c3284612ce2565b67ffffffffffffffff168361147c565b9450505050505b919050565b6000611c5a60006127c4565b905090565b600c5481565b6000806000611c73846110c0565b9150611c7e84611307565b9050611c8a8282611048565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cf657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611eab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea290614f48565b60405180910390fd5b6000601354831614611ef2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee990614fb4565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f3391906147b9565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f78600260ff1661133f565b15611f8257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fdc57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061202a61447b565b61203261447b565b61203a61447b565b600080600080600061204a611c4e565b506120536131e4565b975061205e886110ec565b15612074576000985050505050505050506122cd565b6000600a548154811061208a57612089614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506121378861293b565b94506001856121469190614dba565b905061215186611307565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121819190614e5a565b61218b9190614ecb565b91506121b66121b1600d60009054906101000a9004600f0b6121ac85612b94565b612c63565b612d3c565b92506121cc6000846121c6611098565b8461294f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122888761337a565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122b891906147b9565b60405180910390a16001985050505050505050505b90565b600780546122dd90614cba565b80601f016020809104026020016040519081016040528092919081815260200182805461230990614cba565b80156123565780601f1061232b57610100808354040283529160200191612356565b820191906000526020600020905b81548152906001019060200180831161233957829003601f168201915b505050505081565b600061236d600160ff1661133f565b1561237757600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146123d157600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061243e83611b40565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124c957600080fd5b6124d1612020565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461255e9190614d86565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161263e91906147b9565b60405180910390a3600191505092915050565b600080600061265e612020565b5061266884611b40565b9150612675338684612d17565b90508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516126d491906147b9565b60405180910390a3809250505092915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080601260009054906101000a900460ff16156127325760019050612751565b600060115411801561274657506011544210155b1561275057600190505b5b60008160ff161180156127b15750601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b156127bb57600290505b80915050919050565b60008060008060006127d4611a2e565b156127de57600080fd5b6127e9600354611a07565b925060008303612800576000945050505050612926565b600260009054906101000a9004600f0b905060008611801561282157508286105b1561282a578592505b61283383612b94565b915061284e600d60009054906101000a9004600f0b83612c63565b935061285984612d3c565b9350612874600260009054906101000a9004600f0b85612c63565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128bc9190614e5a565b6003546128c99190614dba565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129159190614723565b60405180910390a460009450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b61295761447b565b61295f61447b565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a209190614d86565b612a2a9190614ecb565b612a349190614dba565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b0c600460ff1661133f565b15612b1657600080fd5b601260009054906101000a900460ff1615612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b8060118190555050565b6000677fffffffffffffff821115612bab57600080fd5b6040829060020a029050919050565b60008082600f0b13612bcb57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be784613499565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c5057506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5957600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ccf57506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd857600080fd5b8091505092915050565b60008082600f0b1215612cf457600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d248584612dc9565b50612d2f8484612ed0565b5060019150509392505050565b60006840000000000000000082600f0b12612d5657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d8a5760009050612dc4565b612dc16080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061365f565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e255760009350505050612eca565b612e2e8661195e565b925084831015612e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6a9061504f565b60405180910390fd5b8483612e7f9190614d86565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f2c5760009350505050612f8e565b612f358661195e565b92508483612f439190614dba565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f9e61447b565b6000612fa8611098565b905060006001600080549050612fbe9190614d86565b81548110612fcf57612fce614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130aa9190614d86565b815481106130bb576130ba614fd4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316957600080fd5b600082600f0b604085600f0b9060020a028161318857613187614e9c565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131d157506f7fffffffffffffffffffffffffffffff600f0b8113155b6131da57600080fd5b8091505092915050565b6131ec61447b565b6131f461447b565b6131fc61447b565b600080600a548154811061321357613212614fd4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561331e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613342919061509b565b6fffffffffffffffffffffffffffffffff16905061335f8361293b565b811161337057819350505050613377565b8293505050505b90565b600080600061338884611c65565b613390611098565b61339a9190614d86565b9150600b546133a883611b40565b6133b29190614d86565b90506133e0601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ed0565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161345491906147b9565b60405180910390a36001600a600082825461346f9190614dba565b9250508190555080600b60008282546134889190614dba565b925050819055508192505050919050565b60008082600f0b136134aa57600080fd5b60008083600f0b90506801000000000000000081126134e5576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613513576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261353f576010819060008212600003808260020a82851804189250505090506010820191505b610100811261356a576008819060008212600003808260020a82851804189250505090506008820191505b60108112613594576004819060008212600003808260020a82851804189250505090506004820191505b600481126135be576002819060008212600003808260020a82851804189250505090506002820191505b600281126135cd576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613652578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135fa565b5081945050505050919050565b60006840000000000000000082600f0b1261367957600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136ad5760009050614476565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136fb57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137345760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b131561376d5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137a657608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137df5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613818576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561385157608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b131561388a576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138c257608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138fa5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613932576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b131561396a5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139a2576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139da57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a125760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4a57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a815760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab8576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613aef57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b26576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5d57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b945760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bcb576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c025760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c38576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6e57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ca45760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cda57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d105760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d46576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7c57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613db2576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de757608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e1c5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e51576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e865760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613ebb576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ef057608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f255760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5a57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f8e5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fc2576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613ff657608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b131561402a576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405e57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140925760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140c6576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140fa5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561412d576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561416057608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141935760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141c657608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f95760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561422c576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425f57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614292576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142c457608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142f65760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614328576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561435a5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561438c576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143be57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143f05760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561442257608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561447157600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144fb816144c6565b811461450657600080fd5b50565b600081359050614518816144f2565b92915050565b600060208284031215614534576145336144c1565b5b600061454284828501614509565b91505092915050565b60008115159050919050565b6145608161454b565b82525050565b600060208201905061457b6000830184614557565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145bb5780820151818401526020810190506145a0565b60008484015250505050565b6000601f19601f8301169050919050565b60006145e382614581565b6145ed818561458c565b93506145fd81856020860161459d565b614606816145c7565b840191505092915050565b6000602082019050818103600083015261462b81846145d8565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061465e82614633565b9050919050565b61466e81614653565b811461467957600080fd5b50565b60008135905061468b81614665565b92915050565b6000819050919050565b6146a481614691565b81146146af57600080fd5b50565b6000813590506146c18161469b565b92915050565b600080604083850312156146de576146dd6144c1565b5b60006146ec8582860161467c565b92505060206146fd858286016146b2565b9150509250929050565b600081600f0b9050919050565b61471d81614707565b82525050565b60006020820190506147386000830184614714565b92915050565b61474781614707565b811461475257600080fd5b50565b6000813590506147648161473e565b92915050565b60008060408385031215614781576147806144c1565b5b600061478f858286016146b2565b92505060206147a085828601614755565b9150509250929050565b6147b381614691565b82525050565b60006020820190506147ce60008301846147aa565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614811826145c7565b810181811067ffffffffffffffff821117156148305761482f6147d9565b5b80604052505050565b60006148436144b7565b905061484f8282614808565b919050565b600063ffffffff82169050919050565b61486d81614854565b811461487857600080fd5b50565b60008135905061488a81614864565b92915050565b600068ffffffffffffffffff82169050919050565b6148ae81614890565b81146148b957600080fd5b50565b6000813590506148cb816148a5565b92915050565b600067ffffffffffffffff82169050919050565b6148ee816148d1565b81146148f957600080fd5b50565b60008135905061490b816148e5565b92915050565b600060608284031215614927576149266147d4565b5b6149316060614839565b905060006149418482850161487b565b6000830152506020614955848285016148bc565b6020830152506040614969848285016148fc565b60408301525092915050565b60006060828403121561498b5761498a6144c1565b5b600061499984828501614911565b91505092915050565b6000806000606084860312156149bb576149ba6144c1565b5b60006149c98682870161467c565b93505060206149da8682870161467c565b92505060406149eb868287016146b2565b9150509250925092565b600060208284031215614a0b57614a0a6144c1565b5b6000614a19848285016146b2565b91505092915050565b600060208284031215614a3857614a376144c1565b5b6000614a468482850161467c565b91505092915050565b60008060408385031215614a6657614a656144c1565b5b6000614a74858286016146b2565b9250506020614a85858286016146b2565b9150509250929050565b614a9881614854565b82525050565b614aa781614890565b82525050565b614ab6816148d1565b82525050565b6000606082019050614ad16000830186614a8f565b614ade6020830185614a9e565b614aeb6040830184614aad565b949350505050565b614afc81614653565b82525050565b6000602082019050614b176000830184614af3565b92915050565b600060ff82169050919050565b614b3381614b1d565b82525050565b6000602082019050614b4e6000830184614b2a565b92915050565b60008060008060808587031215614b6e57614b6d6144c1565b5b6000614b7c878288016146b2565b9450506020614b8d87828801614755565b9350506040614b9e878288016146b2565b9250506060614baf878288016146b2565b91505092959194509250565b614bc481614854565b82525050565b614bd381614890565b82525050565b614be2816148d1565b82525050565b606082016000820151614bfe6000850182614bbb565b506020820151614c116020850182614bca565b506040820151614c246040850182614bd9565b50505050565b6000606082019050614c3f6000830184614be8565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6a81614c45565b82525050565b6000602082019050614c856000830184614c61565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cd257607f821691505b602082108103614ce557614ce4614c8b565b5b50919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d21600a8361458c565b9150614d2c82614ceb565b602082019050919050565b60006020820190508181036000830152614d5081614d14565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614d9182614691565b9150614d9c83614691565b9250828203905081811115614db457614db3614d57565b5b92915050565b6000614dc582614691565b9150614dd083614691565b9250828201905080821115614de857614de7614d57565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e24600a8361458c565b9150614e2f82614dee565b602082019050919050565b60006020820190508181036000830152614e5381614e17565b9050919050565b6000614e6582614691565b9150614e7083614691565b9250828202614e7e81614691565b91508282048414831517614e9557614e94614d57565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614ed682614691565b9150614ee183614691565b925082614ef157614ef0614e9c565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f3260118361458c565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000614f9e60128361458c565b9150614fa982614f68565b602082019050919050565b60006020820190508181036000830152614fcd81614f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615039600d8361458c565b915061504482615003565b602082019050919050565b600060208201905081810360008301526150688161502c565b9050919050565b61507881614c45565b811461508357600080fd5b50565b6000815190506150958161506f565b92915050565b6000602082840312156150b1576150b06144c1565b5b60006150bf84828501615086565b9150509291505056fea2646970667358221220deb9ffdd6f8295131fcadbe267d10dc29511296956a3a18e1f86da744d4481d464736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162005f3738038062005f37833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b8d176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bb3176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161516362000dd460003960008181611a640152818161218a0152818161278c01526129ce015260008181611a90015281816129ef0152612a3401526151636000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d89135cd116100bf578063e809529511610099578063e809529514610b5d578063eda4e6d614610b7b578063f2fde38b14610b99578063f629620b14610bc95761037a565b8063d89135cd14610adf578063e54063a614610afd578063e69571af14610b2d5761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b61039960048036038101906103949190614517565b610be5565b6040516103a6919061455f565b60405180910390f35b6103b7610d8b565b6040516103c4919061460a565b60405180910390f35b6103e760048036038101906103e291906146c0565b610e19565b6040516103f4919061455f565b60405180910390f35b610405611055565b604051610412919061471c565b60405180910390f35b61043560048036038101906104309190614763565b611068565b60405161044291906147b2565b60405180910390f35b6104536110b8565b60405161046091906147b2565b60405180910390f35b6104716110cf565b60405161047e91906147b2565b60405180910390f35b61048f6110d4565b60405161049c91906147b2565b60405180910390f35b6104bf60048036038101906104ba919061496e565b6110e0565b6040516104cc91906147b2565b60405180910390f35b6104dd6110f9565b6040516104ea919061471c565b60405180910390f35b61050d6004803603810190610508919061496e565b61110c565b60405161051a919061455f565b60405180910390f35b61053d6004803603810190610538919061499b565b611174565b60405161054a919061455f565b60405180910390f35b61056d6004803603810190610568919061496e565b611392565b60405161057a919061471c565b60405180910390f35b61059d600480360381019061059891906149ee565b6113ca565b6040516105aa919061455f565b60405180910390f35b6105cd60048036038101906105c89190614a1b565b6113fd565b6040516105da919061455f565b60405180910390f35b6105fd60048036038101906105f89190614a48565b611507565b60405161060a91906147b2565b60405180910390f35b61061b611573565b60405161062891906147b2565b60405180910390f35b610639611579565b60405161064691906147b2565b60405180910390f35b610669600480360381019061066491906146c0565b61157f565b604051610676919061455f565b60405180910390f35b610699600480360381019061069491906149ee565b611715565b6040516106a893929190614ab5565b60405180910390f35b6106cb60048036038101906106c691906149ee565b611784565b005b6106e760048036038101906106e291906146c0565b6118c0565b6040516106f4919061455f565b60405180910390f35b61071760048036038101906107129190614a1b565b611a17565b60405161072491906147b2565b60405180910390f35b610747600480360381019061074291906149ee565b611a60565b60405161075491906147b2565b60405180910390f35b610777600480360381019061077291906149ee565b611ac0565b60405161078491906147b2565b60405180910390f35b610795611ae1565b6040516107a291906147b2565b60405180910390f35b6107b3611ae7565b6040516107c09190614b08565b60405180910390f35b6107e360048036038101906107de91906149ee565b611bb4565b6040516107f091906147b2565b60405180910390f35b610813600480360381019061080e91906149ee565b611bf5565b60405161082091906147b2565b60405180910390f35b610843600480360381019061083e9190614a1b565b611c16565b60405161085091906147b2565b60405180910390f35b610861611c80565b60405161086e91906147b2565b60405180910390f35b61087f611c91565b60405161088c91906147b2565b60405180910390f35b6108af60048036038101906108aa919061496e565b611c97565b6040516108bc91906147b2565b60405180910390f35b6108cd611cc5565b6040516108da91906147b2565b60405180910390f35b6108eb611ccb565b6040516108f8919061455f565b60405180910390f35b610909611e72565b6040516109169190614b32565b60405180910390f35b610939600480360381019061093491906149ee565b611e98565b60405161094691906147b2565b60405180910390f35b610957611f77565b6040516109649190614b32565b60405180910390f35b61098760048036038101906109829190614a1b565b611f9d565b005b610991612052565b60405161099e919061455f565b60405180910390f35b6109af612302565b6040516109bc919061460a565b60405180910390f35b6109df60048036038101906109da9190614a1b565b612390565b6040516109ec919061455f565b60405180910390f35b610a0f6004803603810190610a0a91906146c0565b612464565b604051610a1c919061455f565b60405180910390f35b610a3f6004803603810190610a3a91906146c0565b612683565b604051610a4c919061455f565b60405180910390f35b610a5d612784565b604051610a6a91906147b2565b60405180910390f35b610a7b61278a565b604051610a8891906147b2565b60405180910390f35b610aab6004803603810190610aa691906149ee565b6127ae565b604051610ab891906147b2565b60405180910390f35b610ac9612924565b604051610ad691906147b2565b60405180910390f35b610ae761292a565b604051610af491906147b2565b60405180910390f35b610b176004803603810190610b12919061496e565b612934565b604051610b2491906147b2565b60405180910390f35b610b476004803603810190610b429190614b4d565b612948565b604051610b549190614c23565b60405180910390f35b610b656129c8565b604051610b729190614c69565b60405180910390f35b610b83612a32565b604051610b9091906147b2565b60405180910390f35b610bb36004803603810190610bae9190614a1b565b612a56565b604051610bc0919061455f565b60405180910390f35b610be36004803603810190610bde91906149ee565b612af8565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614cb3565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d30565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614d9c565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161104091906147b2565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612b8d565b61108a6110846001612b8d565b86612bf5565b612c5c565b905061109a81612cdb565b67ffffffffffffffff16846110af9190614deb565b91505092915050565b6000600c546009546110ca9190614deb565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d30565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614deb565b9250508190555061131d878785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c91906147b2565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612b8d565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612b8d565b925061152185612b8d565b915061153c600d60009054906101000a9004600f0b83612c5c565b905061154781612d35565b90506115538382612c5c565b905061155e81612cdb565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e1f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161170291906147b2565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612dc2565b5081600c60008282546118679190614e1f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b491906147b2565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614e9f565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e1f565b9250508190555061199d8482612ec9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb91906147b2565b60405180910390a3611a0b612f8d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614ebf565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e1f565b9050919050565b6000603c8242611ad09190614deb565b611ada9190614f30565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f30565b601154611b429190614deb565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b9291906147b2565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612b8d565b600260009054906101000a9004600f0b613151565b9050611be381612cdb565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614deb565b611c0f9190614f30565b9050919050565b6000806000806000611c2f611c2a87611a17565b612b8d565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612c5c565b9250611c75611c6584612cdb565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490614fad565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b90615019565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f6591906147b2565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c614474565b612064614474565b61206c614474565b600080600080600061207c611c80565b506120856131dd565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612934565b94506001856121789190614e1f565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614ebf565b6121bd9190614f30565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612b8d565b612c5c565b612d35565b92506121fe6000846121f86110b8565b84612948565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba87613373565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea91906147b2565b60405180910390a16001985050505050505050505b90565b6007805461230f90614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614cb3565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614deb565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161267091906147b2565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d30565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f91906147b2565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612b8d565b9150612848600d60009054906101000a9004600f0b83612c5c565b935061285384612d35565b935061286e600260009054906101000a9004600f0b85612c5c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614ebf565b6003546128c39190614e1f565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f919061471c565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b612950614474565b612958614474565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a199190614deb565b612a239190614f30565b612a2d9190614e1f565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab257600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b05600460ff166113ca565b15612b0f57600080fd5b601260009054906101000a900460ff1615612b2957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8357600080fd5b8060118190555050565b6000677fffffffffffffff821115612ba457600080fd5b6040829060020a029050919050565b60008082600f0b13612bc457600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be084613492565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c4957506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5257600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612cc857506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd157600080fd5b8091505092915050565b60008082600f0b1215612ced57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d1d8584612dc2565b50612d288484612ec9565b5060019150509392505050565b60006840000000000000000082600f0b12612d4f57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d835760009050612dbd565b612dba6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613658565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e1e5760009350505050612ec3565b612e2786611a17565b925084831015612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e63906150b4565b60405180910390fd5b8483612e789190614deb565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f255760009350505050612f87565b612f2e86611a17565b92508483612f3c9190614e1f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f97614474565b6000612fa16110b8565b905060006001600080549050612fb79190614deb565b81548110612fc857612fc7615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130a39190614deb565b815481106130b4576130b3615039565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316257600080fd5b600082600f0b604085600f0b9060020a028161318157613180614f01565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131ca57506f7fffffffffffffffffffffffffffffff600f0b8113155b6131d357600080fd5b8091505092915050565b6131e5614474565b6131ed614474565b6131f5614474565b600080600a548154811061320c5761320b615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333b9190615100565b6fffffffffffffffffffffffffffffffff16905061335883612934565b811161336957819350505050613370565b8293505050505b90565b600080600061338184611c97565b6133896110b8565b6133939190614deb565b9150600b546133a183611bb4565b6133ab9190614deb565b90506133d9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ec9565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161344d91906147b2565b60405180910390a36001600a60008282546134689190614e1f565b9250508190555080600b60008282546134819190614e1f565b925050819055508192505050919050565b60008082600f0b136134a357600080fd5b60008083600f0b90506801000000000000000081126134de576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261350c576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613538576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613563576008819060008212600003808260020a82851804189250505090506008820191505b6010811261358d576004819060008212600003808260020a82851804189250505090506004820191505b600481126135b7576002819060008212600003808260020a82851804189250505090506002820191505b600281126135c6576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561364b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135f3565b5081945050505050919050565b60006840000000000000000082600f0b1261367257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136a6576000905061446f565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136f457608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561372d5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137665760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561379f57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137d85760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613811576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561384a57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613883576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138bb57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138f35760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561392b576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139635760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561399b576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139d357608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a0b5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4357608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a7a5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab1576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ae857608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b1f576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5657608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b8d5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bc4576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613bfb5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c31576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6757608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613c9d5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cd357608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d095760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d3f576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7557608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613dab576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de057608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e155760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e4a576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e7f5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613eb4576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ee957608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f1e5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5357608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f875760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fbb576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613fef57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614023576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405757608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561408b5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140bf576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140f35760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614126576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561415957608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561418c5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141bf57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f25760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614225576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425857608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561428b576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142bd57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142ef5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614321576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143535760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614385576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143b757608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143e95760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561441b57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561446a57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144f4816144bf565b81146144ff57600080fd5b50565b600081359050614511816144eb565b92915050565b60006020828403121561452d5761452c6144ba565b5b600061453b84828501614502565b91505092915050565b60008115159050919050565b61455981614544565b82525050565b60006020820190506145746000830184614550565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145b4578082015181840152602081019050614599565b60008484015250505050565b6000601f19601f8301169050919050565b60006145dc8261457a565b6145e68185614585565b93506145f6818560208601614596565b6145ff816145c0565b840191505092915050565b6000602082019050818103600083015261462481846145d1565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146578261462c565b9050919050565b6146678161464c565b811461467257600080fd5b50565b6000813590506146848161465e565b92915050565b6000819050919050565b61469d8161468a565b81146146a857600080fd5b50565b6000813590506146ba81614694565b92915050565b600080604083850312156146d7576146d66144ba565b5b60006146e585828601614675565b92505060206146f6858286016146ab565b9150509250929050565b600081600f0b9050919050565b61471681614700565b82525050565b6000602082019050614731600083018461470d565b92915050565b61474081614700565b811461474b57600080fd5b50565b60008135905061475d81614737565b92915050565b6000806040838503121561477a576147796144ba565b5b6000614788858286016146ab565b92505060206147998582860161474e565b9150509250929050565b6147ac8161468a565b82525050565b60006020820190506147c760008301846147a3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61480a826145c0565b810181811067ffffffffffffffff82111715614829576148286147d2565b5b80604052505050565b600061483c6144b0565b90506148488282614801565b919050565b600063ffffffff82169050919050565b6148668161484d565b811461487157600080fd5b50565b6000813590506148838161485d565b92915050565b600068ffffffffffffffffff82169050919050565b6148a781614889565b81146148b257600080fd5b50565b6000813590506148c48161489e565b92915050565b600067ffffffffffffffff82169050919050565b6148e7816148ca565b81146148f257600080fd5b50565b600081359050614904816148de565b92915050565b6000606082840312156149205761491f6147cd565b5b61492a6060614832565b9050600061493a84828501614874565b600083015250602061494e848285016148b5565b6020830152506040614962848285016148f5565b60408301525092915050565b600060608284031215614984576149836144ba565b5b60006149928482850161490a565b91505092915050565b6000806000606084860312156149b4576149b36144ba565b5b60006149c286828701614675565b93505060206149d386828701614675565b92505060406149e4868287016146ab565b9150509250925092565b600060208284031215614a0457614a036144ba565b5b6000614a12848285016146ab565b91505092915050565b600060208284031215614a3157614a306144ba565b5b6000614a3f84828501614675565b91505092915050565b60008060408385031215614a5f57614a5e6144ba565b5b6000614a6d858286016146ab565b9250506020614a7e858286016146ab565b9150509250929050565b614a918161484d565b82525050565b614aa081614889565b82525050565b614aaf816148ca565b82525050565b6000606082019050614aca6000830186614a88565b614ad76020830185614a97565b614ae46040830184614aa6565b949350505050565b600060ff82169050919050565b614b0281614aec565b82525050565b6000602082019050614b1d6000830184614af9565b92915050565b614b2c8161464c565b82525050565b6000602082019050614b476000830184614b23565b92915050565b60008060008060808587031215614b6757614b666144ba565b5b6000614b75878288016146ab565b9450506020614b868782880161474e565b9350506040614b97878288016146ab565b9250506060614ba8878288016146ab565b91505092959194509250565b614bbd8161484d565b82525050565b614bcc81614889565b82525050565b614bdb816148ca565b82525050565b606082016000820151614bf76000850182614bb4565b506020820151614c0a6020850182614bc3565b506040820151614c1d6040850182614bd2565b50505050565b6000606082019050614c386000830184614be1565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6381614c3e565b82525050565b6000602082019050614c7e6000830184614c5a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ccb57607f821691505b602082108103614cde57614cdd614c84565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d1a600783614585565b9150614d2582614ce4565b602082019050919050565b60006020820190508181036000830152614d4981614d0d565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d86600a83614585565b9150614d9182614d50565b602082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614df68261468a565b9150614e018361468a565b9250828203905081811115614e1957614e18614dbc565b5b92915050565b6000614e2a8261468a565b9150614e358361468a565b9250828201905080821115614e4d57614e4c614dbc565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e89600a83614585565b9150614e9482614e53565b602082019050919050565b60006020820190508181036000830152614eb881614e7c565b9050919050565b6000614eca8261468a565b9150614ed58361468a565b9250828202614ee38161468a565b91508282048414831517614efa57614ef9614dbc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f3b8261468a565b9150614f468361468a565b925082614f5657614f55614f01565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f97601183614585565b9150614fa282614f61565b602082019050919050565b60006020820190508181036000830152614fc681614f8a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615003601283614585565b915061500e82614fcd565b602082019050919050565b6000602082019050818103600083015261503281614ff6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061509e600d83614585565b91506150a982615068565b602082019050919050565b600060208201905081810360008301526150cd81615091565b9050919050565b6150dd81614c3e565b81146150e857600080fd5b50565b6000815190506150fa816150d4565b92915050565b600060208284031215615116576151156144ba565b5b6000615124848285016150eb565b9150509291505056fea2646970667358221220e422c3c470e47ae50507101b474be1ed8c967783e71873a857dca314e06454ff64736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 77f229a..8dc667f 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isExpiredAccount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expires","type":"uint256"}],"name":"setExpires","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expires","type":"uint256"}],"name":"setExpires","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index a21caf8..1e0bf95 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -185,33 +185,21 @@ contract DemurrageTokenSingleCap { sinkAddress = _sinkAddress; } - function applyExpiry() public returns(bool) { + function applyExpiry() public returns(uint8) { if (expired) { - return true; + return 1; } if (expires == 0) { - return false; + return 0; } if (block.timestamp >= expires) { - account[sinkAddress] = totalSupply(); + applyDemurrageLimited(expires - demurrageTimestamp / 60); expired = true; emit Expired(block.timestamp); + changePeriod(); + return 2; } - return expired; - } - - function isExpiredAccount(address _account) public view returns(uint8) { - uint8 expiry_state; - - if (expired) { - expiry_state = 1; - } else if (expires > 0 && block.timestamp >= expires) { - expiry_state = 1; - } - if (expiry_state > 0 && _account == sinkAddress) { - expiry_state = 2; - } - return expiry_state; + return 0; } // Given address will be allowed to call the mintTo() function @@ -237,13 +225,6 @@ contract DemurrageTokenSingleCap { uint256 periodCount; uint8 expiryState; - expiryState = isExpiredAccount(_account); - if (expiryState == 1) { - return 0; - } else if (expiryState == 2) { - return totalSupply(); - } - baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account)); periodCount = getMinutesDelta(demurrageTimestamp); @@ -297,6 +278,7 @@ contract DemurrageTokenSingleCap { function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { uint256 baseAmount; + require(applyExpiry() == 0); require(minter[msg.sender], 'ERR_ACCESS'); changePeriod(); @@ -340,7 +322,6 @@ contract DemurrageTokenSingleCap { return r; } - // Client accessor to the redistributions array length function redistributionCount() public view returns (uint256) { return redistributions.length; @@ -449,22 +430,24 @@ contract DemurrageTokenSingleCap { } // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (bool) { + function applyDemurrage() public returns (uint256) { return applyDemurrageLimited(0); } // returns true if expired - function applyDemurrageLimited(uint256 _rounds) public returns (bool) { + function applyDemurrageLimited(uint256 _rounds) public returns (uint256) { int128 v; uint256 periodCount; int128 periodPoint; int128 lastDemurrageAmount; - require(!applyExpiry()); + if (expired) { + return 0; + } periodCount = getMinutesDelta(demurrageTimestamp); if (periodCount == 0) { - return false; + return 0; } lastDemurrageAmount = demurrageAmount; @@ -481,7 +464,7 @@ contract DemurrageTokenSingleCap { demurrageTimestamp = demurrageTimestamp + (periodCount * 60); emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return false; + return periodCount; } // Return timestamp of start of period threshold @@ -534,7 +517,14 @@ contract DemurrageTokenSingleCap { // Implements ERC20, triggers tax and/or redistribution function approve(address _spender, uint256 _value) public returns (bool) { uint256 baseValue; + uint8 ex; + ex = applyExpiry(); + if (ex == 2) { + return false; + } else if (ex > 0) { + revert('EXPIRED'); + } if (allowance[msg.sender][_spender] > 0) { require(_value == 0, 'ZERO_FIRST'); } @@ -578,7 +568,14 @@ contract DemurrageTokenSingleCap { function transfer(address _to, uint256 _value) public returns (bool) { uint256 baseValue; bool result; + uint8 ex; + ex = applyExpiry(); + if (ex == 2) { + return false; + } else if (ex > 0) { + revert('EXPIRED'); + } changePeriod(); baseValue = toBaseAmount(_value); @@ -591,7 +588,14 @@ contract DemurrageTokenSingleCap { function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { uint256 baseValue; bool result; + uint8 ex; + ex = applyExpiry(); + if (ex == 2) { + return false; + } else if (ex > 0) { + revert('EXPIRED'); + } changePeriod(); baseValue = toBaseAmount(_value); @@ -634,6 +638,7 @@ contract DemurrageTokenSingleCap { // Explicitly and irretrievably burn tokens // Only token minters can burn tokens function burn(uint256 _value) public { + require(applyExpiry() == 0); require(minter[msg.sender]); require(_value <= account[msg.sender]); uint256 _delta = toBaseAmount(_value); From 09b825808fe97b2f7da60641cbd55a86d406d401 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 13:45:29 +0000 Subject: [PATCH 28/57] Freeze accounts balances at expiry --- python/erc20_demurrage_token/expiry.py | 22 +++++++ python/erc20_demurrage_token/seal.py | 21 ++++++ python/tests/test_expiry.py | 89 ++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 python/erc20_demurrage_token/expiry.py create mode 100644 python/erc20_demurrage_token/seal.py create mode 100644 python/tests/test_expiry.py diff --git a/python/erc20_demurrage_token/expiry.py b/python/erc20_demurrage_token/expiry.py new file mode 100644 index 0000000..7e0d5a2 --- /dev/null +++ b/python/erc20_demurrage_token/expiry.py @@ -0,0 +1,22 @@ +# external imports +from chainlib.eth.tx import ( + TxFactory, + TxFormat, + ) +from chainlib.eth.contract import ( + ABIContractEncoder, + ABIContractType, + ) + +class ExpiryContract(TxFactory): + + def set_expires(self, contract_address, sender_address, expire_timestamp, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('setExpires') + enc.typ(ABIContractType.UINT256) + enc.uint256(expire_timestamp) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx diff --git a/python/erc20_demurrage_token/seal.py b/python/erc20_demurrage_token/seal.py new file mode 100644 index 0000000..a318e38 --- /dev/null +++ b/python/erc20_demurrage_token/seal.py @@ -0,0 +1,21 @@ +# external imports +from chainlib.eth.tx import ( + TxFactory, + TxFormat, + ) +from chainlib.eth.contract import ( + ABIContractEncoder, + ) + +class SealedContract(TxFactory): + + def set_state(self, contract_address, sender_address, seal, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('seal') + enc.typ(ABIContractType.UINT256) + enc.uint256(seal) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx diff --git a/python/tests/test_expiry.py b/python/tests/test_expiry.py new file mode 100644 index 0000000..8cb7220 --- /dev/null +++ b/python/tests/test_expiry.py @@ -0,0 +1,89 @@ +# standard imports +import os +import unittest +import json +import logging +import datetime + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest import TestDemurrageDefault + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + + +class TestExpire(TestDemurrageDefault): + + def test_expires(self): + mint_amount = self.default_supply + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + for i in range(3): + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[i+1], mint_amount) + r = self.rpc.do(o) + + targetish_time = self.start_time + (self.period_seconds * 2) + (tx_hash, o) = c.set_expires(self.address, self.accounts[0], targetish_time) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + self.backend.time_travel(targetish_time + 60) + o = block_latest() + r = self.rpc.do(o) + o = block_by_number(r) + r = self.rpc.do(o) + self.assertGreaterEqual(r['timestamp'], targetish_time) + + nonce_oracle = RPCNonceOracle(self.sink_address, self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.transfer(self.address, self.sink_address, self.accounts[2], 1) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + self.assert_within(balance, 0.9604 * mint_amount, 1) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + supply = c.parse_balance(r) + + (tx_hash, o) = c.change_period(self.address, self.sink_address) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + balance = c.parse_balance(r) + + o = c.decay_by(self.address, supply, int((targetish_time - self.start_time) / 60), sender_address=self.sink_address) + r = self.rpc.do(o) + target_balance = c.parse_balance(r) + + self.assert_within_lower(balance, supply - target_balance, 0.0001) + + +if __name__ == '__main__': + unittest.main() From 1f0dc0aa5ff284efab8178c899a2553ec7b80316 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 14:30:25 +0000 Subject: [PATCH 29/57] Define expiry in terms of period --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/expiry.py | 18 ++++++++++++++++-- python/tests/test_expiry.py | 19 ++++++++++++++----- solidity/DemurrageTokenSingleNocap.sol | 7 +++++-- 5 files changed, 37 insertions(+), 11 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 9e8189f..5b9b442 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162005f3738038062005f37833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002b8d176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002bb3176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161516362000dd460003960008181611a640152818161218a0152818161278c01526129ce015260008181611a90015281816129ef0152612a3401526151636000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d89135cd116100bf578063e809529511610099578063e809529514610b5d578063eda4e6d614610b7b578063f2fde38b14610b99578063f629620b14610bc95761037a565b8063d89135cd14610adf578063e54063a614610afd578063e69571af14610b2d5761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b61039960048036038101906103949190614517565b610be5565b6040516103a6919061455f565b60405180910390f35b6103b7610d8b565b6040516103c4919061460a565b60405180910390f35b6103e760048036038101906103e291906146c0565b610e19565b6040516103f4919061455f565b60405180910390f35b610405611055565b604051610412919061471c565b60405180910390f35b61043560048036038101906104309190614763565b611068565b60405161044291906147b2565b60405180910390f35b6104536110b8565b60405161046091906147b2565b60405180910390f35b6104716110cf565b60405161047e91906147b2565b60405180910390f35b61048f6110d4565b60405161049c91906147b2565b60405180910390f35b6104bf60048036038101906104ba919061496e565b6110e0565b6040516104cc91906147b2565b60405180910390f35b6104dd6110f9565b6040516104ea919061471c565b60405180910390f35b61050d6004803603810190610508919061496e565b61110c565b60405161051a919061455f565b60405180910390f35b61053d6004803603810190610538919061499b565b611174565b60405161054a919061455f565b60405180910390f35b61056d6004803603810190610568919061496e565b611392565b60405161057a919061471c565b60405180910390f35b61059d600480360381019061059891906149ee565b6113ca565b6040516105aa919061455f565b60405180910390f35b6105cd60048036038101906105c89190614a1b565b6113fd565b6040516105da919061455f565b60405180910390f35b6105fd60048036038101906105f89190614a48565b611507565b60405161060a91906147b2565b60405180910390f35b61061b611573565b60405161062891906147b2565b60405180910390f35b610639611579565b60405161064691906147b2565b60405180910390f35b610669600480360381019061066491906146c0565b61157f565b604051610676919061455f565b60405180910390f35b610699600480360381019061069491906149ee565b611715565b6040516106a893929190614ab5565b60405180910390f35b6106cb60048036038101906106c691906149ee565b611784565b005b6106e760048036038101906106e291906146c0565b6118c0565b6040516106f4919061455f565b60405180910390f35b61071760048036038101906107129190614a1b565b611a17565b60405161072491906147b2565b60405180910390f35b610747600480360381019061074291906149ee565b611a60565b60405161075491906147b2565b60405180910390f35b610777600480360381019061077291906149ee565b611ac0565b60405161078491906147b2565b60405180910390f35b610795611ae1565b6040516107a291906147b2565b60405180910390f35b6107b3611ae7565b6040516107c09190614b08565b60405180910390f35b6107e360048036038101906107de91906149ee565b611bb4565b6040516107f091906147b2565b60405180910390f35b610813600480360381019061080e91906149ee565b611bf5565b60405161082091906147b2565b60405180910390f35b610843600480360381019061083e9190614a1b565b611c16565b60405161085091906147b2565b60405180910390f35b610861611c80565b60405161086e91906147b2565b60405180910390f35b61087f611c91565b60405161088c91906147b2565b60405180910390f35b6108af60048036038101906108aa919061496e565b611c97565b6040516108bc91906147b2565b60405180910390f35b6108cd611cc5565b6040516108da91906147b2565b60405180910390f35b6108eb611ccb565b6040516108f8919061455f565b60405180910390f35b610909611e72565b6040516109169190614b32565b60405180910390f35b610939600480360381019061093491906149ee565b611e98565b60405161094691906147b2565b60405180910390f35b610957611f77565b6040516109649190614b32565b60405180910390f35b61098760048036038101906109829190614a1b565b611f9d565b005b610991612052565b60405161099e919061455f565b60405180910390f35b6109af612302565b6040516109bc919061460a565b60405180910390f35b6109df60048036038101906109da9190614a1b565b612390565b6040516109ec919061455f565b60405180910390f35b610a0f6004803603810190610a0a91906146c0565b612464565b604051610a1c919061455f565b60405180910390f35b610a3f6004803603810190610a3a91906146c0565b612683565b604051610a4c919061455f565b60405180910390f35b610a5d612784565b604051610a6a91906147b2565b60405180910390f35b610a7b61278a565b604051610a8891906147b2565b60405180910390f35b610aab6004803603810190610aa691906149ee565b6127ae565b604051610ab891906147b2565b60405180910390f35b610ac9612924565b604051610ad691906147b2565b60405180910390f35b610ae761292a565b604051610af491906147b2565b60405180910390f35b610b176004803603810190610b12919061496e565b612934565b604051610b2491906147b2565b60405180910390f35b610b476004803603810190610b429190614b4d565b612948565b604051610b549190614c23565b60405180910390f35b610b656129c8565b604051610b729190614c69565b60405180910390f35b610b83612a32565b604051610b9091906147b2565b60405180910390f35b610bb36004803603810190610bae9190614a1b565b612a56565b604051610bc0919061455f565b60405180910390f35b610be36004803603810190610bde91906149ee565b612af8565b005b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614cb3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614cb3565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d30565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614d9c565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161104091906147b2565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612b8d565b61108a6110846001612b8d565b86612bf5565b612c5c565b905061109a81612cdb565b67ffffffffffffffff16846110af9190614deb565b91505092915050565b6000600c546009546110ca9190614deb565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d30565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614deb565b9250508190555061131d878785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c91906147b2565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612b8d565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612b8d565b925061152185612b8d565b915061153c600d60009054906101000a9004600f0b83612c5c565b905061154781612d35565b90506115538382612c5c565b905061155e81612cdb565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e1f565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161170291906147b2565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612dc2565b5081600c60008282546118679190614e1f565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b491906147b2565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614e9f565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e1f565b9250508190555061199d8482612ec9565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb91906147b2565b60405180910390a3611a0b612f8d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614ebf565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e1f565b9050919050565b6000603c8242611ad09190614deb565b611ada9190614f30565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f30565b601154611b429190614deb565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b9291906147b2565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612b8d565b600260009054906101000a9004600f0b613151565b9050611be381612cdb565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614deb565b611c0f9190614f30565b9050919050565b6000806000806000611c2f611c2a87611a17565b612b8d565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612c5c565b9250611c75611c6584612cdb565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490614fad565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b90615019565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f6591906147b2565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c614474565b612064614474565b61206c614474565b600080600080600061207c611c80565b506120856131dd565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612934565b94506001856121789190614e1f565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614ebf565b6121bd9190614f30565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612b8d565b612c5c565b612d35565b92506121fe6000846121f86110b8565b84612948565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba87613373565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea91906147b2565b60405180910390a16001985050505050505050505b90565b6007805461230f90614cb3565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614cb3565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614deb565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161267091906147b2565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d30565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d10565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f91906147b2565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612b8d565b9150612848600d60009054906101000a9004600f0b83612c5c565b935061285384612d35565b935061286e600260009054906101000a9004600f0b85612c5c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614ebf565b6003546128c39190614e1f565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f919061471c565b60405180910390a4829450505050505b919050565b600a5481565b6000600c54905090565b6000816000015163ffffffff169050919050565b612950614474565b612958614474565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612a199190614deb565b612a239190614f30565b612a2d9190614e1f565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612ab257600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b612b05600460ff166113ca565b15612b0f57600080fd5b601260009054906101000a900460ff1615612b2957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8357600080fd5b8060118190555050565b6000677fffffffffffffff821115612ba457600080fd5b6040829060020a029050919050565b60008082600f0b13612bc457600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612be084613492565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c4957506f7fffffffffffffffffffffffffffffff600f0b8113155b612c5257600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612cc857506f7fffffffffffffffffffffffffffffff600f0b8113155b612cd157600080fd5b8091505092915050565b60008082600f0b1215612ced57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d1d8584612dc2565b50612d288484612ec9565b5060019150509392505050565b60006840000000000000000082600f0b12612d4f57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612d835760009050612dbd565b612dba6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613658565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e1e5760009350505050612ec3565b612e2786611a17565b925084831015612e6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e63906150b4565b60405180910390fd5b8483612e789190614deb565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f255760009350505050612f87565b612f2e86611a17565b92508483612f3c9190614e1f565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612f97614474565b6000612fa16110b8565b905060006001600080549050612fb79190614deb565b81548110612fc857612fc7615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130a39190614deb565b815481106130b4576130b3615039565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361316257600080fd5b600082600f0b604085600f0b9060020a028161318157613180614f01565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156131ca57506f7fffffffffffffffffffffffffffffff600f0b8113155b6131d357600080fd5b8091505092915050565b6131e5614474565b6131ed614474565b6131f5614474565b600080600a548154811061320c5761320b615039565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613317573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061333b9190615100565b6fffffffffffffffffffffffffffffffff16905061335883612934565b811161336957819350505050613370565b8293505050505b90565b600080600061338184611c97565b6133896110b8565b6133939190614deb565b9150600b546133a183611bb4565b6133ab9190614deb565b90506133d9601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612ec9565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161344d91906147b2565b60405180910390a36001600a60008282546134689190614e1f565b9250508190555080600b60008282546134819190614e1f565b925050819055508192505050919050565b60008082600f0b136134a357600080fd5b60008083600f0b90506801000000000000000081126134de576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261350c576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613538576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613563576008819060008212600003808260020a82851804189250505090506008820191505b6010811261358d576004819060008212600003808260020a82851804189250505090506004820191505b600481126135b7576002819060008212600003808260020a82851804189250505090506002820191505b600281126135c6576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561364b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506135f3565b5081945050505050919050565b60006840000000000000000082600f0b1261367257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136a6576000905061446f565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156136f457608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561372d5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137665760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561379f57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156137d85760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613811576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b131561384a57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613883576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b13156138bb57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156138f35760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b131561392b576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139635760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b131561399b576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b13156139d357608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a0b5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a4357608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613a7a5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613ab1576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ae857608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b1f576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613b5657608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613b8d5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613bc4576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613bfb5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c31576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613c6757608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613c9d5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613cd357608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d095760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d3f576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613d7557608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613dab576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613de057608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e155760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613e4a576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613e7f5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613eb4576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613ee957608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f1e5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613f5357608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613f875760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315613fbb576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b1315613fef57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614023576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561405757608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561408b5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156140bf576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156140f35760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614126576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561415957608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561418c5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156141bf57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156141f25760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614225576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561425857608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561428b576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156142bd57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156142ef5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614321576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143535760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614385576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156143b757608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156143e95760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561441b57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561446a57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6144f4816144bf565b81146144ff57600080fd5b50565b600081359050614511816144eb565b92915050565b60006020828403121561452d5761452c6144ba565b5b600061453b84828501614502565b91505092915050565b60008115159050919050565b61455981614544565b82525050565b60006020820190506145746000830184614550565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156145b4578082015181840152602081019050614599565b60008484015250505050565b6000601f19601f8301169050919050565b60006145dc8261457a565b6145e68185614585565b93506145f6818560208601614596565b6145ff816145c0565b840191505092915050565b6000602082019050818103600083015261462481846145d1565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146578261462c565b9050919050565b6146678161464c565b811461467257600080fd5b50565b6000813590506146848161465e565b92915050565b6000819050919050565b61469d8161468a565b81146146a857600080fd5b50565b6000813590506146ba81614694565b92915050565b600080604083850312156146d7576146d66144ba565b5b60006146e585828601614675565b92505060206146f6858286016146ab565b9150509250929050565b600081600f0b9050919050565b61471681614700565b82525050565b6000602082019050614731600083018461470d565b92915050565b61474081614700565b811461474b57600080fd5b50565b60008135905061475d81614737565b92915050565b6000806040838503121561477a576147796144ba565b5b6000614788858286016146ab565b92505060206147998582860161474e565b9150509250929050565b6147ac8161468a565b82525050565b60006020820190506147c760008301846147a3565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61480a826145c0565b810181811067ffffffffffffffff82111715614829576148286147d2565b5b80604052505050565b600061483c6144b0565b90506148488282614801565b919050565b600063ffffffff82169050919050565b6148668161484d565b811461487157600080fd5b50565b6000813590506148838161485d565b92915050565b600068ffffffffffffffffff82169050919050565b6148a781614889565b81146148b257600080fd5b50565b6000813590506148c48161489e565b92915050565b600067ffffffffffffffff82169050919050565b6148e7816148ca565b81146148f257600080fd5b50565b600081359050614904816148de565b92915050565b6000606082840312156149205761491f6147cd565b5b61492a6060614832565b9050600061493a84828501614874565b600083015250602061494e848285016148b5565b6020830152506040614962848285016148f5565b60408301525092915050565b600060608284031215614984576149836144ba565b5b60006149928482850161490a565b91505092915050565b6000806000606084860312156149b4576149b36144ba565b5b60006149c286828701614675565b93505060206149d386828701614675565b92505060406149e4868287016146ab565b9150509250925092565b600060208284031215614a0457614a036144ba565b5b6000614a12848285016146ab565b91505092915050565b600060208284031215614a3157614a306144ba565b5b6000614a3f84828501614675565b91505092915050565b60008060408385031215614a5f57614a5e6144ba565b5b6000614a6d858286016146ab565b9250506020614a7e858286016146ab565b9150509250929050565b614a918161484d565b82525050565b614aa081614889565b82525050565b614aaf816148ca565b82525050565b6000606082019050614aca6000830186614a88565b614ad76020830185614a97565b614ae46040830184614aa6565b949350505050565b600060ff82169050919050565b614b0281614aec565b82525050565b6000602082019050614b1d6000830184614af9565b92915050565b614b2c8161464c565b82525050565b6000602082019050614b476000830184614b23565b92915050565b60008060008060808587031215614b6757614b666144ba565b5b6000614b75878288016146ab565b9450506020614b868782880161474e565b9350506040614b97878288016146ab565b9250506060614ba8878288016146ab565b91505092959194509250565b614bbd8161484d565b82525050565b614bcc81614889565b82525050565b614bdb816148ca565b82525050565b606082016000820151614bf76000850182614bb4565b506020820151614c0a6020850182614bc3565b506040820151614c1d6040850182614bd2565b50505050565b6000606082019050614c386000830184614be1565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614c6381614c3e565b82525050565b6000602082019050614c7e6000830184614c5a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614ccb57607f821691505b602082108103614cde57614cdd614c84565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d1a600783614585565b9150614d2582614ce4565b602082019050919050565b60006020820190508181036000830152614d4981614d0d565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614d86600a83614585565b9150614d9182614d50565b602082019050919050565b60006020820190508181036000830152614db581614d79565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614df68261468a565b9150614e018361468a565b9250828203905081811115614e1957614e18614dbc565b5b92915050565b6000614e2a8261468a565b9150614e358361468a565b9250828201905080821115614e4d57614e4c614dbc565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614e89600a83614585565b9150614e9482614e53565b602082019050919050565b60006020820190508181036000830152614eb881614e7c565b9050919050565b6000614eca8261468a565b9150614ed58361468a565b9250828202614ee38161468a565b91508282048414831517614efa57614ef9614dbc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f3b8261468a565b9150614f468361468a565b925082614f5657614f55614f01565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614f97601183614585565b9150614fa282614f61565b602082019050919050565b60006020820190508181036000830152614fc681614f8a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615003601283614585565b915061500e82614fcd565b602082019050919050565b6000602082019050818103600083015261503281614ff6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061509e600d83614585565b91506150a982615068565b602082019050919050565b600060208201905081810360008301526150cd81615091565b9050919050565b6150dd81614c3e565b81146150e857600080fd5b50565b6000815190506150fa816150d4565b92915050565b600060208284031215615116576151156144ba565b5b6000615124848285016150eb565b9150509291505056fea2646970667358221220e422c3c470e47ae50507101b474be1ed8c967783e71873a857dca314e06454ff64736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162005f9b38038062005f9b833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002be3176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002c09176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516151b962000de260003960008181611a640152818161218a0152818161278c015281816129b70152612ab9015260008181611a90015281816129e301528181612ada0152612b1f01526151b96000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d7a52fa9116100bf578063e69571af11610099578063e69571af14610b49578063e809529514610b79578063eda4e6d614610b97578063f2fde38b14610bb55761037a565b8063d7a52fa914610adf578063d89135cd14610afb578063e54063a614610b195761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b6103996004803603810190610394919061456d565b610be5565b6040516103a691906145b5565b60405180910390f35b6103b7610d8b565b6040516103c49190614660565b60405180910390f35b6103e760048036038101906103e29190614716565b610e19565b6040516103f491906145b5565b60405180910390f35b610405611055565b6040516104129190614772565b60405180910390f35b610435600480360381019061043091906147b9565b611068565b6040516104429190614808565b60405180910390f35b6104536110b8565b6040516104609190614808565b60405180910390f35b6104716110cf565b60405161047e9190614808565b60405180910390f35b61048f6110d4565b60405161049c9190614808565b60405180910390f35b6104bf60048036038101906104ba91906149c4565b6110e0565b6040516104cc9190614808565b60405180910390f35b6104dd6110f9565b6040516104ea9190614772565b60405180910390f35b61050d600480360381019061050891906149c4565b61110c565b60405161051a91906145b5565b60405180910390f35b61053d600480360381019061053891906149f1565b611174565b60405161054a91906145b5565b60405180910390f35b61056d600480360381019061056891906149c4565b611392565b60405161057a9190614772565b60405180910390f35b61059d60048036038101906105989190614a44565b6113ca565b6040516105aa91906145b5565b60405180910390f35b6105cd60048036038101906105c89190614a71565b6113fd565b6040516105da91906145b5565b60405180910390f35b6105fd60048036038101906105f89190614a9e565b611507565b60405161060a9190614808565b60405180910390f35b61061b611573565b6040516106289190614808565b60405180910390f35b610639611579565b6040516106469190614808565b60405180910390f35b61066960048036038101906106649190614716565b61157f565b60405161067691906145b5565b60405180910390f35b61069960048036038101906106949190614a44565b611715565b6040516106a893929190614b0b565b60405180910390f35b6106cb60048036038101906106c69190614a44565b611784565b005b6106e760048036038101906106e29190614716565b6118c0565b6040516106f491906145b5565b60405180910390f35b61071760048036038101906107129190614a71565b611a17565b6040516107249190614808565b60405180910390f35b61074760048036038101906107429190614a44565b611a60565b6040516107549190614808565b60405180910390f35b61077760048036038101906107729190614a44565b611ac0565b6040516107849190614808565b60405180910390f35b610795611ae1565b6040516107a29190614808565b60405180910390f35b6107b3611ae7565b6040516107c09190614b5e565b60405180910390f35b6107e360048036038101906107de9190614a44565b611bb4565b6040516107f09190614808565b60405180910390f35b610813600480360381019061080e9190614a44565b611bf5565b6040516108209190614808565b60405180910390f35b610843600480360381019061083e9190614a71565b611c16565b6040516108509190614808565b60405180910390f35b610861611c80565b60405161086e9190614808565b60405180910390f35b61087f611c91565b60405161088c9190614808565b60405180910390f35b6108af60048036038101906108aa91906149c4565b611c97565b6040516108bc9190614808565b60405180910390f35b6108cd611cc5565b6040516108da9190614808565b60405180910390f35b6108eb611ccb565b6040516108f891906145b5565b60405180910390f35b610909611e72565b6040516109169190614b88565b60405180910390f35b61093960048036038101906109349190614a44565b611e98565b6040516109469190614808565b60405180910390f35b610957611f77565b6040516109649190614b88565b60405180910390f35b61098760048036038101906109829190614a71565b611f9d565b005b610991612052565b60405161099e91906145b5565b60405180910390f35b6109af612302565b6040516109bc9190614660565b60405180910390f35b6109df60048036038101906109da9190614a71565b612390565b6040516109ec91906145b5565b60405180910390f35b610a0f6004803603810190610a0a9190614716565b612464565b604051610a1c91906145b5565b60405180910390f35b610a3f6004803603810190610a3a9190614716565b612683565b604051610a4c91906145b5565b60405180910390f35b610a5d612784565b604051610a6a9190614808565b60405180910390f35b610a7b61278a565b604051610a889190614808565b60405180910390f35b610aab6004803603810190610aa69190614a44565b6127ae565b604051610ab89190614808565b60405180910390f35b610ac9612924565b604051610ad69190614808565b60405180910390f35b610af96004803603810190610af49190614a44565b61292a565b005b610b03612a15565b604051610b109190614808565b60405180910390f35b610b336004803603810190610b2e91906149c4565b612a1f565b604051610b409190614808565b60405180910390f35b610b636004803603810190610b5e9190614ba3565b612a33565b604051610b709190614c79565b60405180910390f35b610b81612ab3565b604051610b8e9190614cbf565b60405180910390f35b610b9f612b1d565b604051610bac9190614808565b60405180910390f35b610bcf6004803603810190610bca9190614a71565b612b41565b604051610bdc91906145b5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614d09565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614d09565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d86565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614df2565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110409190614808565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612be3565b61108a6110846001612be3565b86612c4b565b612cb2565b905061109a81612d31565b67ffffffffffffffff16846110af9190614e41565b91505092915050565b6000600c546009546110ca9190614e41565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d86565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614e41565b9250508190555061131d878785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c9190614808565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612be3565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612be3565b925061152185612be3565b915061153c600d60009054906101000a9004600f0b83612cb2565b905061154781612d8b565b90506115538382612cb2565b905061155e81612d31565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e75565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117029190614808565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612e18565b5081600c60008282546118679190614e75565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b49190614808565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614ef5565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e75565b9250508190555061199d8482612f1f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb9190614808565b60405180910390a3611a0b612fe3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e75565b9050919050565b6000603c8242611ad09190614e41565b611ada9190614f86565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f86565b601154611b429190614e41565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b929190614808565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612be3565b600260009054906101000a9004600f0b6131a7565b9050611be381612d31565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614e41565b611c0f9190614f86565b9050919050565b6000806000806000611c2f611c2a87611a17565b612be3565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612cb2565b9250611c75611c6584612d31565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490615003565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061506f565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f659190614808565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c6144ca565b6120646144ca565b61206c6144ca565b600080600080600061207c611c80565b50612085613233565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612a1f565b94506001856121789190614e75565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614f15565b6121bd9190614f86565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612be3565b612cb2565b612d8b565b92506121fe6000846121f86110b8565b84612a33565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba876133c9565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea9190614808565b60405180910390a16001985050505050505050505b90565b6007805461230f90614d09565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614d09565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614e41565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516126709190614808565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d86565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f9190614808565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612be3565b9150612848600d60009054906101000a9004600f0b83612cb2565b935061285384612d8b565b935061286e600260009054906101000a9004600f0b85612cb2565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614f15565b6003546128c39190614e75565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f9190614772565b60405180910390a4829450505050505b919050565b600a5481565b612937600460ff166113ca565b1561294157600080fd5b601260009054906101000a900460ff161561295b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129b557600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000816129e19190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000612a0c9190614e75565b60118190555050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612a3b6144ca565b612a436144ca565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612b049190614e41565b612b0e9190614f86565b612b189190614e75565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b9d57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612bfa57600080fd5b6040829060020a029050919050565b60008082600f0b13612c1a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612c36846134e8565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c9f57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ca857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612d1e57506f7fffffffffffffffffffffffffffffff600f0b8113155b612d2757600080fd5b8091505092915050565b60008082600f0b1215612d4357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d738584612e18565b50612d7e8484612f1f565b5060019150509392505050565b60006840000000000000000082600f0b12612da557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612dd95760009050612e13565b612e106080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506136ae565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e745760009350505050612f19565b612e7d86611a17565b925084831015612ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb99061510a565b60405180910390fd5b8483612ece9190614e41565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f7b5760009350505050612fdd565b612f8486611a17565b92508483612f929190614e75565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612fed6144ca565b6000612ff76110b8565b90506000600160008054905061300d9190614e41565b8154811061301e5761301d61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130f99190614e41565b8154811061310a5761310961508f565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036131b857600080fd5b600082600f0b604085600f0b9060020a02816131d7576131d6614f57565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561322057506f7fffffffffffffffffffffffffffffff600f0b8113155b61322957600080fd5b8091505092915050565b61323b6144ca565b6132436144ca565b61324b6144ca565b600080600a54815481106132625761326161508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561336d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133919190615156565b6fffffffffffffffffffffffffffffffff1690506133ae83612a1f565b81116133bf578193505050506133c6565b8293505050505b90565b60008060006133d784611c97565b6133df6110b8565b6133e99190614e41565b9150600b546133f783611bb4565b6134019190614e41565b905061342f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612f1f565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516134a39190614808565b60405180910390a36001600a60008282546134be9190614e75565b9250508190555080600b60008282546134d79190614e75565b925050819055508192505050919050565b60008082600f0b136134f957600080fd5b60008083600f0b9050680100000000000000008112613534576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613562576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261358e576010819060008212600003808260020a82851804189250505090506010820191505b61010081126135b9576008819060008212600003808260020a82851804189250505090506008820191505b601081126135e3576004819060008212600003808260020a82851804189250505090506004820191505b6004811261360d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261361c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156136a1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613649565b5081945050505050919050565b60006840000000000000000082600f0b126136c857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136fc57600090506144c5565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561374a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137835760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137bc5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137f557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b131561382e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613867576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156138a057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156138d9576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561391157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156139495760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613981576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139b95760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139f1576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613a2957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a615760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a9957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613ad05760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613b07576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613b3e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b75576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613bac57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613be35760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613c1a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c515760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c87576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613cbd57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613cf35760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613d2957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d5f5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d95576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613dcb57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613e01576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613e3657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e6b5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613ea0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613ed55760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613f0a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613f3f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f745760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613fa957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613fdd5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614011576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561404557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614079576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156140ad57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140e15760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614115576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156141495760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561417c576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156141af57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141e25760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561421557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156142485760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561427b576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156142ae57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156142e1576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561431357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156143455760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614377576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143a95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156143db576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561440d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561443f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561447157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156144c057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61454a81614515565b811461455557600080fd5b50565b60008135905061456781614541565b92915050565b60006020828403121561458357614582614510565b5b600061459184828501614558565b91505092915050565b60008115159050919050565b6145af8161459a565b82525050565b60006020820190506145ca60008301846145a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460a5780820151818401526020810190506145ef565b60008484015250505050565b6000601f19601f8301169050919050565b6000614632826145d0565b61463c81856145db565b935061464c8185602086016145ec565b61465581614616565b840191505092915050565b6000602082019050818103600083015261467a8184614627565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ad82614682565b9050919050565b6146bd816146a2565b81146146c857600080fd5b50565b6000813590506146da816146b4565b92915050565b6000819050919050565b6146f3816146e0565b81146146fe57600080fd5b50565b600081359050614710816146ea565b92915050565b6000806040838503121561472d5761472c614510565b5b600061473b858286016146cb565b925050602061474c85828601614701565b9150509250929050565b600081600f0b9050919050565b61476c81614756565b82525050565b60006020820190506147876000830184614763565b92915050565b61479681614756565b81146147a157600080fd5b50565b6000813590506147b38161478d565b92915050565b600080604083850312156147d0576147cf614510565b5b60006147de85828601614701565b92505060206147ef858286016147a4565b9150509250929050565b614802816146e0565b82525050565b600060208201905061481d60008301846147f9565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61486082614616565b810181811067ffffffffffffffff8211171561487f5761487e614828565b5b80604052505050565b6000614892614506565b905061489e8282614857565b919050565b600063ffffffff82169050919050565b6148bc816148a3565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600068ffffffffffffffffff82169050919050565b6148fd816148df565b811461490857600080fd5b50565b60008135905061491a816148f4565b92915050565b600067ffffffffffffffff82169050919050565b61493d81614920565b811461494857600080fd5b50565b60008135905061495a81614934565b92915050565b60006060828403121561497657614975614823565b5b6149806060614888565b90506000614990848285016148ca565b60008301525060206149a48482850161490b565b60208301525060406149b88482850161494b565b60408301525092915050565b6000606082840312156149da576149d9614510565b5b60006149e884828501614960565b91505092915050565b600080600060608486031215614a0a57614a09614510565b5b6000614a18868287016146cb565b9350506020614a29868287016146cb565b9250506040614a3a86828701614701565b9150509250925092565b600060208284031215614a5a57614a59614510565b5b6000614a6884828501614701565b91505092915050565b600060208284031215614a8757614a86614510565b5b6000614a95848285016146cb565b91505092915050565b60008060408385031215614ab557614ab4614510565b5b6000614ac385828601614701565b9250506020614ad485828601614701565b9150509250929050565b614ae7816148a3565b82525050565b614af6816148df565b82525050565b614b0581614920565b82525050565b6000606082019050614b206000830186614ade565b614b2d6020830185614aed565b614b3a6040830184614afc565b949350505050565b600060ff82169050919050565b614b5881614b42565b82525050565b6000602082019050614b736000830184614b4f565b92915050565b614b82816146a2565b82525050565b6000602082019050614b9d6000830184614b79565b92915050565b60008060008060808587031215614bbd57614bbc614510565b5b6000614bcb87828801614701565b9450506020614bdc878288016147a4565b9350506040614bed87828801614701565b9250506060614bfe87828801614701565b91505092959194509250565b614c13816148a3565b82525050565b614c22816148df565b82525050565b614c3181614920565b82525050565b606082016000820151614c4d6000850182614c0a565b506020820151614c606020850182614c19565b506040820151614c736040850182614c28565b50505050565b6000606082019050614c8e6000830184614c37565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614cb981614c94565b82525050565b6000602082019050614cd46000830184614cb0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d2157607f821691505b602082108103614d3457614d33614cda565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d706007836145db565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614ddc600a836145db565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e4c826146e0565b9150614e57836146e0565b9250828203905081811115614e6f57614e6e614e12565b5b92915050565b6000614e80826146e0565b9150614e8b836146e0565b9250828201905080821115614ea357614ea2614e12565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614edf600a836145db565b9150614eea82614ea9565b602082019050919050565b60006020820190508181036000830152614f0e81614ed2565b9050919050565b6000614f20826146e0565b9150614f2b836146e0565b9250828202614f39816146e0565b91508282048414831517614f5057614f4f614e12565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826146e0565b9150614f9c836146e0565b925082614fac57614fab614f57565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614fed6011836145db565b9150614ff882614fb7565b602082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006150596012836145db565b915061506482615023565b602082019050919050565b600060208201905081810360008301526150888161504c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006150f4600d836145db565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b61513381614c94565b811461513e57600080fd5b50565b6000815190506151508161512a565b92915050565b60006020828403121561516c5761516b614510565b5b600061517a84828501615141565b9150509291505056fea2646970667358221220d6351777218bf30eca2e84cf0c363162805780e3cf9d358d670ec4d60f71974864736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 8dc667f..27040b2 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expires","type":"uint256"}],"name":"setExpires","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/expiry.py b/python/erc20_demurrage_token/expiry.py index 7e0d5a2..aa7c643 100644 --- a/python/erc20_demurrage_token/expiry.py +++ b/python/erc20_demurrage_token/expiry.py @@ -6,13 +6,16 @@ from chainlib.eth.tx import ( from chainlib.eth.contract import ( ABIContractEncoder, ABIContractType, + abi_decode_single, ) +from chainlib.eth.constant import ZERO_ADDRESS + class ExpiryContract(TxFactory): - def set_expires(self, contract_address, sender_address, expire_timestamp, tx_format=TxFormat.JSONRPC): + def set_expires_period(self, contract_address, sender_address, expire_timestamp, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() - enc.method('setExpires') + enc.method('setExpirePeriod') enc.typ(ABIContractType.UINT256) enc.uint256(expire_timestamp) data = enc.get() @@ -20,3 +23,14 @@ class ExpiryContract(TxFactory): tx = self.set_code(tx, data) tx = self.finalize(tx, tx_format) return tx + + + def expires(self, contract_address, sender_address=ZERO_ADDRESS): + return self.call_noarg('expires', contract_address, sender_address=sender_address) + + + @classmethod + def parse_expires(self, v): + return abi_decode_single(ABIContractType.UINT256, v) + + diff --git a/python/tests/test_expiry.py b/python/tests/test_expiry.py index 8cb7220..4ebe6e1 100644 --- a/python/tests/test_expiry.py +++ b/python/tests/test_expiry.py @@ -37,19 +37,22 @@ class TestExpire(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[i+1], mint_amount) r = self.rpc.do(o) - targetish_time = self.start_time + (self.period_seconds * 2) - (tx_hash, o) = c.set_expires(self.address, self.accounts[0], targetish_time) + (tx_hash, o) = c.set_expires_period(self.address, self.accounts[0], 2) r = self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) self.assertEqual(r['status'], 1) - self.backend.time_travel(targetish_time + 60) + o = c.expires(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + expiry_time = c.parse_expires(r) + + self.backend.time_travel(expiry_time + 60) o = block_latest() r = self.rpc.do(o) o = block_by_number(r) r = self.rpc.do(o) - self.assertGreaterEqual(r['timestamp'], targetish_time) + self.assertGreaterEqual(r['timestamp'], expiry_time) nonce_oracle = RPCNonceOracle(self.sink_address, self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -59,6 +62,12 @@ class TestExpire(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) + (tx_hash, o) = c.transfer(self.address, self.sink_address, self.accounts[2], 1) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance(r) @@ -78,7 +87,7 @@ class TestExpire(TestDemurrageDefault): r = self.rpc.do(o) balance = c.parse_balance(r) - o = c.decay_by(self.address, supply, int((targetish_time - self.start_time) / 60), sender_address=self.sink_address) + o = c.decay_by(self.address, supply, int((expiry_time - self.start_time) / 60), sender_address=self.sink_address) r = self.rpc.do(o) target_balance = c.parse_balance(r) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 1e0bf95..140e7f8 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -170,11 +170,11 @@ contract DemurrageTokenSingleCap { return _state & sealState == _state; } - function setExpires(uint256 _expires) public { + function setExpirePeriod(uint256 _expirePeriod) public { require(!isSealed(EXPIRY_STATE)); require(!expired); require(msg.sender == owner); - expires = _expires; + expires = periodStart + (_expirePeriod * periodDuration); } @@ -185,6 +185,9 @@ contract DemurrageTokenSingleCap { sinkAddress = _sinkAddress; } + // Expire the contract if expire is set and we have gone over the threshold. + // Finalizes demurrage up to the timestamp of the expiry. + // The first approve, transfer or transferFrom call that hits the ex == 2 will get the tx mined. but without the actual effect. Otherwise we would have to wait until an external egent called applyExpiry to get the correct final balance. function applyExpiry() public returns(uint8) { if (expired) { return 1; From 335373340520c5ccb81c145c25dede8d84dd5e36 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 15:21:37 +0000 Subject: [PATCH 30/57] Add seal logic and tests --- .../data/DemurrageTokenSingleNocap.bin | 2 +- python/erc20_demurrage_token/expiry.py | 2 +- python/erc20_demurrage_token/seal.py | 47 ++++- python/erc20_demurrage_token/token.py | 12 ++ python/run_tests.sh | 3 + python/tests/test_expiry.py | 2 +- python/tests/test_seal.py | 164 ++++++++++++++++++ solidity/DemurrageTokenSingleNocap.sol | 2 +- 8 files changed, 229 insertions(+), 5 deletions(-) create mode 100644 python/tests/test_seal.py diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 5b9b442..fcf5aba 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162005f9b38038062005f9b833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002be3176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002c09176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516151b962000de260003960008181611a640152818161218a0152818161278c015281816129b70152612ab9015260008181611a90015281816129e301528181612ada0152612b1f01526151b96000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d7a52fa9116100bf578063e69571af11610099578063e69571af14610b49578063e809529514610b79578063eda4e6d614610b97578063f2fde38b14610bb55761037a565b8063d7a52fa914610adf578063d89135cd14610afb578063e54063a614610b195761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b6103996004803603810190610394919061456d565b610be5565b6040516103a691906145b5565b60405180910390f35b6103b7610d8b565b6040516103c49190614660565b60405180910390f35b6103e760048036038101906103e29190614716565b610e19565b6040516103f491906145b5565b60405180910390f35b610405611055565b6040516104129190614772565b60405180910390f35b610435600480360381019061043091906147b9565b611068565b6040516104429190614808565b60405180910390f35b6104536110b8565b6040516104609190614808565b60405180910390f35b6104716110cf565b60405161047e9190614808565b60405180910390f35b61048f6110d4565b60405161049c9190614808565b60405180910390f35b6104bf60048036038101906104ba91906149c4565b6110e0565b6040516104cc9190614808565b60405180910390f35b6104dd6110f9565b6040516104ea9190614772565b60405180910390f35b61050d600480360381019061050891906149c4565b61110c565b60405161051a91906145b5565b60405180910390f35b61053d600480360381019061053891906149f1565b611174565b60405161054a91906145b5565b60405180910390f35b61056d600480360381019061056891906149c4565b611392565b60405161057a9190614772565b60405180910390f35b61059d60048036038101906105989190614a44565b6113ca565b6040516105aa91906145b5565b60405180910390f35b6105cd60048036038101906105c89190614a71565b6113fd565b6040516105da91906145b5565b60405180910390f35b6105fd60048036038101906105f89190614a9e565b611507565b60405161060a9190614808565b60405180910390f35b61061b611573565b6040516106289190614808565b60405180910390f35b610639611579565b6040516106469190614808565b60405180910390f35b61066960048036038101906106649190614716565b61157f565b60405161067691906145b5565b60405180910390f35b61069960048036038101906106949190614a44565b611715565b6040516106a893929190614b0b565b60405180910390f35b6106cb60048036038101906106c69190614a44565b611784565b005b6106e760048036038101906106e29190614716565b6118c0565b6040516106f491906145b5565b60405180910390f35b61071760048036038101906107129190614a71565b611a17565b6040516107249190614808565b60405180910390f35b61074760048036038101906107429190614a44565b611a60565b6040516107549190614808565b60405180910390f35b61077760048036038101906107729190614a44565b611ac0565b6040516107849190614808565b60405180910390f35b610795611ae1565b6040516107a29190614808565b60405180910390f35b6107b3611ae7565b6040516107c09190614b5e565b60405180910390f35b6107e360048036038101906107de9190614a44565b611bb4565b6040516107f09190614808565b60405180910390f35b610813600480360381019061080e9190614a44565b611bf5565b6040516108209190614808565b60405180910390f35b610843600480360381019061083e9190614a71565b611c16565b6040516108509190614808565b60405180910390f35b610861611c80565b60405161086e9190614808565b60405180910390f35b61087f611c91565b60405161088c9190614808565b60405180910390f35b6108af60048036038101906108aa91906149c4565b611c97565b6040516108bc9190614808565b60405180910390f35b6108cd611cc5565b6040516108da9190614808565b60405180910390f35b6108eb611ccb565b6040516108f891906145b5565b60405180910390f35b610909611e72565b6040516109169190614b88565b60405180910390f35b61093960048036038101906109349190614a44565b611e98565b6040516109469190614808565b60405180910390f35b610957611f77565b6040516109649190614b88565b60405180910390f35b61098760048036038101906109829190614a71565b611f9d565b005b610991612052565b60405161099e91906145b5565b60405180910390f35b6109af612302565b6040516109bc9190614660565b60405180910390f35b6109df60048036038101906109da9190614a71565b612390565b6040516109ec91906145b5565b60405180910390f35b610a0f6004803603810190610a0a9190614716565b612464565b604051610a1c91906145b5565b60405180910390f35b610a3f6004803603810190610a3a9190614716565b612683565b604051610a4c91906145b5565b60405180910390f35b610a5d612784565b604051610a6a9190614808565b60405180910390f35b610a7b61278a565b604051610a889190614808565b60405180910390f35b610aab6004803603810190610aa69190614a44565b6127ae565b604051610ab89190614808565b60405180910390f35b610ac9612924565b604051610ad69190614808565b60405180910390f35b610af96004803603810190610af49190614a44565b61292a565b005b610b03612a15565b604051610b109190614808565b60405180910390f35b610b336004803603810190610b2e91906149c4565b612a1f565b604051610b409190614808565b60405180910390f35b610b636004803603810190610b5e9190614ba3565b612a33565b604051610b709190614c79565b60405180910390f35b610b81612ab3565b604051610b8e9190614cbf565b60405180910390f35b610b9f612b1d565b604051610bac9190614808565b60405180910390f35b610bcf6004803603810190610bca9190614a71565b612b41565b604051610bdc91906145b5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614d09565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614d09565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d86565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614df2565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110409190614808565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612be3565b61108a6110846001612be3565b86612c4b565b612cb2565b905061109a81612d31565b67ffffffffffffffff16846110af9190614e41565b91505092915050565b6000600c546009546110ca9190614e41565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d86565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614e41565b9250508190555061131d878785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c9190614808565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612be3565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612be3565b925061152185612be3565b915061153c600d60009054906101000a9004600f0b83612cb2565b905061154781612d8b565b90506115538382612cb2565b905061155e81612d31565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e75565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117029190614808565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612e18565b5081600c60008282546118679190614e75565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b49190614808565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614ef5565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e75565b9250508190555061199d8482612f1f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb9190614808565b60405180910390a3611a0b612fe3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e75565b9050919050565b6000603c8242611ad09190614e41565b611ada9190614f86565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f86565b601154611b429190614e41565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b929190614808565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612be3565b600260009054906101000a9004600f0b6131a7565b9050611be381612d31565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614e41565b611c0f9190614f86565b9050919050565b6000806000806000611c2f611c2a87611a17565b612be3565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612cb2565b9250611c75611c6584612d31565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060088210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490615003565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061506f565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f659190614808565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c6144ca565b6120646144ca565b61206c6144ca565b600080600080600061207c611c80565b50612085613233565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612a1f565b94506001856121789190614e75565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614f15565b6121bd9190614f86565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612be3565b612cb2565b612d8b565b92506121fe6000846121f86110b8565b84612a33565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba876133c9565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea9190614808565b60405180910390a16001985050505050505050505b90565b6007805461230f90614d09565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614d09565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614e41565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516126709190614808565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d86565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f9190614808565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612be3565b9150612848600d60009054906101000a9004600f0b83612cb2565b935061285384612d8b565b935061286e600260009054906101000a9004600f0b85612cb2565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614f15565b6003546128c39190614e75565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f9190614772565b60405180910390a4829450505050505b919050565b600a5481565b612937600460ff166113ca565b1561294157600080fd5b601260009054906101000a900460ff161561295b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129b557600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000816129e19190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000612a0c9190614e75565b60118190555050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612a3b6144ca565b612a436144ca565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612b049190614e41565b612b0e9190614f86565b612b189190614e75565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b9d57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612bfa57600080fd5b6040829060020a029050919050565b60008082600f0b13612c1a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612c36846134e8565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c9f57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ca857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612d1e57506f7fffffffffffffffffffffffffffffff600f0b8113155b612d2757600080fd5b8091505092915050565b60008082600f0b1215612d4357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d738584612e18565b50612d7e8484612f1f565b5060019150509392505050565b60006840000000000000000082600f0b12612da557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612dd95760009050612e13565b612e106080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506136ae565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e745760009350505050612f19565b612e7d86611a17565b925084831015612ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb99061510a565b60405180910390fd5b8483612ece9190614e41565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f7b5760009350505050612fdd565b612f8486611a17565b92508483612f929190614e75565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612fed6144ca565b6000612ff76110b8565b90506000600160008054905061300d9190614e41565b8154811061301e5761301d61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130f99190614e41565b8154811061310a5761310961508f565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036131b857600080fd5b600082600f0b604085600f0b9060020a02816131d7576131d6614f57565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561322057506f7fffffffffffffffffffffffffffffff600f0b8113155b61322957600080fd5b8091505092915050565b61323b6144ca565b6132436144ca565b61324b6144ca565b600080600a54815481106132625761326161508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561336d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133919190615156565b6fffffffffffffffffffffffffffffffff1690506133ae83612a1f565b81116133bf578193505050506133c6565b8293505050505b90565b60008060006133d784611c97565b6133df6110b8565b6133e99190614e41565b9150600b546133f783611bb4565b6134019190614e41565b905061342f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612f1f565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516134a39190614808565b60405180910390a36001600a60008282546134be9190614e75565b9250508190555080600b60008282546134d79190614e75565b925050819055508192505050919050565b60008082600f0b136134f957600080fd5b60008083600f0b9050680100000000000000008112613534576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613562576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261358e576010819060008212600003808260020a82851804189250505090506010820191505b61010081126135b9576008819060008212600003808260020a82851804189250505090506008820191505b601081126135e3576004819060008212600003808260020a82851804189250505090506004820191505b6004811261360d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261361c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156136a1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613649565b5081945050505050919050565b60006840000000000000000082600f0b126136c857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136fc57600090506144c5565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561374a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137835760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137bc5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137f557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b131561382e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613867576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156138a057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156138d9576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561391157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156139495760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613981576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139b95760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139f1576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613a2957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a615760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a9957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613ad05760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613b07576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613b3e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b75576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613bac57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613be35760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613c1a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c515760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c87576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613cbd57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613cf35760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613d2957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d5f5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d95576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613dcb57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613e01576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613e3657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e6b5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613ea0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613ed55760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613f0a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613f3f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f745760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613fa957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613fdd5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614011576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561404557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614079576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156140ad57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140e15760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614115576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156141495760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561417c576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156141af57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141e25760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561421557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156142485760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561427b576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156142ae57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156142e1576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561431357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156143455760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614377576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143a95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156143db576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561440d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561443f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561447157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156144c057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61454a81614515565b811461455557600080fd5b50565b60008135905061456781614541565b92915050565b60006020828403121561458357614582614510565b5b600061459184828501614558565b91505092915050565b60008115159050919050565b6145af8161459a565b82525050565b60006020820190506145ca60008301846145a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460a5780820151818401526020810190506145ef565b60008484015250505050565b6000601f19601f8301169050919050565b6000614632826145d0565b61463c81856145db565b935061464c8185602086016145ec565b61465581614616565b840191505092915050565b6000602082019050818103600083015261467a8184614627565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ad82614682565b9050919050565b6146bd816146a2565b81146146c857600080fd5b50565b6000813590506146da816146b4565b92915050565b6000819050919050565b6146f3816146e0565b81146146fe57600080fd5b50565b600081359050614710816146ea565b92915050565b6000806040838503121561472d5761472c614510565b5b600061473b858286016146cb565b925050602061474c85828601614701565b9150509250929050565b600081600f0b9050919050565b61476c81614756565b82525050565b60006020820190506147876000830184614763565b92915050565b61479681614756565b81146147a157600080fd5b50565b6000813590506147b38161478d565b92915050565b600080604083850312156147d0576147cf614510565b5b60006147de85828601614701565b92505060206147ef858286016147a4565b9150509250929050565b614802816146e0565b82525050565b600060208201905061481d60008301846147f9565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61486082614616565b810181811067ffffffffffffffff8211171561487f5761487e614828565b5b80604052505050565b6000614892614506565b905061489e8282614857565b919050565b600063ffffffff82169050919050565b6148bc816148a3565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600068ffffffffffffffffff82169050919050565b6148fd816148df565b811461490857600080fd5b50565b60008135905061491a816148f4565b92915050565b600067ffffffffffffffff82169050919050565b61493d81614920565b811461494857600080fd5b50565b60008135905061495a81614934565b92915050565b60006060828403121561497657614975614823565b5b6149806060614888565b90506000614990848285016148ca565b60008301525060206149a48482850161490b565b60208301525060406149b88482850161494b565b60408301525092915050565b6000606082840312156149da576149d9614510565b5b60006149e884828501614960565b91505092915050565b600080600060608486031215614a0a57614a09614510565b5b6000614a18868287016146cb565b9350506020614a29868287016146cb565b9250506040614a3a86828701614701565b9150509250925092565b600060208284031215614a5a57614a59614510565b5b6000614a6884828501614701565b91505092915050565b600060208284031215614a8757614a86614510565b5b6000614a95848285016146cb565b91505092915050565b60008060408385031215614ab557614ab4614510565b5b6000614ac385828601614701565b9250506020614ad485828601614701565b9150509250929050565b614ae7816148a3565b82525050565b614af6816148df565b82525050565b614b0581614920565b82525050565b6000606082019050614b206000830186614ade565b614b2d6020830185614aed565b614b3a6040830184614afc565b949350505050565b600060ff82169050919050565b614b5881614b42565b82525050565b6000602082019050614b736000830184614b4f565b92915050565b614b82816146a2565b82525050565b6000602082019050614b9d6000830184614b79565b92915050565b60008060008060808587031215614bbd57614bbc614510565b5b6000614bcb87828801614701565b9450506020614bdc878288016147a4565b9350506040614bed87828801614701565b9250506060614bfe87828801614701565b91505092959194509250565b614c13816148a3565b82525050565b614c22816148df565b82525050565b614c3181614920565b82525050565b606082016000820151614c4d6000850182614c0a565b506020820151614c606020850182614c19565b506040820151614c736040850182614c28565b50505050565b6000606082019050614c8e6000830184614c37565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614cb981614c94565b82525050565b6000602082019050614cd46000830184614cb0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d2157607f821691505b602082108103614d3457614d33614cda565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d706007836145db565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614ddc600a836145db565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e4c826146e0565b9150614e57836146e0565b9250828203905081811115614e6f57614e6e614e12565b5b92915050565b6000614e80826146e0565b9150614e8b836146e0565b9250828201905080821115614ea357614ea2614e12565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614edf600a836145db565b9150614eea82614ea9565b602082019050919050565b60006020820190508181036000830152614f0e81614ed2565b9050919050565b6000614f20826146e0565b9150614f2b836146e0565b9250828202614f39816146e0565b91508282048414831517614f5057614f4f614e12565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826146e0565b9150614f9c836146e0565b925082614fac57614fab614f57565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614fed6011836145db565b9150614ff882614fb7565b602082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006150596012836145db565b915061506482615023565b602082019050919050565b600060208201905081810360008301526150888161504c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006150f4600d836145db565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b61513381614c94565b811461513e57600080fd5b50565b6000815190506151508161512a565b92915050565b60006020828403121561516c5761516b614510565b5b600061517a84828501615141565b9150509291505056fea2646970667358221220d6351777218bf30eca2e84cf0c363162805780e3cf9d358d670ec4d60f71974864736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b5060405162005f9b38038062005f9b833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002be3176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002c09176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516151b962000de260003960008181611a640152818161218a0152818161278c015281816129b70152612ab9015260008181611a90015281816129e301528181612ada0152612b1f01526151b96000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d7a52fa9116100bf578063e69571af11610099578063e69571af14610b49578063e809529514610b79578063eda4e6d614610b97578063f2fde38b14610bb55761037a565b8063d7a52fa914610adf578063d89135cd14610afb578063e54063a614610b195761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b6103996004803603810190610394919061456d565b610be5565b6040516103a691906145b5565b60405180910390f35b6103b7610d8b565b6040516103c49190614660565b60405180910390f35b6103e760048036038101906103e29190614716565b610e19565b6040516103f491906145b5565b60405180910390f35b610405611055565b6040516104129190614772565b60405180910390f35b610435600480360381019061043091906147b9565b611068565b6040516104429190614808565b60405180910390f35b6104536110b8565b6040516104609190614808565b60405180910390f35b6104716110cf565b60405161047e9190614808565b60405180910390f35b61048f6110d4565b60405161049c9190614808565b60405180910390f35b6104bf60048036038101906104ba91906149c4565b6110e0565b6040516104cc9190614808565b60405180910390f35b6104dd6110f9565b6040516104ea9190614772565b60405180910390f35b61050d600480360381019061050891906149c4565b61110c565b60405161051a91906145b5565b60405180910390f35b61053d600480360381019061053891906149f1565b611174565b60405161054a91906145b5565b60405180910390f35b61056d600480360381019061056891906149c4565b611392565b60405161057a9190614772565b60405180910390f35b61059d60048036038101906105989190614a44565b6113ca565b6040516105aa91906145b5565b60405180910390f35b6105cd60048036038101906105c89190614a71565b6113fd565b6040516105da91906145b5565b60405180910390f35b6105fd60048036038101906105f89190614a9e565b611507565b60405161060a9190614808565b60405180910390f35b61061b611573565b6040516106289190614808565b60405180910390f35b610639611579565b6040516106469190614808565b60405180910390f35b61066960048036038101906106649190614716565b61157f565b60405161067691906145b5565b60405180910390f35b61069960048036038101906106949190614a44565b611715565b6040516106a893929190614b0b565b60405180910390f35b6106cb60048036038101906106c69190614a44565b611784565b005b6106e760048036038101906106e29190614716565b6118c0565b6040516106f491906145b5565b60405180910390f35b61071760048036038101906107129190614a71565b611a17565b6040516107249190614808565b60405180910390f35b61074760048036038101906107429190614a44565b611a60565b6040516107549190614808565b60405180910390f35b61077760048036038101906107729190614a44565b611ac0565b6040516107849190614808565b60405180910390f35b610795611ae1565b6040516107a29190614808565b60405180910390f35b6107b3611ae7565b6040516107c09190614b5e565b60405180910390f35b6107e360048036038101906107de9190614a44565b611bb4565b6040516107f09190614808565b60405180910390f35b610813600480360381019061080e9190614a44565b611bf5565b6040516108209190614808565b60405180910390f35b610843600480360381019061083e9190614a71565b611c16565b6040516108509190614808565b60405180910390f35b610861611c80565b60405161086e9190614808565b60405180910390f35b61087f611c91565b60405161088c9190614808565b60405180910390f35b6108af60048036038101906108aa91906149c4565b611c97565b6040516108bc9190614808565b60405180910390f35b6108cd611cc5565b6040516108da9190614808565b60405180910390f35b6108eb611ccb565b6040516108f891906145b5565b60405180910390f35b610909611e72565b6040516109169190614b88565b60405180910390f35b61093960048036038101906109349190614a44565b611e98565b6040516109469190614808565b60405180910390f35b610957611f77565b6040516109649190614b88565b60405180910390f35b61098760048036038101906109829190614a71565b611f9d565b005b610991612052565b60405161099e91906145b5565b60405180910390f35b6109af612302565b6040516109bc9190614660565b60405180910390f35b6109df60048036038101906109da9190614a71565b612390565b6040516109ec91906145b5565b60405180910390f35b610a0f6004803603810190610a0a9190614716565b612464565b604051610a1c91906145b5565b60405180910390f35b610a3f6004803603810190610a3a9190614716565b612683565b604051610a4c91906145b5565b60405180910390f35b610a5d612784565b604051610a6a9190614808565b60405180910390f35b610a7b61278a565b604051610a889190614808565b60405180910390f35b610aab6004803603810190610aa69190614a44565b6127ae565b604051610ab89190614808565b60405180910390f35b610ac9612924565b604051610ad69190614808565b60405180910390f35b610af96004803603810190610af49190614a44565b61292a565b005b610b03612a15565b604051610b109190614808565b60405180910390f35b610b336004803603810190610b2e91906149c4565b612a1f565b604051610b409190614808565b60405180910390f35b610b636004803603810190610b5e9190614ba3565b612a33565b604051610b709190614c79565b60405180910390f35b610b81612ab3565b604051610b8e9190614cbf565b60405180910390f35b610b9f612b1d565b604051610bac9190614808565b60405180910390f35b610bcf6004803603810190610bca9190614a71565b612b41565b604051610bdc91906145b5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614d09565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614d09565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d86565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614df2565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110409190614808565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612be3565b61108a6110846001612be3565b86612c4b565b612cb2565b905061109a81612d31565b67ffffffffffffffff16846110af9190614e41565b91505092915050565b6000600c546009546110ca9190614e41565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d86565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614e41565b9250508190555061131d878785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c9190614808565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612be3565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612be3565b925061152185612be3565b915061153c600d60009054906101000a9004600f0b83612cb2565b905061154781612d8b565b90506115538382612cb2565b905061155e81612d31565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e75565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117029190614808565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612e18565b5081600c60008282546118679190614e75565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b49190614808565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614ef5565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e75565b9250508190555061199d8482612f1f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb9190614808565b60405180910390a3611a0b612fe3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e75565b9050919050565b6000603c8242611ad09190614e41565b611ada9190614f86565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f86565b601154611b429190614e41565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b929190614808565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612be3565b600260009054906101000a9004600f0b6131a7565b9050611be381612d31565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614e41565b611c0f9190614f86565b9050919050565b6000806000806000611c2f611c2a87611a17565b612be3565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612cb2565b9250611c75611c6584612d31565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490615003565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061506f565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f659190614808565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c6144ca565b6120646144ca565b61206c6144ca565b600080600080600061207c611c80565b50612085613233565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612a1f565b94506001856121789190614e75565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614f15565b6121bd9190614f86565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612be3565b612cb2565b612d8b565b92506121fe6000846121f86110b8565b84612a33565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba876133c9565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea9190614808565b60405180910390a16001985050505050505050505b90565b6007805461230f90614d09565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614d09565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614e41565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516126709190614808565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d86565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f9190614808565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612be3565b9150612848600d60009054906101000a9004600f0b83612cb2565b935061285384612d8b565b935061286e600260009054906101000a9004600f0b85612cb2565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614f15565b6003546128c39190614e75565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f9190614772565b60405180910390a4829450505050505b919050565b600a5481565b612937600460ff166113ca565b1561294157600080fd5b601260009054906101000a900460ff161561295b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129b557600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000816129e19190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000612a0c9190614e75565b60118190555050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612a3b6144ca565b612a436144ca565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612b049190614e41565b612b0e9190614f86565b612b189190614e75565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b9d57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612bfa57600080fd5b6040829060020a029050919050565b60008082600f0b13612c1a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612c36846134e8565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c9f57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ca857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612d1e57506f7fffffffffffffffffffffffffffffff600f0b8113155b612d2757600080fd5b8091505092915050565b60008082600f0b1215612d4357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d738584612e18565b50612d7e8484612f1f565b5060019150509392505050565b60006840000000000000000082600f0b12612da557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612dd95760009050612e13565b612e106080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506136ae565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e745760009350505050612f19565b612e7d86611a17565b925084831015612ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb99061510a565b60405180910390fd5b8483612ece9190614e41565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f7b5760009350505050612fdd565b612f8486611a17565b92508483612f929190614e75565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612fed6144ca565b6000612ff76110b8565b90506000600160008054905061300d9190614e41565b8154811061301e5761301d61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130f99190614e41565b8154811061310a5761310961508f565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036131b857600080fd5b600082600f0b604085600f0b9060020a02816131d7576131d6614f57565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561322057506f7fffffffffffffffffffffffffffffff600f0b8113155b61322957600080fd5b8091505092915050565b61323b6144ca565b6132436144ca565b61324b6144ca565b600080600a54815481106132625761326161508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561336d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133919190615156565b6fffffffffffffffffffffffffffffffff1690506133ae83612a1f565b81116133bf578193505050506133c6565b8293505050505b90565b60008060006133d784611c97565b6133df6110b8565b6133e99190614e41565b9150600b546133f783611bb4565b6134019190614e41565b905061342f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612f1f565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516134a39190614808565b60405180910390a36001600a60008282546134be9190614e75565b9250508190555080600b60008282546134d79190614e75565b925050819055508192505050919050565b60008082600f0b136134f957600080fd5b60008083600f0b9050680100000000000000008112613534576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613562576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261358e576010819060008212600003808260020a82851804189250505090506010820191505b61010081126135b9576008819060008212600003808260020a82851804189250505090506008820191505b601081126135e3576004819060008212600003808260020a82851804189250505090506004820191505b6004811261360d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261361c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156136a1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613649565b5081945050505050919050565b60006840000000000000000082600f0b126136c857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136fc57600090506144c5565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561374a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137835760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137bc5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137f557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b131561382e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613867576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156138a057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156138d9576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561391157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156139495760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613981576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139b95760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139f1576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613a2957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a615760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a9957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613ad05760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613b07576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613b3e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b75576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613bac57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613be35760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613c1a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c515760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c87576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613cbd57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613cf35760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613d2957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d5f5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d95576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613dcb57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613e01576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613e3657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e6b5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613ea0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613ed55760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613f0a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613f3f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f745760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613fa957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613fdd5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614011576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561404557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614079576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156140ad57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140e15760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614115576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156141495760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561417c576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156141af57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141e25760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561421557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156142485760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561427b576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156142ae57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156142e1576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561431357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156143455760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614377576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143a95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156143db576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561440d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561443f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561447157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156144c057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61454a81614515565b811461455557600080fd5b50565b60008135905061456781614541565b92915050565b60006020828403121561458357614582614510565b5b600061459184828501614558565b91505092915050565b60008115159050919050565b6145af8161459a565b82525050565b60006020820190506145ca60008301846145a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460a5780820151818401526020810190506145ef565b60008484015250505050565b6000601f19601f8301169050919050565b6000614632826145d0565b61463c81856145db565b935061464c8185602086016145ec565b61465581614616565b840191505092915050565b6000602082019050818103600083015261467a8184614627565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ad82614682565b9050919050565b6146bd816146a2565b81146146c857600080fd5b50565b6000813590506146da816146b4565b92915050565b6000819050919050565b6146f3816146e0565b81146146fe57600080fd5b50565b600081359050614710816146ea565b92915050565b6000806040838503121561472d5761472c614510565b5b600061473b858286016146cb565b925050602061474c85828601614701565b9150509250929050565b600081600f0b9050919050565b61476c81614756565b82525050565b60006020820190506147876000830184614763565b92915050565b61479681614756565b81146147a157600080fd5b50565b6000813590506147b38161478d565b92915050565b600080604083850312156147d0576147cf614510565b5b60006147de85828601614701565b92505060206147ef858286016147a4565b9150509250929050565b614802816146e0565b82525050565b600060208201905061481d60008301846147f9565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61486082614616565b810181811067ffffffffffffffff8211171561487f5761487e614828565b5b80604052505050565b6000614892614506565b905061489e8282614857565b919050565b600063ffffffff82169050919050565b6148bc816148a3565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600068ffffffffffffffffff82169050919050565b6148fd816148df565b811461490857600080fd5b50565b60008135905061491a816148f4565b92915050565b600067ffffffffffffffff82169050919050565b61493d81614920565b811461494857600080fd5b50565b60008135905061495a81614934565b92915050565b60006060828403121561497657614975614823565b5b6149806060614888565b90506000614990848285016148ca565b60008301525060206149a48482850161490b565b60208301525060406149b88482850161494b565b60408301525092915050565b6000606082840312156149da576149d9614510565b5b60006149e884828501614960565b91505092915050565b600080600060608486031215614a0a57614a09614510565b5b6000614a18868287016146cb565b9350506020614a29868287016146cb565b9250506040614a3a86828701614701565b9150509250925092565b600060208284031215614a5a57614a59614510565b5b6000614a6884828501614701565b91505092915050565b600060208284031215614a8757614a86614510565b5b6000614a95848285016146cb565b91505092915050565b60008060408385031215614ab557614ab4614510565b5b6000614ac385828601614701565b9250506020614ad485828601614701565b9150509250929050565b614ae7816148a3565b82525050565b614af6816148df565b82525050565b614b0581614920565b82525050565b6000606082019050614b206000830186614ade565b614b2d6020830185614aed565b614b3a6040830184614afc565b949350505050565b600060ff82169050919050565b614b5881614b42565b82525050565b6000602082019050614b736000830184614b4f565b92915050565b614b82816146a2565b82525050565b6000602082019050614b9d6000830184614b79565b92915050565b60008060008060808587031215614bbd57614bbc614510565b5b6000614bcb87828801614701565b9450506020614bdc878288016147a4565b9350506040614bed87828801614701565b9250506060614bfe87828801614701565b91505092959194509250565b614c13816148a3565b82525050565b614c22816148df565b82525050565b614c3181614920565b82525050565b606082016000820151614c4d6000850182614c0a565b506020820151614c606020850182614c19565b506040820151614c736040850182614c28565b50505050565b6000606082019050614c8e6000830184614c37565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614cb981614c94565b82525050565b6000602082019050614cd46000830184614cb0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d2157607f821691505b602082108103614d3457614d33614cda565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d706007836145db565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614ddc600a836145db565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e4c826146e0565b9150614e57836146e0565b9250828203905081811115614e6f57614e6e614e12565b5b92915050565b6000614e80826146e0565b9150614e8b836146e0565b9250828201905080821115614ea357614ea2614e12565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614edf600a836145db565b9150614eea82614ea9565b602082019050919050565b60006020820190508181036000830152614f0e81614ed2565b9050919050565b6000614f20826146e0565b9150614f2b836146e0565b9250828202614f39816146e0565b91508282048414831517614f5057614f4f614e12565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826146e0565b9150614f9c836146e0565b925082614fac57614fab614f57565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614fed6011836145db565b9150614ff882614fb7565b602082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006150596012836145db565b915061506482615023565b602082019050919050565b600060208201905081810360008301526150888161504c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006150f4600d836145db565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b61513381614c94565b811461513e57600080fd5b50565b6000815190506151508161512a565b92915050565b60006020828403121561516c5761516b614510565b5b600061517a84828501615141565b9150509291505056fea264697066735822122087aed072a9ac7b5463e9d57180f7adb16b585b4eb2bff3e9f6354a0fd8a5a12664736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/expiry.py b/python/erc20_demurrage_token/expiry.py index aa7c643..017825f 100644 --- a/python/erc20_demurrage_token/expiry.py +++ b/python/erc20_demurrage_token/expiry.py @@ -13,7 +13,7 @@ from chainlib.eth.constant import ZERO_ADDRESS class ExpiryContract(TxFactory): - def set_expires_period(self, contract_address, sender_address, expire_timestamp, tx_format=TxFormat.JSONRPC): + def set_expire_period(self, contract_address, sender_address, expire_timestamp, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('setExpirePeriod') enc.typ(ABIContractType.UINT256) diff --git a/python/erc20_demurrage_token/seal.py b/python/erc20_demurrage_token/seal.py index a318e38..5d912e3 100644 --- a/python/erc20_demurrage_token/seal.py +++ b/python/erc20_demurrage_token/seal.py @@ -1,15 +1,38 @@ +# standard imports +import enum + # external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.jsonrpc import JSONRPCRequest from chainlib.eth.tx import ( TxFactory, TxFormat, ) from chainlib.eth.contract import ( ABIContractEncoder, + ABIContractType, + abi_decode_single, ) +from hexathon import ( + add_0x, + ) + +class ContractState(enum.IntEnum): + MINTER_STATE = 1 + SINK_STATE = 2 + EXPIRY_STATE = 4 + CAP_STATE = 8 + +CONTRACT_SEAL_STATE_MAX = 0 + +for v in dir(ContractState): + if len(v) > 6 and v[-6:] == '_STATE': + CONTRACT_SEAL_STATE_MAX += getattr(ContractState, v).value + class SealedContract(TxFactory): - def set_state(self, contract_address, sender_address, seal, tx_format=TxFormat.JSONRPC): + def seal(self, contract_address, sender_address, seal, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('seal') enc.typ(ABIContractType.UINT256) @@ -19,3 +42,25 @@ class SealedContract(TxFactory): tx = self.set_code(tx, data) tx = self.finalize(tx, tx_format) return tx + + + def is_sealed(self, contract_address, v, sender_address=ZERO_ADDRESS, id_generator=None): + j = JSONRPCRequest(id_generator) + o = j.template() + o['method'] = 'eth_call' + enc = ABIContractEncoder() + enc.method('isSealed') + enc.typ(ABIContractType.UINT256) + enc.uint256(v) + data = add_0x(enc.get()) + tx = self.template(sender_address, contract_address) + tx = self.set_code(tx, data) + o['params'].append(self.normalize(tx)) + o['params'].append('latest') + o = j.finalize(o) + return o + + + @classmethod + def parse_is_sealed(self, v): + return abi_decode_single(ABIContractType.BOOLEAN, v) diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 12c70cf..56bbd03 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -430,6 +430,18 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return o + def set_sink_address(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('setSinkAddress') + enc.typ(ABIContractType.ADDRESS) + enc.address(address) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + def apply_demurrage(self, contract_address, sender_address, limit=0, tx_format=TxFormat.JSONRPC): if limit == 0: return self.transact_noarg('applyDemurrage', contract_address, sender_address) diff --git a/python/run_tests.sh b/python/run_tests.sh index 80affd3..b3cf54b 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -39,5 +39,8 @@ done # ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py #done +python tests/test_expiry.py +python tests/test_seal.py + set +e set +x diff --git a/python/tests/test_expiry.py b/python/tests/test_expiry.py index 4ebe6e1..27f2e67 100644 --- a/python/tests/test_expiry.py +++ b/python/tests/test_expiry.py @@ -37,7 +37,7 @@ class TestExpire(TestDemurrageDefault): (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[i+1], mint_amount) r = self.rpc.do(o) - (tx_hash, o) = c.set_expires_period(self.address, self.accounts[0], 2) + (tx_hash, o) = c.set_expire_period(self.address, self.accounts[0], 2) r = self.rpc.do(o) o = receipt(tx_hash) r = self.rpc.do(o) diff --git a/python/tests/test_seal.py b/python/tests/test_seal.py new file mode 100644 index 0000000..8100460 --- /dev/null +++ b/python/tests/test_seal.py @@ -0,0 +1,164 @@ +# standard imports +import os +import unittest +import json +import logging +import datetime + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import ( + block_latest, + block_by_number, + ) + +# local imports +from erc20_demurrage_token import DemurrageToken +from erc20_demurrage_token.seal import ContractState +from erc20_demurrage_token.seal import CONTRACT_SEAL_STATE_MAX + +# test imports +from erc20_demurrage_token.unittest import TestDemurrageDefault + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + + + +class TestSeal(TestDemurrageDefault): + + def test_seal_dup(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], 1) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], 1) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + + def test_seal_all(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], CONTRACT_SEAL_STATE_MAX) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.is_sealed(self.address, 0, sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertTrue(c.parse_is_sealed(r)) + + + def test_seal_minter(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.accounts[1]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], ContractState.MINTER_STATE) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.add_minter(self.address, self.accounts[0], self.accounts[2]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + o = c.is_sealed(self.address, ContractState.MINTER_STATE, sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertTrue(c.parse_is_sealed(r)) + + + def test_seal_expiry(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.set_expire_period(self.address, self.accounts[0], 10) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_expire_period(self.address, self.accounts[0], 20) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], ContractState.EXPIRY_STATE) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_expire_period(self.address, self.accounts[0], 21) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + o = c.is_sealed(self.address, ContractState.EXPIRY_STATE, sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertTrue(c.parse_is_sealed(r)) + + + def test_seal_set_sink_address(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.set_sink_address(self.address, self.accounts[0], self.accounts[3]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_sink_address(self.address, self.accounts[0], self.accounts[4]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], ContractState.SINK_STATE) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_sink_address(self.address, self.accounts[0], self.accounts[5]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + o = c.is_sealed(self.address, ContractState.SINK_STATE, sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertTrue(c.parse_is_sealed(r)) + + + + +if __name__ == '__main__': + unittest.main() + + diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 140e7f8..a97a759 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -155,7 +155,7 @@ contract DemurrageTokenSingleCap { } function seal(uint256 _state) public returns(uint256) { - require(_state < 8, 'ERR_INVALID_STATE'); + require(_state < 16, 'ERR_INVALID_STATE'); require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); sealState |= _state; emit SealStateChange(sealState); From e6eef4880876602e836f003598249513892ab7c3 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 15:58:31 +0000 Subject: [PATCH 31/57] Add supply cap --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 48 +++++++------------ python/erc20_demurrage_token/unittest/base.py | 14 +++--- python/run_tests.sh | 1 + python/tests/test_cap.py | 31 ++++++------ python/tests/test_seal.py | 31 ++++++++++++ solidity/DemurrageTokenSingleNocap.sol | 28 +++++++++-- 8 files changed, 96 insertions(+), 61 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index fcf5aba..24e6567 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b5060405162005f9b38038062005f9b833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002be3176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002c09176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a0516151b962000de260003960008181611a640152818161218a0152818161278c015281816129b70152612ab9015260008181611a90015281816129e301528181612ada0152612b1f01526151b96000f3fe608060405234801561001057600080fd5b506004361061037a576000357c0100000000000000000000000000000000000000000000000000000000900480636787a9be116101f0578063983b2d5611610121578063d7a52fa9116100bf578063e69571af11610099578063e69571af14610b49578063e809529514610b79578063eda4e6d614610b97578063f2fde38b14610bb55761037a565b8063d7a52fa914610adf578063d89135cd14610afb578063e54063a614610b195761037a565b8063b1cb0db3116100fb578063b1cb0db314610a55578063b470aade14610a73578063c0ab707714610a91578063d340ef8a14610ac15761037a565b8063983b2d56146109c5578063a457c2d7146109f5578063a9059cbb14610a255761037a565b806379ba50971161018e5780638da5cb5b116101685780638da5cb5b1461094f5780638f0b2d5d1461096d5780638f1df6bc1461098957806395d89b41146109a75761037a565b806379ba5097146108e357806384dde4af1461090157806386fe212d1461091f5761037a565b8063731f237c116101ca578063731f237c1461085957806373f42561146108775780637445e33a1461089557806374bedb95146108c55761037a565b80636787a9be146107c95780636a2d094e146107f957806370a08231146108295761037a565b80632c1758c1116102ca57806342966c68116102685780634abfbba2116102425780634abfbba21461072d57806351b4541c1461075d57806358b2833b1461078d5780635f408c04146107ab5761037a565b806342966c68146106b1578063449a52f8146106cd57806347a50517146106fd5761037a565b8063313ce567116102a4578063313ce5671461061357806331a5995d14610631578063395093511461064f57806340452d911461067f5761037a565b80632c1758c1146105835780633092afd5146105b357806331333487146105e35761037a565b806318cbbcfc11610337578063229ba19711610311578063229ba197146104d557806323a85944146104f357806323b872dd146105235780632a7aec09146105535761037a565b806318cbbcfc146104695780631989c6a814610487578063213d1e1e146104a55761037a565b806301ffc9a71461037f57806306fdde03146103af578063095ea7b3146103cd57806309f28f3c146103fd57806311c566151461041b57806318160ddd1461044b575b600080fd5b6103996004803603810190610394919061456d565b610be5565b6040516103a691906145b5565b60405180910390f35b6103b7610d8b565b6040516103c49190614660565b60405180910390f35b6103e760048036038101906103e29190614716565b610e19565b6040516103f491906145b5565b60405180910390f35b610405611055565b6040516104129190614772565b60405180910390f35b610435600480360381019061043091906147b9565b611068565b6040516104429190614808565b60405180910390f35b6104536110b8565b6040516104609190614808565b60405180910390f35b6104716110cf565b60405161047e9190614808565b60405180910390f35b61048f6110d4565b60405161049c9190614808565b60405180910390f35b6104bf60048036038101906104ba91906149c4565b6110e0565b6040516104cc9190614808565b60405180910390f35b6104dd6110f9565b6040516104ea9190614772565b60405180910390f35b61050d600480360381019061050891906149c4565b61110c565b60405161051a91906145b5565b60405180910390f35b61053d600480360381019061053891906149f1565b611174565b60405161054a91906145b5565b60405180910390f35b61056d600480360381019061056891906149c4565b611392565b60405161057a9190614772565b60405180910390f35b61059d60048036038101906105989190614a44565b6113ca565b6040516105aa91906145b5565b60405180910390f35b6105cd60048036038101906105c89190614a71565b6113fd565b6040516105da91906145b5565b60405180910390f35b6105fd60048036038101906105f89190614a9e565b611507565b60405161060a9190614808565b60405180910390f35b61061b611573565b6040516106289190614808565b60405180910390f35b610639611579565b6040516106469190614808565b60405180910390f35b61066960048036038101906106649190614716565b61157f565b60405161067691906145b5565b60405180910390f35b61069960048036038101906106949190614a44565b611715565b6040516106a893929190614b0b565b60405180910390f35b6106cb60048036038101906106c69190614a44565b611784565b005b6106e760048036038101906106e29190614716565b6118c0565b6040516106f491906145b5565b60405180910390f35b61071760048036038101906107129190614a71565b611a17565b6040516107249190614808565b60405180910390f35b61074760048036038101906107429190614a44565b611a60565b6040516107549190614808565b60405180910390f35b61077760048036038101906107729190614a44565b611ac0565b6040516107849190614808565b60405180910390f35b610795611ae1565b6040516107a29190614808565b60405180910390f35b6107b3611ae7565b6040516107c09190614b5e565b60405180910390f35b6107e360048036038101906107de9190614a44565b611bb4565b6040516107f09190614808565b60405180910390f35b610813600480360381019061080e9190614a44565b611bf5565b6040516108209190614808565b60405180910390f35b610843600480360381019061083e9190614a71565b611c16565b6040516108509190614808565b60405180910390f35b610861611c80565b60405161086e9190614808565b60405180910390f35b61087f611c91565b60405161088c9190614808565b60405180910390f35b6108af60048036038101906108aa91906149c4565b611c97565b6040516108bc9190614808565b60405180910390f35b6108cd611cc5565b6040516108da9190614808565b60405180910390f35b6108eb611ccb565b6040516108f891906145b5565b60405180910390f35b610909611e72565b6040516109169190614b88565b60405180910390f35b61093960048036038101906109349190614a44565b611e98565b6040516109469190614808565b60405180910390f35b610957611f77565b6040516109649190614b88565b60405180910390f35b61098760048036038101906109829190614a71565b611f9d565b005b610991612052565b60405161099e91906145b5565b60405180910390f35b6109af612302565b6040516109bc9190614660565b60405180910390f35b6109df60048036038101906109da9190614a71565b612390565b6040516109ec91906145b5565b60405180910390f35b610a0f6004803603810190610a0a9190614716565b612464565b604051610a1c91906145b5565b60405180910390f35b610a3f6004803603810190610a3a9190614716565b612683565b604051610a4c91906145b5565b60405180910390f35b610a5d612784565b604051610a6a9190614808565b60405180910390f35b610a7b61278a565b604051610a889190614808565b60405180910390f35b610aab6004803603810190610aa69190614a44565b6127ae565b604051610ab89190614808565b60405180910390f35b610ac9612924565b604051610ad69190614808565b60405180910390f35b610af96004803603810190610af49190614a44565b61292a565b005b610b03612a15565b604051610b109190614808565b60405180910390f35b610b336004803603810190610b2e91906149c4565b612a1f565b604051610b409190614808565b60405180910390f35b610b636004803603810190610b5e9190614ba3565b612a33565b604051610b709190614c79565b60405180910390f35b610b81612ab3565b604051610b8e9190614cbf565b60405180910390f35b610b9f612b1d565b604051610bac9190614808565b60405180910390f35b610bcf6004803603810190610bca9190614a71565b612b41565b604051610bdc91906145b5565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c395760019050610d86565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c8b5760019050610d86565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610cdd5760019050610d86565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d2f5760019050610d86565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d815760019050610d86565b600090505b919050565b60068054610d9890614d09565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc490614d09565b8015610e115780601f10610de657610100808354040283529160200191610e11565b820191906000526020600020905b815481529060010190602001808311610df457829003601f168201915b505050505081565b6000806000610e26611ae7565b905060028160ff1603610e3e5760009250505061104f565b60008160ff161115610e85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7c90614d86565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610f4e5760008414610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490614df2565b60405180910390fd5b5b610f56612052565b50610f6084611bb4565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110409190614808565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061108f61107785612be3565b61108a6110846001612be3565b86612c4b565b612cb2565b905061109a81612d31565b67ffffffffffffffff16846110af9190614e41565b91505092915050565b6000600c546009546110ca9190614e41565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff161115611129576000905061116f565b6000826020015168ffffffffffffffffff16111561114a576000905061116f565b6000826040015167ffffffffffffffff16111561116a576000905061116f565b600190505b919050565b600080600080611182611ae7565b905060028160ff160361119b576000935050505061138b565b60008160ff1611156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614d86565b60405180910390fd5b6111ea612052565b506111f485611bb4565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561127f57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461130b9190614e41565b9250508190555061131d878785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161137c9190614808565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036113c1576113be6001612be3565b90505b80915050919050565b6000600f82106113d957600080fd5b600082036113ee57600f6013541490506113f8565b8160135483161490505b919050565b600061140c600160ff166113ca565b1561141657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061149d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6114a657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061151686612be3565b925061152185612be3565b915061153c600d60009054906101000a9004600f0b83612cb2565b905061154781612d8b565b90506115538382612cb2565b905061155e81612d31565b67ffffffffffffffff16935050505092915050565b60085481565b60135481565b60008061158a612052565b5061159483611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116229190614e75565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117029190614808565b60405180910390a3600191505092915050565b6000818154811061172557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b600061178e611ae7565b60ff161461179b57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166117f157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561183d57600080fd5b600061184882611bb4565b90506118543382612e18565b5081600c60008282546118679190614e75565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118b49190614808565b60405180910390a25050565b60008060006118cd611ae7565b60ff16146118da57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90614ef5565b60405180910390fd5b61196e612052565b5061197883611bb4565b9050826009600082825461198c9190614e75565b9250508190555061199d8482612f1f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119fb9190614808565b60405180910390a3611a0b612fe3565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a8e9190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000611ab99190614e75565b9050919050565b6000603c8242611ad09190614e41565b611ada9190614f86565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b075760019050611bb1565b600060115403611b1a5760009050611bb1565b6011544210611bac57611b47603c600354611b359190614f86565b601154611b429190614e41565b6127ae565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611b929190614808565b60405180910390a1611ba2612052565b5060029050611bb1565b600090505b90565b600080611bd8611bc384612be3565b600260009054906101000a9004600f0b6131a7565b9050611be381612d31565b67ffffffffffffffff16915050919050565b6000603c8242611c059190614e41565b611c0f9190614f86565b9050919050565b6000806000806000611c2f611c2a87611a17565b612be3565b9350611c3c600354611ac0565b9150611c5784600260009054906101000a9004600f0b612cb2565b9250611c75611c6584612d31565b67ffffffffffffffff1683611507565b945050505050919050565b6000611c8c60006127ae565b905090565b600c5481565b6000806000611ca5846110e0565b9150611cb084611392565b9050611cbc8282611068565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d2857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210611edd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed490615003565b60405180910390fd5b6000601354831614611f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1b9061506f565b60405180910390fd5b816013600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc41601354604051611f659190614808565b60405180910390a16013549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611faa600260ff166113ca565b15611fb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461200e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061205c6144ca565b6120646144ca565b61206c6144ca565b600080600080600061207c611c80565b50612085613233565b97506120908861110c565b156120a6576000985050505050505050506122ff565b6000600a54815481106120bc576120bb61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061216988612a1f565b94506001856121789190614e75565b905061218386611392565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006121b39190614f15565b6121bd9190614f86565b91506121e86121e3600d60009054906101000a9004600f0b6121de85612be3565b612cb2565b612d8b565b92506121fe6000846121f86110b8565b84612a33565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506122ba876133c9565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516122ea9190614808565b60405180910390a16001985050505050505050505b90565b6007805461230f90614d09565b80601f016020809104026020016040519081016040528092919081815260200182805461233b90614d09565b80156123885780601f1061235d57610100808354040283529160200191612388565b820191906000526020600020905b81548152906001019060200180831161236b57829003601f168201915b505050505081565b600061239f600160ff166113ca565b156123a957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461240357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061247083611bb4565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156124fb57600080fd5b612503612052565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125909190614e41565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516126709190614808565b60405180910390a3600191505092915050565b600080600080612691611ae7565b905060028160ff16036126aa576000935050505061277e565b60008160ff1611156126f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e890614d86565b60405180910390fd5b6126f9612052565b5061270385611bb4565b9250612710338785612d66565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161276f9190614808565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff16156127d857600094505050505061291f565b6127e3600354611ac0565b9250600083036127fa57600094505050505061291f565b600260009054906101000a9004600f0b905060008611801561281b57508286105b15612824578592505b61282d83612be3565b9150612848600d60009054906101000a9004600f0b83612cb2565b935061285384612d8b565b935061286e600260009054906101000a9004600f0b85612cb2565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836128b69190614f15565b6003546128c39190614e75565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b60405161290f9190614772565b60405180910390a4829450505050505b919050565b600a5481565b612937600460ff166113ca565b1561294157600080fd5b601260009054906101000a900460ff161561295b57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129b557600080fd5b7f0000000000000000000000000000000000000000000000000000000000000000816129e19190614f15565b7f0000000000000000000000000000000000000000000000000000000000000000612a0c9190614e75565b60118190555050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612a3b6144ca565b612a436144ca565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612b049190614e41565b612b0e9190614f86565b612b189190614e75565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b9d57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612bfa57600080fd5b6040829060020a029050919050565b60008082600f0b13612c1a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612c36846134e8565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612c9f57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ca857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612d1e57506f7fffffffffffffffffffffffffffffff600f0b8113155b612d2757600080fd5b8091505092915050565b60008082600f0b1215612d4357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612d738584612e18565b50612d7e8484612f1f565b5060019150509392505050565b60006840000000000000000082600f0b12612da557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612dd95760009050612e13565b612e106080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506136ae565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612e745760009350505050612f19565b612e7d86611a17565b925084831015612ec2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb99061510a565b60405180910390fd5b8483612ece9190614e41565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612f7b5760009350505050612fdd565b612f8486611a17565b92508483612f929190614e75565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000612fed6144ca565b6000612ff76110b8565b90506000600160008054905061300d9190614e41565b8154811061301e5761301d61508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506130f99190614e41565b8154811061310a5761310961508f565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036131b857600080fd5b600082600f0b604085600f0b9060020a02816131d7576131d6614f57565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561322057506f7fffffffffffffffffffffffffffffff600f0b8113155b61322957600080fd5b8091505092915050565b61323b6144ca565b6132436144ca565b61324b6144ca565b600080600a54815481106132625761326161508f565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561336d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133919190615156565b6fffffffffffffffffffffffffffffffff1690506133ae83612a1f565b81116133bf578193505050506133c6565b8293505050505b90565b60008060006133d784611c97565b6133df6110b8565b6133e99190614e41565b9150600b546133f783611bb4565b6134019190614e41565b905061342f601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612f1f565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516134a39190614808565b60405180910390a36001600a60008282546134be9190614e75565b9250508190555080600b60008282546134d79190614e75565b925050819055508192505050919050565b60008082600f0b136134f957600080fd5b60008083600f0b9050680100000000000000008112613534576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613562576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261358e576010819060008212600003808260020a82851804189250505090506010820191505b61010081126135b9576008819060008212600003808260020a82851804189250505090506008820191505b601081126135e3576004819060008212600003808260020a82851804189250505090506004820191505b6004811261360d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261361c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156136a1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613649565b5081945050505050919050565b60006840000000000000000082600f0b126136c857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156136fc57600090506144c5565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561374a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156137835760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156137bc5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156137f557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b131561382e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613867576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b13156138a057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b13156138d9576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b131561391157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b13156139495760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613981576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b13156139b95760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b13156139f1576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613a2957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613a615760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613a9957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613ad05760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613b07576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613b3e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613b75576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613bac57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613be35760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613c1a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613c515760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613c87576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613cbd57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613cf35760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613d2957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613d5f5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613d95576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613dcb57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613e01576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613e3657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613e6b5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315613ea0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b1315613ed55760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315613f0a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b1315613f3f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b1315613f745760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b1315613fa957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b1315613fdd5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614011576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561404557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614079576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156140ad57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156140e15760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614115576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156141495760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561417c576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156141af57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156141e25760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561421557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156142485760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b131561427b576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156142ae57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156142e1576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561431357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156143455760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614377576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156143a95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156143db576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561440d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561443f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561447157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156144c057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61454a81614515565b811461455557600080fd5b50565b60008135905061456781614541565b92915050565b60006020828403121561458357614582614510565b5b600061459184828501614558565b91505092915050565b60008115159050919050565b6145af8161459a565b82525050565b60006020820190506145ca60008301846145a6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561460a5780820151818401526020810190506145ef565b60008484015250505050565b6000601f19601f8301169050919050565b6000614632826145d0565b61463c81856145db565b935061464c8185602086016145ec565b61465581614616565b840191505092915050565b6000602082019050818103600083015261467a8184614627565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006146ad82614682565b9050919050565b6146bd816146a2565b81146146c857600080fd5b50565b6000813590506146da816146b4565b92915050565b6000819050919050565b6146f3816146e0565b81146146fe57600080fd5b50565b600081359050614710816146ea565b92915050565b6000806040838503121561472d5761472c614510565b5b600061473b858286016146cb565b925050602061474c85828601614701565b9150509250929050565b600081600f0b9050919050565b61476c81614756565b82525050565b60006020820190506147876000830184614763565b92915050565b61479681614756565b81146147a157600080fd5b50565b6000813590506147b38161478d565b92915050565b600080604083850312156147d0576147cf614510565b5b60006147de85828601614701565b92505060206147ef858286016147a4565b9150509250929050565b614802816146e0565b82525050565b600060208201905061481d60008301846147f9565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61486082614616565b810181811067ffffffffffffffff8211171561487f5761487e614828565b5b80604052505050565b6000614892614506565b905061489e8282614857565b919050565b600063ffffffff82169050919050565b6148bc816148a3565b81146148c757600080fd5b50565b6000813590506148d9816148b3565b92915050565b600068ffffffffffffffffff82169050919050565b6148fd816148df565b811461490857600080fd5b50565b60008135905061491a816148f4565b92915050565b600067ffffffffffffffff82169050919050565b61493d81614920565b811461494857600080fd5b50565b60008135905061495a81614934565b92915050565b60006060828403121561497657614975614823565b5b6149806060614888565b90506000614990848285016148ca565b60008301525060206149a48482850161490b565b60208301525060406149b88482850161494b565b60408301525092915050565b6000606082840312156149da576149d9614510565b5b60006149e884828501614960565b91505092915050565b600080600060608486031215614a0a57614a09614510565b5b6000614a18868287016146cb565b9350506020614a29868287016146cb565b9250506040614a3a86828701614701565b9150509250925092565b600060208284031215614a5a57614a59614510565b5b6000614a6884828501614701565b91505092915050565b600060208284031215614a8757614a86614510565b5b6000614a95848285016146cb565b91505092915050565b60008060408385031215614ab557614ab4614510565b5b6000614ac385828601614701565b9250506020614ad485828601614701565b9150509250929050565b614ae7816148a3565b82525050565b614af6816148df565b82525050565b614b0581614920565b82525050565b6000606082019050614b206000830186614ade565b614b2d6020830185614aed565b614b3a6040830184614afc565b949350505050565b600060ff82169050919050565b614b5881614b42565b82525050565b6000602082019050614b736000830184614b4f565b92915050565b614b82816146a2565b82525050565b6000602082019050614b9d6000830184614b79565b92915050565b60008060008060808587031215614bbd57614bbc614510565b5b6000614bcb87828801614701565b9450506020614bdc878288016147a4565b9350506040614bed87828801614701565b9250506060614bfe87828801614701565b91505092959194509250565b614c13816148a3565b82525050565b614c22816148df565b82525050565b614c3181614920565b82525050565b606082016000820151614c4d6000850182614c0a565b506020820151614c606020850182614c19565b506040820151614c736040850182614c28565b50505050565b6000606082019050614c8e6000830184614c37565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614cb981614c94565b82525050565b6000602082019050614cd46000830184614cb0565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614d2157607f821691505b602082108103614d3457614d33614cda565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614d706007836145db565b9150614d7b82614d3a565b602082019050919050565b60006020820190508181036000830152614d9f81614d63565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614ddc600a836145db565b9150614de782614da6565b602082019050919050565b60006020820190508181036000830152614e0b81614dcf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614e4c826146e0565b9150614e57836146e0565b9250828203905081811115614e6f57614e6e614e12565b5b92915050565b6000614e80826146e0565b9150614e8b836146e0565b9250828201905080821115614ea357614ea2614e12565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000614edf600a836145db565b9150614eea82614ea9565b602082019050919050565b60006020820190508181036000830152614f0e81614ed2565b9050919050565b6000614f20826146e0565b9150614f2b836146e0565b9250828202614f39816146e0565b91508282048414831517614f5057614f4f614e12565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f91826146e0565b9150614f9c836146e0565b925082614fac57614fab614f57565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000614fed6011836145db565b9150614ff882614fb7565b602082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006150596012836145db565b915061506482615023565b602082019050919050565b600060208201905081810360008301526150888161504c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006150f4600d836145db565b91506150ff826150be565b602082019050919050565b60006020820190508181036000830152615123816150e7565b9050919050565b61513381614c94565b811461513e57600080fd5b50565b6000815190506151508161512a565b92915050565b60006020828403121561516c5761516b614510565b5b600061517a84828501615141565b9150509291505056fea264697066735822122087aed072a9ac7b5463e9d57180f7adb16b585b4eb2bff3e9f6354a0fd8a5a12664736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b506040516200610038038062006100833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002d48176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002d6e176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161531e62000de260003960008181611aec015281816122d5015281816128d701528181612b0a0152612c1e015260008181611b1801528181612b3601528181612c3f0152612c84015261531e6000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063983b2d561161012c578063d5abeb01116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d5abeb0114610b21578063d7a52fa914610b3f578063d89135cd14610b5b578063e54063a614610b79576103a0565b8063b1cb0db311610106578063b1cb0db314610a97578063b470aade14610ab5578063c0ab707714610ad3578063d340ef8a14610b03576103a0565b8063983b2d5614610a07578063a457c2d714610a37578063a9059cbb14610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b80633092afd5116102d5578063449a52f81161027357806351b4541c1161024d57806351b4541c1461078357806358b2833b146107b35780635f408c04146107d15780636787a9be146107ef576103a0565b8063449a52f8146106f357806347a50517146107235780634abfbba214610753576103a0565b806331a5995d116102af57806331a5995d14610657578063395093511461067557806340452d91146106a557806342966c68146106d7576103a0565b80633092afd5146105d95780633133348714610609578063313ce56714610639576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba91906146d2565b610c45565b6040516103cc919061471a565b60405180910390f35b6103dd610deb565b6040516103ea91906147c5565b60405180910390f35b61040d6004803603810190610408919061487b565b610e79565b60405161041a919061471a565b60405180910390f35b61042b6110b5565b60405161043891906148d7565b60405180910390f35b61045b6004803603810190610456919061491e565b6110c8565b604051610468919061496d565b60405180910390f35b610479611118565b604051610486919061496d565b60405180910390f35b61049761112f565b6040516104a4919061496d565b60405180910390f35b6104b5611134565b6040516104c2919061496d565b60405180910390f35b6104e560048036038101906104e09190614b29565b611140565b6040516104f2919061496d565b60405180910390f35b610503611159565b60405161051091906148d7565b60405180910390f35b610533600480360381019061052e9190614b29565b61116c565b604051610540919061471a565b60405180910390f35b610563600480360381019061055e9190614b56565b6111d4565b604051610570919061471a565b60405180910390f35b610593600480360381019061058e9190614b29565b6113f2565b6040516105a091906148d7565b60405180910390f35b6105c360048036038101906105be9190614ba9565b61142a565b6040516105d0919061471a565b60405180910390f35b6105f360048036038101906105ee9190614bd6565b61145d565b604051610600919061471a565b60405180910390f35b610623600480360381019061061e9190614c03565b611567565b604051610630919061496d565b60405180910390f35b6106416115d3565b60405161064e919061496d565b60405180910390f35b61065f6115d9565b60405161066c919061496d565b60405180910390f35b61068f600480360381019061068a919061487b565b6115df565b60405161069c919061471a565b60405180910390f35b6106bf60048036038101906106ba9190614ba9565b611775565b6040516106ce93929190614c70565b60405180910390f35b6106f160048036038101906106ec9190614ba9565b6117e4565b005b61070d6004803603810190610708919061487b565b611920565b60405161071a919061471a565b60405180910390f35b61073d60048036038101906107389190614bd6565b611a9f565b60405161074a919061496d565b60405180910390f35b61076d60048036038101906107689190614ba9565b611ae8565b60405161077a919061496d565b60405180910390f35b61079d60048036038101906107989190614ba9565b611b48565b6040516107aa919061496d565b60405180910390f35b6107bb611b69565b6040516107c8919061496d565b60405180910390f35b6107d9611b6f565b6040516107e69190614cc3565b60405180910390f35b61080960048036038101906108049190614ba9565b611c3c565b604051610816919061496d565b60405180910390f35b61083960048036038101906108349190614ba9565b611c7d565b604051610846919061496d565b60405180910390f35b61086960048036038101906108649190614ba9565b611c9e565b005b61088560048036038101906108809190614bd6565b611d61565b604051610892919061496d565b60405180910390f35b6108a3611dcb565b6040516108b0919061496d565b60405180910390f35b6108c1611ddc565b6040516108ce919061496d565b60405180910390f35b6108f160048036038101906108ec9190614b29565b611de2565b6040516108fe919061496d565b60405180910390f35b61090f611e10565b60405161091c919061496d565b60405180910390f35b61092d611e16565b60405161093a919061471a565b60405180910390f35b61094b611fbd565b6040516109589190614ced565b60405180910390f35b61097b60048036038101906109769190614ba9565b611fe3565b604051610988919061496d565b60405180910390f35b6109996120c2565b6040516109a69190614ced565b60405180910390f35b6109c960048036038101906109c49190614bd6565b6120e8565b005b6109d361219d565b6040516109e0919061471a565b60405180910390f35b6109f161244d565b6040516109fe91906147c5565b60405180910390f35b610a216004803603810190610a1c9190614bd6565b6124db565b604051610a2e919061471a565b60405180910390f35b610a516004803603810190610a4c919061487b565b6125af565b604051610a5e919061471a565b60405180910390f35b610a816004803603810190610a7c919061487b565b6127ce565b604051610a8e919061471a565b60405180910390f35b610a9f6128cf565b604051610aac919061496d565b60405180910390f35b610abd6128d5565b604051610aca919061496d565b60405180910390f35b610aed6004803603810190610ae89190614ba9565b6128f9565b604051610afa919061496d565b60405180910390f35b610b0b612a6f565b604051610b18919061496d565b60405180910390f35b610b29612a75565b604051610b36919061496d565b60405180910390f35b610b596004803603810190610b549190614ba9565b612a7b565b005b610b63612b7a565b604051610b70919061496d565b60405180910390f35b610b936004803603810190610b8e9190614b29565b612b84565b604051610ba0919061496d565b60405180910390f35b610bc36004803603810190610bbe9190614d08565b612b98565b604051610bd09190614dde565b60405180910390f35b610be1612c18565b604051610bee9190614e24565b60405180910390f35b610bff612c82565b604051610c0c919061496d565b60405180910390f35b610c2f6004803603810190610c2a9190614bd6565b612ca6565b604051610c3c919061471a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614e6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614e6e565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611b6f565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614eeb565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614f57565b60405180910390fd5b5b610fb661219d565b50610fc084611c3c565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a0919061496d565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612d48565b6110ea6110e46001612d48565b86612db0565b612e17565b90506110fa81612e96565b67ffffffffffffffff168461110f9190614fa6565b91505092915050565b6000600c5460095461112a9190614fa6565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff16111561118957600090506111cf565b6000826020015168ffffffffffffffffff1611156111aa57600090506111cf565b6000826040015167ffffffffffffffff1611156111ca57600090506111cf565b600190505b919050565b6000806000806111e2611b6f565b905060028160ff16036111fb57600093505050506113eb565b60008160ff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614eeb565b60405180910390fd5b61124a61219d565b5061125485611c3c565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112df57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136b9190614fa6565b9250508190555061137d878785612ecb565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113dc919061496d565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114215761141e6001612d48565b90505b80915050919050565b6000600f821061143957600080fd5b6000820361144e57600f601454149050611458565b8160145483161490505b919050565b600061146c600160ff1661142a565b1561147657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114fd57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61150657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061157686612d48565b925061158185612d48565b915061159c600d60009054906101000a9004600f0b83612e17565b90506115a781612ef0565b90506115b38382612e17565b90506115be81612e96565b67ffffffffffffffff16935050505092915050565b60085481565b60145481565b6000806115ea61219d565b506115f483611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116829190614fda565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611762919061496d565b60405180910390a3600191505092915050565b6000818154811061178557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117ee611b6f565b60ff16146117fb57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561189d57600080fd5b60006118a882611c3c565b90506118b43382612f7d565b5081600c60008282546118c79190614fda565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051611914919061496d565b60405180910390a25050565b600080600061192d611b6f565b60ff161461193a57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061505a565b60405180910390fd5b6119ce61219d565b50600060135411156119f757601354836009546119eb9190614fda565b11156119f657600080fd5b5b8260096000828254611a099190614fda565b92505081905550611a1983611c3c565b9050611a258482613084565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a83919061496d565b60405180910390a3611a93613148565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b16919061507a565b7f0000000000000000000000000000000000000000000000000000000000000000611b419190614fda565b9050919050565b6000603c8242611b589190614fa6565b611b6291906150eb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b8f5760019050611c39565b600060115403611ba25760009050611c39565b6011544210611c3457611bcf603c600354611bbd91906150eb565b601154611bca9190614fa6565b6128f9565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c1a919061496d565b60405180910390a1611c2a61219d565b5060029050611c39565b600090505b90565b600080611c60611c4b84612d48565b600260009054906101000a9004600f0b61330c565b9050611c6b81612e96565b67ffffffffffffffff16915050919050565b6000603c8242611c8d9190614fa6565b611c9791906150eb565b9050919050565b611cab600860ff1661142a565b15611cb557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f57600080fd5b6009548111611d1d57600080fd5b6013547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d4f919061496d565b60405180910390a28060138190555050565b6000806000806000611d7a611d7587611a9f565b612d48565b9350611d87600354611b48565b9150611da284600260009054906101000a9004600f0b612e17565b9250611dc0611db084612e96565b67ffffffffffffffff1683611567565b945050505050919050565b6000611dd760006128f9565b905090565b600c5481565b6000806000611df084611140565b9150611dfb846113f2565b9050611e0782826110c8565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90615168565b60405180910390fd5b600060145483161461206f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612066906151d4565b60405180910390fd5b816014600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416014546040516120b0919061496d565b60405180910390a16014549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120f5600260ff1661142a565b156120ff57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215957600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121a761462f565b6121af61462f565b6121b761462f565b60008060008060006121c7611dcb565b506121d0613398565b97506121db8861116c565b156121f15760009850505050505050505061244a565b6000600a5481548110612207576122066151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122b488612b84565b94506001856122c39190614fda565b90506122ce866113f2565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006122fe919061507a565b61230891906150eb565b915061233361232e600d60009054906101000a9004600f0b61232985612d48565b612e17565b612ef0565b9250612349600084612343611118565b84612b98565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124058761352e565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051612435919061496d565b60405180910390a16001985050505050505050505b90565b6007805461245a90614e6e565b80601f016020809104026020016040519081016040528092919081815260200182805461248690614e6e565b80156124d35780601f106124a8576101008083540402835291602001916124d3565b820191906000526020600020905b8154815290600101906020018083116124b657829003601f168201915b505050505081565b60006124ea600160ff1661142a565b156124f457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461254e57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806125bb83611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561264657600080fd5b61264e61219d565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126db9190614fa6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516127bb919061496d565b60405180910390a3600191505092915050565b6000806000806127dc611b6f565b905060028160ff16036127f557600093505050506128c9565b60008160ff16111561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614eeb565b60405180910390fd5b61284461219d565b5061284e85611c3c565b925061285b338785612ecb565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516128ba919061496d565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff1615612923576000945050505050612a6a565b61292e600354611b48565b925060008303612945576000945050505050612a6a565b600260009054906101000a9004600f0b905060008611801561296657508286105b1561296f578592505b61297883612d48565b9150612993600d60009054906101000a9004600f0b83612e17565b935061299e84612ef0565b93506129b9600260009054906101000a9004600f0b85612e17565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612a01919061507a565b600354612a0e9190614fda565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a5a91906148d7565b60405180910390a4829450505050505b919050565b600a5481565b60135481565b6000612a8a600460ff1661142a565b15612a9457600080fd5b601260009054906101000a900460ff1615612aae57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b0857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b34919061507a565b7f0000000000000000000000000000000000000000000000000000000000000000612b5f9190614fda565b90506011548111612b6f57600080fd5b806011819055505050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612ba061462f565b612ba861462f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612c699190614fa6565b612c7391906150eb565b612c7d9190614fda565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0257600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612d5f57600080fd5b6040829060020a029050919050565b60008082600f0b13612d7f57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612d9b8461364d565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e0457506f7fffffffffffffffffffffffffffffff600f0b8113155b612e0d57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e8357506f7fffffffffffffffffffffffffffffff600f0b8113155b612e8c57600080fd5b8091505092915050565b60008082600f0b1215612ea857600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612ed88584612f7d565b50612ee38484613084565b5060019150509392505050565b60006840000000000000000082600f0b12612f0a57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612f3e5760009050612f78565b612f756080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613813565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612fd9576000935050505061307e565b612fe286611a9f565b925084831015613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e9061526f565b60405180910390fd5b84836130339190614fa6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130e05760009350505050613142565b6130e986611a9f565b925084836130f79190614fda565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061315261462f565b600061315c611118565b9050600060016000805490506131729190614fa6565b81548110613183576131826151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061325e9190614fa6565b8154811061326f5761326e6151f4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361331d57600080fd5b600082600f0b604085600f0b9060020a028161333c5761333b6150bc565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561338557506f7fffffffffffffffffffffffffffffff600f0b8113155b61338e57600080fd5b8091505092915050565b6133a061462f565b6133a861462f565b6133b061462f565b600080600a54815481106133c7576133c66151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156134d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f691906152bb565b6fffffffffffffffffffffffffffffffff16905061351383612b84565b81116135245781935050505061352b565b8293505050505b90565b600080600061353c84611de2565b613544611118565b61354e9190614fa6565b9150600b5461355c83611c3c565b6135669190614fa6565b9050613594601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613084565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613608919061496d565b60405180910390a36001600a60008282546136239190614fda565b9250508190555080600b600082825461363c9190614fda565b925050819055508192505050919050565b60008082600f0b1361365e57600080fd5b60008083600f0b9050680100000000000000008112613699576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126136c7576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126136f3576010819060008212600003808260020a82851804189250505090506010820191505b610100811261371e576008819060008212600003808260020a82851804189250505090506008820191505b60108112613748576004819060008212600003808260020a82851804189250505090506004820191505b60048112613772576002819060008212600003808260020a82851804189250505090506002820191505b60028112613781576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613806578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506137ae565b5081945050505050919050565b60006840000000000000000082600f0b1261382d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613861576000905061462a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156138af57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156138e85760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139215760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561395a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139935760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156139cc576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a0557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613a3e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613a7657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613aae5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613ae6576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b1e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613b56576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613b8e57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613bc65760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613bfe57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c355760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613c6c576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ca357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613cda576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d1157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613d485760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613d7f576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613db65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613dec576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e2257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613e585760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613e8e57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613ec45760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613efa576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f3057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613f66576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613f9b57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613fd05760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614005576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561403a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561406f576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156140a457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156140d95760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561410e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141425760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614176576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156141aa57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156141de576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561421257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156142465760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561427a576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156142ae5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156142e1576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561431457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156143475760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561437a57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156143ad5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156143e0576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561441357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614446576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561447857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156144aa5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156144dc576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561450e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614540576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561457257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156145a45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156145d657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561462557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146af8161467a565b81146146ba57600080fd5b50565b6000813590506146cc816146a6565b92915050565b6000602082840312156146e8576146e7614675565b5b60006146f6848285016146bd565b91505092915050565b60008115159050919050565b614714816146ff565b82525050565b600060208201905061472f600083018461470b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561476f578082015181840152602081019050614754565b60008484015250505050565b6000601f19601f8301169050919050565b600061479782614735565b6147a18185614740565b93506147b1818560208601614751565b6147ba8161477b565b840191505092915050565b600060208201905081810360008301526147df818461478c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614812826147e7565b9050919050565b61482281614807565b811461482d57600080fd5b50565b60008135905061483f81614819565b92915050565b6000819050919050565b61485881614845565b811461486357600080fd5b50565b6000813590506148758161484f565b92915050565b6000806040838503121561489257614891614675565b5b60006148a085828601614830565b92505060206148b185828601614866565b9150509250929050565b600081600f0b9050919050565b6148d1816148bb565b82525050565b60006020820190506148ec60008301846148c8565b92915050565b6148fb816148bb565b811461490657600080fd5b50565b600081359050614918816148f2565b92915050565b6000806040838503121561493557614934614675565b5b600061494385828601614866565b925050602061495485828601614909565b9150509250929050565b61496781614845565b82525050565b6000602082019050614982600083018461495e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6149c58261477b565b810181811067ffffffffffffffff821117156149e4576149e361498d565b5b80604052505050565b60006149f761466b565b9050614a0382826149bc565b919050565b600063ffffffff82169050919050565b614a2181614a08565b8114614a2c57600080fd5b50565b600081359050614a3e81614a18565b92915050565b600068ffffffffffffffffff82169050919050565b614a6281614a44565b8114614a6d57600080fd5b50565b600081359050614a7f81614a59565b92915050565b600067ffffffffffffffff82169050919050565b614aa281614a85565b8114614aad57600080fd5b50565b600081359050614abf81614a99565b92915050565b600060608284031215614adb57614ada614988565b5b614ae560606149ed565b90506000614af584828501614a2f565b6000830152506020614b0984828501614a70565b6020830152506040614b1d84828501614ab0565b60408301525092915050565b600060608284031215614b3f57614b3e614675565b5b6000614b4d84828501614ac5565b91505092915050565b600080600060608486031215614b6f57614b6e614675565b5b6000614b7d86828701614830565b9350506020614b8e86828701614830565b9250506040614b9f86828701614866565b9150509250925092565b600060208284031215614bbf57614bbe614675565b5b6000614bcd84828501614866565b91505092915050565b600060208284031215614bec57614beb614675565b5b6000614bfa84828501614830565b91505092915050565b60008060408385031215614c1a57614c19614675565b5b6000614c2885828601614866565b9250506020614c3985828601614866565b9150509250929050565b614c4c81614a08565b82525050565b614c5b81614a44565b82525050565b614c6a81614a85565b82525050565b6000606082019050614c856000830186614c43565b614c926020830185614c52565b614c9f6040830184614c61565b949350505050565b600060ff82169050919050565b614cbd81614ca7565b82525050565b6000602082019050614cd86000830184614cb4565b92915050565b614ce781614807565b82525050565b6000602082019050614d026000830184614cde565b92915050565b60008060008060808587031215614d2257614d21614675565b5b6000614d3087828801614866565b9450506020614d4187828801614909565b9350506040614d5287828801614866565b9250506060614d6387828801614866565b91505092959194509250565b614d7881614a08565b82525050565b614d8781614a44565b82525050565b614d9681614a85565b82525050565b606082016000820151614db26000850182614d6f565b506020820151614dc56020850182614d7e565b506040820151614dd86040850182614d8d565b50505050565b6000606082019050614df36000830184614d9c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e1e81614df9565b82525050565b6000602082019050614e396000830184614e15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e8657607f821691505b602082108103614e9957614e98614e3f565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614ed5600783614740565b9150614ee082614e9f565b602082019050919050565b60006020820190508181036000830152614f0481614ec8565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614f41600a83614740565b9150614f4c82614f0b565b602082019050919050565b60006020820190508181036000830152614f7081614f34565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fb182614845565b9150614fbc83614845565b9250828203905081811115614fd457614fd3614f77565b5b92915050565b6000614fe582614845565b9150614ff083614845565b925082820190508082111561500857615007614f77565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615044600a83614740565b915061504f8261500e565b602082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b600061508582614845565b915061509083614845565b925082820261509e81614845565b915082820484148315176150b5576150b4614f77565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150f682614845565b915061510183614845565b925082615111576151106150bc565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615152601183614740565b915061515d8261511c565b602082019050919050565b6000602082019050818103600083015261518181615145565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006151be601283614740565b91506151c982615188565b602082019050919050565b600060208201905081810360008301526151ed816151b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615259600d83614740565b915061526482615223565b602082019050919050565b600060208201905081810360008301526152888161524c565b9050919050565b61529881614df9565b81146152a357600080fd5b50565b6000815190506152b58161528f565b92915050565b6000602082840312156152d1576152d0614675565b5b60006152df848285016152a6565b9150509291505056fea2646970667358221220d5408287c06e54da7f8dc7cae17f7195a3e73269d5dd5fa683fc25dee0cafca364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 27040b2..1028b4f 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 56bbd03..2cc80fc 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -77,16 +77,8 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): __abi = {} __bytecode = {} - valid_modes = [ - 'MultiNocap', - 'SingleNocap', - 'MultiCap', - 'SingleCap', - ] - def constructor(self, sender_address, settings, cap=0, tx_format=TxFormat.JSONRPC): - if int(cap) < 0: - raise ValueError('cap must be 0 or positive integer') + def constructor(self, sender_address, settings, tx_format=TxFormat.JSONRPC): code = DemurrageToken.bytecode() enc = ABIContractEncoder() enc.string(settings.name) @@ -95,8 +87,6 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): enc.uint256(settings.demurrage_level) enc.uint256(settings.period_minutes) enc.address(settings.sink_address) - if cap > 0: - enc.uint256(cap) code += enc.get() tx = self.template(sender_address, None, use_nonce=True) tx = self.set_code(tx, code) @@ -109,23 +99,7 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): @staticmethod - def __to_contract_name(multi, cap): - name = 'DemurrageToken' - if multi: - name += 'Multi' - else: - name += 'Single' - if cap: - name += 'Cap' - else: - name += 'Nocap' - logg.debug('bytecode name {}'.format(name)) - return name - - - @staticmethod - def abi(multi=True, cap=False): - #name = DemurrageToken.__to_contract_name(multi, cap) + def abi(multi=True): name = 'DemurrageTokenSingleNocap' if DemurrageToken.__abi.get(name) == None: f = open(os.path.join(data_dir, name + '.json'), 'r') @@ -135,8 +109,7 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): @staticmethod - def bytecode(multi=True, cap=False): - #name = DemurrageToken.__to_contract_name(multi, cap) + def bytecode(multi=True): name = 'DemurrageTokenSingleNocap' if DemurrageToken.__bytecode.get(name) == None: f = open(os.path.join(data_dir, name + '.bin'), 'r') @@ -185,6 +158,17 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return tx + def set_max_supply(self, contract_address, sender_address, cap, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('setMaxSupply') + enc.typ(ABIContractType.UINT256) + enc.uint256(cap) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + def remove_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() enc.method('removeMinter') @@ -503,8 +487,8 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return self.call_noarg('demurrageTimestamp', contract_address, sender_address=sender_address) - def supply_cap(self, contract_address, sender_address=ZERO_ADDRESS): - return self.call_noarg('supplyCap', contract_address, sender_address=sender_address) + def max_supply(self, contract_address, sender_address=ZERO_ADDRESS): + return self.call_noarg('maxSupply', contract_address, sender_address=sender_address) # def grow_by(self, contract_address, value, period, sender_address=ZERO_ADDRESS, id_generator=None): diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index 4e54765..8de0670 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -34,7 +34,7 @@ PERIOD = 43200 class TestTokenDeploy: """tax level is ppm, 1000000 = 100%""" - def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, supply=10**12, tax_level=TAX_LEVEL, period=PERIOD): + def __init__(self, rpc, token_symbol='FOO', token_name='Foo Token', sink_address=ZERO_ADDRESS, tax_level=TAX_LEVEL, period=PERIOD): self.tax_level = tax_level self.period_seconds = period * 60 @@ -60,14 +60,11 @@ class TestTokenDeploy: except TypeError: self.start_time = int(r['timestamp']) - self.default_supply = supply - self.default_supply_cap = 0 - def deploy(self, rpc, deployer_address, interface, supply_cap=0): tx_hash = None o = None - (tx_hash, o) = interface.constructor(deployer_address, self.settings, cap=0) + (tx_hash, o) = interface.constructor(deployer_address, self.settings) r = rpc.do(o) o = receipt(tx_hash) @@ -93,8 +90,8 @@ class TestDemurrage(EthTesterCase): except AttributeError as e: pass self.deployer = TestTokenDeploy(self.rpc, period=period, sink_address=self.accounts[9]) - self.default_supply = self.deployer.default_supply - self.default_supply_cap = self.deployer.default_supply_cap + self.default_supply = 0 + self.default_supply_cap = 0 self.start_block = None self.address = None self.start_time = None @@ -148,3 +145,6 @@ class TestDemurrageDefault(TestDemurrage): c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) self.deploy(c) + + self.default_supply = 10**12 + self.default_supply_cap = self.default_supply diff --git a/python/run_tests.sh b/python/run_tests.sh index b3cf54b..9492571 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -41,6 +41,7 @@ done python tests/test_expiry.py python tests/test_seal.py +python tests/test_cap.py set +e set +x diff --git a/python/tests/test_cap.py b/python/tests/test_cap.py index 4f6962a..8f513a3 100644 --- a/python/tests/test_cap.py +++ b/python/tests/test_cap.py @@ -18,7 +18,7 @@ from hexathon import ( from erc20_demurrage_token import DemurrageToken # test imports -from erc20_demurrage_token.unittest.base import TestDemurrageCap +from erc20_demurrage_token.unittest import TestDemurrageDefault logging.basicConfig(level=logging.DEBUG) logg = logging.getLogger() @@ -26,18 +26,27 @@ logg = logging.getLogger() testdir = os.path.dirname(__file__) -class TestCap(TestDemurrageCap): +class TestCap(TestDemurrageDefault): - def test_cap_set(self): + def test_cap(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - o = c.supply_cap(self.address, sender_address=self.accounts[0]) + + o = c.total_supply(self.address, sender_address=self.accounts[0]) + r = self.rpc.do(o) + logg.debug('r {}'.format(r)) + + (tx_hash, o) = c.set_max_supply(self.address, self.accounts[0], self.default_supply_cap) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.max_supply(self.address, sender_address=self.accounts[0]) r = self.rpc.do(o) cap = c.parse_supply_cap(r) self.assertEqual(cap, self.default_supply_cap) - - def test_cap(self): nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], self.default_supply_cap) @@ -53,15 +62,5 @@ class TestCap(TestDemurrageCap): self.assertEqual(r['status'], 0) - def test_cap_first(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], self.default_supply_cap + 1) - r = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 0) - - if __name__ == '__main__': unittest.main() diff --git a/python/tests/test_seal.py b/python/tests/test_seal.py index 8100460..824726c 100644 --- a/python/tests/test_seal.py +++ b/python/tests/test_seal.py @@ -156,6 +156,37 @@ class TestSeal(TestDemurrageDefault): self.assertTrue(c.parse_is_sealed(r)) + def test_seal_cap(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + + (tx_hash, o) = c.set_max_supply(self.address, self.accounts[0], 100) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_max_supply(self.address, self.accounts[0], 200) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.seal(self.address, self.accounts[0], ContractState.CAP_STATE) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + (tx_hash, o) = c.set_max_supply(self.address, self.accounts[0], 300) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + o = c.is_sealed(self.address, ContractState.CAP_STATE, sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertTrue(c.parse_is_sealed(r)) if __name__ == '__main__': diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index a97a759..a7ee90c 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -84,6 +84,9 @@ contract DemurrageTokenSingleCap { uint256 public expires; bool expired; + // supply xap + uint256 public maxSupply; + // Implements ERC20 event Transfer(address indexed _from, address indexed _to, uint256 _value); @@ -116,6 +119,8 @@ contract DemurrageTokenSingleCap { event Expired(uint256 _timestamp); + event Cap(uint256 indexed _oldCap, uint256 _newCap); + // property sealing uint256 public sealState; uint8 constant MINTER_STATE = 1; @@ -171,10 +176,22 @@ contract DemurrageTokenSingleCap { } function setExpirePeriod(uint256 _expirePeriod) public { + uint256 r; + require(!isSealed(EXPIRY_STATE)); require(!expired); require(msg.sender == owner); - expires = periodStart + (_expirePeriod * periodDuration); + r = periodStart + (_expirePeriod * periodDuration); + require(r > expires); + expires = r; + } + + function setMaxSupply(uint256 _cap) public { + require(!isSealed(CAP_STATE)); + require(msg.sender == owner); + require(_cap > supply); + emit Cap(maxSupply, _cap); + maxSupply = _cap; } @@ -283,10 +300,13 @@ contract DemurrageTokenSingleCap { require(applyExpiry() == 0); require(minter[msg.sender], 'ERR_ACCESS'); - - changePeriod(); - baseAmount = toBaseAmount(_amount); +changePeriod(); + if (maxSupply > 0) { + require(supply + _amount <= maxSupply); + } supply += _amount; + + baseAmount = toBaseAmount(_amount); increaseBaseBalance(_beneficiary, baseAmount); emit Mint(msg.sender, _beneficiary, _amount); saveRedistributionSupply(); From 5c85a8abba8f58cd3ddcbfe3d562482efc956bb7 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 16:17:06 +0000 Subject: [PATCH 32/57] Fix period test to recognize actual sink address --- python/CHANGELOG | 6 + .../data/DemurrageTokenSingleNocap.bin | 2 +- python/run_tests.sh | 51 +- python/tests/test_demurrage_ext.py | 41 -- python/tests/test_period.py | 4 +- python/tests/test_redistribution.py | 328 --------- solidity/DemurrageTokenMultiCap.sol | 633 ------------------ solidity/DemurrageTokenMultiNocap.sol | 614 ----------------- solidity/DemurrageTokenSingleCap.sol | 517 -------------- solidity/DemurrageTokenSingleNocap.sol | 3 +- solidity/Makefile | 19 +- 11 files changed, 20 insertions(+), 2198 deletions(-) delete mode 100644 python/tests/test_demurrage_ext.py delete mode 100644 python/tests/test_redistribution.py delete mode 100644 solidity/DemurrageTokenMultiCap.sol delete mode 100644 solidity/DemurrageTokenMultiNocap.sol delete mode 100644 solidity/DemurrageTokenSingleCap.sol diff --git a/python/CHANGELOG b/python/CHANGELOG index 8f54da5..33dda13 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,9 @@ +- 0.3.0 + * Smart contracts use abdk math libraries, all exponential operations are static gas cost + * Add expiry features, after which balances are frozen and no more transfers or demurrage will occur + * Add sealable features for supply, sink address, expiry and minters (when sealed cannot be changed) + * Deployer script now takes demurrage amount as ppm instead of literal growth fraction + * Retire old multi and cap contracts - 0.1.1 * Settable demurrage steps for apply demurrage cli tool - 0.1.0 diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 24e6567..3e86dd7 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b506040516200610038038062006100833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002d48176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002d6e176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161531e62000de260003960008181611aec015281816122d5015281816128d701528181612b0a0152612c1e015260008181611b1801528181612b3601528181612c3f0152612c84015261531e6000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063983b2d561161012c578063d5abeb01116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d5abeb0114610b21578063d7a52fa914610b3f578063d89135cd14610b5b578063e54063a614610b79576103a0565b8063b1cb0db311610106578063b1cb0db314610a97578063b470aade14610ab5578063c0ab707714610ad3578063d340ef8a14610b03576103a0565b8063983b2d5614610a07578063a457c2d714610a37578063a9059cbb14610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b80633092afd5116102d5578063449a52f81161027357806351b4541c1161024d57806351b4541c1461078357806358b2833b146107b35780635f408c04146107d15780636787a9be146107ef576103a0565b8063449a52f8146106f357806347a50517146107235780634abfbba214610753576103a0565b806331a5995d116102af57806331a5995d14610657578063395093511461067557806340452d91146106a557806342966c68146106d7576103a0565b80633092afd5146105d95780633133348714610609578063313ce56714610639576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba91906146d2565b610c45565b6040516103cc919061471a565b60405180910390f35b6103dd610deb565b6040516103ea91906147c5565b60405180910390f35b61040d6004803603810190610408919061487b565b610e79565b60405161041a919061471a565b60405180910390f35b61042b6110b5565b60405161043891906148d7565b60405180910390f35b61045b6004803603810190610456919061491e565b6110c8565b604051610468919061496d565b60405180910390f35b610479611118565b604051610486919061496d565b60405180910390f35b61049761112f565b6040516104a4919061496d565b60405180910390f35b6104b5611134565b6040516104c2919061496d565b60405180910390f35b6104e560048036038101906104e09190614b29565b611140565b6040516104f2919061496d565b60405180910390f35b610503611159565b60405161051091906148d7565b60405180910390f35b610533600480360381019061052e9190614b29565b61116c565b604051610540919061471a565b60405180910390f35b610563600480360381019061055e9190614b56565b6111d4565b604051610570919061471a565b60405180910390f35b610593600480360381019061058e9190614b29565b6113f2565b6040516105a091906148d7565b60405180910390f35b6105c360048036038101906105be9190614ba9565b61142a565b6040516105d0919061471a565b60405180910390f35b6105f360048036038101906105ee9190614bd6565b61145d565b604051610600919061471a565b60405180910390f35b610623600480360381019061061e9190614c03565b611567565b604051610630919061496d565b60405180910390f35b6106416115d3565b60405161064e919061496d565b60405180910390f35b61065f6115d9565b60405161066c919061496d565b60405180910390f35b61068f600480360381019061068a919061487b565b6115df565b60405161069c919061471a565b60405180910390f35b6106bf60048036038101906106ba9190614ba9565b611775565b6040516106ce93929190614c70565b60405180910390f35b6106f160048036038101906106ec9190614ba9565b6117e4565b005b61070d6004803603810190610708919061487b565b611920565b60405161071a919061471a565b60405180910390f35b61073d60048036038101906107389190614bd6565b611a9f565b60405161074a919061496d565b60405180910390f35b61076d60048036038101906107689190614ba9565b611ae8565b60405161077a919061496d565b60405180910390f35b61079d60048036038101906107989190614ba9565b611b48565b6040516107aa919061496d565b60405180910390f35b6107bb611b69565b6040516107c8919061496d565b60405180910390f35b6107d9611b6f565b6040516107e69190614cc3565b60405180910390f35b61080960048036038101906108049190614ba9565b611c3c565b604051610816919061496d565b60405180910390f35b61083960048036038101906108349190614ba9565b611c7d565b604051610846919061496d565b60405180910390f35b61086960048036038101906108649190614ba9565b611c9e565b005b61088560048036038101906108809190614bd6565b611d61565b604051610892919061496d565b60405180910390f35b6108a3611dcb565b6040516108b0919061496d565b60405180910390f35b6108c1611ddc565b6040516108ce919061496d565b60405180910390f35b6108f160048036038101906108ec9190614b29565b611de2565b6040516108fe919061496d565b60405180910390f35b61090f611e10565b60405161091c919061496d565b60405180910390f35b61092d611e16565b60405161093a919061471a565b60405180910390f35b61094b611fbd565b6040516109589190614ced565b60405180910390f35b61097b60048036038101906109769190614ba9565b611fe3565b604051610988919061496d565b60405180910390f35b6109996120c2565b6040516109a69190614ced565b60405180910390f35b6109c960048036038101906109c49190614bd6565b6120e8565b005b6109d361219d565b6040516109e0919061471a565b60405180910390f35b6109f161244d565b6040516109fe91906147c5565b60405180910390f35b610a216004803603810190610a1c9190614bd6565b6124db565b604051610a2e919061471a565b60405180910390f35b610a516004803603810190610a4c919061487b565b6125af565b604051610a5e919061471a565b60405180910390f35b610a816004803603810190610a7c919061487b565b6127ce565b604051610a8e919061471a565b60405180910390f35b610a9f6128cf565b604051610aac919061496d565b60405180910390f35b610abd6128d5565b604051610aca919061496d565b60405180910390f35b610aed6004803603810190610ae89190614ba9565b6128f9565b604051610afa919061496d565b60405180910390f35b610b0b612a6f565b604051610b18919061496d565b60405180910390f35b610b29612a75565b604051610b36919061496d565b60405180910390f35b610b596004803603810190610b549190614ba9565b612a7b565b005b610b63612b7a565b604051610b70919061496d565b60405180910390f35b610b936004803603810190610b8e9190614b29565b612b84565b604051610ba0919061496d565b60405180910390f35b610bc36004803603810190610bbe9190614d08565b612b98565b604051610bd09190614dde565b60405180910390f35b610be1612c18565b604051610bee9190614e24565b60405180910390f35b610bff612c82565b604051610c0c919061496d565b60405180910390f35b610c2f6004803603810190610c2a9190614bd6565b612ca6565b604051610c3c919061471a565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614e6e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614e6e565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611b6f565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614eeb565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614f57565b60405180910390fd5b5b610fb661219d565b50610fc084611c3c565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a0919061496d565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612d48565b6110ea6110e46001612d48565b86612db0565b612e17565b90506110fa81612e96565b67ffffffffffffffff168461110f9190614fa6565b91505092915050565b6000600c5460095461112a9190614fa6565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff16111561118957600090506111cf565b6000826020015168ffffffffffffffffff1611156111aa57600090506111cf565b6000826040015167ffffffffffffffff1611156111ca57600090506111cf565b600190505b919050565b6000806000806111e2611b6f565b905060028160ff16036111fb57600093505050506113eb565b60008160ff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614eeb565b60405180910390fd5b61124a61219d565b5061125485611c3c565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112df57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136b9190614fa6565b9250508190555061137d878785612ecb565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113dc919061496d565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114215761141e6001612d48565b90505b80915050919050565b6000600f821061143957600080fd5b6000820361144e57600f601454149050611458565b8160145483161490505b919050565b600061146c600160ff1661142a565b1561147657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114fd57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61150657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061157686612d48565b925061158185612d48565b915061159c600d60009054906101000a9004600f0b83612e17565b90506115a781612ef0565b90506115b38382612e17565b90506115be81612e96565b67ffffffffffffffff16935050505092915050565b60085481565b60145481565b6000806115ea61219d565b506115f483611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116829190614fda565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054604051611762919061496d565b60405180910390a3600191505092915050565b6000818154811061178557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117ee611b6f565b60ff16146117fb57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561189d57600080fd5b60006118a882611c3c565b90506118b43382612f7d565b5081600c60008282546118c79190614fda565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca583604051611914919061496d565b60405180910390a25050565b600080600061192d611b6f565b60ff161461193a57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061505a565b60405180910390fd5b6119ce61219d565b50600060135411156119f757601354836009546119eb9190614fda565b11156119f657600080fd5b5b8260096000828254611a099190614fda565b92505081905550611a1983611c3c565b9050611a258482613084565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a83919061496d565b60405180910390a3611a93613148565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b16919061507a565b7f0000000000000000000000000000000000000000000000000000000000000000611b419190614fda565b9050919050565b6000603c8242611b589190614fa6565b611b6291906150eb565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b8f5760019050611c39565b600060115403611ba25760009050611c39565b6011544210611c3457611bcf603c600354611bbd91906150eb565b601154611bca9190614fa6565b6128f9565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c1a919061496d565b60405180910390a1611c2a61219d565b5060029050611c39565b600090505b90565b600080611c60611c4b84612d48565b600260009054906101000a9004600f0b61330c565b9050611c6b81612e96565b67ffffffffffffffff16915050919050565b6000603c8242611c8d9190614fa6565b611c9791906150eb565b9050919050565b611cab600860ff1661142a565b15611cb557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f57600080fd5b6009548111611d1d57600080fd5b6013547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d4f919061496d565b60405180910390a28060138190555050565b6000806000806000611d7a611d7587611a9f565b612d48565b9350611d87600354611b48565b9150611da284600260009054906101000a9004600f0b612e17565b9250611dc0611db084612e96565b67ffffffffffffffff1683611567565b945050505050919050565b6000611dd760006128f9565b905090565b600c5481565b6000806000611df084611140565b9150611dfb846113f2565b9050611e0782826110c8565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210612028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201f90615168565b60405180910390fd5b600060145483161461206f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612066906151d4565b60405180910390fd5b816014600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416014546040516120b0919061496d565b60405180910390a16014549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120f5600260ff1661142a565b156120ff57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215957600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121a761462f565b6121af61462f565b6121b761462f565b60008060008060006121c7611dcb565b506121d0613398565b97506121db8861116c565b156121f15760009850505050505050505061244a565b6000600a5481548110612207576122066151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122b488612b84565b94506001856122c39190614fda565b90506122ce866113f2565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006122fe919061507a565b61230891906150eb565b915061233361232e600d60009054906101000a9004600f0b61232985612d48565b612e17565b612ef0565b9250612349600084612343611118565b84612b98565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124058761352e565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d67581604051612435919061496d565b60405180910390a16001985050505050505050505b90565b6007805461245a90614e6e565b80601f016020809104026020016040519081016040528092919081815260200182805461248690614e6e565b80156124d35780601f106124a8576101008083540402835291602001916124d3565b820191906000526020600020905b8154815290600101906020018083116124b657829003601f168201915b505050505081565b60006124ea600160ff1661142a565b156124f457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461254e57600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806125bb83611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561264657600080fd5b61264e61219d565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126db9190614fa6565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516127bb919061496d565b60405180910390a3600191505092915050565b6000806000806127dc611b6f565b905060028160ff16036127f557600093505050506128c9565b60008160ff16111561283c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283390614eeb565b60405180910390fd5b61284461219d565b5061284e85611c3c565b925061285b338785612ecb565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516128ba919061496d565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff1615612923576000945050505050612a6a565b61292e600354611b48565b925060008303612945576000945050505050612a6a565b600260009054906101000a9004600f0b905060008611801561296657508286105b1561296f578592505b61297883612d48565b9150612993600d60009054906101000a9004600f0b83612e17565b935061299e84612ef0565b93506129b9600260009054906101000a9004600f0b85612e17565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612a01919061507a565b600354612a0e9190614fda565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a5a91906148d7565b60405180910390a4829450505050505b919050565b600a5481565b60135481565b6000612a8a600460ff1661142a565b15612a9457600080fd5b601260009054906101000a900460ff1615612aae57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b0857600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b34919061507a565b7f0000000000000000000000000000000000000000000000000000000000000000612b5f9190614fda565b90506011548111612b6f57600080fd5b806011819055505050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612ba061462f565b612ba861462f565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612c699190614fa6565b612c7391906150eb565b612c7d9190614fda565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0257600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612d5f57600080fd5b6040829060020a029050919050565b60008082600f0b13612d7f57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612d9b8461364d565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e0457506f7fffffffffffffffffffffffffffffff600f0b8113155b612e0d57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e8357506f7fffffffffffffffffffffffffffffff600f0b8113155b612e8c57600080fd5b8091505092915050565b60008082600f0b1215612ea857600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612ed88584612f7d565b50612ee38484613084565b5060019150509392505050565b60006840000000000000000082600f0b12612f0a57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612f3e5760009050612f78565b612f756080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613813565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612fd9576000935050505061307e565b612fe286611a9f565b925084831015613027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301e9061526f565b60405180910390fd5b84836130339190614fa6565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130e05760009350505050613142565b6130e986611a9f565b925084836130f79190614fda565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061315261462f565b600061315c611118565b9050600060016000805490506131729190614fa6565b81548110613183576131826151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061325e9190614fa6565b8154811061326f5761326e6151f4565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361331d57600080fd5b600082600f0b604085600f0b9060020a028161333c5761333b6150bc565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561338557506f7fffffffffffffffffffffffffffffff600f0b8113155b61338e57600080fd5b8091505092915050565b6133a061462f565b6133a861462f565b6133b061462f565b600080600a54815481106133c7576133c66151f4565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156134d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134f691906152bb565b6fffffffffffffffffffffffffffffffff16905061351383612b84565b81116135245781935050505061352b565b8293505050505b90565b600080600061353c84611de2565b613544611118565b61354e9190614fa6565b9150600b5461355c83611c3c565b6135669190614fa6565b9050613594601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613084565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d384604051613608919061496d565b60405180910390a36001600a60008282546136239190614fda565b9250508190555080600b600082825461363c9190614fda565b925050819055508192505050919050565b60008082600f0b1361365e57600080fd5b60008083600f0b9050680100000000000000008112613699576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126136c7576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126136f3576010819060008212600003808260020a82851804189250505090506010820191505b610100811261371e576008819060008212600003808260020a82851804189250505090506008820191505b60108112613748576004819060008212600003808260020a82851804189250505090506004820191505b60048112613772576002819060008212600003808260020a82851804189250505090506002820191505b60028112613781576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613806578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506137ae565b5081945050505050919050565b60006840000000000000000082600f0b1261382d57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613861576000905061462a565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156138af57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156138e85760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139215760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561395a57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139935760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156139cc576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a0557608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613a3e576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613a7657608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613aae5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613ae6576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b1e5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613b56576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613b8e57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613bc65760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613bfe57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c355760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613c6c576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ca357608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613cda576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d1157608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613d485760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613d7f576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613db65760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613dec576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e2257608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613e585760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613e8e57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613ec45760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613efa576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f3057608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613f66576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613f9b57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613fd05760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614005576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561403a5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561406f576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156140a457608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156140d95760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561410e57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141425760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614176576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156141aa57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156141de576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561421257608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156142465760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561427a576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156142ae5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156142e1576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561431457608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156143475760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561437a57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156143ad5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156143e0576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561441357608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614446576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561447857608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156144aa5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156144dc576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561450e5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614540576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561457257608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156145a45760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156145d657608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561462557600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146af8161467a565b81146146ba57600080fd5b50565b6000813590506146cc816146a6565b92915050565b6000602082840312156146e8576146e7614675565b5b60006146f6848285016146bd565b91505092915050565b60008115159050919050565b614714816146ff565b82525050565b600060208201905061472f600083018461470b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561476f578082015181840152602081019050614754565b60008484015250505050565b6000601f19601f8301169050919050565b600061479782614735565b6147a18185614740565b93506147b1818560208601614751565b6147ba8161477b565b840191505092915050565b600060208201905081810360008301526147df818461478c565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614812826147e7565b9050919050565b61482281614807565b811461482d57600080fd5b50565b60008135905061483f81614819565b92915050565b6000819050919050565b61485881614845565b811461486357600080fd5b50565b6000813590506148758161484f565b92915050565b6000806040838503121561489257614891614675565b5b60006148a085828601614830565b92505060206148b185828601614866565b9150509250929050565b600081600f0b9050919050565b6148d1816148bb565b82525050565b60006020820190506148ec60008301846148c8565b92915050565b6148fb816148bb565b811461490657600080fd5b50565b600081359050614918816148f2565b92915050565b6000806040838503121561493557614934614675565b5b600061494385828601614866565b925050602061495485828601614909565b9150509250929050565b61496781614845565b82525050565b6000602082019050614982600083018461495e565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6149c58261477b565b810181811067ffffffffffffffff821117156149e4576149e361498d565b5b80604052505050565b60006149f761466b565b9050614a0382826149bc565b919050565b600063ffffffff82169050919050565b614a2181614a08565b8114614a2c57600080fd5b50565b600081359050614a3e81614a18565b92915050565b600068ffffffffffffffffff82169050919050565b614a6281614a44565b8114614a6d57600080fd5b50565b600081359050614a7f81614a59565b92915050565b600067ffffffffffffffff82169050919050565b614aa281614a85565b8114614aad57600080fd5b50565b600081359050614abf81614a99565b92915050565b600060608284031215614adb57614ada614988565b5b614ae560606149ed565b90506000614af584828501614a2f565b6000830152506020614b0984828501614a70565b6020830152506040614b1d84828501614ab0565b60408301525092915050565b600060608284031215614b3f57614b3e614675565b5b6000614b4d84828501614ac5565b91505092915050565b600080600060608486031215614b6f57614b6e614675565b5b6000614b7d86828701614830565b9350506020614b8e86828701614830565b9250506040614b9f86828701614866565b9150509250925092565b600060208284031215614bbf57614bbe614675565b5b6000614bcd84828501614866565b91505092915050565b600060208284031215614bec57614beb614675565b5b6000614bfa84828501614830565b91505092915050565b60008060408385031215614c1a57614c19614675565b5b6000614c2885828601614866565b9250506020614c3985828601614866565b9150509250929050565b614c4c81614a08565b82525050565b614c5b81614a44565b82525050565b614c6a81614a85565b82525050565b6000606082019050614c856000830186614c43565b614c926020830185614c52565b614c9f6040830184614c61565b949350505050565b600060ff82169050919050565b614cbd81614ca7565b82525050565b6000602082019050614cd86000830184614cb4565b92915050565b614ce781614807565b82525050565b6000602082019050614d026000830184614cde565b92915050565b60008060008060808587031215614d2257614d21614675565b5b6000614d3087828801614866565b9450506020614d4187828801614909565b9350506040614d5287828801614866565b9250506060614d6387828801614866565b91505092959194509250565b614d7881614a08565b82525050565b614d8781614a44565b82525050565b614d9681614a85565b82525050565b606082016000820151614db26000850182614d6f565b506020820151614dc56020850182614d7e565b506040820151614dd86040850182614d8d565b50505050565b6000606082019050614df36000830184614d9c565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e1e81614df9565b82525050565b6000602082019050614e396000830184614e15565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e8657607f821691505b602082108103614e9957614e98614e3f565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614ed5600783614740565b9150614ee082614e9f565b602082019050919050565b60006020820190508181036000830152614f0481614ec8565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614f41600a83614740565b9150614f4c82614f0b565b602082019050919050565b60006020820190508181036000830152614f7081614f34565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fb182614845565b9150614fbc83614845565b9250828203905081811115614fd457614fd3614f77565b5b92915050565b6000614fe582614845565b9150614ff083614845565b925082820190508082111561500857615007614f77565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615044600a83614740565b915061504f8261500e565b602082019050919050565b6000602082019050818103600083015261507381615037565b9050919050565b600061508582614845565b915061509083614845565b925082820261509e81614845565b915082820484148315176150b5576150b4614f77565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150f682614845565b915061510183614845565b925082615111576151106150bc565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615152601183614740565b915061515d8261511c565b602082019050919050565b6000602082019050818103600083015261518181615145565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006151be601283614740565b91506151c982615188565b602082019050919050565b600060208201905081810360008301526151ed816151b1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615259600d83614740565b915061526482615223565b602082019050919050565b600060208201905081810360008301526152888161524c565b9050919050565b61529881614df9565b81146152a357600080fd5b50565b6000815190506152b58161528f565b92915050565b6000602082840312156152d1576152d0614675565b5b60006152df848285016152a6565b9150509291505056fea2646970667358221220d5408287c06e54da7f8dc7cae17f7195a3e73269d5dd5fa683fc25dee0cafca364736f6c63430008110033 \ No newline at end of file +60c06040523480156200001157600080fd5b506040516200610538038062006105833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002d4d176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002d73176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161532362000de260003960008181611aec015281816122da015281816128dc01528181612b0f0152612c23015260008181611b1801528181612b3b01528181612c440152612c8901526153236000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063983b2d561161012c578063d5abeb01116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d5abeb0114610b21578063d7a52fa914610b3f578063d89135cd14610b5b578063e54063a614610b79576103a0565b8063b1cb0db311610106578063b1cb0db314610a97578063b470aade14610ab5578063c0ab707714610ad3578063d340ef8a14610b03576103a0565b8063983b2d5614610a07578063a457c2d714610a37578063a9059cbb14610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b80633092afd5116102d5578063449a52f81161027357806351b4541c1161024d57806351b4541c1461078357806358b2833b146107b35780635f408c04146107d15780636787a9be146107ef576103a0565b8063449a52f8146106f357806347a50517146107235780634abfbba214610753576103a0565b806331a5995d116102af57806331a5995d14610657578063395093511461067557806340452d91146106a557806342966c68146106d7576103a0565b80633092afd5146105d95780633133348714610609578063313ce56714610639576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba91906146d7565b610c45565b6040516103cc919061471f565b60405180910390f35b6103dd610deb565b6040516103ea91906147ca565b60405180910390f35b61040d60048036038101906104089190614880565b610e79565b60405161041a919061471f565b60405180910390f35b61042b6110b5565b60405161043891906148dc565b60405180910390f35b61045b60048036038101906104569190614923565b6110c8565b6040516104689190614972565b60405180910390f35b610479611118565b6040516104869190614972565b60405180910390f35b61049761112f565b6040516104a49190614972565b60405180910390f35b6104b5611134565b6040516104c29190614972565b60405180910390f35b6104e560048036038101906104e09190614b2e565b611140565b6040516104f29190614972565b60405180910390f35b610503611159565b60405161051091906148dc565b60405180910390f35b610533600480360381019061052e9190614b2e565b61116c565b604051610540919061471f565b60405180910390f35b610563600480360381019061055e9190614b5b565b6111d4565b604051610570919061471f565b60405180910390f35b610593600480360381019061058e9190614b2e565b6113f2565b6040516105a091906148dc565b60405180910390f35b6105c360048036038101906105be9190614bae565b61142a565b6040516105d0919061471f565b60405180910390f35b6105f360048036038101906105ee9190614bdb565b61145d565b604051610600919061471f565b60405180910390f35b610623600480360381019061061e9190614c08565b611567565b6040516106309190614972565b60405180910390f35b6106416115d3565b60405161064e9190614972565b60405180910390f35b61065f6115d9565b60405161066c9190614972565b60405180910390f35b61068f600480360381019061068a9190614880565b6115df565b60405161069c919061471f565b60405180910390f35b6106bf60048036038101906106ba9190614bae565b611775565b6040516106ce93929190614c75565b60405180910390f35b6106f160048036038101906106ec9190614bae565b6117e4565b005b61070d60048036038101906107089190614880565b611920565b60405161071a919061471f565b60405180910390f35b61073d60048036038101906107389190614bdb565b611a9f565b60405161074a9190614972565b60405180910390f35b61076d60048036038101906107689190614bae565b611ae8565b60405161077a9190614972565b60405180910390f35b61079d60048036038101906107989190614bae565b611b48565b6040516107aa9190614972565b60405180910390f35b6107bb611b69565b6040516107c89190614972565b60405180910390f35b6107d9611b6f565b6040516107e69190614cc8565b60405180910390f35b61080960048036038101906108049190614bae565b611c3c565b6040516108169190614972565b60405180910390f35b61083960048036038101906108349190614bae565b611c7d565b6040516108469190614972565b60405180910390f35b61086960048036038101906108649190614bae565b611c9e565b005b61088560048036038101906108809190614bdb565b611d66565b6040516108929190614972565b60405180910390f35b6108a3611dd0565b6040516108b09190614972565b60405180910390f35b6108c1611de1565b6040516108ce9190614972565b60405180910390f35b6108f160048036038101906108ec9190614b2e565b611de7565b6040516108fe9190614972565b60405180910390f35b61090f611e15565b60405161091c9190614972565b60405180910390f35b61092d611e1b565b60405161093a919061471f565b60405180910390f35b61094b611fc2565b6040516109589190614cf2565b60405180910390f35b61097b60048036038101906109769190614bae565b611fe8565b6040516109889190614972565b60405180910390f35b6109996120c7565b6040516109a69190614cf2565b60405180910390f35b6109c960048036038101906109c49190614bdb565b6120ed565b005b6109d36121a2565b6040516109e0919061471f565b60405180910390f35b6109f1612452565b6040516109fe91906147ca565b60405180910390f35b610a216004803603810190610a1c9190614bdb565b6124e0565b604051610a2e919061471f565b60405180910390f35b610a516004803603810190610a4c9190614880565b6125b4565b604051610a5e919061471f565b60405180910390f35b610a816004803603810190610a7c9190614880565b6127d3565b604051610a8e919061471f565b60405180910390f35b610a9f6128d4565b604051610aac9190614972565b60405180910390f35b610abd6128da565b604051610aca9190614972565b60405180910390f35b610aed6004803603810190610ae89190614bae565b6128fe565b604051610afa9190614972565b60405180910390f35b610b0b612a74565b604051610b189190614972565b60405180910390f35b610b29612a7a565b604051610b369190614972565b60405180910390f35b610b596004803603810190610b549190614bae565b612a80565b005b610b63612b7f565b604051610b709190614972565b60405180910390f35b610b936004803603810190610b8e9190614b2e565b612b89565b604051610ba09190614972565b60405180910390f35b610bc36004803603810190610bbe9190614d0d565b612b9d565b604051610bd09190614de3565b60405180910390f35b610be1612c1d565b604051610bee9190614e29565b60405180910390f35b610bff612c87565b604051610c0c9190614972565b60405180910390f35b610c2f6004803603810190610c2a9190614bdb565b612cab565b604051610c3c919061471f565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614e73565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614e73565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611b6f565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614ef0565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614f5c565b60405180910390fd5b5b610fb66121a2565b50610fc084611c3c565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614972565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612d4d565b6110ea6110e46001612d4d565b86612db5565b612e1c565b90506110fa81612e9b565b67ffffffffffffffff168461110f9190614fab565b91505092915050565b6000600c5460095461112a9190614fab565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff16111561118957600090506111cf565b6000826020015168ffffffffffffffffff1611156111aa57600090506111cf565b6000826040015167ffffffffffffffff1611156111ca57600090506111cf565b600190505b919050565b6000806000806111e2611b6f565b905060028160ff16036111fb57600093505050506113eb565b60008160ff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614ef0565b60405180910390fd5b61124a6121a2565b5061125485611c3c565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112df57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136b9190614fab565b9250508190555061137d878785612ed0565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113dc9190614972565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114215761141e6001612d4d565b90505b80915050919050565b6000600f821061143957600080fd5b6000820361144e57600f601454149050611458565b8160145483161490505b919050565b600061146c600160ff1661142a565b1561147657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114fd57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61150657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061157686612d4d565b925061158185612d4d565b915061159c600d60009054906101000a9004600f0b83612e1c565b90506115a781612ef5565b90506115b38382612e1c565b90506115be81612e9b565b67ffffffffffffffff16935050505092915050565b60085481565b60145481565b6000806115ea6121a2565b506115f483611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116829190614fdf565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117629190614972565b60405180910390a3600191505092915050565b6000818154811061178557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117ee611b6f565b60ff16146117fb57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561189d57600080fd5b60006118a882611c3c565b90506118b43382612f82565b5081600c60008282546118c79190614fdf565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516119149190614972565b60405180910390a25050565b600080600061192d611b6f565b60ff161461193a57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061505f565b60405180910390fd5b6119ce6121a2565b50600060135411156119f757601354836009546119eb9190614fdf565b11156119f657600080fd5b5b8260096000828254611a099190614fdf565b92505081905550611a1983611c3c565b9050611a258482613089565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a839190614972565b60405180910390a3611a9361314d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b16919061507f565b7f0000000000000000000000000000000000000000000000000000000000000000611b419190614fdf565b9050919050565b6000603c8242611b589190614fab565b611b6291906150f0565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b8f5760019050611c39565b600060115403611ba25760009050611c39565b6011544210611c3457611bcf603c600354611bbd91906150f0565b601154611bca9190614fab565b6128fe565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c1a9190614972565b60405180910390a1611c2a6121a2565b5060029050611c39565b600090505b90565b600080611c60611c4b84612d4d565b600260009054906101000a9004600f0b613311565b9050611c6b81612e9b565b67ffffffffffffffff16915050919050565b6000603c8242611c8d9190614fab565b611c9791906150f0565b9050919050565b611cab600860ff1661142a565b15611cb557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f57600080fd5b611d17611118565b8111611d2257600080fd5b6013547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d549190614972565b60405180910390a28060138190555050565b6000806000806000611d7f611d7a87611a9f565b612d4d565b9350611d8c600354611b48565b9150611da784600260009054906101000a9004600f0b612e1c565b9250611dc5611db584612e9b565b67ffffffffffffffff1683611567565b945050505050919050565b6000611ddc60006128fe565b905090565b600c5481565b6000806000611df584611140565b9150611e00846113f2565b9050611e0c82826110c8565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010821061202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061516d565b60405180910390fd5b6000601454831614612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b906151d9565b60405180910390fd5b816014600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416014546040516120b59190614972565b60405180910390a16014549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120fa600260ff1661142a565b1561210457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121ac614634565b6121b4614634565b6121bc614634565b60008060008060006121cc611dd0565b506121d561339d565b97506121e08861116c565b156121f65760009850505050505050505061244f565b6000600a548154811061220c5761220b6151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122b988612b89565b94506001856122c89190614fdf565b90506122d3866113f2565b9350603c857f0000000000000000000000000000000000000000000000000000000000000000612303919061507f565b61230d91906150f0565b9150612338612333600d60009054906101000a9004600f0b61232e85612d4d565b612e1c565b612ef5565b925061234e600084612348611118565b84612b9d565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061240a87613533565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161243a9190614972565b60405180910390a16001985050505050505050505b90565b6007805461245f90614e73565b80601f016020809104026020016040519081016040528092919081815260200182805461248b90614e73565b80156124d85780601f106124ad576101008083540402835291602001916124d8565b820191906000526020600020905b8154815290600101906020018083116124bb57829003601f168201915b505050505081565b60006124ef600160ff1661142a565b156124f957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461255357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806125c083611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561264b57600080fd5b6126536121a2565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614fab565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516127c09190614972565b60405180910390a3600191505092915050565b6000806000806127e1611b6f565b905060028160ff16036127fa57600093505050506128ce565b60008160ff161115612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614ef0565b60405180910390fd5b6128496121a2565b5061285385611c3c565b9250612860338785612ed0565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516128bf9190614972565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff1615612928576000945050505050612a6f565b612933600354611b48565b92506000830361294a576000945050505050612a6f565b600260009054906101000a9004600f0b905060008611801561296b57508286105b15612974578592505b61297d83612d4d565b9150612998600d60009054906101000a9004600f0b83612e1c565b93506129a384612ef5565b93506129be600260009054906101000a9004600f0b85612e1c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612a06919061507f565b600354612a139190614fdf565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a5f91906148dc565b60405180910390a4829450505050505b919050565b600a5481565b60135481565b6000612a8f600460ff1661142a565b15612a9957600080fd5b601260009054906101000a900460ff1615612ab357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b0d57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b39919061507f565b7f0000000000000000000000000000000000000000000000000000000000000000612b649190614fdf565b90506011548111612b7457600080fd5b806011819055505050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612ba5614634565b612bad614634565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612c6e9190614fab565b612c7891906150f0565b612c829190614fdf565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0757600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612d6457600080fd5b6040829060020a029050919050565b60008082600f0b13612d8457600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612da084613652565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e0957506f7fffffffffffffffffffffffffffffff600f0b8113155b612e1257600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e8857506f7fffffffffffffffffffffffffffffff600f0b8113155b612e9157600080fd5b8091505092915050565b60008082600f0b1215612ead57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612edd8584612f82565b50612ee88484613089565b5060019150509392505050565b60006840000000000000000082600f0b12612f0f57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612f435760009050612f7d565b612f7a6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613818565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612fde5760009350505050613083565b612fe786611a9f565b92508483101561302c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302390615274565b60405180910390fd5b84836130389190614fab565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130e55760009350505050613147565b6130ee86611a9f565b925084836130fc9190614fdf565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000613157614634565b6000613161611118565b9050600060016000805490506131779190614fab565b81548110613188576131876151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506132639190614fab565b81548110613274576132736151f9565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361332257600080fd5b600082600f0b604085600f0b9060020a0281613341576133406150c1565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561338a57506f7fffffffffffffffffffffffffffffff600f0b8113155b61339357600080fd5b8091505092915050565b6133a5614634565b6133ad614634565b6133b5614634565b600080600a54815481106133cc576133cb6151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156134d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fb91906152c0565b6fffffffffffffffffffffffffffffffff16905061351883612b89565b811161352957819350505050613530565b8293505050505b90565b600080600061354184611de7565b613549611118565b6135539190614fab565b9150600b5461356183611c3c565b61356b9190614fab565b9050613599601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613089565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161360d9190614972565b60405180910390a36001600a60008282546136289190614fdf565b9250508190555080600b60008282546136419190614fdf565b925050819055508192505050919050565b60008082600f0b1361366357600080fd5b60008083600f0b905068010000000000000000811261369e576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126136cc576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126136f8576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613723576008819060008212600003808260020a82851804189250505090506008820191505b6010811261374d576004819060008212600003808260020a82851804189250505090506004820191505b60048112613777576002819060008212600003808260020a82851804189250505090506002820191505b60028112613786576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561380b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506137b3565b5081945050505050919050565b60006840000000000000000082600f0b1261383257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613866576000905061462f565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156138b457608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156138ed5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139265760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561395f57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139985760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156139d1576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a0a57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613a43576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613a7b57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613ab35760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613aeb576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b235760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613b5b576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613b9357608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613bcb5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613c0357608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c3a5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613c71576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ca857608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613cdf576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d1657608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613d4d5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613d84576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613dbb5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613df1576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e2757608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613e5d5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613e9357608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613ec95760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613eff576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f3557608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613f6b576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613fa057608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613fd55760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561400a576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561403f5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614074576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156140a957608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156140de5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561411357608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141475760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561417b576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156141af57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156141e3576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561421757608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561424b5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561427f576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156142b35760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156142e6576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561431957608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561434c5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561437f57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156143b25760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156143e5576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561441857608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561444b576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561447d57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156144af5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156144e1576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145135760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614545576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561457757608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156145a95760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156145db57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561462a57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146b48161467f565b81146146bf57600080fd5b50565b6000813590506146d1816146ab565b92915050565b6000602082840312156146ed576146ec61467a565b5b60006146fb848285016146c2565b91505092915050565b60008115159050919050565b61471981614704565b82525050565b60006020820190506147346000830184614710565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614774578082015181840152602081019050614759565b60008484015250505050565b6000601f19601f8301169050919050565b600061479c8261473a565b6147a68185614745565b93506147b6818560208601614756565b6147bf81614780565b840191505092915050565b600060208201905081810360008301526147e48184614791565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614817826147ec565b9050919050565b6148278161480c565b811461483257600080fd5b50565b6000813590506148448161481e565b92915050565b6000819050919050565b61485d8161484a565b811461486857600080fd5b50565b60008135905061487a81614854565b92915050565b600080604083850312156148975761489661467a565b5b60006148a585828601614835565b92505060206148b68582860161486b565b9150509250929050565b600081600f0b9050919050565b6148d6816148c0565b82525050565b60006020820190506148f160008301846148cd565b92915050565b614900816148c0565b811461490b57600080fd5b50565b60008135905061491d816148f7565b92915050565b6000806040838503121561493a5761493961467a565b5b60006149488582860161486b565b92505060206149598582860161490e565b9150509250929050565b61496c8161484a565b82525050565b60006020820190506149876000830184614963565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6149ca82614780565b810181811067ffffffffffffffff821117156149e9576149e8614992565b5b80604052505050565b60006149fc614670565b9050614a0882826149c1565b919050565b600063ffffffff82169050919050565b614a2681614a0d565b8114614a3157600080fd5b50565b600081359050614a4381614a1d565b92915050565b600068ffffffffffffffffff82169050919050565b614a6781614a49565b8114614a7257600080fd5b50565b600081359050614a8481614a5e565b92915050565b600067ffffffffffffffff82169050919050565b614aa781614a8a565b8114614ab257600080fd5b50565b600081359050614ac481614a9e565b92915050565b600060608284031215614ae057614adf61498d565b5b614aea60606149f2565b90506000614afa84828501614a34565b6000830152506020614b0e84828501614a75565b6020830152506040614b2284828501614ab5565b60408301525092915050565b600060608284031215614b4457614b4361467a565b5b6000614b5284828501614aca565b91505092915050565b600080600060608486031215614b7457614b7361467a565b5b6000614b8286828701614835565b9350506020614b9386828701614835565b9250506040614ba48682870161486b565b9150509250925092565b600060208284031215614bc457614bc361467a565b5b6000614bd28482850161486b565b91505092915050565b600060208284031215614bf157614bf061467a565b5b6000614bff84828501614835565b91505092915050565b60008060408385031215614c1f57614c1e61467a565b5b6000614c2d8582860161486b565b9250506020614c3e8582860161486b565b9150509250929050565b614c5181614a0d565b82525050565b614c6081614a49565b82525050565b614c6f81614a8a565b82525050565b6000606082019050614c8a6000830186614c48565b614c976020830185614c57565b614ca46040830184614c66565b949350505050565b600060ff82169050919050565b614cc281614cac565b82525050565b6000602082019050614cdd6000830184614cb9565b92915050565b614cec8161480c565b82525050565b6000602082019050614d076000830184614ce3565b92915050565b60008060008060808587031215614d2757614d2661467a565b5b6000614d358782880161486b565b9450506020614d468782880161490e565b9350506040614d578782880161486b565b9250506060614d688782880161486b565b91505092959194509250565b614d7d81614a0d565b82525050565b614d8c81614a49565b82525050565b614d9b81614a8a565b82525050565b606082016000820151614db76000850182614d74565b506020820151614dca6020850182614d83565b506040820151614ddd6040850182614d92565b50505050565b6000606082019050614df86000830184614da1565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e2381614dfe565b82525050565b6000602082019050614e3e6000830184614e1a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e8b57607f821691505b602082108103614e9e57614e9d614e44565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614eda600783614745565b9150614ee582614ea4565b602082019050919050565b60006020820190508181036000830152614f0981614ecd565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614f46600a83614745565b9150614f5182614f10565b602082019050919050565b60006020820190508181036000830152614f7581614f39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fb68261484a565b9150614fc18361484a565b9250828203905081811115614fd957614fd8614f7c565b5b92915050565b6000614fea8261484a565b9150614ff58361484a565b925082820190508082111561500d5761500c614f7c565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615049600a83614745565b915061505482615013565b602082019050919050565b600060208201905081810360008301526150788161503c565b9050919050565b600061508a8261484a565b91506150958361484a565b92508282026150a38161484a565b915082820484148315176150ba576150b9614f7c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150fb8261484a565b91506151068361484a565b925082615116576151156150c1565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615157601183614745565b915061516282615121565b602082019050919050565b600060208201905081810360008301526151868161514a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006151c3601283614745565b91506151ce8261518d565b602082019050919050565b600060208201905081810360008301526151f2816151b6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061525e600d83614745565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b61529d81614dfe565b81146152a857600080fd5b50565b6000815190506152ba81615294565b92915050565b6000602082840312156152d6576152d561467a565b5b60006152e4848285016152ab565b9150509291505056fea2646970667358221220f7dd37b962b03307b9a47a02325dafb33edc00117a2875af89644526ff48de4064736f6c63430008110033 \ No newline at end of file diff --git a/python/run_tests.sh b/python/run_tests.sh index 9492571..b8e4beb 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -1,47 +1,14 @@ #!/bin/bash -set -x +set -a set -e - -export PYTHONPATH=. - -#modes=(MultiNocap MultiCap SingleCap SingleNocap) -#modes=(SingleCap SingleNocap) # other contracts need to be updted -modes=(SingleNocap) # other contracts need to be updted -for m in ${modes[@]}; do - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_basic.py - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_growth.py - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_amounts.py - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_single.py +set -x +default_pythonpath=$PYTHONPATH:. +export PYTHONPATH=${default_pythonpath:-.} +>&2 echo using pythonpath $PYTHONPATH +for f in `ls tests/*.py`; do + python $f done - -#modes=(SingleCap) # other contracts need to be updted -modes=() -for m in ${modes[@]}; do - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_period.py -done - -modes=(SingleNocap) # other contracts need to be updted -for m in ${modes[@]}; do - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_unit.py - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution_single.py -done - -#modes=(MultiCap SingleCap) -modes=() -for m in ${modes[@]}; do - ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_cap.py -done - -#modes=(MultiCap MultiNocap) -#for m in ${modes[@]}; do -# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_remainder.py -# ERC20_DEMURRAGE_TOKEN_TEST_MODE=$m python tests/test_redistribution.py -#done - -python tests/test_expiry.py -python tests/test_seal.py -python tests/test_cap.py - -set +e set +x +set +e +set +a diff --git a/python/tests/test_demurrage_ext.py b/python/tests/test_demurrage_ext.py deleted file mode 100644 index b73ab49..0000000 --- a/python/tests/test_demurrage_ext.py +++ /dev/null @@ -1,41 +0,0 @@ -# standard imports -import datetime -import unittest - -# external imports -from chainlib.eth.nonce import RPCNonceOracle - -# local imports -from erc20_demurrage_token import DemurrageToken -from erc20_demurrage_token.demurrage import DemurrageCalculator - -# test imports -from erc20_demurrage_token.unittest.base import TestDemurrage - - -class TestEmulate(TestDemurrage): - - def test_amount_since(self): - d = datetime.datetime.utcnow() - datetime.timedelta(seconds=29, hours=5, minutes=3, days=4) - c = DemurrageCalculator(0.00000050105908373373) - a = c.amount_since(100, d.timestamp()) - self.assert_within_lower(a, 99.69667, 0.1) - - - def test_amount_since_slow(self): - d = datetime.datetime.utcnow() - datetime.timedelta(seconds=29, hours=5, minutes=3, days=4) - c = DemurrageCalculator(0.00000050105908373373) - a = c.amount_since_slow(100, d.timestamp()) - self.assert_within_lower(a, 99.69667, 0.1) - - - def test_from_contract(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - self.deploy(c, 'SingleNocap') - dc = DemurrageCalculator.from_contract(self.rpc, self.chain_spec, self.address, sender_address=self.accounts[0]) - self.assertEqual(dc.r_min, 0.02) - - -if __name__ == '__main__': - unittest.main() diff --git a/python/tests/test_period.py b/python/tests/test_period.py index 9fc6da5..09592a3 100644 --- a/python/tests/test_period.py +++ b/python/tests/test_period.py @@ -172,7 +172,7 @@ class TestPeriod(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - o = c.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0]) + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance_of(r) self.assertGreater(balance, 0) @@ -222,7 +222,7 @@ class TestPeriod(TestDemurrageDefault): r = self.rpc.do(o) self.assertEqual(r['status'], 1) - o = c.balance_of(self.address, ZERO_ADDRESS, sender_address=self.accounts[0]) + o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) r = self.rpc.do(o) balance = c.parse_balance_of(r) self.assertLess(balance, old_sink_balance) diff --git a/python/tests/test_redistribution.py b/python/tests/test_redistribution.py deleted file mode 100644 index 7da30cc..0000000 --- a/python/tests/test_redistribution.py +++ /dev/null @@ -1,328 +0,0 @@ -# standard imports -import os -import unittest -import json -import logging - -# external imports -from chainlib.eth.constant import ZERO_ADDRESS -from chainlib.eth.nonce import RPCNonceOracle -from chainlib.eth.tx import receipt -from chainlib.eth.block import ( - block_latest, - block_by_number, - ) -from chainlib.eth.address import to_checksum_address -from hexathon import ( - strip_0x, - add_0x, - ) - -# local imports -from erc20_demurrage_token import DemurrageToken - -# test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault - -logging.basicConfig(level=logging.DEBUG) -logg = logging.getLogger() - -testdir = os.path.dirname(__file__) - -class TestRedistribution(TestDemurrageDefault): - - - - def test_whole_is_parts(self): - nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 100000000) - self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[2], 100000000) - self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.transfer(self.address, self.accounts[1], self.accounts[3], 50000000) - r = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - self.backend.time_travel(self.start_time + self.period_seconds + 1) - - o = block_latest() - r = self.rpc.do(o) - o = block_by_number(r) - r = self.rpc.do(o) - self.assertEqual(r['timestamp'], self.start_time + self.period_seconds) - - (tx_hash, o) = c.change_period(self.address, self.accounts[1]) - r = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - (tx_hash, o) = c.apply_redistribution_on_account(self.address, self.accounts[1], self.accounts[1]) - r = self.rpc.do(o) - o = receipt(tx_hash) - r = self.rpc.do(o) - self.assertEqual(r['status'], 1) - - balance = 0 - for i in range(3): - o = c.balance_of(self.address, self.accounts[i+1], sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance_item = c.parse_balance_of(r) - balance += balance_item - logg.debug('balance {} {} total {}'.format(i, balance_item, balance)) - - o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) - r = self.rpc.do(o) - balance_item = c.parse_balance_of(r) - balance += balance_item - - self.assertEqual(balance, 200000000) - - -# def test_debug_periods(self): -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# -# o = c.actual_period(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# pactual = c.parse_actual_period(r) -# -# o = c.period_start(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# pstart = c.parse_actual_period(r) -# -# o = c.period_duration(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# pduration = c.parse_actual_period(r) -# -# o = block_latest() -# blocknumber = self.rpc.do(o) -# -# logg.debug('actual {} start {} duration {} blocknumber {}'.format(pactual, pstart, pduration, blocknumber)) -# -# -# # TODO: check receipt log outputs -# def test_redistribution_storage(self): -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# self.assertEqual(strip_0x(r), '000000000000000000000000f424000000000000000000000000000000000001') -# -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1000000) -# r = self.rpc.do(o) -# -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[2], 1000000) -# r = self.rpc.do(o) -# -# external_address = to_checksum_address('0x' + os.urandom(20).hex()) -# -# nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[2], external_address, 1000000) -# r = self.rpc.do(o) -# -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[1], external_address, 999999) -# r = self.rpc.do(o) -# -# self.backend.time_travel(self.start_time + self.period_seconds + 1) -# -# o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# self.assertEqual(strip_0x(r), '000000000000000000000000f42400000000010000000000001e848000000001') -# -# o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# self.assertEqual(strip_0x(r), '000000000000000000000000f42400000000010000000000001e848000000001') -# -# -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], 1000000) -# r = self.rpc.do(o) -# -# o = c.redistributions(self.address, 1, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# self.assertEqual(strip_0x(r), '000000000000000000000000ef4200000000000000000000002dc6c000000002') -# -# -# def test_redistribution_balance_on_zero_participants(self): -# supply = self.default_supply -# -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], supply) -# r = self.rpc.do(o) -# -# self.backend.time_travel(self.start_time + self.period_seconds + 1) -# (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[0]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# rcpt = self.rpc.do(o) -# self.assertEqual(rcpt['status'], 1) -# -# (tx_hash, o) = c.change_period(self.address, self.accounts[0]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.total_supply(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# total_supply = c.parse_total_supply(r) -# sink_increment = int(total_supply * (self.tax_level / 1000000)) -# self.assertEqual(supply, total_supply) -# -# for l in rcpt['logs']: -# if l['topics'][0] == '0xa0717e54e02bd9829db5e6e998aec0ae9de796b8d150a3cc46a92ab869697755': # event Decayed(uint256,uint256,uint256,uint256) -# period = int.from_bytes(bytes.fromhex(strip_0x(l['topics'][1])), 'big') -# self.assertEqual(period, 2) -# b = bytes.fromhex(strip_0x(l['data'])) -# remainder = int.from_bytes(b, 'big') -# self.assertEqual(remainder, int((1000000 - self.tax_level) * (10 ** 32))) -# -# o = c.balance_of(self.address, self.sink_address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# sink_balance = c.parse_balance_of(r) -# -# self.assertEqual(sink_balance, int(sink_increment * 0.98)) -# self.assertEqual(sink_balance, int(sink_increment * (1000000 - self.tax_level) / 1000000)) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# balance = c.parse_balance_of(r) -# self.assertEqual(balance, supply - sink_increment) -# -# -# def test_redistribution_two_of_ten(self): -# mint_amount = 100000000 -# nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# z = 0 -# for i in range(10): -# (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[i], mint_amount) -# self.rpc.do(o) -# z += mint_amount -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# initial_balance = c.parse_balance_of(r) -# -# spend_amount = 1000000 -# external_address = to_checksum_address('0x' + os.urandom(20).hex()) -# -# nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[1], external_address, spend_amount) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# nonce_oracle = RPCNonceOracle(self.accounts[2], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[2], external_address, spend_amount) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# # No cheating! -# nonce_oracle = RPCNonceOracle(self.accounts[3], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[3], self.accounts[3], spend_amount) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# # No cheapskating! -# nonce_oracle = RPCNonceOracle(self.accounts[4], self.rpc) -# c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) -# (tx_hash, o) = c.transfer(self.address, self.accounts[4], external_address, spend_amount-1) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# -# self.backend.time_travel(self.start_time + self.period_seconds + 1) -# -# (tx_hash, o) = c.apply_demurrage(self.address, self.accounts[4]) -# self.rpc.do(o) -# -# (tx_hash, o) = c.change_period(self.address, self.accounts[4]) -# self.rpc.do(o) -# -# o = c.balance_of(self.address, self.accounts[3], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# bummer_balance = c.parse_balance_of(r) -# -# self.assertEqual(bummer_balance, mint_amount - (mint_amount * (self.tax_level / 1000000))) -# logg.debug('bal {} '.format(bummer_balance)) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# bummer_balance = c.parse_balance_of(r) -# spender_balance = mint_amount - spend_amount -# spender_decayed_balance = int(spender_balance - (spender_balance * (self.tax_level / 1000000))) -# self.assertEqual(bummer_balance, spender_decayed_balance) -# logg.debug('bal {} '.format(bummer_balance)) -# -# (tx_hash, o) = c.apply_redistribution_on_account(self.address, self.accounts[4], self.accounts[1]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# (tx_hash, o) = c.apply_redistribution_on_account(self.address, self.accounts[4], self.accounts[2]) -# self.rpc.do(o) -# o = receipt(tx_hash) -# r = self.rpc.do(o) -# self.assertEqual(r['status'], 1) -# -# o = c.redistributions(self.address, 0, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# redistribution_data = c.parse_redistributions(r) -# logg.debug('redist data {}'.format(redistribution_data)) -# -# o = c.account_period(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# account_period_data = c.parse_account_period(r) -# logg.debug('account period {}'.format(account_period_data)) -# -# o = c.actual_period(self.address, sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# actual_period = c.parse_actual_period(r) -# logg.debug('period {}'.format(actual_period)) -# -# redistribution = int((z / 2) * (self.tax_level / 1000000)) -# spender_new_base_balance = ((mint_amount - spend_amount) + redistribution) -# spender_new_decayed_balance = int(spender_new_base_balance - (spender_new_base_balance * (self.tax_level / 1000000))) -# -# o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) -# r = self.rpc.do(o) -# spender_actual_balance = c.parse_balance_of(r) -# logg.debug('rrr {} {}'.format(redistribution, spender_new_decayed_balance)) -# -# self.assertEqual(spender_actual_balance, spender_new_decayed_balance) -# - -if __name__ == '__main__': - unittest.main() diff --git a/solidity/DemurrageTokenMultiCap.sol b/solidity/DemurrageTokenMultiCap.sol deleted file mode 100644 index c74446c..0000000 --- a/solidity/DemurrageTokenMultiCap.sol +++ /dev/null @@ -1,633 +0,0 @@ -pragma solidity > 0.6.11; - -// SPDX-License-Identifier: GPL-3.0-or-later - -contract DemurrageTokenMultiCap { - - // Redistribution bit field, with associated shifts and masks - // (Uses sub-byte boundaries) - bytes32[] public redistributions; // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - uint8 constant shiftRedistributionPeriod = 0; - uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 - uint8 constant shiftRedistributionValue = 32; - uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 - uint8 constant shiftRedistributionParticipants = 104; - uint256 constant maskRedistributionParticipants = 0x00000000000000000000000000000fffffffff00000000000000000000000000; // ((1 << 36) - 1) << 104 - uint8 constant shiftRedistributionDemurrage = 140; - uint256 constant maskRedistributionDemurrage = 0x000000000000000000000000fffff00000000000000000000000000000000000; // ((1 << 20) - 1) << 140 - uint8 constant shiftRedistributionIsFractional = 255; - uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255 - - // Account bit field, with associated shifts and masks - // Mirrors structure of redistributions for consistency - mapping (address => bytes32) account; // uint152(unused) | uint32(period) | uint72(value) - uint8 constant shiftAccountValue = 0; - uint256 constant maskAccountValue = 0x0000000000000000000000000000000000000000000000ffffffffffffffffff; // (1 << 72) - 1 - uint8 constant shiftAccountPeriod = 72; - uint256 constant maskAccountPeriod = 0x00000000000000000000000000000000000000ffffffff000000000000000000; // ((1 << 32) - 1) << 72 - - // Cached demurrage amount, ppm with 38 digit resolution - uint128 public demurrageAmount; - - // Cached demurrage period; the period for which demurrageAmount was calculated - //uint128 public demurragePeriod; - // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated - uint256 public demurrageTimestamp; - - // Implements EIP172 - address public owner; - - address newOwner; - - // Implements ERC20 - string public name; - - // Implements ERC20 - string public symbol; - - // Implements ERC20 - uint256 public decimals; - - // Implements ERC20 - uint256 public totalSupply; - - // Maximum amount of tokens that can be minted - uint256 public supplyCap; - - // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - uint256 public minimumParticipantSpend; - - // 128 bit resolution of the demurrage divisor - // (this constant x 1000000 is contained within 128 bits) - uint256 constant ppmDivider = 100000000000000000000000000000000; - - // demurrage decimal width; 38 places - uint256 public immutable resolutionFactor = ppmDivider * 1000000; - - // Timestamp of start of periods (time which contract constructor was called) - uint256 public immutable periodStart; - - // Duration of a single redistribution period in seconds - uint256 public immutable periodDuration; - - // Demurrage in ppm per minute - uint256 public immutable taxLevel; - - // Addresses allowed to mint new tokens - mapping (address => bool) minter; - - // Storage for ERC20 approve/transferFrom methods - mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage) - - // Address to send unallocated redistribution tokens - address sinkAddress; - - // Implements ERC20 - event Transfer(address indexed _from, address indexed _to, uint256 _value); - - // Implements ERC20 - event Approval(address indexed _owner, address indexed _spender, uint256 _value); - - // New tokens minted - event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); - - // New demurrage cache milestone calculated - event Decayed(uint256 indexed _period, uint256 indexed _periodCount, uint256 indexed _oldAmount, uint256 _newAmount); - - // When a new period threshold has been crossed - event Period(uint256 _period); - - // Redistribution applied on a single eligible account - event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value); - - // Temporary event used in development, will be removed on prod - event Debug(bytes32 _foo); - - // EIP173 - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - - constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress, uint256 _supplyCap) public { - // ACL setup - owner = msg.sender; - minter[owner] = true; - - // ERC20 setup - name = _name; - symbol = _symbol; - decimals = _decimals; - - // Demurrage setup - demurrageTimestamp = block.timestamp; - periodStart = demurrageTimestamp; - periodDuration = _periodMinutes * 60; - demurrageAmount = uint128(ppmDivider * 1000000); // Represents 38 decimal places - //demurragePeriod = 1; - taxLevel = _taxLevelMinute; // Represents 38 decimal places - bytes32 initialRedistribution = toRedistribution(0, 1000000, 0, 1); - redistributions.push(initialRedistribution); - - // Misc settings - supplyCap = _supplyCap; - sinkAddress = _defaultSinkAddress; - minimumParticipantSpend = 10 ** uint256(_decimals); - } - - // Given address will be allowed to call the mintTo() function - function addMinter(address _minter) public returns (bool) { - require(msg.sender == owner); - minter[_minter] = true; - return true; - } - - // Given address will no longer be allowed to call the mintTo() function - function removeMinter(address _minter) public returns (bool) { - require(msg.sender == owner || _minter == msg.sender); - minter[_minter] = false; - return true; - } - - /// Implements ERC20 - function balanceOf(address _account) public view returns (uint256) { - uint256 baseBalance; - uint256 currentDemurragedAmount; - uint256 periodCount; - - baseBalance = baseBalanceOf(_account); - - //periodCount = actualPeriod() - demurragePeriod; - periodCount = getMinutesDelta(demurrageTimestamp); - - currentDemurragedAmount = uint128(decayBy(demurrageAmount, periodCount)); - - return (baseBalance * currentDemurragedAmount) / (ppmDivider * 1000000); - } - - /// Balance unmodified by demurrage - function baseBalanceOf(address _account) public view returns (uint256) { - return uint256(account[_account]) & maskAccountValue; - } - - /// Increases base balance for a single account - function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - newBalance = oldBalance + _delta; - require(uint160(newBalance) > uint160(oldBalance), 'ERR_WOULDWRAP'); // revert if increase would result in a wrapped value - workAccount &= (~maskAccountValue); - workAccount |= (newBalance & maskAccountValue); - account[_account] = bytes32(workAccount); - return true; - } - - /// Decreases base balance for a single account - function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard - newBalance = oldBalance - _delta; - workAccount &= (~maskAccountValue); - workAccount |= (newBalance & maskAccountValue); - account[_account] = bytes32(workAccount); - return true; - } - - // Creates new tokens out of thin air, and allocates them to the given address - // Triggers tax - function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { - uint256 baseAmount; - - require(minter[msg.sender]); - require(_amount + totalSupply <= supplyCap); - - changePeriod(); - baseAmount = toBaseAmount(_amount); - totalSupply += _amount; - increaseBaseBalance(_beneficiary, baseAmount); - emit Mint(msg.sender, _beneficiary, _amount); - saveRedistributionSupply(); - return true; - } - - // Deserializes the redistribution word - // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) private pure returns(bytes32) { - bytes32 redistribution; - - redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); - redistribution |= bytes32((_participants << shiftRedistributionParticipants) & maskRedistributionParticipants); - redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); - redistribution |= bytes32(_period & maskRedistributionPeriod); - return redistribution; - } - - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution) & maskRedistributionPeriod; - } - - // Serializes the supply part of the redistribution word - function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionValue) >> shiftRedistributionValue; - } - - // Serializes the number of participants part of the redistribution word - function toRedistributionParticipants(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionParticipants) >> shiftRedistributionParticipants; - } - - // Serializes the demurrage modifier part of the redistribution word - function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; - } - - // Client accessor to the redistributions array length - function redistributionCount() public view returns (uint256) { - return redistributions.length; - } - - // Add number of participants for the current redistribution period by one - function incrementRedistributionParticipants() private returns (bool) { - bytes32 currentRedistribution; - uint256 tmpRedistribution; - uint256 participants; - - currentRedistribution = redistributions[redistributions.length-1]; - participants = toRedistributionParticipants(currentRedistribution) + 1; - tmpRedistribution = uint256(currentRedistribution); - tmpRedistribution &= (~maskRedistributionParticipants); - tmpRedistribution |= ((participants << shiftRedistributionParticipants) & maskRedistributionParticipants); - - redistributions[redistributions.length-1] = bytes32(tmpRedistribution); - - return true; - } - - // Save the current total supply amount to the current redistribution period - function saveRedistributionSupply() private returns (bool) { - uint256 currentRedistribution; - - currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= (~maskRedistributionValue); - currentRedistribution |= (totalSupply << shiftRedistributionValue); - - redistributions[redistributions.length-1] = bytes32(currentRedistribution); - return true; - } - - // Get the demurrage period of the current block number - function actualPeriod() public view returns (uint128) { - return uint128((block.timestamp - periodStart) / periodDuration + 1); - } - - // Add an entered demurrage period to the redistribution array - function checkPeriod() private view returns (bytes32) { - bytes32 lastRedistribution; - uint256 currentPeriod; - - lastRedistribution = redistributions[redistributions.length-1]; - currentPeriod = this.actualPeriod(); - if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return bytes32(0x00); - } - return lastRedistribution; - } - - // Deserialize the pemurrage period for the given account is participating in - function accountPeriod(address _account) public view returns (uint256) { - return (uint256(account[_account]) & maskAccountPeriod) >> shiftAccountPeriod; - } - - // Save the given demurrage period as the currently participation period for the given address - function registerAccountPeriod(address _account, uint256 _period) private returns (bool) { - account[_account] &= bytes32(~maskAccountPeriod); - account[_account] |= bytes32((_period << shiftAccountPeriod) & maskAccountPeriod); - incrementRedistributionParticipants(); - return true; - } - - // Determine whether the unit number is rounded down, rounded up or evenly divides. - // Returns 0 if evenly distributed, or the remainder as a positive number - // A _numParts value 0 will be interpreted as the value 1 - function remainder(uint256 _numParts, uint256 _sumWhole) public pure returns (uint256) { - uint256 unit; - uint256 truncatedResult; - - if (_numParts == 0) { // no division by zero please - revert('ERR_NUMPARTS_ZERO'); - } - require(_numParts < _sumWhole); // At least you are never LESS than the sum of your parts. Think about that. - - unit = _sumWhole / _numParts; - truncatedResult = unit * _numParts; - return _sumWhole - truncatedResult; - } - - // Called in the edge case where participant number is 0. It will override the participant count to 1. - // Returns the remainder sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { - uint256 redistributionSupply; - uint256 redistributionPeriod; - uint256 unit; - uint256 truncatedResult; - - redistributionSupply = toRedistributionSupply(_redistribution); - - unit = (redistributionSupply * taxLevel) / 1000000; - truncatedResult = (unit * 1000000) / taxLevel; - - if (truncatedResult < redistributionSupply) { - redistributionPeriod = toRedistributionPeriod(_redistribution); // since we reuse period here, can possibly be optimized by passing period instead - redistributions[redistributionPeriod-1] &= bytes32(~maskRedistributionParticipants); // just to be safe, zero out all participant count data, in this case there will be only one - redistributions[redistributionPeriod-1] |= bytes32(maskRedistributionIsFractional | (1 << shiftRedistributionParticipants)); - } - - increaseBaseBalance(sinkAddress, unit / ppmDivider); - return unit; - } - - // sets the remainder bit for the given period and books the remainder to the sink address balance - // returns false if no change was made - function applyRemainderOnPeriod(uint256 _remainder, uint256 _period) private returns (bool) { - uint256 periodSupply; - - if (_remainder == 0) { - return false; - } - - // TODO: is this needed? - redistributions[_period-1] |= bytes32(maskRedistributionIsFractional); - - periodSupply = toRedistributionSupply(redistributions[_period-1]); - increaseBaseBalance(sinkAddress, periodSupply - _remainder); - return true; - } - - - // Calculate the time delta in whole minutes passed between given timestamp and current timestamp - function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { - return (block.timestamp - _lastTimestamp) / 60; - } - - // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (bool) { - //uint128 epochPeriodCount; - uint256 periodCount; - uint256 lastDemurrageAmount; - uint256 newDemurrageAmount; - - //epochPeriodCount = actualPeriod(); - //periodCount = epochPeriodCount - demurragePeriod; - periodCount = getMinutesDelta(demurrageTimestamp); - if (periodCount == 0) { - return false; - } - lastDemurrageAmount = demurrageAmount; - demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); - //demurragePeriod = epochPeriodCount; - demurrageTimestamp = demurrageTimestamp + (periodCount * 60); - //emit Decayed(epochPeriodCount, periodCount, lastDemurrageAmount, demurrageAmount); - emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return true; - } - - // Return timestamp of start of period threshold - function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { - return periodStart + (_periodCount * periodDuration); - } - - // Amount of demurrage cycles inbetween the current timestamp and the given target time - function demurrageCycles(uint256 _target) public view returns (uint256) { - return (block.timestamp - _target) / 60; - } - - // Recalculate the demurrage modifier for the new period - // After this, all REPORTED balances will have been reduced by the corresponding ratio (but the effecive totalsupply stays the same) - function changePeriod() public returns (bool) { - bytes32 currentRedistribution; - bytes32 nextRedistribution; - uint256 currentPeriod; - uint256 currentParticipants; - uint256 currentRemainder; - uint256 currentDemurrageAmount; - uint256 nextRedistributionDemurrage; - uint256 demurrageCounts; - uint256 periodTimestamp; - uint256 nextPeriod; - - applyDemurrage(); - - currentRedistribution = checkPeriod(); - if (currentRedistribution == bytes32(0x00)) { - return false; - } - - currentPeriod = toRedistributionPeriod(currentRedistribution); - nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - //applyDemurrage(); - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts) / ppmDivider; - } else { - nextRedistributionDemurrage = currentDemurrageAmount / ppmDivider; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); - redistributions.push(nextRedistribution); - - currentParticipants = toRedistributionParticipants(currentRedistribution); - if (currentParticipants == 0) { - currentRemainder = applyDefaultRedistribution(currentRedistribution); - } else { - currentRemainder = remainder(currentParticipants, totalSupply); // we can use totalSupply directly because it will always be the same as the recorded supply on the current redistribution - applyRemainderOnPeriod(currentRemainder, currentPeriod); - } - emit Period(nextPeriod); - return true; - } - - // Reverse a value reduced by demurrage by the given period to its original value - function growBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = 1000000; - truncatedTaxLevel = taxLevel / ppmDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / 1000000); - } - return (valueFactor * _value) / 1000000; - } - - // Calculate a value reduced by demurrage by the given period - // TODO: higher precision if possible - function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = 1000000; - truncatedTaxLevel = taxLevel / ppmDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / 1000000); - } - return (valueFactor * _value) / 1000000; - } - - // If the given account is participating in a period and that period has been crossed - // THEN increase the base value of the account with its share of the value reduction of the period - function applyRedistributionOnAccount(address _account) public returns (bool) { - bytes32 periodRedistribution; - uint256 supply; - uint256 participants; - uint256 baseValue; - uint256 value; - uint256 period; - uint256 demurrage; - - period = accountPeriod(_account); - if (period == 0 || period >= actualPeriod()) { - return false; - } - periodRedistribution = redistributions[period-1]; - participants = toRedistributionParticipants(periodRedistribution); - if (participants == 0) { - return false; - } - - supply = toRedistributionSupply(periodRedistribution); - demurrage = toRedistributionDemurrageModifier(periodRedistribution); - baseValue = ((supply / participants) * (taxLevel / 1000000)) / ppmDivider; - value = (baseValue * demurrage) / 1000000; - - // zero out period for the account - account[_account] &= bytes32(~maskAccountPeriod); - increaseBaseBalance(_account, value); - - emit Redistribution(_account, period, value); - return true; - } - - // Inflates the given amount according to the current demurrage modifier - function toBaseAmount(uint256 _value) public view returns (uint256) { - //return (_value * ppmDivider * 1000000) / toDemurrageAmount(demurrageModifier); - return (_value * ppmDivider * 1000000) / demurrageAmount; - } - - // Implements ERC20, triggers tax and/or redistribution - function approve(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] += baseValue; - emit Approval(msg.sender, _spender, _value); - return true; - } - - // Implements ERC20, triggers tax and/or redistribution - function transfer(address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - result = transferBase(msg.sender, _to, baseValue); - emit Transfer(msg.sender, _to, _value); - return result; - } - - - // Implements ERC20, triggers tax and/or redistribution - function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - require(allowance[_from][msg.sender] >= baseValue); - - result = transferBase(_from, _to, baseValue); - emit Transfer(_from, _to, _value); - return result; - } - - // ERC20 transfer backend for transfer, transferFrom - function transferBase(address _from, address _to, uint256 _value) private returns (bool) { - uint256 period; - - decreaseBaseBalance(_from, _value); - increaseBaseBalance(_to, _value); - - period = actualPeriod(); - if (_value >= minimumParticipantSpend && accountPeriod(_from) != period && _from != _to) { - registerAccountPeriod(_from, period); - } - return true; - } - - // Implements EIP173 - function transferOwnership(address _newOwner) public returns (bool) { - require(msg.sender == owner); - newOwner = _newOwner; - } - - // Implements OwnedAccepter - function acceptOwnership() public returns (bool) { - address oldOwner; - - require(msg.sender == newOwner); - oldOwner = owner; - owner = newOwner; - newOwner = address(0); - emit OwnershipTransferred(oldOwner, owner); - } - - // Implements EIP165 - function supportsInterface(bytes4 _sum) public pure returns (bool) { - if (_sum == 0xc6bb4b70) { // ERC20 - return true; - } - if (_sum == 0x449a52f8) { // Minter - return true; - } - if (_sum == 0x01ffc9a7) { // EIP165 - return true; - } - if (_sum == 0x9493f8b2) { // EIP173 - return true; - } - if (_sum == 0x37a47be4) { // OwnedAccepter - return true; - } - return false; - } -} diff --git a/solidity/DemurrageTokenMultiNocap.sol b/solidity/DemurrageTokenMultiNocap.sol deleted file mode 100644 index 439f41c..0000000 --- a/solidity/DemurrageTokenMultiNocap.sol +++ /dev/null @@ -1,614 +0,0 @@ -pragma solidity > 0.6.11; - -// SPDX-License-Identifier: GPL-3.0-or-later - -contract DemurrageTokenMultiNocap { - - // Redistribution bit field, with associated shifts and masks - // (Uses sub-byte boundaries) - bytes32[] public redistributions; // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - uint8 constant shiftRedistributionPeriod = 0; - uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 - uint8 constant shiftRedistributionValue = 32; - uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 - uint8 constant shiftRedistributionParticipants = 104; - uint256 constant maskRedistributionParticipants = 0x00000000000000000000000000000fffffffff00000000000000000000000000; // ((1 << 36) - 1) << 104 - uint8 constant shiftRedistributionDemurrage = 140; - uint256 constant maskRedistributionDemurrage = 0x000000000000000000000000fffff00000000000000000000000000000000000; // ((1 << 20) - 1) << 140 - uint8 constant shiftRedistributionIsFractional = 255; - uint256 constant maskRedistributionIsFractional = 0x8000000000000000000000000000000000000000000000000000000000000000; // 1 << 255 - - // Account bit field, with associated shifts and masks - // Mirrors structure of redistributions for consistency - mapping (address => bytes32) account; // uint152(unused) | uint32(period) | uint72(value) - uint8 constant shiftAccountValue = 0; - uint256 constant maskAccountValue = 0x0000000000000000000000000000000000000000000000ffffffffffffffffff; // (1 << 72) - 1 - uint8 constant shiftAccountPeriod = 72; - uint256 constant maskAccountPeriod = 0x00000000000000000000000000000000000000ffffffff000000000000000000; // ((1 << 32) - 1) << 72 - - // Cached demurrage amount, ppm with 38 digit resolution - uint128 public demurrageAmount; - - // Cached demurrage period; the period for which demurrageAmount was calculated - uint128 public demurragePeriod; - - // Implements EIP172 - address public owner; - - address newOwner; - - // Implements ERC20 - string public name; - - // Implements ERC20 - string public symbol; - - // Implements ERC20 - uint256 public decimals; - - // Implements ERC20 - uint256 public totalSupply; - - // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - uint256 public minimumParticipantSpend; - - // 128 bit resolution of the demurrage divisor - // (this constant x 1000000 is contained within 128 bits) - uint256 constant ppmDivider = 100000000000000000000000000000000; - - // demurrage decimal width; 38 places - uint256 public immutable resolutionFactor = ppmDivider * 1000000; - - // Timestamp of start of periods (time which contract constructor was called) - uint256 public immutable periodStart; - - // Duration of a single redistribution period in seconds - uint256 public immutable periodDuration; - - // Demurrage in ppm per minute - uint256 public immutable taxLevel; - - // Addresses allowed to mint new tokens - mapping (address => bool) minter; - - // Storage for ERC20 approve/transferFrom methods - mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage) - - // Address to send unallocated redistribution tokens - address sinkAddress; - - // Implements ERC20 - event Transfer(address indexed _from, address indexed _to, uint256 _value); - - // Implements ERC20 - event Approval(address indexed _owner, address indexed _spender, uint256 _value); - - // New tokens minted - event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); - - // New demurrage cache milestone calculated - event Decayed(uint256 indexed _period, uint256 indexed _periodCount, uint256 indexed _oldAmount, uint256 _newAmount); - - // When a new period threshold has been crossed - event Period(uint256 _period); - - // Redistribution applied on a single eligible account - event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value); - - // Temporary event used in development, will be removed on prod - event Debug(bytes32 _foo); - - // EIP173 - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - - constructor(string memory _name, string memory _symbol, uint8 _decimals, uint256 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress) public { - // ACL setup - owner = msg.sender; - minter[owner] = true; - - // ERC20 setup - name = _name; - symbol = _symbol; - decimals = _decimals; - - // Demurrage setup - periodStart = block.timestamp; - periodDuration = _periodMinutes * 60; - demurrageAmount = uint128(ppmDivider * 1000000); // Represents 38 decimal places - demurragePeriod = 1; - taxLevel = _taxLevelMinute; // Represents 38 decimal places - bytes32 initialRedistribution = toRedistribution(0, 1000000, 0, 1); - redistributions.push(initialRedistribution); - - // Misc settings - sinkAddress = _defaultSinkAddress; - minimumParticipantSpend = 10 ** uint256(_decimals); - } - - // Given address will be allowed to call the mintTo() function - function addMinter(address _minter) public returns (bool) { - require(msg.sender == owner); - minter[_minter] = true; - return true; - } - - // Given address will no longer be allowed to call the mintTo() function - function removeMinter(address _minter) public returns (bool) { - require(msg.sender == owner || _minter == msg.sender); - minter[_minter] = false; - return true; - } - - /// Implements ERC20 - function balanceOf(address _account) public view returns (uint256) { - uint256 baseBalance; - uint256 currentDemurragedAmount; - uint256 periodCount; - - baseBalance = baseBalanceOf(_account); - - periodCount = actualPeriod() - demurragePeriod; - - currentDemurragedAmount = uint128(decayBy(demurrageAmount, periodCount)); - - return (baseBalance * currentDemurragedAmount) / (ppmDivider * 1000000); - } - - /// Balance unmodified by demurrage - function baseBalanceOf(address _account) public view returns (uint256) { - return uint256(account[_account]) & maskAccountValue; - } - - /// Increases base balance for a single account - function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - newBalance = oldBalance + _delta; - require(uint160(newBalance) > uint160(oldBalance), 'ERR_WOULDWRAP'); // revert if increase would result in a wrapped value - workAccount &= (~maskAccountValue); - workAccount |= (newBalance & maskAccountValue); - account[_account] = bytes32(workAccount); - return true; - } - - /// Decreases base balance for a single account - function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard - newBalance = oldBalance - _delta; - workAccount &= (~maskAccountValue); - workAccount |= (newBalance & maskAccountValue); - account[_account] = bytes32(workAccount); - return true; - } - - // Creates new tokens out of thin air, and allocates them to the given address - // Triggers tax - function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { - uint256 baseAmount; - - require(minter[msg.sender]); - - changePeriod(); - baseAmount = _amount; - totalSupply += _amount; - increaseBaseBalance(_beneficiary, baseAmount); - emit Mint(msg.sender, _beneficiary, _amount); - saveRedistributionSupply(); - return true; - } - - // Deserializes the redistribution word - // uint1(isFractional) | uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) private pure returns(bytes32) { - bytes32 redistribution; - - redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); - redistribution |= bytes32((_participants << shiftRedistributionParticipants) & maskRedistributionParticipants); - redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); - redistribution |= bytes32(_period & maskRedistributionPeriod); - return redistribution; - } - - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution) & maskRedistributionPeriod; - } - - // Serializes the supply part of the redistribution word - function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionValue) >> shiftRedistributionValue; - } - - // Serializes the number of participants part of the redistribution word - function toRedistributionParticipants(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionParticipants) >> shiftRedistributionParticipants; - } - - // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; - } - - // Client accessor to the redistributions array length - function redistributionCount() public view returns (uint256) { - return redistributions.length; - } - - // Add number of participants for the current redistribution period by one - function incrementRedistributionParticipants() private returns (bool) { - bytes32 currentRedistribution; - uint256 tmpRedistribution; - uint256 participants; - - currentRedistribution = redistributions[redistributions.length-1]; - participants = toRedistributionParticipants(currentRedistribution) + 1; - tmpRedistribution = uint256(currentRedistribution); - tmpRedistribution &= (~maskRedistributionParticipants); - tmpRedistribution |= ((participants << shiftRedistributionParticipants) & maskRedistributionParticipants); - - redistributions[redistributions.length-1] = bytes32(tmpRedistribution); - - return true; - } - - // Save the current total supply amount to the current redistribution period - function saveRedistributionSupply() private returns (bool) { - uint256 currentRedistribution; - - currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= (~maskRedistributionValue); - currentRedistribution |= (totalSupply << shiftRedistributionValue); - - redistributions[redistributions.length-1] = bytes32(currentRedistribution); - return true; - } - - // Get the demurrage period of the current block number - function actualPeriod() public view returns (uint128) { - return uint128((block.timestamp - periodStart) / periodDuration + 1); - } - - // Add an entered demurrage period to the redistribution array - function checkPeriod() private view returns (bytes32) { - bytes32 lastRedistribution; - uint256 currentPeriod; - - lastRedistribution = redistributions[redistributions.length-1]; - currentPeriod = this.actualPeriod(); - if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return bytes32(0x00); - } - return lastRedistribution; - } - - // Deserialize the pemurrage period for the given account is participating in - function accountPeriod(address _account) public view returns (uint256) { - return (uint256(account[_account]) & maskAccountPeriod) >> shiftAccountPeriod; - } - - // Save the given demurrage period as the currently participation period for the given address - function registerAccountPeriod(address _account, uint256 _period) private returns (bool) { - account[_account] &= bytes32(~maskAccountPeriod); - account[_account] |= bytes32((_period << shiftAccountPeriod) & maskAccountPeriod); - incrementRedistributionParticipants(); - return true; - } - - // Determine whether the unit number is rounded down, rounded up or evenly divides. - // Returns 0 if evenly distributed, or the remainder as a positive number - // A _numParts value 0 will be interpreted as the value 1 - function remainder(uint256 _numParts, uint256 _sumWhole) public pure returns (uint256) { - uint256 unit; - uint256 truncatedResult; - - if (_numParts == 0) { // no division by zero please - revert('ERR_NUMPARTS_ZERO'); - } - require(_numParts < _sumWhole); // At least you are never LESS than the sum of your parts. Think about that. - - unit = _sumWhole / _numParts; - truncatedResult = unit * _numParts; - return _sumWhole - truncatedResult; - } - - // Called in the edge case where participant number is 0. It will override the participant count to 1. - // Returns the remainder sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { - uint256 redistributionSupply; - uint256 redistributionPeriod; - uint256 unit; - uint256 truncatedResult; - - redistributionSupply = toRedistributionSupply(_redistribution); - - unit = (redistributionSupply * taxLevel) / 1000000; - truncatedResult = (unit * 1000000) / taxLevel; - - if (truncatedResult < redistributionSupply) { - redistributionPeriod = toRedistributionPeriod(_redistribution); // since we reuse period here, can possibly be optimized by passing period instead - redistributions[redistributionPeriod-1] &= bytes32(~maskRedistributionParticipants); // just to be safe, zero out all participant count data, in this case there will be only one - redistributions[redistributionPeriod-1] |= bytes32(maskRedistributionIsFractional | (1 << shiftRedistributionParticipants)); - } - - increaseBaseBalance(sinkAddress, unit / ppmDivider); - return unit; - } - - // sets the remainder bit for the given period and books the remainder to the sink address balance - // returns false if no change was made - function applyRemainderOnPeriod(uint256 _remainder, uint256 _period) private returns (bool) { - uint256 periodSupply; - - if (_remainder == 0) { - return false; - } - - // TODO: is this needed? - redistributions[_period-1] |= bytes32(maskRedistributionIsFractional); - - periodSupply = toRedistributionSupply(redistributions[_period-1]); - increaseBaseBalance(sinkAddress, periodSupply - _remainder); - return true; - } - - - // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (bool) { - uint128 epochPeriodCount; - uint128 periodCount; - uint256 lastDemurrageAmount; - uint256 newDemurrageAmount; - - epochPeriodCount = actualPeriod(); - periodCount = epochPeriodCount - demurragePeriod; - if (periodCount == 0) { - return false; - } - lastDemurrageAmount = demurrageAmount; - demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); - demurragePeriod = epochPeriodCount; - emit Decayed(epochPeriodCount, periodCount, lastDemurrageAmount, demurrageAmount); - return true; - } - - // Return timestamp of start of period threshold - function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { - return periodStart + (_periodCount * periodDuration); - } - - // Amount of demurrage cycles inbetween the current timestamp and the given target time - function demurrageCycles(uint256 _target) public view returns (uint256) { - return (block.timestamp - _target) / 60; - } - - // Recalculate the demurrage modifier for the new period - // After this, all REPORTED balances will have been reduced by the corresponding ratio (but the effecive totalsupply stays the same) - function changePeriod() public returns (bool) { - bytes32 currentRedistribution; - bytes32 nextRedistribution; - uint256 currentPeriod; - uint256 currentParticipants; - uint256 currentRemainder; - uint256 currentDemurrageAmount; - uint256 nextRedistributionDemurrage; - uint256 demurrageCounts; - uint256 periodTimestamp; - uint256 nextPeriod; - - currentRedistribution = checkPeriod(); - if (currentRedistribution == bytes32(0x00)) { - return false; - } - - currentPeriod = toRedistributionPeriod(currentRedistribution); - nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - applyDemurrage(); - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts) / ppmDivider; - } else { - nextRedistributionDemurrage = currentDemurrageAmount / ppmDivider; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); - redistributions.push(nextRedistribution); - - currentParticipants = toRedistributionParticipants(currentRedistribution); - if (currentParticipants == 0) { - currentRemainder = applyDefaultRedistribution(currentRedistribution); - } else { - currentRemainder = remainder(currentParticipants, totalSupply); // we can use totalSupply directly because it will always be the same as the recorded supply on the current redistribution - applyRemainderOnPeriod(currentRemainder, currentPeriod); - } - emit Period(nextPeriod); - return true; - } - - // Reverse a value reduced by demurrage by the given period to its original value - function growBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = 1000000; - truncatedTaxLevel = taxLevel / ppmDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / 1000000); - } - return (valueFactor * _value) / 1000000; - } - - // Calculate a value reduced by demurrage by the given period - // TODO: higher precision if possible - function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = 1000000; - truncatedTaxLevel = taxLevel / ppmDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / 1000000); - } - return (valueFactor * _value) / 1000000; - } - - // If the given account is participating in a period and that period has been crossed - // THEN increase the base value of the account with its share of the value reduction of the period - function applyRedistributionOnAccount(address _account) public returns (bool) { - bytes32 periodRedistribution; - uint256 supply; - uint256 participants; - uint256 baseValue; - uint256 value; - uint256 period; - uint256 demurrage; - - period = accountPeriod(_account); - if (period == 0 || period >= actualPeriod()) { - return false; - } - periodRedistribution = redistributions[period-1]; - participants = toRedistributionParticipants(periodRedistribution); - if (participants == 0) { - return false; - } - - supply = toRedistributionSupply(periodRedistribution); - demurrage = toRedistributionDemurrageModifier(periodRedistribution); - baseValue = ((supply / participants) * (taxLevel / 1000000)) / ppmDivider; - value = (baseValue * demurrage) / 1000000; - - // zero out period for the account - account[_account] &= bytes32(~maskAccountPeriod); - increaseBaseBalance(_account, value); - - emit Redistribution(_account, period, value); - return true; - } - - // Inflates the given amount according to the current demurrage modifier - function toBaseAmount(uint256 _value) public view returns (uint256) { - //return (_value * ppmDivider * 1000000) / toDemurrageAmount(demurrageModifier); - return (_value * ppmDivider * 1000000) / demurrageAmount; - } - - // Implements ERC20, triggers tax and/or redistribution - function approve(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] += baseValue; - emit Approval(msg.sender, _spender, _value); - return true; - } - - // Implements ERC20, triggers tax and/or redistribution - function transfer(address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - result = transferBase(msg.sender, _to, baseValue); - emit Transfer(msg.sender, _to, _value); - return result; - } - - - // Implements ERC20, triggers tax and/or redistribution - function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - applyRedistributionOnAccount(msg.sender); - - baseValue = toBaseAmount(_value); - require(allowance[_from][msg.sender] >= baseValue); - - result = transferBase(_from, _to, baseValue); - emit Transfer(_from, _to, _value); - return result; - } - - // ERC20 transfer backend for transfer, transferFrom - function transferBase(address _from, address _to, uint256 _value) private returns (bool) { - uint256 period; - - decreaseBaseBalance(_from, _value); - increaseBaseBalance(_to, _value); - - period = actualPeriod(); - if (_value >= minimumParticipantSpend && accountPeriod(_from) != period && _from != _to) { - registerAccountPeriod(_from, period); - } - return true; - } - - // Implements EIP173 - function transferOwnership(address _newOwner) public returns (bool) { - require(msg.sender == owner); - newOwner = _newOwner; - } - - // Implements OwnedAccepter - function acceptOwnership() public returns (bool) { - address oldOwner; - - require(msg.sender == newOwner); - oldOwner = owner; - owner = newOwner; - newOwner = address(0); - emit OwnershipTransferred(oldOwner, owner); - } - - // Implements EIP165 - function supportsInterface(bytes4 _sum) public pure returns (bool) { - if (_sum == 0xc6bb4b70) { // ERC20 - return true; - } - if (_sum == 0x449a52f8) { // Minter - return true; - } - if (_sum == 0x01ffc9a7) { // EIP165 - return true; - } - if (_sum == 0x9493f8b2) { // EIP173 - return true; - } - if (_sum == 0x37a47be4) { // OwnedAccepter - return true; - } - return false; - } -} diff --git a/solidity/DemurrageTokenSingleCap.sol b/solidity/DemurrageTokenSingleCap.sol deleted file mode 100644 index f33fc35..0000000 --- a/solidity/DemurrageTokenSingleCap.sol +++ /dev/null @@ -1,517 +0,0 @@ -pragma solidity > 0.6.11; - -// SPDX-License-Identifier: GPL-3.0-or-later - -contract DemurrageTokenSingleCap { - - // Redistribution bit field, with associated shifts and masks - // (Uses sub-byte boundaries) - bytes32[] public redistributions; // uint51(unused) | uint64(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - uint8 constant shiftRedistributionPeriod = 0; - uint256 constant maskRedistributionPeriod = 0x00000000000000000000000000000000000000000000000000000000ffffffff; // (1 << 32) - 1 - uint8 constant shiftRedistributionValue = 32; - uint256 constant maskRedistributionValue = 0x00000000000000000000000000000000000000ffffffffffffffffff00000000; // ((1 << 72) - 1) << 32 - uint8 constant shiftRedistributionDemurrage = 104; - uint256 constant maskRedistributionDemurrage = 0x0000000000ffffffffffffffffffffffffffff00000000000000000000000000; // ((1 << 20) - 1) << 140 - - // Account balances - mapping (address => uint256) account; - - // Cached demurrage amount, ppm with 38 digit resolution - uint128 public demurrageAmount; - - // Cached demurrage period; the period for which demurrageAmount was calculated - //uint128 public demurragePeriod; - // Cached demurrage timestamp; the timestamp for which demurrageAmount was last calculated - uint256 public demurrageTimestamp; - - // Implements EIP172 - address public owner; - - address newOwner; - - // Implements ERC20 - string public name; - - // Implements ERC20 - string public symbol; - - // Implements ERC20 - uint256 public decimals; - - // Implements ERC20 - uint256 public totalSupply; - - // Maximum amount of tokens that can be minted - uint256 public supplyCap; - - // Minimum amount of (demurraged) tokens an account must spend to participate in redistribution for a particular period - uint256 public minimumParticipantSpend; - - // 128 bit resolution of the demurrage divisor - // (this constant x 1000000 is contained within 128 bits) - uint256 constant nanoDivider = 100000000000000000000000000; // now nanodivider, 6 zeros less - - // remaining decimal positions of nanoDivider to reach 38, equals precision in growth and decay - uint256 constant growthResolutionFactor = 1000000000000; - - // demurrage decimal width; 38 places - uint256 public immutable resolutionFactor = nanoDivider * growthResolutionFactor; - - // Timestamp of start of periods (time which contract constructor was called) - uint256 public immutable periodStart; - - // Duration of a single redistribution period in seconds - uint256 public immutable periodDuration; - - // Demurrage in ppm per minute - uint256 public immutable taxLevel; - - // Addresses allowed to mint new tokens - mapping (address => bool) minter; - - // Storage for ERC20 approve/transferFrom methods - mapping (address => mapping (address => uint256 ) ) allowance; // holder -> spender -> amount (amount is subject to demurrage) - - // Address to send unallocated redistribution tokens - address sinkAddress; - - // Implements ERC20 - event Transfer(address indexed _from, address indexed _to, uint256 _value); - - // Implements ERC20 - event Approval(address indexed _owner, address indexed _spender, uint256 _value); - - // New tokens minted - event Mint(address indexed _minter, address indexed _beneficiary, uint256 _value); - - // New demurrage cache milestone calculated - event Decayed(uint256 indexed _period, uint256 indexed _periodCount, uint256 indexed _oldAmount, uint256 _newAmount); - - // When a new period threshold has been crossed - event Period(uint256 _period); - - // Redistribution applied on a single eligible account - event Redistribution(address indexed _account, uint256 indexed _period, uint256 _value); - - // Temporary event used in development, will be removed on prod - event Debug(bytes32 _foo); - - // EIP173 - event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - - constructor(string memory _name, string memory _symbol, uint8 _decimals, uint128 _taxLevelMinute, uint256 _periodMinutes, address _defaultSinkAddress, uint256 _supplyCap) public { - // ACL setup - owner = msg.sender; - minter[owner] = true; - - // ERC20 setup - name = _name; - symbol = _symbol; - decimals = _decimals; - - // Demurrage setup - demurrageTimestamp = block.timestamp; - periodStart = demurrageTimestamp; - periodDuration = _periodMinutes * 60; - //demurrageAmount = 100000000000000000000000000000000000000 - _taxLevelMinute; // Represents 38 decimal places, same as resolutionFactor - //demurrageAmount = 100000000000000000000000000000000000000; - demurrageAmount = 10000000000000000000000000000; - //demurragePeriod = 1; - taxLevel = _taxLevelMinute; // Represents 38 decimal places - bytes32 initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); - redistributions.push(initialRedistribution); - - // Misc settings - supplyCap = _supplyCap; - sinkAddress = _defaultSinkAddress; - minimumParticipantSpend = 10 ** uint256(_decimals); - } - - // Change sink address for redistribution - function setSinkAddress(address _sinkAddress) public { - require(msg.sender == owner); - sinkAddress = _sinkAddress; - } - - // Given address will be allowed to call the mintTo() function - function addMinter(address _minter) public returns (bool) { - require(msg.sender == owner); - minter[_minter] = true; - return true; - } - - // Given address will no longer be allowed to call the mintTo() function - function removeMinter(address _minter) public returns (bool) { - require(msg.sender == owner || _minter == msg.sender); - minter[_minter] = false; - return true; - } - - /// Implements ERC20 - function balanceOf(address _account) public view returns (uint256) { - uint256 baseBalance; - uint256 currentDemurragedAmount; - uint256 periodCount; - - baseBalance = baseBalanceOf(_account); - - //periodCount = actualPeriod() - demurragePeriod; - periodCount = getMinutesDelta(demurrageTimestamp); - - currentDemurragedAmount = uint128(decayBy(demurrageAmount * 10000000000, periodCount)); - - return (baseBalance * currentDemurragedAmount) / (nanoDivider * 1000000000000); - } - - /// Balance unmodified by demurrage - function baseBalanceOf(address _account) public view returns (uint256) { - return account[_account]; - } - - /// Increases base balance for a single account - function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - account[_account] = oldBalance + _delta; - return true; - } - - /// Decreases base balance for a single account - function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { - uint256 oldBalance; - uint256 newBalance; - uint256 workAccount; - - workAccount = uint256(account[_account]); - - if (_delta == 0) { - return false; - } - - oldBalance = baseBalanceOf(_account); - require(oldBalance >= _delta, 'ERR_OVERSPEND'); // overspend guard - account[_account] = oldBalance - _delta; - return true; - } - - // Creates new tokens out of thin air, and allocates them to the given address - // Triggers tax - function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { - uint256 baseAmount; - - require(minter[msg.sender], 'ERR_ACCESS'); - require(_amount + totalSupply <= supplyCap, 'ERR_CAP'); - - changePeriod(); - baseAmount = toBaseAmount(_amount); - totalSupply += _amount; - increaseBaseBalance(_beneficiary, baseAmount); - emit Mint(msg.sender, _beneficiary, _amount); - saveRedistributionSupply(); - return true; - } - - // Deserializes the redistribution word - // uint95(unused) | uint20(demurrageModifier) | uint36(participants) | uint72(value) | uint32(period) - function toRedistribution(uint256 _participants, uint256 _demurrageModifierPpm, uint256 _value, uint256 _period) public pure returns(bytes32) { - bytes32 redistribution; - - redistribution |= bytes32((_demurrageModifierPpm << shiftRedistributionDemurrage) & maskRedistributionDemurrage); - redistribution |= bytes32((_value << shiftRedistributionValue) & maskRedistributionValue); - redistribution |= bytes32(_period & maskRedistributionPeriod); - return redistribution; - } - - // Serializes the demurrage period part of the redistribution word - function toRedistributionPeriod(bytes32 redistribution) public pure returns (uint256) { - return uint256(redistribution) & maskRedistributionPeriod; - } - - // Serializes the supply part of the redistribution word - function toRedistributionSupply(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionValue) >> shiftRedistributionValue; - } - - // Serializes the number of participants part of the redistribution word - function toRedistributionDemurrageModifier(bytes32 redistribution) public pure returns (uint256) { - return (uint256(redistribution) & maskRedistributionDemurrage) >> shiftRedistributionDemurrage; - } - - // Client accessor to the redistributions array length - function redistributionCount() public view returns (uint256) { - return redistributions.length; - } - - // Save the current total supply amount to the current redistribution period - function saveRedistributionSupply() private returns (bool) { - uint256 currentRedistribution; - uint256 grownSupply; - - //grownSupply = growBy(totalSupply, 1); - grownSupply = totalSupply; - currentRedistribution = uint256(redistributions[redistributions.length-1]); - currentRedistribution &= (~maskRedistributionValue); - currentRedistribution |= (grownSupply << shiftRedistributionValue); - - redistributions[redistributions.length-1] = bytes32(currentRedistribution); - return true; - } - - // Get the demurrage period of the current block number - function actualPeriod() public view returns (uint128) { - return uint128((block.timestamp - periodStart) / periodDuration + 1); - } - - // Add an entered demurrage period to the redistribution array - function checkPeriod() private view returns (bytes32) { - bytes32 lastRedistribution; - uint256 currentPeriod; - - lastRedistribution = redistributions[redistributions.length-1]; - currentPeriod = this.actualPeriod(); - if (currentPeriod <= toRedistributionPeriod(lastRedistribution)) { - return bytes32(0x00); - } - return lastRedistribution; - } - - function getDistribution(uint256 _supply, uint256 _demurrageAmount) public view returns (uint256) { - uint256 difference; - - difference = _supply * (resolutionFactor - (_demurrageAmount * 10000000000)); //(nanoDivider - ((resolutionFactor - _demurrageAmount) / nanoDivider)); - return difference / resolutionFactor; - } - - function getDistributionFromRedistribution(bytes32 _redistribution) public returns (uint256) { - uint256 redistributionSupply; - uint256 redistributionDemurrage; - - redistributionSupply = toRedistributionSupply(_redistribution); - redistributionDemurrage = toRedistributionDemurrageModifier(_redistribution); - return getDistribution(redistributionSupply, redistributionDemurrage); - } - - // Returns the amount sent to the sink address - function applyDefaultRedistribution(bytes32 _redistribution) private returns (uint256) { - uint256 unit; - - unit = getDistributionFromRedistribution(_redistribution); - increaseBaseBalance(sinkAddress, toBaseAmount(unit)); - return unit; - } - - // Calculate the time delta in whole minutes passed between given timestamp and current timestamp - function getMinutesDelta(uint256 _lastTimestamp) public view returns (uint256) { - return (block.timestamp - _lastTimestamp) / 60; - } - - // Calculate and cache the demurrage value corresponding to the (period of the) time of the method call - function applyDemurrage() public returns (bool) { - return applyDemurrageLimited(0); - } - - function applyDemurrageLimited(uint256 _rounds) public returns (bool) { - //uint128 epochPeriodCount; - uint256 periodCount; - uint256 lastDemurrageAmount; - - //epochPeriodCount = actualPeriod(); - //periodCount = epochPeriodCount - demurragePeriod; - - periodCount = getMinutesDelta(demurrageTimestamp); - if (periodCount == 0) { - return false; - } - lastDemurrageAmount = demurrageAmount; - // safety limit for exponential calculation to ensure that we can always - // execute this code no matter how much time passes. - if (_rounds > 0 && _rounds < periodCount) { - periodCount = _rounds; - } - - demurrageAmount = uint128(decayBy(lastDemurrageAmount, periodCount)); - //demurragePeriod = epochPeriodCount; - demurrageTimestamp = demurrageTimestamp + (periodCount * 60); - emit Decayed(demurrageTimestamp, periodCount, lastDemurrageAmount, demurrageAmount); - return true; - } - - // Return timestamp of start of period threshold - function getPeriodTimeDelta(uint256 _periodCount) public view returns (uint256) { - return periodStart + (_periodCount * periodDuration); - } - - // Amount of demurrage cycles inbetween the current timestamp and the given target time - function demurrageCycles(uint256 _target) public view returns (uint256) { - return (block.timestamp - _target) / 60; - } - - // Recalculate the demurrage modifier for the new period - function changePeriod() public returns (bool) { - bytes32 currentRedistribution; - bytes32 nextRedistribution; - uint256 currentPeriod; - uint256 currentDemurrageAmount; - uint256 nextRedistributionDemurrage; - uint256 demurrageCounts; - uint256 periodTimestamp; - uint256 nextPeriod; - - applyDemurrage(); - currentRedistribution = checkPeriod(); - if (currentRedistribution == bytes32(0x00)) { - return false; - } - - currentPeriod = toRedistributionPeriod(currentRedistribution); - nextPeriod = currentPeriod + 1; - periodTimestamp = getPeriodTimeDelta(currentPeriod); - - currentDemurrageAmount = demurrageAmount; - - demurrageCounts = demurrageCycles(periodTimestamp); - if (demurrageCounts > 0) { - nextRedistributionDemurrage = growBy(currentDemurrageAmount, demurrageCounts); - } else { - nextRedistributionDemurrage = currentDemurrageAmount; - } - - nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply, nextPeriod); - redistributions.push(nextRedistribution); - - applyDefaultRedistribution(nextRedistribution); - emit Period(nextPeriod); - return true; - } - - // Reverse a value reduced by demurrage by the given period to its original value - function growBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = growthResolutionFactor; - truncatedTaxLevel = taxLevel / nanoDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor + ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); - } - return (valueFactor * _value) / growthResolutionFactor; - } - - // Calculate a value reduced by demurrage by the given period - function decayBy(uint256 _value, uint256 _period) public view returns (uint256) { - uint256 valueFactor; - uint256 truncatedTaxLevel; - - valueFactor = growthResolutionFactor; - truncatedTaxLevel = taxLevel / nanoDivider; - - for (uint256 i = 0; i < _period; i++) { - valueFactor = valueFactor - ((valueFactor * truncatedTaxLevel) / growthResolutionFactor); - } - return (valueFactor * _value) / growthResolutionFactor; - } - - // Inflates the given amount according to the current demurrage modifier - function toBaseAmount(uint256 _value) public view returns (uint256) { - return (_value * resolutionFactor) / (demurrageAmount * 10000000000); - } - - // Implements ERC20, triggers tax and/or redistribution - function approve(address _spender, uint256 _value) public returns (bool) { - uint256 baseValue; - - changePeriod(); - - baseValue = toBaseAmount(_value); - allowance[msg.sender][_spender] += baseValue; - emit Approval(msg.sender, _spender, _value); - return true; - } - - // Implements ERC20, triggers tax and/or redistribution - function transfer(address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - - baseValue = toBaseAmount(_value); - result = transferBase(msg.sender, _to, baseValue); - emit Transfer(msg.sender, _to, _value); - return result; - } - - // Implements ERC20, triggers tax and/or redistribution - function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { - uint256 baseValue; - bool result; - - changePeriod(); - - baseValue = toBaseAmount(_value); - require(allowance[_from][msg.sender] >= baseValue); - - result = transferBase(_from, _to, baseValue); - emit Transfer(_from, _to, _value); - return result; - } - - // ERC20 transfer backend for transfer, transferFrom - function transferBase(address _from, address _to, uint256 _value) private returns (bool) { - uint256 period; - - decreaseBaseBalance(_from, _value); - increaseBaseBalance(_to, _value); - - //period = actualPeriod(); - return true; - } - - // Implements EIP173 - function transferOwnership(address _newOwner) public returns (bool) { - require(msg.sender == owner); - newOwner = _newOwner; - } - - // Implements OwnedAccepter - function acceptOwnership() public returns (bool) { - address oldOwner; - - require(msg.sender == newOwner); - oldOwner = owner; - owner = newOwner; - newOwner = address(0); - emit OwnershipTransferred(oldOwner, owner); - } - - // Implements EIP165 - function supportsInterface(bytes4 _sum) public pure returns (bool) { - if (_sum == 0xc6bb4b70) { // ERC20 - return true; - } - if (_sum == 0x449a52f8) { // Minter - return true; - } - if (_sum == 0x01ffc9a7) { // EIP165 - return true; - } - if (_sum == 0x9493f8b2) { // EIP173 - return true; - } - if (_sum == 0x37a47be4) { // OwnedAccepter - return true; - } - return false; - } -} diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index a7ee90c..71f36b1 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -189,12 +189,11 @@ contract DemurrageTokenSingleCap { function setMaxSupply(uint256 _cap) public { require(!isSealed(CAP_STATE)); require(msg.sender == owner); - require(_cap > supply); + require(_cap > totalSupply()); emit Cap(maxSupply, _cap); maxSupply = _cap; } - // Change sink address for redistribution function setSinkAddress(address _sinkAddress) public { require(!isSealed(SINK_STATE)); diff --git a/solidity/Makefile b/solidity/Makefile index ae47778..74d8566 100644 --- a/solidity/Makefile +++ b/solidity/Makefile @@ -2,29 +2,12 @@ SOLC = /usr/bin/solc all: single_nocap -multi_nocap: - $(SOLC) DemurrageTokenMultiNocap.sol --abi --evm-version byzantium | awk 'NR>3' > DemurrageTokenMultiNocap.json - $(SOLC) DemurrageTokenMultiNocap.sol --bin --evm-version byzantium | awk 'NR>3' > DemurrageTokenMultiNocap.bin - truncate -s -1 DemurrageTokenMultiNocap.bin - -multi_cap: - $(SOLC) DemurrageTokenMultiCap.sol --abi --evm-version byzantium | awk 'NR>3' > DemurrageTokenMultiCap.json - $(SOLC) DemurrageTokenMultiCap.sol --bin --evm-version byzantium | awk 'NR>3' > DemurrageTokenMultiCap.bin - truncate -s -1 DemurrageTokenMultiCap.bin - -multi: multi_nocap multi_cap - single_nocap: $(SOLC) DemurrageTokenSingleNocap.sol --abi --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.json $(SOLC) DemurrageTokenSingleNocap.sol --bin --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.bin truncate -s -1 DemurrageTokenSingleNocap.bin -single_cap: - $(SOLC) DemurrageTokenSingleCap.sol --abi --evm-version byzantium | awk 'NR>3' > DemurrageTokenSingleCap.json - $(SOLC) DemurrageTokenSingleCap.sol --bin --evm-version byzantium | awk 'NR>3' > DemurrageTokenSingleCap.bin - truncate -s -1 DemurrageTokenSingleCap.bin - -single: single_nocap single_cap +single: single_nocap test: all python ../python/tests/test_basic.py From 5d79399f21ef8df87f36841b7d572d45644e253b Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 16:19:03 +0000 Subject: [PATCH 33/57] Finish removing redundant tests --- python/CHANGELOG | 1 + python/run_tests.sh | 2 +- python/tests/test_remainder.py | 70 ---------------------------------- 3 files changed, 2 insertions(+), 71 deletions(-) delete mode 100644 python/tests/test_remainder.py diff --git a/python/CHANGELOG b/python/CHANGELOG index 33dda13..4976f3c 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -4,6 +4,7 @@ * Add sealable features for supply, sink address, expiry and minters (when sealed cannot be changed) * Deployer script now takes demurrage amount as ppm instead of literal growth fraction * Retire old multi and cap contracts + * Replace contract bitfields for redistributions with structs - 0.1.1 * Settable demurrage steps for apply demurrage cli tool - 0.1.0 diff --git a/python/run_tests.sh b/python/run_tests.sh index b8e4beb..8c034d9 100644 --- a/python/run_tests.sh +++ b/python/run_tests.sh @@ -6,7 +6,7 @@ set -x default_pythonpath=$PYTHONPATH:. export PYTHONPATH=${default_pythonpath:-.} >&2 echo using pythonpath $PYTHONPATH -for f in `ls tests/*.py`; do +for f in `ls tests/test_*.py`; do python $f done set +x diff --git a/python/tests/test_remainder.py b/python/tests/test_remainder.py deleted file mode 100644 index 2155520..0000000 --- a/python/tests/test_remainder.py +++ /dev/null @@ -1,70 +0,0 @@ -# standard imports -import os -import unittest -import json -import logging -import math - -# external imports -from chainlib.eth.constant import ZERO_ADDRESS -from chainlib.eth.nonce import RPCNonceOracle -from chainlib.eth.tx import receipt -from chainlib.error import JSONRPCException -import eth_tester - -# local imports -from erc20_demurrage_token import DemurrageToken - -# test imports -from erc20_demurrage_token.unittest.base import TestDemurrageDefault - -logging.basicConfig(level=logging.DEBUG) -logg = logging.getLogger() - -testdir = os.path.dirname(__file__) - - -class Test(TestDemurrageDefault): - - def test_fractional_state(self): - nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) - c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - - with self.assertRaises(JSONRPCException): - o = c.remainder(self.address, 2, 1, sender_address=self.accounts[0]) - self.rpc.do(o) - - with self.assertRaises(JSONRPCException): - o = c.remainder(self.address, 0, 100001, sender_address=self.accounts[0]) - self.rpc.do(o) - - o = c.remainder(self.address, 1, 2, sender_address=self.accounts[0]) - r = self.rpc.do(o) - remainder = c.parse_remainder(r) - self.assertEqual(remainder, 0); - - whole = 5000001 - parts = 20000 - expect = whole - (math.floor(whole/parts) * parts) - o = c.remainder(self.address, parts, whole, sender_address=self.accounts[0]) - r = self.rpc.do(o) - remainder = c.parse_remainder(r) - self.assertEqual(remainder, expect) - - parts = 30000 - expect = whole - (math.floor(whole/parts) * parts) - o = c.remainder(self.address, parts, whole, sender_address=self.accounts[0]) - r = self.rpc.do(o) - remainder = c.parse_remainder(r) - self.assertEqual(remainder, expect) - - parts = 40001 - expect = whole - (math.floor(whole/parts) * parts) - o = c.remainder(self.address, parts, whole, sender_address=self.accounts[0]) - r = self.rpc.do(o) - remainder = c.parse_remainder(r) - self.assertEqual(remainder, expect) - - -if __name__ == '__main__': - unittest.main() From 1b167f8dd1dcfe276871ec30a0387b29502a616d Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 16:33:36 +0000 Subject: [PATCH 34/57] Bump version --- python/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.cfg b/python/setup.cfg index dd9ec7d..025b473 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.1.1 +version = 0.3.0 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From cc1d4c811b090f577f0c57099fbb0a80fc7b1845 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 16:48:08 +0000 Subject: [PATCH 35/57] Remove dead console script entry --- python/setup.cfg | 1 - 1 file changed, 1 deletion(-) diff --git a/python/setup.cfg b/python/setup.cfg index 025b473..245ac83 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -41,4 +41,3 @@ packages = [options.entry_points] console_scripts = erc20-demurrage-token-deploy = erc20_demurrage_token.runnable.deploy:main - erc20-demurrage-token-apply = erc20_demurrage_token.runnable.apply:main From ceed2e3a7abcac476591a73c40dc158e70846644 Mon Sep 17 00:00:00 2001 From: lash Date: Fri, 10 Feb 2023 17:02:29 +0000 Subject: [PATCH 36/57] Set immutable vars --- solidity/DemurrageTokenSingleNocap.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 71f36b1..dac29c6 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -4,7 +4,7 @@ pragma solidity >= 0.8.0; import "aux/ABDKMath64x64.sol"; // SPDX-License-Identifier: GPL-3.0-or-later -contract DemurrageTokenSingleCap { +contract DemurrageTokenSingleNocap { struct redistributionItem { uint32 period; @@ -35,7 +35,7 @@ contract DemurrageTokenSingleCap { string public symbol; // Implements ERC20 - uint256 public decimals; + uint256 public immutable decimals; // Implements ERC20 //uint256 public totalSupply; @@ -69,7 +69,7 @@ contract DemurrageTokenSingleCap { // Demurrage in ppm per minute //uint256 public immutable taxLevel; // 64x64 - int128 public taxLevel; + int128 public immutable taxLevel; // Addresses allowed to mint new tokens mapping (address => bool) minter; From 17638b0a515bad13f1c5df3aa98f1cc61d7aca5f Mon Sep 17 00:00:00 2001 From: lash Date: Sat, 11 Feb 2023 04:32:22 +0000 Subject: [PATCH 37/57] Bump version --- python/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.cfg b/python/setup.cfg index 245ac83..1cbb7a6 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.0 +version = 0.3.1 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From edc9b6587c6affd4c4dc0be28b147459f8140b63 Mon Sep 17 00:00:00 2001 From: lash Date: Sat, 11 Feb 2023 10:21:24 +0000 Subject: [PATCH 38/57] Rename deploy to publish --- .../erc20_demurrage_token/runnable/{deploy.py => publish.py} | 0 python/setup.cfg | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename python/erc20_demurrage_token/runnable/{deploy.py => publish.py} (100%) diff --git a/python/erc20_demurrage_token/runnable/deploy.py b/python/erc20_demurrage_token/runnable/publish.py similarity index 100% rename from python/erc20_demurrage_token/runnable/deploy.py rename to python/erc20_demurrage_token/runnable/publish.py diff --git a/python/setup.cfg b/python/setup.cfg index 1cbb7a6..f16b152 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.1 +version = 0.3.2 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no @@ -40,4 +40,4 @@ packages = [options.entry_points] console_scripts = - erc20-demurrage-token-deploy = erc20_demurrage_token.runnable.deploy:main + erc20-demurrage-token-publish = erc20_demurrage_token.runnable.publish:main From 4e6e5300f7e5818ffdb3099bf20fc192d196f58b Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 12 Feb 2023 08:17:58 +0000 Subject: [PATCH 39/57] Alias writer, emit missing events --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- solidity/DemurrageTokenSingleNocap.sol | 11 +++++++++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 3e86dd7..e94b85d 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -60c06040523480156200001157600080fd5b506040516200610538038062006105833981810160405281019062000037919062000909565b6801000000000000000083600f0b126200005057600080fd5b6200005a6200061e565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550866006908162000126919062000c2a565b50856007908162000138919062000c2a565b508460ff166008819055504260038190555060035460808181525050603c8362000163919062000d40565b60a081815250506200018a60016200034f6401000000000262002d4d176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550620001e484620003766401000000000262002d73176401000000009004565b600d60006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200024e6000600260009054906101000a9004600f0b60006001620003ca640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000d8b565b6000677fffffffffffffff8211156200036757600080fd5b6040829060020a029050919050565b60008082600f0b136200038857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af620003b5846200044e640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b620003d46200061e565b620003de6200061e565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b136200046057600080fd5b60008083600f0b90506801000000000000000081126200049c576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112620004cb576020819060008212600003808260020a82851804189250505090506020820191505b620100008112620004f8576010819060008212600003808260020a82851804189250505090506010820191505b610100811262000524576008819060008212600003808260020a82851804189250505090506008820191505b601081126200054f576004819060008212600003808260020a82851804189250505090506004820191505b600481126200057a576002819060008212600003808260020a82851804189250505090506002820191505b600281126200058a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131562000611578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050620005b7565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620006c38262000678565b810181811067ffffffffffffffff82111715620006e557620006e462000689565b5b80604052505050565b6000620006fa6200065a565b9050620007088282620006b8565b919050565b600067ffffffffffffffff8211156200072b576200072a62000689565b5b620007368262000678565b9050602081019050919050565b60005b838110156200076357808201518184015260208101905062000746565b60008484015250505050565b60006200078662000780846200070d565b620006ee565b905082815260208101848484011115620007a557620007a462000673565b5b620007b284828562000743565b509392505050565b600082601f830112620007d257620007d16200066e565b5b8151620007e48482602086016200076f565b91505092915050565b600060ff82169050919050565b6200080581620007ed565b81146200081157600080fd5b50565b6000815190506200082581620007fa565b92915050565b600081600f0b9050919050565b62000843816200082b565b81146200084f57600080fd5b50565b600081519050620008638162000838565b92915050565b6000819050919050565b6200087e8162000869565b81146200088a57600080fd5b50565b6000815190506200089e8162000873565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008d182620008a4565b9050919050565b620008e381620008c4565b8114620008ef57600080fd5b50565b6000815190506200090381620008d8565b92915050565b60008060008060008060c0878903121562000929576200092862000664565b5b600087015167ffffffffffffffff8111156200094a576200094962000669565b5b6200095889828a01620007ba565b965050602087015167ffffffffffffffff8111156200097c576200097b62000669565b5b6200098a89828a01620007ba565b95505060406200099d89828a0162000814565b9450506060620009b089828a0162000852565b9350506080620009c389828a016200088d565b92505060a0620009d689828a01620008f2565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000a3657607f821691505b60208210810362000a4c5762000a4b620009ee565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000ab97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000a77565b62000ac5868362000a77565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000b0862000b0262000afc8462000869565b62000add565b62000869565b9050919050565b6000819050919050565b62000b248362000ae7565b62000b3c62000b338262000b0f565b84845462000a87565b825550505050565b600090565b62000b5362000b44565b62000b6081848462000b19565b505050565b5b8181101562000b885762000b7c60008262000b49565b60018101905062000b66565b5050565b601f82111562000bd75762000ba18162000a52565b62000bac8462000a67565b8101602085101562000bbc578190505b62000bd462000bcb8562000a67565b83018262000b65565b50505b505050565b60008160020a8304905092915050565b600062000bff6000198460080262000bdc565b1980831691505092915050565b600062000c1a838362000bec565b9150826002028217905092915050565b62000c3582620009e3565b67ffffffffffffffff81111562000c515762000c5062000689565b5b62000c5d825462000a1d565b62000c6a82828562000b8c565b600060209050601f83116001811462000ca2576000841562000c8d578287015190505b62000c99858262000c0c565b86555062000d09565b601f19841662000cb28662000a52565b60005b8281101562000cdc5784890151825560018201915060208501945060208101905062000cb5565b8683101562000cfc578489015162000cf8601f89168262000bec565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d4d8262000869565b915062000d5a8362000869565b925082820262000d6a8162000869565b9150828204841483151762000d845762000d8362000d11565b5b5092915050565b60805160a05161532362000de260003960008181611aec015281816122da015281816128dc01528181612b0f0152612c23015260008181611b1801528181612b3b01528181612c440152612c8901526153236000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063983b2d561161012c578063d5abeb01116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d5abeb0114610b21578063d7a52fa914610b3f578063d89135cd14610b5b578063e54063a614610b79576103a0565b8063b1cb0db311610106578063b1cb0db314610a97578063b470aade14610ab5578063c0ab707714610ad3578063d340ef8a14610b03576103a0565b8063983b2d5614610a07578063a457c2d714610a37578063a9059cbb14610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b80633092afd5116102d5578063449a52f81161027357806351b4541c1161024d57806351b4541c1461078357806358b2833b146107b35780635f408c04146107d15780636787a9be146107ef576103a0565b8063449a52f8146106f357806347a50517146107235780634abfbba214610753576103a0565b806331a5995d116102af57806331a5995d14610657578063395093511461067557806340452d91146106a557806342966c68146106d7576103a0565b80633092afd5146105d95780633133348714610609578063313ce56714610639576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba91906146d7565b610c45565b6040516103cc919061471f565b60405180910390f35b6103dd610deb565b6040516103ea91906147ca565b60405180910390f35b61040d60048036038101906104089190614880565b610e79565b60405161041a919061471f565b60405180910390f35b61042b6110b5565b60405161043891906148dc565b60405180910390f35b61045b60048036038101906104569190614923565b6110c8565b6040516104689190614972565b60405180910390f35b610479611118565b6040516104869190614972565b60405180910390f35b61049761112f565b6040516104a49190614972565b60405180910390f35b6104b5611134565b6040516104c29190614972565b60405180910390f35b6104e560048036038101906104e09190614b2e565b611140565b6040516104f29190614972565b60405180910390f35b610503611159565b60405161051091906148dc565b60405180910390f35b610533600480360381019061052e9190614b2e565b61116c565b604051610540919061471f565b60405180910390f35b610563600480360381019061055e9190614b5b565b6111d4565b604051610570919061471f565b60405180910390f35b610593600480360381019061058e9190614b2e565b6113f2565b6040516105a091906148dc565b60405180910390f35b6105c360048036038101906105be9190614bae565b61142a565b6040516105d0919061471f565b60405180910390f35b6105f360048036038101906105ee9190614bdb565b61145d565b604051610600919061471f565b60405180910390f35b610623600480360381019061061e9190614c08565b611567565b6040516106309190614972565b60405180910390f35b6106416115d3565b60405161064e9190614972565b60405180910390f35b61065f6115d9565b60405161066c9190614972565b60405180910390f35b61068f600480360381019061068a9190614880565b6115df565b60405161069c919061471f565b60405180910390f35b6106bf60048036038101906106ba9190614bae565b611775565b6040516106ce93929190614c75565b60405180910390f35b6106f160048036038101906106ec9190614bae565b6117e4565b005b61070d60048036038101906107089190614880565b611920565b60405161071a919061471f565b60405180910390f35b61073d60048036038101906107389190614bdb565b611a9f565b60405161074a9190614972565b60405180910390f35b61076d60048036038101906107689190614bae565b611ae8565b60405161077a9190614972565b60405180910390f35b61079d60048036038101906107989190614bae565b611b48565b6040516107aa9190614972565b60405180910390f35b6107bb611b69565b6040516107c89190614972565b60405180910390f35b6107d9611b6f565b6040516107e69190614cc8565b60405180910390f35b61080960048036038101906108049190614bae565b611c3c565b6040516108169190614972565b60405180910390f35b61083960048036038101906108349190614bae565b611c7d565b6040516108469190614972565b60405180910390f35b61086960048036038101906108649190614bae565b611c9e565b005b61088560048036038101906108809190614bdb565b611d66565b6040516108929190614972565b60405180910390f35b6108a3611dd0565b6040516108b09190614972565b60405180910390f35b6108c1611de1565b6040516108ce9190614972565b60405180910390f35b6108f160048036038101906108ec9190614b2e565b611de7565b6040516108fe9190614972565b60405180910390f35b61090f611e15565b60405161091c9190614972565b60405180910390f35b61092d611e1b565b60405161093a919061471f565b60405180910390f35b61094b611fc2565b6040516109589190614cf2565b60405180910390f35b61097b60048036038101906109769190614bae565b611fe8565b6040516109889190614972565b60405180910390f35b6109996120c7565b6040516109a69190614cf2565b60405180910390f35b6109c960048036038101906109c49190614bdb565b6120ed565b005b6109d36121a2565b6040516109e0919061471f565b60405180910390f35b6109f1612452565b6040516109fe91906147ca565b60405180910390f35b610a216004803603810190610a1c9190614bdb565b6124e0565b604051610a2e919061471f565b60405180910390f35b610a516004803603810190610a4c9190614880565b6125b4565b604051610a5e919061471f565b60405180910390f35b610a816004803603810190610a7c9190614880565b6127d3565b604051610a8e919061471f565b60405180910390f35b610a9f6128d4565b604051610aac9190614972565b60405180910390f35b610abd6128da565b604051610aca9190614972565b60405180910390f35b610aed6004803603810190610ae89190614bae565b6128fe565b604051610afa9190614972565b60405180910390f35b610b0b612a74565b604051610b189190614972565b60405180910390f35b610b29612a7a565b604051610b369190614972565b60405180910390f35b610b596004803603810190610b549190614bae565b612a80565b005b610b63612b7f565b604051610b709190614972565b60405180910390f35b610b936004803603810190610b8e9190614b2e565b612b89565b604051610ba09190614972565b60405180910390f35b610bc36004803603810190610bbe9190614d0d565b612b9d565b604051610bd09190614de3565b60405180910390f35b610be1612c1d565b604051610bee9190614e29565b60405180910390f35b610bff612c87565b604051610c0c9190614972565b60405180910390f35b610c2f6004803603810190610c2a9190614bdb565b612cab565b604051610c3c919061471f565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614e73565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614e73565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611b6f565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614ef0565b60405180910390fd5b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614f5c565b60405180910390fd5b5b610fb66121a2565b50610fc084611c3c565b915081600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614972565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612d4d565b6110ea6110e46001612d4d565b86612db5565b612e1c565b90506110fa81612e9b565b67ffffffffffffffff168461110f9190614fab565b91505092915050565b6000600c5460095461112a9190614fab565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600d60009054906101000a9004600f0b81565b600080826000015163ffffffff16111561118957600090506111cf565b6000826020015168ffffffffffffffffff1611156111aa57600090506111cf565b6000826040015167ffffffffffffffff1611156111ca57600090506111cf565b600190505b919050565b6000806000806111e2611b6f565b905060028160ff16036111fb57600093505050506113eb565b60008160ff161115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990614ef0565b60405180910390fd5b61124a6121a2565b5061125485611c3c565b925082600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112df57600080fd5b82600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461136b9190614fab565b9250508190555061137d878785612ed0565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113dc9190614972565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114215761141e6001612d4d565b90505b80915050919050565b6000600f821061143957600080fd5b6000820361144e57600f601454149050611458565b8160145483161490505b919050565b600061146c600160ff1661142a565b1561147657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806114fd57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61150657600080fd5b6000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060008061157686612d4d565b925061158185612d4d565b915061159c600d60009054906101000a9004600f0b83612e1c565b90506115a781612ef5565b90506115b38382612e1c565b90506115be81612e9b565b67ffffffffffffffff16935050505092915050565b60085481565b60145481565b6000806115ea6121a2565b506115f483611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116829190614fdf565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117629190614972565b60405180910390a3600191505092915050565b6000818154811061178557600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117ee611b6f565b60ff16146117fb57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661185157600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561189d57600080fd5b60006118a882611c3c565b90506118b43382612f82565b5081600c60008282546118c79190614fdf565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516119149190614972565b60405180910390a25050565b600080600061192d611b6f565b60ff161461193a57600080fd5b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd9061505f565b60405180910390fd5b6119ce6121a2565b50600060135411156119f757601354836009546119eb9190614fdf565b11156119f657600080fd5b5b8260096000828254611a099190614fdf565b92505081905550611a1983611c3c565b9050611a258482613089565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a839190614972565b60405180910390a3611a9361314d565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b16919061507f565b7f0000000000000000000000000000000000000000000000000000000000000000611b419190614fdf565b9050919050565b6000603c8242611b589190614fab565b611b6291906150f0565b9050919050565b60035481565b6000601260009054906101000a900460ff1615611b8f5760019050611c39565b600060115403611ba25760009050611c39565b6011544210611c3457611bcf603c600354611bbd91906150f0565b601154611bca9190614fab565b6128fe565b506001601260006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c1a9190614972565b60405180910390a1611c2a6121a2565b5060029050611c39565b600090505b90565b600080611c60611c4b84612d4d565b600260009054906101000a9004600f0b613311565b9050611c6b81612e9b565b67ffffffffffffffff16915050919050565b6000603c8242611c8d9190614fab565b611c9791906150f0565b9050919050565b611cab600860ff1661142a565b15611cb557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d0f57600080fd5b611d17611118565b8111611d2257600080fd5b6013547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d549190614972565b60405180910390a28060138190555050565b6000806000806000611d7f611d7a87611a9f565b612d4d565b9350611d8c600354611b48565b9150611da784600260009054906101000a9004600f0b612e1c565b9250611dc5611db584612e9b565b67ffffffffffffffff1683611567565b945050505050919050565b6000611ddc60006128fe565b905090565b600c5481565b6000806000611df584611140565b9150611e00846113f2565b9050611e0c82826110c8565b92505050919050565b600b5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e7857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010821061202d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120249061516d565b60405180910390fd5b6000601454831614612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b906151d9565b60405180910390fd5b816014600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416014546040516120b59190614972565b60405180910390a16014549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6120fa600260ff1661142a565b1561210457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461215e57600080fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121ac614634565b6121b4614634565b6121bc614634565b60008060008060006121cc611dd0565b506121d561339d565b97506121e08861116c565b156121f65760009850505050505050505061244f565b6000600a548154811061220c5761220b6151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122b988612b89565b94506001856122c89190614fdf565b90506122d3866113f2565b9350603c857f0000000000000000000000000000000000000000000000000000000000000000612303919061507f565b61230d91906150f0565b9150612338612333600d60009054906101000a9004600f0b61232e85612d4d565b612e1c565b612ef5565b925061234e600084612348611118565b84612b9d565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061240a87613533565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161243a9190614972565b60405180910390a16001985050505050505050505b90565b6007805461245f90614e73565b80601f016020809104026020016040519081016040528092919081815260200182805461248b90614e73565b80156124d85780601f106124ad576101008083540402835291602001916124d8565b820191906000526020600020905b8154815290600101906020018083116124bb57829003601f168201915b505050505081565b60006124ef600160ff1661142a565b156124f957600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461255357600080fd5b6001600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806125c083611c3c565b905080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561264b57600080fd5b6126536121a2565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126e09190614fab565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516127c09190614972565b60405180910390a3600191505092915050565b6000806000806127e1611b6f565b905060028160ff16036127fa57600093505050506128ce565b60008160ff161115612841576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283890614ef0565b60405180910390fd5b6128496121a2565b5061285385611c3c565b9250612860338785612ed0565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516128bf9190614972565b60405180910390a38193505050505b92915050565b60115481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601260009054906101000a900460ff1615612928576000945050505050612a6f565b612933600354611b48565b92506000830361294a576000945050505050612a6f565b600260009054906101000a9004600f0b905060008611801561296b57508286105b15612974578592505b61297d83612d4d565b9150612998600d60009054906101000a9004600f0b83612e1c565b93506129a384612ef5565b93506129be600260009054906101000a9004600f0b85612e1c565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612a06919061507f565b600354612a139190614fdf565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a5f91906148dc565b60405180910390a4829450505050505b919050565b600a5481565b60135481565b6000612a8f600460ff1661142a565b15612a9957600080fd5b601260009054906101000a900460ff1615612ab357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b0d57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b39919061507f565b7f0000000000000000000000000000000000000000000000000000000000000000612b649190614fdf565b90506011548111612b7457600080fd5b806011819055505050565b6000600c54905090565b6000816000015163ffffffff169050919050565b612ba5614634565b612bad614634565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612c6e9190614fab565b612c7891906150f0565b612c829190614fdf565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0757600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612d6457600080fd5b6040829060020a029050919050565b60008082600f0b13612d8457600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612da084613652565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e0957506f7fffffffffffffffffffffffffffffff600f0b8113155b612e1257600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e8857506f7fffffffffffffffffffffffffffffff600f0b8113155b612e9157600080fd5b8091505092915050565b60008082600f0b1215612ead57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612edd8584612f82565b50612ee88484613089565b5060019150509392505050565b60006840000000000000000082600f0b12612f0f57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612f435760009050612f7d565b612f7a6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613818565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008503612fde5760009350505050613083565b612fe786611a9f565b92508483101561302c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161302390615274565b60405180910390fd5b84836130389190614fab565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130e55760009350505050613147565b6130ee86611a9f565b925084836130fc9190614fdf565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000613157614634565b6000613161611118565b9050600060016000805490506131779190614fab565b81548110613188576131876151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506132639190614fab565b81548110613274576132736151f9565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361332257600080fd5b600082600f0b604085600f0b9060020a0281613341576133406150c1565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561338a57506f7fffffffffffffffffffffffffffffff600f0b8113155b61339357600080fd5b8091505092915050565b6133a5614634565b6133ad614634565b6133b5614634565b600080600a54815481106133cc576133cb6151f9565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156134d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134fb91906152c0565b6fffffffffffffffffffffffffffffffff16905061351883612b89565b811161352957819350505050613530565b8293505050505b90565b600080600061354184611de7565b613549611118565b6135539190614fab565b9150600b5461356183611c3c565b61356b9190614fab565b9050613599601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613089565b50836000015163ffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161360d9190614972565b60405180910390a36001600a60008282546136289190614fdf565b9250508190555080600b60008282546136419190614fdf565b925050819055508192505050919050565b60008082600f0b1361366357600080fd5b60008083600f0b905068010000000000000000811261369e576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126136cc576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126136f8576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613723576008819060008212600003808260020a82851804189250505090506008820191505b6010811261374d576004819060008212600003808260020a82851804189250505090506004820191505b60048112613777576002819060008212600003808260020a82851804189250505090506002820191505b60028112613786576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561380b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506137b3565b5081945050505050919050565b60006840000000000000000082600f0b1261383257600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613866576000905061462f565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156138b457608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156138ed5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139265760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b131561395f57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139985760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b13156139d1576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a0a57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613a43576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613a7b57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613ab35760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613aeb576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b235760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613b5b576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613b9357608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613bcb5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613c0357608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c3a5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613c71576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613ca857608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613cdf576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d1657608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613d4d5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613d84576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613dbb5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613df1576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e2757608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613e5d5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613e9357608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613ec95760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613eff576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f3557608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613f6b576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b1315613fa057608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b1315613fd55760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561400a576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561403f5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614074576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156140a957608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156140de5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561411357608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141475760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561417b576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156141af57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156141e3576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561421757608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561424b5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561427f576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156142b35760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156142e6576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561431957608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561434c5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561437f57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156143b25760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156143e5576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561441857608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561444b576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561447d57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156144af5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156144e1576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145135760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614545576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561457757608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156145a95760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156145db57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561462a57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6146b48161467f565b81146146bf57600080fd5b50565b6000813590506146d1816146ab565b92915050565b6000602082840312156146ed576146ec61467a565b5b60006146fb848285016146c2565b91505092915050565b60008115159050919050565b61471981614704565b82525050565b60006020820190506147346000830184614710565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614774578082015181840152602081019050614759565b60008484015250505050565b6000601f19601f8301169050919050565b600061479c8261473a565b6147a68185614745565b93506147b6818560208601614756565b6147bf81614780565b840191505092915050565b600060208201905081810360008301526147e48184614791565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614817826147ec565b9050919050565b6148278161480c565b811461483257600080fd5b50565b6000813590506148448161481e565b92915050565b6000819050919050565b61485d8161484a565b811461486857600080fd5b50565b60008135905061487a81614854565b92915050565b600080604083850312156148975761489661467a565b5b60006148a585828601614835565b92505060206148b68582860161486b565b9150509250929050565b600081600f0b9050919050565b6148d6816148c0565b82525050565b60006020820190506148f160008301846148cd565b92915050565b614900816148c0565b811461490b57600080fd5b50565b60008135905061491d816148f7565b92915050565b6000806040838503121561493a5761493961467a565b5b60006149488582860161486b565b92505060206149598582860161490e565b9150509250929050565b61496c8161484a565b82525050565b60006020820190506149876000830184614963565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6149ca82614780565b810181811067ffffffffffffffff821117156149e9576149e8614992565b5b80604052505050565b60006149fc614670565b9050614a0882826149c1565b919050565b600063ffffffff82169050919050565b614a2681614a0d565b8114614a3157600080fd5b50565b600081359050614a4381614a1d565b92915050565b600068ffffffffffffffffff82169050919050565b614a6781614a49565b8114614a7257600080fd5b50565b600081359050614a8481614a5e565b92915050565b600067ffffffffffffffff82169050919050565b614aa781614a8a565b8114614ab257600080fd5b50565b600081359050614ac481614a9e565b92915050565b600060608284031215614ae057614adf61498d565b5b614aea60606149f2565b90506000614afa84828501614a34565b6000830152506020614b0e84828501614a75565b6020830152506040614b2284828501614ab5565b60408301525092915050565b600060608284031215614b4457614b4361467a565b5b6000614b5284828501614aca565b91505092915050565b600080600060608486031215614b7457614b7361467a565b5b6000614b8286828701614835565b9350506020614b9386828701614835565b9250506040614ba48682870161486b565b9150509250925092565b600060208284031215614bc457614bc361467a565b5b6000614bd28482850161486b565b91505092915050565b600060208284031215614bf157614bf061467a565b5b6000614bff84828501614835565b91505092915050565b60008060408385031215614c1f57614c1e61467a565b5b6000614c2d8582860161486b565b9250506020614c3e8582860161486b565b9150509250929050565b614c5181614a0d565b82525050565b614c6081614a49565b82525050565b614c6f81614a8a565b82525050565b6000606082019050614c8a6000830186614c48565b614c976020830185614c57565b614ca46040830184614c66565b949350505050565b600060ff82169050919050565b614cc281614cac565b82525050565b6000602082019050614cdd6000830184614cb9565b92915050565b614cec8161480c565b82525050565b6000602082019050614d076000830184614ce3565b92915050565b60008060008060808587031215614d2757614d2661467a565b5b6000614d358782880161486b565b9450506020614d468782880161490e565b9350506040614d578782880161486b565b9250506060614d688782880161486b565b91505092959194509250565b614d7d81614a0d565b82525050565b614d8c81614a49565b82525050565b614d9b81614a8a565b82525050565b606082016000820151614db76000850182614d74565b506020820151614dca6020850182614d83565b506040820151614ddd6040850182614d92565b50505050565b6000606082019050614df86000830184614da1565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e2381614dfe565b82525050565b6000602082019050614e3e6000830184614e1a565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614e8b57607f821691505b602082108103614e9e57614e9d614e44565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614eda600783614745565b9150614ee582614ea4565b602082019050919050565b60006020820190508181036000830152614f0981614ecd565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614f46600a83614745565b9150614f5182614f10565b602082019050919050565b60006020820190508181036000830152614f7581614f39565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614fb68261484a565b9150614fc18361484a565b9250828203905081811115614fd957614fd8614f7c565b5b92915050565b6000614fea8261484a565b9150614ff58361484a565b925082820190508082111561500d5761500c614f7c565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615049600a83614745565b915061505482615013565b602082019050919050565b600060208201905081810360008301526150788161503c565b9050919050565b600061508a8261484a565b91506150958361484a565b92508282026150a38161484a565b915082820484148315176150ba576150b9614f7c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006150fb8261484a565b91506151068361484a565b925082615116576151156150c1565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615157601183614745565b915061516282615121565b602082019050919050565b600060208201905081810360008301526151868161514a565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006151c3601283614745565b91506151ce8261518d565b602082019050919050565b600060208201905081810360008301526151f2816151b6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061525e600d83614745565b915061526982615228565b602082019050919050565b6000602082019050818103600083015261528d81615251565b9050919050565b61529d81614dfe565b81146152a857600080fd5b50565b6000815190506152ba81615294565b92915050565b6000602082840312156152d6576152d561467a565b5b60006152e4848285016152ab565b9150509291505056fea2646970667358221220f7dd37b962b03307b9a47a02325dafb33edc00117a2875af89644526ff48de4064736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200618438038062006184833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e49176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e6f176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161541f62000d65600039600081816111d10152818161160f015281816123df0152612a5d015260008181611ba2015281816123a2015281816129b501528181612bf90152612d1f015260008181611bce01528181612c2501528181612d400152612d850152600061166d015261541f6000f3fe608060405234801561001057600080fd5b50600436106103b6576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610206578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610c1f578063e809529514610c4f578063eda4e6d614610c6d578063f2fde38b14610c8b576103b6565b8063d7a52fa914610b85578063d89135cd14610ba1578063da2824a814610bbf578063e54063a614610bef576103b6565b8063b470aade11610106578063b470aade14610afb578063c0ab707714610b19578063d340ef8a14610b49578063d5abeb0114610b67576103b6565b8063a457c2d714610a7d578063a9059cbb14610aad578063b1cb0db314610add576103b6565b806379ba5097116101a45780638f0b2d5d116101735780638f0b2d5d146109f55780638f1df6bc14610a1157806395d89b4114610a2f578063983b2d5614610a4d576103b6565b806379ba50971461096b57806384dde4af1461098957806386fe212d146109a75780638da5cb5b146109d7576103b6565b8063731f237c116101e0578063731f237c146108e157806373f42561146108ff5780637445e33a1461091d57806374bedb951461094d576103b6565b80636a2d094e146108655780636f8b44b01461089557806370a08231146108b1576103b6565b80633092afd5116102eb578063449a52f81161028957806358b2833b1161025857806358b2833b146107c95780635ae06f7e146107e75780635f408c04146108175780636787a9be14610835576103b6565b8063449a52f81461070957806347a50517146107395780634abfbba21461076957806351b4541c14610799576103b6565b806331a5995d116102c557806331a5995d1461066d578063395093511461068b57806340452d91146106bb57806342966c68146106ed576103b6565b80633092afd5146105ef578063313334871461061f578063313ce5671461064f576103b6565b80631989c6a81161035857806323a859441161033257806323a859441461052f57806323b872dd1461055f5780632a7aec091461058f5780632c1758c1146105bf576103b6565b80631989c6a8146104c3578063213d1e1e146104e1578063229ba19714610511576103b6565b806309f28f3c1161039457806309f28f3c1461043957806311c566151461045757806318160ddd1461048757806318cbbcfc146104a5576103b6565b806301ffc9a7146103bb57806306fdde03146103eb578063095ea7b314610409575b600080fd5b6103d560048036038101906103d091906147d3565b610cbb565b6040516103e2919061481b565b60405180910390f35b6103f3610e61565b60405161040091906148c6565b60405180910390f35b610423600480360381019061041e919061497c565b610eef565b604051610430919061481b565b60405180910390f35b61044161112b565b60405161044e91906149d8565b60405180910390f35b610471600480360381019061046c9190614a1f565b61113e565b60405161047e9190614a6e565b60405180910390f35b61048f61118e565b60405161049c9190614a6e565b60405180910390f35b6104ad6111a5565b6040516104ba9190614a6e565b60405180910390f35b6104cb6111aa565b6040516104d89190614a6e565b60405180910390f35b6104fb60048036038101906104f69190614c2a565b6111b6565b6040516105089190614a6e565b60405180910390f35b6105196111cf565b60405161052691906149d8565b60405180910390f35b61054960048036038101906105449190614c2a565b6111f3565b604051610556919061481b565b60405180910390f35b61057960048036038101906105749190614c57565b61125b565b604051610586919061481b565b60405180910390f35b6105a960048036038101906105a49190614c2a565b611479565b6040516105b691906149d8565b60405180910390f35b6105d960048036038101906105d49190614caa565b6114b1565b6040516105e6919061481b565b60405180910390f35b61060960048036038101906106049190614cd7565b6114e4565b604051610616919061481b565b60405180910390f35b61063960048036038101906106349190614d04565b6115ee565b6040516106469190614a6e565b60405180910390f35b61065761166b565b6040516106649190614a6e565b60405180910390f35b61067561168f565b6040516106829190614a6e565b60405180910390f35b6106a560048036038101906106a0919061497c565b611695565b6040516106b2919061481b565b60405180910390f35b6106d560048036038101906106d09190614caa565b61182b565b6040516106e493929190614d71565b60405180910390f35b61070760048036038101906107029190614caa565b61189a565b005b610723600480360381019061071e919061497c565b6119d6565b604051610730919061481b565b60405180910390f35b610753600480360381019061074e9190614cd7565b611b55565b6040516107609190614a6e565b60405180910390f35b610783600480360381019061077e9190614caa565b611b9e565b6040516107909190614a6e565b60405180910390f35b6107b360048036038101906107ae9190614caa565b611bfe565b6040516107c09190614a6e565b60405180910390f35b6107d1611c1f565b6040516107de9190614a6e565b60405180910390f35b61080160048036038101906107fc9190614cd7565b611c25565b60405161080e919061481b565b60405180910390f35b61081f611c37565b60405161082c9190614dc4565b60405180910390f35b61084f600480360381019061084a9190614caa565b611d04565b60405161085c9190614a6e565b60405180910390f35b61087f600480360381019061087a9190614caa565b611d45565b60405161088c9190614a6e565b60405180910390f35b6108af60048036038101906108aa9190614caa565b611d66565b005b6108cb60048036038101906108c69190614cd7565b611e2e565b6040516108d89190614a6e565b60405180910390f35b6108e9611e98565b6040516108f69190614a6e565b60405180910390f35b610907611ea9565b6040516109149190614a6e565b60405180910390f35b61093760048036038101906109329190614c2a565b611eaf565b6040516109449190614a6e565b60405180910390f35b610955611edd565b6040516109629190614a6e565b60405180910390f35b610973611ee3565b604051610980919061481b565b60405180910390f35b61099161208a565b60405161099e9190614dee565b60405180910390f35b6109c160048036038101906109bc9190614caa565b6120b0565b6040516109ce9190614a6e565b60405180910390f35b6109df61218f565b6040516109ec9190614dee565b60405180910390f35b610a0f6004803603810190610a0a9190614cd7565b6121b5565b005b610a1961226a565b604051610a26919061481b565b60405180910390f35b610a3761252b565b604051610a4491906148c6565b60405180910390f35b610a676004803603810190610a629190614cd7565b6125b9565b604051610a74919061481b565b60405180910390f35b610a976004803603810190610a92919061497c565b61268d565b604051610aa4919061481b565b60405180910390f35b610ac76004803603810190610ac2919061497c565b6128ac565b604051610ad4919061481b565b60405180910390f35b610ae56129ad565b604051610af29190614a6e565b60405180910390f35b610b036129b3565b604051610b109190614a6e565b60405180910390f35b610b336004803603810190610b2e9190614caa565b6129d7565b604051610b409190614a6e565b60405180910390f35b610b51612b5e565b604051610b5e9190614a6e565b60405180910390f35b610b6f612b64565b604051610b7c9190614a6e565b60405180910390f35b610b9f6004803603810190610b9a9190614caa565b612b6a565b005b610ba9612c69565b604051610bb69190614a6e565b60405180910390f35b610bd96004803603810190610bd49190614cd7565b612c73565b604051610be6919061481b565b60405180910390f35b610c096004803603810190610c049190614c2a565b612c85565b604051610c169190614a6e565b60405180910390f35b610c396004803603810190610c349190614e09565b612c99565b604051610c469190614edf565b60405180910390f35b610c57612d19565b604051610c649190614f25565b60405180910390f35b610c75612d83565b604051610c829190614a6e565b60405180910390f35b610ca56004803603810190610ca09190614cd7565b612da7565b604051610cb2919061481b565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d0f5760019050610e5c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d615760019050610e5c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610db35760019050610e5c565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e055760019050610e5c565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e575760019050610e5c565b600090505b919050565b60068054610e6e90614f6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90614f6f565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b6000806000610efc611c37565b905060028160ff1603610f1457600092505050611125565b60008160ff161115610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5290614fec565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110245760008414611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90615058565b60405180910390fd5b5b61102c61226a565b5061103684611d04565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111169190614a6e565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061116561114d85612e49565b61116061115a6001612e49565b86612eb1565b612f18565b905061117081612f97565b67ffffffffffffffff168461118591906150a7565b91505092915050565b6000600b546008546111a091906150a7565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff1611156112105760009050611256565b6000826020015168ffffffffffffffffff1611156112315760009050611256565b6000826040015167ffffffffffffffff1611156112515760009050611256565b600190505b919050565b600080600080611269611c37565b905060028160ff16036112825760009350505050611472565b60008160ff1611156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090614fec565b60405180910390fd5b6112d161226a565b506112db85611d04565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561136657600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113f291906150a7565b92505081905550611404878785612fcc565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516114639190614a6e565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114a8576114a56001612e49565b90505b80915050919050565b6000600f82106114c057600080fd5b600082036114d557600f6012541490506114df565b8160125483161490505b919050565b60006114f3600160ff166114b1565b156114fd57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061158457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61158d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806115fd86612e49565b925061160885612e49565b91506116347f000000000000000000000000000000000000000000000000000000000000000083612f18565b905061163f81612ff1565b905061164b8382612f18565b905061165681612f97565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806116a061226a565b506116aa83611d04565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173891906150db565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516118189190614a6e565b60405180910390a3600191505092915050565b6000818154811061183b57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006118a4611c37565b60ff16146118b157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661190757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561195357600080fd5b600061195e82611d04565b905061196a338261307e565b5081600b600082825461197d91906150db565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516119ca9190614a6e565b60405180910390a25050565b60008060006119e3611c37565b60ff16146119f057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a739061515b565b60405180910390fd5b611a8461226a565b5060006011541115611aad5760115483600854611aa191906150db565b1115611aac57600080fd5b5b8260086000828254611abf91906150db565b92505081905550611acf83611d04565b9050611adb8482613185565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b399190614a6e565b60405180910390a3611b49613249565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611bcc919061517b565b7f0000000000000000000000000000000000000000000000000000000000000000611bf791906150db565b9050919050565b6000603c8242611c0e91906150a7565b611c1891906151ec565b9050919050565b60035481565b6000611c30826114e4565b9050919050565b6000601060009054906101000a900460ff1615611c575760019050611d01565b6000600f5403611c6a5760009050611d01565b600f544210611cfc57611c97603c600354611c8591906151ec565b600f54611c9291906150a7565b6129d7565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611ce29190614a6e565b60405180910390a1611cf261226a565b5060029050611d01565b600090505b90565b600080611d28611d1384612e49565b600260009054906101000a9004600f0b61340d565b9050611d3381612f97565b67ffffffffffffffff16915050919050565b6000603c8242611d5591906150a7565b611d5f91906151ec565b9050919050565b611d73600860ff166114b1565b15611d7d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd757600080fd5b611ddf61118e565b8111611dea57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611e1c9190614a6e565b60405180910390a28060118190555050565b6000806000806000611e47611e4287611b55565b612e49565b9350611e54600354611bfe565b9150611e6f84600260009054906101000a9004600f0b612f18565b9250611e8d611e7d84612f97565b67ffffffffffffffff16836115ee565b945050505050919050565b6000611ea460006129d7565b905090565b600b5481565b6000806000611ebd846111b6565b9150611ec884611479565b9050611ed4828261113e565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90615269565b60405180910390fd5b600060125483161461213c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612133906152d5565b60405180910390fd5b816012600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc4160125460405161217d9190614a6e565b60405180910390a16012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121c2600260ff166114b1565b156121cc57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461222657600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612274614730565b61227c614730565b612284614730565b6000806000806000612294611e98565b5061229d613499565b97506122a8886111f3565b156122be57600098505050505050505050612528565b6000600954815481106122d4576122d36152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061238188612c85565b945060018561239091906150db565b905061239b86611479565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123cb919061517b565b6123d591906151ec565b915061241161240c7f000000000000000000000000000000000000000000000000000000000000000061240785612e49565b612f18565b612ff1565b925061242760008461242161118e565b84612c99565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124e38761362f565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516125139190614a6e565b60405180910390a16001985050505050505050505b90565b6007805461253890614f6f565b80601f016020809104026020016040519081016040528092919081815260200182805461256490614f6f565b80156125b15780601f10612586576101008083540402835291602001916125b1565b820191906000526020600020905b81548152906001019060200180831161259457829003601f168201915b505050505081565b60006125c8600160ff166114b1565b156125d257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262c57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061269983611d04565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561272457600080fd5b61272c61226a565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b991906150a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128999190614a6e565b60405180910390a3600191505092915050565b6000806000806128ba611c37565b905060028160ff16036128d357600093505050506129a7565b60008160ff16111561291a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291190614fec565b60405180910390fd5b61292261226a565b5061292c85611d04565b9250612939338785612fcc565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129989190614a6e565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a01576000945050505050612b59565b612a0c600354611bfe565b925060008303612a23576000945050505050612b59565b600260009054906101000a9004600f0b9050600086118015612a4457508286105b15612a4d578592505b612a5683612e49565b9150612a827f000000000000000000000000000000000000000000000000000000000000000083612f18565b9350612a8d84612ff1565b9350612aa8600260009054906101000a9004600f0b85612f18565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612af0919061517b565b600354612afd91906150db565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b4991906149d8565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612b79600460ff166114b1565b15612b8357600080fd5b601060009054906101000a900460ff1615612b9d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf757600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c23919061517b565b7f0000000000000000000000000000000000000000000000000000000000000000612c4e91906150db565b9050600f548111612c5e57600080fd5b80600f819055505050565b6000600b54905090565b6000612c7e826125b9565b9050919050565b6000816000015163ffffffff169050919050565b612ca1614730565b612ca9614730565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d6a91906150a7565b612d7491906151ec565b612d7e91906150db565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e0357600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e6057600080fd5b6040829060020a029050919050565b60008082600f0b13612e8057600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e9c8461374e565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f0557506f7fffffffffffffffffffffffffffffff600f0b8113155b612f0e57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f8457506f7fffffffffffffffffffffffffffffff600f0b8113155b612f8d57600080fd5b8091505092915050565b60008082600f0b1215612fa957600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612fd9858461307e565b50612fe48484613185565b5060019150509392505050565b60006840000000000000000082600f0b1261300b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561303f5760009050613079565b6130766080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613914565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130da576000935050505061317f565b6130e386611b55565b925084831015613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311f90615370565b60405180910390fd5b848361313491906150a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131e15760009350505050613243565b6131ea86611b55565b925084836131f891906150db565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000613253614730565b600061325d61118e565b90506000600160008054905061327391906150a7565b81548110613284576132836152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061335f91906150a7565b815481106133705761336f6152f5565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361341e57600080fd5b600082600f0b604085600f0b9060020a028161343d5761343c6151bd565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561348657506f7fffffffffffffffffffffffffffffff600f0b8113155b61348f57600080fd5b8091505092915050565b6134a1614730565b6134a9614730565b6134b1614730565b600080600954815481106134c8576134c76152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156135d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f791906153bc565b6fffffffffffffffffffffffffffffffff16905061361483612c85565b81116136255781935050505061362c565b8293505050505b90565b600080600061363d84611eaf565b61364561118e565b61364f91906150a7565b9150600a5461365d83611d04565b61366791906150a7565b9050613695600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613185565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137099190614a6e565b60405180910390a360016009600082825461372491906150db565b9250508190555080600a600082825461373d91906150db565b925050819055508192505050919050565b60008082600f0b1361375f57600080fd5b60008083600f0b905068010000000000000000811261379a576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126137c8576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137f4576010819060008212600003808260020a82851804189250505090506010820191505b610100811261381f576008819060008212600003808260020a82851804189250505090506008820191505b60108112613849576004819060008212600003808260020a82851804189250505090506004820191505b60048112613873576002819060008212600003808260020a82851804189250505090506002820191505b60028112613882576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613907578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506138af565b5081945050505050919050565b60006840000000000000000082600f0b1261392e57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613962576000905061472b565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156139b057608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139e95760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613a225760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a5b57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a945760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613acd576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613b0657608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b3f576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b7757608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613baf5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613be7576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613c1f5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c57576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c8f57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613cc75760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cff57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613d365760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d6d576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613da457608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ddb576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613e1257608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e495760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e80576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613eb75760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eed576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613f2357608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f595760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f8f57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613fc55760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613ffb576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561403157608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614067576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561409c57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140d15760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614106576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561413b5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614170576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156141a557608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141da5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561420f57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142435760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614277576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156142ab57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142df576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561431357608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156143475760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561437b576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143af5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143e2576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561441557608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156144485760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561447b57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144ae5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144e1576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561451457608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614547576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561457957608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145ab5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145dd576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561460f5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614641576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561467357608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156146a55760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156146d757608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561472657600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6147b08161477b565b81146147bb57600080fd5b50565b6000813590506147cd816147a7565b92915050565b6000602082840312156147e9576147e8614776565b5b60006147f7848285016147be565b91505092915050565b60008115159050919050565b61481581614800565b82525050565b6000602082019050614830600083018461480c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614870578082015181840152602081019050614855565b60008484015250505050565b6000601f19601f8301169050919050565b600061489882614836565b6148a28185614841565b93506148b2818560208601614852565b6148bb8161487c565b840191505092915050565b600060208201905081810360008301526148e0818461488d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614913826148e8565b9050919050565b61492381614908565b811461492e57600080fd5b50565b6000813590506149408161491a565b92915050565b6000819050919050565b61495981614946565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b6000806040838503121561499357614992614776565b5b60006149a185828601614931565b92505060206149b285828601614967565b9150509250929050565b600081600f0b9050919050565b6149d2816149bc565b82525050565b60006020820190506149ed60008301846149c9565b92915050565b6149fc816149bc565b8114614a0757600080fd5b50565b600081359050614a19816149f3565b92915050565b60008060408385031215614a3657614a35614776565b5b6000614a4485828601614967565b9250506020614a5585828601614a0a565b9150509250929050565b614a6881614946565b82525050565b6000602082019050614a836000830184614a5f565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614ac68261487c565b810181811067ffffffffffffffff82111715614ae557614ae4614a8e565b5b80604052505050565b6000614af861476c565b9050614b048282614abd565b919050565b600063ffffffff82169050919050565b614b2281614b09565b8114614b2d57600080fd5b50565b600081359050614b3f81614b19565b92915050565b600068ffffffffffffffffff82169050919050565b614b6381614b45565b8114614b6e57600080fd5b50565b600081359050614b8081614b5a565b92915050565b600067ffffffffffffffff82169050919050565b614ba381614b86565b8114614bae57600080fd5b50565b600081359050614bc081614b9a565b92915050565b600060608284031215614bdc57614bdb614a89565b5b614be66060614aee565b90506000614bf684828501614b30565b6000830152506020614c0a84828501614b71565b6020830152506040614c1e84828501614bb1565b60408301525092915050565b600060608284031215614c4057614c3f614776565b5b6000614c4e84828501614bc6565b91505092915050565b600080600060608486031215614c7057614c6f614776565b5b6000614c7e86828701614931565b9350506020614c8f86828701614931565b9250506040614ca086828701614967565b9150509250925092565b600060208284031215614cc057614cbf614776565b5b6000614cce84828501614967565b91505092915050565b600060208284031215614ced57614cec614776565b5b6000614cfb84828501614931565b91505092915050565b60008060408385031215614d1b57614d1a614776565b5b6000614d2985828601614967565b9250506020614d3a85828601614967565b9150509250929050565b614d4d81614b09565b82525050565b614d5c81614b45565b82525050565b614d6b81614b86565b82525050565b6000606082019050614d866000830186614d44565b614d936020830185614d53565b614da06040830184614d62565b949350505050565b600060ff82169050919050565b614dbe81614da8565b82525050565b6000602082019050614dd96000830184614db5565b92915050565b614de881614908565b82525050565b6000602082019050614e036000830184614ddf565b92915050565b60008060008060808587031215614e2357614e22614776565b5b6000614e3187828801614967565b9450506020614e4287828801614a0a565b9350506040614e5387828801614967565b9250506060614e6487828801614967565b91505092959194509250565b614e7981614b09565b82525050565b614e8881614b45565b82525050565b614e9781614b86565b82525050565b606082016000820151614eb36000850182614e70565b506020820151614ec66020850182614e7f565b506040820151614ed96040850182614e8e565b50505050565b6000606082019050614ef46000830184614e9d565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614f1f81614efa565b82525050565b6000602082019050614f3a6000830184614f16565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f8757607f821691505b602082108103614f9a57614f99614f40565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614fd6600783614841565b9150614fe182614fa0565b602082019050919050565b6000602082019050818103600083015261500581614fc9565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615042600a83614841565b915061504d8261500c565b602082019050919050565b6000602082019050818103600083015261507181615035565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150b282614946565b91506150bd83614946565b92508282039050818111156150d5576150d4615078565b5b92915050565b60006150e682614946565b91506150f183614946565b925082820190508082111561510957615108615078565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615145600a83614841565b91506151508261510f565b602082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b600061518682614946565b915061519183614946565b925082820261519f81614946565b915082820484148315176151b6576151b5615078565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151f782614946565b915061520283614946565b925082615212576152116151bd565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615253601183614841565b915061525e8261521d565b602082019050919050565b6000602082019050818103600083015261528281615246565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006152bf601283614841565b91506152ca82615289565b602082019050919050565b600060208201905081810360008301526152ee816152b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061535a600d83614841565b915061536582615324565b602082019050919050565b600060208201905081810360008301526153898161534d565b9050919050565b61539981614efa565b81146153a457600080fd5b50565b6000815190506153b681615390565b92915050565b6000602082840312156153d2576153d1614776565b5b60006153e0848285016153a7565b9150509291505056fea264697066735822122061d48fdedb03bbb6777540bb23e934a60aece815f70f2549550b05f804f37d7364736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 1028b4f..3f4e3d1 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleCap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index dac29c6..7da7239 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -138,7 +138,7 @@ contract DemurrageTokenSingleNocap { // ACL setup owner = msg.sender; - minter[owner] = true; + // minter[owner] = true; // ERC20 setup name = _name; @@ -228,6 +228,9 @@ contract DemurrageTokenSingleNocap { minter[_minter] = true; return true; } + function addWriter(address _minter) public returns (bool) { + return addMinter(_minter); + } // Given address will no longer be allowed to call the mintTo() function function removeMinter(address _minter) public returns (bool) { @@ -236,6 +239,9 @@ contract DemurrageTokenSingleNocap { minter[_minter] = false; return true; } + function deleteWriter(address _minter) public returns (bool) { + return removeMinter(_minter); + } /// Implements ERC20 function balanceOf(address _account) public view returns (uint256) { @@ -299,7 +305,8 @@ contract DemurrageTokenSingleNocap { require(applyExpiry() == 0); require(minter[msg.sender], 'ERR_ACCESS'); -changePeriod(); + + changePeriod(); if (maxSupply > 0) { require(supply + _amount <= maxSupply); } From 7982dbae97bbe9604503bac8573e8c9fa4b518e2 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 12 Feb 2023 08:31:08 +0000 Subject: [PATCH 40/57] Remove minter alias in contract --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 15 +++++++++++++-- python/erc20_demurrage_token/unittest/base.py | 6 ++++++ python/tests/test_amounts.py | 3 +++ solidity/DemurrageTokenSingleNocap.sol | 11 ++--------- 6 files changed, 26 insertions(+), 13 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index e94b85d..13b69dc 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200618438038062006184833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e49176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e6f176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161541f62000d65600039600081816111d10152818161160f015281816123df0152612a5d015260008181611ba2015281816123a2015281816129b501528181612bf90152612d1f015260008181611bce01528181612c2501528181612d400152612d850152600061166d015261541f6000f3fe608060405234801561001057600080fd5b50600436106103b6576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e11610206578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610c1f578063e809529514610c4f578063eda4e6d614610c6d578063f2fde38b14610c8b576103b6565b8063d7a52fa914610b85578063d89135cd14610ba1578063da2824a814610bbf578063e54063a614610bef576103b6565b8063b470aade11610106578063b470aade14610afb578063c0ab707714610b19578063d340ef8a14610b49578063d5abeb0114610b67576103b6565b8063a457c2d714610a7d578063a9059cbb14610aad578063b1cb0db314610add576103b6565b806379ba5097116101a45780638f0b2d5d116101735780638f0b2d5d146109f55780638f1df6bc14610a1157806395d89b4114610a2f578063983b2d5614610a4d576103b6565b806379ba50971461096b57806384dde4af1461098957806386fe212d146109a75780638da5cb5b146109d7576103b6565b8063731f237c116101e0578063731f237c146108e157806373f42561146108ff5780637445e33a1461091d57806374bedb951461094d576103b6565b80636a2d094e146108655780636f8b44b01461089557806370a08231146108b1576103b6565b80633092afd5116102eb578063449a52f81161028957806358b2833b1161025857806358b2833b146107c95780635ae06f7e146107e75780635f408c04146108175780636787a9be14610835576103b6565b8063449a52f81461070957806347a50517146107395780634abfbba21461076957806351b4541c14610799576103b6565b806331a5995d116102c557806331a5995d1461066d578063395093511461068b57806340452d91146106bb57806342966c68146106ed576103b6565b80633092afd5146105ef578063313334871461061f578063313ce5671461064f576103b6565b80631989c6a81161035857806323a859441161033257806323a859441461052f57806323b872dd1461055f5780632a7aec091461058f5780632c1758c1146105bf576103b6565b80631989c6a8146104c3578063213d1e1e146104e1578063229ba19714610511576103b6565b806309f28f3c1161039457806309f28f3c1461043957806311c566151461045757806318160ddd1461048757806318cbbcfc146104a5576103b6565b806301ffc9a7146103bb57806306fdde03146103eb578063095ea7b314610409575b600080fd5b6103d560048036038101906103d091906147d3565b610cbb565b6040516103e2919061481b565b60405180910390f35b6103f3610e61565b60405161040091906148c6565b60405180910390f35b610423600480360381019061041e919061497c565b610eef565b604051610430919061481b565b60405180910390f35b61044161112b565b60405161044e91906149d8565b60405180910390f35b610471600480360381019061046c9190614a1f565b61113e565b60405161047e9190614a6e565b60405180910390f35b61048f61118e565b60405161049c9190614a6e565b60405180910390f35b6104ad6111a5565b6040516104ba9190614a6e565b60405180910390f35b6104cb6111aa565b6040516104d89190614a6e565b60405180910390f35b6104fb60048036038101906104f69190614c2a565b6111b6565b6040516105089190614a6e565b60405180910390f35b6105196111cf565b60405161052691906149d8565b60405180910390f35b61054960048036038101906105449190614c2a565b6111f3565b604051610556919061481b565b60405180910390f35b61057960048036038101906105749190614c57565b61125b565b604051610586919061481b565b60405180910390f35b6105a960048036038101906105a49190614c2a565b611479565b6040516105b691906149d8565b60405180910390f35b6105d960048036038101906105d49190614caa565b6114b1565b6040516105e6919061481b565b60405180910390f35b61060960048036038101906106049190614cd7565b6114e4565b604051610616919061481b565b60405180910390f35b61063960048036038101906106349190614d04565b6115ee565b6040516106469190614a6e565b60405180910390f35b61065761166b565b6040516106649190614a6e565b60405180910390f35b61067561168f565b6040516106829190614a6e565b60405180910390f35b6106a560048036038101906106a0919061497c565b611695565b6040516106b2919061481b565b60405180910390f35b6106d560048036038101906106d09190614caa565b61182b565b6040516106e493929190614d71565b60405180910390f35b61070760048036038101906107029190614caa565b61189a565b005b610723600480360381019061071e919061497c565b6119d6565b604051610730919061481b565b60405180910390f35b610753600480360381019061074e9190614cd7565b611b55565b6040516107609190614a6e565b60405180910390f35b610783600480360381019061077e9190614caa565b611b9e565b6040516107909190614a6e565b60405180910390f35b6107b360048036038101906107ae9190614caa565b611bfe565b6040516107c09190614a6e565b60405180910390f35b6107d1611c1f565b6040516107de9190614a6e565b60405180910390f35b61080160048036038101906107fc9190614cd7565b611c25565b60405161080e919061481b565b60405180910390f35b61081f611c37565b60405161082c9190614dc4565b60405180910390f35b61084f600480360381019061084a9190614caa565b611d04565b60405161085c9190614a6e565b60405180910390f35b61087f600480360381019061087a9190614caa565b611d45565b60405161088c9190614a6e565b60405180910390f35b6108af60048036038101906108aa9190614caa565b611d66565b005b6108cb60048036038101906108c69190614cd7565b611e2e565b6040516108d89190614a6e565b60405180910390f35b6108e9611e98565b6040516108f69190614a6e565b60405180910390f35b610907611ea9565b6040516109149190614a6e565b60405180910390f35b61093760048036038101906109329190614c2a565b611eaf565b6040516109449190614a6e565b60405180910390f35b610955611edd565b6040516109629190614a6e565b60405180910390f35b610973611ee3565b604051610980919061481b565b60405180910390f35b61099161208a565b60405161099e9190614dee565b60405180910390f35b6109c160048036038101906109bc9190614caa565b6120b0565b6040516109ce9190614a6e565b60405180910390f35b6109df61218f565b6040516109ec9190614dee565b60405180910390f35b610a0f6004803603810190610a0a9190614cd7565b6121b5565b005b610a1961226a565b604051610a26919061481b565b60405180910390f35b610a3761252b565b604051610a4491906148c6565b60405180910390f35b610a676004803603810190610a629190614cd7565b6125b9565b604051610a74919061481b565b60405180910390f35b610a976004803603810190610a92919061497c565b61268d565b604051610aa4919061481b565b60405180910390f35b610ac76004803603810190610ac2919061497c565b6128ac565b604051610ad4919061481b565b60405180910390f35b610ae56129ad565b604051610af29190614a6e565b60405180910390f35b610b036129b3565b604051610b109190614a6e565b60405180910390f35b610b336004803603810190610b2e9190614caa565b6129d7565b604051610b409190614a6e565b60405180910390f35b610b51612b5e565b604051610b5e9190614a6e565b60405180910390f35b610b6f612b64565b604051610b7c9190614a6e565b60405180910390f35b610b9f6004803603810190610b9a9190614caa565b612b6a565b005b610ba9612c69565b604051610bb69190614a6e565b60405180910390f35b610bd96004803603810190610bd49190614cd7565b612c73565b604051610be6919061481b565b60405180910390f35b610c096004803603810190610c049190614c2a565b612c85565b604051610c169190614a6e565b60405180910390f35b610c396004803603810190610c349190614e09565b612c99565b604051610c469190614edf565b60405180910390f35b610c57612d19565b604051610c649190614f25565b60405180910390f35b610c75612d83565b604051610c829190614a6e565b60405180910390f35b610ca56004803603810190610ca09190614cd7565b612da7565b604051610cb2919061481b565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d0f5760019050610e5c565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d615760019050610e5c565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610db35760019050610e5c565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e055760019050610e5c565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e575760019050610e5c565b600090505b919050565b60068054610e6e90614f6f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9a90614f6f565b8015610ee75780601f10610ebc57610100808354040283529160200191610ee7565b820191906000526020600020905b815481529060010190602001808311610eca57829003601f168201915b505050505081565b6000806000610efc611c37565b905060028160ff1603610f1457600092505050611125565b60008160ff161115610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5290614fec565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110245760008414611023576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101a90615058565b60405180910390fd5b5b61102c61226a565b5061103684611d04565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111169190614a6e565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b60008061116561114d85612e49565b61116061115a6001612e49565b86612eb1565b612f18565b905061117081612f97565b67ffffffffffffffff168461118591906150a7565b91505092915050565b6000600b546008546111a091906150a7565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff1611156112105760009050611256565b6000826020015168ffffffffffffffffff1611156112315760009050611256565b6000826040015167ffffffffffffffff1611156112515760009050611256565b600190505b919050565b600080600080611269611c37565b905060028160ff16036112825760009350505050611472565b60008160ff1611156112c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c090614fec565b60405180910390fd5b6112d161226a565b506112db85611d04565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561136657600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113f291906150a7565b92505081905550611404878785612fcc565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516114639190614a6e565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114a8576114a56001612e49565b90505b80915050919050565b6000600f82106114c057600080fd5b600082036114d557600f6012541490506114df565b8160125483161490505b919050565b60006114f3600160ff166114b1565b156114fd57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061158457503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b61158d57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000806000806115fd86612e49565b925061160885612e49565b91506116347f000000000000000000000000000000000000000000000000000000000000000083612f18565b905061163f81612ff1565b905061164b8382612f18565b905061165681612f97565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806116a061226a565b506116aa83611d04565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173891906150db565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516118189190614a6e565b60405180910390a3600191505092915050565b6000818154811061183b57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006118a4611c37565b60ff16146118b157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661190757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561195357600080fd5b600061195e82611d04565b905061196a338261307e565b5081600b600082825461197d91906150db565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516119ca9190614a6e565b60405180910390a25050565b60008060006119e3611c37565b60ff16146119f057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a739061515b565b60405180910390fd5b611a8461226a565b5060006011541115611aad5760115483600854611aa191906150db565b1115611aac57600080fd5b5b8260086000828254611abf91906150db565b92505081905550611acf83611d04565b9050611adb8482613185565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b399190614a6e565b60405180910390a3611b49613249565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611bcc919061517b565b7f0000000000000000000000000000000000000000000000000000000000000000611bf791906150db565b9050919050565b6000603c8242611c0e91906150a7565b611c1891906151ec565b9050919050565b60035481565b6000611c30826114e4565b9050919050565b6000601060009054906101000a900460ff1615611c575760019050611d01565b6000600f5403611c6a5760009050611d01565b600f544210611cfc57611c97603c600354611c8591906151ec565b600f54611c9291906150a7565b6129d7565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611ce29190614a6e565b60405180910390a1611cf261226a565b5060029050611d01565b600090505b90565b600080611d28611d1384612e49565b600260009054906101000a9004600f0b61340d565b9050611d3381612f97565b67ffffffffffffffff16915050919050565b6000603c8242611d5591906150a7565b611d5f91906151ec565b9050919050565b611d73600860ff166114b1565b15611d7d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611dd757600080fd5b611ddf61118e565b8111611dea57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611e1c9190614a6e565b60405180910390a28060118190555050565b6000806000806000611e47611e4287611b55565b612e49565b9350611e54600354611bfe565b9150611e6f84600260009054906101000a9004600f0b612f18565b9250611e8d611e7d84612f97565b67ffffffffffffffff16836115ee565b945050505050919050565b6000611ea460006129d7565b905090565b600b5481565b6000806000611ebd846111b6565b9150611ec884611479565b9050611ed4828261113e565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ec90615269565b60405180910390fd5b600060125483161461213c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612133906152d5565b60405180910390fd5b816012600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc4160125460405161217d9190614a6e565b60405180910390a16012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6121c2600260ff166114b1565b156121cc57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461222657600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612274614730565b61227c614730565b612284614730565b6000806000806000612294611e98565b5061229d613499565b97506122a8886111f3565b156122be57600098505050505050505050612528565b6000600954815481106122d4576122d36152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061238188612c85565b945060018561239091906150db565b905061239b86611479565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123cb919061517b565b6123d591906151ec565b915061241161240c7f000000000000000000000000000000000000000000000000000000000000000061240785612e49565b612f18565b612ff1565b925061242760008461242161118e565b84612c99565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124e38761362f565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516125139190614a6e565b60405180910390a16001985050505050505050505b90565b6007805461253890614f6f565b80601f016020809104026020016040519081016040528092919081815260200182805461256490614f6f565b80156125b15780601f10612586576101008083540402835291602001916125b1565b820191906000526020600020905b81548152906001019060200180831161259457829003601f168201915b505050505081565b60006125c8600160ff166114b1565b156125d257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461262c57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008061269983611d04565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561272457600080fd5b61272c61226a565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b991906150a7565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128999190614a6e565b60405180910390a3600191505092915050565b6000806000806128ba611c37565b905060028160ff16036128d357600093505050506129a7565b60008160ff16111561291a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291190614fec565b60405180910390fd5b61292261226a565b5061292c85611d04565b9250612939338785612fcc565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129989190614a6e565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a01576000945050505050612b59565b612a0c600354611bfe565b925060008303612a23576000945050505050612b59565b600260009054906101000a9004600f0b9050600086118015612a4457508286105b15612a4d578592505b612a5683612e49565b9150612a827f000000000000000000000000000000000000000000000000000000000000000083612f18565b9350612a8d84612ff1565b9350612aa8600260009054906101000a9004600f0b85612f18565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612af0919061517b565b600354612afd91906150db565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b4991906149d8565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612b79600460ff166114b1565b15612b8357600080fd5b601060009054906101000a900460ff1615612b9d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bf757600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c23919061517b565b7f0000000000000000000000000000000000000000000000000000000000000000612c4e91906150db565b9050600f548111612c5e57600080fd5b80600f819055505050565b6000600b54905090565b6000612c7e826125b9565b9050919050565b6000816000015163ffffffff169050919050565b612ca1614730565b612ca9614730565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d6a91906150a7565b612d7491906151ec565b612d7e91906150db565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e0357600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e6057600080fd5b6040829060020a029050919050565b60008082600f0b13612e8057600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e9c8461374e565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f0557506f7fffffffffffffffffffffffffffffff600f0b8113155b612f0e57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f8457506f7fffffffffffffffffffffffffffffff600f0b8113155b612f8d57600080fd5b8091505092915050565b60008082600f0b1215612fa957600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612fd9858461307e565b50612fe48484613185565b5060019150509392505050565b60006840000000000000000082600f0b1261300b57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561303f5760009050613079565b6130766080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a828518041892505050613914565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130da576000935050505061317f565b6130e386611b55565b925084831015613128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311f90615370565b60405180910390fd5b848361313491906150a7565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131e15760009350505050613243565b6131ea86611b55565b925084836131f891906150db565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b6000613253614730565b600061325d61118e565b90506000600160008054905061327391906150a7565b81548110613284576132836152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061335f91906150a7565b815481106133705761336f6152f5565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361341e57600080fd5b600082600f0b604085600f0b9060020a028161343d5761343c6151bd565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561348657506f7fffffffffffffffffffffffffffffff600f0b8113155b61348f57600080fd5b8091505092915050565b6134a1614730565b6134a9614730565b6134b1614730565b600080600954815481106134c8576134c76152f5565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156135d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135f791906153bc565b6fffffffffffffffffffffffffffffffff16905061361483612c85565b81116136255781935050505061362c565b8293505050505b90565b600080600061363d84611eaf565b61364561118e565b61364f91906150a7565b9150600a5461365d83611d04565b61366791906150a7565b9050613695600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682613185565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137099190614a6e565b60405180910390a360016009600082825461372491906150db565b9250508190555080600a600082825461373d91906150db565b925050819055508192505050919050565b60008082600f0b1361375f57600080fd5b60008083600f0b905068010000000000000000811261379a576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126137c8576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137f4576010819060008212600003808260020a82851804189250505090506010820191505b610100811261381f576008819060008212600003808260020a82851804189250505090506008820191505b60108112613849576004819060008212600003808260020a82851804189250505090506004820191505b60048112613873576002819060008212600003808260020a82851804189250505090506002820191505b60028112613882576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b6000811315613907578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a82851804189250505090506138af565b5081945050505050919050565b60006840000000000000000082600f0b1261392e57600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613962576000905061472b565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b13156139b057608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139e95760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613a225760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a5b57608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a945760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613acd576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613b0657608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b3f576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b7757608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613baf5760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613be7576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613c1f5760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c57576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c8f57608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613cc75760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cff57608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613d365760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d6d576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613da457608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ddb576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613e1257608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e495760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e80576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613eb75760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eed576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613f2357608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f595760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f8f57608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613fc55760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613ffb576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561403157608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614067576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561409c57608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140d15760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b1315614106576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b131561413b5760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614170576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b13156141a557608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141da5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561420f57608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142435760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614277576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b13156142ab57608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142df576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561431357608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156143475760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b131561437b576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143af5760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143e2576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561441557608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156144485760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561447b57608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144ae5760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144e1576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561451457608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614547576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561457957608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145ab5760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145dd576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b131561460f5760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614641576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561467357608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b13156146a55760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156146d757608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561472657600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6147b08161477b565b81146147bb57600080fd5b50565b6000813590506147cd816147a7565b92915050565b6000602082840312156147e9576147e8614776565b5b60006147f7848285016147be565b91505092915050565b60008115159050919050565b61481581614800565b82525050565b6000602082019050614830600083018461480c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614870578082015181840152602081019050614855565b60008484015250505050565b6000601f19601f8301169050919050565b600061489882614836565b6148a28185614841565b93506148b2818560208601614852565b6148bb8161487c565b840191505092915050565b600060208201905081810360008301526148e0818461488d565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614913826148e8565b9050919050565b61492381614908565b811461492e57600080fd5b50565b6000813590506149408161491a565b92915050565b6000819050919050565b61495981614946565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b6000806040838503121561499357614992614776565b5b60006149a185828601614931565b92505060206149b285828601614967565b9150509250929050565b600081600f0b9050919050565b6149d2816149bc565b82525050565b60006020820190506149ed60008301846149c9565b92915050565b6149fc816149bc565b8114614a0757600080fd5b50565b600081359050614a19816149f3565b92915050565b60008060408385031215614a3657614a35614776565b5b6000614a4485828601614967565b9250506020614a5585828601614a0a565b9150509250929050565b614a6881614946565b82525050565b6000602082019050614a836000830184614a5f565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614ac68261487c565b810181811067ffffffffffffffff82111715614ae557614ae4614a8e565b5b80604052505050565b6000614af861476c565b9050614b048282614abd565b919050565b600063ffffffff82169050919050565b614b2281614b09565b8114614b2d57600080fd5b50565b600081359050614b3f81614b19565b92915050565b600068ffffffffffffffffff82169050919050565b614b6381614b45565b8114614b6e57600080fd5b50565b600081359050614b8081614b5a565b92915050565b600067ffffffffffffffff82169050919050565b614ba381614b86565b8114614bae57600080fd5b50565b600081359050614bc081614b9a565b92915050565b600060608284031215614bdc57614bdb614a89565b5b614be66060614aee565b90506000614bf684828501614b30565b6000830152506020614c0a84828501614b71565b6020830152506040614c1e84828501614bb1565b60408301525092915050565b600060608284031215614c4057614c3f614776565b5b6000614c4e84828501614bc6565b91505092915050565b600080600060608486031215614c7057614c6f614776565b5b6000614c7e86828701614931565b9350506020614c8f86828701614931565b9250506040614ca086828701614967565b9150509250925092565b600060208284031215614cc057614cbf614776565b5b6000614cce84828501614967565b91505092915050565b600060208284031215614ced57614cec614776565b5b6000614cfb84828501614931565b91505092915050565b60008060408385031215614d1b57614d1a614776565b5b6000614d2985828601614967565b9250506020614d3a85828601614967565b9150509250929050565b614d4d81614b09565b82525050565b614d5c81614b45565b82525050565b614d6b81614b86565b82525050565b6000606082019050614d866000830186614d44565b614d936020830185614d53565b614da06040830184614d62565b949350505050565b600060ff82169050919050565b614dbe81614da8565b82525050565b6000602082019050614dd96000830184614db5565b92915050565b614de881614908565b82525050565b6000602082019050614e036000830184614ddf565b92915050565b60008060008060808587031215614e2357614e22614776565b5b6000614e3187828801614967565b9450506020614e4287828801614a0a565b9350506040614e5387828801614967565b9250506060614e6487828801614967565b91505092959194509250565b614e7981614b09565b82525050565b614e8881614b45565b82525050565b614e9781614b86565b82525050565b606082016000820151614eb36000850182614e70565b506020820151614ec66020850182614e7f565b506040820151614ed96040850182614e8e565b50505050565b6000606082019050614ef46000830184614e9d565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614f1f81614efa565b82525050565b6000602082019050614f3a6000830184614f16565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f8757607f821691505b602082108103614f9a57614f99614f40565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614fd6600783614841565b9150614fe182614fa0565b602082019050919050565b6000602082019050818103600083015261500581614fc9565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615042600a83614841565b915061504d8261500c565b602082019050919050565b6000602082019050818103600083015261507181615035565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150b282614946565b91506150bd83614946565b92508282039050818111156150d5576150d4615078565b5b92915050565b60006150e682614946565b91506150f183614946565b925082820190508082111561510957615108615078565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b6000615145600a83614841565b91506151508261510f565b602082019050919050565b6000602082019050818103600083015261517481615138565b9050919050565b600061518682614946565b915061519183614946565b925082820261519f81614946565b915082820484148315176151b6576151b5615078565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151f782614946565b915061520283614946565b925082615212576152116151bd565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615253601183614841565b915061525e8261521d565b602082019050919050565b6000602082019050818103600083015261528281615246565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006152bf601283614841565b91506152ca82615289565b602082019050919050565b600060208201905081810360008301526152ee816152b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b600061535a600d83614841565b915061536582615324565b602082019050919050565b600060208201905081810360008301526153898161534d565b9050919050565b61539981614efa565b81146153a457600080fd5b50565b6000815190506153b681615390565b92915050565b6000602082840312156153d2576153d1614776565b5b60006153e0848285016153a7565b9150509291505056fea264697066735822122061d48fdedb03bbb6777540bb23e934a60aece815f70f2549550b05f804f37d7364736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b50604051620060ea380380620060ea833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002daf176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002dd5176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161538562000d656000396000818161115b0152818161148f015281816123570152612901015260008181611a220152818161231a0152818161285901528181612a9d0152612c85015260008181611a4e01528181612ac901528181612ca60152612ceb015260006114ed01526153856000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614739565b610c45565b6040516103cc9190614781565b60405180910390f35b6103dd610deb565b6040516103ea919061482c565b60405180910390f35b61040d600480360381019061040891906148e2565b610e79565b60405161041a9190614781565b60405180910390f35b61042b6110b5565b604051610438919061493e565b60405180910390f35b61045b60048036038101906104569190614985565b6110c8565b60405161046891906149d4565b60405180910390f35b610479611118565b60405161048691906149d4565b60405180910390f35b61049761112f565b6040516104a491906149d4565b60405180910390f35b6104b5611134565b6040516104c291906149d4565b60405180910390f35b6104e560048036038101906104e09190614b90565b611140565b6040516104f291906149d4565b60405180910390f35b610503611159565b604051610510919061493e565b60405180910390f35b610533600480360381019061052e9190614b90565b61117d565b6040516105409190614781565b60405180910390f35b610563600480360381019061055e9190614bbd565b6111e5565b6040516105709190614781565b60405180910390f35b610593600480360381019061058e9190614b90565b611403565b6040516105a0919061493e565b60405180910390f35b6105c360048036038101906105be9190614c10565b61143b565b6040516105d09190614781565b60405180910390f35b6105f360048036038101906105ee9190614c3d565b61146e565b60405161060091906149d4565b60405180910390f35b6106116114eb565b60405161061e91906149d4565b60405180910390f35b61062f61150f565b60405161063c91906149d4565b60405180910390f35b61065f600480360381019061065a91906148e2565b611515565b60405161066c9190614781565b60405180910390f35b61068f600480360381019061068a9190614c10565b6116ab565b60405161069e93929190614caa565b60405180910390f35b6106c160048036038101906106bc9190614c10565b61171a565b005b6106dd60048036038101906106d891906148e2565b611856565b6040516106ea9190614781565b60405180910390f35b61070d60048036038101906107089190614ce1565b6119d5565b60405161071a91906149d4565b60405180910390f35b61073d60048036038101906107389190614c10565b611a1e565b60405161074a91906149d4565b60405180910390f35b61076d60048036038101906107689190614c10565b611a7e565b60405161077a91906149d4565b60405180910390f35b61078b611a9f565b60405161079891906149d4565b60405180910390f35b6107bb60048036038101906107b69190614ce1565b611aa5565b6040516107c89190614781565b60405180910390f35b6107d9611baf565b6040516107e69190614d2a565b60405180910390f35b61080960048036038101906108049190614c10565b611c7c565b60405161081691906149d4565b60405180910390f35b61083960048036038101906108349190614c10565b611cbd565b60405161084691906149d4565b60405180910390f35b61086960048036038101906108649190614c10565b611cde565b005b61088560048036038101906108809190614ce1565b611da6565b60405161089291906149d4565b60405180910390f35b6108a3611e10565b6040516108b091906149d4565b60405180910390f35b6108c1611e21565b6040516108ce91906149d4565b60405180910390f35b6108f160048036038101906108ec9190614b90565b611e27565b6040516108fe91906149d4565b60405180910390f35b61090f611e55565b60405161091c91906149d4565b60405180910390f35b61092d611e5b565b60405161093a9190614781565b60405180910390f35b61094b612002565b6040516109589190614d54565b60405180910390f35b61097b60048036038101906109769190614c10565b612028565b60405161098891906149d4565b60405180910390f35b610999612107565b6040516109a69190614d54565b60405180910390f35b6109c960048036038101906109c49190614ce1565b61212d565b005b6109d36121e2565b6040516109e09190614781565b60405180910390f35b6109f16124a3565b6040516109fe919061482c565b60405180910390f35b610a216004803603810190610a1c91906148e2565b612531565b604051610a2e9190614781565b60405180910390f35b610a516004803603810190610a4c91906148e2565b612750565b604051610a5e9190614781565b60405180910390f35b610a6f612851565b604051610a7c91906149d4565b60405180910390f35b610a8d612857565b604051610a9a91906149d4565b60405180910390f35b610abd6004803603810190610ab89190614c10565b61287b565b604051610aca91906149d4565b60405180910390f35b610adb612a02565b604051610ae891906149d4565b60405180910390f35b610af9612a08565b604051610b0691906149d4565b60405180910390f35b610b296004803603810190610b249190614c10565b612a0e565b005b610b33612b0d565b604051610b4091906149d4565b60405180910390f35b610b636004803603810190610b5e9190614ce1565b612b17565b604051610b709190614781565b60405180910390f35b610b936004803603810190610b8e9190614b90565b612beb565b604051610ba091906149d4565b60405180910390f35b610bc36004803603810190610bbe9190614d6f565b612bff565b604051610bd09190614e45565b60405180910390f35b610be1612c7f565b604051610bee9190614e8b565b60405180910390f35b610bff612ce9565b604051610c0c91906149d4565b60405180910390f35b610c2f6004803603810190610c2a9190614ce1565b612d0d565b604051610c3c9190614781565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614ed5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614ed5565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611baf565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614f52565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614fbe565b60405180910390fd5b5b610fb66121e2565b50610fc084611c7c565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a091906149d4565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612daf565b6110ea6110e46001612daf565b86612e17565b612e7e565b90506110fa81612efd565b67ffffffffffffffff168461110f919061500d565b91505092915050565b6000600b5460085461112a919061500d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611baf565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614f52565b60405180910390fd5b61125b6121e2565b5061126585611c7c565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061500d565b9250508190555061138e878785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed91906149d4565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612daf565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612daf565b925061148885612daf565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612e7e565b90506114bf81612f57565b90506114cb8382612e7e565b90506114d681612efd565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115206121e2565b5061152a83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b89190615041565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161169891906149d4565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611baf565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611c7c565b90506117ea3382612fe4565b5081600b60008282546117fd9190615041565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a91906149d4565b60405180910390a25050565b6000806000611863611baf565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906150c1565b60405180910390fd5b6119046121e2565b506000601154111561192d57601154836008546119219190615041565b111561192c57600080fd5b5b826008600082825461193f9190615041565b9250508190555061194f83611c7c565b905061195b84826130eb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119b991906149d4565b60405180910390a36119c96131af565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a4c91906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000611a779190615041565b9050919050565b6000603c8242611a8e919061500d565b611a989190615152565b9050919050565b60035481565b6000611ab4600160ff1661143b565b15611abe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b4557503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611b4e57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611bcf5760019050611c79565b6000600f5403611be25760009050611c79565b600f544210611c7457611c0f603c600354611bfd9190615152565b600f54611c0a919061500d565b61287b565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c5a91906149d4565b60405180910390a1611c6a6121e2565b5060029050611c79565b600090505b90565b600080611ca0611c8b84612daf565b600260009054906101000a9004600f0b613373565b9050611cab81612efd565b67ffffffffffffffff16915050919050565b6000603c8242611ccd919061500d565b611cd79190615152565b9050919050565b611ceb600860ff1661143b565b15611cf557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d4f57600080fd5b611d57611118565b8111611d6257600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d9491906149d4565b60405180910390a28060118190555050565b6000806000806000611dbf611dba876119d5565b612daf565b9350611dcc600354611a7e565b9150611de784600260009054906101000a9004600f0b612e7e565b9250611e05611df584612efd565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e1c600061287b565b905090565b600b5481565b6000806000611e3584611140565b9150611e4084611403565b9050611e4c82826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010821061206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906151cf565b60405180910390fd5b60006012548316146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061523b565b60405180910390fd5b816012600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416012546040516120f591906149d4565b60405180910390a16012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61213a600260ff1661143b565b1561214457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461219e57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121ec614696565b6121f4614696565b6121fc614696565b600080600080600061220c611e10565b506122156133ff565b97506122208861117d565b15612236576000985050505050505050506124a0565b60006009548154811061224c5761224b61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122f988612beb565b94506001856123089190615041565b905061231386611403565b9350603c857f000000000000000000000000000000000000000000000000000000000000000061234391906150e1565b61234d9190615152565b91506123896123847f000000000000000000000000000000000000000000000000000000000000000061237f85612daf565b612e7e565b612f57565b925061239f600084612399611118565b84612bff565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061245b87613595565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161248b91906149d4565b60405180910390a16001985050505050505050505b90565b600780546124b090614ed5565b80601f01602080910402602001604051908101604052809291908181526020018280546124dc90614ed5565b80156125295780601f106124fe57610100808354040283529160200191612529565b820191906000526020600020905b81548152906001019060200180831161250c57829003601f168201915b505050505081565b60008061253d83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156125c857600080fd5b6125d06121e2565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265d919061500d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161273d91906149d4565b60405180910390a3600191505092915050565b60008060008061275e611baf565b905060028160ff1603612777576000935050505061284b565b60008160ff1611156127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590614f52565b60405180910390fd5b6127c66121e2565b506127d085611c7c565b92506127dd338785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161283c91906149d4565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156128a55760009450505050506129fd565b6128b0600354611a7e565b9250600083036128c75760009450505050506129fd565b600260009054906101000a9004600f0b90506000861180156128e857508286105b156128f1578592505b6128fa83612daf565b91506129267f000000000000000000000000000000000000000000000000000000000000000083612e7e565b935061293184612f57565b935061294c600260009054906101000a9004600f0b85612e7e565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361299491906150e1565b6003546129a19190615041565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129ed919061493e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a1d600460ff1661143b565b15612a2757600080fd5b601060009054906101000a900460ff1615612a4157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a9b57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612ac791906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000612af29190615041565b9050600f548111612b0257600080fd5b80600f819055505050565b6000600b54905090565b6000612b26600160ff1661143b565b15612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c07614696565b612c0f614696565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612cd0919061500d565b612cda9190615152565b612ce49190615041565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d6957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612dc657600080fd5b6040829060020a029050919050565b60008082600f0b13612de657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e02846136b4565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e6b57506f7fffffffffffffffffffffffffffffff600f0b8113155b612e7457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612eea57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ef357600080fd5b8091505092915050565b60008082600f0b1215612f0f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f3f8584612fe4565b50612f4a84846130eb565b5060019150509392505050565b60006840000000000000000082600f0b12612f7157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612fa55760009050612fdf565b612fdc6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061387a565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361304057600093505050506130e5565b613049866119d5565b92508483101561308e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613085906152d6565b60405180910390fd5b848361309a919061500d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361314757600093505050506131a9565b613150866119d5565b9250848361315e9190615041565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006131b9614696565b60006131c3611118565b9050600060016000805490506131d9919061500d565b815481106131ea576131e961525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506132c5919061500d565b815481106132d6576132d561525b565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361338457600080fd5b600082600f0b604085600f0b9060020a02816133a3576133a2615123565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156133ec57506f7fffffffffffffffffffffffffffffff600f0b8113155b6133f557600080fd5b8091505092915050565b613407614696565b61340f614696565b613417614696565b6000806009548154811061342e5761342d61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355d9190615322565b6fffffffffffffffffffffffffffffffff16905061357a83612beb565b811161358b57819350505050613592565b8293505050505b90565b60008060006135a384611e27565b6135ab611118565b6135b5919061500d565b9150600a546135c383611c7c565b6135cd919061500d565b90506135fb600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826130eb565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161366f91906149d4565b60405180910390a360016009600082825461368a9190615041565b9250508190555080600a60008282546136a39190615041565b925050819055508192505050919050565b60008082600f0b136136c557600080fd5b60008083600f0b9050680100000000000000008112613700576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261372e576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261375a576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613785576008819060008212600003808260020a82851804189250505090506008820191505b601081126137af576004819060008212600003808260020a82851804189250505090506004820191505b600481126137d9576002819060008212600003808260020a82851804189250505090506002820191505b600281126137e8576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561386d578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613815565b5081945050505050919050565b60006840000000000000000082600f0b1261389457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156138c85760009050614691565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561391657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561394f5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139885760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156139c157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139fa5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a33576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a6c57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613aa5576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613add57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b155760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613b4d576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b855760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613bbd576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613bf557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c2d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613c6557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c9c5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613cd3576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d0a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613d41576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d7857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613daf5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613de6576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e1d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613e53576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e8957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ebf5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613ef557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f2b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613f61576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f9757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613fcd576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561400257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140375760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561406c576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156140a15760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156140d6576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561410b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141405760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561417557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141a95760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156141dd576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561421157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614245576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561427957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156142ad5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156142e1576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143155760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614348576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561437b57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156143ae5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156143e157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144145760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614447576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561447a57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156144ad576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156144df57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145115760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614543576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145755760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156145a7576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156145d957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561460b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561463d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561468c57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614716816146e1565b811461472157600080fd5b50565b6000813590506147338161470d565b92915050565b60006020828403121561474f5761474e6146dc565b5b600061475d84828501614724565b91505092915050565b60008115159050919050565b61477b81614766565b82525050565b60006020820190506147966000830184614772565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147d65780820151818401526020810190506147bb565b60008484015250505050565b6000601f19601f8301169050919050565b60006147fe8261479c565b61480881856147a7565b93506148188185602086016147b8565b614821816147e2565b840191505092915050565b6000602082019050818103600083015261484681846147f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148798261484e565b9050919050565b6148898161486e565b811461489457600080fd5b50565b6000813590506148a681614880565b92915050565b6000819050919050565b6148bf816148ac565b81146148ca57600080fd5b50565b6000813590506148dc816148b6565b92915050565b600080604083850312156148f9576148f86146dc565b5b600061490785828601614897565b9250506020614918858286016148cd565b9150509250929050565b600081600f0b9050919050565b61493881614922565b82525050565b6000602082019050614953600083018461492f565b92915050565b61496281614922565b811461496d57600080fd5b50565b60008135905061497f81614959565b92915050565b6000806040838503121561499c5761499b6146dc565b5b60006149aa858286016148cd565b92505060206149bb85828601614970565b9150509250929050565b6149ce816148ac565b82525050565b60006020820190506149e960008301846149c5565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a2c826147e2565b810181811067ffffffffffffffff82111715614a4b57614a4a6149f4565b5b80604052505050565b6000614a5e6146d2565b9050614a6a8282614a23565b919050565b600063ffffffff82169050919050565b614a8881614a6f565b8114614a9357600080fd5b50565b600081359050614aa581614a7f565b92915050565b600068ffffffffffffffffff82169050919050565b614ac981614aab565b8114614ad457600080fd5b50565b600081359050614ae681614ac0565b92915050565b600067ffffffffffffffff82169050919050565b614b0981614aec565b8114614b1457600080fd5b50565b600081359050614b2681614b00565b92915050565b600060608284031215614b4257614b416149ef565b5b614b4c6060614a54565b90506000614b5c84828501614a96565b6000830152506020614b7084828501614ad7565b6020830152506040614b8484828501614b17565b60408301525092915050565b600060608284031215614ba657614ba56146dc565b5b6000614bb484828501614b2c565b91505092915050565b600080600060608486031215614bd657614bd56146dc565b5b6000614be486828701614897565b9350506020614bf586828701614897565b9250506040614c06868287016148cd565b9150509250925092565b600060208284031215614c2657614c256146dc565b5b6000614c34848285016148cd565b91505092915050565b60008060408385031215614c5457614c536146dc565b5b6000614c62858286016148cd565b9250506020614c73858286016148cd565b9150509250929050565b614c8681614a6f565b82525050565b614c9581614aab565b82525050565b614ca481614aec565b82525050565b6000606082019050614cbf6000830186614c7d565b614ccc6020830185614c8c565b614cd96040830184614c9b565b949350505050565b600060208284031215614cf757614cf66146dc565b5b6000614d0584828501614897565b91505092915050565b600060ff82169050919050565b614d2481614d0e565b82525050565b6000602082019050614d3f6000830184614d1b565b92915050565b614d4e8161486e565b82525050565b6000602082019050614d696000830184614d45565b92915050565b60008060008060808587031215614d8957614d886146dc565b5b6000614d97878288016148cd565b9450506020614da887828801614970565b9350506040614db9878288016148cd565b9250506060614dca878288016148cd565b91505092959194509250565b614ddf81614a6f565b82525050565b614dee81614aab565b82525050565b614dfd81614aec565b82525050565b606082016000820151614e196000850182614dd6565b506020820151614e2c6020850182614de5565b506040820151614e3f6040850182614df4565b50505050565b6000606082019050614e5a6000830184614e03565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e8581614e60565b82525050565b6000602082019050614ea06000830184614e7c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614eed57607f821691505b602082108103614f0057614eff614ea6565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f3c6007836147a7565b9150614f4782614f06565b602082019050919050565b60006020820190508181036000830152614f6b81614f2f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614fa8600a836147a7565b9150614fb382614f72565b602082019050919050565b60006020820190508181036000830152614fd781614f9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615018826148ac565b9150615023836148ac565b925082820390508181111561503b5761503a614fde565b5b92915050565b600061504c826148ac565b9150615057836148ac565b925082820190508082111561506f5761506e614fde565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150ab600a836147a7565b91506150b682615075565b602082019050919050565b600060208201905081810360008301526150da8161509e565b9050919050565b60006150ec826148ac565b91506150f7836148ac565b9250828202615105816148ac565b9150828204841483151761511c5761511b614fde565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061515d826148ac565b9150615168836148ac565b92508261517857615177615123565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006151b96011836147a7565b91506151c482615183565b602082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006152256012836147a7565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006152c0600d836147a7565b91506152cb8261528a565b602082019050919050565b600060208201905081810360008301526152ef816152b3565b9050919050565b6152ff81614e60565b811461530a57600080fd5b50565b60008151905061531c816152f6565b92915050565b600060208284031215615338576153376146dc565b5b60006153468482850161530d565b9150509291505056fea2646970667358221220c1f9d7d0a78f33fa80a4cedd3716f7ce66fd86bb2bab9cbeea3a9c3110f2399e64736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 3f4e3d1..5dd5136 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"removeMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 2cc80fc..228455b 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -146,9 +146,14 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return tx + # backwards compatibility def add_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): + return self.add_writer(contract_address, sender_address, address, tx_format=tx_format) + + + def add_writer(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() - enc.method('addMinter') + enc.method('addWriter') enc.typ(ABIContractType.ADDRESS) enc.address(address) data = enc.get() @@ -169,9 +174,15 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): tx = self.finalize(tx, tx_format) return tx + + # backwards compatibility def remove_minter(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): + return self.delete_writer(contract_address, sender_address, address, tx_format=tx_format) + + + def delete_writer(self, contract_address, sender_address, address, tx_format=TxFormat.JSONRPC): enc = ABIContractEncoder() - enc.method('removeMinter') + enc.method('deleteWriter') enc.typ(ABIContractType.ADDRESS) enc.address(address) data = enc.get() diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index 8de0670..ab30a44 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -77,6 +77,12 @@ class TestTokenDeploy: r = rpc.do(o) self.start_time = r['timestamp'] + (tx_hash, o) = interface.add_writer(self.address, deployer_address, deployer_address) + r = rpc.do(o) + o = receipt(tx_hash) + r = rpc.do(o) + assert r['status'] == 1 + return self.address diff --git a/python/tests/test_amounts.py b/python/tests/test_amounts.py index 0c745eb..dc28f82 100644 --- a/python/tests/test_amounts.py +++ b/python/tests/test_amounts.py @@ -27,6 +27,9 @@ class TestAmounts(TestDemurrageDefault): c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1000) r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) self.backend.time_travel(self.start_time + self.period_seconds) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 7da7239..06ba0ed 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -138,7 +138,6 @@ contract DemurrageTokenSingleNocap { // ACL setup owner = msg.sender; - // minter[owner] = true; // ERC20 setup name = _name; @@ -222,26 +221,20 @@ contract DemurrageTokenSingleNocap { } // Given address will be allowed to call the mintTo() function - function addMinter(address _minter) public returns (bool) { + function addWriter(address _minter) public returns (bool) { require(!isSealed(MINTER_STATE)); require(msg.sender == owner); minter[_minter] = true; return true; } - function addWriter(address _minter) public returns (bool) { - return addMinter(_minter); - } // Given address will no longer be allowed to call the mintTo() function - function removeMinter(address _minter) public returns (bool) { + function deleteWriter(address _minter) public returns (bool) { require(!isSealed(MINTER_STATE)); require(msg.sender == owner || _minter == msg.sender); minter[_minter] = false; return true; } - function deleteWriter(address _minter) public returns (bool) { - return removeMinter(_minter); - } /// Implements ERC20 function balanceOf(address _account) public view returns (uint256) { From fab1b2d4b844048bcfcf9fb17cd210a78331bc7a Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 12 Feb 2023 08:33:22 +0000 Subject: [PATCH 41/57] Bump version --- python/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.cfg b/python/setup.cfg index f16b152..03dba0d 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.2 +version = 0.3.3 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From cf1e716b5a68234714426742235a157e0c489fe4 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 12 Feb 2023 13:53:36 +0000 Subject: [PATCH 42/57] Fix bogus demurrage calculation in publish script --- python/erc20_demurrage_token/runnable/publish.py | 3 ++- python/setup.cfg | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/erc20_demurrage_token/runnable/publish.py b/python/erc20_demurrage_token/runnable/publish.py index 487b26f..7cf72dc 100644 --- a/python/erc20_demurrage_token/runnable/publish.py +++ b/python/erc20_demurrage_token/runnable/publish.py @@ -68,10 +68,11 @@ def process_config_local(config, arg, args, flags): config.add(sink_address, 'TOKEN_SINK_ADDRESS') config.add(args.redistribution_period, 'TOKEN_REDISTRIBUTION_PERIOD') - v = args.demurrage_level / 1000000 + v = (1 - (args.demurrage_level / 1000000)) ** (1 / config.get('TOKEN_REDISTRIBUTION_PERIOD')) if v >= 1.0: raise ValueError('demurrage level must be less than 100%') demurrage_level = to_fixed(v) + logg.info('v {} demurrage level {}'.format(v, demurrage_level)) config.add(demurrage_level, 'TOKEN_DEMURRAGE_LEVEL') return config diff --git a/python/setup.cfg b/python/setup.cfg index 03dba0d..f3bc196 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.3 +version = 0.3.4 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From c31649fed248f2e210c05b76f41cd587d9d8deab Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 14 Feb 2023 07:23:59 +0000 Subject: [PATCH 43/57] Implement chainlib gen --- python/erc20_demurrage_token/__init__.py | 3 ++ python/erc20_demurrage_token/data/.chainlib | 0 python/erc20_demurrage_token/token.py | 56 +++++++++++++++------ python/requirements.txt | 2 +- python/tests/test_mint.py | 51 +++++++++++++++++++ 5 files changed, 97 insertions(+), 15 deletions(-) create mode 100644 python/erc20_demurrage_token/data/.chainlib create mode 100644 python/tests/test_mint.py diff --git a/python/erc20_demurrage_token/__init__.py b/python/erc20_demurrage_token/__init__.py index cca6191..55ef0bf 100644 --- a/python/erc20_demurrage_token/__init__.py +++ b/python/erc20_demurrage_token/__init__.py @@ -3,3 +3,6 @@ from .token import ( DemurrageTokenSettings, DemurrageRedistribution, ) +from .token import create +from .token import bytecode +from .token import args diff --git a/python/erc20_demurrage_token/data/.chainlib b/python/erc20_demurrage_token/data/.chainlib new file mode 100644 index 0000000..e69de29 diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 228455b..27451cc 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -78,28 +78,34 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): __abi = {} __bytecode = {} - def constructor(self, sender_address, settings, tx_format=TxFormat.JSONRPC): - code = DemurrageToken.bytecode() - enc = ABIContractEncoder() - enc.string(settings.name) - enc.string(settings.symbol) - enc.uint256(settings.decimals) - enc.uint256(settings.demurrage_level) - enc.uint256(settings.period_minutes) - enc.address(settings.sink_address) - code += enc.get() + def constructor(self, sender_address, settings, tx_format=TxFormat.JSONRPC, version=None): + code = self.cargs(settings.name, settings.symbol, settings.decimals, settings.demurrage_level, settings.period_minutes, settings.sink_address, version=version) tx = self.template(sender_address, None, use_nonce=True) tx = self.set_code(tx, code) return self.finalize(tx, tx_format) @staticmethod - def gas(code=None): - return 4000000 + def cargs(name, symbol, decimals, demurrage_level, period_minutes, sink_address, version=None): + code = DemurrageToken.bytecode() + enc = ABIContractEncoder() + enc.string(name) + enc.string(symbol) + enc.uint256(decimals) + enc.uint256(demurrage_level) + enc.uint256(period_minutes) + enc.address(sink_address) + code += enc.get() + return code @staticmethod - def abi(multi=True): + def gas(code=None): + return 6000000 + + + @staticmethod + def abi(): name = 'DemurrageTokenSingleNocap' if DemurrageToken.__abi.get(name) == None: f = open(os.path.join(data_dir, name + '.json'), 'r') @@ -109,7 +115,7 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): @staticmethod - def bytecode(multi=True): + def bytecode(version=None): name = 'DemurrageTokenSingleNocap' if DemurrageToken.__bytecode.get(name) == None: f = open(os.path.join(data_dir, name + '.bin'), 'r') @@ -665,3 +671,25 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): def parse_total_burned(self, v): return abi_decode_single(ABIContractType.UINT256, v) + +def bytecode(**kwargs): + return DemurrageToken.bytecode(version=kwargs.get('version')) + + +def create(**kwargs): + return DemurrageToken.cargs( + kwargs['name'], + kwargs['symbol'], + kwargs['decimals'], + kwargs['demurragelevel'], + kwargs['redistributionperiod'], + kwargs['sinkaddress'], + version=kwargs.get('version')) + + +def args(v): + if v == 'create': + return (['name', 'symbol', 'decimals', 'demurragelevel', 'redistributionperiod', 'sinkaddress'], ['version'],) + elif v == 'default' or v == 'bytecode': + return ([], ['version'],) + raise ValueError('unknown command: ' + v) diff --git a/python/requirements.txt b/python/requirements.txt index 9dbeab8..ba0e52f 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,4 +1,4 @@ chainlib-eth~=0.4.11 eth-erc20~=0.5.0 funga-eth~=0.6.0 -dexif~=0.0.1 +dexif~=0.0.2 diff --git a/python/tests/test_mint.py b/python/tests/test_mint.py new file mode 100644 index 0000000..1458dc4 --- /dev/null +++ b/python/tests/test_mint.py @@ -0,0 +1,51 @@ +# standard imports +import os +import unittest +import json +import logging + +# external imports +from chainlib.eth.constant import ZERO_ADDRESS +from chainlib.eth.nonce import RPCNonceOracle +from chainlib.eth.tx import receipt +from chainlib.eth.block import block_latest +from chainlib.eth.block import block_by_number + +# local imports +from erc20_demurrage_token import DemurrageToken + +# test imports +from erc20_demurrage_token.unittest import TestDemurrageDefault + +logging.basicConfig(level=logging.DEBUG) +logg = logging.getLogger() + +testdir = os.path.dirname(__file__) + +class TestAmounts(TestDemurrageDefault): + + def test_mint(self): + o = block_latest() + r = self.rpc.do(o) + o = block_by_number(r) + r = self.rpc.do(o) + tb = r['timestamp'] + self.backend.time_travel(self.start_time + 800) + o = block_latest() + r = self.rpc.do(o) + o = block_by_number(r) + r = self.rpc.do(o) + ta = r['timestamp'] + logg.info('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< {} {} {}'.format(tb, ta, ta-tb)) + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[1], 1000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + +if __name__ == '__main__': + unittest.main() From 21ea0da020bba2c38f0dc883303da2e70185a7b2 Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 14 Feb 2023 07:26:35 +0000 Subject: [PATCH 44/57] Upgrade deps --- python/requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/python/requirements.txt b/python/requirements.txt index ba0e52f..e119d6e 100644 --- a/python/requirements.txt +++ b/python/requirements.txt @@ -1,4 +1,5 @@ chainlib-eth~=0.4.11 -eth-erc20~=0.5.0 +chainlib~=0.4.8 +eth-erc20~=0.5.5 funga-eth~=0.6.0 dexif~=0.0.2 From 5d585fc2081174e4d6ee4228ab6156d639f4d3ec Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 14 Feb 2023 07:28:14 +0000 Subject: [PATCH 45/57] Bump version --- python/setup.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/setup.cfg b/python/setup.cfg index f3bc196..09e09d7 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.4 +version = 0.3.5 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From 75c16b7198964fdb4f8be28cbcc6ff72ae8fa2f1 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Feb 2023 08:07:25 +0000 Subject: [PATCH 46/57] REinstate owner as minter by default --- python/CHANGELOG | 2 ++ .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/unittest/base.py | 6 ---- python/setup.cfg | 2 +- python/tests/test_mint.py | 28 ++++++++++++++++++- solidity/DemurrageTokenSingleNocap.sol | 13 +++++---- 7 files changed, 39 insertions(+), 16 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 4976f3c..18efe08 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,5 @@ +- 0.3.6 + * Reinstate owner as minter by default - 0.3.0 * Smart contracts use abdk math libraries, all exponential operations are static gas cost * Add expiry features, after which balances are frozen and no more transfers or demurrage will occur diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 13b69dc..0e1f8d7 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b50604051620060ea380380620060ea833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002daf176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002dd5176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161538562000d656000396000818161115b0152818161148f015281816123570152612901015260008181611a220152818161231a0152818161285901528181612a9d0152612c85015260008181611a4e01528181612ac901528181612ca60152612ceb015260006114ed01526153856000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614739565b610c45565b6040516103cc9190614781565b60405180910390f35b6103dd610deb565b6040516103ea919061482c565b60405180910390f35b61040d600480360381019061040891906148e2565b610e79565b60405161041a9190614781565b60405180910390f35b61042b6110b5565b604051610438919061493e565b60405180910390f35b61045b60048036038101906104569190614985565b6110c8565b60405161046891906149d4565b60405180910390f35b610479611118565b60405161048691906149d4565b60405180910390f35b61049761112f565b6040516104a491906149d4565b60405180910390f35b6104b5611134565b6040516104c291906149d4565b60405180910390f35b6104e560048036038101906104e09190614b90565b611140565b6040516104f291906149d4565b60405180910390f35b610503611159565b604051610510919061493e565b60405180910390f35b610533600480360381019061052e9190614b90565b61117d565b6040516105409190614781565b60405180910390f35b610563600480360381019061055e9190614bbd565b6111e5565b6040516105709190614781565b60405180910390f35b610593600480360381019061058e9190614b90565b611403565b6040516105a0919061493e565b60405180910390f35b6105c360048036038101906105be9190614c10565b61143b565b6040516105d09190614781565b60405180910390f35b6105f360048036038101906105ee9190614c3d565b61146e565b60405161060091906149d4565b60405180910390f35b6106116114eb565b60405161061e91906149d4565b60405180910390f35b61062f61150f565b60405161063c91906149d4565b60405180910390f35b61065f600480360381019061065a91906148e2565b611515565b60405161066c9190614781565b60405180910390f35b61068f600480360381019061068a9190614c10565b6116ab565b60405161069e93929190614caa565b60405180910390f35b6106c160048036038101906106bc9190614c10565b61171a565b005b6106dd60048036038101906106d891906148e2565b611856565b6040516106ea9190614781565b60405180910390f35b61070d60048036038101906107089190614ce1565b6119d5565b60405161071a91906149d4565b60405180910390f35b61073d60048036038101906107389190614c10565b611a1e565b60405161074a91906149d4565b60405180910390f35b61076d60048036038101906107689190614c10565b611a7e565b60405161077a91906149d4565b60405180910390f35b61078b611a9f565b60405161079891906149d4565b60405180910390f35b6107bb60048036038101906107b69190614ce1565b611aa5565b6040516107c89190614781565b60405180910390f35b6107d9611baf565b6040516107e69190614d2a565b60405180910390f35b61080960048036038101906108049190614c10565b611c7c565b60405161081691906149d4565b60405180910390f35b61083960048036038101906108349190614c10565b611cbd565b60405161084691906149d4565b60405180910390f35b61086960048036038101906108649190614c10565b611cde565b005b61088560048036038101906108809190614ce1565b611da6565b60405161089291906149d4565b60405180910390f35b6108a3611e10565b6040516108b091906149d4565b60405180910390f35b6108c1611e21565b6040516108ce91906149d4565b60405180910390f35b6108f160048036038101906108ec9190614b90565b611e27565b6040516108fe91906149d4565b60405180910390f35b61090f611e55565b60405161091c91906149d4565b60405180910390f35b61092d611e5b565b60405161093a9190614781565b60405180910390f35b61094b612002565b6040516109589190614d54565b60405180910390f35b61097b60048036038101906109769190614c10565b612028565b60405161098891906149d4565b60405180910390f35b610999612107565b6040516109a69190614d54565b60405180910390f35b6109c960048036038101906109c49190614ce1565b61212d565b005b6109d36121e2565b6040516109e09190614781565b60405180910390f35b6109f16124a3565b6040516109fe919061482c565b60405180910390f35b610a216004803603810190610a1c91906148e2565b612531565b604051610a2e9190614781565b60405180910390f35b610a516004803603810190610a4c91906148e2565b612750565b604051610a5e9190614781565b60405180910390f35b610a6f612851565b604051610a7c91906149d4565b60405180910390f35b610a8d612857565b604051610a9a91906149d4565b60405180910390f35b610abd6004803603810190610ab89190614c10565b61287b565b604051610aca91906149d4565b60405180910390f35b610adb612a02565b604051610ae891906149d4565b60405180910390f35b610af9612a08565b604051610b0691906149d4565b60405180910390f35b610b296004803603810190610b249190614c10565b612a0e565b005b610b33612b0d565b604051610b4091906149d4565b60405180910390f35b610b636004803603810190610b5e9190614ce1565b612b17565b604051610b709190614781565b60405180910390f35b610b936004803603810190610b8e9190614b90565b612beb565b604051610ba091906149d4565b60405180910390f35b610bc36004803603810190610bbe9190614d6f565b612bff565b604051610bd09190614e45565b60405180910390f35b610be1612c7f565b604051610bee9190614e8b565b60405180910390f35b610bff612ce9565b604051610c0c91906149d4565b60405180910390f35b610c2f6004803603810190610c2a9190614ce1565b612d0d565b604051610c3c9190614781565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614ed5565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614ed5565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611baf565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614f52565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa490614fbe565b60405180910390fd5b5b610fb66121e2565b50610fc084611c7c565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a091906149d4565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612daf565b6110ea6110e46001612daf565b86612e17565b612e7e565b90506110fa81612efd565b67ffffffffffffffff168461110f919061500d565b91505092915050565b6000600b5460085461112a919061500d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611baf565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614f52565b60405180910390fd5b61125b6121e2565b5061126585611c7c565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061500d565b9250508190555061138e878785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed91906149d4565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612daf565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612daf565b925061148885612daf565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612e7e565b90506114bf81612f57565b90506114cb8382612e7e565b90506114d681612efd565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115206121e2565b5061152a83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b89190615041565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161169891906149d4565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611baf565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611c7c565b90506117ea3382612fe4565b5081600b60008282546117fd9190615041565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a91906149d4565b60405180910390a25050565b6000806000611863611baf565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f3906150c1565b60405180910390fd5b6119046121e2565b506000601154111561192d57601154836008546119219190615041565b111561192c57600080fd5b5b826008600082825461193f9190615041565b9250508190555061194f83611c7c565b905061195b84826130eb565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f8856040516119b991906149d4565b60405180910390a36119c96131af565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611a4c91906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000611a779190615041565b9050919050565b6000603c8242611a8e919061500d565b611a989190615152565b9050919050565b60035481565b6000611ab4600160ff1661143b565b15611abe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b4557503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611b4e57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611bcf5760019050611c79565b6000600f5403611be25760009050611c79565b600f544210611c7457611c0f603c600354611bfd9190615152565b600f54611c0a919061500d565b61287b565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611c5a91906149d4565b60405180910390a1611c6a6121e2565b5060029050611c79565b600090505b90565b600080611ca0611c8b84612daf565b600260009054906101000a9004600f0b613373565b9050611cab81612efd565b67ffffffffffffffff16915050919050565b6000603c8242611ccd919061500d565b611cd79190615152565b9050919050565b611ceb600860ff1661143b565b15611cf557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d4f57600080fd5b611d57611118565b8111611d6257600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611d9491906149d4565b60405180910390a28060118190555050565b6000806000806000611dbf611dba876119d5565b612daf565b9350611dcc600354611a7e565b9150611de784600260009054906101000a9004600f0b612e7e565b9250611e05611df584612efd565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e1c600061287b565b905090565b600b5481565b6000806000611e3584611140565b9150611e4084611403565b9050611e4c82826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611eb857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006010821061206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906151cf565b60405180910390fd5b60006012548316146120b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ab9061523b565b60405180910390fd5b816012600082825417925050819055507fdd5e7cad9599c1dcaa8d5adcd88f157fc5fada62511c0d3edb1bfd3b778acc416012546040516120f591906149d4565b60405180910390a16012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61213a600260ff1661143b565b1561214457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461219e57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006121ec614696565b6121f4614696565b6121fc614696565b600080600080600061220c611e10565b506122156133ff565b97506122208861117d565b15612236576000985050505050505050506124a0565b60006009548154811061224c5761224b61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505095506122f988612beb565b94506001856123089190615041565b905061231386611403565b9350603c857f000000000000000000000000000000000000000000000000000000000000000061234391906150e1565b61234d9190615152565b91506123896123847f000000000000000000000000000000000000000000000000000000000000000061237f85612daf565b612e7e565b612f57565b925061239f600084612399611118565b84612bff565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061245b87613595565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161248b91906149d4565b60405180910390a16001985050505050505050505b90565b600780546124b090614ed5565b80601f01602080910402602001604051908101604052809291908181526020018280546124dc90614ed5565b80156125295780601f106124fe57610100808354040283529160200191612529565b820191906000526020600020905b81548152906001019060200180831161250c57829003601f168201915b505050505081565b60008061253d83611c7c565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156125c857600080fd5b6125d06121e2565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265d919061500d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161273d91906149d4565b60405180910390a3600191505092915050565b60008060008061275e611baf565b905060028160ff1603612777576000935050505061284b565b60008160ff1611156127be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b590614f52565b60405180910390fd5b6127c66121e2565b506127d085611c7c565b92506127dd338785612f32565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161283c91906149d4565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156128a55760009450505050506129fd565b6128b0600354611a7e565b9250600083036128c75760009450505050506129fd565b600260009054906101000a9004600f0b90506000861180156128e857508286105b156128f1578592505b6128fa83612daf565b91506129267f000000000000000000000000000000000000000000000000000000000000000083612e7e565b935061293184612f57565b935061294c600260009054906101000a9004600f0b85612e7e565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c8361299491906150e1565b6003546129a19190615041565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b6040516129ed919061493e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a1d600460ff1661143b565b15612a2757600080fd5b601060009054906101000a900460ff1615612a4157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a9b57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612ac791906150e1565b7f0000000000000000000000000000000000000000000000000000000000000000612af29190615041565b9050600f548111612b0257600080fd5b80600f819055505050565b6000600b54905090565b6000612b26600160ff1661143b565b15612b3057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b8a57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c07614696565b612c0f614696565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612cd0919061500d565b612cda9190615152565b612ce49190615041565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d6957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612dc657600080fd5b6040829060020a029050919050565b60008082600f0b13612de657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e02846136b4565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612e6b57506f7fffffffffffffffffffffffffffffff600f0b8113155b612e7457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612eea57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ef357600080fd5b8091505092915050565b60008082600f0b1215612f0f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f3f8584612fe4565b50612f4a84846130eb565b5060019150509392505050565b60006840000000000000000082600f0b12612f7157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215612fa55760009050612fdf565b612fdc6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a82851804189250505061387a565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361304057600093505050506130e5565b613049866119d5565b92508483101561308e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613085906152d6565b60405180910390fd5b848361309a919061500d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361314757600093505050506131a9565b613150866119d5565b9250848361315e9190615041565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006131b9614696565b60006131c3611118565b9050600060016000805490506131d9919061500d565b815481106131ea576131e961525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506132c5919061500d565b815481106132d6576132d561525b565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361338457600080fd5b600082600f0b604085600f0b9060020a02816133a3576133a2615123565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b81121580156133ec57506f7fffffffffffffffffffffffffffffff600f0b8113155b6133f557600080fd5b8091505092915050565b613407614696565b61340f614696565b613417614696565b6000806009548154811061342e5761342d61525b565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613539573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355d9190615322565b6fffffffffffffffffffffffffffffffff16905061357a83612beb565b811161358b57819350505050613592565b8293505050505b90565b60008060006135a384611e27565b6135ab611118565b6135b5919061500d565b9150600a546135c383611c7c565b6135cd919061500d565b90506135fb600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826130eb565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161366f91906149d4565b60405180910390a360016009600082825461368a9190615041565b9250508190555080600a60008282546136a39190615041565b925050819055508192505050919050565b60008082600f0b136136c557600080fd5b60008083600f0b9050680100000000000000008112613700576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261372e576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261375a576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613785576008819060008212600003808260020a82851804189250505090506008820191505b601081126137af576004819060008212600003808260020a82851804189250505090506004820191505b600481126137d9576002819060008212600003808260020a82851804189250505090506002820191505b600281126137e8576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561386d578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613815565b5081945050505050919050565b60006840000000000000000082600f0b1261389457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156138c85760009050614691565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561391657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b131561394f5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139885760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b13156139c157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b13156139fa5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a33576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613a6c57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613aa5576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613add57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b155760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613b4d576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613b855760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613bbd576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613bf557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c2d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613c6557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613c9c5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613cd3576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d0a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613d41576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613d7857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613daf5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613de6576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e1d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613e53576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613e8957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ebf5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613ef557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f2b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613f61576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613f9757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315613fcd576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561400257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140375760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561406c576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156140a15760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b13156140d6576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561410b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141405760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b131561417557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156141a95760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b13156141dd576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561421157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614245576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b131561427957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156142ad5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b13156142e1576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143155760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614348576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b131561437b57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156143ae5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b13156143e157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144145760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614447576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b131561447a57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156144ad576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b13156144df57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145115760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614543576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145755760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156145a7576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b13156145d957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561460b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561463d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561468c57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614716816146e1565b811461472157600080fd5b50565b6000813590506147338161470d565b92915050565b60006020828403121561474f5761474e6146dc565b5b600061475d84828501614724565b91505092915050565b60008115159050919050565b61477b81614766565b82525050565b60006020820190506147966000830184614772565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156147d65780820151818401526020810190506147bb565b60008484015250505050565b6000601f19601f8301169050919050565b60006147fe8261479c565b61480881856147a7565b93506148188185602086016147b8565b614821816147e2565b840191505092915050565b6000602082019050818103600083015261484681846147f3565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148798261484e565b9050919050565b6148898161486e565b811461489457600080fd5b50565b6000813590506148a681614880565b92915050565b6000819050919050565b6148bf816148ac565b81146148ca57600080fd5b50565b6000813590506148dc816148b6565b92915050565b600080604083850312156148f9576148f86146dc565b5b600061490785828601614897565b9250506020614918858286016148cd565b9150509250929050565b600081600f0b9050919050565b61493881614922565b82525050565b6000602082019050614953600083018461492f565b92915050565b61496281614922565b811461496d57600080fd5b50565b60008135905061497f81614959565b92915050565b6000806040838503121561499c5761499b6146dc565b5b60006149aa858286016148cd565b92505060206149bb85828601614970565b9150509250929050565b6149ce816148ac565b82525050565b60006020820190506149e960008301846149c5565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a2c826147e2565b810181811067ffffffffffffffff82111715614a4b57614a4a6149f4565b5b80604052505050565b6000614a5e6146d2565b9050614a6a8282614a23565b919050565b600063ffffffff82169050919050565b614a8881614a6f565b8114614a9357600080fd5b50565b600081359050614aa581614a7f565b92915050565b600068ffffffffffffffffff82169050919050565b614ac981614aab565b8114614ad457600080fd5b50565b600081359050614ae681614ac0565b92915050565b600067ffffffffffffffff82169050919050565b614b0981614aec565b8114614b1457600080fd5b50565b600081359050614b2681614b00565b92915050565b600060608284031215614b4257614b416149ef565b5b614b4c6060614a54565b90506000614b5c84828501614a96565b6000830152506020614b7084828501614ad7565b6020830152506040614b8484828501614b17565b60408301525092915050565b600060608284031215614ba657614ba56146dc565b5b6000614bb484828501614b2c565b91505092915050565b600080600060608486031215614bd657614bd56146dc565b5b6000614be486828701614897565b9350506020614bf586828701614897565b9250506040614c06868287016148cd565b9150509250925092565b600060208284031215614c2657614c256146dc565b5b6000614c34848285016148cd565b91505092915050565b60008060408385031215614c5457614c536146dc565b5b6000614c62858286016148cd565b9250506020614c73858286016148cd565b9150509250929050565b614c8681614a6f565b82525050565b614c9581614aab565b82525050565b614ca481614aec565b82525050565b6000606082019050614cbf6000830186614c7d565b614ccc6020830185614c8c565b614cd96040830184614c9b565b949350505050565b600060208284031215614cf757614cf66146dc565b5b6000614d0584828501614897565b91505092915050565b600060ff82169050919050565b614d2481614d0e565b82525050565b6000602082019050614d3f6000830184614d1b565b92915050565b614d4e8161486e565b82525050565b6000602082019050614d696000830184614d45565b92915050565b60008060008060808587031215614d8957614d886146dc565b5b6000614d97878288016148cd565b9450506020614da887828801614970565b9350506040614db9878288016148cd565b9250506060614dca878288016148cd565b91505092959194509250565b614ddf81614a6f565b82525050565b614dee81614aab565b82525050565b614dfd81614aec565b82525050565b606082016000820151614e196000850182614dd6565b506020820151614e2c6020850182614de5565b506040820151614e3f6040850182614df4565b50505050565b6000606082019050614e5a6000830184614e03565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614e8581614e60565b82525050565b6000602082019050614ea06000830184614e7c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614eed57607f821691505b602082108103614f0057614eff614ea6565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f3c6007836147a7565b9150614f4782614f06565b602082019050919050565b60006020820190508181036000830152614f6b81614f2f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000614fa8600a836147a7565b9150614fb382614f72565b602082019050919050565b60006020820190508181036000830152614fd781614f9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615018826148ac565b9150615023836148ac565b925082820390508181111561503b5761503a614fde565b5b92915050565b600061504c826148ac565b9150615057836148ac565b925082820190508082111561506f5761506e614fde565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006150ab600a836147a7565b91506150b682615075565b602082019050919050565b600060208201905081810360008301526150da8161509e565b9050919050565b60006150ec826148ac565b91506150f7836148ac565b9250828202615105816148ac565b9150828204841483151761511c5761511b614fde565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061515d826148ac565b9150615168836148ac565b92508261517857615177615123565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006151b96011836147a7565b91506151c482615183565b602082019050919050565b600060208201905081810360008301526151e8816151ac565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006152256012836147a7565b9150615230826151ef565b602082019050919050565b6000602082019050818103600083015261525481615218565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006152c0600d836147a7565b91506152cb8261528a565b602082019050919050565b600060208201905081810360008301526152ef816152b3565b9050919050565b6152ff81614e60565b811461530a57600080fd5b50565b60008151905061531c816152f6565b92915050565b600060208284031215615338576153376146dc565b5b60006153468482850161530d565b9150509291505056fea2646970667358221220c1f9d7d0a78f33fa80a4cedd3716f7ce66fd86bb2bab9cbeea3a9c3110f2399e64736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200614a3803806200614a833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e0f176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e35176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516153e562000d656000396000818161115b0152818161148f015281816123b70152612961015260008181611a7a0152818161237a015281816128b901528181612afd0152612ce5015260008181611aa601528181612b2901528181612d060152612d4b015260006114ed01526153e56000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614799565b610c45565b6040516103cc91906147e1565b60405180910390f35b6103dd610deb565b6040516103ea919061488c565b60405180910390f35b61040d60048036038101906104089190614942565b610e79565b60405161041a91906147e1565b60405180910390f35b61042b6110b5565b604051610438919061499e565b60405180910390f35b61045b600480360381019061045691906149e5565b6110c8565b6040516104689190614a34565b60405180910390f35b610479611118565b6040516104869190614a34565b60405180910390f35b61049761112f565b6040516104a49190614a34565b60405180910390f35b6104b5611134565b6040516104c29190614a34565b60405180910390f35b6104e560048036038101906104e09190614bf0565b611140565b6040516104f29190614a34565b60405180910390f35b610503611159565b604051610510919061499e565b60405180910390f35b610533600480360381019061052e9190614bf0565b61117d565b60405161054091906147e1565b60405180910390f35b610563600480360381019061055e9190614c1d565b6111e5565b60405161057091906147e1565b60405180910390f35b610593600480360381019061058e9190614bf0565b611403565b6040516105a0919061499e565b60405180910390f35b6105c360048036038101906105be9190614c70565b61143b565b6040516105d091906147e1565b60405180910390f35b6105f360048036038101906105ee9190614c9d565b61146e565b6040516106009190614a34565b60405180910390f35b6106116114eb565b60405161061e9190614a34565b60405180910390f35b61062f61150f565b60405161063c9190614a34565b60405180910390f35b61065f600480360381019061065a9190614942565b611515565b60405161066c91906147e1565b60405180910390f35b61068f600480360381019061068a9190614c70565b6116ab565b60405161069e93929190614d0a565b60405180910390f35b6106c160048036038101906106bc9190614c70565b61171a565b005b6106dd60048036038101906106d89190614942565b611856565b6040516106ea91906147e1565b60405180910390f35b61070d60048036038101906107089190614d41565b611a2d565b60405161071a9190614a34565b60405180910390f35b61073d60048036038101906107389190614c70565b611a76565b60405161074a9190614a34565b60405180910390f35b61076d60048036038101906107689190614c70565b611ad6565b60405161077a9190614a34565b60405180910390f35b61078b611af7565b6040516107989190614a34565b60405180910390f35b6107bb60048036038101906107b69190614d41565b611afd565b6040516107c891906147e1565b60405180910390f35b6107d9611c07565b6040516107e69190614d8a565b60405180910390f35b61080960048036038101906108049190614c70565b611cd4565b6040516108169190614a34565b60405180910390f35b61083960048036038101906108349190614c70565b611d15565b6040516108469190614a34565b60405180910390f35b61086960048036038101906108649190614c70565b611d36565b005b61088560048036038101906108809190614d41565b611dfe565b6040516108929190614a34565b60405180910390f35b6108a3611e68565b6040516108b09190614a34565b60405180910390f35b6108c1611e79565b6040516108ce9190614a34565b60405180910390f35b6108f160048036038101906108ec9190614bf0565b611e7f565b6040516108fe9190614a34565b60405180910390f35b61090f611ead565b60405161091c9190614a34565b60405180910390f35b61092d611eb3565b60405161093a91906147e1565b60405180910390f35b61094b61205a565b6040516109589190614db4565b60405180910390f35b61097b60048036038101906109769190614c70565b612080565b6040516109889190614a34565b60405180910390f35b610999612167565b6040516109a69190614db4565b60405180910390f35b6109c960048036038101906109c49190614d41565b61218d565b005b6109d3612242565b6040516109e091906147e1565b60405180910390f35b6109f1612503565b6040516109fe919061488c565b60405180910390f35b610a216004803603810190610a1c9190614942565b612591565b604051610a2e91906147e1565b60405180910390f35b610a516004803603810190610a4c9190614942565b6127b0565b604051610a5e91906147e1565b60405180910390f35b610a6f6128b1565b604051610a7c9190614a34565b60405180910390f35b610a8d6128b7565b604051610a9a9190614a34565b60405180910390f35b610abd6004803603810190610ab89190614c70565b6128db565b604051610aca9190614a34565b60405180910390f35b610adb612a62565b604051610ae89190614a34565b60405180910390f35b610af9612a68565b604051610b069190614a34565b60405180910390f35b610b296004803603810190610b249190614c70565b612a6e565b005b610b33612b6d565b604051610b409190614a34565b60405180910390f35b610b636004803603810190610b5e9190614d41565b612b77565b604051610b7091906147e1565b60405180910390f35b610b936004803603810190610b8e9190614bf0565b612c4b565b604051610ba09190614a34565b60405180910390f35b610bc36004803603810190610bbe9190614dcf565b612c5f565b604051610bd09190614ea5565b60405180910390f35b610be1612cdf565b604051610bee9190614eeb565b60405180910390f35b610bff612d49565b604051610c0c9190614a34565b60405180910390f35b610c2f6004803603810190610c2a9190614d41565b612d6d565b604051610c3c91906147e1565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614f35565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614f35565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611c07565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614fb2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa49061501e565b60405180910390fd5b5b610fb6612242565b50610fc084611cd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614a34565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612e0f565b6110ea6110e46001612e0f565b86612e77565b612ede565b90506110fa81612f5d565b67ffffffffffffffff168461110f919061506d565b91505092915050565b6000600b5460085461112a919061506d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611c07565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614fb2565b60405180910390fd5b61125b612242565b5061126585611cd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061506d565b9250508190555061138e878785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed9190614a34565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612e0f565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612e0f565b925061148885612e0f565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612ede565b90506114bf81612fb7565b90506114cb8382612ede565b90506114d681612f5d565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611520612242565b5061152a83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b891906150a1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516116989190614a34565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611c07565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611cd4565b90506117ea3382613044565b5081600b60008282546117fd91906150a1565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a9190614a34565b60405180910390a25050565b6000806000611863611c07565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90615121565b60405180910390fd5b61195c612242565b5060006011541115611985576011548360085461197991906150a1565b111561198457600080fd5b5b826008600082825461199791906150a1565b925050819055506119a783611cd4565b90506119b3848261314b565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a119190614a34565b60405180910390a3611a2161320f565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611aa49190615141565b7f0000000000000000000000000000000000000000000000000000000000000000611acf91906150a1565b9050919050565b6000603c8242611ae6919061506d565b611af091906151b2565b9050919050565b60035481565b6000611b0c600160ff1661143b565b15611b1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ba657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611c275760019050611cd1565b6000600f5403611c3a5760009050611cd1565b600f544210611ccc57611c67603c600354611c5591906151b2565b600f54611c62919061506d565b6128db565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611cb29190614a34565b60405180910390a1611cc2612242565b5060029050611cd1565b600090505b90565b600080611cf8611ce384612e0f565b600260009054906101000a9004600f0b6133d3565b9050611d0381612f5d565b67ffffffffffffffff16915050919050565b6000603c8242611d25919061506d565b611d2f91906151b2565b9050919050565b611d43600860ff1661143b565b15611d4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da757600080fd5b611daf611118565b8111611dba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611dec9190614a34565b60405180910390a28060118190555050565b6000806000806000611e17611e1287611a2d565b612e0f565b9350611e24600354611ad6565b9150611e3f84600260009054906101000a9004600f0b612ede565b9250611e5d611e4d84612f5d565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e7460006128db565b905090565b600b5481565b6000806000611e8d84611140565b9150611e9884611403565b9050611ea482826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061522f565b60405180910390fd5b600060125483161461210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061529b565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516121559190614a34565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61219a600260ff1661143b565b156121a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061224c6146f6565b6122546146f6565b61225c6146f6565b600080600080600061226c611e68565b5061227561345f565b97506122808861117d565b1561229657600098505050505050505050612500565b6000600954815481106122ac576122ab6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061235988612c4b565b945060018561236891906150a1565b905061237386611403565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123a39190615141565b6123ad91906151b2565b91506123e96123e47f00000000000000000000000000000000000000000000000000000000000000006123df85612e0f565b612ede565b612fb7565b92506123ff6000846123f9611118565b84612c5f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124bb876135f5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516124eb9190614a34565b60405180910390a16001985050505050505050505b90565b6007805461251090614f35565b80601f016020809104026020016040519081016040528092919081815260200182805461253c90614f35565b80156125895780601f1061255e57610100808354040283529160200191612589565b820191906000526020600020905b81548152906001019060200180831161256c57829003601f168201915b505050505081565b60008061259d83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561262857600080fd5b612630612242565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061506d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161279d9190614a34565b60405180910390a3600191505092915050565b6000806000806127be611c07565b905060028160ff16036127d757600093505050506128ab565b60008160ff16111561281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281590614fb2565b60405180910390fd5b612826612242565b5061283085611cd4565b925061283d338785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161289c9190614a34565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612905576000945050505050612a5d565b612910600354611ad6565b925060008303612927576000945050505050612a5d565b600260009054906101000a9004600f0b905060008611801561294857508286105b15612951578592505b61295a83612e0f565b91506129867f000000000000000000000000000000000000000000000000000000000000000083612ede565b935061299184612fb7565b93506129ac600260009054906101000a9004600f0b85612ede565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836129f49190615141565b600354612a0191906150a1565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a4d919061499e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a7d600460ff1661143b565b15612a8757600080fd5b601060009054906101000a900460ff1615612aa157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612afb57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b279190615141565b7f0000000000000000000000000000000000000000000000000000000000000000612b5291906150a1565b9050600f548111612b6257600080fd5b80600f819055505050565b6000600b54905090565b6000612b86600160ff1661143b565b15612b9057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bea57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c676146f6565b612c6f6146f6565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d30919061506d565b612d3a91906151b2565b612d4491906150a1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e2657600080fd5b6040829060020a029050919050565b60008082600f0b13612e4657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e6284613714565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ecb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ed457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f4a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612f5357600080fd5b8091505092915050565b60008082600f0b1215612f6f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f9f8584613044565b50612faa848461314b565b5060019150509392505050565b60006840000000000000000082600f0b12612fd157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613005576000905061303f565b61303c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506138da565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130a05760009350505050613145565b6130a986611a2d565b9250848310156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590615336565b60405180910390fd5b84836130fa919061506d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131a75760009350505050613209565b6131b086611a2d565b925084836131be91906150a1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132196146f6565b6000613223611118565b905060006001600080549050613239919061506d565b8154811061324a576132496152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050613325919061506d565b81548110613336576133356152bb565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036133e457600080fd5b600082600f0b604085600f0b9060020a028161340357613402615183565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561344c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61345557600080fd5b8091505092915050565b6134676146f6565b61346f6146f6565b6134776146f6565b6000806009548154811061348e5761348d6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190615382565b6fffffffffffffffffffffffffffffffff1690506135da83612c4b565b81116135eb578193505050506135f2565b8293505050505b90565b600080600061360384611e7f565b61360b611118565b613615919061506d565b9150600a5461362383611cd4565b61362d919061506d565b905061365b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261314b565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516136cf9190614a34565b60405180910390a36001600960008282546136ea91906150a1565b9250508190555080600a600082825461370391906150a1565b925050819055508192505050919050565b60008082600f0b1361372557600080fd5b60008083600f0b9050680100000000000000008112613760576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261378e576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137ba576010819060008212600003808260020a82851804189250505090506010820191505b61010081126137e5576008819060008212600003808260020a82851804189250505090506008820191505b6010811261380f576004819060008212600003808260020a82851804189250505090506004820191505b60048112613839576002819060008212600003808260020a82851804189250505090506002820191505b60028112613848576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156138cd578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613875565b5081945050505050919050565b60006840000000000000000082600f0b126138f457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561392857600090506146f1565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561397657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139af5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139e85760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a2157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a5a5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a93576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613acc57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b05576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b3d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b755760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613bad576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613be55760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c1d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c5557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c8d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cc557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613cfc5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d33576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d6a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613da1576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613dd857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e0f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e46576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e7d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eb3576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613ee957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f1f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f5557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f8b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613fc1576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613ff757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561402d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561406257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140975760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156140cc576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141015760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614136576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561416b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141a05760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156141d557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142095760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561423d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561427157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142a5576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156142d957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561430d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614341576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143755760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143a8576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156143db57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561440e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561444157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144745760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144a7576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156144da57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561450d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561453f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145715760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145a3576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145d55760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614607576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561463957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561466b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561469d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156146ec57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61477681614741565b811461478157600080fd5b50565b6000813590506147938161476d565b92915050565b6000602082840312156147af576147ae61473c565b5b60006147bd84828501614784565b91505092915050565b60008115159050919050565b6147db816147c6565b82525050565b60006020820190506147f660008301846147d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561483657808201518184015260208101905061481b565b60008484015250505050565b6000601f19601f8301169050919050565b600061485e826147fc565b6148688185614807565b9350614878818560208601614818565b61488181614842565b840191505092915050565b600060208201905081810360008301526148a68184614853565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148d9826148ae565b9050919050565b6148e9816148ce565b81146148f457600080fd5b50565b600081359050614906816148e0565b92915050565b6000819050919050565b61491f8161490c565b811461492a57600080fd5b50565b60008135905061493c81614916565b92915050565b600080604083850312156149595761495861473c565b5b6000614967858286016148f7565b92505060206149788582860161492d565b9150509250929050565b600081600f0b9050919050565b61499881614982565b82525050565b60006020820190506149b3600083018461498f565b92915050565b6149c281614982565b81146149cd57600080fd5b50565b6000813590506149df816149b9565b92915050565b600080604083850312156149fc576149fb61473c565b5b6000614a0a8582860161492d565b9250506020614a1b858286016149d0565b9150509250929050565b614a2e8161490c565b82525050565b6000602082019050614a496000830184614a25565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a8c82614842565b810181811067ffffffffffffffff82111715614aab57614aaa614a54565b5b80604052505050565b6000614abe614732565b9050614aca8282614a83565b919050565b600063ffffffff82169050919050565b614ae881614acf565b8114614af357600080fd5b50565b600081359050614b0581614adf565b92915050565b600068ffffffffffffffffff82169050919050565b614b2981614b0b565b8114614b3457600080fd5b50565b600081359050614b4681614b20565b92915050565b600067ffffffffffffffff82169050919050565b614b6981614b4c565b8114614b7457600080fd5b50565b600081359050614b8681614b60565b92915050565b600060608284031215614ba257614ba1614a4f565b5b614bac6060614ab4565b90506000614bbc84828501614af6565b6000830152506020614bd084828501614b37565b6020830152506040614be484828501614b77565b60408301525092915050565b600060608284031215614c0657614c0561473c565b5b6000614c1484828501614b8c565b91505092915050565b600080600060608486031215614c3657614c3561473c565b5b6000614c44868287016148f7565b9350506020614c55868287016148f7565b9250506040614c668682870161492d565b9150509250925092565b600060208284031215614c8657614c8561473c565b5b6000614c948482850161492d565b91505092915050565b60008060408385031215614cb457614cb361473c565b5b6000614cc28582860161492d565b9250506020614cd38582860161492d565b9150509250929050565b614ce681614acf565b82525050565b614cf581614b0b565b82525050565b614d0481614b4c565b82525050565b6000606082019050614d1f6000830186614cdd565b614d2c6020830185614cec565b614d396040830184614cfb565b949350505050565b600060208284031215614d5757614d5661473c565b5b6000614d65848285016148f7565b91505092915050565b600060ff82169050919050565b614d8481614d6e565b82525050565b6000602082019050614d9f6000830184614d7b565b92915050565b614dae816148ce565b82525050565b6000602082019050614dc96000830184614da5565b92915050565b60008060008060808587031215614de957614de861473c565b5b6000614df78782880161492d565b9450506020614e08878288016149d0565b9350506040614e198782880161492d565b9250506060614e2a8782880161492d565b91505092959194509250565b614e3f81614acf565b82525050565b614e4e81614b0b565b82525050565b614e5d81614b4c565b82525050565b606082016000820151614e796000850182614e36565b506020820151614e8c6020850182614e45565b506040820151614e9f6040850182614e54565b50505050565b6000606082019050614eba6000830184614e63565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ee581614ec0565b82525050565b6000602082019050614f006000830184614edc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f4d57607f821691505b602082108103614f6057614f5f614f06565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f9c600783614807565b9150614fa782614f66565b602082019050919050565b60006020820190508181036000830152614fcb81614f8f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615008600a83614807565b915061501382614fd2565b602082019050919050565b6000602082019050818103600083015261503781614ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150788261490c565b91506150838361490c565b925082820390508181111561509b5761509a61503e565b5b92915050565b60006150ac8261490c565b91506150b78361490c565b92508282019050808211156150cf576150ce61503e565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061510b600a83614807565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b600061514c8261490c565b91506151578361490c565b92508282026151658161490c565b9150828204841483151761517c5761517b61503e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151bd8261490c565b91506151c88361490c565b9250826151d8576151d7615183565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615219601183614807565b9150615224826151e3565b602082019050919050565b600060208201905081810360008301526152488161520c565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615285601283614807565b91506152908261524f565b602082019050919050565b600060208201905081810360008301526152b481615278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615320600d83614807565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b61535f81614ec0565b811461536a57600080fd5b50565b60008151905061537c81615356565b92915050565b6000602082840312156153985761539761473c565b5b60006153a68482850161536d565b9150509291505056fea2646970667358221220bdad8b7651c658121a07388a22a62150eafd0f38a872cf057ef212005a607df764736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 5dd5136..ca2b020 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/unittest/base.py b/python/erc20_demurrage_token/unittest/base.py index ab30a44..8de0670 100644 --- a/python/erc20_demurrage_token/unittest/base.py +++ b/python/erc20_demurrage_token/unittest/base.py @@ -77,12 +77,6 @@ class TestTokenDeploy: r = rpc.do(o) self.start_time = r['timestamp'] - (tx_hash, o) = interface.add_writer(self.address, deployer_address, deployer_address) - r = rpc.do(o) - o = receipt(tx_hash) - r = rpc.do(o) - assert r['status'] == 1 - return self.address diff --git a/python/setup.cfg b/python/setup.cfg index 09e09d7..39c7990 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.5 +version = 0.3.6 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_mint.py b/python/tests/test_mint.py index 1458dc4..495071e 100644 --- a/python/tests/test_mint.py +++ b/python/tests/test_mint.py @@ -36,7 +36,6 @@ class TestAmounts(TestDemurrageDefault): o = block_by_number(r) r = self.rpc.do(o) ta = r['timestamp'] - logg.info('>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>< {} {} {}'.format(tb, ta, ta-tb)) nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) @@ -47,5 +46,32 @@ class TestAmounts(TestDemurrageDefault): self.assertEqual(r['status'], 1) + def test_writer(self): + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[1], 1000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 0) + + + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.add_writer(self.address, self.accounts[0], self.accounts[1]) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + nonce_oracle = RPCNonceOracle(self.accounts[1], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[1], self.accounts[1], 1000) + r = self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + if __name__ == '__main__': unittest.main() diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 06ba0ed..b3f2cf5 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -115,19 +115,18 @@ contract DemurrageTokenSingleNocap { // EIP173 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 - event SealStateChange(uint256 _sealState); - event Expired(uint256 _timestamp); event Cap(uint256 indexed _oldCap, uint256 _newCap); - // property sealing + // Implements Sealer uint256 public sealState; uint8 constant MINTER_STATE = 1; uint8 constant SINK_STATE = 2; uint8 constant EXPIRY_STATE = 4; uint8 constant CAP_STATE = 8; uint256 constant public maxSealState = 15; + event SealStateChange(bool indexed _final, uint256 _sealState); constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { @@ -158,15 +157,17 @@ contract DemurrageTokenSingleNocap { sinkAddress = _defaultSinkAddress; } + // Implements Sealer function seal(uint256 _state) public returns(uint256) { require(_state < 16, 'ERR_INVALID_STATE'); require(_state & sealState == 0, 'ERR_ALREADY_LOCKED'); sealState |= _state; - emit SealStateChange(sealState); + emit SealStateChange(sealState == maxSealState, sealState); return uint256(sealState); } - function isSealed(uint256 _state) public returns(bool) { + // Implements Sealer + function isSealed(uint256 _state) public view returns(bool) { require(_state < maxSealState); if (_state == 0) { return sealState == maxSealState; @@ -297,7 +298,7 @@ contract DemurrageTokenSingleNocap { uint256 baseAmount; require(applyExpiry() == 0); - require(minter[msg.sender], 'ERR_ACCESS'); + require(minter[msg.sender] || msg.sender == owner, 'ERR_ACCESS'); changePeriod(); if (maxSupply > 0) { From f9cd542e7416a1c77e58fff5a2e1273df1c4d949 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Feb 2023 09:44:25 +0000 Subject: [PATCH 47/57] Add sweep function --- python/CHANGELOG | 2 ++ .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 15 +++++++++++-- python/setup.cfg | 2 +- python/tests/test_amounts.py | 21 +++++++++++++++++++ solidity/DemurrageTokenSingleNocap.sol | 10 +++++++++ 7 files changed, 49 insertions(+), 5 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 18efe08..03b13ff 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,5 @@ +- 0.3.7 + * Add sweep contract method to fully empty one account into another - 0.3.6 * Reinstate owner as minter by default - 0.3.0 diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 0e1f8d7..7ae4a1b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200614a3803806200614a833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002e0f176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002e35176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516153e562000d656000396000818161115b0152818161148f015281816123b70152612961015260008181611a7a0152818161237a015281816128b901528181612afd0152612ce5015260008181611aa601528181612b2901528181612d060152612d4b015260006114ed01526153e56000f3fe608060405234801561001057600080fd5b50600436106103a0576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610ba9578063e809529514610bd9578063eda4e6d614610bf7578063f2fde38b14610c15576103a0565b8063d7a52fa914610b0f578063d89135cd14610b2b578063da2824a814610b49578063e54063a614610b79576103a0565b8063b470aade11610106578063b470aade14610a85578063c0ab707714610aa3578063d340ef8a14610ad3578063d5abeb0114610af1576103a0565b8063a457c2d714610a07578063a9059cbb14610a37578063b1cb0db314610a67576103a0565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109915780638f0b2d5d146109af5780638f1df6bc146109cb57806395d89b41146109e9576103a0565b806379ba50971461092557806384dde4af1461094357806386fe212d14610961576103a0565b8063731f237c116101d5578063731f237c1461089b57806373f42561146108b95780637445e33a146108d757806374bedb9514610907576103a0565b80636a2d094e1461081f5780636f8b44b01461084f57806370a082311461086b576103a0565b806331333487116102d557806347a505171161027357806358b2833b1161024d57806358b2833b146107835780635ae06f7e146107a15780635f408c04146107d15780636787a9be146107ef576103a0565b806347a50517146106f35780634abfbba21461072357806351b4541c14610753576103a0565b806339509351116102af578063395093511461064557806340452d911461067557806342966c68146106a7578063449a52f8146106c3576103a0565b806331333487146105d9578063313ce5671461060957806331a5995d14610627576103a0565b80631989c6a81161034257806323a859441161031c57806323a859441461051957806323b872dd146105495780632a7aec09146105795780632c1758c1146105a9576103a0565b80631989c6a8146104ad578063213d1e1e146104cb578063229ba197146104fb576103a0565b806309f28f3c1161037e57806309f28f3c1461042357806311c566151461044157806318160ddd1461047157806318cbbcfc1461048f576103a0565b806301ffc9a7146103a557806306fdde03146103d5578063095ea7b3146103f3575b600080fd5b6103bf60048036038101906103ba9190614799565b610c45565b6040516103cc91906147e1565b60405180910390f35b6103dd610deb565b6040516103ea919061488c565b60405180910390f35b61040d60048036038101906104089190614942565b610e79565b60405161041a91906147e1565b60405180910390f35b61042b6110b5565b604051610438919061499e565b60405180910390f35b61045b600480360381019061045691906149e5565b6110c8565b6040516104689190614a34565b60405180910390f35b610479611118565b6040516104869190614a34565b60405180910390f35b61049761112f565b6040516104a49190614a34565b60405180910390f35b6104b5611134565b6040516104c29190614a34565b60405180910390f35b6104e560048036038101906104e09190614bf0565b611140565b6040516104f29190614a34565b60405180910390f35b610503611159565b604051610510919061499e565b60405180910390f35b610533600480360381019061052e9190614bf0565b61117d565b60405161054091906147e1565b60405180910390f35b610563600480360381019061055e9190614c1d565b6111e5565b60405161057091906147e1565b60405180910390f35b610593600480360381019061058e9190614bf0565b611403565b6040516105a0919061499e565b60405180910390f35b6105c360048036038101906105be9190614c70565b61143b565b6040516105d091906147e1565b60405180910390f35b6105f360048036038101906105ee9190614c9d565b61146e565b6040516106009190614a34565b60405180910390f35b6106116114eb565b60405161061e9190614a34565b60405180910390f35b61062f61150f565b60405161063c9190614a34565b60405180910390f35b61065f600480360381019061065a9190614942565b611515565b60405161066c91906147e1565b60405180910390f35b61068f600480360381019061068a9190614c70565b6116ab565b60405161069e93929190614d0a565b60405180910390f35b6106c160048036038101906106bc9190614c70565b61171a565b005b6106dd60048036038101906106d89190614942565b611856565b6040516106ea91906147e1565b60405180910390f35b61070d60048036038101906107089190614d41565b611a2d565b60405161071a9190614a34565b60405180910390f35b61073d60048036038101906107389190614c70565b611a76565b60405161074a9190614a34565b60405180910390f35b61076d60048036038101906107689190614c70565b611ad6565b60405161077a9190614a34565b60405180910390f35b61078b611af7565b6040516107989190614a34565b60405180910390f35b6107bb60048036038101906107b69190614d41565b611afd565b6040516107c891906147e1565b60405180910390f35b6107d9611c07565b6040516107e69190614d8a565b60405180910390f35b61080960048036038101906108049190614c70565b611cd4565b6040516108169190614a34565b60405180910390f35b61083960048036038101906108349190614c70565b611d15565b6040516108469190614a34565b60405180910390f35b61086960048036038101906108649190614c70565b611d36565b005b61088560048036038101906108809190614d41565b611dfe565b6040516108929190614a34565b60405180910390f35b6108a3611e68565b6040516108b09190614a34565b60405180910390f35b6108c1611e79565b6040516108ce9190614a34565b60405180910390f35b6108f160048036038101906108ec9190614bf0565b611e7f565b6040516108fe9190614a34565b60405180910390f35b61090f611ead565b60405161091c9190614a34565b60405180910390f35b61092d611eb3565b60405161093a91906147e1565b60405180910390f35b61094b61205a565b6040516109589190614db4565b60405180910390f35b61097b60048036038101906109769190614c70565b612080565b6040516109889190614a34565b60405180910390f35b610999612167565b6040516109a69190614db4565b60405180910390f35b6109c960048036038101906109c49190614d41565b61218d565b005b6109d3612242565b6040516109e091906147e1565b60405180910390f35b6109f1612503565b6040516109fe919061488c565b60405180910390f35b610a216004803603810190610a1c9190614942565b612591565b604051610a2e91906147e1565b60405180910390f35b610a516004803603810190610a4c9190614942565b6127b0565b604051610a5e91906147e1565b60405180910390f35b610a6f6128b1565b604051610a7c9190614a34565b60405180910390f35b610a8d6128b7565b604051610a9a9190614a34565b60405180910390f35b610abd6004803603810190610ab89190614c70565b6128db565b604051610aca9190614a34565b60405180910390f35b610adb612a62565b604051610ae89190614a34565b60405180910390f35b610af9612a68565b604051610b069190614a34565b60405180910390f35b610b296004803603810190610b249190614c70565b612a6e565b005b610b33612b6d565b604051610b409190614a34565b60405180910390f35b610b636004803603810190610b5e9190614d41565b612b77565b604051610b7091906147e1565b60405180910390f35b610b936004803603810190610b8e9190614bf0565b612c4b565b604051610ba09190614a34565b60405180910390f35b610bc36004803603810190610bbe9190614dcf565b612c5f565b604051610bd09190614ea5565b60405180910390f35b610be1612cdf565b604051610bee9190614eeb565b60405180910390f35b610bff612d49565b604051610c0c9190614a34565b60405180910390f35b610c2f6004803603810190610c2a9190614d41565b612d6d565b604051610c3c91906147e1565b60405180910390f35b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610c995760019050610de6565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610ceb5760019050610de6565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d3d5760019050610de6565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610d8f5760019050610de6565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610de15760019050610de6565b600090505b919050565b60068054610df890614f35565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2490614f35565b8015610e715780601f10610e4657610100808354040283529160200191610e71565b820191906000526020600020905b815481529060010190602001808311610e5457829003601f168201915b505050505081565b6000806000610e86611c07565b905060028160ff1603610e9e576000925050506110af565b60008160ff161115610ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edc90614fb2565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115610fae5760008414610fad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa49061501e565b60405180910390fd5b5b610fb6612242565b50610fc084611cd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516110a09190614a34565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806110ef6110d785612e0f565b6110ea6110e46001612e0f565b86612e77565b612ede565b90506110fa81612f5d565b67ffffffffffffffff168461110f919061506d565b91505092915050565b6000600b5460085461112a919061506d565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff16111561119a57600090506111e0565b6000826020015168ffffffffffffffffff1611156111bb57600090506111e0565b6000826040015167ffffffffffffffff1611156111db57600090506111e0565b600190505b919050565b6000806000806111f3611c07565b905060028160ff160361120c57600093505050506113fc565b60008160ff161115611253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124a90614fb2565b60405180910390fd5b61125b612242565b5061126585611cd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156112f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461137c919061506d565b9250508190555061138e878785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516113ed9190614a34565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114325761142f6001612e0f565b90505b80915050919050565b6000600f821061144a57600080fd5b6000820361145f57600f601254149050611469565b8160125483161490505b919050565b60008060008061147d86612e0f565b925061148885612e0f565b91506114b47f000000000000000000000000000000000000000000000000000000000000000083612ede565b90506114bf81612fb7565b90506114cb8382612ede565b90506114d681612f5d565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611520612242565b5061152a83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115b891906150a1565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516116989190614a34565b60405180910390a3600191505092915050565b600081815481106116bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611724611c07565b60ff161461173157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661178757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156117d357600080fd5b60006117de82611cd4565b90506117ea3382613044565b5081600b60008282546117fd91906150a1565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161184a9190614a34565b60405180910390a25050565b6000806000611863611c07565b60ff161461187057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194b90615121565b60405180910390fd5b61195c612242565b5060006011541115611985576011548360085461197991906150a1565b111561198457600080fd5b5b826008600082825461199791906150a1565b925050819055506119a783611cd4565b90506119b3848261314b565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611a119190614a34565b60405180910390a3611a2161320f565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611aa49190615141565b7f0000000000000000000000000000000000000000000000000000000000000000611acf91906150a1565b9050919050565b6000603c8242611ae6919061506d565b611af091906151b2565b9050919050565b60035481565b6000611b0c600160ff1661143b565b15611b1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611b9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ba657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611c275760019050611cd1565b6000600f5403611c3a5760009050611cd1565b600f544210611ccc57611c67603c600354611c5591906151b2565b600f54611c62919061506d565b6128db565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611cb29190614a34565b60405180910390a1611cc2612242565b5060029050611cd1565b600090505b90565b600080611cf8611ce384612e0f565b600260009054906101000a9004600f0b6133d3565b9050611d0381612f5d565b67ffffffffffffffff16915050919050565b6000603c8242611d25919061506d565b611d2f91906151b2565b9050919050565b611d43600860ff1661143b565b15611d4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da757600080fd5b611daf611118565b8111611dba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611dec9190614a34565b60405180910390a28060118190555050565b6000806000806000611e17611e1287611a2d565b612e0f565b9350611e24600354611ad6565b9150611e3f84600260009054906101000a9004600f0b612ede565b9250611e5d611e4d84612f5d565b67ffffffffffffffff168361146e565b945050505050919050565b6000611e7460006128db565b905090565b600b5481565b6000806000611e8d84611140565b9150611e9884611403565b9050611ea482826110c8565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f1057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc9061522f565b60405180910390fd5b600060125483161461210c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121039061529b565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516121559190614a34565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61219a600260ff1661143b565b156121a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061224c6146f6565b6122546146f6565b61225c6146f6565b600080600080600061226c611e68565b5061227561345f565b97506122808861117d565b1561229657600098505050505050505050612500565b6000600954815481106122ac576122ab6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061235988612c4b565b945060018561236891906150a1565b905061237386611403565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006123a39190615141565b6123ad91906151b2565b91506123e96123e47f00000000000000000000000000000000000000000000000000000000000000006123df85612e0f565b612ede565b612fb7565b92506123ff6000846123f9611118565b84612c5f565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506124bb876135f5565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516124eb9190614a34565b60405180910390a16001985050505050505050505b90565b6007805461251090614f35565b80601f016020809104026020016040519081016040528092919081815260200182805461253c90614f35565b80156125895780601f1061255e57610100808354040283529160200191612589565b820191906000526020600020905b81548152906001019060200180831161256c57829003601f168201915b505050505081565b60008061259d83611cd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561262857600080fd5b612630612242565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126bd919061506d565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161279d9190614a34565b60405180910390a3600191505092915050565b6000806000806127be611c07565b905060028160ff16036127d757600093505050506128ab565b60008160ff16111561281e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281590614fb2565b60405180910390fd5b612826612242565b5061283085611cd4565b925061283d338785612f92565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161289c9190614a34565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612905576000945050505050612a5d565b612910600354611ad6565b925060008303612927576000945050505050612a5d565b600260009054906101000a9004600f0b905060008611801561294857508286105b15612951578592505b61295a83612e0f565b91506129867f000000000000000000000000000000000000000000000000000000000000000083612ede565b935061299184612fb7565b93506129ac600260009054906101000a9004600f0b85612ede565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c836129f49190615141565b600354612a0191906150a1565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612a4d919061499e565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612a7d600460ff1661143b565b15612a8757600080fd5b601060009054906101000a900460ff1615612aa157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612afb57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612b279190615141565b7f0000000000000000000000000000000000000000000000000000000000000000612b5291906150a1565b9050600f548111612b6257600080fd5b80600f819055505050565b6000600b54905090565b6000612b86600160ff1661143b565b15612b9057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bea57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612c676146f6565b612c6f6146f6565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612d30919061506d565b612d3a91906151b2565b612d4491906150a1565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612dc957600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612e2657600080fd5b6040829060020a029050919050565b60008082600f0b13612e4657600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612e6284613714565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612ecb57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ed457600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f4a57506f7fffffffffffffffffffffffffffffff600f0b8113155b612f5357600080fd5b8091505092915050565b60008082600f0b1215612f6f57600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b600080612f9f8584613044565b50612faa848461314b565b5060019150509392505050565b60006840000000000000000082600f0b12612fd157600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613005576000905061303f565b61303c6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506138da565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036130a05760009350505050613145565b6130a986611a2d565b9250848310156130ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e590615336565b60405180910390fd5b84836130fa919061506d565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131a75760009350505050613209565b6131b086611a2d565b925084836131be91906150a1565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132196146f6565b6000613223611118565b905060006001600080549050613239919061506d565b8154811061324a576132496152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff16815250508160006001600080549050613325919061506d565b81548110613336576133356152bb565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036133e457600080fd5b600082600f0b604085600f0b9060020a028161340357613402615183565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561344c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61345557600080fd5b8091505092915050565b6134676146f6565b61346f6146f6565b6134776146f6565b6000806009548154811061348e5761348d6152bb565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135bd9190615382565b6fffffffffffffffffffffffffffffffff1690506135da83612c4b565b81116135eb578193505050506135f2565b8293505050505b90565b600080600061360384611e7f565b61360b611118565b613615919061506d565b9150600a5461362383611cd4565b61362d919061506d565b905061365b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261314b565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516136cf9190614a34565b60405180910390a36001600960008282546136ea91906150a1565b9250508190555080600a600082825461370391906150a1565b925050819055508192505050919050565b60008082600f0b1361372557600080fd5b60008083600f0b9050680100000000000000008112613760576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261378e576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126137ba576010819060008212600003808260020a82851804189250505090506010820191505b61010081126137e5576008819060008212600003808260020a82851804189250505090506008820191505b6010811261380f576004819060008212600003808260020a82851804189250505090506004820191505b60048112613839576002819060008212600003808260020a82851804189250505090506002820191505b60028112613848576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156138cd578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613875565b5081945050505050919050565b60006840000000000000000082600f0b126138f457600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b121561392857600090506146f1565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b131561397657608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b13156139af5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b13156139e85760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613a2157608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613a5a5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613a93576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613acc57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613b05576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613b3d57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613b755760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613bad576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613be55760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613c1d576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613c5557608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613c8d5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613cc557608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613cfc5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613d33576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613d6a57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613da1576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613dd857608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613e0f5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613e46576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613e7d5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613eb3576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613ee957608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613f1f5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b1315613f5557608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b1315613f8b5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315613fc1576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b1315613ff757608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b131561402d576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561406257608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156140975760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156140cc576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141015760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614136576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561416b57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156141a05760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156141d557608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142095760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561423d576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561427157608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156142a5576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156142d957608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b131561430d5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614341576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156143755760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156143a8576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156143db57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b131561440e5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561444157608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156144745760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156144a7576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156144da57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b131561450d576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561453f57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156145715760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156145a3576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156145d55760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b1315614607576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561463957608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561466b5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561469d57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156146ec57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61477681614741565b811461478157600080fd5b50565b6000813590506147938161476d565b92915050565b6000602082840312156147af576147ae61473c565b5b60006147bd84828501614784565b91505092915050565b60008115159050919050565b6147db816147c6565b82525050565b60006020820190506147f660008301846147d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561483657808201518184015260208101905061481b565b60008484015250505050565b6000601f19601f8301169050919050565b600061485e826147fc565b6148688185614807565b9350614878818560208601614818565b61488181614842565b840191505092915050565b600060208201905081810360008301526148a68184614853565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006148d9826148ae565b9050919050565b6148e9816148ce565b81146148f457600080fd5b50565b600081359050614906816148e0565b92915050565b6000819050919050565b61491f8161490c565b811461492a57600080fd5b50565b60008135905061493c81614916565b92915050565b600080604083850312156149595761495861473c565b5b6000614967858286016148f7565b92505060206149788582860161492d565b9150509250929050565b600081600f0b9050919050565b61499881614982565b82525050565b60006020820190506149b3600083018461498f565b92915050565b6149c281614982565b81146149cd57600080fd5b50565b6000813590506149df816149b9565b92915050565b600080604083850312156149fc576149fb61473c565b5b6000614a0a8582860161492d565b9250506020614a1b858286016149d0565b9150509250929050565b614a2e8161490c565b82525050565b6000602082019050614a496000830184614a25565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614a8c82614842565b810181811067ffffffffffffffff82111715614aab57614aaa614a54565b5b80604052505050565b6000614abe614732565b9050614aca8282614a83565b919050565b600063ffffffff82169050919050565b614ae881614acf565b8114614af357600080fd5b50565b600081359050614b0581614adf565b92915050565b600068ffffffffffffffffff82169050919050565b614b2981614b0b565b8114614b3457600080fd5b50565b600081359050614b4681614b20565b92915050565b600067ffffffffffffffff82169050919050565b614b6981614b4c565b8114614b7457600080fd5b50565b600081359050614b8681614b60565b92915050565b600060608284031215614ba257614ba1614a4f565b5b614bac6060614ab4565b90506000614bbc84828501614af6565b6000830152506020614bd084828501614b37565b6020830152506040614be484828501614b77565b60408301525092915050565b600060608284031215614c0657614c0561473c565b5b6000614c1484828501614b8c565b91505092915050565b600080600060608486031215614c3657614c3561473c565b5b6000614c44868287016148f7565b9350506020614c55868287016148f7565b9250506040614c668682870161492d565b9150509250925092565b600060208284031215614c8657614c8561473c565b5b6000614c948482850161492d565b91505092915050565b60008060408385031215614cb457614cb361473c565b5b6000614cc28582860161492d565b9250506020614cd38582860161492d565b9150509250929050565b614ce681614acf565b82525050565b614cf581614b0b565b82525050565b614d0481614b4c565b82525050565b6000606082019050614d1f6000830186614cdd565b614d2c6020830185614cec565b614d396040830184614cfb565b949350505050565b600060208284031215614d5757614d5661473c565b5b6000614d65848285016148f7565b91505092915050565b600060ff82169050919050565b614d8481614d6e565b82525050565b6000602082019050614d9f6000830184614d7b565b92915050565b614dae816148ce565b82525050565b6000602082019050614dc96000830184614da5565b92915050565b60008060008060808587031215614de957614de861473c565b5b6000614df78782880161492d565b9450506020614e08878288016149d0565b9350506040614e198782880161492d565b9250506060614e2a8782880161492d565b91505092959194509250565b614e3f81614acf565b82525050565b614e4e81614b0b565b82525050565b614e5d81614b4c565b82525050565b606082016000820151614e796000850182614e36565b506020820151614e8c6020850182614e45565b506040820151614e9f6040850182614e54565b50505050565b6000606082019050614eba6000830184614e63565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614ee581614ec0565b82525050565b6000602082019050614f006000830184614edc565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614f4d57607f821691505b602082108103614f6057614f5f614f06565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b6000614f9c600783614807565b9150614fa782614f66565b602082019050919050565b60006020820190508181036000830152614fcb81614f8f565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b6000615008600a83614807565b915061501382614fd2565b602082019050919050565b6000602082019050818103600083015261503781614ffb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150788261490c565b91506150838361490c565b925082820390508181111561509b5761509a61503e565b5b92915050565b60006150ac8261490c565b91506150b78361490c565b92508282019050808211156150cf576150ce61503e565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061510b600a83614807565b9150615116826150d5565b602082019050919050565b6000602082019050818103600083015261513a816150fe565b9050919050565b600061514c8261490c565b91506151578361490c565b92508282026151658161490c565b9150828204841483151761517c5761517b61503e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006151bd8261490c565b91506151c88361490c565b9250826151d8576151d7615183565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000615219601183614807565b9150615224826151e3565b602082019050919050565b600060208201905081810360008301526152488161520c565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615285601283614807565b91506152908261524f565b602082019050919050565b600060208201905081810360008301526152b481615278565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615320600d83614807565b915061532b826152ea565b602082019050919050565b6000602082019050818103600083015261534f81615313565b9050919050565b61535f81614ec0565b811461536a57600080fd5b50565b60008151905061537c81615356565b92915050565b6000602082840312156153985761539761473c565b5b60006153a68482850161536d565b9150509291505056fea2646970667358221220bdad8b7651c658121a07388a22a62150eafd0f38a872cf057ef212005a607df764736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200626e3803806200626e833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002f33176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f59176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161550962000d656000396000818161127f015281816115b3015281816124db0152612a85015260008181611b9e0152818161249e015281816129dd01528181612c210152612e09015260008181611bca01528181612c4d01528181612e2a0152612e6f0152600061161101526155096000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109cc5780638f0b2d5d146109ea5780638f1df6bc14610a0657806395d89b4114610a24576103ab565b806379ba50971461096057806384dde4af1461097e57806386fe212d1461099c576103ab565b8063731f237c116101d5578063731f237c146108d657806373f42561146108f45780637445e33a1461091257806374bedb9514610942576103ab565b80636a2d094e1461085a5780636f8b44b01461088a57806370a08231146108a6576103ab565b80632c1758c1116102e0578063449a52f81161027e57806358b2833b1161024d57806358b2833b146107be5780635ae06f7e146107dc5780635f408c041461080c5780636787a9be1461082a576103ab565b8063449a52f8146106fe57806347a505171461072e5780634abfbba21461075e57806351b4541c1461078e576103ab565b806331a5995d116102ba57806331a5995d14610662578063395093511461068057806340452d91146106b057806342966c68146106e2576103ab565b80632c1758c1146105e45780633133348714610614578063313ce56714610644576103ab565b806318cbbcfc1161034d578063229ba19711610327578063229ba1971461053657806323a859441461055457806323b872dd146105845780632a7aec09146105b4576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c591906148c3565b610c80565b6040516103d79190614909565b60405180910390f35b6103fa60048036038101906103f5919061497c565b610d69565b60405161040791906149c4565b60405180910390f35b610418610f0f565b6040516104259190614a6f565b60405180910390f35b61044860048036038101906104439190614abd565b610f9d565b60405161045591906149c4565b60405180910390f35b6104666111d9565b6040516104739190614b19565b60405180910390f35b61049660048036038101906104919190614b60565b6111ec565b6040516104a39190614909565b60405180910390f35b6104b461123c565b6040516104c19190614909565b60405180910390f35b6104d2611253565b6040516104df9190614909565b60405180910390f35b6104f0611258565b6040516104fd9190614909565b60405180910390f35b610520600480360381019061051b9190614d41565b611264565b60405161052d9190614909565b60405180910390f35b61053e61127d565b60405161054b9190614b19565b60405180910390f35b61056e60048036038101906105699190614d41565b6112a1565b60405161057b91906149c4565b60405180910390f35b61059e60048036038101906105999190614d6e565b611309565b6040516105ab91906149c4565b60405180910390f35b6105ce60048036038101906105c99190614d41565b611527565b6040516105db9190614b19565b60405180910390f35b6105fe60048036038101906105f99190614dc1565b61155f565b60405161060b91906149c4565b60405180910390f35b61062e60048036038101906106299190614dee565b611592565b60405161063b9190614909565b60405180910390f35b61064c61160f565b6040516106599190614909565b60405180910390f35b61066a611633565b6040516106779190614909565b60405180910390f35b61069a60048036038101906106959190614abd565b611639565b6040516106a791906149c4565b60405180910390f35b6106ca60048036038101906106c59190614dc1565b6117cf565b6040516106d993929190614e5b565b60405180910390f35b6106fc60048036038101906106f79190614dc1565b61183e565b005b61071860048036038101906107139190614abd565b61197a565b60405161072591906149c4565b60405180910390f35b610748600480360381019061074391906148c3565b611b51565b6040516107559190614909565b60405180910390f35b61077860048036038101906107739190614dc1565b611b9a565b6040516107859190614909565b60405180910390f35b6107a860048036038101906107a39190614dc1565b611bfa565b6040516107b59190614909565b60405180910390f35b6107c6611c1b565b6040516107d39190614909565b60405180910390f35b6107f660048036038101906107f191906148c3565b611c21565b60405161080391906149c4565b60405180910390f35b610814611d2b565b6040516108219190614eae565b60405180910390f35b610844600480360381019061083f9190614dc1565b611df8565b6040516108519190614909565b60405180910390f35b610874600480360381019061086f9190614dc1565b611e39565b6040516108819190614909565b60405180910390f35b6108a4600480360381019061089f9190614dc1565b611e5a565b005b6108c060048036038101906108bb91906148c3565b611f22565b6040516108cd9190614909565b60405180910390f35b6108de611f8c565b6040516108eb9190614909565b60405180910390f35b6108fc611f9d565b6040516109099190614909565b60405180910390f35b61092c60048036038101906109279190614d41565b611fa3565b6040516109399190614909565b60405180910390f35b61094a611fd1565b6040516109579190614909565b60405180910390f35b610968611fd7565b60405161097591906149c4565b60405180910390f35b61098661217e565b6040516109939190614ed8565b60405180910390f35b6109b660048036038101906109b19190614dc1565b6121a4565b6040516109c39190614909565b60405180910390f35b6109d461228b565b6040516109e19190614ed8565b60405180910390f35b610a0460048036038101906109ff91906148c3565b6122b1565b005b610a0e612366565b604051610a1b91906149c4565b60405180910390f35b610a2c612627565b604051610a399190614a6f565b60405180910390f35b610a5c6004803603810190610a579190614abd565b6126b5565b604051610a6991906149c4565b60405180910390f35b610a8c6004803603810190610a879190614abd565b6128d4565b604051610a9991906149c4565b60405180910390f35b610aaa6129d5565b604051610ab79190614909565b60405180910390f35b610ac86129db565b604051610ad59190614909565b60405180910390f35b610af86004803603810190610af39190614dc1565b6129ff565b604051610b059190614909565b60405180910390f35b610b16612b86565b604051610b239190614909565b60405180910390f35b610b34612b8c565b604051610b419190614909565b60405180910390f35b610b646004803603810190610b5f9190614dc1565b612b92565b005b610b6e612c91565b604051610b7b9190614909565b60405180910390f35b610b9e6004803603810190610b9991906148c3565b612c9b565b604051610bab91906149c4565b60405180910390f35b610bce6004803603810190610bc99190614d41565b612d6f565b604051610bdb9190614909565b60405180910390f35b610bfe6004803603810190610bf99190614ef3565b612d83565b604051610c0b9190614fc9565b60405180910390f35b610c1c612e03565b604051610c29919061500f565b60405180910390f35b610c3a612e6d565b604051610c479190614909565b60405180910390f35b610c6a6004803603810190610c6591906148c3565b612e91565b604051610c7791906149c4565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615059565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610f0a565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610f0a565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610f0a565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610f0a565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f055760019050610f0a565b600090505b919050565b60068054610f1c906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906150bc565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b505050505081565b6000806000610faa611d2b565b905060028160ff1603610fc2576000925050506111d3565b60008160ff161115611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090615139565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110d257600084146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906151a5565b60405180910390fd5b5b6110da612366565b506110e484611df8565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111c49190614909565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806112136111fb85612f33565b61120e6112086001612f33565b86612f9b565b613002565b905061121e81613081565b67ffffffffffffffff168461123391906151c5565b91505092915050565b6000600b5460085461124e91906151c5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff1611156112be5760009050611304565b6000826020015168ffffffffffffffffff1611156112df5760009050611304565b6000826040015167ffffffffffffffff1611156112ff5760009050611304565b600190505b919050565b600080600080611317611d2b565b905060028160ff16036113305760009350505050611520565b60008160ff161115611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90615139565b60405180910390fd5b61137f612366565b5061138985611df8565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561141457600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a091906151c5565b925050819055506114b28787856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516115119190614909565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611556576115536001612f33565b90505b80915050919050565b6000600f821061156e57600080fd5b6000820361158357600f60125414905061158d565b8160125483161490505b919050565b6000806000806115a186612f33565b92506115ac85612f33565b91506115d87f000000000000000000000000000000000000000000000000000000000000000083613002565b90506115e3816130db565b90506115ef8382613002565b90506115fa81613081565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611644612366565b5061164e83611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116dc9190615059565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117bc9190614909565b60405180910390a3600191505092915050565b600081815481106117df57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611848611d2b565b60ff161461185557600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ab57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156118f757600080fd5b600061190282611df8565b905061190e3382613168565b5081600b60008282546119219190615059565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161196e9190614909565b60405180910390a25050565b6000806000611987611d2b565b60ff161461199457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90615245565b60405180910390fd5b611a80612366565b5060006011541115611aa95760115483600854611a9d9190615059565b1115611aa857600080fd5b5b8260086000828254611abb9190615059565b92505081905550611acb83611df8565b9050611ad7848261326f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b359190614909565b60405180910390a3611b45613333565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611bc89190615265565b7f0000000000000000000000000000000000000000000000000000000000000000611bf39190615059565b9050919050565b6000603c8242611c0a91906151c5565b611c1491906152d6565b9050919050565b60035481565b6000611c30600160ff1661155f565b15611c3a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cc157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611cca57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611d4b5760019050611df5565b6000600f5403611d5e5760009050611df5565b600f544210611df057611d8b603c600354611d7991906152d6565b600f54611d8691906151c5565b6129ff565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611dd69190614909565b60405180910390a1611de6612366565b5060029050611df5565b600090505b90565b600080611e1c611e0784612f33565b600260009054906101000a9004600f0b6134f7565b9050611e2781613081565b67ffffffffffffffff16915050919050565b6000603c8242611e4991906151c5565b611e5391906152d6565b9050919050565b611e67600860ff1661155f565b15611e7157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ecb57600080fd5b611ed361123c565b8111611ede57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611f109190614909565b60405180910390a28060118190555050565b6000806000806000611f3b611f3687611b51565b612f33565b9350611f48600354611bfa565b9150611f6384600260009054906101000a9004600f0b613002565b9250611f81611f7184613081565b67ffffffffffffffff1683611592565b945050505050919050565b6000611f9860006129ff565b905090565b600b5481565b6000806000611fb184611264565b9150611fbc84611527565b9050611fc882826111ec565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461203457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615353565b60405180910390fd5b6000601254831614612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906153bf565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516122799190614909565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122be600260ff1661155f565b156122c857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461232257600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061237061481a565b61237861481a565b61238061481a565b6000806000806000612390611f8c565b50612399613583565b97506123a4886112a1565b156123ba57600098505050505050505050612624565b6000600954815481106123d0576123cf6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061247d88612d6f565b945060018561248c9190615059565b905061249786611527565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124c79190615265565b6124d191906152d6565b915061250d6125087f000000000000000000000000000000000000000000000000000000000000000061250385612f33565b613002565b6130db565b925061252360008461251d61123c565b84612d83565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506125df87613719565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161260f9190614909565b60405180910390a16001985050505050505050505b90565b60078054612634906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612660906150bc565b80156126ad5780601f10612682576101008083540402835291602001916126ad565b820191906000526020600020905b81548152906001019060200180831161269057829003601f168201915b505050505081565b6000806126c183611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561274c57600080fd5b612754612366565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e191906151c5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128c19190614909565b60405180910390a3600191505092915050565b6000806000806128e2611d2b565b905060028160ff16036128fb57600093505050506129cf565b60008160ff161115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990615139565b60405180910390fd5b61294a612366565b5061295485611df8565b92506129613387856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129c09190614909565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a29576000945050505050612b81565b612a34600354611bfa565b925060008303612a4b576000945050505050612b81565b600260009054906101000a9004600f0b9050600086118015612a6c57508286105b15612a75578592505b612a7e83612f33565b9150612aaa7f000000000000000000000000000000000000000000000000000000000000000083613002565b9350612ab5846130db565b9350612ad0600260009054906101000a9004600f0b85613002565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612b189190615265565b600354612b259190615059565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b719190614b19565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612ba1600460ff1661155f565b15612bab57600080fd5b601060009054906101000a900460ff1615612bc557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c4b9190615265565b7f0000000000000000000000000000000000000000000000000000000000000000612c769190615059565b9050600f548111612c8657600080fd5b80600f819055505050565b6000600b54905090565b6000612caa600160ff1661155f565b15612cb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d8b61481a565b612d9361481a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e5491906151c5565b612e5e91906152d6565b612e689190615059565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eed57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612f4a57600080fd5b6040829060020a029050919050565b60008082600f0b13612f6a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f8684613838565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fef57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ff857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561306e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61307757600080fd5b8091505092915050565b60008082600f0b121561309357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130c38584613168565b506130ce848461326f565b5060019150509392505050565b60006840000000000000000082600f0b126130f557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156131295760009050613163565b6131606080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139fe565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131c45760009350505050613269565b6131cd86611b51565b925084831015613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061545a565b60405180910390fd5b848361321e91906151c5565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036132cb576000935050505061332d565b6132d486611b51565b925084836132e29190615059565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061333d61481a565b600061334761123c565b90506000600160008054905061335d91906151c5565b8154811061336e5761336d6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061344991906151c5565b8154811061345a576134596153df565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361350857600080fd5b600082600f0b604085600f0b9060020a0281613527576135266152a7565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561357057506f7fffffffffffffffffffffffffffffff600f0b8113155b61357957600080fd5b8091505092915050565b61358b61481a565b61359361481a565b61359b61481a565b600080600954815481106135b2576135b16153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156136bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e191906154a6565b6fffffffffffffffffffffffffffffffff1690506136fe83612d6f565b811161370f57819350505050613716565b8293505050505b90565b600080600061372784611fa3565b61372f61123c565b61373991906151c5565b9150600a5461374783611df8565b61375191906151c5565b905061377f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261326f565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137f39190614909565b60405180910390a360016009600082825461380e9190615059565b9250508190555080600a60008282546138279190615059565b925050819055508192505050919050565b60008082600f0b1361384957600080fd5b60008083600f0b9050680100000000000000008112613884576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126138b2576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126138de576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613909576008819060008212600003808260020a82851804189250505090506008820191505b60108112613933576004819060008212600003808260020a82851804189250505090506004820191505b6004811261395d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261396c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156139f1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613999565b5081945050505050919050565b60006840000000000000000082600f0b12613a1857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613a4c5760009050614815565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a9a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613ad35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613b0c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613b4557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b7e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613bb7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613bf057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613c29576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c6157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c995760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613cd1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613d095760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613d41576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d7957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613db15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613de957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613e205760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e57576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e8e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ec5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613efc57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613f335760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f6a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613fa15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613fd7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561400d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156140435760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561407957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156140af5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b13156140e5576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561411b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614151576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561418657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141bb5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156141f0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156142255760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561425a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561428f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142c45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142f957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561432d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614361576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561439557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156143c9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143fd57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156144315760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614465576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144995760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156144cc576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ff57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156145325760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561456557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145985760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156145cb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145fe57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614631576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561466357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146955760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156146c7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146f95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561472b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561475d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561478f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156147c157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561481057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061489082614865565b9050919050565b6148a081614885565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b6000602082840312156148d9576148d8614860565b5b60006148e7848285016148ae565b91505092915050565b6000819050919050565b614903816148f0565b82525050565b600060208201905061491e60008301846148fa565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495981614924565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b60006020828403121561499257614991614860565b5b60006149a084828501614967565b91505092915050565b60008115159050919050565b6149be816149a9565b82525050565b60006020820190506149d960008301846149b5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a195780820151818401526020810190506149fe565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a41826149df565b614a4b81856149ea565b9350614a5b8185602086016149fb565b614a6481614a25565b840191505092915050565b60006020820190508181036000830152614a898184614a36565b905092915050565b614a9a816148f0565b8114614aa557600080fd5b50565b600081359050614ab781614a91565b92915050565b60008060408385031215614ad457614ad3614860565b5b6000614ae2858286016148ae565b9250506020614af385828601614aa8565b9150509250929050565b600081600f0b9050919050565b614b1381614afd565b82525050565b6000602082019050614b2e6000830184614b0a565b92915050565b614b3d81614afd565b8114614b4857600080fd5b50565b600081359050614b5a81614b34565b92915050565b60008060408385031215614b7757614b76614860565b5b6000614b8585828601614aa8565b9250506020614b9685828601614b4b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bdd82614a25565b810181811067ffffffffffffffff82111715614bfc57614bfb614ba5565b5b80604052505050565b6000614c0f614856565b9050614c1b8282614bd4565b919050565b600063ffffffff82169050919050565b614c3981614c20565b8114614c4457600080fd5b50565b600081359050614c5681614c30565b92915050565b600068ffffffffffffffffff82169050919050565b614c7a81614c5c565b8114614c8557600080fd5b50565b600081359050614c9781614c71565b92915050565b600067ffffffffffffffff82169050919050565b614cba81614c9d565b8114614cc557600080fd5b50565b600081359050614cd781614cb1565b92915050565b600060608284031215614cf357614cf2614ba0565b5b614cfd6060614c05565b90506000614d0d84828501614c47565b6000830152506020614d2184828501614c88565b6020830152506040614d3584828501614cc8565b60408301525092915050565b600060608284031215614d5757614d56614860565b5b6000614d6584828501614cdd565b91505092915050565b600080600060608486031215614d8757614d86614860565b5b6000614d95868287016148ae565b9350506020614da6868287016148ae565b9250506040614db786828701614aa8565b9150509250925092565b600060208284031215614dd757614dd6614860565b5b6000614de584828501614aa8565b91505092915050565b60008060408385031215614e0557614e04614860565b5b6000614e1385828601614aa8565b9250506020614e2485828601614aa8565b9150509250929050565b614e3781614c20565b82525050565b614e4681614c5c565b82525050565b614e5581614c9d565b82525050565b6000606082019050614e706000830186614e2e565b614e7d6020830185614e3d565b614e8a6040830184614e4c565b949350505050565b600060ff82169050919050565b614ea881614e92565b82525050565b6000602082019050614ec36000830184614e9f565b92915050565b614ed281614885565b82525050565b6000602082019050614eed6000830184614ec9565b92915050565b60008060008060808587031215614f0d57614f0c614860565b5b6000614f1b87828801614aa8565b9450506020614f2c87828801614b4b565b9350506040614f3d87828801614aa8565b9250506060614f4e87828801614aa8565b91505092959194509250565b614f6381614c20565b82525050565b614f7281614c5c565b82525050565b614f8181614c9d565b82525050565b606082016000820151614f9d6000850182614f5a565b506020820151614fb06020850182614f69565b506040820151614fc36040850182614f78565b50505050565b6000606082019050614fde6000830184614f87565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61500981614fe4565b82525050565b60006020820190506150246000830184615000565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615064826148f0565b915061506f836148f0565b92508282019050808211156150875761508661502a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150d457607f821691505b6020821081036150e7576150e661508d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151236007836149ea565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061518f600a836149ea565b915061519a82615159565b602082019050919050565b600060208201905081810360008301526151be81615182565b9050919050565b60006151d0826148f0565b91506151db836148f0565b92508282039050818111156151f3576151f261502a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061522f600a836149ea565b915061523a826151f9565b602082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b6000615270826148f0565b915061527b836148f0565b9250828202615289816148f0565b915082820484148315176152a05761529f61502a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152e1826148f0565b91506152ec836148f0565b9250826152fc576152fb6152a7565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061533d6011836149ea565b915061534882615307565b602082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153a96012836149ea565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615444600d836149ea565b915061544f8261540e565b602082019050919050565b6000602082019050818103600083015261547381615437565b9050919050565b61548381614fe4565b811461548e57600080fd5b50565b6000815190506154a08161547a565b92915050565b6000602082840312156154bc576154bb614860565b5b60006154ca84828501615491565b9150509291505056fea2646970667358221220e513c18e024f61f7df896fc073669e7f70fe7cc019a4c2107ebd579df21546ae64736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index ca2b020..003483b 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 27451cc..88ea88b 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -443,6 +443,19 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return tx + def sweep(self, contract_address, sender_address, recipient_address, tx_format=TxFormat.JSONRPC): + enc = ABIContractEncoder() + enc.method('sweep') + enc.typ(ABIContractType.ADDRESS) + enc.address(recipient_address) + data = enc.get() + tx = self.template(sender_address, contract_address, use_nonce=True) + tx = self.set_code(tx, data) + tx = self.finalize(tx, tx_format) + return tx + + + def apply_demurrage(self, contract_address, sender_address, limit=0, tx_format=TxFormat.JSONRPC): if limit == 0: return self.transact_noarg('applyDemurrage', contract_address, sender_address) @@ -474,8 +487,6 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return tx - - def tax_level(self, contract_address, sender_address=ZERO_ADDRESS): return self.call_noarg('taxLevel', contract_address, sender_address=sender_address) diff --git a/python/setup.cfg b/python/setup.cfg index 39c7990..6e1c97c 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.6 +version = 0.3.7 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/python/tests/test_amounts.py b/python/tests/test_amounts.py index dc28f82..10a1bd2 100644 --- a/python/tests/test_amounts.py +++ b/python/tests/test_amounts.py @@ -122,5 +122,26 @@ class TestAmounts(TestDemurrageDefault): self.assert_within_lower(balance, case[1], 10000) + def test_sweep(self): + nonce_oracle = RPCNonceOracle(self.accounts[0], self.rpc) + c = DemurrageToken(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.mint_to(self.address, self.accounts[0], self.accounts[0], 2000) + r = self.rpc.do(o) + + (tx_hash, o) = c.sweep(self.address, self.accounts[0], self.accounts[1]) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.rpc.do(o) + self.assertEqual(r['status'], 1) + + o = c.balance_of(self.address, self.accounts[0], sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assertEqual(c.parse_balance(r), 0) + + o = c.balance_of(self.address, self.accounts[1], sender_address=self.accounts[0]) + r = self.rpc.do(o) + self.assert_within(c.parse_balance(r), 2000, 1) + + if __name__ == '__main__': unittest.main() diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index b3f2cf5..e22546f 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -292,6 +292,16 @@ contract DemurrageTokenSingleNocap { return true; } + // Send full balance of one account to another + function sweep(address _account) public returns (uint256) { + uint256 v; + + v = account[msg.sender]; + account[msg.sender] = 0; + account[_account] += v; + return v; + } + // Creates new tokens out of thin air, and allocates them to the given address // Triggers tax function mintTo(address _beneficiary, uint256 _amount) external returns (bool) { From 4ec1ea8b45ee8dbd1799f4ef79c500473d0a9da0 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Feb 2023 10:41:54 +0000 Subject: [PATCH 48/57] rename to decaylevel --- .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- python/erc20_demurrage_token/token.py | 6 +++--- solidity/DemurrageTokenSingleNocap.sol | 18 +++++++++--------- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 7ae4a1b..091b391 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200626e3803806200626e833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002f33176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f59176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161550962000d656000396000818161127f015281816115b3015281816124db0152612a85015260008181611b9e0152818161249e015281816129dd01528181612c210152612e09015260008181611bca01528181612c4d01528181612e2a0152612e6f0152600061161101526155096000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636a2d094e116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806379ba5097116101995780638da5cb5b116101735780638da5cb5b146109cc5780638f0b2d5d146109ea5780638f1df6bc14610a0657806395d89b4114610a24576103ab565b806379ba50971461096057806384dde4af1461097e57806386fe212d1461099c576103ab565b8063731f237c116101d5578063731f237c146108d657806373f42561146108f45780637445e33a1461091257806374bedb9514610942576103ab565b80636a2d094e1461085a5780636f8b44b01461088a57806370a08231146108a6576103ab565b80632c1758c1116102e0578063449a52f81161027e57806358b2833b1161024d57806358b2833b146107be5780635ae06f7e146107dc5780635f408c041461080c5780636787a9be1461082a576103ab565b8063449a52f8146106fe57806347a505171461072e5780634abfbba21461075e57806351b4541c1461078e576103ab565b806331a5995d116102ba57806331a5995d14610662578063395093511461068057806340452d91146106b057806342966c68146106e2576103ab565b80632c1758c1146105e45780633133348714610614578063313ce56714610644576103ab565b806318cbbcfc1161034d578063229ba19711610327578063229ba1971461053657806323a859441461055457806323b872dd146105845780632a7aec09146105b4576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c591906148c3565b610c80565b6040516103d79190614909565b60405180910390f35b6103fa60048036038101906103f5919061497c565b610d69565b60405161040791906149c4565b60405180910390f35b610418610f0f565b6040516104259190614a6f565b60405180910390f35b61044860048036038101906104439190614abd565b610f9d565b60405161045591906149c4565b60405180910390f35b6104666111d9565b6040516104739190614b19565b60405180910390f35b61049660048036038101906104919190614b60565b6111ec565b6040516104a39190614909565b60405180910390f35b6104b461123c565b6040516104c19190614909565b60405180910390f35b6104d2611253565b6040516104df9190614909565b60405180910390f35b6104f0611258565b6040516104fd9190614909565b60405180910390f35b610520600480360381019061051b9190614d41565b611264565b60405161052d9190614909565b60405180910390f35b61053e61127d565b60405161054b9190614b19565b60405180910390f35b61056e60048036038101906105699190614d41565b6112a1565b60405161057b91906149c4565b60405180910390f35b61059e60048036038101906105999190614d6e565b611309565b6040516105ab91906149c4565b60405180910390f35b6105ce60048036038101906105c99190614d41565b611527565b6040516105db9190614b19565b60405180910390f35b6105fe60048036038101906105f99190614dc1565b61155f565b60405161060b91906149c4565b60405180910390f35b61062e60048036038101906106299190614dee565b611592565b60405161063b9190614909565b60405180910390f35b61064c61160f565b6040516106599190614909565b60405180910390f35b61066a611633565b6040516106779190614909565b60405180910390f35b61069a60048036038101906106959190614abd565b611639565b6040516106a791906149c4565b60405180910390f35b6106ca60048036038101906106c59190614dc1565b6117cf565b6040516106d993929190614e5b565b60405180910390f35b6106fc60048036038101906106f79190614dc1565b61183e565b005b61071860048036038101906107139190614abd565b61197a565b60405161072591906149c4565b60405180910390f35b610748600480360381019061074391906148c3565b611b51565b6040516107559190614909565b60405180910390f35b61077860048036038101906107739190614dc1565b611b9a565b6040516107859190614909565b60405180910390f35b6107a860048036038101906107a39190614dc1565b611bfa565b6040516107b59190614909565b60405180910390f35b6107c6611c1b565b6040516107d39190614909565b60405180910390f35b6107f660048036038101906107f191906148c3565b611c21565b60405161080391906149c4565b60405180910390f35b610814611d2b565b6040516108219190614eae565b60405180910390f35b610844600480360381019061083f9190614dc1565b611df8565b6040516108519190614909565b60405180910390f35b610874600480360381019061086f9190614dc1565b611e39565b6040516108819190614909565b60405180910390f35b6108a4600480360381019061089f9190614dc1565b611e5a565b005b6108c060048036038101906108bb91906148c3565b611f22565b6040516108cd9190614909565b60405180910390f35b6108de611f8c565b6040516108eb9190614909565b60405180910390f35b6108fc611f9d565b6040516109099190614909565b60405180910390f35b61092c60048036038101906109279190614d41565b611fa3565b6040516109399190614909565b60405180910390f35b61094a611fd1565b6040516109579190614909565b60405180910390f35b610968611fd7565b60405161097591906149c4565b60405180910390f35b61098661217e565b6040516109939190614ed8565b60405180910390f35b6109b660048036038101906109b19190614dc1565b6121a4565b6040516109c39190614909565b60405180910390f35b6109d461228b565b6040516109e19190614ed8565b60405180910390f35b610a0460048036038101906109ff91906148c3565b6122b1565b005b610a0e612366565b604051610a1b91906149c4565b60405180910390f35b610a2c612627565b604051610a399190614a6f565b60405180910390f35b610a5c6004803603810190610a579190614abd565b6126b5565b604051610a6991906149c4565b60405180910390f35b610a8c6004803603810190610a879190614abd565b6128d4565b604051610a9991906149c4565b60405180910390f35b610aaa6129d5565b604051610ab79190614909565b60405180910390f35b610ac86129db565b604051610ad59190614909565b60405180910390f35b610af86004803603810190610af39190614dc1565b6129ff565b604051610b059190614909565b60405180910390f35b610b16612b86565b604051610b239190614909565b60405180910390f35b610b34612b8c565b604051610b419190614909565b60405180910390f35b610b646004803603810190610b5f9190614dc1565b612b92565b005b610b6e612c91565b604051610b7b9190614909565b60405180910390f35b610b9e6004803603810190610b9991906148c3565b612c9b565b604051610bab91906149c4565b60405180910390f35b610bce6004803603810190610bc99190614d41565b612d6f565b604051610bdb9190614909565b60405180910390f35b610bfe6004803603810190610bf99190614ef3565b612d83565b604051610c0b9190614fc9565b60405180910390f35b610c1c612e03565b604051610c29919061500f565b60405180910390f35b610c3a612e6d565b604051610c479190614909565b60405180910390f35b610c6a6004803603810190610c6591906148c3565b612e91565b604051610c7791906149c4565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615059565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610f0a565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610f0a565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610f0a565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610f0a565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f055760019050610f0a565b600090505b919050565b60068054610f1c906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906150bc565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b505050505081565b6000806000610faa611d2b565b905060028160ff1603610fc2576000925050506111d3565b60008160ff161115611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090615139565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110d257600084146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906151a5565b60405180910390fd5b5b6110da612366565b506110e484611df8565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111c49190614909565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806112136111fb85612f33565b61120e6112086001612f33565b86612f9b565b613002565b905061121e81613081565b67ffffffffffffffff168461123391906151c5565b91505092915050565b6000600b5460085461124e91906151c5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080826000015163ffffffff1611156112be5760009050611304565b6000826020015168ffffffffffffffffff1611156112df5760009050611304565b6000826040015167ffffffffffffffff1611156112ff5760009050611304565b600190505b919050565b600080600080611317611d2b565b905060028160ff16036113305760009350505050611520565b60008160ff161115611377576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136e90615139565b60405180910390fd5b61137f612366565b5061138985611df8565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561141457600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a091906151c5565b925050819055506114b28787856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516115119190614909565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b03611556576115536001612f33565b90505b80915050919050565b6000600f821061156e57600080fd5b6000820361158357600f60125414905061158d565b8160125483161490505b919050565b6000806000806115a186612f33565b92506115ac85612f33565b91506115d87f000000000000000000000000000000000000000000000000000000000000000083613002565b90506115e3816130db565b90506115ef8382613002565b90506115fa81613081565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611644612366565b5061164e83611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116dc9190615059565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117bc9190614909565b60405180910390a3600191505092915050565b600081815481106117df57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611848611d2b565b60ff161461185557600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166118ab57600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156118f757600080fd5b600061190282611df8565b905061190e3382613168565b5081600b60008282546119219190615059565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161196e9190614909565b60405180910390a25050565b6000806000611987611d2b565b60ff161461199457600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a395750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6f90615245565b60405180910390fd5b611a80612366565b5060006011541115611aa95760115483600854611a9d9190615059565b1115611aa857600080fd5b5b8260086000828254611abb9190615059565b92505081905550611acb83611df8565b9050611ad7848261326f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b359190614909565b60405180910390a3611b45613333565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611bc89190615265565b7f0000000000000000000000000000000000000000000000000000000000000000611bf39190615059565b9050919050565b6000603c8242611c0a91906151c5565b611c1491906152d6565b9050919050565b60035481565b6000611c30600160ff1661155f565b15611c3a57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611cc157503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611cca57600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611d4b5760019050611df5565b6000600f5403611d5e5760009050611df5565b600f544210611df057611d8b603c600354611d7991906152d6565b600f54611d8691906151c5565b6129ff565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611dd69190614909565b60405180910390a1611de6612366565b5060029050611df5565b600090505b90565b600080611e1c611e0784612f33565b600260009054906101000a9004600f0b6134f7565b9050611e2781613081565b67ffffffffffffffff16915050919050565b6000603c8242611e4991906151c5565b611e5391906152d6565b9050919050565b611e67600860ff1661155f565b15611e7157600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ecb57600080fd5b611ed361123c565b8111611ede57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611f109190614909565b60405180910390a28060118190555050565b6000806000806000611f3b611f3687611b51565b612f33565b9350611f48600354611bfa565b9150611f6384600260009054906101000a9004600f0b613002565b9250611f81611f7184613081565b67ffffffffffffffff1683611592565b945050505050919050565b6000611f9860006129ff565b905090565b600b5481565b6000806000611fb184611264565b9150611fbc84611527565b9050611fc882826111ec565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461203457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106121e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e090615353565b60405180910390fd5b6000601254831614612230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612227906153bf565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516122799190614909565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6122be600260ff1661155f565b156122c857600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461232257600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061237061481a565b61237861481a565b61238061481a565b6000806000806000612390611f8c565b50612399613583565b97506123a4886112a1565b156123ba57600098505050505050505050612624565b6000600954815481106123d0576123cf6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061247d88612d6f565b945060018561248c9190615059565b905061249786611527565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124c79190615265565b6124d191906152d6565b915061250d6125087f000000000000000000000000000000000000000000000000000000000000000061250385612f33565b613002565b6130db565b925061252360008461251d61123c565b84612d83565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506125df87613719565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161260f9190614909565b60405180910390a16001985050505050505050505b90565b60078054612634906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054612660906150bc565b80156126ad5780601f10612682576101008083540402835291602001916126ad565b820191906000526020600020905b81548152906001019060200180831161269057829003601f168201915b505050505081565b6000806126c183611df8565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561274c57600080fd5b612754612366565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e191906151c5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128c19190614909565b60405180910390a3600191505092915050565b6000806000806128e2611d2b565b905060028160ff16036128fb57600093505050506129cf565b60008160ff161115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990615139565b60405180910390fd5b61294a612366565b5061295485611df8565b92506129613387856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129c09190614909565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a29576000945050505050612b81565b612a34600354611bfa565b925060008303612a4b576000945050505050612b81565b600260009054906101000a9004600f0b9050600086118015612a6c57508286105b15612a75578592505b612a7e83612f33565b9150612aaa7f000000000000000000000000000000000000000000000000000000000000000083613002565b9350612ab5846130db565b9350612ad0600260009054906101000a9004600f0b85613002565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612b189190615265565b600354612b259190615059565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b719190614b19565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612ba1600460ff1661155f565b15612bab57600080fd5b601060009054906101000a900460ff1615612bc557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c4b9190615265565b7f0000000000000000000000000000000000000000000000000000000000000000612c769190615059565b9050600f548111612c8657600080fd5b80600f819055505050565b6000600b54905090565b6000612caa600160ff1661155f565b15612cb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d8b61481a565b612d9361481a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e5491906151c5565b612e5e91906152d6565b612e689190615059565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eed57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612f4a57600080fd5b6040829060020a029050919050565b60008082600f0b13612f6a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f8684613838565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fef57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ff857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561306e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61307757600080fd5b8091505092915050565b60008082600f0b121561309357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130c38584613168565b506130ce848461326f565b5060019150509392505050565b60006840000000000000000082600f0b126130f557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156131295760009050613163565b6131606080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139fe565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131c45760009350505050613269565b6131cd86611b51565b925084831015613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061545a565b60405180910390fd5b848361321e91906151c5565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036132cb576000935050505061332d565b6132d486611b51565b925084836132e29190615059565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061333d61481a565b600061334761123c565b90506000600160008054905061335d91906151c5565b8154811061336e5761336d6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061344991906151c5565b8154811061345a576134596153df565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361350857600080fd5b600082600f0b604085600f0b9060020a0281613527576135266152a7565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561357057506f7fffffffffffffffffffffffffffffff600f0b8113155b61357957600080fd5b8091505092915050565b61358b61481a565b61359361481a565b61359b61481a565b600080600954815481106135b2576135b16153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156136bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e191906154a6565b6fffffffffffffffffffffffffffffffff1690506136fe83612d6f565b811161370f57819350505050613716565b8293505050505b90565b600080600061372784611fa3565b61372f61123c565b61373991906151c5565b9150600a5461374783611df8565b61375191906151c5565b905061377f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261326f565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137f39190614909565b60405180910390a360016009600082825461380e9190615059565b9250508190555080600a60008282546138279190615059565b925050819055508192505050919050565b60008082600f0b1361384957600080fd5b60008083600f0b9050680100000000000000008112613884576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126138b2576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126138de576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613909576008819060008212600003808260020a82851804189250505090506008820191505b60108112613933576004819060008212600003808260020a82851804189250505090506004820191505b6004811261395d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261396c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156139f1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613999565b5081945050505050919050565b60006840000000000000000082600f0b12613a1857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613a4c5760009050614815565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a9a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613ad35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613b0c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613b4557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b7e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613bb7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613bf057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613c29576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c6157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c995760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613cd1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613d095760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613d41576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d7957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613db15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613de957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613e205760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e57576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e8e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ec5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613efc57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613f335760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f6a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613fa15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613fd7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561400d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156140435760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561407957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156140af5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b13156140e5576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561411b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614151576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561418657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141bb5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156141f0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156142255760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561425a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561428f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142c45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142f957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561432d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614361576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561439557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156143c9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143fd57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156144315760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614465576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144995760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156144cc576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ff57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156145325760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561456557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145985760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156145cb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145fe57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614631576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561466357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146955760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156146c7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146f95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561472b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561475d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561478f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156147c157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561481057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061489082614865565b9050919050565b6148a081614885565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b6000602082840312156148d9576148d8614860565b5b60006148e7848285016148ae565b91505092915050565b6000819050919050565b614903816148f0565b82525050565b600060208201905061491e60008301846148fa565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495981614924565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b60006020828403121561499257614991614860565b5b60006149a084828501614967565b91505092915050565b60008115159050919050565b6149be816149a9565b82525050565b60006020820190506149d960008301846149b5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a195780820151818401526020810190506149fe565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a41826149df565b614a4b81856149ea565b9350614a5b8185602086016149fb565b614a6481614a25565b840191505092915050565b60006020820190508181036000830152614a898184614a36565b905092915050565b614a9a816148f0565b8114614aa557600080fd5b50565b600081359050614ab781614a91565b92915050565b60008060408385031215614ad457614ad3614860565b5b6000614ae2858286016148ae565b9250506020614af385828601614aa8565b9150509250929050565b600081600f0b9050919050565b614b1381614afd565b82525050565b6000602082019050614b2e6000830184614b0a565b92915050565b614b3d81614afd565b8114614b4857600080fd5b50565b600081359050614b5a81614b34565b92915050565b60008060408385031215614b7757614b76614860565b5b6000614b8585828601614aa8565b9250506020614b9685828601614b4b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bdd82614a25565b810181811067ffffffffffffffff82111715614bfc57614bfb614ba5565b5b80604052505050565b6000614c0f614856565b9050614c1b8282614bd4565b919050565b600063ffffffff82169050919050565b614c3981614c20565b8114614c4457600080fd5b50565b600081359050614c5681614c30565b92915050565b600068ffffffffffffffffff82169050919050565b614c7a81614c5c565b8114614c8557600080fd5b50565b600081359050614c9781614c71565b92915050565b600067ffffffffffffffff82169050919050565b614cba81614c9d565b8114614cc557600080fd5b50565b600081359050614cd781614cb1565b92915050565b600060608284031215614cf357614cf2614ba0565b5b614cfd6060614c05565b90506000614d0d84828501614c47565b6000830152506020614d2184828501614c88565b6020830152506040614d3584828501614cc8565b60408301525092915050565b600060608284031215614d5757614d56614860565b5b6000614d6584828501614cdd565b91505092915050565b600080600060608486031215614d8757614d86614860565b5b6000614d95868287016148ae565b9350506020614da6868287016148ae565b9250506040614db786828701614aa8565b9150509250925092565b600060208284031215614dd757614dd6614860565b5b6000614de584828501614aa8565b91505092915050565b60008060408385031215614e0557614e04614860565b5b6000614e1385828601614aa8565b9250506020614e2485828601614aa8565b9150509250929050565b614e3781614c20565b82525050565b614e4681614c5c565b82525050565b614e5581614c9d565b82525050565b6000606082019050614e706000830186614e2e565b614e7d6020830185614e3d565b614e8a6040830184614e4c565b949350505050565b600060ff82169050919050565b614ea881614e92565b82525050565b6000602082019050614ec36000830184614e9f565b92915050565b614ed281614885565b82525050565b6000602082019050614eed6000830184614ec9565b92915050565b60008060008060808587031215614f0d57614f0c614860565b5b6000614f1b87828801614aa8565b9450506020614f2c87828801614b4b565b9350506040614f3d87828801614aa8565b9250506060614f4e87828801614aa8565b91505092959194509250565b614f6381614c20565b82525050565b614f7281614c5c565b82525050565b614f8181614c9d565b82525050565b606082016000820151614f9d6000850182614f5a565b506020820151614fb06020850182614f69565b506040820151614fc36040850182614f78565b50505050565b6000606082019050614fde6000830184614f87565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61500981614fe4565b82525050565b60006020820190506150246000830184615000565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615064826148f0565b915061506f836148f0565b92508282019050808211156150875761508661502a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150d457607f821691505b6020821081036150e7576150e661508d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151236007836149ea565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061518f600a836149ea565b915061519a82615159565b602082019050919050565b600060208201905081810360008301526151be81615182565b9050919050565b60006151d0826148f0565b91506151db836148f0565b92508282039050818111156151f3576151f261502a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061522f600a836149ea565b915061523a826151f9565b602082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b6000615270826148f0565b915061527b836148f0565b9250828202615289816148f0565b915082820484148315176152a05761529f61502a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152e1826148f0565b91506152ec836148f0565b9250826152fc576152fb6152a7565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061533d6011836149ea565b915061534882615307565b602082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153a96012836149ea565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615444600d836149ea565b915061544f8261540e565b602082019050919050565b6000602082019050818103600083015261547381615437565b9050919050565b61548381614fe4565b811461548e57600080fd5b50565b6000815190506154a08161547a565b92915050565b6000602082840312156154bc576154bb614860565b5b60006154ca84828501615491565b9150509291505056fea2646970667358221220e513c18e024f61f7df896fc073669e7f70fe7cc019a4c2107ebd579df21546ae64736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200626e3803806200626e833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002f33176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f59176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161550962000d656000396000818161158f015281816124b7015281816126930152612a85015260008181611b7a0152818161247a015281816129dd01528181612c210152612e09015260008181611ba601528181612c4d01528181612e2a0152612e6f015260006115ed01526155096000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636f8b44b0116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806384dde4af116101995780638f0b2d5d116101735780638f0b2d5d146109cc5780638f1df6bc146109e857806395d89b4114610a065780639f24880814610a24576103ab565b806384dde4af1461096057806386fe212d1461097e5780638da5cb5b146109ae576103ab565b806373f42561116101d557806373f42561146108d65780637445e33a146108f457806374bedb951461092457806379ba509714610942576103ab565b80636f8b44b01461086c57806370a0823114610888578063731f237c146108b8576103ab565b806331333487116102e057806347a505171161027e5780635ae06f7e1161024d5780635ae06f7e146107be5780635f408c04146107ee5780636787a9be1461080c5780636a2d094e1461083c576103ab565b806347a50517146107105780634abfbba21461074057806351b4541c1461077057806358b2833b146107a0576103ab565b806339509351116102ba578063395093511461066257806340452d911461069257806342966c68146106c4578063449a52f8146106e0576103ab565b806331333487146105f6578063313ce5671461062657806331a5995d14610644576103ab565b806318cbbcfc1161034d57806323a859441161032757806323a859441461053657806323b872dd146105665780632a7aec09146105965780632c1758c1146105c6576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c591906148c3565b610c80565b6040516103d79190614909565b60405180910390f35b6103fa60048036038101906103f5919061497c565b610d69565b60405161040791906149c4565b60405180910390f35b610418610f0f565b6040516104259190614a6f565b60405180910390f35b61044860048036038101906104439190614abd565b610f9d565b60405161045591906149c4565b60405180910390f35b6104666111d9565b6040516104739190614b19565b60405180910390f35b61049660048036038101906104919190614b60565b6111ec565b6040516104a39190614909565b60405180910390f35b6104b461123c565b6040516104c19190614909565b60405180910390f35b6104d2611253565b6040516104df9190614909565b60405180910390f35b6104f0611258565b6040516104fd9190614909565b60405180910390f35b610520600480360381019061051b9190614d41565b611264565b60405161052d9190614909565b60405180910390f35b610550600480360381019061054b9190614d41565b61127d565b60405161055d91906149c4565b60405180910390f35b610580600480360381019061057b9190614d6e565b6112e5565b60405161058d91906149c4565b60405180910390f35b6105b060048036038101906105ab9190614d41565b611503565b6040516105bd9190614b19565b60405180910390f35b6105e060048036038101906105db9190614dc1565b61153b565b6040516105ed91906149c4565b60405180910390f35b610610600480360381019061060b9190614dee565b61156e565b60405161061d9190614909565b60405180910390f35b61062e6115eb565b60405161063b9190614909565b60405180910390f35b61064c61160f565b6040516106599190614909565b60405180910390f35b61067c60048036038101906106779190614abd565b611615565b60405161068991906149c4565b60405180910390f35b6106ac60048036038101906106a79190614dc1565b6117ab565b6040516106bb93929190614e5b565b60405180910390f35b6106de60048036038101906106d99190614dc1565b61181a565b005b6106fa60048036038101906106f59190614abd565b611956565b60405161070791906149c4565b60405180910390f35b61072a600480360381019061072591906148c3565b611b2d565b6040516107379190614909565b60405180910390f35b61075a60048036038101906107559190614dc1565b611b76565b6040516107679190614909565b60405180910390f35b61078a60048036038101906107859190614dc1565b611bd6565b6040516107979190614909565b60405180910390f35b6107a8611bf7565b6040516107b59190614909565b60405180910390f35b6107d860048036038101906107d391906148c3565b611bfd565b6040516107e591906149c4565b60405180910390f35b6107f6611d07565b6040516108039190614eae565b60405180910390f35b61082660048036038101906108219190614dc1565b611dd4565b6040516108339190614909565b60405180910390f35b61085660048036038101906108519190614dc1565b611e15565b6040516108639190614909565b60405180910390f35b61088660048036038101906108819190614dc1565b611e36565b005b6108a2600480360381019061089d91906148c3565b611efe565b6040516108af9190614909565b60405180910390f35b6108c0611f68565b6040516108cd9190614909565b60405180910390f35b6108de611f79565b6040516108eb9190614909565b60405180910390f35b61090e60048036038101906109099190614d41565b611f7f565b60405161091b9190614909565b60405180910390f35b61092c611fad565b6040516109399190614909565b60405180910390f35b61094a611fb3565b60405161095791906149c4565b60405180910390f35b61096861215a565b6040516109759190614ed8565b60405180910390f35b61099860048036038101906109939190614dc1565b612180565b6040516109a59190614909565b60405180910390f35b6109b6612267565b6040516109c39190614ed8565b60405180910390f35b6109e660048036038101906109e191906148c3565b61228d565b005b6109f0612342565b6040516109fd91906149c4565b60405180910390f35b610a0e612603565b604051610a1b9190614a6f565b60405180910390f35b610a2c612691565b604051610a399190614b19565b60405180910390f35b610a5c6004803603810190610a579190614abd565b6126b5565b604051610a6991906149c4565b60405180910390f35b610a8c6004803603810190610a879190614abd565b6128d4565b604051610a9991906149c4565b60405180910390f35b610aaa6129d5565b604051610ab79190614909565b60405180910390f35b610ac86129db565b604051610ad59190614909565b60405180910390f35b610af86004803603810190610af39190614dc1565b6129ff565b604051610b059190614909565b60405180910390f35b610b16612b86565b604051610b239190614909565b60405180910390f35b610b34612b8c565b604051610b419190614909565b60405180910390f35b610b646004803603810190610b5f9190614dc1565b612b92565b005b610b6e612c91565b604051610b7b9190614909565b60405180910390f35b610b9e6004803603810190610b9991906148c3565b612c9b565b604051610bab91906149c4565b60405180910390f35b610bce6004803603810190610bc99190614d41565b612d6f565b604051610bdb9190614909565b60405180910390f35b610bfe6004803603810190610bf99190614ef3565b612d83565b604051610c0b9190614fc9565b60405180910390f35b610c1c612e03565b604051610c29919061500f565b60405180910390f35b610c3a612e6d565b604051610c479190614909565b60405180910390f35b610c6a6004803603810190610c6591906148c3565b612e91565b604051610c7791906149c4565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615059565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610f0a565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610f0a565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610f0a565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610f0a565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f055760019050610f0a565b600090505b919050565b60068054610f1c906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906150bc565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b505050505081565b6000806000610faa611d07565b905060028160ff1603610fc2576000925050506111d3565b60008160ff161115611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090615139565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110d257600084146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906151a5565b60405180910390fd5b5b6110da612342565b506110e484611dd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111c49190614909565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806112136111fb85612f33565b61120e6112086001612f33565b86612f9b565b613002565b905061121e81613081565b67ffffffffffffffff168461123391906151c5565b91505092915050565b6000600b5460085461124e91906151c5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561129a57600090506112e0565b6000826020015168ffffffffffffffffff1611156112bb57600090506112e0565b6000826040015167ffffffffffffffff1611156112db57600090506112e0565b600190505b919050565b6000806000806112f3611d07565b905060028160ff160361130c57600093505050506114fc565b60008160ff161115611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90615139565b60405180910390fd5b61135b612342565b5061136585611dd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156113f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461147c91906151c5565b9250508190555061148e8787856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516114ed9190614909565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036115325761152f6001612f33565b90505b80915050919050565b6000600f821061154a57600080fd5b6000820361155f57600f601254149050611569565b8160125483161490505b919050565b60008060008061157d86612f33565b925061158885612f33565b91506115b47f000000000000000000000000000000000000000000000000000000000000000083613002565b90506115bf816130db565b90506115cb8382613002565b90506115d681613081565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611620612342565b5061162a83611dd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b89190615059565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117989190614909565b60405180910390a3600191505092915050565b600081815481106117bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611824611d07565b60ff161461183157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661188757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156118d357600080fd5b60006118de82611dd4565b90506118ea3382613168565b5081600b60008282546118fd9190615059565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161194a9190614909565b60405180910390a25050565b6000806000611963611d07565b60ff161461197057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90615245565b60405180910390fd5b611a5c612342565b5060006011541115611a855760115483600854611a799190615059565b1115611a8457600080fd5b5b8260086000828254611a979190615059565b92505081905550611aa783611dd4565b9050611ab3848261326f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b119190614909565b60405180910390a3611b21613333565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611ba49190615265565b7f0000000000000000000000000000000000000000000000000000000000000000611bcf9190615059565b9050919050565b6000603c8242611be691906151c5565b611bf091906152d6565b9050919050565b60035481565b6000611c0c600160ff1661153b565b15611c1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ca657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611d275760019050611dd1565b6000600f5403611d3a5760009050611dd1565b600f544210611dcc57611d67603c600354611d5591906152d6565b600f54611d6291906151c5565b6129ff565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611db29190614909565b60405180910390a1611dc2612342565b5060029050611dd1565b600090505b90565b600080611df8611de384612f33565b600260009054906101000a9004600f0b6134f7565b9050611e0381613081565b67ffffffffffffffff16915050919050565b6000603c8242611e2591906151c5565b611e2f91906152d6565b9050919050565b611e43600860ff1661153b565b15611e4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ea757600080fd5b611eaf61123c565b8111611eba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611eec9190614909565b60405180910390a28060118190555050565b6000806000806000611f17611f1287611b2d565b612f33565b9350611f24600354611bd6565b9150611f3f84600260009054906101000a9004600f0b613002565b9250611f5d611f4d84613081565b67ffffffffffffffff168361156e565b945050505050919050565b6000611f7460006129ff565b905090565b600b5481565b6000806000611f8d84611264565b9150611f9884611503565b9050611fa482826111ec565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc90615353565b60405180910390fd5b600060125483161461220c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612203906153bf565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516122559190614909565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61229a600260ff1661153b565b156122a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061234c61481a565b61235461481a565b61235c61481a565b600080600080600061236c611f68565b50612375613583565b97506123808861127d565b1561239657600098505050505050505050612600565b6000600954815481106123ac576123ab6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061245988612d6f565b94506001856124689190615059565b905061247386611503565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124a39190615265565b6124ad91906152d6565b91506124e96124e47f00000000000000000000000000000000000000000000000000000000000000006124df85612f33565b613002565b6130db565b92506124ff6000846124f961123c565b84612d83565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506125bb87613719565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516125eb9190614909565b60405180910390a16001985050505050505050505b90565b60078054612610906150bc565b80601f016020809104026020016040519081016040528092919081815260200182805461263c906150bc565b80156126895780601f1061265e57610100808354040283529160200191612689565b820191906000526020600020905b81548152906001019060200180831161266c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806126c183611dd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561274c57600080fd5b612754612342565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e191906151c5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128c19190614909565b60405180910390a3600191505092915050565b6000806000806128e2611d07565b905060028160ff16036128fb57600093505050506129cf565b60008160ff161115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990615139565b60405180910390fd5b61294a612342565b5061295485611dd4565b92506129613387856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129c09190614909565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a29576000945050505050612b81565b612a34600354611bd6565b925060008303612a4b576000945050505050612b81565b600260009054906101000a9004600f0b9050600086118015612a6c57508286105b15612a75578592505b612a7e83612f33565b9150612aaa7f000000000000000000000000000000000000000000000000000000000000000083613002565b9350612ab5846130db565b9350612ad0600260009054906101000a9004600f0b85613002565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612b189190615265565b600354612b259190615059565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b719190614b19565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612ba1600460ff1661153b565b15612bab57600080fd5b601060009054906101000a900460ff1615612bc557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c4b9190615265565b7f0000000000000000000000000000000000000000000000000000000000000000612c769190615059565b9050600f548111612c8657600080fd5b80600f819055505050565b6000600b54905090565b6000612caa600160ff1661153b565b15612cb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d8b61481a565b612d9361481a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e5491906151c5565b612e5e91906152d6565b612e689190615059565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eed57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612f4a57600080fd5b6040829060020a029050919050565b60008082600f0b13612f6a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f8684613838565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fef57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ff857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561306e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61307757600080fd5b8091505092915050565b60008082600f0b121561309357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130c38584613168565b506130ce848461326f565b5060019150509392505050565b60006840000000000000000082600f0b126130f557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156131295760009050613163565b6131606080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139fe565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131c45760009350505050613269565b6131cd86611b2d565b925084831015613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061545a565b60405180910390fd5b848361321e91906151c5565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036132cb576000935050505061332d565b6132d486611b2d565b925084836132e29190615059565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061333d61481a565b600061334761123c565b90506000600160008054905061335d91906151c5565b8154811061336e5761336d6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061344991906151c5565b8154811061345a576134596153df565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361350857600080fd5b600082600f0b604085600f0b9060020a0281613527576135266152a7565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561357057506f7fffffffffffffffffffffffffffffff600f0b8113155b61357957600080fd5b8091505092915050565b61358b61481a565b61359361481a565b61359b61481a565b600080600954815481106135b2576135b16153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156136bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e191906154a6565b6fffffffffffffffffffffffffffffffff1690506136fe83612d6f565b811161370f57819350505050613716565b8293505050505b90565b600080600061372784611f7f565b61372f61123c565b61373991906151c5565b9150600a5461374783611dd4565b61375191906151c5565b905061377f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261326f565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137f39190614909565b60405180910390a360016009600082825461380e9190615059565b9250508190555080600a60008282546138279190615059565b925050819055508192505050919050565b60008082600f0b1361384957600080fd5b60008083600f0b9050680100000000000000008112613884576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126138b2576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126138de576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613909576008819060008212600003808260020a82851804189250505090506008820191505b60108112613933576004819060008212600003808260020a82851804189250505090506004820191505b6004811261395d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261396c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156139f1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613999565b5081945050505050919050565b60006840000000000000000082600f0b12613a1857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613a4c5760009050614815565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a9a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613ad35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613b0c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613b4557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b7e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613bb7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613bf057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613c29576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c6157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c995760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613cd1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613d095760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613d41576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d7957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613db15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613de957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613e205760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e57576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e8e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ec5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613efc57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613f335760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f6a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613fa15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613fd7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561400d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156140435760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561407957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156140af5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b13156140e5576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561411b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614151576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561418657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141bb5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156141f0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156142255760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561425a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561428f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142c45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142f957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561432d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614361576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561439557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156143c9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143fd57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156144315760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614465576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144995760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156144cc576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ff57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156145325760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561456557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145985760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156145cb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145fe57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614631576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561466357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146955760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156146c7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146f95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561472b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561475d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561478f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156147c157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561481057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061489082614865565b9050919050565b6148a081614885565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b6000602082840312156148d9576148d8614860565b5b60006148e7848285016148ae565b91505092915050565b6000819050919050565b614903816148f0565b82525050565b600060208201905061491e60008301846148fa565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495981614924565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b60006020828403121561499257614991614860565b5b60006149a084828501614967565b91505092915050565b60008115159050919050565b6149be816149a9565b82525050565b60006020820190506149d960008301846149b5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a195780820151818401526020810190506149fe565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a41826149df565b614a4b81856149ea565b9350614a5b8185602086016149fb565b614a6481614a25565b840191505092915050565b60006020820190508181036000830152614a898184614a36565b905092915050565b614a9a816148f0565b8114614aa557600080fd5b50565b600081359050614ab781614a91565b92915050565b60008060408385031215614ad457614ad3614860565b5b6000614ae2858286016148ae565b9250506020614af385828601614aa8565b9150509250929050565b600081600f0b9050919050565b614b1381614afd565b82525050565b6000602082019050614b2e6000830184614b0a565b92915050565b614b3d81614afd565b8114614b4857600080fd5b50565b600081359050614b5a81614b34565b92915050565b60008060408385031215614b7757614b76614860565b5b6000614b8585828601614aa8565b9250506020614b9685828601614b4b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bdd82614a25565b810181811067ffffffffffffffff82111715614bfc57614bfb614ba5565b5b80604052505050565b6000614c0f614856565b9050614c1b8282614bd4565b919050565b600063ffffffff82169050919050565b614c3981614c20565b8114614c4457600080fd5b50565b600081359050614c5681614c30565b92915050565b600068ffffffffffffffffff82169050919050565b614c7a81614c5c565b8114614c8557600080fd5b50565b600081359050614c9781614c71565b92915050565b600067ffffffffffffffff82169050919050565b614cba81614c9d565b8114614cc557600080fd5b50565b600081359050614cd781614cb1565b92915050565b600060608284031215614cf357614cf2614ba0565b5b614cfd6060614c05565b90506000614d0d84828501614c47565b6000830152506020614d2184828501614c88565b6020830152506040614d3584828501614cc8565b60408301525092915050565b600060608284031215614d5757614d56614860565b5b6000614d6584828501614cdd565b91505092915050565b600080600060608486031215614d8757614d86614860565b5b6000614d95868287016148ae565b9350506020614da6868287016148ae565b9250506040614db786828701614aa8565b9150509250925092565b600060208284031215614dd757614dd6614860565b5b6000614de584828501614aa8565b91505092915050565b60008060408385031215614e0557614e04614860565b5b6000614e1385828601614aa8565b9250506020614e2485828601614aa8565b9150509250929050565b614e3781614c20565b82525050565b614e4681614c5c565b82525050565b614e5581614c9d565b82525050565b6000606082019050614e706000830186614e2e565b614e7d6020830185614e3d565b614e8a6040830184614e4c565b949350505050565b600060ff82169050919050565b614ea881614e92565b82525050565b6000602082019050614ec36000830184614e9f565b92915050565b614ed281614885565b82525050565b6000602082019050614eed6000830184614ec9565b92915050565b60008060008060808587031215614f0d57614f0c614860565b5b6000614f1b87828801614aa8565b9450506020614f2c87828801614b4b565b9350506040614f3d87828801614aa8565b9250506060614f4e87828801614aa8565b91505092959194509250565b614f6381614c20565b82525050565b614f7281614c5c565b82525050565b614f8181614c9d565b82525050565b606082016000820151614f9d6000850182614f5a565b506020820151614fb06020850182614f69565b506040820151614fc36040850182614f78565b50505050565b6000606082019050614fde6000830184614f87565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61500981614fe4565b82525050565b60006020820190506150246000830184615000565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615064826148f0565b915061506f836148f0565b92508282019050808211156150875761508661502a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150d457607f821691505b6020821081036150e7576150e661508d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151236007836149ea565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061518f600a836149ea565b915061519a82615159565b602082019050919050565b600060208201905081810360008301526151be81615182565b9050919050565b60006151d0826148f0565b91506151db836148f0565b92508282039050818111156151f3576151f261502a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061522f600a836149ea565b915061523a826151f9565b602082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b6000615270826148f0565b915061527b836148f0565b9250828202615289816148f0565b915082820484148315176152a05761529f61502a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152e1826148f0565b91506152ec836148f0565b9250826152fc576152fb6152a7565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061533d6011836149ea565b915061534882615307565b602082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153a96012836149ea565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615444600d836149ea565b915061544f8261540e565b602082019050919050565b6000602082019050818103600083015261547381615437565b9050919050565b61548381614fe4565b811461548e57600080fd5b50565b6000815190506154a08161547a565b92915050565b6000602082840312156154bc576154bb614860565b5b60006154ca84828501615491565b9150509291505056fea2646970667358221220dd12d17c82bae51dab9df921745b40561cc71eacb629c0c8481b25a5153bddc264736f6c63430008110033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 003483b..0d42da7 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_taxLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/token.py b/python/erc20_demurrage_token/token.py index 88ea88b..ae3ff0e 100644 --- a/python/erc20_demurrage_token/token.py +++ b/python/erc20_demurrage_token/token.py @@ -487,8 +487,8 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): return tx - def tax_level(self, contract_address, sender_address=ZERO_ADDRESS): - return self.call_noarg('taxLevel', contract_address, sender_address=sender_address) + def decay_level(self, contract_address, sender_address=ZERO_ADDRESS): + return self.call_noarg('decayLevel', contract_address, sender_address=sender_address) def resolution_factor(self, contract_address, sender_address=ZERO_ADDRESS): @@ -669,7 +669,7 @@ class DemurrageToken(ERC20, SealedContract, ExpiryContract): @classmethod - def parse_tax_level(self, v): + def parse_decay_level(self, v): return abi_decode_single(ABIContractType.UINT256, v) diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index e22546f..8705b0a 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -67,9 +67,9 @@ contract DemurrageTokenSingleNocap { uint256 public immutable periodDuration; // Demurrage in ppm per minute - //uint256 public immutable taxLevel; + //uint256 public immutable decayLevel; // 64x64 - int128 public immutable taxLevel; + int128 public immutable decayLevel; // Addresses allowed to mint new tokens mapping (address => bool) minter; @@ -129,11 +129,11 @@ contract DemurrageTokenSingleNocap { event SealStateChange(bool indexed _final, uint256 _sealState); - constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _taxLevel, uint256 _periodMinutes, address _defaultSinkAddress) { - require(_taxLevel < (1 << 64)); + constructor(string memory _name, string memory _symbol, uint8 _decimals, int128 _decayLevel, uint256 _periodMinutes, address _defaultSinkAddress) { + require(_decayLevel < (1 << 64)); redistributionItem memory initialRedistribution; - //require(ABDKMath64x64.toUInt(_taxLevel) == 0); + //require(ABDKMath64x64.toUInt(_decayLevel) == 0); // ACL setup owner = msg.sender; @@ -149,7 +149,7 @@ contract DemurrageTokenSingleNocap { periodDuration = _periodMinutes * 60; demurrageAmount = ABDKMath64x64.fromUInt(1); - taxLevel = ABDKMath64x64.ln(_taxLevel); + decayLevel = ABDKMath64x64.ln(_decayLevel); initialRedistribution = toRedistribution(0, demurrageAmount, 0, 1); redistributions.push(initialRedistribution); @@ -448,7 +448,7 @@ contract DemurrageTokenSingleNocap { lastDemurrageAmount = toRedistributionDemurrageModifier(lastRedistribution); demurrageCounts = (periodDuration * currentPeriod) / 60; // TODO refactor decayby to take int128 then DRY with it - nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(taxLevel, ABDKMath64x64.fromUInt(demurrageCounts))); + nextRedistributionDemurrage = ABDKMath64x64.exp(ABDKMath64x64.mul(decayLevel, ABDKMath64x64.fromUInt(demurrageCounts))); nextRedistribution = toRedistribution(0, nextRedistributionDemurrage, totalSupply(), nextPeriod); redistributions.push(nextRedistribution); @@ -491,7 +491,7 @@ contract DemurrageTokenSingleNocap { } periodPoint = ABDKMath64x64.fromUInt(periodCount); - v = ABDKMath64x64.mul(taxLevel, periodPoint); + v = ABDKMath64x64.mul(decayLevel, periodPoint); v = ABDKMath64x64.exp(v); demurrageAmount = ABDKMath64x64.mul(demurrageAmount, v); @@ -533,7 +533,7 @@ contract DemurrageTokenSingleNocap { valuePoint = ABDKMath64x64.fromUInt(_value); periodPoint = ABDKMath64x64.fromUInt(_period); - v = ABDKMath64x64.mul(taxLevel, periodPoint); + v = ABDKMath64x64.mul(decayLevel, periodPoint); v = ABDKMath64x64.exp(v); v = ABDKMath64x64.mul(valuePoint, v); return ABDKMath64x64.toUInt(v); From e39b2597497dfae0143ff6ff7806887fb7374547 Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Feb 2023 10:48:31 +0000 Subject: [PATCH 49/57] bump version due to incompatibility of taxLevel rename --- python/CHANGELOG | 3 ++- python/setup.cfg | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 03b13ff..659fbbd 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,4 +1,5 @@ -- 0.3.7 +- 0.4.0 + * Rename taxLevel to decayLevel in contract * Add sweep contract method to fully empty one account into another - 0.3.6 * Reinstate owner as minter by default diff --git a/python/setup.cfg b/python/setup.cfg index 6e1c97c..6f0cdab 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.3.7 +version = 0.4.0 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no From 65a91cc44d7062e24deb14f541109404b8b9bd13 Mon Sep 17 00:00:00 2001 From: Will Ruddick Date: Sun, 19 Feb 2023 14:16:39 +0300 Subject: [PATCH 50/57] updated README example Signed-off-by: lash --- README.md | 26 +-- .../runnable/#publish.py# | 176 ++++++++++++++++++ .../runnable/.#publish.py | 1 + 3 files changed, 190 insertions(+), 13 deletions(-) create mode 100644 python/erc20_demurrage_token/runnable/#publish.py# create mode 120000 python/erc20_demurrage_token/runnable/.#publish.py diff --git a/README.md b/README.md index ec4b12e..c82104d 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,24 @@ # RedistributedDemurrageToken -**this documentation is obsolete, will rewrite asap** +# RedistributedDemurrageToken + +**Last edit: Will Ruddick Feburary 19 2023** ## Use Case -* Network / Basic Income Token - * 100 Sarafu is distributed to anyone in Kenya after user validation by the owner of a faucet which mints new Sarafu. - * Validated users are those that validate their phone number in Kenya. - * A Sarafu holding tax aka ([demurrage](https://en.wikipedia.org/wiki/Demurrage_(currency))) of 0.000050105908373373% is charged from users per minute - such that over 1 month to total tax would be 2%. - * After 1 week the total amount tax is distributed evenly out to _active_ users. - * any single transaction by a user within that week is considered _active_ (heartbeat) - * This is meant to result in a disincentivization to hold (hodl) the Sarafu token and increase its usage as a medium of exchange rather than a store of value. - * This token can be added to liquidity pools with other ERC20 tokens and or Community Inclusion Currencies (CICs) - and thereby act as a central network token and connect various tokens and CICs together. +* Vouchers + * A Publisher may publish a RedistributedDemurrageToken (Voucher) representing a credit obligation of an Issuer or Association of Issuers that can be redeemed as payment for the products of the Issuer. The Issuer is the entity legally obligated to redeem the voucher as payment. + * Decay: The Publisher can specify an decay rate such as 2% as well as a redistribution period. After the redistribution period such as a month. Assuming an account holder has not had any transfers they will have a new balance of their original balance*2%. Note that the numeric decay will happen continuously by the minute. + * Redistribution: The missing (demurraged) balances will be added to the balance of the SINK address. So once a redistribution period (e.g. once a month) the total supply of all holders including the SINK will return to the minted supply. + * This is meant to result as a disincentivization to hold (hodl) the Voucher without causing price inflation, as the total supply is stable. * Example - - With a demurrage of 2% (net per month) and a reward period of 1 month - If there are 10 users all with balances of 1000 Sarafu and only 2 of them trade that month (assume they trade back and forth with no net balance change). - - Then the resulting balances after one tax period of those two trading would be 1080 Sarafu while the remaining non-active users would be 980 Sarafu. If this behaviour continued in the next tax period, with the same two users only trading (with no net balance changes), they would have 1158.39999968 Sarafu and those users that are not trading would have their balances further reduced to 960.40 Sarafu. If this continued on ~forever those two active trading users would have the entire token supply and the non-trading users would eventually reach a zero balance. - - this example calculation for 3 tax periods can be found here: https://gitlab.com/grassrootseconomics/cic-docs/-/blob/master/demurrage-redist-sarafu.ods + - With a demurrage of 2% (and redistribution period of 1 month) - If there are 10 users all with balances of 100 Vouchers (and only 2 of them trade that month (assume they trade back and forth with no net balance change)). + - Then the resulting balances after one redistribution period of ALL users (regardless of their trading) would be 98 Vouchers and 20 Voucher would be the balance of the SINK address. Assuming the SINK address is redistributed (as a Community Fund) back to users, it’s balance would again reach 20 the next redistribution period. + - Note that after the redistribution the total of all balances will equal the total minted amount. + - Note that all accounts holding such Vouchers are effected by demurrage. ## Nomenclature -* `Demurrage` aka Decay amount: A percentage of token supply that will be charged once per minute and evenly redistributed to _active_ users every Demurrage Period (minutes) +* `Demurrage` aka Decay amount: A percentage of token supply that will gradually be removed over a redstribution period and then redistributed to the SINK account. * Base balance: The inflated balance of each user is stored for bookkeeping. * Sink Token Address: Rounding errors and if no one trades the tax goes to this address * Demurrage Period (minutes)- aka `period`: The number of minutes over which a user must be _active_ to receive tax-redistibution. diff --git a/python/erc20_demurrage_token/runnable/#publish.py# b/python/erc20_demurrage_token/runnable/#publish.py# new file mode 100644 index 0000000..7cf72dc --- /dev/null +++ b/python/erc20_demurrage_token/runnable/#publish.py# @@ -0,0 +1,176 @@ +"""Deploy sarafu token + +.. moduleauthor:: Louis Holbrook +.. pgp:: 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 + +""" + +# standard imports +import sys +import os +import json +import argparse +import logging + +# external imports +import confini +from funga.eth.signer import EIP155Signer +from funga.eth.keystore.dict import DictKeystore +from chainlib.chain import ChainSpec +from chainlib.eth.nonce import ( + RPCNonceOracle, + OverrideNonceOracle, + ) +from chainlib.eth.gas import ( + RPCGasOracle, + OverrideGasOracle, + ) +from chainlib.eth.connection import EthHTTPConnection +from chainlib.eth.tx import receipt +from chainlib.eth.constant import ZERO_ADDRESS +import chainlib.eth.cli +from chainlib.eth.cli.arg import ( + Arg, + ArgFlag, + process_args, + ) +from chainlib.eth.cli.config import ( + Config, + process_config, + ) +from chainlib.eth.cli.log import process_log +from chainlib.eth.settings import process_settings +from chainlib.eth.address import to_checksum_address +from chainlib.settings import ChainSettings + +from dexif import to_fixed + +# local imports +import erc20_demurrage_token +from erc20_demurrage_token import ( + DemurrageToken, + DemurrageTokenSettings, + ) + +logg = logging.getLogger() + +script_dir = os.path.dirname(__file__) +data_dir = os.path.join(script_dir, '..', 'data') + +config_dir = os.path.join(data_dir, 'config') + + +def process_config_local(config, arg, args, flags): + config.add(args.token_name, 'TOKEN_NAME') + config.add(args.token_symbol, 'TOKEN_SYMBOL') + config.add(args.token_decimals, 'TOKEN_DECIMALS') + sink_address = to_checksum_address(args.sink_address) + config.add(sink_address, 'TOKEN_SINK_ADDRESS') + config.add(args.redistribution_period, 'TOKEN_REDISTRIBUTION_PERIOD') + + v = (1 - (args.demurrage_level / 1000000)) ** (1 / config.get('TOKEN_REDISTRIBUTION_PERIOD')) + if v >= 1.0: + raise ValueError('demurrage level must be less than 100%') + demurrage_level = to_fixed(v) + logg.info('v {} demurrage level {}'.format(v, demurrage_level)) + config.add(demurrage_level, 'TOKEN_DEMURRAGE_LEVEL') + return config + + +arg_flags = ArgFlag() +arg = Arg(arg_flags) +flags = arg_flags.STD_WRITE | arg_flags.WALLET + +argparser = chainlib.eth.cli.ArgumentParser(arg_flags) +argparser = process_args(argparser, arg, flags) +argparser.add_argument('--name', dest='token_name', type=str, help='Token name') +argparser.add_argument('--symbol', dest='token_symbol', required=True, type=str, help='Token symbol') +argparser.add_argument('--decimals', dest='token_decimals', type=int, help='Token decimals') +argparser.add_argument('--sink-address', dest='sink_address', type=str, help='demurrage level,ppm per minute') +argparser.add_argument('--redistribution-period', type=int, help='redistribution period, minutes (0 = deactivate)') # default 10080 = week +argparser.add_argument('--demurrage-level', dest='demurrage_level', type=int, help='demurrage level, ppm per period') +args = argparser.parse_args() + +logg = process_log(args, logg) + +config = Config() +config = process_config(config, arg, args, flags) +config = process_config_local(config, arg, args, flags) +logg.debug('config loaded:\n{}'.format(config)) + +settings = ChainSettings() +settings = process_settings(settings, config) +logg.debug('settings loaded:\n{}'.format(settings)) + + +#extra_args = { +# 'redistribution_period': 'TOKEN_REDISTRIBUTION_PERIOD', +# 'demurrage_level': 'TOKEN_DEMURRAGE_LEVEL', +# 'supply_limit': 'TOKEN_SUPPLY_LIMIT', +# 'token_name': 'TOKEN_NAME', +# 'token_symbol': 'TOKEN_SYMBOL', +# 'token_decimals': 'TOKEN_DECIMALS', +# 'sink_address': 'TOKEN_SINK_ADDRESS', +# 'multi': None, +# } +#config = chainlib.eth.cli.Config.from_args(args, arg_flags, extra_args=extra_args, default_fee_limit=DemurrageToken.gas(), base_config_dir=config_dir) +# +#if not bool(config.get('TOKEN_NAME')): +# logg.info('token name not set, using symbol {} as name'.format(config.get('TOKEN_SYMBOL'))) +# config.add(config.get('TOKEN_SYMBOL'), 'TOKEN_NAME', True) +# +#if config.get('TOKEN_SUPPLY_LIMIT') == None: +# config.add(0, 'TOKEN_SUPPLY_LIMIT', True) +# +#if config.get('TOKEN_REDISTRIBUTION_PERIOD') == None: +# config.add(10800, 'TOKEN_REDISTRIBUTION_PERIOD', True) +#logg.debug('config loaded:\n{}'.format(config)) +# +#wallet = chainlib.eth.cli.Wallet() +#wallet.from_config(config) +# +#rpc = chainlib.eth.cli.Rpc(wallet=wallet) +#conn = rpc.connect_by_config(config) +# +#chain_spec = ChainSpec.from_chain_str(config.get('CHAIN_SPEC')) + +def main(): + conn = settings.get('CONN') + c = DemurrageToken( + settings.get('CHAIN_SPEC'), + signer=settings.get('SIGNER'), + gas_oracle=settings.get('FEE_ORACLE'), + nonce_oracle=settings.get('NONCE_ORACLE'), + ) + token_settings = DemurrageTokenSettings() + token_settings.name = config.get('TOKEN_NAME') + token_settings.symbol = config.get('TOKEN_SYMBOL') + token_settings.decimals = int(config.get('TOKEN_DECIMALS')) + token_settings.demurrage_level = int(config.get('TOKEN_DEMURRAGE_LEVEL')) + token_settings.period_minutes = int(config.get('TOKEN_REDISTRIBUTION_PERIOD')) + token_settings.sink_address = config.get('TOKEN_SINK_ADDRESS') + + (tx_hash_hex, o) = c.constructor( + settings.get('SENDER_ADDRESS'), + token_settings, + ) + if settings.get('RPC_SEND'): + conn.do(o) + if config.true('_WAIT'): + r = conn.wait(tx_hash_hex) + if r['status'] == 0: + sys.stderr.write('EVM revert while deploying contract. Wish I had more to tell you') + sys.exit(1) + # TODO: pass through translator for keys (evm tester uses underscore instead of camelcase) + address = r['contractAddress'] + + print(address) + else: + print(tx_hash_hex) + + else: + print(o) + + +if __name__ == '__main__': + main() diff --git a/python/erc20_demurrage_token/runnable/.#publish.py b/python/erc20_demurrage_token/runnable/.#publish.py new file mode 120000 index 0000000..816ba54 --- /dev/null +++ b/python/erc20_demurrage_token/runnable/.#publish.py @@ -0,0 +1 @@ +wor@gecon.733148:1676287007 \ No newline at end of file From f75472fcf5f460f5743ffd844df9bea7cae4ab3c Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 1 Mar 2023 12:01:32 +0000 Subject: [PATCH 51/57] Update readme for calculations and inputs --- README.md | 94 +++++++++++++++----------- solidity/DemurrageTokenSingleNocap.sol | 3 - 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index c82104d..2a68039 100644 --- a/README.md +++ b/README.md @@ -32,63 +32,75 @@ ## Mint -* Owner can add minters and remove - - A faucet contract would be a minter and choose the amount of tokens to mint and distribute to new _validated_ users. - - The interface says the amount and is at the caller's discretion per contract call. _validation_ is outside of this contract. -* A minter can remove itself -* Minters can mint any amount +* Minters are called writers. Contract owner can add and remove writers. +* A writer can remove itself +* The interface says the amount and is at the caller's discretion per contract call. _validation_ is outside of this contract. +* Writers can mint any amount. If supply cap is set, minting will be limited to this cap. -## Demurrage -* Holding Tax (`demurrage`) is applied when a **mint** or **transfer**; (it can also be triggered explicitly) - - Note that the token supply _stays the same_ but a virtual _balance output_ is created. - - Updates `demurrageModifier` which represents the accumulated tax value and is an exponential decay step (of size `demurrage`) for each minute that has passed. - - `demurrageModifier = (1-demurrage)^(minute_passed)` - - e.g. a `demurrage` of 2% after the 1st minute would be give a `demurrageModifier = (1-0.02)^1 = 0.98`. - - e.g. a `demurrage` after the 2nd minute would be give a `demurrageModifier = (1-0.02)^2 = 0.9604`. -* All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`. - - e.g. `_balance output_ = user_balance - user_balance * demurrageModifier` +## Input parameters + +The redistrbution period is passed to the contract in minutes. E.g. a redistribution period of one month would be approximately 43200 minutes. + +The demurrage level specified as the percentage of continuous growth per minute: + +`(1 - percentage) ^ (1 / period)` + +E.g. A demurrage of 2% monthly would be defined as: + +`(1 - 0.02) ^ (1 / 43200) ~ 0.99999953234484737109` + +The number must be provided to the contract as a 64x64 bit fixed-point number (where the integer part is 0). + +A script is included in the python package to publish the contract which takes the input as a percentage as parts-per-million and converts the correct input argument for the contract. The calculation can be found in the function `process_config_local` in `python/erc20_demurrage_token/runnable/publish.py`. It uses the python module [dexif](https://pypi.org/project/dexif/) to perform the fixed-point conversion. + + +## Demurrage calculation + +The demurrage calculation inside the contract is done by the following formula, where `demurrageLevel` is the demurrage level input parameter of the contract: + +`newDemurrageModifier = currentDemurrageModifier * (e ^ (ln(demurrageLevel) * minutes))` + +Holding Tax (`demurrage`) is applied when a **mint** or **transfer**; (it can also be triggered explicitly) +- Note that the token supply _stays the same_ but a virtual _balance output_ is created. +- Updates `demurrageModifier` which represents the accumulated tax value and is an exponential decay step (of size `demurrage`) for each minute that has passed. + + +All client-facing values (_balance output_ , _transfer inputs_) are adjusted with `demurrageModifier`. + +e.g. `_balance output_ = user_balance - user_balance * demurrageModifier` ## Redistribution * One redistribution entry is added to storage for each `period`; - - When `mint` is triggered, the new totalsupply is stored to the entry - - When `transfer` is triggered, and the account did not yet participate in the `period`, the entry's participant count is incremented. -* Account must have "participated" in a period to be redistribution beneficiary. -* Redistribution is applied when an account triggers a **transfer** for the first time in a new `period`; - - Check if user has participated in `period`. (_active_ user heartbeat) - - Each _active_ user balance in the `period` is increased by `(total supply at end of period * demurrageModifier ) / number_of_active_participants` via minting - - Participation field is zeroed out for that user. -* Fractions must be rounded down - - Remainder is "dust" and should be sent to a dedicated Sink Token Address. - - If no one is _active_ all taxes go to the Sink Token Address. +* When `mint` is triggered, the new totalsupply is stored to the entry +* When `transfer` is triggered, and the account did not yet participate in the `period`, the entry's participant count is incremented. +* Redistributed tokens are added to the balance of the _sink address_ given when the contract is published. +* _sink address_ may be changed. -## Data structures +## Data representation -* One word per `account`: - - bits 000-071: value - - bits 072-103: period - - bits 104-255: (Unused) -* One word per `redistributions` period: - - bits 000-031: period - - bits 032-103: supply - - bits 104-139: participant count - - bits 140-159: demurrage modifier - - bits 160-254: (Unused) - - bits 255: Set if individual redistribution amounts are fractions +Token parameters are truncated when calculating demurrage and redistribution: -### Notes +* Redistribution period: 32 bits +* Token supply: 72 bits +* Demurrage modifier: 64 bits -Accumulated demurrage modifier in `demurrageModifier` is 128 bit, but will be _truncated_ do 20 bits in `redistributions`. The 128 bit resolution is to used to reduce the impact of fractional drift of the long-term accumulation of the demurrage modifier. However, the demurrage snapshot values used in `redistributions` are parts-per-million and can be fully contained within a 20-bit value. + + +## Gas usage + +The token contract uses the [ADBKMath](https://github.com/abdk-consulting/abdk-libraries-solidity/blob/master/ABDKMath64x64.sol) library to calculate exponentials. + +Gas usage is constant regardless of the amount of time passed between each execution of demurrage and redistribution period calculations. ## QA -* Basic python tests in place -* How to determine and generate sufficient test vectors, and how to adapt them to scripts. -* Audit sources? +* Tests are implemented using the `chaintool` python package suite. + ## Known issues diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 8705b0a..975eaad 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -706,9 +706,6 @@ contract DemurrageTokenSingleNocap { if (_sum == 0x9493f8b2) { // EIP173 return true; } - if (_sum == 0x37a47be4) { // OwnedAccepter - return true; - } return false; } } From 954630132ba94b92af70a534f45c6beab604a7d3 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 1 Mar 2023 12:03:25 +0000 Subject: [PATCH 52/57] Remove last edit line --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 2a68039..f98329b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,5 @@ # RedistributedDemurrageToken -# RedistributedDemurrageToken - -**Last edit: Will Ruddick Feburary 19 2023** - ## Use Case * Vouchers * A Publisher may publish a RedistributedDemurrageToken (Voucher) representing a credit obligation of an Issuer or Association of Issuers that can be redeemed as payment for the products of the Issuer. The Issuer is the entity legally obligated to redeem the voucher as payment. From 83383c0b9bf64fa4d1593e6a4460aee25701f434 Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 7 Mar 2023 10:16:59 +0000 Subject: [PATCH 53/57] Recompile with solc 0.8.18+commit.87f61d96 --- python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 091b391..507ff39 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200626e3803806200626e833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002f33176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f59176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e05161550962000d656000396000818161158f015281816124b7015281816126930152612a85015260008181611b7a0152818161247a015281816129dd01528181612c210152612e09015260008181611ba601528181612c4d01528181612e2a0152612e6f015260006115ed01526155096000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636f8b44b0116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806384dde4af116101995780638f0b2d5d116101735780638f0b2d5d146109cc5780638f1df6bc146109e857806395d89b4114610a065780639f24880814610a24576103ab565b806384dde4af1461096057806386fe212d1461097e5780638da5cb5b146109ae576103ab565b806373f42561116101d557806373f42561146108d65780637445e33a146108f457806374bedb951461092457806379ba509714610942576103ab565b80636f8b44b01461086c57806370a0823114610888578063731f237c146108b8576103ab565b806331333487116102e057806347a505171161027e5780635ae06f7e1161024d5780635ae06f7e146107be5780635f408c04146107ee5780636787a9be1461080c5780636a2d094e1461083c576103ab565b806347a50517146107105780634abfbba21461074057806351b4541c1461077057806358b2833b146107a0576103ab565b806339509351116102ba578063395093511461066257806340452d911461069257806342966c68146106c4578063449a52f8146106e0576103ab565b806331333487146105f6578063313ce5671461062657806331a5995d14610644576103ab565b806318cbbcfc1161034d57806323a859441161032757806323a859441461053657806323b872dd146105665780632a7aec09146105965780632c1758c1146105c6576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c591906148c3565b610c80565b6040516103d79190614909565b60405180910390f35b6103fa60048036038101906103f5919061497c565b610d69565b60405161040791906149c4565b60405180910390f35b610418610f0f565b6040516104259190614a6f565b60405180910390f35b61044860048036038101906104439190614abd565b610f9d565b60405161045591906149c4565b60405180910390f35b6104666111d9565b6040516104739190614b19565b60405180910390f35b61049660048036038101906104919190614b60565b6111ec565b6040516104a39190614909565b60405180910390f35b6104b461123c565b6040516104c19190614909565b60405180910390f35b6104d2611253565b6040516104df9190614909565b60405180910390f35b6104f0611258565b6040516104fd9190614909565b60405180910390f35b610520600480360381019061051b9190614d41565b611264565b60405161052d9190614909565b60405180910390f35b610550600480360381019061054b9190614d41565b61127d565b60405161055d91906149c4565b60405180910390f35b610580600480360381019061057b9190614d6e565b6112e5565b60405161058d91906149c4565b60405180910390f35b6105b060048036038101906105ab9190614d41565b611503565b6040516105bd9190614b19565b60405180910390f35b6105e060048036038101906105db9190614dc1565b61153b565b6040516105ed91906149c4565b60405180910390f35b610610600480360381019061060b9190614dee565b61156e565b60405161061d9190614909565b60405180910390f35b61062e6115eb565b60405161063b9190614909565b60405180910390f35b61064c61160f565b6040516106599190614909565b60405180910390f35b61067c60048036038101906106779190614abd565b611615565b60405161068991906149c4565b60405180910390f35b6106ac60048036038101906106a79190614dc1565b6117ab565b6040516106bb93929190614e5b565b60405180910390f35b6106de60048036038101906106d99190614dc1565b61181a565b005b6106fa60048036038101906106f59190614abd565b611956565b60405161070791906149c4565b60405180910390f35b61072a600480360381019061072591906148c3565b611b2d565b6040516107379190614909565b60405180910390f35b61075a60048036038101906107559190614dc1565b611b76565b6040516107679190614909565b60405180910390f35b61078a60048036038101906107859190614dc1565b611bd6565b6040516107979190614909565b60405180910390f35b6107a8611bf7565b6040516107b59190614909565b60405180910390f35b6107d860048036038101906107d391906148c3565b611bfd565b6040516107e591906149c4565b60405180910390f35b6107f6611d07565b6040516108039190614eae565b60405180910390f35b61082660048036038101906108219190614dc1565b611dd4565b6040516108339190614909565b60405180910390f35b61085660048036038101906108519190614dc1565b611e15565b6040516108639190614909565b60405180910390f35b61088660048036038101906108819190614dc1565b611e36565b005b6108a2600480360381019061089d91906148c3565b611efe565b6040516108af9190614909565b60405180910390f35b6108c0611f68565b6040516108cd9190614909565b60405180910390f35b6108de611f79565b6040516108eb9190614909565b60405180910390f35b61090e60048036038101906109099190614d41565b611f7f565b60405161091b9190614909565b60405180910390f35b61092c611fad565b6040516109399190614909565b60405180910390f35b61094a611fb3565b60405161095791906149c4565b60405180910390f35b61096861215a565b6040516109759190614ed8565b60405180910390f35b61099860048036038101906109939190614dc1565b612180565b6040516109a59190614909565b60405180910390f35b6109b6612267565b6040516109c39190614ed8565b60405180910390f35b6109e660048036038101906109e191906148c3565b61228d565b005b6109f0612342565b6040516109fd91906149c4565b60405180910390f35b610a0e612603565b604051610a1b9190614a6f565b60405180910390f35b610a2c612691565b604051610a399190614b19565b60405180910390f35b610a5c6004803603810190610a579190614abd565b6126b5565b604051610a6991906149c4565b60405180910390f35b610a8c6004803603810190610a879190614abd565b6128d4565b604051610a9991906149c4565b60405180910390f35b610aaa6129d5565b604051610ab79190614909565b60405180910390f35b610ac86129db565b604051610ad59190614909565b60405180910390f35b610af86004803603810190610af39190614dc1565b6129ff565b604051610b059190614909565b60405180910390f35b610b16612b86565b604051610b239190614909565b60405180910390f35b610b34612b8c565b604051610b419190614909565b60405180910390f35b610b646004803603810190610b5f9190614dc1565b612b92565b005b610b6e612c91565b604051610b7b9190614909565b60405180910390f35b610b9e6004803603810190610b9991906148c3565b612c9b565b604051610bab91906149c4565b60405180910390f35b610bce6004803603810190610bc99190614d41565b612d6f565b604051610bdb9190614909565b60405180910390f35b610bfe6004803603810190610bf99190614ef3565b612d83565b604051610c0b9190614fc9565b60405180910390f35b610c1c612e03565b604051610c29919061500f565b60405180910390f35b610c3a612e6d565b604051610c479190614909565b60405180910390f35b610c6a6004803603810190610c6591906148c3565b612e91565b604051610c7791906149c4565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615059565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610f0a565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610f0a565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610f0a565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610f0a565b6337a47be47c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610f055760019050610f0a565b600090505b919050565b60068054610f1c906150bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906150bc565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b505050505081565b6000806000610faa611d07565b905060028160ff1603610fc2576000925050506111d3565b60008160ff161115611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100090615139565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156110d257600084146110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c8906151a5565b60405180910390fd5b5b6110da612342565b506110e484611dd4565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925866040516111c49190614909565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806112136111fb85612f33565b61120e6112086001612f33565b86612f9b565b613002565b905061121e81613081565b67ffffffffffffffff168461123391906151c5565b91505092915050565b6000600b5460085461124e91906151c5565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff16111561129a57600090506112e0565b6000826020015168ffffffffffffffffff1611156112bb57600090506112e0565b6000826040015167ffffffffffffffff1611156112db57600090506112e0565b600190505b919050565b6000806000806112f3611d07565b905060028160ff160361130c57600093505050506114fc565b60008160ff161115611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90615139565b60405180910390fd5b61135b612342565b5061136585611dd4565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156113f057600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461147c91906151c5565b9250508190555061148e8787856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516114ed9190614909565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036115325761152f6001612f33565b90505b80915050919050565b6000600f821061154a57600080fd5b6000820361155f57600f601254149050611569565b8160125483161490505b919050565b60008060008061157d86612f33565b925061158885612f33565b91506115b47f000000000000000000000000000000000000000000000000000000000000000083613002565b90506115bf816130db565b90506115cb8382613002565b90506115d681613081565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b600080611620612342565b5061162a83611dd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116b89190615059565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516117989190614909565b60405180910390a3600191505092915050565b600081815481106117bb57600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b6000611824611d07565b60ff161461183157600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661188757600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111156118d357600080fd5b60006118de82611dd4565b90506118ea3382613168565b5081600b60008282546118fd9190615059565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58360405161194a9190614909565b60405180910390a25050565b6000806000611963611d07565b60ff161461197057600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611a155750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4b90615245565b60405180910390fd5b611a5c612342565b5060006011541115611a855760115483600854611a799190615059565b1115611a8457600080fd5b5b8260086000828254611a979190615059565b92505081905550611aa783611dd4565b9050611ab3848261326f565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611b119190614909565b60405180910390a3611b21613333565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611ba49190615265565b7f0000000000000000000000000000000000000000000000000000000000000000611bcf9190615059565b9050919050565b6000603c8242611be691906151c5565b611bf091906152d6565b9050919050565b60035481565b6000611c0c600160ff1661153b565b15611c1657600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c9d57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611ca657600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611d275760019050611dd1565b6000600f5403611d3a5760009050611dd1565b600f544210611dcc57611d67603c600354611d5591906152d6565b600f54611d6291906151c5565b6129ff565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611db29190614909565b60405180910390a1611dc2612342565b5060029050611dd1565b600090505b90565b600080611df8611de384612f33565b600260009054906101000a9004600f0b6134f7565b9050611e0381613081565b67ffffffffffffffff16915050919050565b6000603c8242611e2591906151c5565b611e2f91906152d6565b9050919050565b611e43600860ff1661153b565b15611e4d57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ea757600080fd5b611eaf61123c565b8111611eba57600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611eec9190614909565b60405180910390a28060118190555050565b6000806000806000611f17611f1287611b2d565b612f33565b9350611f24600354611bd6565b9150611f3f84600260009054906101000a9004600f0b613002565b9250611f5d611f4d84613081565b67ffffffffffffffff168361156e565b945050505050919050565b6000611f7460006129ff565b905090565b600b5481565b6000806000611f8d84611264565b9150611f9884611503565b9050611fa482826111ec565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461201057600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601082106121c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bc90615353565b60405180910390fd5b600060125483161461220c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612203906153bf565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e6012546040516122559190614909565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61229a600260ff1661153b565b156122a457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122fe57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061234c61481a565b61235461481a565b61235c61481a565b600080600080600061236c611f68565b50612375613583565b97506123808861127d565b1561239657600098505050505050505050612600565b6000600954815481106123ac576123ab6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061245988612d6f565b94506001856124689190615059565b905061247386611503565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124a39190615265565b6124ad91906152d6565b91506124e96124e47f00000000000000000000000000000000000000000000000000000000000000006124df85612f33565b613002565b6130db565b92506124ff6000846124f961123c565b84612d83565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050506125bb87613719565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d675816040516125eb9190614909565b60405180910390a16001985050505050505050505b90565b60078054612610906150bc565b80601f016020809104026020016040519081016040528092919081815260200182805461263c906150bc565b80156126895780601f1061265e57610100808354040283529160200191612689565b820191906000526020600020905b81548152906001019060200180831161266c57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806126c183611dd4565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561274c57600080fd5b612754612342565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127e191906151c5565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040516128c19190614909565b60405180910390a3600191505092915050565b6000806000806128e2611d07565b905060028160ff16036128fb57600093505050506129cf565b60008160ff161115612942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161293990615139565b60405180910390fd5b61294a612342565b5061295485611dd4565b92506129613387856130b6565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040516129c09190614909565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff1615612a29576000945050505050612b81565b612a34600354611bd6565b925060008303612a4b576000945050505050612b81565b600260009054906101000a9004600f0b9050600086118015612a6c57508286105b15612a75578592505b612a7e83612f33565b9150612aaa7f000000000000000000000000000000000000000000000000000000000000000083613002565b9350612ab5846130db565b9350612ad0600260009054906101000a9004600f0b85613002565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612b189190615265565b600354612b259190615059565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b719190614b19565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612ba1600460ff1661153b565b15612bab57600080fd5b601060009054906101000a900460ff1615612bc557600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c1f57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612c4b9190615265565b7f0000000000000000000000000000000000000000000000000000000000000000612c769190615059565b9050600f548111612c8657600080fd5b80600f819055505050565b6000600b54905090565b6000612caa600160ff1661153b565b15612cb457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d0e57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d8b61481a565b612d9361481a565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e5491906151c5565b612e5e91906152d6565b612e689190615059565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612eed57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612f4a57600080fd5b6040829060020a029050919050565b60008082600f0b13612f6a57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f8684613838565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fef57506f7fffffffffffffffffffffffffffffff600f0b8113155b612ff857600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561306e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61307757600080fd5b8091505092915050565b60008082600f0b121561309357600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130c38584613168565b506130ce848461326f565b5060019150509392505050565b60006840000000000000000082600f0b126130f557600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156131295760009050613163565b6131606080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139fe565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131c45760009350505050613269565b6131cd86611b2d565b925084831015613212576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132099061545a565b60405180910390fd5b848361321e91906151c5565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036132cb576000935050505061332d565b6132d486611b2d565b925084836132e29190615059565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600061333d61481a565b600061334761123c565b90506000600160008054905061335d91906151c5565b8154811061336e5761336d6153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff1681525050816000600160008054905061344991906151c5565b8154811061345a576134596153df565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b0361350857600080fd5b600082600f0b604085600f0b9060020a0281613527576135266152a7565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561357057506f7fffffffffffffffffffffffffffffff600f0b8113155b61357957600080fd5b8091505092915050565b61358b61481a565b61359361481a565b61359b61481a565b600080600954815481106135b2576135b16153df565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa1580156136bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136e191906154a6565b6fffffffffffffffffffffffffffffffff1690506136fe83612d6f565b811161370f57819350505050613716565b8293505050505b90565b600080600061372784611f7f565b61372f61123c565b61373991906151c5565b9150600a5461374783611dd4565b61375191906151c5565b905061377f600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261326f565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137f39190614909565b60405180910390a360016009600082825461380e9190615059565b9250508190555080600a60008282546138279190615059565b925050819055508192505050919050565b60008082600f0b1361384957600080fd5b60008083600f0b9050680100000000000000008112613884576040819060008212600003808260020a82851804189250505090506040820191505b64010000000081126138b2576020819060008212600003808260020a82851804189250505090506020820191505b6201000081126138de576010819060008212600003808260020a82851804189250505090506010820191505b6101008112613909576008819060008212600003808260020a82851804189250505090506008820191505b60108112613933576004819060008212600003808260020a82851804189250505090506004820191505b6004811261395d576002819060008212600003808260020a82851804189250505090506002820191505b6002811261396c576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156139f1578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613999565b5081945050505050919050565b60006840000000000000000082600f0b12613a1857600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b1215613a4c5760009050614815565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a9a57608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613ad35760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613b0c5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613b4557608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b7e5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613bb7576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613bf057608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613c29576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c6157608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c995760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613cd1576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613d095760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613d41576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d7957608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613db15760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613de957608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613e205760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e57576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e8e57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613ec5576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613efc57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613f335760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f6a576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613fa15760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613fd7576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b131561400d57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b13156140435760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561407957608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b13156140af5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b13156140e5576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b131561411b57608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b1315614151576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561418657608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141bb5760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b13156141f0576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156142255760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b131561425a576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561428f57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142c45760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142f957608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b131561432d5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b1315614361576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561439557608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b13156143c9576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143fd57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156144315760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614465576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144995760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b13156144cc576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ff57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156145325760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561456557608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145985760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b13156145cb576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145fe57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b1315614631576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561466357608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146955760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b13156146c7576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146f95760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b131561472b576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561475d57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561478f5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b13156147c157608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b81111561481057600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061489082614865565b9050919050565b6148a081614885565b81146148ab57600080fd5b50565b6000813590506148bd81614897565b92915050565b6000602082840312156148d9576148d8614860565b5b60006148e7848285016148ae565b91505092915050565b6000819050919050565b614903816148f0565b82525050565b600060208201905061491e60008301846148fa565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61495981614924565b811461496457600080fd5b50565b60008135905061497681614950565b92915050565b60006020828403121561499257614991614860565b5b60006149a084828501614967565b91505092915050565b60008115159050919050565b6149be816149a9565b82525050565b60006020820190506149d960008301846149b5565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614a195780820151818401526020810190506149fe565b60008484015250505050565b6000601f19601f8301169050919050565b6000614a41826149df565b614a4b81856149ea565b9350614a5b8185602086016149fb565b614a6481614a25565b840191505092915050565b60006020820190508181036000830152614a898184614a36565b905092915050565b614a9a816148f0565b8114614aa557600080fd5b50565b600081359050614ab781614a91565b92915050565b60008060408385031215614ad457614ad3614860565b5b6000614ae2858286016148ae565b9250506020614af385828601614aa8565b9150509250929050565b600081600f0b9050919050565b614b1381614afd565b82525050565b6000602082019050614b2e6000830184614b0a565b92915050565b614b3d81614afd565b8114614b4857600080fd5b50565b600081359050614b5a81614b34565b92915050565b60008060408385031215614b7757614b76614860565b5b6000614b8585828601614aa8565b9250506020614b9685828601614b4b565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614bdd82614a25565b810181811067ffffffffffffffff82111715614bfc57614bfb614ba5565b5b80604052505050565b6000614c0f614856565b9050614c1b8282614bd4565b919050565b600063ffffffff82169050919050565b614c3981614c20565b8114614c4457600080fd5b50565b600081359050614c5681614c30565b92915050565b600068ffffffffffffffffff82169050919050565b614c7a81614c5c565b8114614c8557600080fd5b50565b600081359050614c9781614c71565b92915050565b600067ffffffffffffffff82169050919050565b614cba81614c9d565b8114614cc557600080fd5b50565b600081359050614cd781614cb1565b92915050565b600060608284031215614cf357614cf2614ba0565b5b614cfd6060614c05565b90506000614d0d84828501614c47565b6000830152506020614d2184828501614c88565b6020830152506040614d3584828501614cc8565b60408301525092915050565b600060608284031215614d5757614d56614860565b5b6000614d6584828501614cdd565b91505092915050565b600080600060608486031215614d8757614d86614860565b5b6000614d95868287016148ae565b9350506020614da6868287016148ae565b9250506040614db786828701614aa8565b9150509250925092565b600060208284031215614dd757614dd6614860565b5b6000614de584828501614aa8565b91505092915050565b60008060408385031215614e0557614e04614860565b5b6000614e1385828601614aa8565b9250506020614e2485828601614aa8565b9150509250929050565b614e3781614c20565b82525050565b614e4681614c5c565b82525050565b614e5581614c9d565b82525050565b6000606082019050614e706000830186614e2e565b614e7d6020830185614e3d565b614e8a6040830184614e4c565b949350505050565b600060ff82169050919050565b614ea881614e92565b82525050565b6000602082019050614ec36000830184614e9f565b92915050565b614ed281614885565b82525050565b6000602082019050614eed6000830184614ec9565b92915050565b60008060008060808587031215614f0d57614f0c614860565b5b6000614f1b87828801614aa8565b9450506020614f2c87828801614b4b565b9350506040614f3d87828801614aa8565b9250506060614f4e87828801614aa8565b91505092959194509250565b614f6381614c20565b82525050565b614f7281614c5c565b82525050565b614f8181614c9d565b82525050565b606082016000820151614f9d6000850182614f5a565b506020820151614fb06020850182614f69565b506040820151614fc36040850182614f78565b50505050565b6000606082019050614fde6000830184614f87565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b61500981614fe4565b82525050565b60006020820190506150246000830184615000565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000615064826148f0565b915061506f836148f0565b92508282019050808211156150875761508661502a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806150d457607f821691505b6020821081036150e7576150e661508d565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006151236007836149ea565b915061512e826150ed565b602082019050919050565b6000602082019050818103600083015261515281615116565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061518f600a836149ea565b915061519a82615159565b602082019050919050565b600060208201905081810360008301526151be81615182565b9050919050565b60006151d0826148f0565b91506151db836148f0565b92508282039050818111156151f3576151f261502a565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b600061522f600a836149ea565b915061523a826151f9565b602082019050919050565b6000602082019050818103600083015261525e81615222565b9050919050565b6000615270826148f0565b915061527b836148f0565b9250828202615289816148f0565b915082820484148315176152a05761529f61502a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006152e1826148f0565b91506152ec836148f0565b9250826152fc576152fb6152a7565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b600061533d6011836149ea565b915061534882615307565b602082019050919050565b6000602082019050818103600083015261536c81615330565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b60006153a96012836149ea565b91506153b482615373565b602082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b6000615444600d836149ea565b915061544f8261540e565b602082019050919050565b6000602082019050818103600083015261547381615437565b9050919050565b61548381614fe4565b811461548e57600080fd5b50565b6000815190506154a08161547a565b92915050565b6000602082840312156154bc576154bb614860565b5b60006154ca84828501615491565b9150509291505056fea2646970667358221220dd12d17c82bae51dab9df921745b40561cc71eacb629c0c8481b25a5153bddc264736f6c63430008110033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200621c3803806200621c833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002ee1176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f07176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516154b762000d656000396000818161153d01528181612465015281816126410152612a33015260008181611b28015281816124280152818161298b01528181612bcf0152612db7015260008181611b5401528181612bfb01528181612dd80152612e1d0152600061159b01526154b76000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636f8b44b0116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806384dde4af116101995780638f0b2d5d116101735780638f0b2d5d146109cc5780638f1df6bc146109e857806395d89b4114610a065780639f24880814610a24576103ab565b806384dde4af1461096057806386fe212d1461097e5780638da5cb5b146109ae576103ab565b806373f42561116101d557806373f42561146108d65780637445e33a146108f457806374bedb951461092457806379ba509714610942576103ab565b80636f8b44b01461086c57806370a0823114610888578063731f237c146108b8576103ab565b806331333487116102e057806347a505171161027e5780635ae06f7e1161024d5780635ae06f7e146107be5780635f408c04146107ee5780636787a9be1461080c5780636a2d094e1461083c576103ab565b806347a50517146107105780634abfbba21461074057806351b4541c1461077057806358b2833b146107a0576103ab565b806339509351116102ba578063395093511461066257806340452d911461069257806342966c68146106c4578063449a52f8146106e0576103ab565b806331333487146105f6578063313ce5671461062657806331a5995d14610644576103ab565b806318cbbcfc1161034d57806323a859441161032757806323a859441461053657806323b872dd146105665780632a7aec09146105965780632c1758c1146105c6576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c59190614871565b610c80565b6040516103d791906148b7565b60405180910390f35b6103fa60048036038101906103f5919061492a565b610d69565b6040516104079190614972565b60405180910390f35b610418610ebd565b6040516104259190614a1d565b60405180910390f35b61044860048036038101906104439190614a6b565b610f4b565b6040516104559190614972565b60405180910390f35b610466611187565b6040516104739190614ac7565b60405180910390f35b61049660048036038101906104919190614b0e565b61119a565b6040516104a391906148b7565b60405180910390f35b6104b46111ea565b6040516104c191906148b7565b60405180910390f35b6104d2611201565b6040516104df91906148b7565b60405180910390f35b6104f0611206565b6040516104fd91906148b7565b60405180910390f35b610520600480360381019061051b9190614cef565b611212565b60405161052d91906148b7565b60405180910390f35b610550600480360381019061054b9190614cef565b61122b565b60405161055d9190614972565b60405180910390f35b610580600480360381019061057b9190614d1c565b611293565b60405161058d9190614972565b60405180910390f35b6105b060048036038101906105ab9190614cef565b6114b1565b6040516105bd9190614ac7565b60405180910390f35b6105e060048036038101906105db9190614d6f565b6114e9565b6040516105ed9190614972565b60405180910390f35b610610600480360381019061060b9190614d9c565b61151c565b60405161061d91906148b7565b60405180910390f35b61062e611599565b60405161063b91906148b7565b60405180910390f35b61064c6115bd565b60405161065991906148b7565b60405180910390f35b61067c60048036038101906106779190614a6b565b6115c3565b6040516106899190614972565b60405180910390f35b6106ac60048036038101906106a79190614d6f565b611759565b6040516106bb93929190614e09565b60405180910390f35b6106de60048036038101906106d99190614d6f565b6117c8565b005b6106fa60048036038101906106f59190614a6b565b611904565b6040516107079190614972565b60405180910390f35b61072a60048036038101906107259190614871565b611adb565b60405161073791906148b7565b60405180910390f35b61075a60048036038101906107559190614d6f565b611b24565b60405161076791906148b7565b60405180910390f35b61078a60048036038101906107859190614d6f565b611b84565b60405161079791906148b7565b60405180910390f35b6107a8611ba5565b6040516107b591906148b7565b60405180910390f35b6107d860048036038101906107d39190614871565b611bab565b6040516107e59190614972565b60405180910390f35b6107f6611cb5565b6040516108039190614e5c565b60405180910390f35b61082660048036038101906108219190614d6f565b611d82565b60405161083391906148b7565b60405180910390f35b61085660048036038101906108519190614d6f565b611dc3565b60405161086391906148b7565b60405180910390f35b61088660048036038101906108819190614d6f565b611de4565b005b6108a2600480360381019061089d9190614871565b611eac565b6040516108af91906148b7565b60405180910390f35b6108c0611f16565b6040516108cd91906148b7565b60405180910390f35b6108de611f27565b6040516108eb91906148b7565b60405180910390f35b61090e60048036038101906109099190614cef565b611f2d565b60405161091b91906148b7565b60405180910390f35b61092c611f5b565b60405161093991906148b7565b60405180910390f35b61094a611f61565b6040516109579190614972565b60405180910390f35b610968612108565b6040516109759190614e86565b60405180910390f35b61099860048036038101906109939190614d6f565b61212e565b6040516109a591906148b7565b60405180910390f35b6109b6612215565b6040516109c39190614e86565b60405180910390f35b6109e660048036038101906109e19190614871565b61223b565b005b6109f06122f0565b6040516109fd9190614972565b60405180910390f35b610a0e6125b1565b604051610a1b9190614a1d565b60405180910390f35b610a2c61263f565b604051610a399190614ac7565b60405180910390f35b610a5c6004803603810190610a579190614a6b565b612663565b604051610a699190614972565b60405180910390f35b610a8c6004803603810190610a879190614a6b565b612882565b604051610a999190614972565b60405180910390f35b610aaa612983565b604051610ab791906148b7565b60405180910390f35b610ac8612989565b604051610ad591906148b7565b60405180910390f35b610af86004803603810190610af39190614d6f565b6129ad565b604051610b0591906148b7565b60405180910390f35b610b16612b34565b604051610b2391906148b7565b60405180910390f35b610b34612b3a565b604051610b4191906148b7565b60405180910390f35b610b646004803603810190610b5f9190614d6f565b612b40565b005b610b6e612c3f565b604051610b7b91906148b7565b60405180910390f35b610b9e6004803603810190610b999190614871565b612c49565b604051610bab9190614972565b60405180910390f35b610bce6004803603810190610bc99190614cef565b612d1d565b604051610bdb91906148b7565b60405180910390f35b610bfe6004803603810190610bf99190614ea1565b612d31565b604051610c0b9190614f77565b60405180910390f35b610c1c612db1565b604051610c299190614fbd565b60405180910390f35b610c3a612e1b565b604051610c4791906148b7565b60405180910390f35b610c6a6004803603810190610c659190614871565b612e3f565b604051610c779190614972565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615007565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610eb8565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610eb8565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610eb8565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610eb8565b600090505b919050565b60068054610eca9061506a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef69061506a565b8015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b505050505081565b6000806000610f58611cb5565b905060028160ff1603610f7057600092505050611181565b60008160ff161115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae906150e7565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611080576000841461107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690615153565b60405180910390fd5b5b6110886122f0565b5061109284611d82565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161117291906148b7565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806111c16111a985612ee1565b6111bc6111b66001612ee1565b86612f49565b612fb0565b90506111cc8161302f565b67ffffffffffffffff16846111e19190615173565b91505092915050565b6000600b546008546111fc9190615173565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff161115611248576000905061128e565b6000826020015168ffffffffffffffffff161115611269576000905061128e565b6000826040015167ffffffffffffffff161115611289576000905061128e565b600190505b919050565b6000806000806112a1611cb5565b905060028160ff16036112ba57600093505050506114aa565b60008160ff161115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f8906150e7565b60405180910390fd5b6113096122f0565b5061131385611d82565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561139e57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142a9190615173565b9250508190555061143c878785613064565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161149b91906148b7565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114e0576114dd6001612ee1565b90505b80915050919050565b6000600f82106114f857600080fd5b6000820361150d57600f601254149050611517565b8160125483161490505b919050565b60008060008061152b86612ee1565b925061153685612ee1565b91506115627f000000000000000000000000000000000000000000000000000000000000000083612fb0565b905061156d81613089565b90506115798382612fb0565b90506115848161302f565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115ce6122f0565b506115d883611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116669190615007565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161174691906148b7565b60405180910390a3600191505092915050565b6000818154811061176957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117d2611cb5565b60ff16146117df57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661183557600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561188157600080fd5b600061188c82611d82565b90506118983382613116565b5081600b60008282546118ab9190615007565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118f891906148b7565b60405180910390a25050565b6000806000611911611cb5565b60ff161461191e57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119c35750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f9906151f3565b60405180910390fd5b611a0a6122f0565b5060006011541115611a335760115483600854611a279190615007565b1115611a3257600080fd5b5b8260086000828254611a459190615007565b92505081905550611a5583611d82565b9050611a61848261321d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611abf91906148b7565b60405180910390a3611acf6132e1565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b529190615213565b7f0000000000000000000000000000000000000000000000000000000000000000611b7d9190615007565b9050919050565b6000603c8242611b949190615173565b611b9e9190615284565b9050919050565b60035481565b6000611bba600160ff166114e9565b15611bc457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c4b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611c5457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611cd55760019050611d7f565b6000600f5403611ce85760009050611d7f565b600f544210611d7a57611d15603c600354611d039190615284565b600f54611d109190615173565b6129ad565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611d6091906148b7565b60405180910390a1611d706122f0565b5060029050611d7f565b600090505b90565b600080611da6611d9184612ee1565b600260009054906101000a9004600f0b6134a5565b9050611db18161302f565b67ffffffffffffffff16915050919050565b6000603c8242611dd39190615173565b611ddd9190615284565b9050919050565b611df1600860ff166114e9565b15611dfb57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5557600080fd5b611e5d6111ea565b8111611e6857600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611e9a91906148b7565b60405180910390a28060118190555050565b6000806000806000611ec5611ec087611adb565b612ee1565b9350611ed2600354611b84565b9150611eed84600260009054906101000a9004600f0b612fb0565b9250611f0b611efb8461302f565b67ffffffffffffffff168361151c565b945050505050919050565b6000611f2260006129ad565b905090565b600b5481565b6000806000611f3b84611212565b9150611f46846114b1565b9050611f52828261119a565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fbe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90615301565b60405180910390fd5b60006012548316146121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b19061536d565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e60125460405161220391906148b7565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612248600260ff166114e9565b1561225257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ac57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122fa6147c8565b6123026147c8565b61230a6147c8565b600080600080600061231a611f16565b50612323613531565b975061232e8861122b565b15612344576000985050505050505050506125ae565b60006009548154811061235a5761235961538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061240788612d1d565b94506001856124169190615007565b9050612421866114b1565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124519190615213565b61245b9190615284565b91506124976124927f000000000000000000000000000000000000000000000000000000000000000061248d85612ee1565b612fb0565b613089565b92506124ad6000846124a76111ea565b84612d31565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050612569876136c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161259991906148b7565b60405180910390a16001985050505050505050505b90565b600780546125be9061506a565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea9061506a565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061266f83611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156126fa57600080fd5b6127026122f0565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461278f9190615173565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161286f91906148b7565b60405180910390a3600191505092915050565b600080600080612890611cb5565b905060028160ff16036128a9576000935050505061297d565b60008160ff1611156128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e7906150e7565b60405180910390fd5b6128f86122f0565b5061290285611d82565b925061290f338785613064565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161296e91906148b7565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156129d7576000945050505050612b2f565b6129e2600354611b84565b9250600083036129f9576000945050505050612b2f565b600260009054906101000a9004600f0b9050600086118015612a1a57508286105b15612a23578592505b612a2c83612ee1565b9150612a587f000000000000000000000000000000000000000000000000000000000000000083612fb0565b9350612a6384613089565b9350612a7e600260009054906101000a9004600f0b85612fb0565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612ac69190615213565b600354612ad39190615007565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b1f9190614ac7565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612b4f600460ff166114e9565b15612b5957600080fd5b601060009054906101000a900460ff1615612b7357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bcd57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612bf99190615213565b7f0000000000000000000000000000000000000000000000000000000000000000612c249190615007565b9050600f548111612c3457600080fd5b80600f819055505050565b6000600b54905090565b6000612c58600160ff166114e9565b15612c6257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbc57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d396147c8565b612d416147c8565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e029190615173565b612e0c9190615284565b612e169190615007565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612ef857600080fd5b6040829060020a029050919050565b60008082600f0b13612f1857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f34846137e6565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f9d57506f7fffffffffffffffffffffffffffffff600f0b8113155b612fa657600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561301c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61302557600080fd5b8091505092915050565b60008082600f0b121561304157600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130718584613116565b5061307c848461321d565b5060019150509392505050565b60006840000000000000000082600f0b126130a357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130d75760009050613111565b61310e6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139ac565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131725760009350505050613217565b61317b86611adb565b9250848310156131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790615408565b60405180910390fd5b84836131cc9190615173565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361327957600093505050506132db565b61328286611adb565b925084836132909190615007565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132eb6147c8565b60006132f56111ea565b90506000600160008054905061330b9190615173565b8154811061331c5761331b61538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506133f79190615173565b815481106134085761340761538d565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036134b657600080fd5b600082600f0b604085600f0b9060020a02816134d5576134d4615255565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561351e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61352757600080fd5b8091505092915050565b6135396147c8565b6135416147c8565b6135496147c8565b600080600954815481106135605761355f61538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561366b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368f9190615454565b6fffffffffffffffffffffffffffffffff1690506136ac83612d1d565b81116136bd578193505050506136c4565b8293505050505b90565b60008060006136d584611f2d565b6136dd6111ea565b6136e79190615173565b9150600a546136f583611d82565b6136ff9190615173565b905061372d600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261321d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137a191906148b7565b60405180910390a36001600960008282546137bc9190615007565b9250508190555080600a60008282546137d59190615007565b925050819055508192505050919050565b60008082600f0b136137f757600080fd5b60008083600f0b9050680100000000000000008112613832576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613860576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261388c576010819060008212600003808260020a82851804189250505090506010820191505b61010081126138b7576008819060008212600003808260020a82851804189250505090506008820191505b601081126138e1576004819060008212600003808260020a82851804189250505090506004820191505b6004811261390b576002819060008212600003808260020a82851804189250505090506002820191505b6002811261391a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561399f578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613947565b5081945050505050919050565b60006840000000000000000082600f0b126139c657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156139fa57600090506147c3565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a4857608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613a815760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613aba5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613af357608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b2c5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613b65576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613b9e57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613bd7576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c0f57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c475760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613c7f576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613cb75760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613cef576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d2757608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613d5f5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613d9757608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613dce5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e05576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e3c57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613e73576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613eaa57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613ee15760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f18576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613f4f5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613f85576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613fbb57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ff15760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561402757608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b131561405d5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614093576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156140c957608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156140ff576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561413457608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141695760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561419e576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141d35760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614208576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561423d57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142725760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142a757608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142db5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561430f576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561434357608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614377576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143ab57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156143df5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614413576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144475760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561447a576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ad57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156144e05760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561451357608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145465760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614579576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145ac57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156145df576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561461157608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146435760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614675576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146a75760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156146d9576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561470b57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561473d5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561476f57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156147be57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061483e82614813565b9050919050565b61484e81614833565b811461485957600080fd5b50565b60008135905061486b81614845565b92915050565b6000602082840312156148875761488661480e565b5b60006148958482850161485c565b91505092915050565b6000819050919050565b6148b18161489e565b82525050565b60006020820190506148cc60008301846148a8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614907816148d2565b811461491257600080fd5b50565b600081359050614924816148fe565b92915050565b6000602082840312156149405761493f61480e565b5b600061494e84828501614915565b91505092915050565b60008115159050919050565b61496c81614957565b82525050565b60006020820190506149876000830184614963565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149c75780820151818401526020810190506149ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006149ef8261498d565b6149f98185614998565b9350614a098185602086016149a9565b614a12816149d3565b840191505092915050565b60006020820190508181036000830152614a3781846149e4565b905092915050565b614a488161489e565b8114614a5357600080fd5b50565b600081359050614a6581614a3f565b92915050565b60008060408385031215614a8257614a8161480e565b5b6000614a908582860161485c565b9250506020614aa185828601614a56565b9150509250929050565b600081600f0b9050919050565b614ac181614aab565b82525050565b6000602082019050614adc6000830184614ab8565b92915050565b614aeb81614aab565b8114614af657600080fd5b50565b600081359050614b0881614ae2565b92915050565b60008060408385031215614b2557614b2461480e565b5b6000614b3385828601614a56565b9250506020614b4485828601614af9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614b8b826149d3565b810181811067ffffffffffffffff82111715614baa57614ba9614b53565b5b80604052505050565b6000614bbd614804565b9050614bc98282614b82565b919050565b600063ffffffff82169050919050565b614be781614bce565b8114614bf257600080fd5b50565b600081359050614c0481614bde565b92915050565b600068ffffffffffffffffff82169050919050565b614c2881614c0a565b8114614c3357600080fd5b50565b600081359050614c4581614c1f565b92915050565b600067ffffffffffffffff82169050919050565b614c6881614c4b565b8114614c7357600080fd5b50565b600081359050614c8581614c5f565b92915050565b600060608284031215614ca157614ca0614b4e565b5b614cab6060614bb3565b90506000614cbb84828501614bf5565b6000830152506020614ccf84828501614c36565b6020830152506040614ce384828501614c76565b60408301525092915050565b600060608284031215614d0557614d0461480e565b5b6000614d1384828501614c8b565b91505092915050565b600080600060608486031215614d3557614d3461480e565b5b6000614d438682870161485c565b9350506020614d548682870161485c565b9250506040614d6586828701614a56565b9150509250925092565b600060208284031215614d8557614d8461480e565b5b6000614d9384828501614a56565b91505092915050565b60008060408385031215614db357614db261480e565b5b6000614dc185828601614a56565b9250506020614dd285828601614a56565b9150509250929050565b614de581614bce565b82525050565b614df481614c0a565b82525050565b614e0381614c4b565b82525050565b6000606082019050614e1e6000830186614ddc565b614e2b6020830185614deb565b614e386040830184614dfa565b949350505050565b600060ff82169050919050565b614e5681614e40565b82525050565b6000602082019050614e716000830184614e4d565b92915050565b614e8081614833565b82525050565b6000602082019050614e9b6000830184614e77565b92915050565b60008060008060808587031215614ebb57614eba61480e565b5b6000614ec987828801614a56565b9450506020614eda87828801614af9565b9350506040614eeb87828801614a56565b9250506060614efc87828801614a56565b91505092959194509250565b614f1181614bce565b82525050565b614f2081614c0a565b82525050565b614f2f81614c4b565b82525050565b606082016000820151614f4b6000850182614f08565b506020820151614f5e6020850182614f17565b506040820151614f716040850182614f26565b50505050565b6000606082019050614f8c6000830184614f35565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614fb781614f92565b82525050565b6000602082019050614fd26000830184614fae565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150128261489e565b915061501d8361489e565b925082820190508082111561503557615034614fd8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061508257607f821691505b6020821081036150955761509461503b565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006150d1600783614998565b91506150dc8261509b565b602082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061513d600a83614998565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b600061517e8261489e565b91506151898361489e565b92508282039050818111156151a1576151a0614fd8565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006151dd600a83614998565b91506151e8826151a7565b602082019050919050565b6000602082019050818103600083015261520c816151d0565b9050919050565b600061521e8261489e565b91506152298361489e565b92508282026152378161489e565b9150828204841483151761524e5761524d614fd8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061528f8261489e565b915061529a8361489e565b9250826152aa576152a9615255565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006152eb601183614998565b91506152f6826152b5565b602082019050919050565b6000602082019050818103600083015261531a816152de565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615357601283614998565b915061536282615321565b602082019050919050565b600060208201905081810360008301526153868161534a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006153f2600d83614998565b91506153fd826153bc565b602082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b61543181614f92565b811461543c57600080fd5b50565b60008151905061544e81615428565b92915050565b60006020828403121561546a5761546961480e565b5b60006154788482850161543f565b9150509291505056fea2646970667358221220b6ab446997d21e5b6e84b6c705c209cf53b5182ff5f6fe4b79f80236d00e874d64736f6c63430008120033 \ No newline at end of file From 74c0bfe43ef9334bd1f0be39c4180da2c4f82242 Mon Sep 17 00:00:00 2001 From: lash Date: Tue, 7 Mar 2023 10:23:39 +0000 Subject: [PATCH 54/57] Add solc metadata --- .../data/DemurrageTokenSingleNocap.metadata.json | 1 + solidity/Makefile | 1 + 2 files changed, 2 insertions(+) create mode 100644 python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json new file mode 100644 index 0000000..316f3dc --- /dev/null +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json @@ -0,0 +1 @@ +{"compiler":{"version":"0.8.18+commit.87f61d96"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"balanceOf(address)":{"notice":"Implements ERC20"}},"version":1}},"settings":{"compilationTarget":{"DemurrageTokenSingleNocap.sol":"DemurrageTokenSingleNocap"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DemurrageTokenSingleNocap.sol":{"keccak256":"0x83ef1889d24655a3d2f9d8f40460e14288d73a0c4db7c131a4f38ef7ad822dac","license":"GPL-3.0-or-later","urls":["bzz-raw://508ab875d3eec6e1360e84f24a64413b7c1743482e903a6e8b93de33f2be8745","dweb:/ipfs/QmTWQ2GPWYKZTGEan1Xd9DbCjETrknPvxBR7be2uWGjmmV"]},"aux/ABDKMath64x64.sol":{"keccak256":"0x089b21db72314836305ba36b1773c3f0c2d5ac3a0f418820557c17c0e57c3c50","license":"BSD-4-Clause","urls":["bzz-raw://730ce8d750b0a6588f0d0724ace1c4d6dd90cf6dc0d2805b775b065fce147dfa","dweb:/ipfs/Qmdx7xRKvhXu1JtAVs25bER3LN2oGj2ZjW8jEvJpzQyXhc"]}},"version":1} diff --git a/solidity/Makefile b/solidity/Makefile index 74d8566..fcec1f3 100644 --- a/solidity/Makefile +++ b/solidity/Makefile @@ -5,6 +5,7 @@ all: single_nocap single_nocap: $(SOLC) DemurrageTokenSingleNocap.sol --abi --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.json $(SOLC) DemurrageTokenSingleNocap.sol --bin --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.bin + $(SOLC) DemurrageTokenSingleNocap.sol --metadata --evm-version byzantium | awk 'NR==4' > DemurrageTokenSingleNocap.metadata.json truncate -s -1 DemurrageTokenSingleNocap.bin single: single_nocap From 50405b5cf6c9dbea206c2c4b2c7b76621be9e9d1 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 8 Mar 2023 07:55:52 +0000 Subject: [PATCH 55/57] Add expiration, supply cap, mutability to readme --- README.md | 28 ++++++++++++++++++++++++++ solidity/DemurrageTokenSingleNocap.sol | 6 +++--- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f98329b..2bfaee7 100644 --- a/README.md +++ b/README.md @@ -85,6 +85,34 @@ Token parameters are truncated when calculating demurrage and redistribution: * Demurrage modifier: 64 bits +## Expiration + +A token may set to expire at a certain point in time. After the expiry, no more transfers may be executed. From that point on, balances are frozen and demurrage is halted. + +Expiration may be set in terms of redistribution periods. + +Unless sealed (see below), expiration may be changed at any time to any future redistribution period. However, once expired, expiration may not be changed further. + + +## Supply + +Unless sealed (see below), Supply limit may be set and change at any time. Supply may never be directly set to less than the current supply. However, contract _writers_ may burn tokens in their possession using the `burn()` method, which will effectively reduce the supply. + + +## Mutability + +The following parameters may not be changed after contract is published: + +* Demurrage level +* Redistribution period + +The contract provides a sealing feature which prohibits further changes to parameters that can initially be edited. These include: + +* Adding and removing writers (addresses that may mint tokens) +* Sink addres +* Expiry period +* Supply limit + ## Gas usage diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 975eaad..9b3edbd 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -121,7 +121,7 @@ contract DemurrageTokenSingleNocap { // Implements Sealer uint256 public sealState; - uint8 constant MINTER_STATE = 1; + uint8 constant WRITER_STATE = 1; uint8 constant SINK_STATE = 2; uint8 constant EXPIRY_STATE = 4; uint8 constant CAP_STATE = 8; @@ -223,7 +223,7 @@ contract DemurrageTokenSingleNocap { // Given address will be allowed to call the mintTo() function function addWriter(address _minter) public returns (bool) { - require(!isSealed(MINTER_STATE)); + require(!isSealed(WRITER_STATE)); require(msg.sender == owner); minter[_minter] = true; return true; @@ -231,7 +231,7 @@ contract DemurrageTokenSingleNocap { // Given address will no longer be allowed to call the mintTo() function function deleteWriter(address _minter) public returns (bool) { - require(!isSealed(MINTER_STATE)); + require(!isSealed(WRITER_STATE)); require(msg.sender == owner || _minter == msg.sender); minter[_minter] = false; return true; From 1d93ece13e04b5a040dc087a9d5220151ea144bb Mon Sep 17 00:00:00 2001 From: lash Date: Sun, 19 Mar 2023 09:23:51 +0000 Subject: [PATCH 56/57] Eliminate solidity compiler warnings --- python/CHANGELOG | 2 ++ .../data/DemurrageTokenSingleNocap.bin | 2 +- .../data/DemurrageTokenSingleNocap.json | 2 +- .../data/DemurrageTokenSingleNocap.metadata.json | 2 +- python/setup.cfg | 2 +- solidity/DemurrageTokenSingleNocap.sol | 12 +++++------- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 659fbbd..2574ac9 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,5 @@ +- 0.4.1 + * Eliminate solidity compiler warnings - 0.4.0 * Rename taxLevel to decayLevel in contract * Add sweep contract method to fully empty one account into another diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin index 507ff39..86e6df4 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.bin @@ -1 +1 @@ -6101006040523480156200001257600080fd5b506040516200621c3803806200621c833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002ee1176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f07176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516154b762000d656000396000818161153d01528181612465015281816126410152612a33015260008181611b28015281816124280152818161298b01528181612bcf0152612db7015260008181611b5401528181612bfb01528181612dd80152612e1d0152600061159b01526154b76000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636f8b44b0116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806384dde4af116101995780638f0b2d5d116101735780638f0b2d5d146109cc5780638f1df6bc146109e857806395d89b4114610a065780639f24880814610a24576103ab565b806384dde4af1461096057806386fe212d1461097e5780638da5cb5b146109ae576103ab565b806373f42561116101d557806373f42561146108d65780637445e33a146108f457806374bedb951461092457806379ba509714610942576103ab565b80636f8b44b01461086c57806370a0823114610888578063731f237c146108b8576103ab565b806331333487116102e057806347a505171161027e5780635ae06f7e1161024d5780635ae06f7e146107be5780635f408c04146107ee5780636787a9be1461080c5780636a2d094e1461083c576103ab565b806347a50517146107105780634abfbba21461074057806351b4541c1461077057806358b2833b146107a0576103ab565b806339509351116102ba578063395093511461066257806340452d911461069257806342966c68146106c4578063449a52f8146106e0576103ab565b806331333487146105f6578063313ce5671461062657806331a5995d14610644576103ab565b806318cbbcfc1161034d57806323a859441161032757806323a859441461053657806323b872dd146105665780632a7aec09146105965780632c1758c1146105c6576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c59190614871565b610c80565b6040516103d791906148b7565b60405180910390f35b6103fa60048036038101906103f5919061492a565b610d69565b6040516104079190614972565b60405180910390f35b610418610ebd565b6040516104259190614a1d565b60405180910390f35b61044860048036038101906104439190614a6b565b610f4b565b6040516104559190614972565b60405180910390f35b610466611187565b6040516104739190614ac7565b60405180910390f35b61049660048036038101906104919190614b0e565b61119a565b6040516104a391906148b7565b60405180910390f35b6104b46111ea565b6040516104c191906148b7565b60405180910390f35b6104d2611201565b6040516104df91906148b7565b60405180910390f35b6104f0611206565b6040516104fd91906148b7565b60405180910390f35b610520600480360381019061051b9190614cef565b611212565b60405161052d91906148b7565b60405180910390f35b610550600480360381019061054b9190614cef565b61122b565b60405161055d9190614972565b60405180910390f35b610580600480360381019061057b9190614d1c565b611293565b60405161058d9190614972565b60405180910390f35b6105b060048036038101906105ab9190614cef565b6114b1565b6040516105bd9190614ac7565b60405180910390f35b6105e060048036038101906105db9190614d6f565b6114e9565b6040516105ed9190614972565b60405180910390f35b610610600480360381019061060b9190614d9c565b61151c565b60405161061d91906148b7565b60405180910390f35b61062e611599565b60405161063b91906148b7565b60405180910390f35b61064c6115bd565b60405161065991906148b7565b60405180910390f35b61067c60048036038101906106779190614a6b565b6115c3565b6040516106899190614972565b60405180910390f35b6106ac60048036038101906106a79190614d6f565b611759565b6040516106bb93929190614e09565b60405180910390f35b6106de60048036038101906106d99190614d6f565b6117c8565b005b6106fa60048036038101906106f59190614a6b565b611904565b6040516107079190614972565b60405180910390f35b61072a60048036038101906107259190614871565b611adb565b60405161073791906148b7565b60405180910390f35b61075a60048036038101906107559190614d6f565b611b24565b60405161076791906148b7565b60405180910390f35b61078a60048036038101906107859190614d6f565b611b84565b60405161079791906148b7565b60405180910390f35b6107a8611ba5565b6040516107b591906148b7565b60405180910390f35b6107d860048036038101906107d39190614871565b611bab565b6040516107e59190614972565b60405180910390f35b6107f6611cb5565b6040516108039190614e5c565b60405180910390f35b61082660048036038101906108219190614d6f565b611d82565b60405161083391906148b7565b60405180910390f35b61085660048036038101906108519190614d6f565b611dc3565b60405161086391906148b7565b60405180910390f35b61088660048036038101906108819190614d6f565b611de4565b005b6108a2600480360381019061089d9190614871565b611eac565b6040516108af91906148b7565b60405180910390f35b6108c0611f16565b6040516108cd91906148b7565b60405180910390f35b6108de611f27565b6040516108eb91906148b7565b60405180910390f35b61090e60048036038101906109099190614cef565b611f2d565b60405161091b91906148b7565b60405180910390f35b61092c611f5b565b60405161093991906148b7565b60405180910390f35b61094a611f61565b6040516109579190614972565b60405180910390f35b610968612108565b6040516109759190614e86565b60405180910390f35b61099860048036038101906109939190614d6f565b61212e565b6040516109a591906148b7565b60405180910390f35b6109b6612215565b6040516109c39190614e86565b60405180910390f35b6109e660048036038101906109e19190614871565b61223b565b005b6109f06122f0565b6040516109fd9190614972565b60405180910390f35b610a0e6125b1565b604051610a1b9190614a1d565b60405180910390f35b610a2c61263f565b604051610a399190614ac7565b60405180910390f35b610a5c6004803603810190610a579190614a6b565b612663565b604051610a699190614972565b60405180910390f35b610a8c6004803603810190610a879190614a6b565b612882565b604051610a999190614972565b60405180910390f35b610aaa612983565b604051610ab791906148b7565b60405180910390f35b610ac8612989565b604051610ad591906148b7565b60405180910390f35b610af86004803603810190610af39190614d6f565b6129ad565b604051610b0591906148b7565b60405180910390f35b610b16612b34565b604051610b2391906148b7565b60405180910390f35b610b34612b3a565b604051610b4191906148b7565b60405180910390f35b610b646004803603810190610b5f9190614d6f565b612b40565b005b610b6e612c3f565b604051610b7b91906148b7565b60405180910390f35b610b9e6004803603810190610b999190614871565b612c49565b604051610bab9190614972565b60405180910390f35b610bce6004803603810190610bc99190614cef565b612d1d565b604051610bdb91906148b7565b60405180910390f35b610bfe6004803603810190610bf99190614ea1565b612d31565b604051610c0b9190614f77565b60405180910390f35b610c1c612db1565b604051610c299190614fbd565b60405180910390f35b610c3a612e1b565b604051610c4791906148b7565b60405180910390f35b610c6a6004803603810190610c659190614871565b612e3f565b604051610c779190614972565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615007565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610eb8565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610eb8565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610eb8565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610eb8565b600090505b919050565b60068054610eca9061506a565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef69061506a565b8015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b505050505081565b6000806000610f58611cb5565b905060028160ff1603610f7057600092505050611181565b60008160ff161115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae906150e7565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611080576000841461107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690615153565b60405180910390fd5b5b6110886122f0565b5061109284611d82565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161117291906148b7565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806111c16111a985612ee1565b6111bc6111b66001612ee1565b86612f49565b612fb0565b90506111cc8161302f565b67ffffffffffffffff16846111e19190615173565b91505092915050565b6000600b546008546111fc9190615173565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff161115611248576000905061128e565b6000826020015168ffffffffffffffffff161115611269576000905061128e565b6000826040015167ffffffffffffffff161115611289576000905061128e565b600190505b919050565b6000806000806112a1611cb5565b905060028160ff16036112ba57600093505050506114aa565b60008160ff161115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f8906150e7565b60405180910390fd5b6113096122f0565b5061131385611d82565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561139e57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142a9190615173565b9250508190555061143c878785613064565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161149b91906148b7565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114e0576114dd6001612ee1565b90505b80915050919050565b6000600f82106114f857600080fd5b6000820361150d57600f601254149050611517565b8160125483161490505b919050565b60008060008061152b86612ee1565b925061153685612ee1565b91506115627f000000000000000000000000000000000000000000000000000000000000000083612fb0565b905061156d81613089565b90506115798382612fb0565b90506115848161302f565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115ce6122f0565b506115d883611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116669190615007565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161174691906148b7565b60405180910390a3600191505092915050565b6000818154811061176957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117d2611cb5565b60ff16146117df57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661183557600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561188157600080fd5b600061188c82611d82565b90506118983382613116565b5081600b60008282546118ab9190615007565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118f891906148b7565b60405180910390a25050565b6000806000611911611cb5565b60ff161461191e57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119c35750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f9906151f3565b60405180910390fd5b611a0a6122f0565b5060006011541115611a335760115483600854611a279190615007565b1115611a3257600080fd5b5b8260086000828254611a459190615007565b92505081905550611a5583611d82565b9050611a61848261321d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611abf91906148b7565b60405180910390a3611acf6132e1565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b529190615213565b7f0000000000000000000000000000000000000000000000000000000000000000611b7d9190615007565b9050919050565b6000603c8242611b949190615173565b611b9e9190615284565b9050919050565b60035481565b6000611bba600160ff166114e9565b15611bc457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c4b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611c5457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611cd55760019050611d7f565b6000600f5403611ce85760009050611d7f565b600f544210611d7a57611d15603c600354611d039190615284565b600f54611d109190615173565b6129ad565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611d6091906148b7565b60405180910390a1611d706122f0565b5060029050611d7f565b600090505b90565b600080611da6611d9184612ee1565b600260009054906101000a9004600f0b6134a5565b9050611db18161302f565b67ffffffffffffffff16915050919050565b6000603c8242611dd39190615173565b611ddd9190615284565b9050919050565b611df1600860ff166114e9565b15611dfb57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5557600080fd5b611e5d6111ea565b8111611e6857600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611e9a91906148b7565b60405180910390a28060118190555050565b6000806000806000611ec5611ec087611adb565b612ee1565b9350611ed2600354611b84565b9150611eed84600260009054906101000a9004600f0b612fb0565b9250611f0b611efb8461302f565b67ffffffffffffffff168361151c565b945050505050919050565b6000611f2260006129ad565b905090565b600b5481565b6000806000611f3b84611212565b9150611f46846114b1565b9050611f52828261119a565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fbe57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a90615301565b60405180910390fd5b60006012548316146121ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b19061536d565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e60125460405161220391906148b7565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612248600260ff166114e9565b1561225257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ac57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122fa6147c8565b6123026147c8565b61230a6147c8565b600080600080600061231a611f16565b50612323613531565b975061232e8861122b565b15612344576000985050505050505050506125ae565b60006009548154811061235a5761235961538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061240788612d1d565b94506001856124169190615007565b9050612421866114b1565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124519190615213565b61245b9190615284565b91506124976124927f000000000000000000000000000000000000000000000000000000000000000061248d85612ee1565b612fb0565b613089565b92506124ad6000846124a76111ea565b84612d31565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505050612569876136c7565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161259991906148b7565b60405180910390a16001985050505050505050505b90565b600780546125be9061506a565b80601f01602080910402602001604051908101604052809291908181526020018280546125ea9061506a565b80156126375780601f1061260c57610100808354040283529160200191612637565b820191906000526020600020905b81548152906001019060200180831161261a57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061266f83611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156126fa57600080fd5b6127026122f0565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461278f9190615173565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161286f91906148b7565b60405180910390a3600191505092915050565b600080600080612890611cb5565b905060028160ff16036128a9576000935050505061297d565b60008160ff1611156128f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e7906150e7565b60405180910390fd5b6128f86122f0565b5061290285611d82565b925061290f338785613064565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161296e91906148b7565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156129d7576000945050505050612b2f565b6129e2600354611b84565b9250600083036129f9576000945050505050612b2f565b600260009054906101000a9004600f0b9050600086118015612a1a57508286105b15612a23578592505b612a2c83612ee1565b9150612a587f000000000000000000000000000000000000000000000000000000000000000083612fb0565b9350612a6384613089565b9350612a7e600260009054906101000a9004600f0b85612fb0565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612ac69190615213565b600354612ad39190615007565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b1f9190614ac7565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612b4f600460ff166114e9565b15612b5957600080fd5b601060009054906101000a900460ff1615612b7357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bcd57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612bf99190615213565b7f0000000000000000000000000000000000000000000000000000000000000000612c249190615007565b9050600f548111612c3457600080fd5b80600f819055505050565b6000600b54905090565b6000612c58600160ff166114e9565b15612c6257600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbc57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d396147c8565b612d416147c8565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e029190615173565b612e0c9190615284565b612e169190615007565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9b57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550919050565b6000677fffffffffffffff821115612ef857600080fd5b6040829060020a029050919050565b60008082600f0b13612f1857600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f34846137e6565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612f9d57506f7fffffffffffffffffffffffffffffff600f0b8113155b612fa657600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561301c57506f7fffffffffffffffffffffffffffffff600f0b8113155b61302557600080fd5b8091505092915050565b60008082600f0b121561304157600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b6000806130718584613116565b5061307c848461321d565b5060019150509392505050565b60006840000000000000000082600f0b126130a357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130d75760009050613111565b61310e6080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139ac565b90505b919050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600085036131725760009350505050613217565b61317b86611adb565b9250848310156131c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b790615408565b60405180910390fd5b84836131cc9190615173565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b600080600080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000850361327957600093505050506132db565b61328286611adb565b925084836132909190615007565b600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600193505050505b92915050565b60006132eb6147c8565b60006132f56111ea565b90506000600160008054905061330b9190615173565b8154811061331c5761331b61538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506133f79190615173565b815481106134085761340761538d565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036134b657600080fd5b600082600f0b604085600f0b9060020a02816134d5576134d4615255565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561351e57506f7fffffffffffffffffffffffffffffff600f0b8113155b61352757600080fd5b8091505092915050565b6135396147c8565b6135416147c8565b6135496147c8565b600080600954815481106135605761355f61538d565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa15801561366b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368f9190615454565b6fffffffffffffffffffffffffffffffff1690506136ac83612d1d565b81116136bd578193505050506136c4565b8293505050505b90565b60008060006136d584611f2d565b6136dd6111ea565b6136e79190615173565b9150600a546136f583611d82565b6136ff9190615173565b905061372d600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261321d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d3846040516137a191906148b7565b60405180910390a36001600960008282546137bc9190615007565b9250508190555080600a60008282546137d59190615007565b925050819055508192505050919050565b60008082600f0b136137f757600080fd5b60008083600f0b9050680100000000000000008112613832576040819060008212600003808260020a82851804189250505090506040820191505b6401000000008112613860576020819060008212600003808260020a82851804189250505090506020820191505b62010000811261388c576010819060008212600003808260020a82851804189250505090506010820191505b61010081126138b7576008819060008212600003808260020a82851804189250505090506008820191505b601081126138e1576004819060008212600003808260020a82851804189250505090506004820191505b6004811261390b576002819060008212600003808260020a82851804189250505090506002820191505b6002811261391a576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561399f578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613947565b5081945050505050919050565b60006840000000000000000082600f0b126139c657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156139fa57600090506147c3565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a4857608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613a815760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613aba5760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613af357608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b2c5760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613b65576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613b9e57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613bd7576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c0f57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c475760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613c7f576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613cb75760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613cef576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d2757608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613d5f5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613d9757608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613dce5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e05576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e3c57608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613e73576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613eaa57608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613ee15760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f18576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613f4f5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613f85576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613fbb57608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613ff15760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561402757608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b131561405d5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614093576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156140c957608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156140ff576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561413457608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141695760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561419e576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141d35760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614208576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561423d57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b13156142725760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142a757608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142db5760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561430f576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561434357608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614377576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143ab57608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156143df5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614413576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144475760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b131561447a576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144ad57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156144e05760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561451357608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145465760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614579576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145ac57608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156145df576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561461157608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146435760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614675576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146a75760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156146d9576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561470b57608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561473d5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561476f57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156147be57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061483e82614813565b9050919050565b61484e81614833565b811461485957600080fd5b50565b60008135905061486b81614845565b92915050565b6000602082840312156148875761488661480e565b5b60006148958482850161485c565b91505092915050565b6000819050919050565b6148b18161489e565b82525050565b60006020820190506148cc60008301846148a8565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614907816148d2565b811461491257600080fd5b50565b600081359050614924816148fe565b92915050565b6000602082840312156149405761493f61480e565b5b600061494e84828501614915565b91505092915050565b60008115159050919050565b61496c81614957565b82525050565b60006020820190506149876000830184614963565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149c75780820151818401526020810190506149ac565b60008484015250505050565b6000601f19601f8301169050919050565b60006149ef8261498d565b6149f98185614998565b9350614a098185602086016149a9565b614a12816149d3565b840191505092915050565b60006020820190508181036000830152614a3781846149e4565b905092915050565b614a488161489e565b8114614a5357600080fd5b50565b600081359050614a6581614a3f565b92915050565b60008060408385031215614a8257614a8161480e565b5b6000614a908582860161485c565b9250506020614aa185828601614a56565b9150509250929050565b600081600f0b9050919050565b614ac181614aab565b82525050565b6000602082019050614adc6000830184614ab8565b92915050565b614aeb81614aab565b8114614af657600080fd5b50565b600081359050614b0881614ae2565b92915050565b60008060408385031215614b2557614b2461480e565b5b6000614b3385828601614a56565b9250506020614b4485828601614af9565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614b8b826149d3565b810181811067ffffffffffffffff82111715614baa57614ba9614b53565b5b80604052505050565b6000614bbd614804565b9050614bc98282614b82565b919050565b600063ffffffff82169050919050565b614be781614bce565b8114614bf257600080fd5b50565b600081359050614c0481614bde565b92915050565b600068ffffffffffffffffff82169050919050565b614c2881614c0a565b8114614c3357600080fd5b50565b600081359050614c4581614c1f565b92915050565b600067ffffffffffffffff82169050919050565b614c6881614c4b565b8114614c7357600080fd5b50565b600081359050614c8581614c5f565b92915050565b600060608284031215614ca157614ca0614b4e565b5b614cab6060614bb3565b90506000614cbb84828501614bf5565b6000830152506020614ccf84828501614c36565b6020830152506040614ce384828501614c76565b60408301525092915050565b600060608284031215614d0557614d0461480e565b5b6000614d1384828501614c8b565b91505092915050565b600080600060608486031215614d3557614d3461480e565b5b6000614d438682870161485c565b9350506020614d548682870161485c565b9250506040614d6586828701614a56565b9150509250925092565b600060208284031215614d8557614d8461480e565b5b6000614d9384828501614a56565b91505092915050565b60008060408385031215614db357614db261480e565b5b6000614dc185828601614a56565b9250506020614dd285828601614a56565b9150509250929050565b614de581614bce565b82525050565b614df481614c0a565b82525050565b614e0381614c4b565b82525050565b6000606082019050614e1e6000830186614ddc565b614e2b6020830185614deb565b614e386040830184614dfa565b949350505050565b600060ff82169050919050565b614e5681614e40565b82525050565b6000602082019050614e716000830184614e4d565b92915050565b614e8081614833565b82525050565b6000602082019050614e9b6000830184614e77565b92915050565b60008060008060808587031215614ebb57614eba61480e565b5b6000614ec987828801614a56565b9450506020614eda87828801614af9565b9350506040614eeb87828801614a56565b9250506060614efc87828801614a56565b91505092959194509250565b614f1181614bce565b82525050565b614f2081614c0a565b82525050565b614f2f81614c4b565b82525050565b606082016000820151614f4b6000850182614f08565b506020820151614f5e6020850182614f17565b506040820151614f716040850182614f26565b50505050565b6000606082019050614f8c6000830184614f35565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614fb781614f92565b82525050565b6000602082019050614fd26000830184614fae565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006150128261489e565b915061501d8361489e565b925082820190508082111561503557615034614fd8565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061508257607f821691505b6020821081036150955761509461503b565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006150d1600783614998565b91506150dc8261509b565b602082019050919050565b60006020820190508181036000830152615100816150c4565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061513d600a83614998565b915061514882615107565b602082019050919050565b6000602082019050818103600083015261516c81615130565b9050919050565b600061517e8261489e565b91506151898361489e565b92508282039050818111156151a1576151a0614fd8565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006151dd600a83614998565b91506151e8826151a7565b602082019050919050565b6000602082019050818103600083015261520c816151d0565b9050919050565b600061521e8261489e565b91506152298361489e565b92508282026152378161489e565b9150828204841483151761524e5761524d614fd8565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061528f8261489e565b915061529a8361489e565b9250826152aa576152a9615255565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006152eb601183614998565b91506152f6826152b5565b602082019050919050565b6000602082019050818103600083015261531a816152de565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615357601283614998565b915061536282615321565b602082019050919050565b600060208201905081810360008301526153868161534a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006153f2600d83614998565b91506153fd826153bc565b602082019050919050565b60006020820190508181036000830152615421816153e5565b9050919050565b61543181614f92565b811461543c57600080fd5b50565b60008151905061544e81615428565b92915050565b60006020828403121561546a5761546961480e565b5b60006154788482850161543f565b9150509291505056fea2646970667358221220b6ab446997d21e5b6e84b6c705c209cf53b5182ff5f6fe4b79f80236d00e874d64736f6c63430008120033 \ No newline at end of file +6101006040523480156200001257600080fd5b506040516200621938038062006219833981810160405281019062000038919062000863565b6801000000000000000083600f0b126200005157600080fd5b6200005b62000578565b33600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508660069081620000ad919062000b84565b508560079081620000bf919062000b84565b508460ff16608081815250504260038190555060035460a08181525050603c83620000eb919062000c9a565b60c08181525050620001126001620002a96401000000000262002ee6176401000000009004565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff1602179055506200016c84620002d06401000000000262002f0c176401000000009004565b600f0b60e081600f0b81525050620001a86000600260009054906101000a9004600f0b6000600162000324640100000000026401000000009004565b90506000819080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505081600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505062000ce5565b6000677fffffffffffffff821115620002c157600080fd5b6040829060020a029050919050565b60008082600f0b13620002e257600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af6200030f84620003a8640100000000026401000000009004565b600f0b02908060020a82049150509050919050565b6200032e62000578565b6200033862000578565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b60008082600f0b13620003ba57600080fd5b60008083600f0b9050680100000000000000008112620003f6576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811262000425576020819060008212600003808260020a82851804189250505090506020820191505b62010000811262000452576010819060008212600003808260020a82851804189250505090506010820191505b61010081126200047e576008819060008212600003808260020a82851804189250505090506008820191505b60108112620004a9576004819060008212600003808260020a82851804189250505090506004820191505b60048112620004d4576002819060008212600003808260020a82851804189250505090506002820191505b60028112620004e4576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b60008113156200056b578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a828518041892505050905062000511565b5081945050505050919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061d82620005d2565b810181811067ffffffffffffffff821117156200063f576200063e620005e3565b5b80604052505050565b600062000654620005b4565b905062000662828262000612565b919050565b600067ffffffffffffffff821115620006855762000684620005e3565b5b6200069082620005d2565b9050602081019050919050565b60005b83811015620006bd578082015181840152602081019050620006a0565b60008484015250505050565b6000620006e0620006da8462000667565b62000648565b905082815260208101848484011115620006ff57620006fe620005cd565b5b6200070c8482856200069d565b509392505050565b600082601f8301126200072c576200072b620005c8565b5b81516200073e848260208601620006c9565b91505092915050565b600060ff82169050919050565b6200075f8162000747565b81146200076b57600080fd5b50565b6000815190506200077f8162000754565b92915050565b600081600f0b9050919050565b6200079d8162000785565b8114620007a957600080fd5b50565b600081519050620007bd8162000792565b92915050565b6000819050919050565b620007d881620007c3565b8114620007e457600080fd5b50565b600081519050620007f881620007cd565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200082b82620007fe565b9050919050565b6200083d816200081e565b81146200084957600080fd5b50565b6000815190506200085d8162000832565b92915050565b60008060008060008060c08789031215620008835762000882620005be565b5b600087015167ffffffffffffffff811115620008a457620008a3620005c3565b5b620008b289828a0162000714565b965050602087015167ffffffffffffffff811115620008d657620008d5620005c3565b5b620008e489828a0162000714565b9550506040620008f789828a016200076e565b94505060606200090a89828a01620007ac565b93505060806200091d89828a01620007e7565b92505060a06200093089828a016200084c565b9150509295509295509295565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200099057607f821691505b602082108103620009a657620009a562000948565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b60006008830262000a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620009d1565b62000a1f8683620009d1565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000a6262000a5c62000a5684620007c3565b62000a37565b620007c3565b9050919050565b6000819050919050565b62000a7e8362000a41565b62000a9662000a8d8262000a69565b848454620009e1565b825550505050565b600090565b62000aad62000a9e565b62000aba81848462000a73565b505050565b5b8181101562000ae25762000ad660008262000aa3565b60018101905062000ac0565b5050565b601f82111562000b315762000afb81620009ac565b62000b0684620009c1565b8101602085101562000b16578190505b62000b2e62000b2585620009c1565b83018262000abf565b50505b505050565b60008160020a8304905092915050565b600062000b596000198460080262000b36565b1980831691505092915050565b600062000b74838362000b46565b9150826002028217905092915050565b62000b8f826200093d565b67ffffffffffffffff81111562000bab5762000baa620005e3565b5b62000bb7825462000977565b62000bc482828562000ae6565b600060209050601f83116001811462000bfc576000841562000be7578287015190505b62000bf3858262000b66565b86555062000c63565b601f19841662000c0c86620009ac565b60005b8281101562000c365784890151825560018201915060208501945060208101905062000c0f565b8683101562000c56578489015162000c52601f89168262000b46565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000ca782620007c3565b915062000cb483620007c3565b925082820262000cc481620007c3565b9150828204841483151762000cde5762000cdd62000c6b565b5b5092915050565b60805160a05160c05160e0516154b462000d656000396000818161153d01528181612466015281816126420152612a34015260008181611b28015281816124290152818161298c01528181612bd00152612db8015260008181611b5401528181612bfc01528181612dd90152612e1e0152600061159b01526154b46000f3fe608060405234801561001057600080fd5b50600436106103ab576000357c0100000000000000000000000000000000000000000000000000000000900480636f8b44b0116101fb578063a457c2d71161012c578063d7a52fa9116100ca578063e69571af11610099578063e69571af14610be4578063e809529514610c14578063eda4e6d614610c32578063f2fde38b14610c50576103ab565b8063d7a52fa914610b4a578063d89135cd14610b66578063da2824a814610b84578063e54063a614610bb4576103ab565b8063b470aade11610106578063b470aade14610ac0578063c0ab707714610ade578063d340ef8a14610b0e578063d5abeb0114610b2c576103ab565b8063a457c2d714610a42578063a9059cbb14610a72578063b1cb0db314610aa2576103ab565b806384dde4af116101995780638f0b2d5d116101735780638f0b2d5d146109cc5780638f1df6bc146109e857806395d89b4114610a065780639f24880814610a24576103ab565b806384dde4af1461096057806386fe212d1461097e5780638da5cb5b146109ae576103ab565b806373f42561116101d557806373f42561146108d65780637445e33a146108f457806374bedb951461092457806379ba509714610942576103ab565b80636f8b44b01461086c57806370a0823114610888578063731f237c146108b8576103ab565b806331333487116102e057806347a505171161027e5780635ae06f7e1161024d5780635ae06f7e146107be5780635f408c04146107ee5780636787a9be1461080c5780636a2d094e1461083c576103ab565b806347a50517146107105780634abfbba21461074057806351b4541c1461077057806358b2833b146107a0576103ab565b806339509351116102ba578063395093511461066257806340452d911461069257806342966c68146106c4578063449a52f8146106e0576103ab565b806331333487146105f6578063313ce5671461062657806331a5995d14610644576103ab565b806318cbbcfc1161034d57806323a859441161032757806323a859441461053657806323b872dd146105665780632a7aec09146105965780632c1758c1146105c6576103ab565b806318cbbcfc146104ca5780631989c6a8146104e8578063213d1e1e14610506576103ab565b8063095ea7b311610389578063095ea7b31461042e57806309f28f3c1461045e57806311c566151461047c57806318160ddd146104ac576103ab565b806301681a62146103b057806301ffc9a7146103e057806306fdde0314610410575b600080fd5b6103ca60048036038101906103c5919061486e565b610c80565b6040516103d791906148b4565b60405180910390f35b6103fa60048036038101906103f59190614927565b610d69565b604051610407919061496f565b60405180910390f35b610418610ebd565b6040516104259190614a1a565b60405180910390f35b61044860048036038101906104439190614a68565b610f4b565b604051610455919061496f565b60405180910390f35b610466611187565b6040516104739190614ac4565b60405180910390f35b61049660048036038101906104919190614b0b565b61119a565b6040516104a391906148b4565b60405180910390f35b6104b46111ea565b6040516104c191906148b4565b60405180910390f35b6104d2611201565b6040516104df91906148b4565b60405180910390f35b6104f0611206565b6040516104fd91906148b4565b60405180910390f35b610520600480360381019061051b9190614cec565b611212565b60405161052d91906148b4565b60405180910390f35b610550600480360381019061054b9190614cec565b61122b565b60405161055d919061496f565b60405180910390f35b610580600480360381019061057b9190614d19565b611293565b60405161058d919061496f565b60405180910390f35b6105b060048036038101906105ab9190614cec565b6114b1565b6040516105bd9190614ac4565b60405180910390f35b6105e060048036038101906105db9190614d6c565b6114e9565b6040516105ed919061496f565b60405180910390f35b610610600480360381019061060b9190614d99565b61151c565b60405161061d91906148b4565b60405180910390f35b61062e611599565b60405161063b91906148b4565b60405180910390f35b61064c6115bd565b60405161065991906148b4565b60405180910390f35b61067c60048036038101906106779190614a68565b6115c3565b604051610689919061496f565b60405180910390f35b6106ac60048036038101906106a79190614d6c565b611759565b6040516106bb93929190614e06565b60405180910390f35b6106de60048036038101906106d99190614d6c565b6117c8565b005b6106fa60048036038101906106f59190614a68565b611904565b604051610707919061496f565b60405180910390f35b61072a6004803603810190610725919061486e565b611adb565b60405161073791906148b4565b60405180910390f35b61075a60048036038101906107559190614d6c565b611b24565b60405161076791906148b4565b60405180910390f35b61078a60048036038101906107859190614d6c565b611b84565b60405161079791906148b4565b60405180910390f35b6107a8611ba5565b6040516107b591906148b4565b60405180910390f35b6107d860048036038101906107d3919061486e565b611bab565b6040516107e5919061496f565b60405180910390f35b6107f6611cb5565b6040516108039190614e59565b60405180910390f35b61082660048036038101906108219190614d6c565b611d82565b60405161083391906148b4565b60405180910390f35b61085660048036038101906108519190614d6c565b611dc3565b60405161086391906148b4565b60405180910390f35b61088660048036038101906108819190614d6c565b611de4565b005b6108a2600480360381019061089d919061486e565b611eac565b6040516108af91906148b4565b60405180910390f35b6108c0611f13565b6040516108cd91906148b4565b60405180910390f35b6108de611f24565b6040516108eb91906148b4565b60405180910390f35b61090e60048036038101906109099190614cec565b611f2a565b60405161091b91906148b4565b60405180910390f35b61092c611f58565b60405161093991906148b4565b60405180910390f35b61094a611f5e565b604051610957919061496f565b60405180910390f35b610968612109565b6040516109759190614e83565b60405180910390f35b61099860048036038101906109939190614d6c565b61212f565b6040516109a591906148b4565b60405180910390f35b6109b6612216565b6040516109c39190614e83565b60405180910390f35b6109e660048036038101906109e1919061486e565b61223c565b005b6109f06122f1565b6040516109fd919061496f565b60405180910390f35b610a0e6125b2565b604051610a1b9190614a1a565b60405180910390f35b610a2c612640565b604051610a399190614ac4565b60405180910390f35b610a5c6004803603810190610a579190614a68565b612664565b604051610a69919061496f565b60405180910390f35b610a8c6004803603810190610a879190614a68565b612883565b604051610a99919061496f565b60405180910390f35b610aaa612984565b604051610ab791906148b4565b60405180910390f35b610ac861298a565b604051610ad591906148b4565b60405180910390f35b610af86004803603810190610af39190614d6c565b6129ae565b604051610b0591906148b4565b60405180910390f35b610b16612b35565b604051610b2391906148b4565b60405180910390f35b610b34612b3b565b604051610b4191906148b4565b60405180910390f35b610b646004803603810190610b5f9190614d6c565b612b41565b005b610b6e612c40565b604051610b7b91906148b4565b60405180910390f35b610b9e6004803603810190610b99919061486e565b612c4a565b604051610bab919061496f565b60405180910390f35b610bce6004803603810190610bc99190614cec565b612d1e565b604051610bdb91906148b4565b60405180910390f35b610bfe6004803603810190610bf99190614e9e565b612d32565b604051610c0b9190614f74565b60405180910390f35b610c1c612db2565b604051610c299190614fba565b60405180910390f35b610c3a612e1c565b604051610c4791906148b4565b60405180910390f35b610c6a6004803603810190610c65919061486e565b612e40565b604051610c77919061496f565b60405180910390f35b600080600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610d599190615004565b9250508190555080915050919050565b600063c6bb4b707c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610dbd5760019050610eb8565b63449a52f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e0f5760019050610eb8565b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610e615760019050610eb8565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610eb35760019050610eb8565b600090505b919050565b60068054610eca90615067565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef690615067565b8015610f435780601f10610f1857610100808354040283529160200191610f43565b820191906000526020600020905b815481529060010190602001808311610f2657829003601f168201915b505050505081565b6000806000610f58611cb5565b905060028160ff1603610f7057600092505050611181565b60008160ff161115610fb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fae906150e4565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541115611080576000841461107f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107690615150565b60405180910390fd5b5b6110886122f1565b5061109284611d82565b915081600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258660405161117291906148b4565b60405180910390a36001925050505b92915050565b600260009054906101000a9004600f0b81565b6000806111c16111a985612ee6565b6111bc6111b66001612ee6565b86612f4e565b612fb5565b90506111cc81613034565b67ffffffffffffffff16846111e19190615170565b91505092915050565b6000600b546008546111fc9190615170565b905090565b600f81565b60008080549050905090565b6000816020015168ffffffffffffffffff169050919050565b600080826000015163ffffffff161115611248576000905061128e565b6000826020015168ffffffffffffffffff161115611269576000905061128e565b6000826040015167ffffffffffffffff161115611289576000905061128e565b600190505b919050565b6000806000806112a1611cb5565b905060028160ff16036112ba57600093505050506114aa565b60008160ff161115611301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f8906150e4565b60405180910390fd5b6113096122f1565b5061131385611d82565b925082600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561139e57600080fd5b82600d60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461142a9190615170565b9250508190555061143c878785613069565b91508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161149b91906148b4565b60405180910390a38193505050505b9392505050565b60008067ffffffffffffffff836040015160070b169050600081600f0b036114e0576114dd6001612ee6565b90505b80915050919050565b6000600f82106114f857600080fd5b6000820361150d57600f601254149050611517565b8160125483161490505b919050565b60008060008061152b86612ee6565b925061153685612ee6565b91506115627f000000000000000000000000000000000000000000000000000000000000000083612fb5565b905061156d8161308c565b90506115798382612fb5565b905061158481613034565b67ffffffffffffffff16935050505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60125481565b6000806115ce6122f1565b506115d883611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116669190615004565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161174691906148b4565b60405180910390a3600191505092915050565b6000818154811061176957600080fd5b906000526020600020016000915090508060000160009054906101000a900463ffffffff16908060000160049054906101000a900468ffffffffffffffffff169080600001600d9054906101000a900467ffffffffffffffff16905083565b60006117d2611cb5565b60ff16146117df57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661183557600080fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481111561188157600080fd5b600061188c82611d82565b90506118983382613119565b5081600b60008282546118ab9190615004565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5836040516118f891906148b4565b60405180910390a25050565b6000806000611911611cb5565b60ff161461191e57600080fd5b600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806119c35750600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f9906151f0565b60405180910390fd5b611a0a6122f1565b5060006011541115611a335760115483600854611a279190615004565b1115611a3257600080fd5b5b8260086000828254611a459190615004565b92505081905550611a5583611d82565b9050611a61848261321d565b508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fab8530f87dc9b59234c4623bf917212bb2536d647574c8e7e5da92c2ede0c9f885604051611abf91906148b4565b60405180910390a3611acf6132de565b50600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f000000000000000000000000000000000000000000000000000000000000000082611b529190615210565b7f0000000000000000000000000000000000000000000000000000000000000000611b7d9190615004565b9050919050565b6000603c8242611b949190615170565b611b9e9190615281565b9050919050565b60035481565b6000611bba600160ff166114e9565b15611bc457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c4b57503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611c5457600080fd5b6000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000601060009054906101000a900460ff1615611cd55760019050611d7f565b6000600f5403611ce85760009050611d7f565b600f544210611d7a57611d15603c600354611d039190615281565b600f54611d109190615170565b6129ae565b506001601060006101000a81548160ff0219169083151502179055507ff80dbaea4785589e52984ca36a31de106adc77759539a5c7d92883bf49692fe942604051611d6091906148b4565b60405180910390a1611d706122f1565b5060029050611d7f565b600090505b90565b600080611da6611d9184612ee6565b600260009054906101000a9004600f0b6134a2565b9050611db181613034565b67ffffffffffffffff16915050919050565b6000603c8242611dd39190615170565b611ddd9190615281565b9050919050565b611df1600860ff166114e9565b15611dfb57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e5557600080fd5b611e5d6111ea565b8111611e6857600080fd5b6011547f9722adea12ab7ef86fc45b88f0e0b567639e8dddaae60261e08c03d747fbbfe682604051611e9a91906148b4565b60405180910390a28060118190555050565b600080600080611ec3611ebe86611adb565b612ee6565b9250611ed0600354611b84565b9050611eeb83600260009054906101000a9004600f0b612fb5565b9150611f09611ef983613034565b67ffffffffffffffff168261151c565b9350505050919050565b6000611f1f60006129ae565b905090565b600b5481565b6000806000611f3884611212565b9150611f43846114b1565b9050611f4f828261119a565b92505050919050565b600a5481565b600080600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fbb57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600191505090565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060108210612174576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216b906152fe565b60405180910390fd5b60006012548316146121bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b29061536a565b60405180910390fd5b81601260008282541792505081905550600f6012541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e60125460405161220491906148b4565b60405180910390a26012549050919050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612249600260ff166114e9565b1561225357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146122ad57600080fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006122fb6147c5565b6123036147c5565b61230b6147c5565b600080600080600061231b611f13565b5061232461352e565b975061232f8861122b565b15612345576000985050505050505050506125af565b60006009548154811061235b5761235a61538a565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050955061240888612d1e565b94506001856124179190615004565b9050612422866114b1565b9350603c857f00000000000000000000000000000000000000000000000000000000000000006124529190615210565b61245c9190615281565b91506124986124937f000000000000000000000000000000000000000000000000000000000000000061248e85612ee6565b612fb5565b61308c565b92506124ae6000846124a86111ea565b84612d32565b96506000879080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505061256a876136c4565b507f55d243082e019fce4009ccea5368b92e436c17586a1e793c7deda16df4e5d6758160405161259a91906148b4565b60405180910390a16001985050505050505050505b90565b600780546125bf90615067565b80601f01602080910402602001604051908101604052809291908181526020018280546125eb90615067565b80156126385780601f1061260d57610100808354040283529160200191612638565b820191906000526020600020905b81548152906001019060200180831161261b57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008061267083611d82565b905080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156126fb57600080fd5b6127036122f1565b5080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127909190615170565b925050819055508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460405161287091906148b4565b60405180910390a3600191505092915050565b600080600080612891611cb5565b905060028160ff16036128aa576000935050505061297e565b60008160ff1611156128f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e8906150e4565b60405180910390fd5b6128f96122f1565b5061290385611d82565b9250612910338785613069565b91508573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405161296f91906148b4565b60405180910390a38193505050505b92915050565b600f5481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000806000806000601060009054906101000a900460ff16156129d8576000945050505050612b30565b6129e3600354611b84565b9250600083036129fa576000945050505050612b30565b600260009054906101000a9004600f0b9050600086118015612a1b57508286105b15612a24578592505b612a2d83612ee6565b9150612a597f000000000000000000000000000000000000000000000000000000000000000083612fb5565b9350612a648461308c565b9350612a7f600260009054906101000a9004600f0b85612fb5565b600260006101000a8154816fffffffffffffffffffffffffffffffff0219169083600f0b6fffffffffffffffffffffffffffffffff160217905550603c83612ac79190615210565b600354612ad49190615004565b60038190555080600f0b836003547f1c9c74563c32efd114cb36fb5e432d9386c8254d08456614804a33a3088ab736600260009054906101000a9004600f0b604051612b209190614ac4565b60405180910390a4829450505050505b919050565b60095481565b60115481565b6000612b50600460ff166114e9565b15612b5a57600080fd5b601060009054906101000a900460ff1615612b7457600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612bce57600080fd5b7f000000000000000000000000000000000000000000000000000000000000000082612bfa9190615210565b7f0000000000000000000000000000000000000000000000000000000000000000612c259190615004565b9050600f548111612c3557600080fd5b80600f819055505050565b6000600b54905090565b6000612c59600160ff166114e9565b15612c6357600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612cbd57600080fd5b6001600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000816000015163ffffffff169050919050565b612d3a6147c5565b612d426147c5565b82816000019063ffffffff16908163ffffffff168152505083816020019068ffffffffffffffffff16908168ffffffffffffffffff168152505067ffffffffffffffff8516816040019067ffffffffffffffff16908167ffffffffffffffff168152505080915050949350505050565b600060017f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000042612e039190615170565b612e0d9190615281565b612e179190615004565b905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e9c57600080fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000677fffffffffffffff821115612efd57600080fd5b6040829060020a029050919050565b60008082600f0b13612f1d57600080fd5b60806fb17217f7d1cf79abc9e3b39803f2f6af612f39846137e3565b600f0b02908060020a82049150509050919050565b60008082600f0b84600f0b0390507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b8112158015612fa257506f7fffffffffffffffffffffffffffffff600f0b8113155b612fab57600080fd5b8091505092915050565b600080604083600f0b85600f0b029060008212600003808260020a82851804189250505090507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561302157506f7fffffffffffffffffffffffffffffff600f0b8113155b61302a57600080fd5b8091505092915050565b60008082600f0b121561304657600080fd5b604082600f0b9060008212600003808260020a8285180418925050509050919050565b60006130758483613119565b50613080838361321d565b50600190509392505050565b60006840000000000000000082600f0b126130a657600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156130da5760009050613114565b6131116080700171547652b82fe1777d0ffda0d23a7d1284600f0b029060008212600003808260020a8285180418925050506139a9565b90505b919050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000840361317357600092505050613217565b61317c85611adb565b9150838210156131c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b890615405565b60405180910390fd5b83826131cd9190615170565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b6000806000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008403613277576000925050506132d8565b61328085611adb565b9150838261328e9190615004565b600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001925050505b92915050565b60006132e86147c5565b60006132f26111ea565b9050600060016000805490506133089190615170565b815481106133195761331861538a565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff1681525050915080826020019068ffffffffffffffffff16908168ffffffffffffffffff168152505081600060016000805490506133f49190615170565b815481106134055761340461538a565b5b9060005260206000200160008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a81548168ffffffffffffffffff021916908368ffffffffffffffffff160217905550604082015181600001600d6101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060019250505090565b60008082600f0b036134b357600080fd5b600082600f0b604085600f0b9060020a02816134d2576134d1615252565b5b0590507fffffffffffffffffffffffffffffffff80000000000000000000000000000000600f0b811215801561351b57506f7fffffffffffffffffffffffffffffff600f0b8113155b61352457600080fd5b8091505092915050565b6135366147c5565b61353e6147c5565b6135466147c5565b6000806009548154811061355d5761355c61538a565b5b906000526020600020016040518060600160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a900468ffffffffffffffffff1668ffffffffffffffffff1668ffffffffffffffffff16815260200160008201600d9054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff168152505092503073ffffffffffffffffffffffffffffffffffffffff1663e80952956040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381865afa158015613668573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061368c9190615451565b6fffffffffffffffffffffffffffffffff1690506136a983612d1e565b81116136ba578193505050506136c1565b8293505050505b90565b60008060006136d284611f2a565b6136da6111ea565b6136e49190615170565b9150600a546136f283611d82565b6136fc9190615170565b905061372a600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261321d565b50836000015163ffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9a2a887706623ad3ff7fc85652deeceabe9fe1e00466c597972079ee91ea40d38460405161379e91906148b4565b60405180910390a36001600960008282546137b99190615004565b9250508190555080600a60008282546137d29190615004565b925050819055508192505050919050565b60008082600f0b136137f457600080fd5b60008083600f0b905068010000000000000000811261382f576040819060008212600003808260020a82851804189250505090506040820191505b640100000000811261385d576020819060008212600003808260020a82851804189250505090506020820191505b620100008112613889576010819060008212600003808260020a82851804189250505090506010820191505b61010081126138b4576008819060008212600003808260020a82851804189250505090506008820191505b601081126138de576004819060008212600003808260020a82851804189250505090506004820191505b60048112613908576002819060008212600003808260020a82851804189250505090506002820191505b60028112613917576001820191505b600060408084039060020a029050600083607f0386600f0b9060020a029050600067800000000000000090505b600081131561399c578182029150600060ff83908060020a8204915050905080607f0183908060020a8204915050925080820284019350506001819060008212600003808260020a8285180418925050509050613944565b5081945050505050919050565b60006840000000000000000082600f0b126139c357600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffc0000000000000000082600f0b12156139f757600090506147c0565b60006f80000000000000000000000000000000905060006780000000000000008416600f0b1315613a4557608070016a09e667f3bcc908b2fb1366ea957d3e8202908060020a820491505090505b60006740000000000000008416600f0b1315613a7e5760807001306fe0a31b7152de8d5a46305c85edec8202908060020a820491505090505b60006720000000000000008416600f0b1315613ab75760807001172b83c7d517adcdf7c8c50eb14a791f8202908060020a820491505090505b60006710000000000000008416600f0b1315613af057608070010b5586cf9890f6298b92b71842a983638202908060020a820491505090505b60006708000000000000008416600f0b1315613b295760807001059b0d31585743ae7c548eb68ca417fd8202908060020a820491505090505b60006704000000000000008416600f0b1315613b62576080700102c9a3e778060ee6f7caca4f7a29bde88202908060020a820491505090505b60006702000000000000008416600f0b1315613b9b57608070010163da9fb33356d84a66ae336dcdfa3f8202908060020a820491505090505b60006701000000000000008416600f0b1315613bd4576080700100b1afa5abcbed6129ab13ec11dc95438202908060020a820491505090505b600066800000000000008416600f0b1315613c0c57608070010058c86da1c09ea1ff19d294cf2f679b8202908060020a820491505090505b600066400000000000008416600f0b1315613c445760807001002c605e2e8cec506d21bfc89a23a00f8202908060020a820491505090505b600066200000000000008416600f0b1315613c7c576080700100162f3904051fa128bca9c55c31e5df8202908060020a820491505090505b600066100000000000008416600f0b1315613cb45760807001000b175effdc76ba38e31671ca9397258202908060020a820491505090505b600066080000000000008416600f0b1315613cec576080700100058ba01fb9f96d6cacd4b180917c3d8202908060020a820491505090505b600066040000000000008416600f0b1315613d2457608070010002c5cc37da9491d0985c348c68e7b38202908060020a820491505090505b600066020000000000008416600f0b1315613d5c5760807001000162e525ee054754457d59952920268202908060020a820491505090505b600066010000000000008416600f0b1315613d9457608070010000b17255775c040618bf4a4ade83fc8202908060020a820491505090505b6000658000000000008416600f0b1315613dcb5760807001000058b91b5bc9ae2eed81e9b7d4cfab8202908060020a820491505090505b6000654000000000008416600f0b1315613e02576080700100002c5c89d5ec6ca4d7c8acc017b7c98202908060020a820491505090505b6000652000000000008416600f0b1315613e3957608070010000162e43f4f831060e02d839a9d16d8202908060020a820491505090505b6000651000000000008416600f0b1315613e70576080700100000b1721bcfc99d9f890ea069117638202908060020a820491505090505b6000650800000000008416600f0b1315613ea757608070010000058b90cf1e6d97f9ca14dbcc16288202908060020a820491505090505b6000650400000000008416600f0b1315613ede5760807001000002c5c863b73f016468f6bac5ca2b8202908060020a820491505090505b6000650200000000008416600f0b1315613f15576080700100000162e430e5a18f6119e3c02282a58202908060020a820491505090505b6000650100000000008416600f0b1315613f4c5760807001000000b1721835514b86e6d96efd1bfe8202908060020a820491505090505b60006480000000008416600f0b1315613f82576080700100000058b90c0b48c6be5df846c5b2ef8202908060020a820491505090505b60006440000000008416600f0b1315613fb857608070010000002c5c8601cc6b9e94213c72737a8202908060020a820491505090505b60006420000000008416600f0b1315613fee5760807001000000162e42fff037df38aa2b219f068202908060020a820491505090505b60006410000000008416600f0b131561402457608070010000000b17217fba9c739aa5819f44f98202908060020a820491505090505b60006408000000008416600f0b131561405a5760807001000000058b90bfcdee5acd3c1cedc8238202908060020a820491505090505b60006404000000008416600f0b1315614090576080700100000002c5c85fe31f35a6a30da1be508202908060020a820491505090505b60006402000000008416600f0b13156140c657608070010000000162e42ff0999ce3541b9fffcf8202908060020a820491505090505b60006401000000008416600f0b13156140fc576080700100000000b17217f80f4ef5aadda455548202908060020a820491505090505b600063800000008416600f0b131561413157608070010000000058b90bfbf8479bd5a81b51ad8202908060020a820491505090505b600063400000008416600f0b13156141665760807001000000002c5c85fdf84bd62ae30a74cc8202908060020a820491505090505b600063200000008416600f0b131561419b576080700100000000162e42fefb2fed257559bdaa8202908060020a820491505090505b600063100000008416600f0b13156141d05760807001000000000b17217f7d5a7716bba4a9ae8202908060020a820491505090505b600063080000008416600f0b1315614205576080700100000000058b90bfbe9ddbac5e109cce8202908060020a820491505090505b600063040000008416600f0b131561423a57608070010000000002c5c85fdf4b15de6f17eb0d8202908060020a820491505090505b600063020000008416600f0b131561426f5760807001000000000162e42fefa494f1478fde058202908060020a820491505090505b600063010000008416600f0b13156142a457608070010000000000b17217f7d20cf927c8e94c8202908060020a820491505090505b6000628000008416600f0b13156142d85760807001000000000058b90bfbe8f71cb4e4b33d8202908060020a820491505090505b6000624000008416600f0b131561430c576080700100000000002c5c85fdf477b662b269458202908060020a820491505090505b6000622000008416600f0b131561434057608070010000000000162e42fefa3ae53369388c8202908060020a820491505090505b6000621000008416600f0b1315614374576080700100000000000b17217f7d1d351a389d408202908060020a820491505090505b6000620800008416600f0b13156143a857608070010000000000058b90bfbe8e8b2d3d4ede8202908060020a820491505090505b6000620400008416600f0b13156143dc5760807001000000000002c5c85fdf4741bea6e77e8202908060020a820491505090505b6000620200008416600f0b1315614410576080700100000000000162e42fefa39fe95583c28202908060020a820491505090505b6000620100008416600f0b13156144445760807001000000000000b17217f7d1cfb72b45e18202908060020a820491505090505b60006180008416600f0b1315614477576080700100000000000058b90bfbe8e7cc35c3f08202908060020a820491505090505b60006140008416600f0b13156144aa57608070010000000000002c5c85fdf473e242ea388202908060020a820491505090505b60006120008416600f0b13156144dd5760807001000000000000162e42fefa39f02b772c8202908060020a820491505090505b60006110008416600f0b131561451057608070010000000000000b17217f7d1cf7d83c1a8202908060020a820491505090505b60006108008416600f0b13156145435760807001000000000000058b90bfbe8e7bdcbe2e8202908060020a820491505090505b60006104008416600f0b1315614576576080700100000000000002c5c85fdf473dea871f8202908060020a820491505090505b60006102008416600f0b13156145a957608070010000000000000162e42fefa39ef44d918202908060020a820491505090505b60006101008416600f0b13156145dc576080700100000000000000b17217f7d1cf79e9498202908060020a820491505090505b600060808416600f0b131561460e57608070010000000000000058b90bfbe8e7bce5448202908060020a820491505090505b600060408416600f0b13156146405760807001000000000000002c5c85fdf473de6eca8202908060020a820491505090505b600060208416600f0b1315614672576080700100000000000000162e42fefa39ef366f8202908060020a820491505090505b600060108416600f0b13156146a45760807001000000000000000b17217f7d1cf79afa8202908060020a820491505090505b600060088416600f0b13156146d6576080700100000000000000058b90bfbe8e7bcd6d8202908060020a820491505090505b600060048416600f0b131561470857608070010000000000000002c5c85fdf473de6b28202908060020a820491505090505b600060028416600f0b131561473a5760807001000000000000000162e42fefa39ef3588202908060020a820491505090505b600060018416600f0b131561476c57608070010000000000000000b17217f7d1cf79ab8202908060020a820491505090505b604083600f0b9060008212600003808260020a828518041892505050603f03600f0b81908060020a820491505090506f7fffffffffffffffffffffffffffffff600f0b8111156147bb57600080fd5b809150505b919050565b6040518060600160405280600063ffffffff168152602001600068ffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061483b82614810565b9050919050565b61484b81614830565b811461485657600080fd5b50565b60008135905061486881614842565b92915050565b6000602082840312156148845761488361480b565b5b600061489284828501614859565b91505092915050565b6000819050919050565b6148ae8161489b565b82525050565b60006020820190506148c960008301846148a5565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614904816148cf565b811461490f57600080fd5b50565b600081359050614921816148fb565b92915050565b60006020828403121561493d5761493c61480b565b5b600061494b84828501614912565b91505092915050565b60008115159050919050565b61496981614954565b82525050565b60006020820190506149846000830184614960565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156149c45780820151818401526020810190506149a9565b60008484015250505050565b6000601f19601f8301169050919050565b60006149ec8261498a565b6149f68185614995565b9350614a068185602086016149a6565b614a0f816149d0565b840191505092915050565b60006020820190508181036000830152614a3481846149e1565b905092915050565b614a458161489b565b8114614a5057600080fd5b50565b600081359050614a6281614a3c565b92915050565b60008060408385031215614a7f57614a7e61480b565b5b6000614a8d85828601614859565b9250506020614a9e85828601614a53565b9150509250929050565b600081600f0b9050919050565b614abe81614aa8565b82525050565b6000602082019050614ad96000830184614ab5565b92915050565b614ae881614aa8565b8114614af357600080fd5b50565b600081359050614b0581614adf565b92915050565b60008060408385031215614b2257614b2161480b565b5b6000614b3085828601614a53565b9250506020614b4185828601614af6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b614b88826149d0565b810181811067ffffffffffffffff82111715614ba757614ba6614b50565b5b80604052505050565b6000614bba614801565b9050614bc68282614b7f565b919050565b600063ffffffff82169050919050565b614be481614bcb565b8114614bef57600080fd5b50565b600081359050614c0181614bdb565b92915050565b600068ffffffffffffffffff82169050919050565b614c2581614c07565b8114614c3057600080fd5b50565b600081359050614c4281614c1c565b92915050565b600067ffffffffffffffff82169050919050565b614c6581614c48565b8114614c7057600080fd5b50565b600081359050614c8281614c5c565b92915050565b600060608284031215614c9e57614c9d614b4b565b5b614ca86060614bb0565b90506000614cb884828501614bf2565b6000830152506020614ccc84828501614c33565b6020830152506040614ce084828501614c73565b60408301525092915050565b600060608284031215614d0257614d0161480b565b5b6000614d1084828501614c88565b91505092915050565b600080600060608486031215614d3257614d3161480b565b5b6000614d4086828701614859565b9350506020614d5186828701614859565b9250506040614d6286828701614a53565b9150509250925092565b600060208284031215614d8257614d8161480b565b5b6000614d9084828501614a53565b91505092915050565b60008060408385031215614db057614daf61480b565b5b6000614dbe85828601614a53565b9250506020614dcf85828601614a53565b9150509250929050565b614de281614bcb565b82525050565b614df181614c07565b82525050565b614e0081614c48565b82525050565b6000606082019050614e1b6000830186614dd9565b614e286020830185614de8565b614e356040830184614df7565b949350505050565b600060ff82169050919050565b614e5381614e3d565b82525050565b6000602082019050614e6e6000830184614e4a565b92915050565b614e7d81614830565b82525050565b6000602082019050614e986000830184614e74565b92915050565b60008060008060808587031215614eb857614eb761480b565b5b6000614ec687828801614a53565b9450506020614ed787828801614af6565b9350506040614ee887828801614a53565b9250506060614ef987828801614a53565b91505092959194509250565b614f0e81614bcb565b82525050565b614f1d81614c07565b82525050565b614f2c81614c48565b82525050565b606082016000820151614f486000850182614f05565b506020820151614f5b6020850182614f14565b506040820151614f6e6040850182614f23565b50505050565b6000606082019050614f896000830184614f32565b92915050565b60006fffffffffffffffffffffffffffffffff82169050919050565b614fb481614f8f565b82525050565b6000602082019050614fcf6000830184614fab565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061500f8261489b565b915061501a8361489b565b925082820190508082111561503257615031614fd5565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061507f57607f821691505b60208210810361509257615091615038565b5b50919050565b7f4558504952454400000000000000000000000000000000000000000000000000600082015250565b60006150ce600783614995565b91506150d982615098565b602082019050919050565b600060208201905081810360008301526150fd816150c1565b9050919050565b7f5a45524f5f464952535400000000000000000000000000000000000000000000600082015250565b600061513a600a83614995565b915061514582615104565b602082019050919050565b600060208201905081810360008301526151698161512d565b9050919050565b600061517b8261489b565b91506151868361489b565b925082820390508181111561519e5761519d614fd5565b5b92915050565b7f4552525f41434345535300000000000000000000000000000000000000000000600082015250565b60006151da600a83614995565b91506151e5826151a4565b602082019050919050565b60006020820190508181036000830152615209816151cd565b9050919050565b600061521b8261489b565b91506152268361489b565b92508282026152348161489b565b9150828204841483151761524b5761524a614fd5565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061528c8261489b565b91506152978361489b565b9250826152a7576152a6615252565b5b828204905092915050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006152e8601183614995565b91506152f3826152b2565b602082019050919050565b60006020820190508181036000830152615317816152db565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000615354601283614995565b915061535f8261531e565b602082019050919050565b6000602082019050818103600083015261538381615347565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552525f4f5645525350454e4400000000000000000000000000000000000000600082015250565b60006153ef600d83614995565b91506153fa826153b9565b602082019050919050565b6000602082019050818103600083015261541e816153e2565b9050919050565b61542e81614f8f565b811461543957600080fd5b50565b60008151905061544b81615425565b92915050565b6000602082840312156154675761546661480b565b5b60006154758482850161543c565b9150509291505056fea2646970667358221220539aa72e5d51e9412bd37f9234b90b4d7c64114d76a701a416b43ff52ffa3f2964736f6c63430008120033 \ No newline at end of file diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json index 0d42da7..b8e4caf 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json index 316f3dc..893430f 100644 --- a/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json +++ b/python/erc20_demurrage_token/data/DemurrageTokenSingleNocap.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.18+commit.87f61d96"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"balanceOf(address)":{"notice":"Implements ERC20"}},"version":1}},"settings":{"compilationTarget":{"DemurrageTokenSingleNocap.sol":"DemurrageTokenSingleNocap"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DemurrageTokenSingleNocap.sol":{"keccak256":"0x83ef1889d24655a3d2f9d8f40460e14288d73a0c4db7c131a4f38ef7ad822dac","license":"GPL-3.0-or-later","urls":["bzz-raw://508ab875d3eec6e1360e84f24a64413b7c1743482e903a6e8b93de33f2be8745","dweb:/ipfs/QmTWQ2GPWYKZTGEan1Xd9DbCjETrknPvxBR7be2uWGjmmV"]},"aux/ABDKMath64x64.sol":{"keccak256":"0x089b21db72314836305ba36b1773c3f0c2d5ac3a0f418820557c17c0e57c3c50","license":"BSD-4-Clause","urls":["bzz-raw://730ce8d750b0a6588f0d0724ace1c4d6dd90cf6dc0d2805b775b065fce147dfa","dweb:/ipfs/Qmdx7xRKvhXu1JtAVs25bER3LN2oGj2ZjW8jEvJpzQyXhc"]}},"version":1} +{"compiler":{"version":"0.8.18+commit.87f61d96"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"int128","name":"_decayLevel","type":"int128"},{"internalType":"uint256","name":"_periodMinutes","type":"uint256"},{"internalType":"address","name":"_defaultSinkAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_oldCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"Cap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"int128","name":"_foo","type":"int128"},{"indexed":true,"internalType":"uint256","name":"_bar","type":"uint256"}],"name":"Debug","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_periodCount","type":"uint256"},{"indexed":true,"internalType":"int128","name":"_oldAmount","type":"int128"},{"indexed":false,"internalType":"int128","name":"_newAmount","type":"int128"}],"name":"Decayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"Expired","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":true,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_period","type":"uint256"}],"name":"Period","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_account","type":"address"},{"indexed":true,"internalType":"uint256","name":"_period","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Redistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"actualPeriod","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"addWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyDemurrage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rounds","type":"uint256"}],"name":"applyDemurrageLimited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"applyExpiry","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"baseBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"decayBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decayLevel","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"deleteWriter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"demurrageAmount","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"}],"name":"demurrageCycles","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"demurrageTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"int128","name":"_demurrageAmount","type":"int128"}],"name":"getDistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"getDistributionFromRedistribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTimestamp","type":"uint256"}],"name":"getMinutesDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_periodCount","type":"uint256"}],"name":"getPeriodTimeDelta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"isEmptyRedistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintTo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redistributionCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"redistributions","outputs":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirePeriod","type":"uint256"}],"name":"setExpirePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cap","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sinkAddress","type":"address"}],"name":"setSinkAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sweep","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"toBaseAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"int128","name":"_demurrageModifier","type":"int128"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"toRedistribution","outputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionDemurrageModifier","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"period","type":"uint32"},{"internalType":"uint72","name":"value","type":"uint72"},{"internalType":"uint64","name":"demurrage","type":"uint64"}],"internalType":"struct DemurrageTokenSingleNocap.redistributionItem","name":"_redistribution","type":"tuple"}],"name":"toRedistributionSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{"balanceOf(address)":{"notice":"Implements ERC20"}},"version":1}},"settings":{"compilationTarget":{"DemurrageTokenSingleNocap.sol":"DemurrageTokenSingleNocap"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DemurrageTokenSingleNocap.sol":{"keccak256":"0xe432f3c664a764fc907f6314139f097e30320dc3813692ae1e2aca9e7e6b8f5b","license":"GPL-3.0-or-later","urls":["bzz-raw://c09533b6440d03f9bc9913ec7fe30cc2e94769d668876391ebf6ea4e96de4545","dweb:/ipfs/QmYFN5TxToX85fy9oaDDR5PKahJ1ycqPffDVbRvqduP8TA"]},"aux/ABDKMath64x64.sol":{"keccak256":"0x089b21db72314836305ba36b1773c3f0c2d5ac3a0f418820557c17c0e57c3c50","license":"BSD-4-Clause","urls":["bzz-raw://730ce8d750b0a6588f0d0724ace1c4d6dd90cf6dc0d2805b775b065fce147dfa","dweb:/ipfs/Qmdx7xRKvhXu1JtAVs25bER3LN2oGj2ZjW8jEvJpzQyXhc"]}},"version":1} diff --git a/python/setup.cfg b/python/setup.cfg index 6f0cdab..8f97fdc 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.4.0 +version = 0.4.1 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 9b3edbd..5aca545 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -242,7 +242,6 @@ contract DemurrageTokenSingleNocap { int128 baseBalance; int128 currentDemurragedAmount; uint256 periodCount; - uint8 expiryState; baseBalance = ABDKMath64x64.fromUInt(baseBalanceOf(_account)); @@ -260,7 +259,6 @@ contract DemurrageTokenSingleNocap { /// Increases base balance for a single account function increaseBaseBalance(address _account, uint256 _delta) private returns (bool) { uint256 oldBalance; - uint256 newBalance; uint256 workAccount; workAccount = uint256(account[_account]); @@ -277,7 +275,6 @@ contract DemurrageTokenSingleNocap { /// Decreases base balance for a single account function decreaseBaseBalance(address _account, uint256 _delta) private returns (bool) { uint256 oldBalance; - uint256 newBalance; uint256 workAccount; workAccount = uint256(account[_account]); @@ -327,6 +324,7 @@ contract DemurrageTokenSingleNocap { function toRedistribution(uint256 _participants, int128 _demurrageModifier, uint256 _value, uint256 _period) public pure returns(redistributionItem memory) { redistributionItem memory redistribution; + _participants; redistribution.period = uint32(_period); redistribution.value = uint72(_value); redistribution.demurrage = uint64(uint128(_demurrageModifier) & 0xffffffffffffffff); @@ -392,7 +390,7 @@ contract DemurrageTokenSingleNocap { return lastRedistribution; } - function getDistribution(uint256 _supply, int128 _demurrageAmount) public view returns (uint256) { + function getDistribution(uint256 _supply, int128 _demurrageAmount) public pure returns (uint256) { int128 difference; difference = ABDKMath64x64.mul(ABDKMath64x64.fromUInt(_supply), ABDKMath64x64.sub(ABDKMath64x64.fromUInt(1), _demurrageAmount)); @@ -400,7 +398,7 @@ contract DemurrageTokenSingleNocap { } - function getDistributionFromRedistribution(redistributionItem memory _redistribution) public returns (uint256) { + function getDistributionFromRedistribution(redistributionItem memory _redistribution) public pure returns (uint256) { uint256 redistributionSupply; int128 redistributionDemurrage; @@ -643,8 +641,6 @@ contract DemurrageTokenSingleNocap { // ERC20 transfer backend for transfer, transferFrom function transferBase(address _from, address _to, uint256 _value) private returns (bool) { - uint256 period; - decreaseBaseBalance(_from, _value); increaseBaseBalance(_to, _value); @@ -655,6 +651,7 @@ contract DemurrageTokenSingleNocap { function transferOwnership(address _newOwner) public returns (bool) { require(msg.sender == owner); newOwner = _newOwner; + return true; } // Implements OwnedAccepter @@ -666,6 +663,7 @@ contract DemurrageTokenSingleNocap { owner = newOwner; newOwner = address(0); emit OwnershipTransferred(oldOwner, owner); + return true; } // Explicitly and irretrievably burn tokens From f0525299358b2b6362ad0fc41cf00d6777a0eb17 Mon Sep 17 00:00:00 2001 From: lash Date: Wed, 22 Mar 2023 07:58:25 +0000 Subject: [PATCH 57/57] Fix burn interface implementation --- python/CHANGELOG | 2 ++ python/setup.cfg | 2 +- solidity/DemurrageTokenSingleNocap.sol | 9 ++++++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/python/CHANGELOG b/python/CHANGELOG index 2574ac9..1d4eea7 100644 --- a/python/CHANGELOG +++ b/python/CHANGELOG @@ -1,3 +1,5 @@ +- 0.4.2 + * Correct burn interface implementation - 0.4.1 * Eliminate solidity compiler warnings - 0.4.0 diff --git a/python/setup.cfg b/python/setup.cfg index 8f97fdc..f95b981 100644 --- a/python/setup.cfg +++ b/python/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = erc20-demurrage-token -version = 0.4.1 +version = 0.4.2 description = ERC20 token with redistributed continual demurrage author = Louis Holbrook author_email = dev@holbrook.no diff --git a/solidity/DemurrageTokenSingleNocap.sol b/solidity/DemurrageTokenSingleNocap.sol index 5aca545..0cb5051 100644 --- a/solidity/DemurrageTokenSingleNocap.sol +++ b/solidity/DemurrageTokenSingleNocap.sol @@ -668,7 +668,7 @@ contract DemurrageTokenSingleNocap { // Explicitly and irretrievably burn tokens // Only token minters can burn tokens - function burn(uint256 _value) public { + function burn(uint256 _value) public returns (bool) { require(applyExpiry() == 0); require(minter[msg.sender]); require(_value <= account[msg.sender]); @@ -678,6 +678,7 @@ contract DemurrageTokenSingleNocap { decreaseBaseBalance(msg.sender, _delta); burned += _value; emit Burn(msg.sender, _value); + return true; } // Implements ERC20 @@ -690,6 +691,12 @@ contract DemurrageTokenSingleNocap { return burned; } + // Return total number of tokens ever minted + function totalMinted() public view returns (uint256) { + return supply; + } + + // Implements EIP165 function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xc6bb4b70) { // ERC20