diff --git a/local-multi-validator/scripts/setup-genesis-auto.sh b/local-multi-validator/scripts/setup-genesis-auto.sh index baadd4cb7..db8701666 100755 --- a/local-multi-validator/scripts/setup-genesis-auto.sh +++ b/local-multi-validator/scripts/setup-genesis-auto.sh @@ -231,7 +231,7 @@ update_genesis '.app_state["gov"]["params"]["expedited_voting_period"]="150s"' # EVM update_genesis `printf '.app_state["evm"]["params"]["evm_denom"]="%s"' $DENOM` -update_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x00000000000000000000000000000000000000CB","0x00000000000000000000000000000000000000ca","0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805"]' +update_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805","0xEC00000000000000000000000000000000000001"]' # EVM Chain config update_genesis `printf '.app_state["evm"]["params"]["chain_config"]["chain_id"]=%s' $EVM_CHAIN_ID` diff --git a/local-native/scripts/setup-genesis-auto.sh b/local-native/scripts/setup-genesis-auto.sh index 6fb6eb72e..7560bea8d 100755 --- a/local-native/scripts/setup-genesis-auto.sh +++ b/local-native/scripts/setup-genesis-auto.sh @@ -113,7 +113,7 @@ update_genesis '.app_state["gov"]["params"]["max_deposit_period"]="300s"' update_genesis '.app_state["gov"]["params"]["voting_period"]="300s"' update_genesis '.app_state["gov"]["params"]["expedited_voting_period"]="60s"' update_genesis ".app_state[\"evm\"][\"params\"][\"evm_denom\"]=\"$DENOM\"" -update_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x00000000000000000000000000000000000000CB","0x00000000000000000000000000000000000000ca","0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805"]' +update_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805","0xEC00000000000000000000000000000000000001"]' update_genesis ".app_state[\"staking\"][\"params\"][\"bond_denom\"]=\"$DENOM\"" update_genesis ".app_state[\"mint\"][\"params\"][\"mint_denom\"]=\"$DENOM\"" update_genesis '.consensus["params"]["abci"]["vote_extensions_enable_height"]="2"' diff --git a/precompiles/usigverifier/genesis_scripts_test.go b/precompiles/usigverifier/genesis_scripts_test.go new file mode 100644 index 000000000..83468826d --- /dev/null +++ b/precompiles/usigverifier/genesis_scripts_test.go @@ -0,0 +1,63 @@ +package usigverifier_test + +import ( + "os" + "path/filepath" + "strings" + "testing" + + "github.com/stretchr/testify/require" + + usigverifierprecompile "github.com/pushchain/push-chain-node/precompiles/usigverifier" +) + +// legacyUSigVerifierAddress is where the Ed25519 signature verifier precompile +// used to live. Nothing is registered at it any more, so a genesis that still +// declares it active routes calls to an unimplemented address, which panics +// (recovered by baseapp, so the tx just fails). +const legacyUSigVerifierAddress = "0x00000000000000000000000000000000000000ca" + +// legacyUtxHashVerifierAddress is the other stale entry: the utxhashverifier +// precompile has no implementation anywhere in the tree, and the +// remove-utxverifier upgrade strips it from live chains. Leaving it in genesis +// would re-introduce on every fresh chain exactly the address that upgrade +// exists to remove. +const legacyUtxHashVerifierAddress = "0x00000000000000000000000000000000000000cb" + +// TestGenesisScriptsActivateCurrentVerifier guards the genesis half of +// F-2026-18829: a fresh chain must activate the address the verifier is actually +// registered at, and must not declare the legacy one. +func TestGenesisScriptsActivateCurrentVerifier(t *testing.T) { + repoRoot := filepath.Join("..", "..") + + scripts := []string{ + "scripts/test_node.sh", + "local-native/scripts/setup-genesis-auto.sh", + "local-multi-validator/scripts/setup-genesis-auto.sh", + "testnet/core/setup/setup_genesis_validator.sh", + } + + for _, script := range scripts { + t.Run(script, func(t *testing.T) { + raw, err := os.ReadFile(filepath.Join(repoRoot, script)) + require.NoError(t, err) + + var line string + for _, l := range strings.Split(string(raw), "\n") { + if strings.Contains(l, "active_static_precompiles") { + line = l + break + } + } + require.NotEmpty(t, line, "no active_static_precompiles assignment found") + + require.NotContains(t, strings.ToLower(line), strings.ToLower(legacyUSigVerifierAddress), + "genesis must not declare the legacy verifier address, nothing is registered at it") + require.NotContains(t, strings.ToLower(line), strings.ToLower(legacyUtxHashVerifierAddress), + "genesis must not declare the utxhashverifier address, nothing is registered at it") + require.Contains(t, strings.ToLower(line), + strings.ToLower(usigverifierprecompile.USigVerifierPrecompileAddress), + "genesis must activate the verifier address the node registers") + }) + } +} diff --git a/scripts/test_node.sh b/scripts/test_node.sh index c6881ae42..e2d07a3de 100755 --- a/scripts/test_node.sh +++ b/scripts/test_node.sh @@ -112,7 +112,7 @@ from_scratch () { update_test_genesis '.app_state["gov"]["params"]["expedited_voting_period"]="15s"' update_test_genesis `printf '.app_state["evm"]["params"]["evm_denom"]="%s"' $DENOM` - update_test_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x00000000000000000000000000000000000000CB","0x00000000000000000000000000000000000000ca","0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805"]' + update_test_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805","0xEC00000000000000000000000000000000000001"]' update_test_genesis '.app_state["erc20"]["params"]["native_precompiles"]=["0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE"]' # https://eips.ethereum.org/EIPS/eip-7528 update_test_genesis `printf '.app_state["erc20"]["token_pairs"]=[{contract_owner:1,erc20_address:"0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",denom:"%s",enabled:true}]' $DENOM` update_test_genesis '.app_state["feemarket"]["params"]["no_base_fee"]=false' diff --git a/test/utils/bytecode.go b/test/utils/bytecode.go index 3c054680e..5526ddfc0 100644 --- a/test/utils/bytecode.go +++ b/test/utils/bytecode.go @@ -2,8 +2,6 @@ package utils const UEA_EVM_BYTECODE = "6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c80631db61b54146100c95780635378c7aa146100c45780636eaf7ba3146100bf5780637d644a61146100ba5780638bcb651e146100b5578063a84813a4146100b0578063affed0e0146100ab578063c6f1b7e7146100a6578063f698da25146100a1578063f85135cc1461009c5763ffa1ad740361000e576108ac565b6107b3565b61068d565b610641565b610606565b610549565b610447565b6103f6565b610390565b61032f565b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760206040517f2aef22f9d7df5f9d21c56d14029233f3fdaa91917727e1eb68e504d27072d6cd8152f35b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761016e57604052565b610125565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761016e57604052565b604051906101c461012083610173565b565b73ffffffffffffffffffffffffffffffffffffffff81160361012157565b602435906101c4826101c6565b35906101c4826101c6565b67ffffffffffffffff811161016e57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b929192610242826101fc565b916102506040519384610173565b829481845281830111610121578281602093845f960137010152565b9080601f830112156101215781602061028793359101610236565b90565b3590600282101561012157565b91909161012081840312610121576102ad6101b4565b926102b7826101f1565b84526020820135602085015260408201359167ffffffffffffffff8311610121576102ea6101009261032794830161026c565b6040860152606081013560608601526080810135608086015260a081013560a086015260c081013560c086015260e081013560e08601520161028a565b610100830152565b346101215760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760043567ffffffffffffffff8111610121576103886103836020923690600401610297565b610935565b604051908152f35b346101215760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760243567ffffffffffffffff8111610121576103ec6103e4602092369060040161026c565b600435610af9565b6040519015158152f35b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261012157602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b346101215760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760043567ffffffffffffffff81116101215760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610121576040516104c081610152565b816004013567ffffffffffffffff8111610121576104e4906004369185010161026c565b8152602482013567ffffffffffffffff81116101215761050a906004369185010161026c565b6020820152604482013567ffffffffffffffff811161012157610018926004610536923692010161026c565b60408201526105436101e4565b90610ed6565b346101215760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760043567ffffffffffffffff8111610121576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610121576024359067ffffffffffffffff821161012157366023830112156101215781600401359067ffffffffffffffff8211610121573660248385010111610121576024610018930190600401611101565b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610121576020600554604051908152f35b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101215760206040517314191ea54b4c176fcf86f51b0fac7cb1e71df7d78152f35b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610121576020610388611496565b5f5b8381106106d65750505f910152565b81810151838201526020016106c7565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093610722815180928187528780880191016106c5565b0116010190565b906102879160208152604061078061074d84516060602086015260808501906106e6565b60208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe085830301848601526106e6565b9201519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828503019101526106e6565b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610121576060604080516107f081610152565b828152826020820152015261085960405161080a81610152565b6040516108218161081a816112d3565b0382610173565b81526040516108338161081a81611390565b60208201526040516108488161081a81611413565b604082015260405191829182610729565b0390f35b6040519061086c602083610173565b5f8252565b60405190610880604083610173565b600582527f312e302e300000000000000000000000000000000000000000000000000000006020830152565b34610121575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610121576108596108e5610871565b6040519182916020835260208301906106e6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b6002111561093057565b6108f9565b805173ffffffffffffffffffffffffffffffffffffffff1690610a4e6020820151610a2260408401516020815191012093606081015190608081015160a08201516005549161010060e08501519401519461098f86610926565b61099886610926565b604051998a9860208a019c8d9793610120979360ff97939b9a96929b73ffffffffffffffffffffffffffffffffffffffff6101408c019d7f1d8b43e5066bd20bfdacf7b8f4790c0309403b18434e3699ce3c5e57502ed8c48d521660208c015260408b015260608a0152608089015260a088015260c087015260e086015261010085015216910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610173565b519020610a22610aa2610a5f611496565b9260405192839160208301958690916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b51902090565b90600182811c92168015610aef575b6020831014610ac257565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610ab7565b610b0f91610b0691611858565b9092919261189c565b73ffffffffffffffffffffffffffffffffffffffff610b2f600354610aa8565b6003601f8211610ba8575b547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000081169160148110610b73575b505060601c91161490565b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009250829060140360031b1b16165f80610b68565b5060035f527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b610b3a565b818110610bde575050565b5f8155600101610bd3565b90601f8211610bf6575050565b6101c49160015f5260205f20906020601f840160051c83019310610c22575b601f0160051c0190610bd3565b9091508190610c15565b9190601f8111610c3b57505050565b6101c4925f5260205f20906020601f840160051c83019310610c2257601f0160051c0190610bd3565b90815167ffffffffffffffff811161016e57610c8c81610c85600254610aa8565b6002610c2c565b602092601f8211600114610cea57610cda929382915f92610cdf575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b600255565b015190505f80610ca8565b60025f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f5b868110610d8b5750836001959610610d54575b505050811b01600255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f8080610d49565b91926020600181928685015181550194019201610d36565b90815167ffffffffffffffff811161016e57610dcb81610dc4600354610aa8565b6003610c2c565b602092601f8211600114610e1d57610e18929382915f92610cdf5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b600355565b60035f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f5b868110610ebe5750836001959610610e87575b505050811b01600355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f8080610e7c565b91926020600181928685015181550194019201610e69565b919060045460ff81166110d9577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006001911617600455825192835167ffffffffffffffff811161016e57610f3481610f2f600154610aa8565b610be9565b6020601f8211600114610ffa5773ffffffffffffffffffffffffffffffffffffffff9392610fa083610fb8946040946101c4999a5f92610cdf5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b6001555b610fb16020820151610c64565b0151610da3565b1673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006006541617600655565b60015f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216957fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6965f5b8181106110c15750836101c4979860409473ffffffffffffffffffffffffffffffffffffffff989794610fb8976001951061108a575b505050811b01600155610fa4565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f808061107c565b83830151895560019098019760209384019301611046565b7f69783db7000000000000000000000000000000000000000000000000000000005f5260045ffd5b919060025f54146112ab5760025f557314191ea54b4c176fcf86f51b0fac7cb1e71df7d73303611254575b5050611139903690610297565b60e0810151801515908161124a575b506112225761116161115c60055460010190565b600555565b604081015161116f81611963565b156111fc575061117e90611c11565b905b156111c557507f3c72595b43537fb9a702f683573f82d3b3ad19487fd74cbb94728a41ec76d1cb6111b96005546040519182918261164d565b0390a16101c460015f55565b8051156111d457805190602001fd5b7facfdb444000000000000000000000000000000000000000000000000000000005f5260045ffd5b611205906119bc565b156112195761121390611a9a565b90611180565b61121390611a3f565b7ff87d9271000000000000000000000000000000000000000000000000000000005f5260045ffd5b905042115f611148565b90611271611277926112696103833687610297565b923691610236565b90610af9565b15611283575f8061112c565b7fc7dbd31d000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001545f92916112e282610aa8565b808252916001811690811561135657506001146112fd575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b83831061133c575060209250010190565b60018160209294939454838587010152019101919061132b565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6002545f929161139f82610aa8565b808252916001811690811561135657506001146113ba575050565b60025f9081529293509091907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b8383106113f9575060209250010190565b6001816020929493945483858701015201910191906113e8565b6003545f929161142282610aa8565b8082529160018116908115611356575060011461143d575050565b60035f9081529293509091907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b83831061147c575060209250010190565b60018160209294939454838587010152019101919061146b565b6040516114a68161081a81611390565b80515f9181156115c957905f915b81831061153557505050610a22610aa26114cc610871565b60208151910120604051928391602083019530918791606091949373ffffffffffffffffffffffffffffffffffffffff9160808501967f2aef22f9d7df5f9d21c56d14029233f3fdaa91917727e1eb68e504d27072d6cd86526020860152604085015216910152565b9091926115b46001916115ae6115a86115a261158361157d6115578b8a611749565b517fff000000000000000000000000000000000000000000000000000000000000001690565b60f81c90565b9361159d60ff8616603081101590816115bd575b5061175f565b6117f1565b9261180c565b60ff1690565b9061184b565b930191906114b4565b6039915011155f611597565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f456d70747920737472696e672063616e6e6f7420626520636f6e76657274656460448201527f2e000000000000000000000000000000000000000000000000000000000000006064820152fd5b9190604083525f6003549061166182610aa8565b918260408701526001811690815f146116dc5750600114611686575b60209150930152565b5060035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8282106116c5575060209150840160600161167d565b8054828701606001526020909101906001016116af565b60209390849350604092507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166060880152151560051b8601010161167d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b90815181101561175a570160200190565b61171c565b1561176657565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f6e2d64696769742063686172616374657220666f756e642e0000000000006044820152fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b90600a820291808304600a149015171561180757565b6117c4565b60ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd09116019060ff821161180757565b906004820180921161180757565b9190820180921161180757565b8151919060418303611888576118819250602082015190606060408401519301515f1a90611d65565b9192909190565b50505f9160029190565b6004111561093057565b6118a581611892565b806118ae575050565b6118b781611892565b600181036118e7577ff645eedf000000000000000000000000000000000000000000000000000000005f5260045ffd5b6118f081611892565b6002810361192457507ffce698f7000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b80611930600392611892565b146119385750565b7fd78bce0c000000000000000000000000000000000000000000000000000000005f5260045260245ffd5b60048151106119b757602001517fffffffff00000000000000000000000000000000000000000000000000000000167f2cc2842d000000000000000000000000000000000000000000000000000000001490565b505f90565b60048151106119b757602001517fffffffff00000000000000000000000000000000000000000000000000000000167fcac656d6000000000000000000000000000000000000000000000000000000001490565b3d15611a3a573d90611a21826101fc565b91611a2f6040519384610173565b82523d5f602084013e565b606090565b5f809173ffffffffffffffffffffffffffffffffffffffff8151166040602083015192015191602083519301915af1611a76611a10565b9091565b908160209103126101215751610287816101c6565b6040513d5f823e3d90fd5b80513073ffffffffffffffffffffffffffffffffffffffff90911603611ba15760200151611ba15760046020611b01611ae860065473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ff8ba7e030000000000000000000000000000000000000000000000000000000082525afa908115611bf8575f91611bc9575b5073ffffffffffffffffffffffffffffffffffffffff811615611ba1575f809160405160208101907f52fa5c2200000000000000000000000000000000000000000000000000000000825260048152611b95602482610173565b51915af4611a76611a10565b7fae962d4e000000000000000000000000000000000000000000000000000000005f5260045ffd5b611beb915060203d602011611bf1575b611be38183610173565b810190611a7a565b5f611b3b565b503d611bd9565b611a8f565b805182101561175a5760209160051b010190565b604001519081517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc810190811161180757611c64611c4e826101fc565b91611c5c6040519384610173565b8083526101fc565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020830193013684375f5b8251811015611cc55780611cb2611557611cac60019461183d565b88611749565b5f1a611cbe8286611749565b5301611c91565b509250906020611cd9928051010190611df4565b5f5b8151811015611d58575f80611d0e611cf38486611bfd565b515173ffffffffffffffffffffffffffffffffffffffff1690565b6020611d1a8587611bfd565b510151906040611d2a8688611bfd565b51015191602083519301915af1611d3f611a10565b908015611d50575050600101611cdb565b939092509050565b505060019061028761085d565b91907f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411611de9579160209360809260ff5f9560405194855216868401526040830152606082015282805260015afa15611bf8575f5173ffffffffffffffffffffffffffffffffffffffff811615611ddf57905f905f90565b505f906001905f90565b5050505f9160039190565b6020818303126101215780519067ffffffffffffffff821161012157019080601f830112156101215781519167ffffffffffffffff831161016e578260051b9160405193611e456020850186610173565b8452602080850193830101918183116101215760208101935b838510611e6d57505050505090565b845167ffffffffffffffff811161012157820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082860301126101215760405190611eb982610152565b6020810151611ec7816101c6565b825260408101516020830152606081015167ffffffffffffffff81116101215760209101019184601f8401121561012157825191611f04836101fc565b611f116040519182610173565b838152866020858701011161012157611f346020959486958680850191016106c5565b6040820152815201940193611e5e56fea26469706673582212202c80640fc4c48d71a0d3494f62b95ab7ca574ca348f3f949610dec582ff771d464736f6c634300081a0033" -const UEA_SVM_BYTECODE = "6080604052600436101561001a575b3615610018575f80fd5b005b5f3560e01c8063196359b3146100d95780635378c7aa146100d45780636eaf7ba3146100cf5780637d644a61146100ca5780638bcb651e146100c557806397b3a757146100c0578063a84813a4146100bb578063affed0e0146100b6578063c6f1b7e7146100b1578063f698da25146100ac578063f85135cc146100a75763ffa1ad740361000e576108f5565b6107fc565b6106d6565b61068a565b61064f565b610592565b610559565b610457565b610406565b6103a0565b61033f565b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760206040517f3aefc31558906b9b2c54de94f82a9b2455c24b4ba2b642ebb545ea2cc64a1e4b8152f35b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6060810190811067ffffffffffffffff82111761017e57604052565b610135565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761017e57604052565b604051906101d461012083610183565b565b73ffffffffffffffffffffffffffffffffffffffff81160361013157565b602435906101d4826101d6565b35906101d4826101d6565b67ffffffffffffffff811161017e57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b9291926102528261020c565b916102606040519384610183565b829481845281830111610131578281602093845f960137010152565b9080601f830112156101315781602061029793359101610246565b90565b3590600282101561013157565b91909161012081840312610131576102bd6101c4565b926102c782610201565b84526020820135602085015260408201359167ffffffffffffffff8311610131576102fa6101009261033794830161027c565b6040860152606081013560608601526080810135608086015260a081013560a086015260c081013560c086015260e081013560e08601520161029a565b610100830152565b346101315760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760043567ffffffffffffffff81116101315761039861039360209236906004016102a7565b610979565b604051908152f35b346101315760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760243567ffffffffffffffff8111610131576103fc6103f4602092369060040161027c565b6004356114cf565b6040519015158152f35b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013157602073ffffffffffffffffffffffffffffffffffffffff60065416604051908152f35b346101315760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760043567ffffffffffffffff81116101315760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610131576040516104d081610162565b816004013567ffffffffffffffff8111610131576104f4906004369185010161027c565b8152602482013567ffffffffffffffff81116101315761051a906004369185010161027c565b6020820152604482013567ffffffffffffffff811161013157610018926004610546923692010161027c565b60408201526105536101f4565b90610e40565b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261013157602060405160ca8152f35b346101315760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760043567ffffffffffffffff8111610131576101207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8236030112610131576024359067ffffffffffffffff821161013157366023830112156101315781600401359067ffffffffffffffff821161013157366024838501011161013157602461001893019060040161106b565b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610131576020600554604051908152f35b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760206040517314191ea54b4c176fcf86f51b0fac7cb1e71df7d78152f35b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610131576020610398611400565b5f5b83811061071f5750505f910152565b8181015183820152602001610710565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209361076b8151809281875287808801910161070e565b0116010190565b90610297916020815260406107c9610796845160606020860152608085019061072f565b60208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0858303018486015261072f565b9201519060607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08285030191015261072f565b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101315760606040805161083981610162565b82815282602082015201526108a260405161085381610162565b60405161086a816108638161123d565b0382610183565b815260405161087c81610863816112fa565b6020820152604051610891816108638161137d565b604082015260405191829182610772565b0390f35b604051906108b5602083610183565b5f8252565b604051906108c9604083610183565b600582527f312e302e300000000000000000000000000000000000000000000000000000006020830152565b34610131575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112610131576108a261092e6108ba565b60405191829160208352602083019061072f565b6002111561094c57565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b805173ffffffffffffffffffffffffffffffffffffffff1690610a926020820151610a6660408401516020815191012093606081015190608081015160a08201516005549161010060e0850151940151946109d386610942565b6109dc86610942565b604051998a9860208a019c8d9793610120979360ff97939b9a96929b73ffffffffffffffffffffffffffffffffffffffff6101408c019d7f1d8b43e5066bd20bfdacf7b8f4790c0309403b18434e3699ce3c5e57502ed8c48d521660208c015260408b015260608a0152608089015260a088015260c087015260e086015261010085015216910152565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610183565b519020610a66610ae6610aa3611400565b9260405192839160208301958690916042927f19010000000000000000000000000000000000000000000000000000000000008352600283015260228201520190565b51902090565b90600182811c92168015610b33575b6020831014610b0657565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b91607f1691610afb565b818110610b48575050565b5f8155600101610b3d565b90601f8211610b60575050565b6101d49160015f5260205f20906020601f840160051c83019310610b8c575b601f0160051c0190610b3d565b9091508190610b7f565b9190601f8111610ba557505050565b6101d4925f5260205f20906020601f840160051c83019310610b8c57601f0160051c0190610b3d565b90815167ffffffffffffffff811161017e57610bf681610bef600254610aec565b6002610b96565b602092601f8211600114610c5457610c44929382915f92610c49575b50507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b600255565b015190505f80610c12565b60025f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace915f5b868110610cf55750836001959610610cbe575b505050811b01600255565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f8080610cb3565b91926020600181928685015181550194019201610ca0565b90815167ffffffffffffffff811161017e57610d3581610d2e600354610aec565b6003610b96565b602092601f8211600114610d8757610d82929382915f92610c495750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b600355565b60035f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915f5b868110610e285750836001959610610df1575b505050811b01600355565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f8080610de6565b91926020600181928685015181550194019201610dd3565b919060045460ff8116611043577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff006001911617600455825192835167ffffffffffffffff811161017e57610e9e81610e99600154610aec565b610b53565b6020601f8211600114610f645773ffffffffffffffffffffffffffffffffffffffff9392610f0a83610f22946040946101d4999a5f92610c495750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8260011b9260031b1c19161790565b6001555b610f1b6020820151610bce565b0151610d0d565b1673ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006006541617600655565b60015f527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08216957fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6965f5b81811061102b5750836101d4979860409473ffffffffffffffffffffffffffffffffffffffff989794610f229760019510610ff4575b505050811b01600155610f0e565b01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88460031b161c191690555f8080610fe6565b83830151895560019098019760209384019301610fb0565b7f69783db7000000000000000000000000000000000000000000000000000000005f5260045ffd5b919060025f54146112155760025f557314191ea54b4c176fcf86f51b0fac7cb1e71df7d733036111be575b50506110a39036906102a7565b60e081015180151590816111b4575b5061118c576110cb6110c660055460010190565b600555565b60408101516110d98161166d565b1561116657506110e89061191e565b905b1561112f57507f3c72595b43537fb9a702f683573f82d3b3ad19487fd74cbb94728a41ec76d1cb6111236005546040519182918261159e565b0390a16101d460015f55565b80511561113e57805190602001fd5b7facfdb444000000000000000000000000000000000000000000000000000000005f5260045ffd5b61116f906116c6565b156111835761117d90611775565b906110ea565b61117d9061171a565b7ff87d9271000000000000000000000000000000000000000000000000000000005f5260045ffd5b905042115f6110b2565b906111db6111e1926111d361039336876102a7565b923691610246565b906114cf565b156111ed575f80611096565b7fa764e90c000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b6001545f929161124c82610aec565b80825291600181169081156112c05750600114611267575050565b60015f9081529293509091907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8383106112a6575060209250010190565b600181602092949394548385870101520191019190611295565b60209495507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0091509291921683830152151560051b010190565b6002545f929161130982610aec565b80825291600181169081156112c05750600114611324575050565b60025f9081529293509091907f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b838310611363575060209250010190565b600181602092949394548385870101520191019190611352565b6003545f929161138c82610aec565b80825291600181169081156112c057506001146113a7575050565b60035f9081529293509091907fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8383106113e6575060209250010190565b6001816020929493945483858701015201910191906113d5565b6114086108ba565b6020815191012060405160208101917f3aefc31558906b9b2c54de94f82a9b2455c24b4ba2b642ebb545ea2cc64a1e4b8352604082015260806060820152610ae68161145660a082016112fa565b306080830152037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610183565b3d156114b2573d906114998261020c565b916114a76040519384610183565b82523d5f602084013e565b606090565b90816020910312610131575180151581036101315790565b5f91610a6661154f849360405192839160208301957fbbdd82070000000000000000000000000000000000000000000000000000000087526060602485015261151a6084850161137d565b9160448501527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdc84830301606485015261072f565b519060ca5afa61155d611488565b90156115765780602080610297935183010191016114b7565b7ffd23ff64000000000000000000000000000000000000000000000000000000005f5260045ffd5b9190604083525f600354906115b282610aec565b918260408701526001811690815f1461162d57506001146115d7575b60209150930152565b5060035f9081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b82821061161657506020915084016060016115ce565b805482870160600152602090910190600101611600565b60209390849350604092507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166060880152151560051b860101016115ce565b60048151106116c157602001517fffffffff00000000000000000000000000000000000000000000000000000000167f2cc2842d000000000000000000000000000000000000000000000000000000001490565b505f90565b60048151106116c157602001517fffffffff00000000000000000000000000000000000000000000000000000000167fcac656d6000000000000000000000000000000000000000000000000000000001490565b5f809173ffffffffffffffffffffffffffffffffffffffff8151166040602083015192015191602083519301915af1611751611488565b9091565b908160209103126101315751610297816101d6565b6040513d5f823e3d90fd5b80513073ffffffffffffffffffffffffffffffffffffffff9091160361187c576020015161187c57600460206117dc6117c360065473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b604051928380927ff8ba7e030000000000000000000000000000000000000000000000000000000082525afa9081156118d3575f916118a4575b5073ffffffffffffffffffffffffffffffffffffffff81161561187c575f809160405160208101907ff6829c3200000000000000000000000000000000000000000000000000000000825260048152611870602482610183565b51915af4611751611488565b7fae962d4e000000000000000000000000000000000000000000000000000000005f5260045ffd5b6118c6915060203d6020116118cc575b6118be8183610183565b810190611755565b5f611816565b503d6118b4565b61176a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b80518210156119195760209160051b010190565b6118d8565b604001519081517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8101908111611a985761197161195b8261020c565b916119696040519384610183565b80835261020c565b917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe06020830193013684375f5b82518110156119f857806119e56119bf6119b9600194611ac5565b88611ad8565b517fff000000000000000000000000000000000000000000000000000000000000001690565b5f1a6119f18286611ad8565b530161199e565b509250906020611a0c928051010190611ae9565b5f5b8151811015611a8b575f80611a41611a268486611905565b515173ffffffffffffffffffffffffffffffffffffffff1690565b6020611a4d8587611905565b510151906040611a5d8688611905565b51015191602083519301915af1611a72611488565b908015611a83575050600101611a0e565b939092509050565b50506001906102976108a6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9060048201809211611ad357565b611a98565b908151811015611919570160200190565b6020818303126101315780519067ffffffffffffffff821161013157019080601f830112156101315781519167ffffffffffffffff831161017e578260051b9160405193611b3a6020850186610183565b8452602080850193830101918183116101315760208101935b838510611b6257505050505090565b845167ffffffffffffffff811161013157820160607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082860301126101315760405190611bae82610162565b6020810151611bbc816101d6565b825260408101516020830152606081015167ffffffffffffffff81116101315760209101019184601f8401121561013157825191611bf98361020c565b611c066040519182610183565b838152866020858701011161013157611c2960209594869586808501910161070e565b6040820152815201940193611b5356fea26469706673582212201ccb86d8429e38b976f7d8a6f0b6fbb7c3cbc64fa3443fe78c9f0ff9b68a483464736f6c634300081a0033" - const UEA_PROXY_BYTECODE = "608060405260043610610028575f3560e01c806323efa7ec14610032578063aaf10f4214610051575b6100306100a8565b005b34801561003d575f80fd5b5061003061004c366004610368565b6100ba565b34801561005c575f80fd5b507f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5460405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6100b86100b36102cc565b61034a565b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff165f811580156101045750825b90505f8267ffffffffffffffff1660011480156101205750303b155b90508115801561012e575080155b15610165576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156101c65784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b5f6101ef7f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff81161561023f576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d555083156102c45784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f806102f67f868a771a75a4aa6c2be13e9a9617cb8ea240ed84a3a90c8469537393ec3e115d5490565b905073ffffffffffffffffffffffffffffffffffffffff8116610345576040517fae962d4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b365f80375f80365f845af43d5f803e808015610364573d5ff35b3d5ffd5b5f60208284031215610378575f80fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461039b575f80fd5b939250505056fea2646970667358221220c4b8f9457567bdcd08b95faef7df86de4e9daead65e2db22018126d9eb77d85864736f6c634300081a0033" const HANDLER_CONTRACT_BYTECODE = "608080604052600436101561001c575b50361561001a575f80fd5b005b5f905f3560e01c908162bc574b14614b895750806301ffc9a714614ab5578063022d63fb14614a98578063049bf04c146149955780630615f0a2146149355780630840ba721461445e57806308af7f86146143fe5780630aa6220b146142bc5780631a4e49d4146142935780631a873ce4146142605780631c90064a14614200578063248a9ca3146141ae57806325c36c751461416a5780632f2ff15d146140df57806336568abe14613ef65780633f4ba83a14613e1b5780634243fbaa14613dd1578063447146a214613d875780634b1d2eeb14613d475780634d20d0f814613d145780634d49fbf314613b105780634eb7d1a114613ad05780634f882f3314613a6b57806355b487f1146139f9578063580fc6a9146138cc5780635b549182146138995780635c975abb14613858578063634e93da146136c35780636435967b14612eec578063649a5ec714612bc257806364f10e5014612b7857806368c70c9e14612b2d5780636ca752e314612ae25780636f419e31146129fd5780637574d9a0146129e0578063780ad8271461235d57806378a881271461233a578063801bee15146120d157806381fbadad146120b35780638377e2301461207f5780638456cb5914611f0c5780638468c05b14611ea557806384ef8ffc14611d6e57806387525a3714611d735780638da5cb5b14611d6e5780638f247b8c14611cc85780638f40e8f514611cab57806391d1485414611c34578063a1eda53c14611bae578063a217fddf14611b92578063a5172ddb14611b47578063a861469f14611afd578063ad14d38514611ab3578063b5d8349f14611a52578063b6322a9f14611a07578063b6aa5ce3146119eb578063bb88f3d9146119a0578063bfc7a3e4146118d2578063c6b54b3c14611897578063c6f1b7e714611846578063cc8463c81461181b578063cd20c6e8146117d6578063cefc14291461161f578063cf6eefb714611593578063d29c5c1c14611558578063d547741f146114c1578063d602b9fd14611426578063dbc1b464146113c5578063dd19e755146111af578063e229cd7614611192578063e63ab1e914611157578063ec87621c1461111c578063eefbaa3514610ffd578063f5b541a614610fc2578063f6b9ec7c14610fa5578063f881446714610820578063f8c8765e146104b8578063fb46e99d1461049a578063fc6b5de81461043c5763fcb6c2300361000f5734610439576040600319360112610439576103ac614cf6565b6024359081151580920361043557602073ffffffffffffffffffffffffffffffffffffffff7f42cc79f957a9535dc49c660eec62747fb540bef0dd29cd7f6c0a810816af4cff92169283855260038252604085207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0081541660ff8316179055604051908152a280f35b8280fd5b80fd5b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020610487816104743660048701614c7e565b8160405193828580945193849201614d5f565b8101601281520301902054604051908152f35b50346104395780600319360112610439576020600654604051908152f35b5034610439576080600319360112610439576104d2614cf6565b6104da614d19565b6104e2614d3c565b6064359173ffffffffffffffffffffffffffffffffffffffff831680930361081c577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549367ffffffffffffffff60ff8660401c1615951680159081610814575b600114908161080a575b159081610801575b506107d95773ffffffffffffffffffffffffffffffffffffffff92918380928760017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055610763575b6105eb615874565b6105f3615874565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00556106203361505c565b50167fffffffffffffffffffffffff0000000000000000000000000000000000000000600a541617600a55167fffffffffffffffffffffffff00000000000000000000000000000000000000006007541617600755167fffffffffffffffffffffffff000000000000000000000000000000000000000060085416176008557fffffffffffffffffffffffff000000000000000000000000000000000000000060095416176009556106cf5780f35b7fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160018152a180f35b680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00556105e3565b6004867ff92ee8a9000000000000000000000000000000000000000000000000000000008152fd5b9050155f610555565b303b15915061054d565b869150610543565b8480fd5b5060a060031936011261043957610835614cf6565b9061083e614dc3565b9160443591606435936084359273ffffffffffffffffffffffffffffffffffffffff8416928385036104395773ffffffffffffffffffffffffffffffffffffffff601054163303610f7d576108916154d7565b61089961552a565b8691839773ffffffffffffffffffffffffffffffffffffffff8216948515610f55578615610f55573415610f2d578815610f2d5762ffffff1615610eeb575b15610ec3575b824211610e9b5761099960208973ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a54169488861090815f14610e945786915b15610e8c57905b604051958694859384937f1698ee820000000000000000000000000000000000000000000000000000000085526004850191604091949373ffffffffffffffffffffffffffffffffffffffff62ffffff9281606087019816865216602085015216910152565b03915afa908115610d41579073ffffffffffffffffffffffffffffffffffffffff918491610e5d575b501615610e3557803b15610d3d5781600491604051928380927fd0e30db000000000000000000000000000000000000000000000000000000000825234905af18015610dd057908291610e20575b5050610a4f73ffffffffffffffffffffffffffffffffffffffff600a5416349073ffffffffffffffffffffffffffffffffffffffff6008541690615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a54169760405198610a7a8a614bb9565b89528460208a0152169182604089015230606089015260808801528560a08801523460c08801528060e08801526020610b6661010473ffffffffffffffffffffffffffffffffffffffff6008541699846040519b8c9485937fdb3e2198000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af1968715610e13578197610ddb575b50610bb273ffffffffffffffffffffffffffffffffffffffff600a541673ffffffffffffffffffffffffffffffffffffffff600854169061565a565b6040517f42966c6800000000000000000000000000000000000000000000000000000000815286600482015260208160248185885af1908115610dd0578291610da1575b5015610d795786340394348611610d4c57873403610c78575b505060606040967f01fd625a5ce1109c10761818e2ef64ea92cd4966d78086d37e5a4b50e322687892885191825287602083015288820152a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005582519182526020820152f35b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610435578280916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528c60048401525af18015610d41579183918893610d23575b5081809381925af1610cef614e7b565b5015610cfb5780610c0f565b807f90b8ec180000000000000000000000000000000000000000000000000000000060049252fd5b610d309193508290614c03565b610d3d578186915f610cdf565b5080fd5b6040513d85823e3d90fd5b6024827f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b807f66b2a6fe0000000000000000000000000000000000000000000000000000000060049252fd5b610dc3915060203d602011610dc9575b610dbb8183614c03565b810190614ed9565b5f610bf6565b503d610db1565b6040513d84823e3d90fd5b9096506020813d602011610e0b575b81610df760209383614c03565b81010312610e075751955f610b76565b5f80fd5b3d9150610dea565b50604051903d90823e3d90fd5b81610e2a91614c03565b61043957805f610a10565b6004827f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b610e7f915060203d602011610e85575b610e778183614c03565b810190614fac565b5f6109c2565b503d610e6d565b508590610933565b809161092c565b6004827f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9150600654603c810290808204603c1490151715610d4c57610ee5904261504f565b916108de565b8483526004602052604083205462ffffff169850886108d8575b6004837f3733548a000000000000000000000000000000000000000000000000000000008152fd5b6004847f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004847fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b807fbce361b00000000000000000000000000000000000000000000000000000000060049252fd5b503461043957806003193601126104395760206040516101f48152f35b503461043957806003193601126104395760206040517f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9298152f35b50346104395760606003193601126104395760043567ffffffffffffffff8111610d3d5761102f903690600401614c7e565b60243560443581156110f457916110dd917f5e41bf0052b493123a63e4e0d9095ed4324108e489d58c9a0948b2be366ac8c6936110b8604051838551916020818189019461107e818388614d5f565b8101600b8152030190205582604051602081885161109d818388614d5f565b81016011815203019020556040519182918651928391614d5f565b8101906012825260208142930301902055604051938493608085526080850190614d80565b91602084015260408301524260608301520390a180f35b6004847fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040517f241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b088152f35b503461043957806003193601126104395760206040517f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a8152f35b503461043957806003193601126104395760206040516113888152f35b5034610439576040600319360112610439576111c9614cf6565b602435604080516111da8282614c03565b600f815260208101927f6569703135353a3131313535313131000000000000000000000000000000000084528251865b600f81106113b257506014600f820152602f90205490811561138a578061134b5750915b73ffffffffffffffffffffffffffffffffffffffff8151602081855161125581838b614d5f565b8101600c815203019020541693841561132357602061127e918351809381928751928391614d5f565b8101600b815203019020549081156112fb57806112f1949596976112a185615421565b73ffffffffffffffffffffffffffffffffffffffff6112c08886614ec6565b991681526013602052205490805197889788526020880152860152606085015260c0608085015260c0840190614d80565b9060a08301520390f35b6004877fe661aed0000000000000000000000000000000000000000000000000000000008152fd5b6004877fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b929080841061135a575061122e565b86604491857fff632bea000000000000000000000000000000000000000000000000000000008352600452602452fd5b6004877fba496b84000000000000000000000000000000000000000000000000000000008152fd5b806020809286010151818401520161120a565b5034610439576020600319360112610439576004359067ffffffffffffffff821161043957602073ffffffffffffffffffffffffffffffffffffffff611412826104743660048801614c7e565b8101600c8152030190205416604051908152f35b503461043957806003193601126104395761143f6152ab565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840080547fffffffffffff0000000000000000000000000000000000000000000000000000811690915560a01c65ffffffffffff1661149a5780f35b7f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a96051098180a180f35b5034610439576040600319360112610439576004356114de614d19565b90801561153057908161152761152261152c945f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b61539b565b615aa7565b5080f35b6004837f3fc3c27a000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040517fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c98152f35b5034610439578060031936011261043957604065ffffffffffff6115f97feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549065ffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169260a01c1690565b73ffffffffffffffffffffffffffffffffffffffff849392935193168352166020820152f35b50346104395780600319360112610439577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005473ffffffffffffffffffffffffffffffffffffffff1633036117aa577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005473ffffffffffffffffffffffffffffffffffffffff81169060a01c65ffffffffffff16801580156117a0575b611775575061170b9061170573ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154166159dd565b5061505c565b507fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005580f35b7f19ca5ebb000000000000000000000000000000000000000000000000000000008352600452602482fd5b50428110156116bc565b807fc22c8022000000000000000000000000000000000000000000000000000000006024925233600452fd5b503461043957602060031936011261043957604060209173ffffffffffffffffffffffffffffffffffffffff61180a614cf6565b168152601383522054604051908152f35b50346104395780600319360112610439576020611836614fd8565b65ffffffffffff60405191168152f35b5034610439578060031936011261043957602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b503461043957806003193601126104395760206040517f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa334421008152f35b50346104395760206003193601126104395773ffffffffffffffffffffffffffffffffffffffff611901614cf6565b611909615313565b1680156119785773ffffffffffffffffffffffffffffffffffffffff601054827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617601055167fda4281cd6f2da5f8862b210df953c55b2e8c441b67821264ef4a35ca833fc2a78380a380f35b6004827fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5034610439576020600319360112610439576004359067ffffffffffffffff82116104395760206119d8816104743660048701614c7e565b8101601681520301902054604051908152f35b5034610439578060031936011261043957602060405160648152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020611a3f816104743660048701614c7e565b8101601581520301902054604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff821161043957602073ffffffffffffffffffffffffffffffffffffffff611a9f826104743660048801614c7e565b8101600d8152030190205416604051908152f35b50346104395760206003193601126104395760ff604060209273ffffffffffffffffffffffffffffffffffffffff611ae9614cf6565b168152600384522054166040519015158152f35b50346104395760206003193601126104395762ffffff604060209273ffffffffffffffffffffffffffffffffffffffff611b35614cf6565b16815260048452205416604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020611b7f816104743660048701614c7e565b8101600b81520301902054604051908152f35b5034610439578060031936011261043957602090604051908152f35b50346104395780600319360112610439577feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c9182151580611c2a575b15611c21575060a01c65ffffffffffff165b6040805165ffffffffffff928316815292909116602083015290f35b0390f35b91505080611c01565b5042831015611bef565b50346104395760406003193601126104395773ffffffffffffffffffffffffffffffffffffffff6040611c65614d19565b9260043581527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020522091165f52602052602060ff60405f2054166040519015158152f35b50346104395780600319360112610439576020604051610bb88152f35b50346104395760206003193601126104395773ffffffffffffffffffffffffffffffffffffffff611cf7614cf6565b611cff615313565b1680156119785773ffffffffffffffffffffffffffffffffffffffff600a54827fffffffffffffffffffffffff0000000000000000000000000000000000000000821617600a55167f3aa820195fb2daaa2fb7669944e7c9eccf99303478e74f09887bd8fe649b9c588380a380f35b614e29565b503461043957604060031936011261043957611d8d614cf6565b73ffffffffffffffffffffffffffffffffffffffff611daa614d19565b91611db3615313565b169081158015611e87575b611e5f578173ffffffffffffffffffffffffffffffffffffffff6040927f37af3ddd829f67f886ff225a9b652d2104f68d4cba4cbc989264fa5ef7621ac1947fffffffffffffffffffffffff0000000000000000000000000000000000000000600754161760075516807fffffffffffffffffffffffff0000000000000000000000000000000000000000600854161760085582519182526020820152a180f35b6004837fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b5073ffffffffffffffffffffffffffffffffffffffff811615611dbe565b5034610439577f8529702b0bf1b5d9d01b0c119b695d9365ef62dc9f5e6a87c24f77bb38fd6518611ed536614cc4565b90816040516020818451611eec8183858901614d5f565b8101601681520301902055611f0660405192839283614eaa565b0390a180f35b50346104395780600319360112610439577f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020526040812073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f2054161561202f57611f996154d7565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff007fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005416177fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586020604051338152a180f35b807fe2517d3f0000000000000000000000000000000000000000000000000000000060449252336004527f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a602452fd5b5034610439578060031936011261043957602073ffffffffffffffffffffffffffffffffffffffff60105416604051908152f35b50346104395780600319360112610439576020600e54604051908152f35b50346104395760606003193601126104395760043567ffffffffffffffff8111610d3d57612103903690600401614c7e565b61210b614d19565b60443562ffffff81169182820361081c5773ffffffffffffffffffffffffffffffffffffffff8116801561231257916020916121ee9373ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541691821091825f1461230b5780925b1561230357506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156122f85773ffffffffffffffffffffffffffffffffffffffff9185916122d9575b50169081156122b157916122a0917f21e3c1439de176cb39006e603b26a8d890fe2267c804597e40d2954871141d7d93604051602081855161225a8183858a01614d5f565b8101600d815203019020827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051938493606085526060850190614d80565b91602084015260408301520390a180f35b6004847f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6122f2915060203d602011610e8557610e778183614c03565b5f612215565b6040513d86823e3d90fd5b905090610933565b8192612182565b6004867fd92e233d000000000000000000000000000000000000000000000000000000008152fd5b50346104395761235a61234c36614dd5565b916123556154d7565b614ef1565b80f35b50346104395760c060031936011261043957612377614cf6565b60243590612383614d3c565b906064359262ffffff8416908185036127c75760843560a435936123a56154d7565b6123ad61552a565b6123b88684836155a1565b8473ffffffffffffffffffffffffffffffffffffffff821697888a52600360205260ff60408b205416156129b8579415612977575b15612922575b8442116128fa576020846124b0928a73ffffffffffffffffffffffffffffffffffffffff600754169173ffffffffffffffffffffffffffffffffffffffff600a541690818d10805f146128f35781935b501561230357506040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156128795773ffffffffffffffffffffffffffffffffffffffff9189916128d4575b5016156128ac578015612884576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018390526020816044818b8b5af190811561287957889161285a575b5015612832576125588273ffffffffffffffffffffffffffffffffffffffff6008541688615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a5416936040519461258386614bb9565b8886526020808701918252929091166040808701828152306060890190815260808901998a5260a0890188815260c08a0188815260e08b018f815260085495517f414bf3890000000000000000000000000000000000000000000000000000000081529b5173ffffffffffffffffffffffffffffffffffffffff90811660048e01529751881660248d0152935162ffffff1660448c01529151861660648b0152995160848a0152985160a4890152975160c48801529651821660e48701529585916101049183918c91165af19283156128275787936127f3575b5082106127cb5761268673ffffffffffffffffffffffffffffffffffffffff600854168661565a565b8573ffffffffffffffffffffffffffffffffffffffff600a5416803b15610d3d578180916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528960048401525af18015610dd0576127b2575b5080808085885af16126f9614e7b565b501561278a57927ff5d6ca9b390b5271e0cbb3d43b4d708d5b17804cb81a4c65e027226d87ccf0e2949273ffffffffffffffffffffffffffffffffffffffff9260c09584600a54169060405196875260208701526040860152606085015260808401521660a0820152a160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f90b8ec18000000000000000000000000000000000000000000000000000000008152fd5b816127bc91614c03565b6127c757855f6126e9565b8580fd5b6004867f8199f5f3000000000000000000000000000000000000000000000000000000008152fd5b9092506020813d60201161281f575b8161280f60209383614c03565b81010312610e075751915f61265d565b3d9150612802565b6040513d89823e3d90fd5b6004877f66b2a6fe000000000000000000000000000000000000000000000000000000008152fd5b612873915060203d602011610dc957610dbb8183614c03565b5f61252f565b6040513d8a823e3d90fd5b6004877f1f2a2005000000000000000000000000000000000000000000000000000000008152fd5b6004877f76ecffc0000000000000000000000000000000000000000000000000000000008152fd5b6128ed915060203d602011610e8557610e778183614c03565b5f6124d7565b8293612443565b6004887f1ab7da6b000000000000000000000000000000000000000000000000000000008152fd5b9350600654603c810290808204603c149015171561294a57612944904261504f565b936123f3565b6024887f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b8789526004602052604089205462ffffff169450846123ed576004897f3733548a000000000000000000000000000000000000000000000000000000008152fd5b60048a7f4e38f95a000000000000000000000000000000000000000000000000000000008152fd5b503461043957806003193601126104395760206040516127108152f35b503461043957604060031936011261043957612a17614cf6565b73ffffffffffffffffffffffffffffffffffffffff612a34614dc3565b9116908115611e5f5762ffffff16606481141580612ad6575b80612aca575b80612abe575b610f055760207f5734dc08ec8c21bd34e0f102d90ea2d1a9dbdcf23e787dc8744d2d0dd227fc73918385526004825260408520817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000825416179055604051908152a280f35b50612710811415612a59565b50610bb8811415612a53565b506101f4811415612a4d565b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020612b1a816104743660048701614c7e565b8101601481520301902054604051908152f35b5034610439576020600319360112610439576004359067ffffffffffffffff8211610439576020612b65816104743660048701614c7e565b8101601181520301902054604051908152f35b503461043957612b9b612b8a36614dd5565b91612b936154d7565b61235561552a565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b50346104395760206003193601126104395760043565ffffffffffff811680820361043557612bef6152ab565b612bf842615b7a565b9065ffffffffffff612c08614fd8565b1680821115612e8457507ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b929165ffffffffffff826206978080612c569510911802620697801816906154b9565b907feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c80612dc3575b5050612d13817fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff79ffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401549260a01b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b612da18279ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401549260d01b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b6040805165ffffffffffff928316815292909116602083015281908101611f06565b421115612e5a5779ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549260301b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400555b5f80612c83565b507f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec58480a1612e53565b0365ffffffffffff8111612ebf577ff1038c18cf84a56e432fdbfaf746924b7ea511dfe03a6506a0ceba4888788d9b9291612c5691906154b9565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b5034610e075760c0600319360112610e0757612f06614cf6565b602435612f11614d3c565b6064358015908115809103610e075760843562ffffff811690818103610e075760a43573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361369b57612f796154d7565b612f8161552a565b612f8c86888a6155a1565b5f94156130d85750506040517f47e7ef2400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602481018690529050602081806044810103818a73ffffffffffffffffffffffffffffffffffffffff8b165af19081156128275787916130b9575b50156130915773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e49360609382935b6040519788526020880152604087015216941692a360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f005580f35b6004867f66b2a6fe000000000000000000000000000000000000000000000000000000008152fd5b6130d2915060203d602011610dc957610dbb8183614c03565b5f613012565b809192939450156136735773ffffffffffffffffffffffffffffffffffffffff871691825f52600360205260ff60405f2054161561364b579215613609575b600654603c810290808204603c14901517156135dc57613137904261504f565b8042116135b4576131ef60208573ffffffffffffffffffffffffffffffffffffffff6007541673ffffffffffffffffffffffffffffffffffffffff600a541680881090815f146135ad578d915b156135a5576040517f1698ee8200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff92831660048201529116602482015262ffffff90921660448301529092839190829081906064820190565b03915afa80156134b05773ffffffffffffffffffffffffffffffffffffffff915f91613586575b50161561355e576040517f47e7ef24000000000000000000000000000000000000000000000000000000008152306004820152602481018890526020816044815f885af19081156134b0575f9161353f575b5015613517576132918773ffffffffffffffffffffffffffffffffffffffff6008541685615760565b62ffffff73ffffffffffffffffffffffffffffffffffffffff600a541694604051956132bc87614bb9565b858752602087015216604085015230606085015260808401528560a08401528060c08401525f60e084015260206133a661010473ffffffffffffffffffffffffffffffffffffffff60085416955f60405197889485937f414bf389000000000000000000000000000000000000000000000000000000008552600485019073ffffffffffffffffffffffffffffffffffffffff60e0809282815116855282602082015116602086015262ffffff60408201511660408601528260608201511660608601526080810151608086015260a081015160a086015260c081015160c0860152015116910152565b5af19283156134b0575f936134e3575b5082106134bb576133e09073ffffffffffffffffffffffffffffffffffffffff600854169061565a565b73ffffffffffffffffffffffffffffffffffffffff600a5416803b15610e07575f80916024604051809481937f2e1a7d4d0000000000000000000000000000000000000000000000000000000083528760048401525af180156134b05761349b575b508580808084875af1613453614e7b565b501561278a5773ffffffffffffffffffffffffffffffffffffffff7ffa6ff091ec99bdfd127d51e7786764f2ff7e39f866bbb2a2996e1597052641e493606093829390613055565b6134a89196505f90614c03565b5f945f613442565b6040513d5f823e3d90fd5b7f8199f5f3000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d60201161350f575b816134ff60209383614c03565b81010312610e075751915f6133b6565b3d91506134f2565b7f66b2a6fe000000000000000000000000000000000000000000000000000000005f5260045ffd5b613558915060203d602011610dc957610dbb8183614c03565b5f613268565b7f76ecffc0000000000000000000000000000000000000000000000000000000005f5260045ffd5b61359f915060203d602011610e8557610e778183614c03565b5f613216565b508c90610933565b8091613184565b7f1ab7da6b000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9150805f52600460205262ffffff60405f2054169182613117577f3733548a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f4e38f95a000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f22c50cbf000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f53e51723000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576020600319360112610e07576136dc614cf6565b6136e46152ab565b7f3377dc44241e779dd06afab5b788a35ca5f3b778836e2990bdb26a2a4b2e5ed6602061372161371342615b7a565b61371b614fd8565b906154b9565b65ffffffffffff73ffffffffffffffffffffffffffffffffffffffff6137897feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549065ffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169260a01c1690565b96905016947feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054867fffffffffffff000000000000000000000000000000000000000000000000000079ffffffffffff00000000000000000000000000000000000000008660a01b16921617177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400551661382f575b65ffffffffffff60405191168152a2005b7f8886ebfc4259abdbc16601dd8fb5678e54878f47b3c34836cfc51154a96051095f80a161381e565b34610e07575f600319360112610e0757602060ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330054166040519015158152f35b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff60075416604051908152f35b34610e07576040600319360112610e075760043567ffffffffffffffff8111610e07576138fd903690600401614c7e565b73ffffffffffffffffffffffffffffffffffffffff61391a614d19565b1680156139d1577f0c7d242571a289736ea536c54ebe236d31ba62abfd4f22b8d54d2988dc0dd949916139c6915f6139a76020604051855190828181890193613964818387614d5f565b8101600c815203019020857fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055604051809381928851928391614d5f565b8101600b81520301902055604051928392604084526040840190614d80565b9060208301520390a1005b7fd92e233d000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576040600319360112610e0757613a12614cf6565b73ffffffffffffffffffffffffffffffffffffffff1660243581156139d15760207f911a025fb070fa2a29c37a3bf4c00d16acf15583cd050f17bdbacbab7e72320391835f52601382528060405f2055604051908152a2005b34610e07577f57ad858a99d9aee6f1fd395e454bb1659eb8500ccb081c729a103dc2247ba3a4613a9a36614cc4565b90816040516020818451613ab18183858901614d5f565b8101601581520301902055613acb60405192839283614eaa565b0390a1005b34610e07576020600319360112610e07576004355f526002602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610e07576020600319360112610e075760045f73ffffffffffffffffffffffffffffffffffffffff613b41614cf6565b16604051928380927fa0c50b690000000000000000000000000000000000000000000000000000000082525afa9081156134b0575f91613c9b575b5060405181519060208181850193613b95818387614d5f565b8101601581520301902054918215613c735773ffffffffffffffffffffffffffffffffffffffff6040516020818451613bcf818389614d5f565b8101600c81520301902054169182156139d1576020613bf991604051809381928651928391614d5f565b8101600b81520301902054908115613c4b57611c1d91613c1882615421565b613c228582614ec6565b94604051958695865260208601526040850152606084015260a0608084015260a0830190614d80565b7fe661aed0000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f9502a873000000000000000000000000000000000000000000000000000000005f5260045ffd5b90503d805f833e613cac8183614c03565b810190602081830312610e075780519067ffffffffffffffff8211610e07570181601f82011215610e07578051613ce281614c44565b92613cf06040519485614c03565b81845260208284010111610e0757613d0e9160208085019101614d5f565b81613b7c565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff60095416604051908152f35b34610e07576020600319360112610e07576004355f526001602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b34610e07576020600319360112610e075760043567ffffffffffffffff8111610e0757613dbe602061047481933690600401614c7e565b8101601881520301902054604051908152f35b34610e07576020600319360112610e075760043567ffffffffffffffff8111610e0757613e08602061047481933690600401614c7e565b8101601781520301902054604051908152f35b34610e07575f600319360112610e0757613e33615313565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff811615613ece577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00167fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6020604051338152a1005b7f8dfc202b000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576040600319360112610e0757600435613f12614d19565b811580614089575b613f6d575b3373ffffffffffffffffffffffffffffffffffffffff821603613f455761001a91615aa7565b7f6697b232000000000000000000000000000000000000000000000000000000005f5260045ffd5b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005465ffffffffffff60a082901c169073ffffffffffffffffffffffffffffffffffffffff1615801590614079575b8015614067575b61403357507fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840054167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840055613f1f565b65ffffffffffff907f19ca5ebb000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b504265ffffffffffff82161015613fc3565b5065ffffffffffff811615613fbc565b5073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff821614613f1a565b34610e07576040600319360112610e07576004356140fb614d19565b8115614142578161413d61152261001a945f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b6151d0565b7f3fc3c27a000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07576020600319360112610e07577f424b07caa75ce8e1c3985f334273f957db9ce138de114e48e50d8240d4d7300b602060043580600655604051908152a1005b34610e07576020600319360112610e075760206141f86004355f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800602052600160405f20015490565b604051908152f35b34610e07577f507273e640affcefbad497278a9b264a65c62c430dd92d24dd0d58595529539c61422f36614cc4565b908160405160208184516142468183858901614d5f565b8101601781520301902055613acb60405192839283614eaa565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff600a5416604051908152f35b34610e07576020600319360112610e07576004355f525f602052602060405f2054604051908152f35b34610e07575f600319360112610e07576142d46152ab565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c8061433d575b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401805473ffffffffffffffffffffffffffffffffffffffff169055005b4211156143d45779ffffffffffffffffffffffffffffffffffffffffffffffffffff7fffffffffffff00000000000000000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400549260301b169116177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400555b8080614300565b507f2b1fa2edafe6f7b9e97c1a9e0c3660e645beb2dcaa2d45bdbf9beaf5472e1ec55f80a16143cd565b34610e07577f882f47825d4043cd04a564cad4f524a7fe00a604ae024c23dbc8065b77668b4761442d36614cc4565b908160405160208184516144448183858901614d5f565b8101601481520301902055613acb60405192839283614eaa565b34610e07576040600319360112610e0757614477614cf6565b61447f614d19565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460ff8160401c1690811561491f575b506148f7577ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0080547fffffffffffffffffffffffffffffffffffffffffffffff000000000000000000166801000000000000000217905573ffffffffffffffffffffffffffffffffffffffff8216158080156148d9575b6139d157614533615874565b61453b615874565b6148ad57614813614819927c015180000000000000000000000000000000000000000000000000000079ffffffffffffffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698400556145ce8161505c565b507fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c95f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527fe3e0a451f4d1f165b1071ce13280fc8d1dfe94c2663176890cdb309635afb92180547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a47f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9295f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb45780547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a47f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a5f8181527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b6268006020527f75442b0a96088b5456bc4ed01394c96a4feec0f883c9494257d76b96ab1c9b6c80547f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa3344210091829055909290917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9080a461480381615128565b5061480d81615152565b5061517c565b506151a6565b507fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00557fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2602060405160028152a1005b7fc22c8022000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b5073ffffffffffffffffffffffffffffffffffffffff821615614527565b7ff92ee8a9000000000000000000000000000000000000000000000000000000005f5260045ffd5b6002915067ffffffffffffffff161015836144b0565b34610e07577f2d57170c913282d2886a5ace7e18bed8b1c53a069f2698ae9e048bd501f3af3b61496436614cc4565b9081604051602081845161497b8183858901614d5f565b8101601881520301902055613acb60405192839283614eaa565b34610e07576040600319360112610e075760043573ffffffffffffffffffffffffffffffffffffffff8116809103610e075760243581156139d1578015614a7057478111614a48575f80808084865af16149ed614e7b565b5015614a205760207f8fcd857d6e51ec18860a6c21c1772d69a342074fbae5225c8f11f8cdf00a049691604051908152a2005b7f90b8ec18000000000000000000000000000000000000000000000000000000005f5260045ffd5b7ff4d678b8000000000000000000000000000000000000000000000000000000005f5260045ffd5b7f1f2a2005000000000000000000000000000000000000000000000000000000005f5260045ffd5b34610e07575f600319360112610e07576020604051620697808152f35b34610e07576020600319360112610e07576004357fffffffff000000000000000000000000000000000000000000000000000000008116809103610e0757807f314987860000000000000000000000000000000000000000000000000000000060209214908115614b2c575b506040519015158152f35b7f7965db0b00000000000000000000000000000000000000000000000000000000811491508115614b5f575b5082614b21565b7f01ffc9a70000000000000000000000000000000000000000000000000000000091501482614b58565b34610e07575f600319360112610e075760209073ffffffffffffffffffffffffffffffffffffffff600854168152f35b610100810190811067ffffffffffffffff821117614bd657604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117614bd657604052565b67ffffffffffffffff8111614bd657601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f82011215610e0757803590614c9582614c44565b92614ca36040519485614c03565b82845260208383010111610e0757815f926020809301838601378301015290565b6040600319820112610e07576004359067ffffffffffffffff8211610e0757614cef91600401614c7e565b9060243590565b6004359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b6024359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b6044359073ffffffffffffffffffffffffffffffffffffffff82168203610e0757565b5f5b838110614d705750505f910152565b8181015183820152602001614d61565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602093614dbc81518092818752878088019101614d5f565b0116010190565b6024359062ffffff82168203610e0757565b6003196060910112610e075760043573ffffffffffffffffffffffffffffffffffffffff81168103610e0757906024359060443573ffffffffffffffffffffffffffffffffffffffff81168103610e075790565b34610e07575f600319360112610e0757602073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416604051908152f35b3d15614ea5573d90614e8c82614c44565b91614e9a6040519384614c03565b82523d5f602084013e565b606090565b929190614ec1602091604086526040860190614d80565b930152565b818102929181159184041417156135dc57565b90816020910312610e0757518015158103610e075790565b90602091614f7293614f048184846155a1565b5f73ffffffffffffffffffffffffffffffffffffffff6040518097819682957f47e7ef24000000000000000000000000000000000000000000000000000000008452600484016020909392919373ffffffffffffffffffffffffffffffffffffffff60408201951681520152565b0393165af19081156134b0575f91614f8d575b501561351757565b614fa6915060203d602011610dc957610dbb8183614c03565b5f614f85565b90816020910312610e07575173ffffffffffffffffffffffffffffffffffffffff81168103610e075790565b7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401548060d01c8015159081615045575b501561501c5760a01c65ffffffffffff1690565b507feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984005460d01c90565b905042115f615008565b919082018092116135dc57565b73ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416614142578061511f6151259273ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b5f6158cb565b90565b615125907f0f6ee822d2ee125e4ce6edbae6c10a76fa9fd4617e0399ab687226fa334421006158cb565b615125907fe53b6cbb4204145187ea4c9b95f311e9ee4f2690cdb9b3a219f863f3a71e06c96158cb565b615125907f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b9296158cb565b615125907f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6158cb565b9081156151e1575b615125916158cb565b73ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541661414257615125916152a48273ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d86984015416177feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155565b91506151d8565b335f9081527fb7db2dd08fcb62d0c9e08c51941cae53c267786a0b75803fb7960902fc8ef97d602052604090205460ff16156152e357565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004525f60245260445ffd5b335f9081527f448256db8f8fb95ee3eaaf89c1051414494e85cebb6057fcf996cc3d0ccfb456602052604090205460ff161561534b57565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f52336004527f97667070c54ef182b0f5858b034beac1b6f3089aa2d3188bb1e8929f4fa9b92960245260445ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff33165f5260205260ff60405f205416156153f25750565b7fe2517d3f000000000000000000000000000000000000000000000000000000005f523360045260245260445ffd5b60405181519060208181850193615439818387614d5f565b81016016815203019020549182156154b45761546391602091604051938492839251928391614d5f565b8101601281520301902054615478828261504f565b4211615482575050565b7f2056463c000000000000000000000000000000000000000000000000000000005f526004524260245260445260645ffd5b505050565b9065ffffffffffff8091169116019065ffffffffffff82116135dc57565b60ff7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300541661550257565b7fd93c0665000000000000000000000000000000000000000000000000000000005f5260045ffd5b60027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0054146155795760027f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f3ee5aeb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b90919073ffffffffffffffffffffffffffffffffffffffff16156139d15773ffffffffffffffffffffffffffffffffffffffff1680156139d15773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168114908115615650575b506156285715614a7057565b7f82d5d76a000000000000000000000000000000000000000000000000000000005f5260045ffd5b905030145f61561c565b6040519060205f73ffffffffffffffffffffffffffffffffffffffff828501957f095ea7b30000000000000000000000000000000000000000000000000000000087521694856024860152816044860152604485526156ba606486614c03565b84519082855af15f513d8261572e575b5050156156d657505050565b61572761572c93604051907f095ea7b300000000000000000000000000000000000000000000000000000000602083015260248201525f604482015260448152615721606482614c03565b82615bc2565b615bc2565b565b909150615758575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f806156ca565b600114615751565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000602080830191825273ffffffffffffffffffffffffffffffffffffffff85166024840152604480840196909652948252929390925f906157c5606486614c03565b84519082855af15f513d82615842575b5050156157e157505050565b61572761572c9373ffffffffffffffffffffffffffffffffffffffff604051917f095ea7b30000000000000000000000000000000000000000000000000000000060208401521660248201525f604482015260448152615721606482614c03565b90915061586c575073ffffffffffffffffffffffffffffffffffffffff81163b15155b5f806157d5565b600114615865565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c16156158a357565b7fd7e6bcf8000000000000000000000000000000000000000000000000000000005f5260045ffd5b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f205416155f146159d757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082541617905573ffffffffffffffffffffffffffffffffffffffff339216907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d5f80a4600190565b50505f90565b6151259073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff821614615a3c575b5f615c49565b7fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155615a36565b9061512591801580615b24575b15615c49577fffffffffffffffffffffffff00000000000000000000000000000000000000007feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840154167feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d869840155615c49565b5073ffffffffffffffffffffffffffffffffffffffff7feef3dac4538c82c8ace4063ab0acd2d15cdb5883aa1dff7c2673abb3d8698401541673ffffffffffffffffffffffffffffffffffffffff831614615ab4565b65ffffffffffff8111615b925765ffffffffffff1690565b7f6dfcc650000000000000000000000000000000000000000000000000000000005f52603060045260245260445ffd5b905f602091828151910182855af1156134b0575f513d615c40575073ffffffffffffffffffffffffffffffffffffffff81163b155b615bfe5750565b73ffffffffffffffffffffffffffffffffffffffff907f5274afe7000000000000000000000000000000000000000000000000000000005f521660045260245ffd5b60011415615bf7565b805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260ff60405f2054165f146159d757805f527f02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b62680060205260405f2073ffffffffffffffffffffffffffffffffffffffff83165f5260205260405f207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00815416905573ffffffffffffffffffffffffffffffffffffffff339216907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b5f80a460019056fea2646970667358221220448bc29af17350ab754979c778787c0fd9eafcddbd56cdda8cdfee5189d931b764736f6c634300081a0033" diff --git a/testnet/core/setup/setup_genesis_validator.sh b/testnet/core/setup/setup_genesis_validator.sh index 6d250e786..f800ed358 100755 --- a/testnet/core/setup/setup_genesis_validator.sh +++ b/testnet/core/setup/setup_genesis_validator.sh @@ -120,7 +120,7 @@ echo "🛠️ Updating genesis parameters..." # EVM update_test_genesis `printf '.app_state["evm"]["params"]["evm_denom"]="%s"' $DENOM` # This seems duplicated since chain config already has this - update_test_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x00000000000000000000000000000000000000CB","0x00000000000000000000000000000000000000ca","0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805"]' + update_test_genesis '.app_state["evm"]["params"]["active_static_precompiles"]=["0x0000000000000000000000000000000000000100","0x0000000000000000000000000000000000000400","0x0000000000000000000000000000000000000800","0x0000000000000000000000000000000000000801","0x0000000000000000000000000000000000000802","0x0000000000000000000000000000000000000803","0x0000000000000000000000000000000000000804","0x0000000000000000000000000000000000000805","0xEC00000000000000000000000000000000000001"]' update_test_genesis '.app_state["evm"]["params"]["chain_config"]["homestead_block"]="0"' update_test_genesis '.app_state["evm"]["params"]["chain_config"]["dao_fork_block"]="0"' update_test_genesis '.app_state["evm"]["params"]["chain_config"]["dao_fork_support"]=true' diff --git a/x/uexecutor/README.md b/x/uexecutor/README.md index c1d5a96a8..c94a2beba 100755 --- a/x/uexecutor/README.md +++ b/x/uexecutor/README.md @@ -222,7 +222,7 @@ Vote messages check `IsBondedUniversalValidator` and `IsTombstonedUniversalValid The cryptographic binding is enforced inside the UEA contract's `executeUniversalTx` (see [`UEA_EVM.sol`](https://github.com/pushchain/push-chain-core-contracts/blob/86e20e2d26819e7cc885549f08c66895221dfab0/src/uea/UEA_EVM.sol#L145) and [`UEA_SVM.sol`](https://github.com/pushchain/push-chain-core-contracts/blob/86e20e2d26819e7cc885549f08c66895221dfab0/src/uea/UEA_SVM.sol)): 1. The contract holds the owner's public key as **immutable bytes** set at UEA deployment via `initialize(_id, _factory)`. There is no code path that mutates this after init. -2. `executeUniversalTx(payload, signature)` verifies the `signature` (passed in as `MsgExecutePayload.VerificationData`) against this stored owner — ECDSA recovery for EVM-origin owners, the Ed25519 precompile (`0x00…00ca`) for SVM-origin owners. +2. `executeUniversalTx(payload, signature)` verifies the `signature` (passed in as `MsgExecutePayload.VerificationData`) against this stored owner — ECDSA recovery for EVM-origin owners, the Ed25519 precompile (`0xEC…01`) for SVM-origin owners. 3. The signed payload hash includes a contract-tracked `nonce` (monotonic per UEA) and optional `deadline`, providing replay and freshness protection. 4. If signature verification fails, the contract reverts. The revert propagates as `execErr` from `CallUEAExecutePayload`; the keeper returns the error from `ExecutePayload`; the entire Cosmos transaction (including any partial gas-fee deduction) rolls back atomically. **No state changes survive a failed signature check.**