Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Tx permission contract improvement #8400

Merged
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
148 commits
Select commit Hold shift + click to select a range
234e582
Tx permission contract improvement
VladLupashevskyi Apr 13, 2018
1b393c0
Use tuple for to address
VladLupashevskyi Apr 16, 2018
5927a72
Introduced ABI for deprecated tx permission contract
VladLupashevskyi Apr 18, 2018
985937a
Improved ABI for tx permission contract with contract name, name hash…
VladLupashevskyi Apr 18, 2018
555fba0
Introduced support for deprecated tx permission contract + fixed cach…
VladLupashevskyi Apr 18, 2018
caf8b89
Introduced test for the new tx permission contract version + old test…
VladLupashevskyi Apr 18, 2018
f47cab5
Removed empty lines
VladLupashevskyi Apr 18, 2018
e0d5b42
Introduced filter_only_sender return value in allowedTxTypes fn + imp…
VladLupashevskyi Apr 26, 2018
2759b9a
Introduced version checking for tx permission contract
VladLupashevskyi May 21, 2018
22aa033
Moved tx permission contract test genesis specs to separate files
VladLupashevskyi May 21, 2018
b9bfff2
handle queue import errors a bit more gracefully (#8385)
rphmeier Apr 13, 2018
94e2ea5
Some tweaks to main.rs for parity as a library (#8370)
tomaka Apr 13, 2018
77727ef
New Transaction Queue implementation (#8074)
tomusdrw Apr 13, 2018
d6d53ff
clarify that windows need perl and yasm (#8402)
niklasad1 Apr 13, 2018
0256d2b
Unify and limit rocksdb dependency places (#8371)
sorpaas Apr 13, 2018
89b90b8
Use tokio::spawn in secret_store listener and fix Uri (#8373)
sorpaas Apr 13, 2018
b7a0f3c
remove Tendermint extra_info due to seal inconsistencies (#8367)
ordian Apr 14, 2018
4619b30
More code refactoring to integrate Duration (#8322)
tomaka Apr 14, 2018
d03dce4
tokio-core v0.1.16 -> v0.1.17 (#8408)
svyatonik Apr 16, 2018
bcd4ee9
Replace legacy Rlp with UntrustedRlp and use in ethcore rlp views (#8…
ascjones Apr 16, 2018
7ce99cf
Fix TODO comments (#8413)
sorpaas Apr 16, 2018
d0a903c
update zip to 0.3 (#8381)
debris Apr 19, 2018
a08069c
typo, docs parity_chainId: empty string -> None (#8434)
sorpaas Apr 19, 2018
b009127
Fix receipts stripping. (#8414)
tomusdrw Apr 19, 2018
9ca84a8
Changelogs for 1.9.6 and 1.10.1 (#8411)
5chdn Apr 19, 2018
23a7dba
Move ethcore::Error to error_chain (#8386)
ascjones Apr 19, 2018
e53f33b
remove From::from. (#8390)
EighteenZi Apr 19, 2018
8088ebe
Use forked app_dirs crate for reverted Windows dir behavior (#8438)
sorpaas Apr 20, 2018
7e9466a
Permission fix (#8441)
sorpaas Apr 20, 2018
47103c4
Block reward contract (#8419)
andresilva Apr 20, 2018
a855ab9
Improve VM executor stack size estimation rules (#8439)
sorpaas Apr 20, 2018
18815ba
Private transactions processing error handling (#8431)
grbIzl Apr 20, 2018
7df760c
Update Cargo hidapi-rs dependency (#8447)
chebykin Apr 20, 2018
3678106
Allow 32 bit pipelines to fail (#8454)
5chdn Apr 21, 2018
a50672a
Update wasmi (#8452)
pepyakin Apr 21, 2018
d838357
Return error in case eth_call returns VM errors (#8448)
sorpaas Apr 21, 2018
32129b6
ParityShell::open `Return result` (#8377)
niklasad1 Apr 21, 2018
ee49212
fix docker build (#8462)
General-Beck Apr 23, 2018
596200b
Add changelog for 1.9.7 and 1.10.2 (#8460)
5chdn Apr 23, 2018
1b48864
fix typos in vm description comment (#8446)
ayrat555 Apr 24, 2018
c1a534b
Use rename_all for RichBlock and RichHeader serialization (#8471)
sorpaas Apr 25, 2018
eb9fcbe
Don't require write lock when fetching status. (#8481)
tomusdrw Apr 25, 2018
e54666b
Bump master to 1.12 (#8477)
5chdn Apr 25, 2018
74f0482
Fix snap builds (#8483)
5chdn Apr 25, 2018
c7a02e5
Update hardcodedSync for Ethereum, Kovan, and Ropsten (#8489)
5chdn Apr 25, 2018
50a4643
Update wasmi and pwasm-utils (#8493)
pepyakin Apr 26, 2018
c94f1be
Remove three old warp boot nodes. (#8497)
ddorgan Apr 27, 2018
f47c533
Return error if RLP size of transaction exceeds the limit (#8473)
grbIzl Apr 27, 2018
bde4bf5
`duration_ns: u64 -> duration: Duration` (#8457)
niklasad1 Apr 27, 2018
f58dc73
Remove unused dependency `bigint` (#8505)
niklasad1 Apr 27, 2018
e5832e4
Show imported messages for light client (#8517)
sorpaas May 1, 2018
e01028f
Directly return None if tracing is disabled (#8504)
sorpaas May 1, 2018
4ddf13a
Hardware Wallet trait (#8071)
niklasad1 May 1, 2018
066378b
SecretStore: merge two types of errors into single one + Error::is_no…
svyatonik May 1, 2018
314e279
Enable WebAssembly and Byzantium for Ellaism (#8520)
ellaismer May 1, 2018
22f691c
More changes for Android (#8421)
tomaka May 2, 2018
1f736e4
Transaction Pool improvements (#8470)
tomusdrw May 2, 2018
401bfe2
Fetching logs by hash in blockchain database (#8463)
sorpaas May 2, 2018
6046ca6
Pass on storage keys tracing to handle the case when it is not modifi…
sorpaas May 2, 2018
7d3f279
Don't panic in import_block if invalid rlp (#8522)
ascjones May 3, 2018
2f84096
Remove expect (#8536)
dvdplm May 4, 2018
387e037
EIP 145: Bitwise shifting instructions in EVM (#8451)
sorpaas May 5, 2018
44d3c90
Consolidate crypto functionality in `ethcore-crypto`. (#8432)
twittner May 5, 2018
f196dc4
ethcore, rpc, machine: refactor block reward application and tracing …
andresilva May 7, 2018
e952e0f
Keep all enacted blocks notify in order (#8524)
sorpaas May 7, 2018
63f2b4c
Node table sorting according to last contact data (#8541)
andresilva May 7, 2018
29acdb7
Rlp decode returns Result (#8527)
dvdplm May 8, 2018
fe42ec9
Parity as a library (#8412)
tomaka May 9, 2018
a22ff24
Trace precompiled contracts when the transfer value is not zero (#8486)
sorpaas May 9, 2018
eadd68b
Don't block sync when importing old blocks (#8530)
tomusdrw May 9, 2018
5a2a756
Make trace-time publishable. (#8568)
tomusdrw May 9, 2018
51cddaa
Remove State::replace_backend (#8569)
sorpaas May 9, 2018
816e68b
Refactoring `ethcore-sync` - Fixing warp-sync barrier (#8543)
ngotchac May 9, 2018
26c518b
Decoding headers can fail (#8570)
dvdplm May 9, 2018
ad3de86
Update CHANGELOG for 1.9, 1.10, and 1.11 (#8556)
5chdn May 9, 2018
f2eaafd
Handle socket address parsing errors (#8545)
dvdplm May 9, 2018
596dc1c
Remove unnecessary cloning in overwrite_with (#8580)
sorpaas May 9, 2018
a5669ae
changelog nit (#8585)
niklasad1 May 9, 2018
9748b53
Rename `whisper-cli binary` to `whisper` (#8579)
niklasad1 May 9, 2018
152a5b8
Add whisper CLI to the pipelines (#8578)
5chdn May 9, 2018
455eead
Added Dockerfile for alpine linux by @andresilva, closes #3565 (#8587)
debris May 9, 2018
7701b64
Changelog and Readme (#8591)
5chdn May 10, 2018
17e2a25
Attempt to fix intermittent test failures (#8584)
dvdplm May 10, 2018
5c65cab
Make mio optional in ethcore-io (#8537)
tomaka May 10, 2018
3ec9cde
Fix Parity UI link (#8600)
Tbaut May 11, 2018
03ea13d
fix compiler warning (#8590)
niklasad1 May 11, 2018
83ded35
Block::decode() returns Result (#8586)
dvdplm May 11, 2018
6d99bcb
block_header can fail so return Result (#8581)
dvdplm May 11, 2018
ce5525f
Remove inject.js server-side injection for dapps (#8539)
axelchalon May 11, 2018
b9b4fd9
Fix the mio test again (#8602)
tomaka May 11, 2018
5f28e2e
2 tiny modification on snapshot (#8601)
EighteenZi May 12, 2018
474468c
Use full qualified syntax for itertools::Itertools::flatten (#8606)
sorpaas May 14, 2018
fcca7ad
Fix packet count when talking with PAR2 peers (#8555)
tomusdrw May 14, 2018
11228b9
typo: wrong indentation in kovan config (#8610)
sorpaas May 14, 2018
30393d9
Fix account list double 0x display (#8596)
sorpaas May 14, 2018
eacfacc
Remove manually added text to the errors (#8595)
niklasad1 May 14, 2018
345db57
Gitlab test script fixes (#8573)
5chdn May 14, 2018
7de2a13
Fix BlockReward contract "arithmetic operation overflow" (#8611)
sorpaas May 14, 2018
1666cab
´main.rs´ typo (#8629)
niklasad1 May 15, 2018
9bceb6d
Store morden db and keys in "path/to/parity/data/Morden" (ropsten use…
dvdplm May 15, 2018
ea74e51
Fix light sync with initial validator-set contract (#8528)
tomaka May 15, 2018
1426d3b
Remove NetworkContext::io_channel() (#8625)
tomaka May 15, 2018
5adf993
Check that the Android build doesn't dep on c++_shared (#8538)
tomaka May 15, 2018
0ddc685
Fork choice and metadata framework for Engine (#8401)
sorpaas May 16, 2018
295d81b
typo (#8640)
niklasad1 May 16, 2018
555103c
Changelog for 1.10.4-stable and 1.11.1-beta (#8637)
5chdn May 16, 2018
d4683d1
Don't open Browser post-install on Mac (#8641)
gnunicorn May 16, 2018
e9c602b
Resumable warp-sync / Seed downloaded snapshots (#8544)
ngotchac May 16, 2018
54c0fed
Fix not downloading old blocks (#8642)
ngotchac May 17, 2018
d4cbedc
Remove HostInfo::next_nonce (#8644)
tomaka May 18, 2018
fdfbe7b
Remove the Keccak C library and use the pure Rust impl (#8657)
dvdplm May 20, 2018
72edf75
updated tiny-keccak to 1.4.2 (#8669)
debris May 21, 2018
c514180
parity: improve cli help and logging (#8665)
5chdn May 22, 2018
3697a05
Refactor EIP150, EIP160 and EIP161 forks to be specified in CommonPar…
sorpaas May 22, 2018
027504c
Remove HostInfo::client_version() and secret() (#8677)
tomaka May 22, 2018
87d8359
Move connection_filter to the network crate (#8674)
tomaka May 22, 2018
c6f9c65
Remove the error when stopping the network (#8671)
tomaka May 22, 2018
84e10d4
Allow making direct RPC queries from the C API (#8588)
tomaka May 22, 2018
71b7bca
Fix cli signer (#8682)
ascjones May 23, 2018
6c0307a
Fix tx permission tests
VladLupashevskyi May 23, 2018
c832c4f
Use impl Future in the light client RPC helpers (#8628)
tomaka May 24, 2018
c9ea220
Update mod.rs (#8695)
Tbaut May 24, 2018
2a962df
remove empty file (#8705)
niklasad1 May 24, 2018
0a5298f
Set the request index to that of the current request (#8683)
dvdplm May 24, 2018
4a35764
parity: trim whitespace when parsing duration strings (#8692)
andresilva May 24, 2018
1f2b646
Implement recursive Debug for Nodes in patrica_trie::TrieDB (#8697)
gnunicorn May 25, 2018
8f0997e
Remove unused imports (#8722)
ngotchac May 28, 2018
c048ed9
Update dev chain (#8717)
tomusdrw May 28, 2018
df39c50
Add a test for decoding corrupt data (#8713)
dvdplm May 28, 2018
710c06e
Fix compilation error on nightly rust (#8707)
dvdplm May 28, 2018
79046ed
network-devp2p: handle UselessPeer disconnect (#8686)
andresilva May 29, 2018
769e9e9
Shutdown the Snapshot Service early (#8658)
ngotchac May 29, 2018
413664b
Fix local transactions policy. (#8691)
tomusdrw May 30, 2018
423fa2f
Add a deadlock detection thread (#8727)
ordian May 30, 2018
666d8cf
Remove unused function new_pow_test_spec (#8735)
sorpaas May 31, 2018
30f86ae
Add 'interface' option to cli (#8699)
gnunicorn May 31, 2018
f5e3d0a
Fix some nits using clippy (#8731)
niklasad1 May 31, 2018
f0adec1
Remove a couple of unnecessary `transmute()` (#8736)
niklasad1 May 31, 2018
267ee39
bump tinykeccak to 1.4 (#8728)
niklasad1 May 31, 2018
450c2f4
ease tiny-keccak version requirements (1.4.1 -> 1.4) (#8726)
svyatonik May 31, 2018
0b15818
Remove -k/--insecure option from curl installer (#8719)
vrde May 31, 2018
f8f2345
Fix PoW blockchains sealing notifications in chain_new_blocks (#8656)
sorpaas May 31, 2018
47141bc
Print warnings when fetching pending blocks (#8711)
dvdplm Jun 1, 2018
2a4035b
Fix XOR distance calculation in discovery Kademlia impl (#8589)
jimpo Jun 1, 2018
54cc717
Remove NetworkService::config() (#8653)
tomaka Jun 1, 2018
e300472
CI: Fixes for Android Pipeline (#8745)
5chdn Jun 1, 2018
f852531
Custom Error Messages on ENFILE and EMFILE IO Errors (#8744)
gnunicorn Jun 1, 2018
cb75517
Merge branch 'master' of https://github.com/paritytech/parity into tx…
VladLupashevskyi Jun 2, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ethcore/res/contracts/tx_acl.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
[ { "constant": true, "inputs": [], "name": "contractNameHash", "outputs": [ { "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "contractName", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "contractVersion", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "sender", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "name": "allowedTxTypes", "outputs": [ { "name": "", "type": "uint32" } ], "payable": false, "stateMutability": "view", "type": "function" } ]
[ { "constant": true, "inputs": [], "name": "contractNameHash", "outputs": [ { "name": "", "type": "bytes32" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "contractName", "outputs": [ { "name": "", "type": "string" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [], "name": "contractVersion", "outputs": [ { "name": "", "type": "uint256" } ], "payable": false, "stateMutability": "view", "type": "function" }, { "constant": true, "inputs": [ { "name": "sender", "type": "address" }, { "name": "to", "type": "address" }, { "name": "value", "type": "uint256" } ], "name": "allowedTxTypes", "outputs": [ { "name": "", "type": "uint32" }, { "name": "", "type": "bool" } ], "payable": false, "stateMutability": "view", "type": "function" } ]
24 changes: 13 additions & 11 deletions ethcore/src/tx_filter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

//! Smart contract based transaction filter.

use ethereum_types::{H256, U256, Address};
use ethereum_types::{H256, Address};
use lru_cache::LruCache;

use client::{BlockInfo, CallContract, BlockId};
Expand Down Expand Up @@ -44,7 +44,7 @@ pub struct TransactionFilter {
contract_deprecated: transact_acl_deprecated::TransactAclDeprecated,
contract: transact_acl::TransactAcl,
contract_address: Address,
permission_cache: Mutex<LruCache<(H256, Address, Address, U256), u32>>,
permission_cache: Mutex<LruCache<(H256, Address), u32>>,
}

impl TransactionFilter {
Expand Down Expand Up @@ -74,7 +74,7 @@ impl TransactionFilter {

let sender = transaction.sender();
let value = transaction.value;
let key = (*parent_hash, sender, to, value);
let key = (*parent_hash, sender);

if let Some(permissions) = cache.get_mut(&key) {
return *permissions & tx_type != 0;
Expand All @@ -83,24 +83,26 @@ impl TransactionFilter {
let contract_address = self.contract_address;

// Check permissions in smart contracts
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we mention here (or somewhere, where it's appropriate), that ABI of the contract with version=2 is used? Ideally is to add explicit check of the version in the code and force the next person, who will modify this code, to rely on contract's version. But perhaps at least some comment will be also helpful. PS. May be the fallback to the deprecated contract in case, when version is not retrieved, also will be looking more logically

let permissions = self.contract.functions()
let (permissions, filter_only_sender) = self.contract.functions()
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we should keep caching for performance reasons, so I came up with an idea to have 2nd return value in the contract function, which will define whether filtering depends on to address and value in ether and if not, sender address will be cached which will increase performance.

.allowed_tx_types()
.call(sender, to, value, &|data| client.call_contract(BlockId::Hash(*parent_hash), contract_address, data))
.map(|p| p.low_u32())
.map(|(p, f)| (p.low_u32(), f))
.unwrap_or_else(|_e| {
// If failed, first check deprecated contract
trace!(target: "tx_filter", "Fallback to the deprecated version of tx permission contract");
self.contract_deprecated.functions()
(self.contract_deprecated.functions()
.allowed_tx_types()
.call(sender, &|data| client.call_contract(BlockId::Hash(*parent_hash), contract_address, data))
.map(|p| p.low_u32())
.unwrap_or_else(|e| {
error!(target: "tx_filter", "Error calling tx permissions contract: {:?}", e);
tx_permissions::NONE
})
}), true)
});

cache.insert((*parent_hash, sender, to, value), permissions);
println!("{:?}, {:?}", permissions, filter_only_sender);
if filter_only_sender {
cache.insert((*parent_hash, sender), permissions);
}
trace!(target: "tx_filter",
"Given transaction data: sender: {:?} to: {:?} value: {}. Permissions required: {:X}, got: {:X}",
sender, to, value, tx_type, permissions
Expand All @@ -122,7 +124,7 @@ mod test {
use transaction::{Transaction, Action};
use tempdir::TempDir;

/// Contract code: https://gist.github.com/VladLupashevskyi/a157d8162db85de67de522eeb7c8ee85
/// Contract code: https://gist.github.com/VladLupashevskyi/84f18eabb1e4afadf572cf92af3e7e7f
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

bool - flag whether #'sender depends on #'to' and #'value'. If it's false
* the result will be cahed.

s/cahed/cached`` and also it seems it's the other way around, right? If the result is true` it will be cached?

"Caching" also seems a bit too harmless for this for me. We should emphasize that if true is returned the same permissions will be applied for all transactions from the same sender WITHOUT calling the contract again.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tomusdrw I agree the explanation was too confusing.

I updated gist where flag description is more clarified.

#[test]
fn transaction_filter() {
let spec_data = r#"
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We are trying to move such string data into external resources and use in the code via: let spec_data = include_str!("../res/filename.json");

Expand Down Expand Up @@ -165,7 +167,7 @@ mod test {
"0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } },
"0000000000000000000000000000000000000005": {
"balance": "1",
"constructor": "608060405234801561001057600080fd5b506104c3806100206000396000f300608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063469ab1e31461006757806375d0c0dc1461009a578063a0a8e4601461012a578063d4b03ee014610155575b600080fd5b34801561007357600080fd5b5061007c6101e2565b60405180826000191660001916815260200191505060405180910390f35b3480156100a657600080fd5b506100af610253565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100ef5780820151818401526020810190506100d4565b50505050905090810190601f16801561011c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013657600080fd5b5061013f610290565b6040518082815260200191505060405180910390f35b34801561016157600080fd5b506101c0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610299565b604051808263ffffffff1663ffffffff16815260200191505060405180910390f35b60006101ec610253565b6040518082805190602001908083835b60208310151561022157805182526020820191506020810190506020830392506101fc565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60606040805190810160405280601681526020017f54585f5045524d495353494f4e5f434f4e545241435400000000000000000000815250905090565b60006002905090565b6000737e5f4552091a69125d5dfcb7b8c2659029395bdf8473ffffffffffffffffffffffffffffffffffffffff1614156102d95763ffffffff9050610490565b732b5ad5c4795c026514f8317c7a215e218dccd6cf8473ffffffffffffffffffffffffffffffffffffffff1614156103175760026001179050610490565b736813eb9362372eef6200f3b1dbc3f819671cba698473ffffffffffffffffffffffffffffffffffffffff1614156103525760019050610490565b73e1ab8145f7e55dc933d51a18c793f901a3a0b2768473ffffffffffffffffffffffffffffffffffffffff1614801561038b5750600082145b1561039c5763ffffffff9050610490565b73e57bfe9f44b819898f47bf37e5af72a0783e11418473ffffffffffffffffffffffffffffffffffffffff161480156103fe575073d41c057fd1c78805aac12b0a94a405c0461a6fbb8373ffffffffffffffffffffffffffffffffffffffff16145b1561040c5760019050610490565b73d41c057fd1c78805aac12b0a94a405c0461a6fbb8473ffffffffffffffffffffffffffffffffffffffff1614801561046e575073e57bfe9f44b819898f47bf37e5af72a0783e11418373ffffffffffffffffffffffffffffffffffffffff16145b801561047a5750600082145b1561048b5763ffffffff9050610490565b600090505b93925050505600a165627a7a72305820ea35352692061875f689bdefc5e0d0ec86be33cdcf729bb0908f76b1da038b560029"
"constructor": "608060405234801561001057600080fd5b506104eb806100206000396000f300608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063469ab1e31461006757806375d0c0dc1461009a578063a0a8e4601461012a578063d4b03ee014610155575b600080fd5b34801561007357600080fd5b5061007c6101ed565b60405180826000191660001916815260200191505060405180910390f35b3480156100a657600080fd5b506100af61025e565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156100ef5780820151818401526020810190506100d4565b50505050905090810190601f16801561011c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561013657600080fd5b5061013f61029b565b6040518082815260200191505060405180910390f35b34801561016157600080fd5b506101c0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102a4565b604051808363ffffffff1663ffffffff168152602001821515151581526020019250505060405180910390f35b60006101f761025e565b6040518082805190602001908083835b60208310151561022c5780518252602082019150602081019050602083039250610207565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b60606040805190810160405280601681526020017f54585f5045524d495353494f4e5f434f4e545241435400000000000000000000815250905090565b60006002905090565b600080737e5f4552091a69125d5dfcb7b8c2659029395bdf8573ffffffffffffffffffffffffffffffffffffffff1614156102e95763ffffffff6001915091506104b7565b732b5ad5c4795c026514f8317c7a215e218dccd6cf8573ffffffffffffffffffffffffffffffffffffffff16141561032b5760026001176001915091506104b7565b736813eb9362372eef6200f3b1dbc3f819671cba698573ffffffffffffffffffffffffffffffffffffffff16141561036957600180915091506104b7565b73e1ab8145f7e55dc933d51a18c793f901a3a0b2768573ffffffffffffffffffffffffffffffffffffffff161480156103a25750600083145b156103b75763ffffffff6000915091506104b7565b73e57bfe9f44b819898f47bf37e5af72a0783e11418573ffffffffffffffffffffffffffffffffffffffff16148015610419575073d41c057fd1c78805aac12b0a94a405c0461a6fbb8473ffffffffffffffffffffffffffffffffffffffff16145b1561042b5760016000915091506104b7565b73d41c057fd1c78805aac12b0a94a405c0461a6fbb8573ffffffffffffffffffffffffffffffffffffffff1614801561048d575073e57bfe9f44b819898f47bf37e5af72a0783e11418473ffffffffffffffffffffffffffffffffffffffff16145b80156104995750600083145b156104ae5763ffffffff6000915091506104b7565b60006001915091505b9350939150505600a165627a7a723058204982adea2aa10a7b8328ec3829472ee17c62a86957ef6737f2eb729b2c3faf910029"
}
}
}
Expand Down