diff --git a/.babelrc b/.babelrc
new file mode 100644
index 0000000..0639bf7
--- /dev/null
+++ b/.babelrc
@@ -0,0 +1,5 @@
+{
+ "presets": [
+ "@babel/preset-env"
+ ]
+}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 641dadf..a5ae423 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
.DS_Store
.vscode/
node_modules/
-dist/
.jsbeautifyrc
.eslintrc.json
-.history
\ No newline at end of file
+.history
+/dist/
\ No newline at end of file
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index 1795c8d..0000000
--- a/.npmignore
+++ /dev/null
@@ -1 +0,0 @@
-.history
\ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index b550cd9..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,268 +0,0 @@
-Contributing to Bitcore
-=======
-
-We're working hard to make *bitcore* the most powerful JavaScript library for working with bitcoin. Our goal is to have *bitcore* be a library that can be used by anyone interested in bitcoin, and to level expertise differences with great design and documentation.
-
-## Community
-
-If there are any questions, etc., please feel to ask in one of the community channels:
-
-- https://labs.bitpay.com/c/bitcore (Support Forum)
-- https://gitter.im/bitpay/bitcore (Development Chat)
-
-## Quick Checklist
-
-Ideally, please make sure to run:
-
-* `gulp test` passes all the tests (We run tests against Node.js v0.10, v0.12, io.js, and modern browsers)
-* `gulp coverage` covers 100% of the branches of your code (See `coverage/lcov-report/index.html` for details)
-* `gulp lint` doesn't complain about your changes
-
-## Design Guidelines
-
-These are some global design goals in bitcore that any change must adhere.
-
-### D1 - Naming Matters
-
-We take our time with picking names. Code is going to be written once, and read hundreds of times.
-
-We were inspired to name this rule first due to Uncle Bob's great work *Clean Code*, which has a whole chapter on this subject.
-
-In particular, you may notice that some names in this library are quite long for the average JavaScript user. That's because we prefer a long but comprehensible name than an abbreviation that might confuse new users.
-
-### D2 - Tests
-
-Write a test for all your code. We encourage Test Driven Development so we know when our code is right. We have increased test coverage from 80% to around 95% and are targeting 100% as we move towards our 1.0 release.
-
-### D3 - Robustness Principle
-
-*Be conservative in what you send, be liberal in what you accept.*
-
-Interfaces should accept as many types of arguments as possible, so there's no mental tax on using them: we want to avoid questions such as "should I use a string here or a buffer?", "what happens if I'm not sure if the type of this variable is an Address instance or a string with it encoded in base-58?" or "what kind of object will I receive after calling this function?".
-
-Accept a wide variety of use cases and arguments, always return an internal form of an object. For example, the class `PublicKey` can accept strings or buffers with a DER encoded public key (either compressed or uncompressed), another PublicKey, a PrivateKey, or a Point, an instance of the `elliptic.js` library with the point in bitcoin's elliptic curve that represents the public key.
-
-### D4 - Consistency Everywhere
-
-Consistency on the way classes are used is paramount to allow an easier understanding of the library.
-
-## Style Guidelines
-
-The design guidelines have quite a high abstraction level. These style guidelines are more concrete and easier to apply, and also more opinionated. The design guidelines mentioned above are the way we think about general software development and we believe they should be present in any software project.
-
-### General
-
-#### G0 - Default to Felixge's Style Guide
-
-Follow this Node.js Style Guide: https://github.com/felixge/node-style-guide#nodejs-style-guide
-
-#### G1 - No Magic Numbers
-
-Avoid constants in the code as much as possible. Magic strings are also magic numbers.
-
-#### G2 - Internal Objects Should be Instances
-
-If a class has a `publicKey` member, for instance, that should be a `PublicKey` instance.
-
-#### G3 - Internal Amounts Must be Integers Representing Satoshis
-
-Avoid representation errors by always dealing with satoshis. For conversion for frontends, use the `Unit` class.
-
-#### G4 - Internal Network References Must be Network Instances
-
-A special case for [G2](#g2---general-internal-objects-should-be-instances) all network references must be `Network` instances (see `lib/network.js`), but when returned to the user, its `.name` property should be used.
-
-#### G5 - Objects Should Display Nicely in the Console
-
-Write a `.inspect()` method so an instance can be easily debugged in the console.
-
-#### G6 - Naming Utility Namespaces
-
-Name them in UpperCamelCase, as they are namespaces.
-
-DO:
-```javascript
-var BufferUtil = require('./util/buffer');
-```
-DON'T:
-```javascript
-var bufferUtil = require('./util/buffer');
-```
-
-#### G7 - Standard Methods
-
-When possible, bitcore objects should have standard methods on an instance prototype:
-* `toObject/toJSON` - A plain JavaScript object that `JSON.stringify` can call
-* `toString` - A string representation of the instance
-* `toBuffer` - A hex Buffer
-
-These should have a matching static method that can be used for instantiation:
-* `fromObject` - Should be able to instantiate with the output from `toObject/toJSON`
-* `fromString` - Should be able to instantiate with output from `toString`
-* `fromBuffer` - Should likewise be able to instantiate from output from `toBuffer`
-
-`JSON.stringify` and `JSON.parse` are expected to be handled outside of the scope of Bitcore methods. For example, calling `JSON.stringify` on an Bitcore object will behave as expected and call `transaction.toJSON()` and then stringify it:
-
-```javascript
-var transactionString = JSON.stringify(transaction);
-```
-
-Likewise to instantiate a transaction from that string:
-
-```javascript
-var data = JSON.parse(transactionString);
-var tx = new Transaction(data);
-```
-
-### Errors
-
-#### E1 - Use bitcore.Errors
-
-We've designed a structure for Errors to follow and are slowly migrating to it.
-
-Usage:
-* Errors are generated in the file `lib/errors/index.js` by invoking `gulp errors`.
-* The specification for errors is written in the `lib/errors/spec.js` file.
-* Whenever a new class is created, add a generic error for that class in `lib/errors/spec.js`.
-* Specific errors for that class should subclass that error. Take a look at the structure in `lib/errors/spec.js`, it should be clear how subclasses are generated from that file.
-
-#### E2 - Provide a `getValidationError` Static Method for Classes
-
-### Interface
-
-#### I1 - Code that Fails Early
-
-In order to deal with JavaScript's weak typing and confusing errors, we ask our code to fail as soon as possible when an unexpected input was provided.
-
-There's a module called `util/preconditions`, loosely based on `preconditions.js`, based on `guava`, that we use for state and argument checking. It should be trivial to use. We recommend using it on all methods, in order to improve robustness and consistency.
-
-```javascript
-$.checkState(something === anotherthing, 'Expected something to be anotherthing');
-$.checkArgument(something < 100, 'something', 'must be less than 100');
-$.checkArgumentType(something, PrivateKey, 'something'); // The third argument is a helper to mention the name of the argument
-$.checkArgumentType(something, PrivateKey); // but it's optional (will show up as "(unknown argument)")
-```
-
-#### I2 - Permissive Constructors
-
-Most classes have static methods named `fromBuffer`, `fromString`, `fromJSON`. Whenever one of those methods is provided, the constructor for that class should also be able to detect the type of the arguments and call the appropriate method.
-
-#### I3 - Method Chaining
-
-For classes that have a mutable state, most of the methods that can be chained *SHOULD* be chained, allowing for interfaces that read well, like:
-
-```javascript
-var transaction = new Transaction()
- .from(utxo)
- .to(address, amount)
- .change(address)
- .sign(privkey);
-```
-
-#### I4 - Copy Constructors
-
-Constructors, when provided an instance of the same class, should:
-* Return the same object, if the instances of this class are immutable
-* Return a deep copy of the object, if the instances are mutable
-
-Examples:
-```javascript
-function MyMutableClass(arg) {
- if (arg instanceof MyMutableClass) {
- return MyMutableClass._deepCopy(arg);
- }
- // ...
-}
-function ImmutableClass(arg) {
- if (arg instanceof ImmutableClass) {
- return arg;
- }
- // ...
-}
-```
-
-#### I5 - No New Keyword for Constructors
-
-Constructors should not require to be called with `new`. This rule is not heavily enforced, but is a "nice to have".
-
-```javascript
-function NoNewRequired(args) {
- if (!(this instanceof NoNewRequired)) {
- return new NoNewRequired(args);
- }
- // ...
-}
-```
-
-### Testing
-
-#### T1 - Tests Must be Written Elegantly
-
-Style guidelines are not relaxed for tests. Tests are a good way to show how to use the library, and maintaining them is extremely necessary.
-
-Don't write long tests, write helper functions to make them be as short and concise as possible (they should take just a few lines each), and use good variable names.
-
-#### T2 - Tests Must not be Random
-
-Inputs for tests should not be generated randomly. Also, the type and structure of outputs should be checked.
-
-#### T3 - Require 'bitcore' and Look up Classes from There
-
-This helps to make tests more useful as examples, and more independent of where they are placed. This also helps prevent forgetting to include all submodules in the bitcore object.
-
-DO:
-```javascript
-var bitcore = require('../');
-var PublicKey = bitcore.PublicKey;
-```
-DON'T:
-```javascript
-var PublicKey = require('../lib/publickey');
-```
-
-#### T4 - Data for Tests Included in a JSON File
-
-If possible, data for tests should be included in a JSON file in the `test/data` directory. This improves interoperability with other libraries and keeps tests cleaner.
-
-### Documentation
-
-#### D1 - Guide and API Reference
-
-All modules should include a developer guide and API reference. The API reference documentation is generated using JSDOC. Each function that exposes a public API should include a description, @return and @param, as appropriate. The general documentation guide for the module should be located in the `docs/guide` directory and is written in GitHub Flavored Markdown.
-
-#### D2 - Proofread
-
-Please proofread documentation to avoid unintentional spelling and grammatical mistakes before submitting a pull request.
-
-## Pull Request Workflow
-
-Our workflow is based on GitHub's pull requests. We use feature branches, prepended with: `test`, `feature`, `fix`, `refactor`, or `remove` according to the change the branch introduces. Some examples for such branches are:
-```sh
-git checkout -b test/some-module
-git checkout -b feature/some-new-stuff
-git checkout -b fix/some-bug
-git checkout -b remove/some-file
-```
-
-We expect pull requests to be rebased to the master branch before merging:
-```sh
-git remote add bitpay git@github.com:bitpay/bitcore.git
-git pull --rebase bitpay master
-```
-
-Note that we require rebasing your branch instead of merging it, for commit readability reasons.
-
-After that, you can push the changes to your fork, by doing:
-```sh
-git push origin your_branch_name
-git push origin feature/some-new-stuff
-git push origin fix/some-bug
-```
-Finally go to [github.com/bitpay/bitcore](https://github.com/bitpay/bitcore) in your web browser and issue a new pull request.
-
-Main contributors will review your code and possibly ask for changes before your code is pulled in to the main repository. We'll check that all tests pass, review the coding style, and check for general code correctness. If everything is OK, we'll merge your pull request and your code will be part of bitcore.
-
-If you have any questions feel free to post them to
-[github.com/bitpay/bitcore/issues](https://github.com/bitpay/bitcore/issues).
-
-Thanks for your time and code!
diff --git a/README.md b/README.md
index abc10e3..76bdee5 100644
--- a/README.md
+++ b/README.md
@@ -1,55 +1,220 @@
-# wicc-wallet-utils-js
+# wicc-wallet-utils-js v2.0
Official JavaScript library that provides WICC Offline Wallet capabilities
-## Key Functions
-### Generate mnemonic phrase, private-public key pair and WICC addresses for mainnet/testnet
-[Example](./test/test-wallet.js)
-### Offline sign registration transaction for newly created WICC addresses
-[Example](./test/test-registeraccounttx.js)
-### Offline sign WICC coin transfer transactions
-[Example](./test/test-commontx.js)
-### Offline sign contract Lua Script deployment transactions
-[Example](./test/test-registercontracttx.js)
-### Offline sign contract calling transactions
-[Example](./test/test-callcontracttx.js)
-### Offline sign delegate vote transactions
-[Example](./test/test-delegatetx.js)
+# Installation
+### CDN
+```html
+
+```
+### NPM
+```
+npm install wicc-wallet-lib
+```
+# Usage
+```javascript
+const { Wallet, WalletManager, WaykiTransaction, BaasClient } = require("wicc-wallet-lib")
+```
+## Key Classes
+### Wallet —— Constructor of a blockchain wallet
+[Demo](demo/test-wallet.js)
+```javascript
+const privKeyWIF = "Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13"
+const wallet = new Wallet(privKeyWIF)
+//{privateKey: 'Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13', address: 'wLKf2NqwtHk3BfzK5wMDfbKYN1SC3weyR4' }
+```
+#### Instance Methods
+- **signMessage**
-## Get Started
+ Message signature method
+```javascript
+const msg = "wicc test"
+const signTx = wallet.signMessage(msg)
```
-npm install wicc-wallet-lib
+- **publicKeyAsHex**
+
+ Get wallet public key
+
+```javascript
+const pubKey = wallet.publicKeyAsHex()
```
+### WalletManager —— Constructor of wallet management
+[Demo](demo/test-walletmanager.js)
+```javascript
+const networkType = "testnet"
+var walletManager = new WalletManager(networkType)
```
-bower install wicc-wallet-lib
+#### Instance Methods
+- **randomMnemonicCodes**
+
+ Generate a mnemonic randomly
+```javascript
+const lang = "ENGLISH" // or CHINESE
+const mnemonics = walletManager.randomMnemonicCodes(lang)
+//mnemonics = "clinic dose kingdom fetch away industry squirrel cheese purchase mean slide mixed"
```
+- **switchMnemonicCodes**
-## Contact us
-To get community assistance and ask for help with implementation questions
+ Switching from mnemonics in the current language to mnemonics in another language, both can generate the same wallet
+```javascript
+var mnemonics1 = walletManager.randomMnemonicCodes("ENGLISH")
+var wallet1 = walletManager.importWalletFromMnemonic(mnemonics)
-* Telegram group: https://t.me/waykichaindeveng
-* Wechat ID: wjlT2D2
+var mnemonics2 = walletManager.switchMnemonicCodes(mnemonics1, "CHINESE")
+var wallet2 = walletManager.importWalletFromMnemonic(mnemonics2)
+
+wallet1.address === wallet2.address
+```
+- **createWallet**
+
+ Create a blockchain wallet from valid mnemonics, returns a instance object of **Wallet**
+```javascript
+var wallet = walletManager.createWallet(mnemonics)
+```
+- **importWalletFromMnemonic**
+
+ Import an existing wallet from its mnemonics
+```javascript
+var wallet = walletManager.importWalletFromMnemonic(mnemonics)
+```
+- **importWalletFromPrivateKey**
+
+ Import an existing wallet from its private key
+```javascript
+var wallet = walletManager.importWalletFromPrivateKey(privateKeyWIF)
+```
+
+### WaykiTransaction —— Constructor of transaction signature
+```javascript
+var wallet = new Wallet(privKeyWIF)
+var txParams = {
+ nTxType: 15, // transaction type
+ nValidHeight: 34400, // create height
+ srcRegId: '0-1', // sender's regId
+ appId: "24555-1", // app regId
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ fees: 1000000, // fees pay for miner
+ amount: 8, // amount of WICC to be sent to the app account
+ vContract: "f018" // contract method, hex format string
+};
+var transaction = new WaykiTransaction(txParams, wallet)
+```
-## Development & Tests
+#### Instance Methods
+- **genRawTx**
+```javascript
+var rawTx = transaction.genRawTx()
+```
+### List of all transactions
+| Transaction type | nTxType | Demo |
+| :------------ |:---------------:| -----:|
+| ACCOUNT_REGISTER_TX | 2 | [test-registeraccounttx.js](demo/test-registeraccounttx.js) |
+| BCOIN_TRANSFER_TX | 3 | [test-commontx.js](demo/test-commontx.js) |
+| LCONTRACT_INVOKE_TX | 4 | [test-callcontracttx.js](demo/test-callcontracttx.js) |
+| LCONTRACT_DEPLOY_TX | 5 | [test-registercontracttx.js](demo/test-registercontracttx.js) |
+| DELEGATE_VOTE_TX | 6 | [test-delegatetx.js](demo/test-delegatetx.js) |
+| ASSET_ISSUE_TX | 9 | [test-assetcreatetx.js](demo/test-assetcreatetx.js) |
+| ASSET_UPDATE_TX | 10 | [test-assetupdatetx.js](demo/test-assetupdatetx.js) |
+| UCOIN_TRANSFER_TX | 11 | [test-ucointransfertx.js](demo/test-ucointransfertx.js) |
+| UCOIN_CONTRACT_INVOKE_TX | 15 | [test-ucontractinvoketx.js](demo/test-ucontractinvoketx.js) |
+| CDP_STAKE_TX | 21 | [test-cdpstaketx.js](demo/test-cdpstaketx.js) |
+| CDP_REDEEMP_TX | 22 | [test-cdpredeemtx.js](demo/test-cdpredeemtx.js) |
+| CDP_LIQUIDATE_TX | 23 | [test-cdpliquidatetx.js](demo/test-cdpliquidatetx.js) |
+| DEX_LIMIT_BUY_ORDER_TX | 84 | [test-dexbuylimitordertx.js](demo/test-dexbuylimitordertx.js) |
+| DEX_LIMIT_SELL_ORDER_TX | 85 | [test-dexselllimitordertx.js](demo/test-dexselllimitordertx.js) |
+| DEX_MARKET_BUY_ORDER_TX | 86 | [test-dexbuymarketordertx.js](demo/test-dexbuymarketordertx.js) |
+| DEX_MARKET_SELL_ORDER_TX | 87 | [test-dexsellmarketordertx.js](demo/test-dexsellmarketordertx.js) |
+| DEX_CANCEL_ORDER_TX | 88 | [test-dexcancelordertx.js](demo/test-dexcancelordertx.js) |
+
+### BaasClient —— Contains some of Baas (Blockchain as a Service) API; HTTP requerts
+[Demo](demo/test-baasclient.js)
+```javascript
+var baasClient = new BaasClient(BaasUrl)
+```
+
+| BaasNetwork | BaasUrl | Remarks |
+| :------------ |:---------------:| -----:|
+| TestNetwork | https://baas-test.wiccdev.org/v2/api | [documentation](https://baas-test.wiccdev.org/v2/api/swagger-ui.html#!/) |
+| ProdNetwork | https://baas.wiccdev.org/v2/api | [documentation](https://baas.wiccdev.org/v2/api/swagger-ui.html#!/) |
+
+#### Instance Methods
+- **getAccountInfo**
+
+ Get information of a specific wallet address, returns a Promise
+```javascript
+const address = "whiRBzMprDzY5wq3oPsHvAnyDV8ggYNaZE"
+const response = baasClient.getAccountInfo(address)
+response.then(data => {
+ console.log(data)
+})
+```
+- **getBlockCount**
+
+ Get the current block height, returns a Promise
+```javascript
+const response = baasClient.getBlockCount()
+response.then(data => {
+ console.log(data)
+})
+```
+- **sendRawTx**
+
+ Broadcast transaction signature data to blockchain, returns a Promise
+```javascript
+const rawTx = "0301818c760200011476c6077b5679c8ef47f4243ca25537d5c3f7fad883e1ac009f80e7eeef000d74657374207472616e73666572473045022100e2853b6dfb8a892659de4a43181f8a02e983cca319def2457ea7b0a14c8966ea0220733ce86e172bff8aba750d104b6f39b737c897df7c33413142bd13b2415ce2f2"
+const response = baasClient.sendRawTx(rawTx)
+response.then(data => {
+ console.log(data)
+})
+```
+- **decodeRawTx**
+
+ Get the original transaction detail based on the signature data, returns a Promise
+```javascript
+const rawTx = "0301818c760200011476c6077b5679c8ef47f4243ca25537d5c3f7fad883e1ac009f80e7eeef000d74657374207472616e73666572473045022100e2853b6dfb8a892659de4a43181f8a02e983cca319def2457ea7b0a14c8966ea0220733ce86e172bff8aba750d104b6f39b737c897df7c33413142bd13b2415ce2f2"
+const response = baasClient.decodeRawTx(rawTx)
+response.then(data => {
+ console.log(data)
+})
+```
+
+# Development & Tests
```sh
-git clone https://github.com/WaykiChain/wicc-wallet-utils-js.git
-cd wicc-wallet-utils-js
-npm install
+$ git clone https://github.com/WaykiChain/wicc-wallet-utils-js.git
+$ cd wicc-wallet-utils-js
+$ npm install
```
-Run all the tests:
+### Build (you will get a UMD module):
+- Execution Command
+```sh
+$ npm run build
+```
+- Output
+```
+dist/wicc-wallet-lib-2.0.js
+```
+## Examples
+
+Run all the Demos:
```sh
-gulp test
+$ npm run test
```
+# Reference Projects
+[bitpay/bitcore-lib](https://github.com/bitpay/bitcore-lib)
+
+# Contact us
+To get community assistance and ask for help with implementation questions
-You can also run just the Node.js tests with `gulp test:node`, just the browser tests with `gulp test:browser`
-or create a test coverage report (you can open `coverage/lcov-report/index.html` to visualize it) with `gulp coverage`.
+* Telegram group: https://t.me/waykichaindeveng
+* Wechat ID: wjlT2D2
-## License
+# License
Code released under [the MIT license](https://github.com/WaykiChain/wicc-wallet-utils-js/blob/master/LICENSE).
-Copyright 2017-2019 WaykiChain, Inc.
+© 2017-present WaykiChain, Inc.
\ No newline at end of file
diff --git a/benchmark/block-357238.json b/benchmark/block-357238.json
deleted file mode 100644
index 03ef883..0000000
--- a/benchmark/block-357238.json
+++ /dev/null
@@ -1 +0,0 @@
-"02000000dff776908b8cbfc363cd421dc8d233b8340c9c82aa295d07000000000000000094c8470331881af67ede892bfaec01a0dc238b1f49a8db49ec974151451dc9952a405c55f58616180b6ea042fd710101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5603767305e4b883e5bda9e7a59ee4bb99e9b1bcfabe6d6de8af9d3e87efcf95d1d9283083ad9494e78a00a6266fb905219cf46ba59d8de61000000000000000005d2e5331aa00004d696e656420627920646171696e67ffffffff015f1f5195000000001976a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac000000000100000001d73d5c90f4012a4692c16044e7218f1cd4ae88c5634e50b5a9e3edb77d2a6007010000006a473044022065fb9235816b88ca8b9935a209b19eb9920166a9be5ec3ec98f0cc4f1eb8e92602206221445c268ba8f25d7d0719baba48decbeefd7bed81c738e76a9f77bc444b4d012102181125824b6752a7a4b6a68f7eb2a0338196e26835b5026688fb27c440d140ebffffffff0228785a00000000001976a9141c14fd16948896b3d531c85d1f6b5cb5e9803f5788ac365d8fca060000001976a9142abc00cdaeb6816a644781b16dd3764859e8c79d88ac000000000100000003b61ddddc724c813d3524e0e938ee427486ffe33199cf3030fbcfd6f24f2e9d3f000000006a473044022075eabe38ca7e42312b8acfb3dec8c52ee6533e9699cae15ddec429a195cde4820220714c6540104eb7bb8584385cc627641801782553161f74c0841cfd0f87dcbd09012102388cf4f63763792c8bc31b7f9fb7810f3d76252924afa03fa5b8df2c4b7f23f5feffffff9aa1906b76dfcb4ac3915d2bbc4993df20a7173e4f4283db7d0199ca215965a0000000006a4730440220588c4b23155144874d2ed8c6e094fe273394b608869059d7a337384ab45b75550220444451f80495b5b2e3db450cd3a658c6f59b493e6b26a52080eef37c3f6846b50121032805bca89441dc0c0204deed677e5c70e5122ff46d7e689133b30ece1c402941feffffffb07c99d494e170a86dfed9c26d7c6978c3bf09c2e11ba0a2d111f6e84a2640a9010000006b483045022100933195eee1e8746eebb945ea587d950c5b4abb6aaeb5041788a9d36c3c6f2c87022062e971cff6354d0ef3ec4a2e42ada3937b239a6426fc13aae52c41084ad3fc89012102069711114026b14654b41a6a48a1d6f584c54140de4a7e5559ab46489e973cbffeffffff0229ef0f00000000001976a9141707adc467eaa4063e4cebebadb1ecd64455c94c88ac5a341400000000001976a9141717df2106312e23d0a0c81aacc02e93c5b59bd788ac6b7305000100000001b27f317f3ebd36213a96eb82b855ff984bdb29af1116eca61f5afdb6dec9b2aa080000008b483045022100a26df8e4f840886125f054563a0eae422317911f8a05aae6083ed4a897b1eb4a022045bd1756aa7a67d0b39590c2b77d045177860ce2a882770f87c261c5b078e0220141041749d8bc9b9f26c8bc5f04c53bc5250569743d5c795a948e52119669c30150167ce3bf2f68f92b3ee2208fbece7b7a9aa2daae0f79f20ecfdc2f96ef13cbfc38ffffffff022b14fc00000000001976a9141874412f8ca28449b9ab69b87692de600527425788ac55709301000000001976a914cceecc96ed84b1ffc64bdf9f9dd6f46a0f2f244e88ac0000000001000000059ea012fe00771c442c3aa7cebcec1d07c75803667fe12b26d8bbc22d8dd747e9080000008a473044022025597889ad3087e3c1e259a327e953544c0d7a60466cf847fe89eb1a23f6a5220220509c3e72e5ad746a6d9f4ac3d2c812cd05cfd9b7bef95bf85c5090aced05490201410485b97e1e968ca47d47bb8723fc36de98349c806b6ca794936117424ec4a1e174f6c8bc5114dd27a2847abfacd0d8f316153d466d5eb9ea98740b881b9d0d5967feffffff220486e4b6aa0e718e0391e04229dfc8dfc4b9cc1b11f81c9988d82ba6538c3d000000008a47304402203b7bae428655e1d0c4d2e7f90b6147d374eba0fc3c3bc002ceac8631f66a8a90022031fe25627248f705c22278e18e911482f2aed5432dc8f3d8b70d3a38410f947b014104bbd70f82b340784bd90d4c0ad4faedc05d764f6234cccd74801e5650a1079f21a9bca7327e5e82a344e8f4d36280adaef4f0fbf7912a17e917d30d725cf158affeffffff7e70a6981c26db7d0a6243fd2d4f106add6210944a9d912af9c4dd954acfc945000000008b4830450221009aeb94b4af07479057378173e4b125c2211c05eaaacc2693807eb3ceb2b69d7c0220072e0db6467d3c5dee524579472cf441f558d9fd4d8d4c7bf654a19789892e360141044e56e73f29b830a47958db52d734860bc413da97d421e6f1ff57e7b37d5343c8e306bc745046db45330a5261e64d632c3db94e5712a35a35a79262656cdce0a2feffffff6aeb7f37c2e6cc6d984955394476a593c928833c16602feed012480560249abe000000008a473044022072be600922a3a8cb88a35cc93892af506c1ac050a27491f52f58821ffc35b86e0220535d0f805e3f6f2b9f54064dd50ca93ed0f2129616fd2525b704fa7550f7cf7a014104fe16d056a085da2529a8ab7531e0fe9cc99750002a9fda24d9b3df24154958694d1b7ad0eb0c94e25f6d2a26f26e86525c2028953bab857fb4e73ff2aa4b5237feffffff49693c7ed8a00ff3d22fd0c04fa0c4f3033afbb3c825bcf7eec22f05e2ae071d000000008b483045022100fa82ee5db88e98ceeb91ab290cf38e467881f7c910fa5d0f618aaa8f2266c8d902203f06c66ee3c6d460e722893101c9cb491d6fcc40963a9bf0eb885b23f20c1886014104df183cd9f0ad9355730e3031a63d6077efc548984d971bb545f16bbe3b96e21839bc3356c187e67a493d357df82310d897c75bb0d118c2ed706eae446407d02cfeffffff02b9480f00000000001976a9144d187819caa754acd6a09791883326f4079be92d88ac80e7bd02000000001976a914b638d0a971d6fa5100690da506e998130264ed0d88ac6b7305000100000002066059d1f44d002dae496f2987b0e9e9a51c11cce9d03d5f110804cddf275c64010000004a00483045022100e71e1ff0cf80067f41cb4005b5228c7fa79d8a276883581ebbda463b4fc5f3e60220531d433eb6309117b82c6905e59c2f7db6b89367f7e51d3245ffae5aed78267001ffffffff066059d1f44d002dae496f2987b0e9e9a51c11cce9d03d5f110804cddf275c64020000006a473044022020d376d82b42597793509bb86a4c7c36861bc6d1c1560dd1b5f6475abbc2ffc3022059b50b86387b42bccb7362a5dad5e09e19e3b8e2f157c6f4d320e7d7463538e10121030a359f43e33acce58ba94cb68997f2ea32efb149998bb88f2426b5d6ec056726ffffffff031027000000000000695121025442303030310006a01f6291a39f2e81131821638dee132f0003000000000000210254423030303100070000000000000000637573742e75736400000000000061a82103c098d6eae67f30e46302e8bd1698a13edaaade40a2fb2c45b9ca1ac04a03962153ae10270000000000004751210254423030303100020000000000000000637573742e7573640000000002d6b32821030a359f43e33acce58ba94cb68997f2ea32efb149998bb88f2426b5d6ec05672652ae80a90300000000001976a914a9278558b535733ed21754b2fe90ed09de3ecbe988ac0000000001000000035550506d8843676f474773dd9ba50bf1757ea2af25bab9d041dd10286698fcb5010000006b483045022100c638fea092793fa904bb9465e765d01cbf35bb0c0d34b347440d94ea8c36a66f022006d27bf81a03e8cdf5a78c48f633e7a3a066b70844a92beb040c43c16efb5f00012103c7770fda634ec274372d37f03dda791043a25cfaf6b1108e92fe238ddd9f2a17ffffffffa4e9d670eb433c9c02c0e97e4d2992da6d9ed763fcd402fa35411c2f5b9bf2f0000000006a473044022043d79e0bbfd38e5164c3f4ce8de7e4184e60092ae3b723594c5e443f6588f43b02200660dc73584ce6d288cadb17b8f4c3b46449639cf0aef18e35df1876bbc192ec012102b93a5b43e830b9a533ae89a16c1bed754dd3b81210a7b1e6e1849acda3d87298ffffffff6862c6767d037a0c51d50e56e41ad93fcb32c79d0050418ba25bcef571e729c7000000006b483045022100bddd7ca5db2943f491aeb08cc01093ed8a47326729d6524c7dbe3c102c7250d302201cad58c85bdee56cde6cc007b3b009ac77ff011cd6f8e94d9f38455a1caf23d60121029b0fd27f90f65cb7806452c47be95b0d47473d4456d85a67d1394812b8444d0affffffff0278d1b302000000001976a91492369f23908d091f783d32d4ff6c1c8fa0e6124188ace0ed3700000000001976a914f00d8406e59a45ab7e97c0b04db7f9429ebb301d88ac0000000001000000010a8ffd8997b353519fe987cbaf280f25018293006c9336e98199ad2258543095010000008b483045022022a60231f49b02fca872298eb7077455c00d42f029dd85af9eafd64eeaf9f496022100e2f14a6c7dcf7c937350e10fac083cfa5b545e31d8a8632d1474269a2a12ecf80141049968d5053be466e3c398f5d6045fb88576d9dfc6a48a3f93caf63f5182d2ddce8dc394ad4abd419ce50a03842f35d824a24d0f9224ff9e424c27635afe821516ffffffff01d0667c01000000001976a914ddfc115356a8aee78c3dff41b67623b34c8ed71488ac000000000100000001aa39ce07f91292d5e50e6940aa4e847ff36b14ddd22e32bb818ba8313a1d441b010000006a473044022010a6400966914282d27e1c5319ed69ce661024f2e2a3657212d7cc06f36a7f0702203fcc022b9432a7786479903bd871e13373a8fdb9ca655a7d1ffd5f1015ca3a090121030bf390e50be47f35271f7ff784c8a31ee6d728a05f020ebd2956eff637e4d628ffffffff0250ffc70f000000001976a9142a13790951513e0eacfcf5c787e53c8ff6789b5088aca0f33f04000000001976a9148065a535e5f61d63a781ddfaa0b1f3ef481f928088ac000000000100000008dcf8dfdd94afee9459fc4066350d77d8893fe107c28fd805bdef42d7e2e91546010000006a47304402207e263870a5026d5532ca29b9f2df0d3f129ecd2c0e103bad7ebf9b5d78e4930902204a1f136297a6115269deca648879f81531872cd99ff0c5c608f1116762c02f950121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff9a6b13557c83e7556651a9749cf2ca255b92f612508f302416552fc4bc0e5341010000006a47304402205a15be4b0ae1f4ed7b34d14d7e369e7c247fb11ff802f2fe9be7c50e8dfe498a02207e4e4fc474350634497da2e8e6a248d8808bd311daf698932a30ddca564071bf0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff2cd87672f92ae36bcba7ca9a5e5bd8c7cc667d4a966cd5021dc935c35801eef9020000006b483045022100e722da39a270ae8b81a8782ffad5f14532102d6409c3818b577a82c382a71211022011c6a1562dc522a7eab518dd27669e25ca450c7509a709618a9286a1bb3b81570121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffffaae392c7bb3f4bc25358b69d577cd91bdf8e3ace571cd9cd45bffe9c3c07d128010000006b483045022100de95f6337ce508cc9b89aaccf040c7ac3456226cf9063a39ef53c687c9847b8d02203fdaaab93e6845820dca867ba086cb86ec33954ee25c40792ea9294b52e979680121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff268704b94df7e0ab522419ab4420eb56d80014a60adca1da14dfa393afefdd0c000000006b4830450221008e7909240bae3249436ef51f933fd845540823f2fe6abb23469ca79dda693d4502207b51aa110ba4ecfb05cf1ccbe877c666e946df19fe9343255885d10e672adb0a0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7fffffffff5448c167bdf10e5c2bf7bd6c3cd8f0044b22220e8a3e7579db27630003e9c05020000006a4730440220126f27403eb28cd1a4582286b8b4674782744a70d6eb5f52f9c52b1a9161b1b402205089b41f8f59d9166c3ba462610da8b4c1c38258aa254fe662f768f29bd3cdc70121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff946aab125b0812821ec07e95b019713bca11ebaa3c0ac99ec8b4d367b43d3775010000006b4830450221008f87cc69e2bc92cf9f5264599e324bfd26586d11383854e450e013645d7ccd5e0220079d5cfd2129bc5a317aa030d03cbc75aaf19309b3540eb4e1b6c178db6a0b0c0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffffe9e8d2d09ad4a1be40fadba8f13ae05046d723675c583d83aacdcfa5fe18877e010000006b4830450221008617630a622685c89f3bd6ed0696001b103f568070b70de9cc49fdf9f13627e9022062a657b65ce16e3cd39fcaf41c5aad0907144b51b38424863f01c30539c4898c0121021e31286c929729c2aa14a2865f34c22346d307845fe38fe58b6ceb06e2b860e7ffffffff01fd04e375000000001976a91431184ddc851e36a6f39918b2960a191d91b6c76388ac00000000010000000176e5da424a4be62cc19ff3c5ff3a8d3271329277b92816b9b139b11dbd730a80000000008a473044022070441fb3ceb2aafede66a9934984fee9904f1aecb31297132a46553ac50fe59502203008dad3ce7b48aea41e7737a23f03585988498c12c9a07862a3c87384c9d9bc01410453c2594391811f5f77fca5187fe7284e0e5778dddc8448c67aa81cc9b0c8b010aedd726aa87d1737abd22dbd423f7325e271fcb6d6867f6e257d8bcf50000614ffffffff02ec822c00000000001976a914b3900a7d5dcf83b7fc8d7e3154b07b776f239ba788ac04e72300000000001976a91479b7d1d2b783f73ab61ec88fbae2e56c0eee7bee88ac0000000001000000010b1049a52126fa02eb3798bb4b43578b2d03513a7b40f78168a9378419ff5ed2000000008b48304502205bf4997ccaf0314628c05868717823f89979e41bee8f4a512bb3b728c256f649022100a590d50b0cca5ef5f82beb074b924554cde69edfa2624fd0e0b2de933959c92a014104584f01f019c00a70c69941696dab6515d15c8875038b259175061abe07ad4e4ec981c94d4a23ca1e70dc13adec0a10da2cd22aa2fa5b21a24155854ce66eaf99ffffffff02e4217428000000001976a91435a9b1485261ebc0ac0bf36708fa5c06175452dd88acfc157f00000000001976a914309778abfb8ed9bbe624994ea3ab6d9f911c788988ac0000000001000000018f4f289e2e6fb064c10bd35a699b5426d542e495f7ac8a1b876653c45db3c82c000000008b483045022100e6e9eb3fffd196f29300fd8f62c39564dbaa09fab37cd45cde98c49c300ae8c4022028fe6a183ba5124798139be76ef443cd8c863bb2dcb2ef9b2900ef52084a83c1014104eede7afbb8b7d2cf67155e6f872acfa3361aa5d4e73bf0d2598d298799315a6405bc3ea85712f43a8ea74353cde4b03e0b03b33f5f86602d4e4a79be5988a025ffffffff0214741800000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88ac84e28301000000001976a9143188ef666dccf271d14ee73cc7e7a849b65a146a88ac0000000001000000011f734d81d4d6d72c8885d87b70895442891ff91bbd7db304fa4d112c20387e86010000008b483045022100cf9e45ab28ce16fe46fc0ef7f6684891518b7026d4a89cdd6e0b46374033625d02204b47035352d30560493e09e8447780ad9229d077ea7a02eb4cb8110a0113cb1f014104eede7afbb8b7d2cf67155e6f872acfa3361aa5d4e73bf0d2598d298799315a6405bc3ea85712f43a8ea74353cde4b03e0b03b33f5f86602d4e4a79be5988a025ffffffff0164948301000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac0000000001000000012d8705543251d4263493d3123b143f913cfa2b0d019249ecbc95d5f894348a9b000000008b483045022100ef90a7342fe63bcaf326648b927f0c7ade7ff00a92a18f1292783eb87456c8c502205ea535de93b38adaeac5d31c541ce83a674d5fa1381d20a88f6597c154194c080141047514c08fe46c28a8aeef978ab6c80f44412d4e45adb23ebf369410e1db24fc67fc5e0c3d19988cfa00fedb3104c4359c7a1070bb394f3fb0f989a60b1fe52711ffffffff02eaf70900000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88acf2f3a000000000001976a91475f42e19ab22f181ae659bb8b57654cdcb163bb588ac0000000001000000018a1fc3fd495edc6d8c5d08fc55376bdffe7576c7ce8d6cc7d3bc6b65743d05f8010000008b4830450221009757e45377fcd1b5d311f1c1c5b67d5613c9e9d7dd262d5337c693d2fd04803f022025a1e5e32c24610620fb54e0a7bb39d1bb7c74c8281a64ed2089bbc599b3627e0141047514c08fe46c28a8aeef978ab6c80f44412d4e45adb23ebf369410e1db24fc67fc5e0c3d19988cfa00fedb3104c4359c7a1070bb394f3fb0f989a60b1fe52711ffffffff01d2a5a000000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac000000000100000001221799b04a17495c1bafb4f01a3bce188f4cb5b39cace85404ddd986e5957214000000008b483045022100da765331c7458305fe67ffd713de3804f1990b42a3c564e0abf31bf6d8104ef10220355e331b523d3cc62ed30d11bdcc8aea53fd95ab336b336a325cd8f14390847a014104e316955a7f6dbeea88e45b93e8712ff10ca6adf068cfee4210c32d01a52a91795c7d837955bcea694634138531c1cb66c23abdb02209f78bd064ca1f4c160f9effffffff02eaf70900000000001976a91430695e87c91a00a3b9c203c076c970a2704476fa88acf2f3a000000000001976a914d285ead84a0011c2f201d67c3ec9ab605825cf0f88ac000000000100000001aa84edba72c80ba383ae1593d29501b4b18c1e3e5477ea3eff06453d4f0bec02010000008a47304402203b81f67235807523b55a48a1d1de8ba8abab91e04ae4aecfdc11ec6ecd9b2a47022049ea8336c6d818788716b38209db872451837125b941057883b04d8d1b1b86dd014104e316955a7f6dbeea88e45b93e8712ff10ca6adf068cfee4210c32d01a52a91795c7d837955bcea694634138531c1cb66c23abdb02209f78bd064ca1f4c160f9effffffff01d2a5a000000000001976a914ec8d47c394ebc7edd23558d502799478b03511f588ac000000000100000003076b09cb06578ad8db6b4ab14d2845918dd93e52d56fb8dd9a7aefe687d32a6d010000006b483045022100f0e2a31a98e77e12437ff9262c80fa24c9bf4e5707d941f9ea436b08281aa92f022065df85db32cb5845318737342320ad83a406447545a2c144d667ca4c2b4bd3d10121035b82476987874fb36d6ec3c51900f2685eb32ea0af26dbcaf4e352936c658885fefffffff535a7ff4141bb5e19c89929921f4c369e301568a262faa4e52034ed44aa258c000000006a47304402207f87020f51c87f271cb5aaa401f4e300011840905099c17083a6faab462e020702204e83206144d58061c6d4a9404ed5fe93fc670f88b670742363bbff1f9491cdad01210374ffda4d0d05f42725faf60c40b207a5fa130b2733cc8788cebc4edf83df00a0feffffff9ff39c885d0b21400d64ae86c9738c098ca5ca0bcac26623fde6c02178fb7cd4000000006b483045022100d023e89bbb4146f9b19e655da83e99d67ed3a0b20ee83a9d1aa653542fadc14b02207c9b7ecbdaab342b9c2ae72e0db11e6c21f6400ad976da1e4233c61995ab58f6012103e3146c787eb374e6743d76647b18335f51fe1bda826a81053f8c4da609a2d403feffffff0220bf0200000000001976a9146139abbba94f0511f01bae46d03984bf3328eddc88ac33770f00000000001976a9142579a29c3d7beb7d727a8b7efbcd9ccc090f773188ac6b7305000100000003c760b315c2037109790e51cb1f139e6c84b8b12f039a2acde53ae9bc0544711e020000006b483045022100d521334b3b5983a3a7fa029324a9c841963ae3ede8cc8b7eec42944eb565f6f502203709644e9745d212d570ca311893f277313eb1a80bb98632dcaec35be647e8d4012103634e6959e745804a48abe16a2ddeb610602cd118a34755bcdc90560840435e34ffffffff78acca93811a4d6b153070c3c31ec0232546b3f810c7fa8f9b3e7790eb590877010000006b483045022100bc1660c7604bd06c165df612685ab230d3532dac54b7021f90db367a3b6f7e8602206d43599b28fad0ac19126588b5c516f90a03e3c2f738b8089751bc801fc591a6012103dacce46f47ad6a668eabce3e9d1b0d11ba8f04c8237f4e0b44dc23dcf0b29ea8ffffffffbfeef9e9c1c8bd197212dcddc177508b5e203b8f3540e6b2e73c4e8916b3954f000000006a473044022052245545f80fe9f8a65fa72998a241dba23ec296ad274a5547055fc418632402022013f5a6189281e133f48e326d11055e1ac88ce50f041db490320f626a220f951401210289dfc24b6ccdee409259a7d851cedddcfbcf3be172440b883988497253049307ffffffff0157e25d03000000001976a91447901cb32b5c682580450753bc56f5959cea56be88ac00000000010000000104a098b36afe0e2a9684bd74d0cce542fa46e88583b15a049b7d2422e202d297000000006a4730440220474f4b189cb566228922a9986730e3b65141b3e0dfff6104ea987f9e6a9c21ce02204df177c1f4834ee63bfb4658839c6ce4ae93c3f08e45bb86bf9b6bbde9cc09d2012103ec4215d376c572beaf1c48ad4ff69162bd4a1efe8948ca578bbeb99fd1ab80c2ffffffff0280880000000000001976a9141d3f3e7811def0f11c19edb862d4e0eda2d31b5a88ac204e00000000000017a914da1745e9b549bd0bfa1a569971c77eba30cd5a4b87000000000100000001551cbb8a6aeacbd2b969e1dc4b4cc5b5f252b9a10b14f80d87eccfeb1facb591000000006b48304502210081aa4fa55d12a533389978c908395e9461b87afd861c214bcc96fb603914059102204df77a93c685827e750e69b950c5542488c982cc354dfa4fe62511635cfc85ba012102f9b024cc53a145393bd7db45095cbe0867f1c46f608f78dc6a4219f97899711cffffffff06d75900000000000017a91440a755a63fbc5772cdf08dd13d09eb3f53c4314587979e4500000000001976a9148be16414db228a6e4d9ddef614816e2e9bc7cd9988ac845800000000000017a914177b27b818d55fac1fd75c429024b1b8bd473c3887b45500000000000017a914ebd2d9d3ab30583c9dce846538f85e3e92436d5787d45800000000000017a9146302519cf2a23afdb1c403245fb6447caf75fe8887286e00000000000017a91419b2df584562bd1bf9f05a6b91f219b912e8aae487000000000100000001b891f1aede1bfb556dead6da9679084feaab2a443ac0348262bd292e2e119b47000000006a4730440220798d20631fa10067cd789b78fb2e414d0a37201794fab59589433952a4a7a55e02201079016582b69b2ffc2a7979e06d2a4a04286b329fc8f9e47a16d203a8dce3d0012103753d2bc5dd476a428cdbf408f3a18cf64bff8d3e0c0d3e66412062092faa6daaffffffff02e5a87939000000001976a91452ec7c0f46079166be2913f2a56c484757b79f7388ac00c2eb0b000000001976a914542d1fa1fd285d2b8ecdae3052cf5b5e0dbc479e88ac00000000010000000149a27000a23b2c8372329a5d91d9d716c1b7bff5978b07f5c3fa2e917e0cfa6e010000006b483045022100fe0304b42ccaefa198c8c8fb79e5dc9ee90264c91f0660f3066014c3dd7f4a9c022072fb076b956763ddc5bce425537add720497fac9f4fbb116a16e767ea118d36f01210387bfc30f41630ba2369fca54448ffb65d2a2e1e2b6a29d3a1592967d6fc1f6e3feffffff02da61bf01000000001976a91433655fcb7c93ec46c9ffca277e9a921d177c5eba88acc8418600000000001976a914408446ef75571b162aad83464a370909d5ef30c088ac6b730500010000000121fd41243d2d8a41e82cb1688dd9a69b0bb44063add5bca960c3c77b1edbe55a010000006a47304402206e1c5625bd11694f1e9d24ba01753500d635d01524c3e17c2188f3499c71b642022044edfe0dc089c661a5d1e59117f60093a97bd481f5e0329e438b79b268730ddc012103b392197b7c8aa33e913d11abe47aacbaff0f82573d73b4017e3c469d6faf7e4cfeffffff0294702020000000001976a914370618eec9462bdb84041cd9efda5dd8678d413f88ac4accee00000000001976a9149f74449dc90fbceb3a01bd122f2d94053014e19988ac6b730500010000000130025f9c35a6fcdaa596b94a41a9c679e66b2c8d8059633f85f27496dd533346000000008a47304402205da0fc5e4a4d179bfd6a074e6250944b2d2967f2fab12e0951633cb45190900602203117dfa17feaffb3c9323b58ae488e233daadbf48fa83a1b1851b1b9dd72c3230141045df6979005f1c6aa18c3c584a6f2eb497dea8063666b501af64ff704796cd00c89a76fd880852fd7d4a39e7990225f63bfae738ec8260dedf3aab4b69e4ed8c9feffffff02e5a4c71a000000001976a9140a2744a882cff0ee83a607bc9543df6f59966d4e88ac005a6202000000001976a914f41e218ba91329c8589d528e8d5127f58629ce2988ac6b7305000100000001f948a63540ac888b7787904ceb2d18051bdf45d9b988481d4589271d9fcea686010000008a473044022075d631b4ced8dd0eb5e8ca55641b06ba720e3fcab383734c5e42103434b0051902206fb3a1ed0fc63021000ad911f6a37f128498579e75789a0d06fc37a4fdca8ab0014104cee97d83b2217a920617452d2ab704fc6f67c624378710d440c6aef7905346fab8cf7d2b22853012d32d4a2791e02e3727abb5cb2edfd1f89b57e9333e07f815feffffff0210d64b00000000001976a914e375e3edba517501576a696121748de6b0728d1d88ac27691f14000000001976a914df8783d628d4c9ba82499e6c2e6a770752249cf188ac6b73050001000000017de77a4c0886ce3525583c5ba530e1afac84e2c974fab78ea39ac2cb1847a422000000008a473044022001a93308ee78cc06f6c1f64e009946f08dcf8298fe4285bce7ac8d6acb398ab1022023bbe8892445cbd71bced8f3f6d78cf4687808ce9b0c5ea053e977e80f8840690141047057ea524f27f1be6a3fdf2175ae107e62e4d006c1714f0e767a204ae1224a0555bcdb46700249132633727be8333625bdb8e1ab11f223edac848a0d85c2fc42feffffff023d7b881c000000001976a9142d18177007b598bb5f5f88f2c7b25df41caac9ea88ace0de3001000000001976a9147c8c335356fcd6895a2296bae552480a4aa8352388ac6b730500010000000145abc36bb9687459ff4de1894b127d974630fb1a3d73ade474eaf7109ddb9659000000008a47304402200fc913fbdb56af117cfb97d2bd50b35094d9e44b7d802819edf2b74ac26c13b90220675082e79bb392a428ddda8683061afc260ec6bfeabda35d834790f0587d6c8e014104b367f3f19344c38fa5435d0d12c9146f8fd49119cee2d498f8a96797f5165ddf6cd2b6b66f5b21d5993d7f02e6de5e2d39b2eaa420e2393736ba862365fa758dfeffffff027dca1005000000001976a9145909af5dab4516664210f686958efc1fa8ee062b88acc0f35e01000000001976a914d409ae9abf2892e3b23b7e411cc4af5bbba4c03888ac6b7305000100000001d94c39526b098947b973163d9511da14926a1af4fbf2355c4446b2a59dde3137010000008a4730440220739c85353049baf5a8a498df6fca8b2631eefb28c67bac4495fce3c1530bdf4e022062ecc477af768ee743b82fcfd4b5664392c5d2f20475bec1bae567a3168eb5b4014104da7dde0a4f252f9987cc301e7c6560bdd8bb85a908ba1a6936bc96a2f871ce0385bd4558fa5b1d2939554a47394de736c41be002935c19e9022f0e0f91c20275feffffff025d2beb02000000001976a914ede1723bfcd10f72b1633c21d3299ad474ca01a788ac804cce00000000001976a9147ce7695c6069847d2e50b3ca0eb5382434fea9d088ac6b73050001000000040c23a4ea2254b76a21da06bd2229e91693f6d3e58cab4acc1a56020ee2ff1e1a000000008a473044022004afe613bbc70b82f276ed2e1fe9999df600491f8f99d6b716cd145c46c7d30202207c1e2909d890a0776d5f89386c12f80c8a52f2714991dc2737d722a1d5ca66090141043fabd43be8e1baad3318d58fd0835e207255208c2c310c32f378bb6f2ce5531eba206b5b576c4c450e4e7b2736c2a8c2be1dbe02b88079e770ed86fd12e7fdc9fefffffffee118e884774fe56f2048a42fc875cc5d53226142feb1b0f3b8ea1d424d8aa3010000008a4730440220385623b0f3b16d7c34770e45351c270c9749482527c1e5d6162f51bd844d721a022065da6b9f444cf3fab285eedec5e41d098a1a59b90144c2de51c4f8c31adeda7f014104860b649d2244e5862598372cf98f3111d1e039d1bdd0fa6658bcb35e90aa526c0059120c44ea4d53829e43949aa7c9f86ef3d1a37dc31e67616b8e5b00f6a719feffffffdff8238a2350a9ce5bc8a627e76be82a725d5f8705b249fe885126ee7db249a8000000008a473044022048c31419046b29f68e14c57078615fa79c682061cd435bf56fd916ef62e6948302201e1f0f736f3773062aeff6b20c481356706a947970feb305e319764eb61d8cf80141046c407066b6745238601c096c40838c3b63c7c38eb840490b64f0d3f63421aaa566f65269e94b26ff93ea2f8bef5cb12a1e491c2f0f1c529376ebc8186c5f6a49feffffffea002a1c875b4358518c6c6c00e6a679ade13e7fc98ec466e6b93ce4a6ef68f0030000008b483045022100fee134e87fd8a4070c32a410fb29eabdd9c95316688c9d4166131c96f683b11302206cb684a07e70e380d076458c0d8791bc174aab6f316a3e892aca48a24cb8c32e014104de2e5df0d8f8c4a3758996b407a33aaa9a7545d11403eeada17145c1f9c539c67a47b6369d3bcafbd3de483b4e9615a783696542803315a92407be89f3c08a50feffffff028014ef03000000001976a914da53c3330fb2a9510ed3f10d217ac675eaac812688ac691d1000000000001976a9141d25595e1e77e4074c5c215835568a09520942b488ac6b7305000100000002a4f921e8751b3e85f874b6517898fab5e67ab89d6425e99d7d30bd21f91a361c000000008a47304402207486b729088ff9da6cdbd14d2474622723ed5a7b4e596d6a7b8b00d2836e6e560220571640262fc47edc85f0862ad98da17888f9a655f2c08589062ce5b089660a5c014104534c91d1033679ebef054d26f83926c0d635b434a8252791246338fc6749a2b217720369d33c8c9162ef9311cede8e994aba718ccd5a0feef2e93ea47fd24c44feffffff4e274a32f9135cc711c71a5f9b468230055d0711d5c7d3c3211ae8fe2a1053f2010000008a47304402201c10e9c402aacea7ade976a5c79da7bf59af6a4e66c28492636d2e3dcca772c9022060c5b3061e48bea5ff2fec5baebc9efe88bfa6d23f51ac0d7490b7d3bf037752014104751fca4ddadb7e29d9290c4c7fe20232cbdae2cddb3f201e9999716a9007f7f6d063c0667d0122e12b0e5c2d69a9afc0862e95772722f949296d2374541e95c0feffffff02dca7d601000000001976a914679073654786942f18aa47ba13bccde8b27ef7f488ac90ecfe06000000001976a9148a078a671cb1e43fe6a9b3273eccfb806764c23b88ac6b7305000100000001e90cd5e374dc13316f0bef529ee06e98724fa7c313347b14c023df8a2f8009d3000000008a47304402205dc25bd364bad5b94c61f2543598846e2d19e57a473365412df342da47efc8f102201b369031cdfb44960c3648c35828e931236c7aa6ae2bf3c9728a7fb032bc93c0014104696bbf8b348769de91da3c154f7bf5d4541a217d278154dc65df2688c6e402e4983ea21a9dbace4c7b829dc29a901dbf0707975134c3174d2ee8b3e4ec88649cfeffffff02c0d8a700000000001976a914c1ec36cd5aac57fb267152c58374b4acf68eaac388ac599a2e01000000001976a9146cbbb26e733385908ab9a22d68fa5433b95e5e4788ac6b73050001000000026cbcfaa83de070785187262936e2e2648ae25c5e33f802dfc323b5e7ee2ae117010000008a47304402205aac00fccee79a44d03c1d8ac6646820d66efc424eca5b262b30183c865a4912022015cede804a0730aa93c085bdfd9cf0d62959cb272ca6cf09eff7a56c77891b010141042443eb65532c904cac2a2dd110c37e1f2394ba662f99f46e031a7d4de3822c2a60597f9b112caf44bb4a3e2b039c9734c0b3ce6d4d9cf69052158452aeaaf048feffffff033d639996f7201f09f117d4adb0af9b801d547c25df536f24eff47175f9a8de000000008a473044022010307b9a3e13d5e3930d518501d8c052c5063eb6959854acf0b19397f551b2ce022026acedec8fe4e626adb769443b329eaccc34eaf5a47224e7edb70fc85185db5001410493d25b6077915bbb772c179706bb03dcaa78ba11db625fbb8f30534a966552cad23620cb913092756568202bedf9ca61bec1bcb6c084840121de70c848dead7ffeffffff02a0d88803000000001976a914456edc10750cb6196e10d363f2b7354c1ad5c4b988acb7939000000000001976a914aeda8b4c43d5165d0771aa5e0c4606cc8771813288ac6b7305000100000001b3b3057c8edc25c22ff8dd196220082eb6f55621b3e4789b0b98d4a1bf12f9fb000000006a47304402203b167f7aa049e3aa2d48eaff085af956712474d64901085b999d7010a9fc4dac022034c575f3c086ce6846bbea39ffda73548ae18d5931985dda6c8d9fd5aab054d501210375921ce0dafde0ab7995f1c5aab9e8f28343e92d02bf9d58eac51e2600cc6405ffffffff01727eb404000000001976a91482d1d4412c2960cd904f65b406b14bca8e0faabb88ac000000000100000001aedd6713608438f0ee6073216310f920902e0cb6ff56e2318e5d62f180801c34010000006a473044022069db66dbeb9efcad4b948ffaa6decd2f580fbf451386f01f0e65e33c14555e4f0220470eb90605b3a36868e6ab4984007f06c61dd0704f5d9c8b32b14fe0e2639127012103731e2873fda2698091a86f570270524829f2a20a2c5f0e17757fc94a892d86a7ffffffff012aa20700000000001976a9143de2754334cbb32e7e2044f2c4229ed5924f9e8e88ac0000000001000000015493140afbc0836a488b29de5b6189e5448f79d8e3050c5ce0477f67e89fdb2e000000006a473044022076adee2de46059e5c125f803452836418087da88ef376e5f6d1ea7690203433f022073506f56beb64f4b4ae2aacdd7db300ea0e96aac477e34a4ac08d5a048e0de55012103b813445c8b7ae98e723b2c3b13312cc2c11bbe83ed3e2d6bec020bd38d5ad988ffffffff019dcd4100000000001976a914848b666af00163fe665f77f9b7e6ba86b2d94c0088ac00000000010000000145ed0168be77593d04e6db69c957b0105e371830cf675830d51d22bb3643d7b9000000006a47304402204203e188586200e71e869a73f84629cb748cb6669fdf2cab1abfda714d0e76de02202ad66d75c74f3e30493ba35b8684bb46e1a7df8d67c0e023a239b7279cba6f08012102166db204432130284ccde5074e74233207bd2f0ffbd745cd068976639802817affffffff0291dddb15000000001976a914c590f4636c2d7f5b45546be2da07afef841f99a088acdc025201000000001976a914117f63c79e3b58d356788d9584cbe80005d928b888ac000000000100000006610dfe252fdedb1920b61858a745c83ce5cf4db5283c9b102feff74922258f3e010000008b483045022100f92436c9c6420dc996bb2a5ce82b0c698607ce27fc3cd459cd043daf33a9ca8102204f29f1fe8edd4e686b1558a440d5dcc9573005da781aa3faf016d25467de59850141048a004149964fc211baae2ccfea29d7192c4eaf0a51068efc066a41eef141a40bdb995dd371c139533477775e92634bf395139de6e8caf7df2c6fa77a2205f841feffffffee61d526328eb371fc8c3c9a539eec7b97a6a5475cf62a359c12f046222bf986000000008b483045022100b122a8cad3a80789d3386210dd6ccac3814d4bdc0f127e4fef7d5d9554feac4c022012e0c063edf8115d6add1c5bd798d8d73d6022d7f596e74f6ae979586c8c39cf014104c91b6aabaea166cca6a275dc6932d1cd9d545131b7a15ce3e69b37220a4f47d5f6cd339880c8bf20828d8945144d3a658e38f727ab811f5c451f075aaf372cc4feffffff70d0879d60be54cafbfb7ab79a2e67360f89e8b20afdfc586630ac93d5d4f877010000008a4730440220526c3835a9290eedcc3829e6c91e18499eef468b208d489c01b347d7da6854630220682a7796f20ea84a1bd68e9e8ddd6a2cc72569e4f7f6575cd07113123214e4d1014104fda8f815f0d2f530d4b13f2e0460697604ab82e69e1ca84ff65769d63d986cdbbf4c6659b2e7c7b086d234ad555a5401d3a9f5f4a94b03e4c1e8137fbae85aa6feffffff05359e9ae9f441177b477464e6be92faf2744d34ec85391d2d75d5584cba8db5000000008a47304402201d23ccb337a9732380afebdc8bd1e57ef9cc5b672c946680d7faa3e7e1b9ea6d022058a589ded9c21f85dcc96d5997b593f57f501509ec3d4a6946acae844acbfc9001410411bc365a73dee2acfc89ebd0c4b98d0bf740626fa52f8d9534b2176424b4dab7daf9f7addb9a404dd36709f930c34a10f24764b472013c27ff457a3db4ad65e6fefffffff744ea1f97990b0d8cd54e77b4f8f9177ed7ea791e948249b9fec10073467291000000008b483045022100ef9eb6938f9689f4bed8cf9a83911164bbb2f08a72eeaf1aa124ff4b755da62102202e3ea13b3702a2e45a2a7a5790a92f237350ae6d06139fb5a5c26e5e78bc12080141048a2702d356d7d2bee2c3baf46c421d1d426f3f3c460bfc02009c483d342e6c76646590a64e3d87cf074853dabbb19e6dc207695dc03bb26d2da8ac65ad600e63feffffff59473f3dc1d6afe2e1023d1aa047a9338a981a914e12598e2a6cb31f5f573219000000008b483045022100c62e5c66109a1b2d0456b4f27ea71fc80df1434937da0899cfc14eca05062ac902207340b92d4d34b8029a931a27736c80528d5317f44a8cc6c151406803de1acf49014104bb47210b16ae138bb48ffce9f04e6032cb4869aaf54650fc6e3e7f504bd7567bb92a3437ac4d46cbd4f943325494b2a7339763bd30b5af7ac01bab8d527199f2feffffff02b1e60f00000000001976a9146d09b3fa268fc0cc66722d4ad5ce9047f618f50788ac00db8b02000000001976a914c89f4ee52654e96c2e49e1cd5518c76bfd8b1bf088ac6b730500010000000341bde9420f1947fe26a5321431933e02029cfb4655039aac619c777d9511c929000000008a47304402204717c65789985b004da6064e1b5758ae60fb37db6d21e951a8d5cf8e979776a3022024cac8ae919f1db1cda91c2ab6b9b00a3003d0fa787979ba8ab57504f8aeeca6014104165b26b96a1526054a44ea0b574938b58d3b3fdac9de2a9e52b267ffb0d3f29282ccd79a852803941e8cc6797f6b5b0d00cbe2d91c2af3e7787b84cbd378e132feffffffd42a867326a342cc49b0cc2509b850ebbae5ce9757462742ad292efc234bbd02000000008a47304402202050811786e74604f2eb6f8444a5b7e8f0891f0f4279838bb9520d369e3f23ef022006b867cff1eb9c1571c9886e2247c3a89f06c2ddc86a818933135fd1ff3d2426014104d5e1eefd037caade75730e666ac55f7a175dcb935191fbfdd67b7be017c4ba69c12e7e0f51c729bb65739d924c1559e84b3714f69996ac6059ff2d057dd006b9feffffffe70146022e637cef27928db264f92702dd9dd97326b8812f758f902817cc33c8000000008b483045022100da0a9a2ade7c8cd4e12293f13bd5e69b19a80d77bd55ae4b71c9bc5389786f3c0220759328ecc71e61ed39b94005d526014fab53f9544bc592253371e628cf665d8a014104c831c670a810276f0fb7c9074d2380bc57e563bc2eecbd478f0d7e8b15632548478f412a7e184bfff6a5021998e8aeadd23cba1cf95c573187d432fa247284a4feffffff020e361100000000001976a9143b6c0030bcd515f6dc1d3c4b90e4d101320895b188acc0912100000000001976a9141121fe40bf0c2ba887f017abc77aaa9636eb5f6d88ac6b73050001000000016b52db9467e7eccaca9910c1af55487b4213157be30567aef44fb17c93af2428000000008a47304402205b149a8cfb61f25cace003fcc5de8a399fb0ef088d6c839ac6c218a69219e0a0022050839b133ee1c8d6513f74edff189250b78eaa268c5a520fdfb9defd46b49d970141042d87142ad4b5ae0bd28dcce8d181b1200ac0616c103409006fdae7fe610e46cd2e7ca41dfee001aade71c5d3a8ddc273588efee76b87431a83fac2b1da4bc9f3feffffff0270347504000000001976a91432edf00751e493cebff40cab55b4f6715a59f36e88ac7e619b00000000001976a91419dbe37486144fca422f694e04cf02d644510c9f88ac6b7305000100000001b8657b7c750ab42ab8048879a2a497a523b83330b622e982e5625fb96ee2a675000000006b483045022100ace90903d97d6e2e7e1ca1baf76c93ce7adaf141a137875d9ae1e26bd3fd0dfa022005701048795d94c9a2fe9ee482fa18ee3eede0e42f11d10ffe42ab2dcbd78dc101210323060c72f72a1a3d02c793be6e2b5a4a8995cd80fe668ab4d2d58a09dbe9f389feffffff02a8290e00000000001976a91488608ac2495bfeb6681936e88ce7942e703930bb88ac60ea0000000000001976a914175e1bdefe0cb110e409c17ce2d6231d492ad1f488ac6b73050001000000015fc96fce2130f646d0ee5bacfa54d4b428aebc88f514116cf5c452db718535cd000000006a47304402204b06d0f802cd776ea8b5a8989bf8faba2926af803b61e3724074758a7a087f530220364f1c939524db16f3181d27a3074f76aee277ff33cb3801293ddd824575eddd012102eb1745b8425b7c5ed2b661066efc20de22c031b21dcddb2d4a21c05f365045cbfeffffff02a0860100000000001976a914183a6e66d6712399d05a30524fdf803ec46a292488acd0740c00000000001976a91480f963dac9713df08b073502334583c44f59678588ac6b73050001000000017acf3524e1174c8c5ad40944e16053c5722ad5900a81080323d74f4230b2dd8e010000006b483045022100e6ca75c970a2e3218af9218423928f1e5c6b54a8b3433833866b4b9e74243e2102201cbce06c5feba87dafb7335dd2f924eb1115c352c983687aabb0f5e1cca61085012102cc2f4b82847c2f28ebff5560707448cfbfe2f21ddf69b9eceae6d33e5ae006a5ffffffff030d3fd50b000000001976a9141b38c9937288abf8410f0c82972138e85e4610db88ac80c8b308000000001976a9148ac6f52a27b8fc9ac103ec037f27f6e01d27213388acf0ea7900000000001976a914298f787d25a8c918be3ac8d3dae97de97dbd069388ac000000000100000001de07de55556fd20dbe5375b0617fa01d240e328c2a119cceedb81d42c30f0fa6000000008b483045022100eee004b9b83a38cfcbe9086a0f10ee9eb01a6955e67842dfb725fd763c51aca202205d73fe1bac26da07bc0140d7ae92cd366fc52dfdd3ee29e951913df4dfd6376b0141047433d45fc5e77af3b9889ad48bb2bea24da92ca1f0a64b224574a74933353ebc53ef51bbbcf2d4b2ef5d94e4bdb8e17754356ced2d73b4c9188d0569d93cbf3ffeffffff022d13b83c000000001976a914a395bdcd72f987c4da56c18800adea46e7da1b1888ac90503c01000000001976a914e3c9b9f555dda8faf46f169b6302157edb9d6c2788ac6b7305000100000001c9023028bd3b3f8142803863148ae5e0919c49a43e15e04358eee99e907e9336010000008b483045022100a2f48a5b39e31122f343b9c34c0a195450f48137230b5cdc2e9cb5c0f8a7bbab022053073a152460cd42f531e3b9fd8be8627e5f68430e1eb3a100722bebd9f0348d01410421851578f99ed2fd7af9bc1681e5f1b6edd792048cde66f8c34ceb1340d41d0b1e26fee296aec7b0be574723fe2f8f585aeb4cc603a30b13e291387d37b6e0bbfeffffff0240660301000000001976a914eb375f88e164b33f783f4e6650705c327acc579b88acfdc9c91c000000001976a914861cb5c02ff83c3c5c563ce28f1ed545b23da2de88ac6b730500010000000157620c2a1e2a025f7c73578866322be0aaff625c7a2348cf6ee97580ff970f89010000008b4830450221009844b8eb6b80fca13cd040533c9786b977c35d09a3a98678438257a2bf1d119802205ac37a60f46827dd2615fce3801142706f91845f3ff0a298cf41047b5dbedb1f0141043218bbf6141c254d72790cdb8723c0fa04d7f019a76b0623731d2f464e8e715fcc0a96928db30651fb237fc24d59d10513267fd87cff6ad0f3460ac9a5b23e47feffffff02e21db331000000001976a91402d8d43546593a4d647d6c09a7713e30792f18c588ac30037e03000000001976a914cb190f1afdaece24ecbae350c156f4c249a5fb5388ac6b730500010000000133b33b7096c96de09dc439443a95398fe650f7e7c9c616a039ee587d5388af28000000008b4830450221009ecc310cfd0ad0fd5bce987567d3fc10d1728da6d4ea0e021583b278cf3b8cde022011bb565d522ef37cbafa28ae087d57bd6b481264ccc86505a86f9ef5d3679fa0014104467f1a98656db1a4792432c9d6051ea43a54d8c2778cb4a8c9459b91d39c75a2c66fa899de2edd9ba63f590646567573f5eba34fa1b535ad8916a3384a770083feffffff0220496900000000001976a914f706c28a02e4b701076052fb99a993f9a9fa374188ac3e6c400e000000001976a914cfca16725d1d20df7d60218916777b42f87e604d88ac6b73050001000000019c9cc5bf058fb24846f164138504a41f28a9576921558ec3d252e28b0f6d86d4010000008b483045022100a933f5b127b7c40a8afd56c820aa40c9d0f5175b0a76b052fdc971255aae6917022001679d0d7bfb21f353445af9cf3db6723aefd2388dacf5a3df17031fef429165014104f4401ae1622c3169496d4f1223a74ed2b5dcb50ce11813a03a57f1c41138c704b575abc06c2d12240389a6ce69427a8246ad92221c47132410353f7793c3f473feffffff0200c0d401000000001976a9148e68d87aac458c7256454137aa2dea428f72b1a588acfa79f100000000001976a9142c5bdd2bf3f8ea7b679e4d7fa28c37f9303452c388ac6b73050001000000025f89c72f52e4d08218cb6796ebb814d6facbbb0588ca3185291257830b343a09010000008b483045022100fdaaf572cc21d1d6adcb6717bfdde0f12ab65b2be8eb5a602721911762469091022024f7cf367df50f43f5ee257179a3eb43d09f80474170322b60bdd3544a65d5910141049f260ccaa1954846be9e2ef1f1a81aa9a30737ccbefca1ea6443a9cfbd54beb394eb2901d850d6bce273c874e79bae792c618c6ce8fd17ab245ad769300d0057feffffff30f5fe248019bebf7ccd132b27e4c6f876810b9c05ca58195afc358621a467d1010000008a47304402200ea388bae9083e12fe39dc2806f850b4653a4b32e2c7c087127d80a079ffbd5402206d7e76fc04ec7caad42ca69be9066030dc90825b008096da5ad09bd6ac346d550141044cd82067bac6a6f2206e2a108d396816ff682e387ab2c88d9ea8a1d8fe42558cf3bf764bc70acc726f6000d729f0c583dde0c81b2ca519cdd7b270bf65599bfcfeffffff02941f1d00000000001976a914c647c50f3310e9539916e8ba328eb18e5e8e760588ac701ee400000000001976a9140ad39e1ad57aa9a34c8d5bab5462680b2fc25ca188ac6b7305000100000001d36f1a82dbbcd2eef8efc72dee6e66a5594a321d19c3d2a116923244db68f468030000008b483045022100aa0b63cadafd41b8a3e75bdabbb6b15791afe957c7566ce28882840402e9dc230220674b9874299ec5d0932b35689f17dafcd246c4151f3862568087981c394e48fa014104fd8e0212b9791b849093e00a3a31e690668fcee5dc783e8f7cb7b6fd4e64b51be178fc405296ec84679242c92a12793ceefc7fcf7f426a9f8b448944ff97ed97feffffff021db36d01000000001976a914d0e03fbf6fd1e15a00a7d7f59e3a625eb2d7b70088aca0db5b00000000001976a9142e77e0441faa4c821cb3bf77743b977102c9d7a888ac6b7305000100000001dafafb4f9b45091f51f2f7cee2d8b320a2661ca3385df81fd6e83608d7d9d373010000008b4830450221009514f2fe8551684dc38ab56baf257abca51f36a6901ba0ddb08c0872d91ad873022061c9e52baad12fee89de0f34b49f6ea4d8f2ae44858b6d70fe5b2acaec9bfbdd014104cdefaec12941b5891a7a8202055815030a55f6ce6dc9702f530bf3db5b57fb75416a64ce61260869040b56916d13a5f0f0c571c6b37ef50863e7ac7d882dcda2feffffff020bb8bc03000000001976a914c333d3c2b76c7132479f06c647d20faa0403001688ac707f830a000000001976a914bbae59fb403f55a5918f70fa17ec6438067c9bc788ac6b7305000100000001ef695ae4b8c20736aa574effb0de418b5007f4dc1b8affb36b52f9e0b74563ff000000008b483045022100e7c02e1011d15ee0596fa9b686cc50f343c3151ab3bd83f477b01eb670615bb7022074656abea3417d3637d81dbd80e8dec82ad78bf5f1c70f01df19b7d94852320401410447c2079139a9050bb4809b136fb3d048e1fbe7b537ec158d5f35a4326e2b1bcaf623f6ef5083d88a68cd15309bcb28e3287aa4861b7660b08a98666a7a4617f0feffffff025a513c00000000001976a914c71633be4de58db9923af76b24f88b905c69104488ac002d3101000000001976a9141871c16fb15e1eb9f4367305bffc6a31c13ac10188ac6b7305000100000001f50e91d4768000b15f8204a2ae110b0508c630f1e602ec1f83a4f75764f03c92010000006a47304402205bd7bfd57af89afafca54c2e6eeed18ca349b5a47b2fae933d88afb9e5b620e20220781804fbeabbb7195eaddb911adce854821c0d78a3fbeeaa51e9a2074b449154012103cf543a431e6e171fcbcf7456d86e8e5c0aca24aa523503a56460aee346ce5255ffffffff0291b7bf0a000000001976a9147b3aff0a6ee9aa274cf07bb60ad9bc8c506b3de788ac87ed9400000000001976a914e1c4314ee223e0040ee91ef220aebe801fed329188ac000000000100000001d4bfe3e3f38c7f75d3007094722e705464c6dcd09349281704bb38ea88ef21f3000000006b483045022100c1d64929797ccdd2a8f530f0f4a660b5eee666852e28fa46dcc0eb792fd4e23302201922e32927d2468791ca45a09bcd28969d2448cc59daada5359bae23805a0977012102a6b1d256e9d3b3019ae0d522ae848486887f10bd07eacedc61b739d87f860f49ffffffff01600b2204000000001976a9146b06f7f3e67f8b9cba3781db44a063001be9e7c088ac0000000001000000015460642b3baa14d6d10b56660e02a9ace786bb3924790e009081ac4a5453d552000000006b483045022100c99623df8a153ed0ad016ded0ba1847fb67d3ff57021f45605f620548b518b2f02207bf879d144c65dd7a0106d8f57868e3c9e58ad46decf6b78d2faca9269f73569012103e47e7ff7db1ee7acf41031bc6fd58e41a4720e5f8a664bce4ef73f197c3a045effffffff0170811201000000001976a914c92a19ef9b1870d667118390a63f056206a7938a88ac000000000100000001f950333ebe505f50497016fd4cb80679ce0735ebaab59c1380f087ac6091bc7f000000006b483045022100f253ea00a6e27eef23f361715d5b81df7aade17cc0baa4b1d0f902ceddc93a60022017a9788dfd0f40a5e86e0bcc005b62bbeb8dd78aea49edf1b814a63d673188310121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0170811201000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000001e58219f400c731b2794ca848366d2a05fc8706bb766f88c5e1a9987775181494010000006c493046022100d9bc2415b6cfb90fd7382cc0e1ba6873c01248d13e801e45b7b4b9c70da72e4a022100cc86d1d7fe3fc32161da40d86364d03025c35f1d12dd6d44672903c28a8196ea0121039297a3d6ae6c39a4e9d10d0914a614f7ff33c30359e3339e317eca435a0a5fb8ffffffff01f030d30b000000001976a914052512987b42c82119e245d2dd1ac13f25040a4d88ac00000000010000000298904d7aeea69c514e72e66549b1f97555378dd3339ab318e140db5fadc0de13000000006b4830450220265dc454e58151236c78a7d360a3257e82056fd83e1fe147c7343ad75ff464b4022100c6e345d212e1f74ec669fb2878c72ae75ce85088a044c436e8a2a4856130c29f0121025ccf220fe3c13ce73a9e36fa833d24c6dfa97147581b417c100919b351509babffffffff5ba80c2ba44030e650e70e208eae263d4737508dba8e9c7e811b55727e1fafe0010000006a4730440220607c2eb9f30ec6919e1f1381041c26619f25624d3f10704c04ab0c7df49c01d402207efc403c0dd8d4227adebadffe37ba49b6186eda788c928d2344200957217ba80121037a6c265394aabf6d0c57e054a9e92dbd292abfc2c4495fedeb461b5bababdfedffffffff0250218603000000001976a9146abd8fdc78dafb3a46b4e115f61d5ef70718303888ac012986d3000000001976a914c19197d5169d11ee09705dec0002ba6130bcc5c188ac000000000100000002cd3572a1d88b138aaaecef543fbc5a6af7940b35d482e7f7a143477035d5fbb80e0000006a473044022056cf51b44cee2229d52e6b0588e72f230a34bdfb84659614f35097248018db6f02207d78567138e5a5bbcdb45c45be5daefc859ccb02871d540439bbe51dc7691ba50121037f12513fccd7c0d368a04c89a472b3b22bf51dc7219d51f5c87ecc3ac090a767fffffffff82e3f69930615e41b427db43a0bf0a7ea3baea9cba77694e67c301744813717010000006a47304402202a898a464e428feaaaf0030cedbd3c3e0f5ec632b8cf74f4aabc958a8eaa338f02204fb47fce736a50515d817e758ac82f2e25f2efb764751b298de9649abf7954b9012102548bab906b6f8d5ac3b3c94cb9bbe79318565b249b2901d2b4e0d45d3a322825ffffffff02001c4e0e000000001976a9146ecbf14333b99e4042b38848b3b8adc36ecc7acf88ac98db3f1a000000001976a9141327420594ab0f81a890e8311f1f5eeb8f7e65a188ac000000000100000002bb3a28418ab13c835f602cc2a3ab6447c2858a927963aa9c1fe60fd5d0fa4e51000000006b48304502210091c01607215fbb5a212627fdbeb485e8b69166e4e33a46b772cf64caa338f8f402203e417ff27737309d805657e1625617c1c3639a5c38fa1003e4a641e936802932012102d005ee5b656ac952e27ce8f186faee480fa3fd507636867ce076c826c7699684ffffffffeb37be1c1c8652d7f8b5cdff8a37082516927a87feece972198e95de1668931b000000006a473044022021e8cf072339dc39a632f9b752b4ac17ca40bf3dfe679e85d8a27d2a444d4e0d0220029ef93c89e13ff59906a2d0ca02024d777fb976e121c14f098fb21fb727c25c012102d005ee5b656ac952e27ce8f186faee480fa3fd507636867ce076c826c7699684ffffffff0225020000000000001976a914442aaa24540db8d5a75a1fa0f3df1f849617a9aa88ac3dfe1901000000001976a91460c605067547b894ae69751e42f278e1a3b9978f88ac0000000001000000011c9b76e5f99fc2373386947ded583c9238138d9f9644d6977e5b7014aa69edae010000006a473044022045e9c42729550d006916fad78e27a27191ec0126605fe9ff040d1318ac388fd102200c8cff5632d7d11b9d5033824a1e0e8a90f92cfcdddb216f19c9bfdebec999dd012102b0020cee4ae5bbf61a3e01a1bb7be71a650e376abf06d046e03046af3e153e7bffffffff017030f400000000001976a914b463f3587148bf61adf493f88f9820fbcd9f546b88ac000000000100000001f035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21010000006a4730440220433c465abd410cae3857ce91c4dbc243596f7ea65c9c769e6fd244c6b4c971a50220090d5bd0454d11fcb84af75a5a20f60bf9ce38eca94913fdb58a78f28513e4690121036d02cf2a2326f8ee6a075d5bec1b6e76fd11a9046d4614fa308fd20f4434d44bffffffff021c081d05000000001976a914ed070abae54b9fe467b1d901f2c319a2fb7c5ec688acc08dce06000000001976a91417975a867a8a0286f9f03054281fdc6c7ecf75ff88ac000000000100000001daced51e62369b85a9ca05e0b0e2d02ec7bac174a38e59ad4f95be5367f747c1000000006a47304402206b39a550f3c1a474ff0271604a96ac1cc89daa6a99968f3b80e649f8ab63af9602201958d2abee567d8c71f1fa6a1f18f99aa707c8a46296691df11cd2c1593c7be90121034fa53fa85a67c202eb55dbf18d282eb48ac46c54de11edbd79c587dfd2e5a1b0ffffffff0266020700000000001976a91493c0009675bfbd7748d63ddfbed031353119715188ace0db561a000000001976a9149737060a06b1f7e67d57a2a9dbf63767f444c8b688ac000000000100000001686f4713594e23b45043cf2c851680fa972cab149379e00edd0f3a4fafce0ecf010000006b48304502206889193c966dba19ab9d37c0297da7dadf69d91569dfb345f14dee4ab6644618022100e9aa1b9eb6e594d5c631b7801b65b91daa8d356fb8349d99843f2c6ee28063b2012103ada9c5d634f80e9fa7095a6633b3cebb955e283c3d180efcc483ed48d27dc2b1ffffffff02b0d1b90a000000001976a91499e4249f2fa24ce8c0f6f9da1a5aae0bad8e1bb588ac971d5914000000001976a9149d52c32a7d2354a31992324e48ce26dbb53ce8fb88ac000000000100000005f035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21040000006b483045022100863d98bdc250d306034dde69e31b231a53fa09ee9dc991ee68aba7641baee76902205c7d2ed72a4a1c84c9963f367934f3460be07ccbf4ba927c4e425b066c6979a2012102a28bf1d0d112866a3c531a197a134c87e82f93dac4cf1232fff2de992ec6bf58fffffffff035478b37c96960c7b200fc9c07396204b4147c36f4d7d34ccb14f4188fed21060000006a47304402205f15d4b2a264d4e78c03b7262031d69b58f3579c6a28e255dfa6ad15fab78716022061122ec9557b4325a728b61bbfb19ab8b6add3bb0120d338068f69b13ac615d201210320b6d857052191ad758a998a0cd0f4d2b6e14ccc1c427b999b6c5115c9ccf46dffffffffb240b7f3208f85ec69d85b1a9449d68336af167493a0645dbf2c841968d3b8be010000006a473044022013b20d7f822f045fb7e584c0c162a9ac71d5ec9620f104fe9c0074ab89ac5dd7022022b5f7212e2c1e3cc2ed4e0adea5320c81e01fb00ce682ba47ca58b0e0dc0231012103877977df995439e715b8aed07f612cc9ef601856b45943e8f915f076e21e023bffffffffce034905869dd0145887f68c25c13561ff60b142110f63bc6b84241b0d62aa74010000006a47304402202b285a25c46e5bb8fcf8c9fa90a7405f3cc56a1095d6a0c2de4aff207113291502201e881504c541b3e6932a7e9b05a3eb0f72838d0d14ea10b256b3d995d96849ca012102c7a111393b8ad5c041c05097aa01f8aaf53c154ed608a3ff9fcb410ca6101fdcfffffffffd801ffda59fdf92d4663e57708596f271100e81b9bbb255e723c7222d66fd3a020000006a47304402207987cbf3d58f50cb712f5fec3c87c6e9a92ccc25a081c67b34207273c703c17a02207c4360bd96d0f3b3e1949890ccbcd5923437f6b88f2b7098e6f8811862a2fc070121032467db06b1d3465eb0075265ee062c60f0f8f7c0805b257356cf83b7fd9ae7d6ffffffff0e00dd6d000000000017a914206d262bda8ca8acaea3116d97ed3bc4330a695787e0673500000000001976a9140685a05466905721f6292fa5d173682da801c5c488aca0f01900000000001976a914b1969f7c94b88ce424593494cbd4bff08fedc98388ac80b92a00000000001976a914147b7bfe27567b9ba74145b949046924a426dc5788ac60f6f201000000001976a914b6857240f83fc4f3f264497419aabbc939da4caf88acb0f2ca00000000001976a9145e226c737a56cd3d23e40b7dfd375f40f51676ec88ac81801700000000001976a914ff130497dd1cb702517bde96efe5a96874efec8988aca0a1b800000000001976a91417931c824938b76b66de6794a9e8c4eb600465a988ace5d44900000000001976a914f7c5c870369fc85af88126d3d4d12f41bb3751da88acc0a4fd01000000001976a914a1d3109f5f68aad2b646d7d7c4641e7d6ad1622288ac00623d01000000001976a914d5ddc75a81b4b6a5996da2ce5eb05150ae99b0ec88ac20674605000000001976a914164a7664be790b361f169ac06df076519eaf166a88ac0055ad07000000001976a9148ada333317eb164d11345bc04f1b389a6df2129a88ac40ea7000000000001976a914ac1fa5ecc3762eacb28ad2c55447fd4234a8065788ac0000000001000000025436fac399a17e71ed1d10de0d6e6b3e491c726d7c308fe56379b2c8ba696086000000006c493046022100a5c0b9f4b35481def597be00f3866b11bfa9e3edfccccd996e99e656c007b9f4022100a8787fec943004001877b86b0bfb06de65874d91aa72cd8ae0e22dcb55ffdde5012103e1df4782705418bcc5e8960c4d1d858ccf6c7debb99b5b248f9938e1c758f259ffffffff20a38d8e1c9a5b059387c271afc44cab0a9872e3de9ed82d2bb358e6e29c893b000000006a473044022022df251ae2c8c7a91ac640b96bc858e4eedab6c6e9234e1ac72339a9bafc91e50220689a4a2dae3f1c8fdcbed1f464b337e1937384c6863781ba78cb7bb59878354a012102a84c452675a19866c291f00ab096266fdab5cb465ae5e9d6232b0782518c6574ffffffff02c3c9a900000000001976a914604861784894334f267439e3ace8e537a7786f8188ac408af701000000001976a91431f249f7394248e96d227319c1c18b8a2d92e47c88ac000000000100000001f6d3f6f1ab3121d60d0a4273d5b5b8cefa0c8eae30603573e48f1913d47c1960010000006b4830450221009749f213e3d199fdea8939b5e69a601d6ba5a98c7412fb2c5042492fbc635adc022039fdeda61422b518a468e3fcec4e589a0eb0897591c25bdab8b321591e29f7860121034a106051bb1c0a530bed24543f6848f233357aa1ec5dc5ca4eaed30240b01b57ffffffff02fc0d1504000000001976a9149f87f831cedbf181d64e1a9313e48b1f23cc0caf88ace0a6e001000000001976a914270c46e4a9fbacbabf19265eae0dc7d4868ea44688ac000000000100000001e881fbf0dc4797661bc8f46087a1cfb1430ba7be5ad31ef2e4dde325f5ebf668000000006b4830450221008ca2d41cc60a147467530d455498351c472e577ffda79e2aaf6770b63ef86132022074e93028dfdb359a550d006abb2fc9edcece8d48e616572043f43546d1ea661d01210361ccc6e695f4e09a8fbdd2c002618e4d7c9404de586f92016acd8e15bc904584ffffffff0200032604000000001976a914bf1edc00580977eae6c766e9b1a64808f1c2df9c88ac3ce6da00000000001976a9144ef0db89f4a9f0a1a757cd5bbd5367bf580e5c1e88ac00000000010000000113e2d56f92cf0d7499fa57ff4013b231adb6119b1d70f6f2e56367dc6d6beff6020000006a47304402200a134c15a0faf8bbb0e3b65ed5646f6ad942bfa36e86eb3505cde3542f771787022071e8a9bb03028372c84d5b2740ff7c530fcd7296782c013ea4ba69d9dc2dbe910121021a13cdbc83063aa3e2bb9721b101e12d46c2514ebc8d9a60881c22ed452f4664ffffffff0200b6a602000000001976a914e86d1ea9cf0ed6e5aa26b2157292ca0b938f96e488ac32f7ab00000000001976a914adaf165ab79032028c19773885cba02bc5308b6f88ac000000000100000001b0a00d8c8fcd8b44a7997b0b938037d287b5d6713588638a728ace51e6159456010000006b483045022100a2bcd9da822feff103de077453d055887e21a7af9d2d4e91972a4ca827f23283022077fae8ff2e8301a4f98abb3f0307afacc45687282f824659173b96151c472af70121025f7227076ed1cb30dfb74040dd5dc7d6bdc5d1cd9a979286b93b86eeb027ee82ffffffff0210dda602000000001976a914e86d1ea9cf0ed6e5aa26b2157292ca0b938f96e488acd958ac00000000001976a9142ad7bcff321748f1d4d7a04f9c400791f9818e1b88ac000000000100000007b6739977b899bf717218463d8f013e79fad7f4a17377cdd953f744563c164a01000000006a47304402204f3bfc5a7245e4363d9b03c7f72323b7808b09423b171868b00d75f275415cfa02207bbcd6177ad9469c276150e87dac25c26ad538de7311174c9f214b59339d5b2a012103bd2115990c8029a06d88a0660e87e34443f9c03dff67ed5ef30a13b348c3bb1cffffffffc4b6d472a8cdd9b6066932444013d72318709dfaef63c29dc1ea149225d9d103000000006b483045022100f5a1a55c2bd3f92ee8ca8e2f71b751a4f3be187fd4166253eeb863a2f50e23d702205a7a12b3230c27ce430519f1757d9b8ef2c1d0b4e3b4c6539990feee18a768e5012103ce6a4efcc536db89e2a2b9d7ef5e4be3ab5b9f57639f741330a3af340f84c157ffffffffc7facfe9d347a3c87a2576a7aa3d15ef9694640ecf0ebed18efccc3a5a481212000000006a47304402204413a7dcfae659c8d4de5740816d70c9e77278c65df6510c01d1ff89fc1a528602207009594ab6b68135ebe48cb5af4f011ae804b048886c24b8c605070686bec1b40121035da3723617cdb641c505ddc53f12659e1f5f89bc5dae221e5eb8085402043d77fffffffffae13171659fbdbebd0558bfdc0605ac772bba1ebce19209bbc63bc955ba2f3c000000006a47304402202d91a97a4d4153b0b0624839ceb38ae342b2e14ef6e38e7e7d23418a8db92d5a0220555f2dd270841313dc6f205e1e646f842bd258dba22238125f65251cf592e375012102d6cf9acc074949b4dae46b698b2da8cf54efda29d5bd24eb9fe48b1bce5b68baffffffffbfbd8945fbd6452b812b7d9add7f5246a276bf5ef910d4380dcb6506248c3061000000006a47304402200a9e72958f167eed09087a33cbf62f14ca5f0fae6a30ded5639daf0a1c6d8649022064d30b49eaeaef920346e412e556c4388d0e055fdc2e76295a1e234d23792f13012102469cffb446b2885dc9308089687b033bdc2ac0b401ecc3a7be8b5f6a211ecdb2ffffffff2b1664836242d7b6c75a8bb9235e5da18296f7bd522e2c039e81c8acff9d9a6c000000006a4730440220157076892744793141722f4339dd615c851ceb486db01e63afec78543845e23d0220361efbdf36a60a16f91b06b6bf5853d65758d18cc24880d9be6adabb32601f11012102bb57e1c76158de4ade57bf2cc89c6b5451cf1c9988900b666703eb73ababc5f9fffffffffdcbb349cd3f53801960eb0cd19dfcc55a6039e719b8ef1839081a2a7cbd956e700000006b4830450221008ce0ecb57e5e5e4c3471999d352c94c4594f1fbf124683f8fd9d33776b188ef302204c64edde37c44e6dda9f2bb228f66976cd7168877c7b413dd9b4a71dc7be2662012102cff65727866c72600b2837515684af4d1d21e8fb2a5a4d1f57f92805bb3aa16bffffffff0255104a1a000000001976a914c0d9681f12ab9c0d7823eddd5c31feebf67b7a1888ac23b8563d000000001976a9148f67b4acb6e5b5b6a3adbd95397e389cdabcc1a588ac000000000100000003533deb01f1635c1b6b97903dd2a8b4b252d716065dd525d418d57b10b32c1850010000006a4730440220646c5f95c64ad3c84c1e92b2e013efcc05585bd84d3b3f883e3a377a46cc8274022020480be5d2a536ed70bae2215cfe3626e3d9a56e47bd0a659ad4ac21936689e6012102eb8a333277a3b0989f90b46e3dde2d5ee8be661e7b000a5b015b055455efb8c0ffffffffb77bd9b048b9c22f25fd3593dca9e72b94a449421b947606b4ea89da70a7294e010000006a47304402201166807473c28696f313fd19bd369a4f4e7cd52652c472180f69e7b6c6135fdb022050a64cd511055d1e59e1bcab6eeaae4f42cad177e132bfe73628274cb9fb7cbf01210226b0f87dd45d32630338c668019f90d2006c305060b3ea846ea3f192a70a5bcfffffffffb590e512b02047e0887863072b720d8cf11ff709044ddf8e0afcbc4ab1fb5936000000006b4830450221009017920b62ab9d6103a4ee4a04616e23b9b1b92adc4d19ffa30de7a0a35f7fcc022010ebef675d7129e7e2c0cf1f08c06ea66345afdba1d9ba4ebe7991101144002b012102eb8a333277a3b0989f90b46e3dde2d5ee8be661e7b000a5b015b055455efb8c0ffffffff024e420100000000001976a9142a97aa43d00fc34ba42ee44613f0e7e64c45748388ac8f4a0f00000000001976a914d6035e17ed7a53366f0cdd77037331dcc23ff5d088ac0000000001000000012f927d00d1741ce17d7642648254832ee69d9fdb86f71500c35a88e1797259f2010000006a47304402201c657ed2f84e2cde028f1ced92aa1826ea3fd12462403d56794a91dc2ec8a01d022006fc1afe0c6ec81e43b7d203cd0f371cce183d497819d3517f613728e7ad7170012103296adeac3061ba2fa10f47240d3badf08a1c83d55e86d27489805b182526e738ffffffff0270cb67c9010000001976a9146c923862cb18f19ac30c8d24785cd3fcc3405da988ac805d6e130000000017a914428ba6f2fc0ed4c313d010303d19bfa179e3b8b987000000000100000001dd1037e1f607d45e4c8f8bca9f40958a86a8ba7b1b467fbc4b82d19d3692ea13010000006a473044022044e2a97c7060b1f6f7f3469cc35129af02db6d8ff7a94c3e24f5ede2d761287702202faeef6c09291342a664fce4c561f50b59f1b68c5c1f6268987a851c294cbeb5012103fdafd4b07cdedf69f07732f05e45a5bcd79eb08830a34519d798bf2ac9e10bceffffffff02365600000000000017a91479aa08475896a09a7fb124b6f73fc3c9dbaedf12879286fe00000000001976a9147e22cbdd42a94d6c9a558588b14de09b6df0292888ac000000000100000001f33161c044eb91072091031d90ea5789ea01f9403ee85b54f83d6e57c82186ff010000006a47304402207660901e581bf919559d55117bcdbeb0713c3af117eb18a6112a55dec6245a03022018f72c4a31f833fbdd3133c14cf2462020bf19b1871f66bc9163bdfba2c19be5012102a4cc9d15b730f4861c50400a4363c1d358708db4a042811488664cebf93953bbffffffff03408cf73d000000001976a914c4e81ca6a0ba38fe24b529c1e08231b3233b4e9688aca0816a00000000001976a9142b9b4b6f710e79079fe7576a52859d9be2526d5f88ac4027151f000000001976a914ae0c82ceb5e399509851fbf0724ce4194f9789e588ac000000000100000001ecc01846859532133d89ba619bb364321ba782d4e16c91ddc6965d96e802bc65020000006a47304402205e595626bf18345df99228920d18978abe955db7d2b93917b3e068755b9ff2f80220704f9f2eb7054c75ed6ce5678a55abd7297007dda79b595b865cc20fca11354401210363b17d5e1405d4460021e22239ee676d5881ecc8af35dd92891084d876009eb1ffffffff065072644c000000001976a91403f961740caab8ba0e4a2f871ad835b83bb07a7b88ac007a8b1d000000001976a914055291e21c7da5de004c41cb3334e2a40134eea188aca437ff00000000001976a914aa7dbbb6d9dbca6771aa9b11ea7f5493c12f1c7f88aca0816a00000000001976a9145051b8371ca176fefc114dfcf3c596a7b3cdc9a588ac0be55f00000000001976a914e648be52aac41926387e3c1497e81268f341825f88acc0cf6a00000000001976a914d089ccd5458d5e9488be3f6b8b886618bab71a4388ac000000000100000001600172346cb7116931c0f12d5c60dc7495a25c2e6b90f6ee018bc66f7b21940f000000006a47304402205bbdb0b1aa90758a6fbf4e65e896a865b3803917fd408c21d25ed20109bfce2a02205d36a3e3c5ca25daeef7452bee29da5cd7f733abf43a520d1433fe0db8ea0316012102f1f2e93521144418cfd3840fcb2c9680918151c3cbba47fa7441b6eca98a6b00ffffffff02ca862000000000001976a9141c14fe354a7fc559bc69dab05c67cde74e63eb9f88acda44fbc0010000001976a914337ce63eeee2d829265f491a30e2d0945a80274d88ac000000000100000001172a0fd3f5210c3a2f0e96c14e14a09cef8193ada464337c9a4719e0c5143e7c010000006a4730440220505c23e40804c4ea35b02216ce7526e343cafdefb4ec49719c8d6bb6d17ca2be02202d9094f266d469c3455bd75db07026cc8ba914cdfb90bbd0f698af07dd105d8f0121029b0907aa5b983785ef89d2deb4318042091bcd8bc97135eab444372debbca92dffffffff02ff97910b000000001976a914bb10be30d4dbdd497a5dbdc7775ac7f2f23d0c3e88acc6f05e01000000001976a9147ab62b816aa234edee820bd7fad92b94ef9a2b5a88ac00000000010000000173859d7ae919e5fb528fb1317506ed2e09d789c6b926d0ee5a35cae73963e7c6060000006a473044022050ecfb5a97a47962172e97f7cab9c4e0b73adc6a508b179d0c4b96bfd39a1dfd022041b8c847594f0d84734c9f42ed05f142a32cfc396e42b9e6d2df0e3df39ce66f0121020c2d3031307852ca879aca17f08550466ea1f594d8d1137c4e92a4ee7742a520ffffffff0212191100000000001976a914145f53d9f2ab804960ae6893d08d1393026bae9188acf0e29e01000000001976a9144623c7b4656bf2e3531c70eeac96937c884c750988ac0000000001000000011e9a8e27282be8ca6ca99231c848ef7b25373eff4a8301362e549b7d3a35112c020000006a4730440220710e75d5ada73ed0de64f216b7eec053c5dfaea9a9b477511ef22792ec152113022076b71c00963b5441f18a73e19101b5a45a266e854d961f5654473a4927c0da100121039a14a147c9209b4515236f957656d5ad3d9562acd4147b0c51f2acf0d8049ebaffffffff0254380703000000001976a9149bcc7a05b648f444daa6cea8ce613c9fb03f6dd188accc086903000000001976a91437817c8296734d1ca790d766537c8fc33149877788ac000000000100000001e7dbd20af0cc96a3b78f9593792674acf51576e2c83b344167cea14261690cf9000000006a47304402203ff0abd794b935bbfdc361cd1b77de5977c133416e5d7cba26894ff97ef9426202202eea3db1eda9cd90bb475da73e89216dffb99ad065f58471d5095256fb0f40ff012102d99155da2326b14dd62b99d4231b417331ead6fb41790cdc2ae4cb491b54dc16ffffffff0280c3c901000000001976a914a1defaad8caa4e2fa1b022ea586bebfa1f042e9d88ac402ead02000000001976a914e3c072ebac22762e5fe1d9059e1608c8656a46b588ac000000000100000001268cff48075bc3dd287337c6853b9f31da2751f65767069d0906ab4db1620021010000006a473044022034f602ac2f67f936f47c0d554b4d2a848950cfb2d7a83fa2c127ebcae0b2e20a0220272ad4d1b1f5121188b4bdb95f542c58bc27ce20076bbcdfb7349ab12c79adc0012102abca151efa734d6de039f7c92423049579ffc164da53ecb8dbe79f06f5330a92ffffffff0280c00d16000000001976a914ee78446417d60f2c63acab44dc171a1ade844ad888ac3079cd38000000001976a9141e1254b8c796ac7b29f832eea2dce57619f6e3bf88ac000000000100000001a8bcff39488c1d07debf6c345b2846db0b054b779566b8b204a10bd198eeabaf000000006a473044022025bc60bb44147d364dbcc5622d62fbb07acdde68456adf6c5c6897b3ceaea4da02203e61f11d0f149eb478dad4684517735e4bd7f618c354c9565cb5db708e62e2cb012103550ca9231cfc8ea7ac94f75ecfd45c1e20acb3424e3d4cc1561d1aff020d0ebcffffffff02406bed07000000001976a9146fcf36ebfbbb15407f0eb1e70f617d6cf8188e1b88acb0f9983f000000001976a914bf1560e2eb0800abf1825e9fadba7b44ac644be988ac0000000001000000014f0edd25a951e4fe2fb3c4bf3e0936c0076af967e0795b6a0f0e6e2245dc91a4000000006a473044022025dfe7f1880286ced455f9c51d2c0cac4659e16c5a3ac4be839c1d1258c689aa022077f3b550dd6e2632a41c9053b69edb76d84fd366bf12314d29ff19a1e94aad6601210363a7712f839be58c122ce47afe1979e9bdfa5ea36a59bcbd313faef8930caa7bffffffff021e052700000000001976a9143b49e53329acbd43011365b1b1ab83697574e08588ac1d5de4d3000000001976a9144d97037920024e0b4086c5a9f8343685a0aed8ab88ac000000000100000001bdd99be7cbe86d0fbd686b516329326a54a3421b669674fa7843e892e61974f7000000006a47304402203cf3ad7d19daa355156a0e771f6b6ea542144bc80e644b5162fdb7cb51bda730022018849d4ac21c28fa9dc253fafd5e01baa670e5ddf8682766772b9651a28c7a29012102a1dc260c319af08d5780a8d73760f989cea6d9fa7e50647461b58a69f195108cffffffff02a0860100000000001976a914346cfcfba55206fbb4898ae03348e36b1ff04a5c88acf2344119000000001976a914c1315156575d1e12c249043780c3df7d71eba64488ac000000000100000001c474e8c61aa9ee9c241173827df56d271dcc6e5fab8f19dcf322651a48bdce4d010000006a4730440220764ffdda26897c3010bc0ae2450ed1dd154f01b7713e2206fc0b7a8d4d4ec165022009ffeb5a8b104a7902e0a1bd12370c86a0ba178a60743a6e3ca0c17c25bb7bc601210341b9a1465688683a83d646393419664348d3f0464ac57fc7a5829f2be04fde5cffffffff022f381b00000000001976a914f12ef58f0c46989fa50d4a92e454e16e3ab9574188acb5af823a000000001976a9143203927fd4f2d34aebe400bd1957208cec9fa4e588ac000000000100000001d8a2dbd0b2609085422a8e4a05ebc33d43c2edc0079437d3f948e031a14d8d25010000006a47304402206e488d1fd407c0c382b76421cdb6380ba28710528cbd5958d27a972fc7d683820220636c1141662442de7c8cf865fb1f6113a98ce1c1cf9e91b1f3afd533fb7c5f2701210287b8b0cf019c487f28159351d89cdcafb26994a5f0de9b45afe8f6809147d257ffffffff0210c4a530000000001976a914f310b6a018336b9c0c7120b51c6af7335ea6c7fe88ac407ab206000000001976a91443fd228ba52205f992fec33fab72853e16b7e8f688ac000000000100000001f6f96c9c9e1bd3fca35514d0315a7d5b1c49cedd99b3489e575e4c7f6f126553010000006a4730440220085550e4f74661d6a867e3c594df89a852ef32edfc057f80b2773fd3f77aca0f02206d295379e96af9af15ce8e761dd31090c96adae5a95ca2cef37215711fdf96e001210222490b49851f66e6c4a62496e832ddb49bb3506e8a71f636523774723c829416ffffffff028140c301000000001976a914b1349556da0674c556575f4681ae6333b027c67b88ac28a8a39b000000001976a914e7bc21d19b61066ba8c0ebc88a47e01fa21430ea88ac000000000100000001bd2c1e9a8459f7cc7f97efab94dadcb6b2f940e56c23651c5b8455c1344f87b9010000006a47304402202f428ef438319b178d3ea23f1adce1865540c316506d6e31ff517237a6bfef350220575c71994be1e1293fe42bb8a6b5e0f3d127b264e2f138bf98939714ffea6d3601210307f62272d70e21ad691326b961c854e45dbbde084b41463c9024f7cd419267d6ffffffff02de727c0f000000001976a914776ae69e64e7c9841906c362a4c5581ebb25a0cb88ac408af701000000001976a9142bac77792cce38af44b6fc2044f054ee8a48766588ac000000000100000001c1474b48ce5362b74a05475263e200f7f14f57938caa7c81bce5fb1fbfcefefa020000006a473044022016a7f5c39dddcb26b68927842f62550185684220b693f3c913cbf125764abd7302200b97e55b12ba537c081693bafd4e0e45b39d5a36d90ac9d394f15b0a6ca7f9c301210369e68c095e7b0f1a3e5840152d941548c5182020ac3d7e94ab712eda51a9c53affffffff02a2861f03000000001976a914ade49952a30aa11abda207766d2605116fb0c84788ac26679500000000001976a91462e5daa3e792bcc5e2050ce859853f77cf38246b88ac0000000001000000019b7a429419b08d214d61862b87c7acc449c3c9d1551b5fad3a9eadf5adc8412b010000006a47304402206afcec4a46b06c7aefda5fcd0be016551342c3824f24fb2aa481323e78e7e6220220564599e20fe7a0df1c89047c3912eb2e18788e2fe60d07de78c3b19144147fb101210326e4afc2dd2be8d8fd497ee4dc29eea50d340691f236eee88a627713e94c33ebffffffff02689b264e000000001976a914ff168c1462780481767570a4bf7260f7a9f646c488ac60763d00000000001976a914ce632cf6a6791083bc7f0a3ec454ade18f52cbea88ac0000000001000000017d8eba89b990c452ebf342c7242a9faa5ab222a8880ee0f13f895ddf692cb3b6010000006a473044022048facbf0b846a98086847d99895afd0f5382c311828061c2ef97766de1d15f9302203bc9028e285353285665db27f6d5e80be791e88c6f1e49ec6be29b6bed79e2ef012103f41df08e73d97acabb7681b6b617b724461aca0c45c6ac80586e9ab5bb4d2beaffffffff02eb2deb03000000001976a914132a85db508b1b85235b35f8c50dd6d94d28785388acd0754100000000001976a914f351d4e82b77b86d4ba4a9a6d32a3631de4a74b388ac0000000001000000019bc5a9e9eca88aa8756388382a1b5c6bb507be7c219f212d13532dd24fe83e35000000006a47304402204b3bbb0943d41d79a73c5af14e38347599f2759c097d0716b13f46c457f9a8a9022067623d72d9d8d34b31e4d0e8da433cb39881ccfdab2316ff810ac9a3b187b4410121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914c7969f71e653d9ac71e5618623862001edfda92788ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000012bf18cfc97b9eb520cd9282b83add722ab367fba775c23c8ac66a1537f775197010000006a47304402202642d8a26e3990cad6648965e34160409050a37f4baf3cf5f005ce6c890994a902204b3b1383c87c231bd5b97dfb7bb4f5a6198264998bf44df2fb76a847e4ac9d5f0121034b8be16a12ca3b7995eee693dba26f1b66b4682f045797b9644a930b0b2cd03affffffff02f2b71801000000001976a91460892e91b53df6927f026ff9118cecd6c3fb111f88ac2ed33f00000000001976a914508ce255d7dcce4b5316d3fa7917006045ca40da88ac0000000001000000010e629ad4d8b55ac1dfeda549aa9fc10fca2c20b74a25fdef2119ad1b78f4b9a9000000006a47304402206393fe3fec01c86015f21de5b519ab97f001051abbc90b51b9bb6a40b129e40b02205dbfaf6d7b82783f07dfeb989b2f5901125d577b65d22755523a8846e9e844c80121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a91418d14c15d19b4cd947536b6ff2c5b295b68b900288ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000159d649c73b4fdc4fdf75502f60207092873dba8135c1d664fdedfb1d0b07b2e5000000006a473044022006b542a18cd3e9443c0c3c0ac1e72433cb7ebb61de722adb1ce6882796e018ef0220193daa9d82962ba0a99e9167a33d17ada190fdec34795f6e1177167bccf3d26f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace007bc01000000001976a9142c75415ec4c990144ec683999d30f449c7ead26788ac000000000100000001bdd24cae38a46dc2cdcdb4caa60cd96b1f6d17152c277701ff8b54097d84b8b3010000006a47304402200623a026e414f5e7587f3a9657c2eac4ef25bafff77dfb757a646db2c266a8e402201a02388a94f6020209ac9f1772355024634725bb1d192dd7d5a8e75bf6b4023e012103ed3a071e9d29b17f9d1ca30f71759fcecafc06800107275aa42856da7305a4f6ffffffff02688a5f0a000000001976a914734c04d3938cdc702699fecd7b0cd02eaef34c6688ac7898d701000000001976a914a78fad23bc7dca26a52a1f6c3df19f44b1b6e4de88ac0000000001000000015483e6e5cc987968c691e299cf20ff9e169fb2d4eb2991d1b3fcf5f642840358000000006a473044022053b9bce93ce18742255e26af0bc35fdfb4dd34d783a9314aaa820c85054025a402202fdb1be78695260fb4abde315107dd2b5621f0ae56d0dbabb696750d4664ae900121032a2a46bb68b9ec89d3aa2ebeb303099ca5a7bdc3e8b6587f304c72c0f06cadc9ffffffff0248c54100000000001976a91409d271ebb449ec549c328d38a3ac25fb0d5cda5b88ac80d85100000000001976a914eb57d58d8ebb8f69d784cbaa6be5f777c89cc0c488ac0000000001000000016df5b6d7ffe94b95ac90046167b0f59c85aae44ecbd7bf4e391ba679a286ef69010000006a4730440220536dbb2013115ec451ff553fddf21de28ccf74dbacbcf890a89c65fb34afddc102206a1e7fab4fe41370fcd1f7afc601b176518c99c0c190735703408b60b2d860d1012102e528bbd538db3859864da7eac8fe342a4aeb40a5c0d8a46079f354f653bc6910ffffffff0278cd0019000000001976a9144fd2c7ef794523552e2395103e5bf34ef98b8ed188aca8721200000000001976a9144d4f41f12799bc0206df13e3a1a22b472ab97e3688ac000000000100000001ffb3896752b1ff6fb41f913711f7e2d5957feaedba0d9fb1d7ff7a4203f9dfbb010000006a47304402202610313b5cb6cb531d45c693b9207aa766d1d690e1c2771966517ee1ff7af4dc022068d4380ff8528654304b85dd7523c37d8cbe51b8a5b519e247dc779f108e381e0121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff026f060300000000001976a914120a5a881c997a6249a68639436d0182f3c6663f88ac4f988416000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001400591e679a2b9eef96eee67533dee3bf8edc1c26527f3cbafa02c1676f4e0bf000000006a473044022071764f8da2428518faccae6d169393854d986f8496006e8f011fd446ddb45f9d022056a2d4c51b720046726bbdedc9c8b2b09e95951ce864d9765d7ff9e1822e1ecd01210387c90a8faed32ed93d01e44a12e05d3bc15d529df77d3976ef305bbdb741a7c2ffffffff0286453901000000001976a91471873b8851687d8a5577ee0c473654dd93764ebb88ac499a4c01000000001976a914c1bc06eb3e5138529652d9d18b8412f5b6c6309c88ac000000000100000001ce939184b6d82e6b47c29eec0ada85d3450f235fe3824c1263eda0b9ed37d433010000006a47304402201297086229c9e90cd1e8770bdf51e94907c58cbef28fa225a1b2c35a1b79d03f02200c070389b12634f4057762423d68ee53a7dd48385c31109c5703f7d027de274e012102a21dda9f8d3937714ad760e3d20fad0bc0352efdf4f16e9985d5c82a01fc3b50ffffffff0288626613000000001976a914058df15fe881545c3bbf129f69e617faf759e27288ac60b31e00000000001976a914c8c4d8ca374f8e910a006b23e374ac0c5363376988ac0000000001000000012a432728bd16824f14967b49e37e87e662b5fb6413f6d90f51f11e11a1b93ba6010000006a47304402204d057825ea89037ba64fe4fcd0ce3b226681e0e122ba12e537496272d02a03b3022075eb1c3835940fbeca5cf584a33259fbaf467cdd0db9c091d14f25becfd7ddfc012102f6c8e6e4a8e169bb26f36cbf9c067ac0f1aedbc36a15d583a9c74872fce36dcbffffffff02db280000000000001976a91473ae6f70c95540738bed2e365719294f1582a06588ac62993101000000001976a9145d70813a21a27353b2d3db03a23987e7db23b2c988ac0000000001000000011b639963b1be1cab59fed358de5ee2a53d13044e474c7e2df71ae8399e80c452000000006a473044022007663db5627a975be28023e248e5b6bba9d32c41c4f671193061babd0cd2895002202a32b336ad7b7ed9c00b2bad21b3be306f7911db33247e94e8d99230b7d6b055012102fc059e7568b8f252823697c42754e37405633ed011a6945840d3df69e444cad4ffffffff0240420f00000000001976a914deedd99ceafa42f18a9efabe36b199741d6553ff88ac50bc1600000000001976a91439aac2d847449bb2886dff1801d105fa66aebe4e88ac0000000001000000018975ca60293156e174e184f5ea111e303e7f07e8c4e37564a60289d2471eaab5010000006a47304402207df7daa34ac7d4b350f31955998b66ef497cab7c7e6a82b44da8cc667cd9f299022044bbfc697c96d0773a93f85f1212e3581a281637ad46462253ce61f32ab40d68012102cfb36bbc29543de60f5904507705d73446ead91022c09e6f0c1f5aa44b5e31ccffffffff02002d3101000000001976a914c888e10324b193c191fed2bc5c25688bc44a168a88acf0601300000000001976a9141c4e344c2fe0f18ad8daa061254f7b9030e0393c88ac0000000001000000010ca82b63cc68cbe2f608b3c56b7d1c447b6a6f50ce6e4bb53d79fb6ced8059d2000000006a47304402200d182a7218d0059b5298446f34aedbfdaf6b7181f0065f2c269b29d14b9e4767022063d56c9c31cde707be4f6ff1e0cf2ccaed26cd06473d3c26c5a6472166a614ab01210323bec18eefbc5adeb1ae4c51720d1ab4fd3fa992ce69cca8905ba999f19ca0f0ffffffff0280969800000000001976a9146a9658b449893f34a8bc34f6794a11eb3d46a4e488acb1e92c00000000001976a914883b8c4f8db39d9a9ed0bdb9f331546a2193f5fb88ac000000000100000001b4d9712aa48cc284b40d8457bc68697d84133337dccaacce760e2213e634b87a000000006a473044022032696aa4cac783a9bc41457845b7c3a85107d3176f9820e4983e5dbe6e3072f3022056a58b2b5c2b60656477703429bfbec87ba724b20c2789f9b862becb6feb81820121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a0aaf500000000001976a9144f98b9ea451a395a264ccba82468344645c8476088ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000013839bc9441a29efe7edf619dd8a97e412313bbd7aab568815e6b5da913762f94000000006a473044022001bdb0d0f44ffe961f8d9d97bf8579f14ed6f8e97eda6aa07ab4c95553ae82db02203d05135ed0acae03db89d3e2a57015d4d3f637c6c9e91d9d02dec7ca64715f700121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02b014d600000000001976a91438860090779c6df12ea41cbe472359b62957527188ac40e81d00000000001976a91464c84d28f1405de2b2287fd01154be54cabb2db288ac0000000001000000017de98d18f4c76ba8d889b9e5af999214fcfb828d2dc4d7a556d8934a0a4b5f45010000006a47304402206bb249232db0cd70373f18184d8a4c1ef5e426dea8bb33aba5f17d21001321b5022037deb19f8436b80d5e40aeaf5012bbc7c85dfe9337d8befa4839e3e9a6986ceb012103a84de722cf09dc208c9d4c6455125122ac8017d70f91642b24b2d0afddb404c5ffffffff02409c0000000000001976a9141b0cc0c376c49c75492a926f7c69a9103d17f24388acc8a81600000000001976a914da187fdb76af936933c75effddc08c5b9b8666ce88ac000000000100000001d6245ec41222161bdbc30a25b30ae84ec5c35e876e38c5ce0d9ab0aedbe30310010000006a473044022018357533e3983a84585fc82808c32ecb527512540dc9459ef74351d9211a45590220676f99e37ce755d8d4aee44c643dfe9613c206a023c59098fdca7f3498328285012103895bb384d5fa15aac61d77ca5c9c904e2778e73f798db89cbd7ae3d00a69324cffffffff0270010100000000001976a9148c129a277c19e5d934a48addb29f21897688960088ac7c506304000000001976a9143b31bd659ae233c28d55d7c2495132eed1fea69a88ac000000000100000001a9c29209863a5e1458f837b47ca4f7dc429e7d3d44239458ff36c464ed3e8a44000000006a47304402205d88bfc2ec466f24d80849ccc5be52daffbe70b0f21e3c97a174f539df4a290c02205429188f6b44dddc51b63bff1424c20333b38a49656c5e0be1dc57090337fd6f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a0987b00000000001976a9140147d2002454dd300ea73fdfed4d42176645411688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000019c878725d330387c59cfee07d19a83adbbdec3c0ac557418046f7b083c32a24e000000006a47304402207c90d62431c5d075899594fb233f37b975cd122343c58c2229a665d4e960d03e02203ff2470126ba49114f65a2391548b8aa8bea9f51ba8006353932fa4f83886f5c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e0da8a00000000001976a914d0df323103ac934ebf7325487d7819e0536be9ab88ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001a3dfa355beb11b68807159070020dfdbe7c951239c37d1674bc0cf9d61d51b8e000000006a473044022001f43a46e6ed87ed912d7d95461f12cba02319f6836a30be2e2ce3a9bfe2e78502200417e8ed522a355698053ba02660b055ad9df67081a5fa87ab182861f498d15a0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00127a00000000001976a91415225e873956bc71bf5bcbb758df50cf85f901c988ac000000000100000001362f60bfae5164401c0c75dd4fb42a95619c4ea6158af253daf8cb9617bc9730010000006a47304402204eb3023798ac6334ec59e807024a6286e93cd1e2317defa9c1b9bc913008365202202bff125a6a17124740c08eb8e3ccb4ccd9c3f17a8c10e698c1a8f12560129b6e01210226453444f4579d247f45701d28d344402d8493d960cbb8246d174de477dd6e2cffffffff0260160200000000001976a914c3a39075c2ef4847b676461e1807c606fc5072ba88acdc2e1000000000001976a9147ce6a0c88631d90e62873b07d5c9b35091eb09a388ac0000000001000000013ec41a0c5145806690113271c5d864c89f27c6bc96321545f5bfe72e0f9f798f010000006a4730440220508b9db7de0854c0557a3a7d9ad4371205195d07eab20add03a9418c014f706302205c0f3a80626edc3a7f3c7b976c7067bd7635d341fa23586019a111c7bf2a066401210347b44d162f2bdf68d9c5ebdcd905be8d6910758ba538d390bd05183bf33afbedffffffff02f0ef1000000000001976a9147a663e6eb9c7488d79898887281b77182e253a8d88ac95610f00000000001976a914169a70ed2484128636e107b10ef320cff9b9721788ac000000000100000001f47ac73f4d0e63d7189fd293e0949d5dd021f85b9c4d1ab0b844ada945ebd0b9010000006a4730440220040cd499e0a44d2d2df0335bb53a1f7e9e4061178bd905c2b30ff1926a45e86302204d542bb9ca988688f5970406aa32b90e467070dcd5ced8d495bc6fa745d1b6c701210348c1d88e355f243e8594a45f0b919f68858bcb7820684eca7497326c5eab216bffffffff0208970100000000001976a91473cbf98c252aff15695e4f9d42f9d9e4df2552e588ace5a12800000000001976a914f5d9ad5823925f82c103d0ba90417fe7451a235988ac0000000001000000015939d2c533142ee4b1dc8e5be6bf7b3e6bef078909701c4f69597dbb32b00448010000006a4730440220799c687e0a25d58aad1eae8949990ae778b830fdc35e27bfce7e22f41f3c04930220178029bf598a71184e60f2df8d1ee032da112d022bc9ea7eefa2143ccf69a525012103b9ab447400f3509c5b19d220416671591acd01d955beac7b68d8607abcdcd953ffffffff0230fc2800000000001976a9148361a238c19e141dacab43c755f73512f952df2688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001b9b94b28b5fb79f09264a39c7a44cdfc36dbf66997fc1b5b9dc16a8b16f83f6a010000006a47304402207769e6f97c548f78ab11cd88b0a80235c660e56813c178896190f66c390c5197022070966fb3e84af80d917983bdf3251e539f9480a87e893a1b55c1aa1f8984a57b012103e88effbe55fb6ae6802367134ace6d88d9c9edf74277fea5c246e6b196a95059ffffffff0210757000000000001976a914c56a564bb34ae3b1b139116bd8ce6dde4dd0852a88acb4092100000000001976a91418e3c34da41da9833bd3d98756601d9719d4877c88ac000000000100000001e24ea0c000344039d5832a926a21f4f2c11cd0855f1f10f84345edcbc3a3be3c010000006a4730440220373ee04a6a4823a5a1310e01c8a677d477930540e582bdb20a4d7c60ce135d04022052d408278a5620b2eeb2af8950073e67d130fbc45014df30f7becdb75b7c32b4012103256a446e496bfd4b389685925049bab1987d285c94616b785eac65de38bf023bffffffff0254150000000000001976a914ed3e6bfade38f2743206a5cd8a10a5b6a9aab8b388ac849b0d00000000001976a9140737a6f9db3eaeee1ea900c783a9c8003a07751788ac0000000001000000018244d39664243eeb4d6e0e222e0e41011952a03b145e82a5a3243a7f2f3ab557010000006a47304402206bead8684510673fb8af96075c48bef4824405ad79f5670b524f64710d361e3a0220331692e74e98bf320602e04d7664d11d2e5583b40ff184f7b2267c1464e4fc2c01210314be789166ab5dfe23996cbae5afdb20a9641c630415686d4192a2c7855ad37dffffffff021fc70000000000001976a9144b479154b27fbb1ef2c2cd62d07725f62ef8bc1788ac42a21000000000001976a9141edf6e1e94346438616aac1a247a6bdf5f69f2fd88ac000000000100000001eec6b28b200b51f215fb1d64cadfe895c69238796d24e57c76f802db42053f5e010000006a473044022033594913ec763fb844e4e792957177fe31f0a5e64f87871e6e3810fdf2e3e97502203927013dfef64ee8dc773f3101c7de9587419a14bdf714a67f7f8cf42343d7d70121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0263290000000000001976a914eb032b6fc0e86583f2165ff512c90601a8bce9e788acdc478416000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000044fe8bf1e8abf974e5cd797d674f11b69848e9be31eeb7be1a8990ae61748d7d7020000006b483045022100d5b385f31fbd97f9c365fddf691c652ba96315b25770daeb91a8fd33f4b9775802202225839d1838c8cca303bc680a702d33214ed8a0490f471b08758aea4a75dff2012103867e97da711bc1734a0e098e7ad607cf94c13627f36bdc999a9e66120cc9cb25ffffffffc543f1458ed2889e533b2aca47e4c1ad9152aa983101a7c6a4012bf29d20c065000000006a473044022060e67eec74744e2055216d3b0209d79416efd97fb3fe7145c9b3f2f779cf541f02205c0b8453e8e896a69e7d348ebbf9a07dd018451162fda398c2d6bf4817400dc7012103aacc2a727bd32959c735b7210af2fb12e4ba94fafc00f5b45a62ddc77e654043ffffffff259b894599246285c1e8cf5cd6af0bf1539e731b0032255795362bc5426ffb36000000006a47304402205c73640d083a736f58be23224891e4a120450b0e3e3ec64e297d05c45695e8440220396a489021d907e58be7ddc66deeddaf187d4c02a42ca1830198078ca7ff054b01210354f060757385d078664eff03a823eec88d786ef00c10b1ed2a87f1187093661bffffffff1cc772e46376125f106d2e57c018472e045b9c670f7f00987ccdc644b632da6e020000006b483045022100b22a66c0f290779c6eb0c3bbf93b5385a6e5995b8e5abb3077d700f907bc9e9e022002f7606d75782c5d5c2d72a761974681686128fc387bda5c9a05b3cb4d99ed66012103ba3e4d086d7a16c7384b68bbe6a5007973cf59314a4771e03a5c024aa8914156ffffffff088058840c000000001976a9148c17987ef8515a763b0fc5c8d18ab2a1fe240ea588aca0816a00000000001976a9147616896872b564c34fe7a615655474a719d5b00d88ac455a1a00000000001976a914eb3c2e6382ce0bf46bbfe9cee4853c032a8ac43388ac004e5205000000001976a91426f91fc06f0a97a94d87fa1769918d60ce2e060288ac10270000000000001976a91459d429605481ea5991bf64e665ede1894eedc65388ac802a9e02000000001976a914807ee6a16a9f9ffe7ec8f15a379989a2c26e16f088ac10270000000000001976a9144b892fa751fbf50feb8b65d568eab6868fe2a06188acff4e1e04000000001976a914912d1b4cf6938c6b663988762803fccd2256615488ac000000000100000001575c50e90197bec6e376cbfe74f95d9bc655ab861a46326c53eee10e38bb90df000000006a47304402206b62be2b9154747c463d06fdd01b1080be4b10e2f8dfef0c9c7d6b608c93f5c202205422b784b504b9c36613454503c08dc53c40411f7b35dee5b5f3f436e74a38f501210280add675bced763b91412fa73707f003528ec352ce8a0baceee49f0e8bfddd55ffffffff02006e4100000000001976a914e5b7f2a12bde034be7ee3a811863aa203979790388acdef59600000000001976a914a8dd9ece2be8a73f7b9ac8056e201c375add437788ac000000000100000001cd923dfe733f48fca05b7dc7d95a0edaf584a2124c3f6f9fc6325e6f52f5b519000000006b483045022100c28e9177d8bb4acab41def1318ce9d1f9a7370c15f428ccde9a40b9c26ec11f5022064148a6c05070be527d06ef598eb0cd7eeb2d8308d08dc9bc2dd5fa2df59aa0c01210301f8eb0b8fbf04e2042d1f9a67c217393ddd8e0a5786ab0799f69b85cd8e2ba3ffffffff02e8d4e002000000001976a914e5926a8340f621120187c5a120085f095af0fbbd88ac58bd6200000000001976a91412fa3c68f2114a946422dd60685a6eeff43301a788ac000000000100000001b809a5ec6b5635153b29abdf017856854e0579d8bbcf125fa7d1e3b2a1bcd40c010000006b483045022100a834c3e8b6367a16b423f7b0ddeaed033b8ac2b70075bbdb9505ba44b320eeda022059469dcaced2c69749f0e1c595d6ae7edef6394eacb9af7dfdd7c3ee78f8a860012102b1c6e7995cd1c951ed0715c45fa3bb2eff38818080e22818ec6797aa554f0542ffffffff02a0860100000000001976a9141f2bd67e8c7351d50b295ea0cbf2a93f4f7e312888ac60770805000000001976a914c00798e35a36828798f4936f269d34cb2fc538d488ac00000000010000000101031bd6a5c638968027f32485b49b16e164dba791b15b553bfb86e8c4022139010000006b48304502200d4ee27a2948015075964e9a2ac05c8f1696e306870a93d9accde31cac168b66022100c6c26358e4735fe64d69a94a919d01eb90582500550ef905a321b73bd8b9a809012103ed69e2a9d65f882c51ffacbc0b8b0c39c81f284e48ead9b9364f88c5378017d5ffffffff022c058a26000000001976a9149efb51d09cc05d61903bfaf672aef133b1eb502f88acd6398332000000001976a9149ecbba239023d289a75704c11d5e17cfc161c5c288ac0000000001000000017c591b324f18f0851e22081aa8af96f5f98e3cdbe740cb04b031c45367b5a49b000000006b483045022100d1bd33b4a02b17fb028b842106c35162d15eaaeed2b34e1ebad311231eae616102201fb9aa2ee23dd9c91a649479a054e19ea9c059ae9623a8d403607383923c3a1d01210245abccdb5ef077dc76f8662ff22c2068404c34b9c3dadaabd79eb886d0548303ffffffff02f03047f80d0000001976a914bd331e6e30a99525ef117b616ed49cfae24aff3388ac00902f50090000001976a91444d7af16f54b777e4f8215b6e2c15cd5a88b794e88ac0000000001000000015d72cb9ac0d2cfecb1c1d09f47aecf4e73ba9bfde1800ac89700cb3643e5a966010000006b483045022100ecada075f466137d7186ef68dae62baa4318e70fad19855b1beeb8468921bcab02201d6cd4aedc7372d8c364f2cea0479f681b4dcb7d669e32d77b3a6ebffceb48d20121037fffd97103ec85c3210e9f5616c7f271bdab30511f7cd0f789934406a1d96724ffffffff020a844500000000001976a91458f58831463e2831e462cc19fcd6006d5e9bcd7888ace6c58009000000001976a914ae0d4f86906d8b0301cf0f2d92c637437d07fbe488ac00000000010000000115d1c8c6bd8c4065c7b3522c7afd9970833f7a4ad2155cea7ee419735c2740ef010000006b483045022100a7e0db03ed3ea89ddfa62e22a3cd58c9709f8fb16f2f7c04c511cf0a2cffe2a202201e6aa49c8c0ccebb26e5471a0cb8fcc1dd6f8801b21ae31fc31f82d4b096a2fd012103c6eaf702e2e6d75d1d676ab3d6f2df2b150e35519d64769a7aa9530e633a8903ffffffff02b075570f000000001976a91482c2ccfe28d36fda7ffc36020147550fd87cf8ed88ac404bfff1000000001976a9149a7b8ef5eed97ce984ab24e41cc0cce19a815a2688ac0000000001000000012113593294a2f1617c3d13b364dc9cb315eb587d54b4ce89857634be280f0c59010000006b483045022100ec0446d7bc2fb778d9af8a8597565f605864dd8d8334f03b8a3bc0d59fe3b64502202cd77f88496713313b4980008317bd63425e3a0fa2414e791648eb1253853a200121020b2d562037611d73cf237e004391a5305d1e22d297d2d4a722cd40cf7f8bc7aaffffffff02c32d41d0070000001976a91426305778e2957a6b800e74d558d784b96632ef9288ac00e1f505000000001976a9144c9b0263d9daf901e3ee7266f915a162727f9bf488ac0000000001000000019bc0cef1556621342322257bcc2bafcef8bcd39d90f43f117fed7088363f0c3e000000006b483045022100e87c21d2fc85642df3d642edcff3c9a0c6998b0ef985d2eb3b5b7e10dcc67798022050f03c35fb34554e717bad389a5b34d6874913e14079d6b99f862dd57a684e500121020e8399ca26be2a407e62a69bbf0ff32024e3a50c9c636d8104f86b36d3a9fc48ffffffff020046c323000000001976a914f7cbb7d3d192b34daffe6cea712534b901efbe7e88acf093eea0000000001976a914f59902ae46f9447c3822af49a9171a2df185982988ac000000000100000001aee41558e3a87c47329a37987025961b205638ef711fd6a914ebe81a241e244f000000006b4830450221008ed0ec8ac6cad0feccf30caa49dd990d89b0a1f570df56dd8085f7048b3ccfd702200964997b99e83acc8d3c9a45a2666df964987177ae6099006e1d2fd116516bdf0121028a6afc749e14ba582650c93727d4fe611d7015413178fefb3a506b1e2cd8896fffffffff0280841e00000000001976a91410ca7e902937e42cb7ef6e95bbfcdea18048286d88ac7102dc96000000001976a91412bad820a3b1e87dae90d4e7b1128fd02beacbc788ac0000000001000000018ee61f2711348d857733082fbc396a8a8cb06669d0de985f8709162bae798ee7010000006b483045022100a2935121c07bd5a967e0ba188d553662c79ac64e1302e482a6232ca7d586b52802202c4af7cec1aae7362f214a9f5222d5193650191eea8cb7b5c0e6dd2201e9329301210229cc5cad1c5c362008962dff2ae1843d80f4f80d046f73fab00b19d0b2a24bc0ffffffff02625ba1c8010000001976a914d05e54da9bc1d4087335466051d7baa16e12a66588acf78d1f00000000001976a9148abc4f2a097717044df73f65f89b43793185788888ac000000000100000001c7a0655d3faac9d3d4baf72c4c3fb40f20271b5405a303955e79933a4a0a5d5f010000006b483045022100fc1435ab892792e0ef0deb7085722b3a7af71384e46d469da09090bb4904d59c02201312a97096741fd043f62bbf84be13b18383ba1972eb039e56596ee33ae04c36012102db976aa25a148ebee43a9b894cacd78bf6be9a916d9297f06adeb56fe2d2f115ffffffff0256296301000000001976a914f82eeca14644c53055d956bb00a1dbe8509f05e488ac8a6c8004000000001976a914ac8b57bab2e186dd81fef9b2b488ef8433d41e6188ac000000000100000001eb4ce207aa6fc891e2d5ba5c37ff47dd43829446eb29cc012ec4645263bd6b84010000006b4830450221008d796aa5d4d05a90948fb1dfc5e92d44d845e313f3bfc09f211f6bb969a804ba0220584c5a8917cba5f3e0bd12a7d9a394f8fc4b93ba79c45621c93ed938c58ab9090121038bb694bb23990394c01386ec22754308856275eae55078eb04347cec36a31f00ffffffff024d94f002000000001976a9148417f90bbe6ba0d5c30d52b3e164035a32c207db88ac0e16652c000000001976a914cf4193d4cd88947e75f87748e09e8c336e4fe6fb88ac0000000001000000011f391a5423820d78a12b159dfbc90f4f994852c4dfee9378b127ed4055e27173010000006b483045022100fee3bebc0d0725023cc42fb409ef7460d29c3deff52027848fb3726c1a2726d202204f3a9bae84ddd00a7c323ab81b490f6762914ac115f962b3d3e1b5bc19cd49510121030a8db54c488a62b3f3c0d9d69aa47267c3b9d002678dc334452df65828aae731ffffffff02749e0509000000001976a91471fd325d962517343bb871b4cf4478e8e2675b3d88ac2dd72115000000001976a914241517c84e278f88b0776ca2b6b7b849a506ce2288ac000000000100000001af05edfaf5b92d20d3559620c76f10499d8e8affa88ecfa4302924150f7662a4010000006b483045022100b8fd166f0eddee447e70dce6744f2839e5eb1c0d338c741bf48de559805465b20220273b0a0ba1941f0bfc1b421f7a53795a1f687d978603c265c0d8f1857b865c37012102e8663cb69e4570ab028182511e04444d175f3f2e3987e74fa8cdc3356ee69c9bffffffff0280b14f01000000001976a9146d6cd0ed8776c867aed1209a7b6d7515f7aa55a088ac60361e00000000001976a9140a0a386267ada33fa306c1ff068c6efc37355e8f88ac0000000001000000019a6779c9e474b79c2c34133d114eb061d05b14304e5105e1f414d808c5f880ee010000006b4830450221008b5a2aa0de2f3c2de37514e29299c577fbeb745acdb5b6228cf2a4ccbe40960f0220146cde08499995ae7d0918b43749e725af75d7b0d5ca6aa9a4da3518710c12b90121024a154aa3e9da28830f8977e3b8cdd16f105eac7d9ca5e1729e8072dad0db1b3affffffff02af6b0637000000001976a914607e63d78290810266f9f0d4aa5e8ca21491150888ac3ba4ce13000000001976a914ac3e63be0413dd2b7645fb95147666df6ec39d1288ac00000000010000000166468f20bfdfc74b6a41422cc2805556d17e9167170e2ded718044d6d6fd80d2000000006b483045022100d863c33c43f8a3a856305c21478ab1c3d5f109dbb11e2ff76c91f07080cb393f022014797e90bb0e0ad833239fd4bf95dcb06a6317b2e29006f9cea1e23da42ac48c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914972c4144930ae77bb164ce37ae7510353405c69388ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001d101b087484390ba48ee8b2d755f70eaed58e308b70fba155b5f38defd0a48ce010000006b483045022100c9aca125b1e83bf8299f6ab156c16bc8bb40716f6d7b20757c465e997367007a02200cefd62d68abcacf0be673d0a386befe69f7e094583e5fbe1152f7fac44de0b90121033f0e0230910892dc13665f6988785cab141579dfc9fea685bd2376e60d59ab1dffffffff02a0860100000000001976a9147d91e2a66f6a67b69847a1c819dadf79d1f520e388ac106a5d00000000001976a9145f7ae8efc124fcb5971b0cf3c1c13736c6411ac588ac000000000100000001999fb095b9ada6d16cfc5cebc2d846573472272535ce5df4d45a069a4f9ae52d010000006b483045022100f9a1956b9165a873b323b896f1664ef5a011e6c6cae6d362ba015298ac405df80220558d3d5c3603a32111beb8c09325a8740f76d848320ea24a06b34b7a69231d720121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02f0d20000000000001976a9148af0f7b34c79191af3c1e3d403369af8379792e788ace6535229000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001b5987727f4f1faac50127c3cd6faa8ec5cef04802221a3df376c5497a5dcf97a010000006a473044022021f367a4af1ec7b20b4afd4f9bb568be1820b37f248438e38b4db9281ca0e34802205c8aa4be2d3b3c603633b37c9e7cd3b74698a1677557736dc27a1a9ca81a6c760121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02e81601000000000017a914916a8b61fb7ea250a068c48c39b54025fc283d9187ee155129000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001c7d3f93e6064bb4e9730058a4ae9ac64d6f3cc700da0d9291a7e1e6c6f2ace4a000000006b483045022100fa0a36cd452bf8e4d081ad7caf99e3892ed01c77fe1b4ca12d6a464e00f806e5022007211515644ed8536a3072b60c613da64d671bc45af19270cd63d2921be12b8b0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02e007bc01000000001976a914401c3d5df57db5895b4e9f5d4909bdda3c19702688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000149a6d1c09d28bbfdfa44f85dbb23a645d2ffa14f6e35f29568fc8e6bf31f754e000000006b483045022100a91fa6dbb0aad004d982abb7d18e015691cf6c2becbe048db0840648ba4f9f130220288b20b9d211912b58552c3ede7217b594decdedaf584dfbc1f043486517ccee012102600f5c7debb32fd61dc607fbfd2bb91438076f2f1e2371421656e7700fbf596bffffffff0250bc1600000000001976a9140bfbd90393953d94e2febe64be3346851fa03fc988ac7c321700000000001976a91465adfcf6df67bc04aeca17daf55abe22d963dd2488ac000000000100000001ad3463882aa18cda75cf581bdd9467dc4c0f8403e358e8e9f70d1740ae65e5cf010000006b483045022100ed0163bc41db8d569027aa198b16007ffc54ef590fbaaefc1213c805deda023e022044bdf2db968844b7809a9577fefe3239ba5a1dc29454d30282a802801c755bce012103d039e3add28083f402c3c643bf09d34af2c48ebba585c878a810860a53e8ee8affffffff0214700500000000001976a914bf33c5bbe3e714eb8b16bfa4604e77c2e19ba81888ac890a8b01000000001976a9145e7f4db40e540034f471b263613a76fe1eb59db788ac0000000001000000017bdb499287c0efa7c96fd17ac4736b2ad3dba4ff61b3f16c4461c70aac5e9290010000006b4830450221009c9c07067b82128a244d42fbd00b6dc5265897d5479f8fd53ffc32aaf154c117022076cd5d5eef590591711e4232b93c86e70d3bcafa4f1d3964fa682cca69da12a1012102b1b0169d96986fe9fed4cc7cea8ba0085d9cce8f22988f3db17b4b209dc38a30ffffffff0281030000000000001976a9148cd38391986e6109944bda6279909483c628cd8e88acd7635501000000001976a914d0de9b4bb9eba5e72e3655431657f3ae4d438bc188ac000000000100000001c88284648378a48a69954a1973952cb753efb7569f31ff221549a8c8d6fc5ee6010000006b483045022100b75fc3429a5e1ed1073b8a4e8132742b445e175d3de32dde8f17ab1311e9f17302202440cda157673a519b1e3596e203644774258ac4945aac266eb99890c890ebbf012103b739f933520ce207c4840b59614627de4eb493296e3ba5aeff33c3738dac33dcffffffff0280518800000000001976a914adc01a9efd60ebbf30c7e6bc2d2bdaf27b5fcd2a88ac80052500000000001976a914cd9f90fe5b4a0003d0c55b56a73a015647e15a5c88ac00000000010000000169a2c6acfcf811ad5d11fc77df1202c53309d09c6120979d90d3534249d46563010000006b483045022100b6679d434f227c1f05567e0cabede2c198bcec5ac780fdc366696585339fbdd102203701843468bfa9e6e5a1593e06c3d218cca9d7d9e95a29bcf14bc45bc4b87c270121029907af798eec9e9421b60634190a0c4e9e2259fd48c45852fefed5d3ed5f3558ffffffff029fd45f00000000001976a91497c5026d2a8f79d11b285e717743168b88f3c0eb88ac0d74cf00000000001976a914433dcec802a46aa475acd7156d960b105547261988ac00000000010000000145860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4030000006b483045022100e2dfe807849295fbcbdd637bc21d3ae6fb5c54e522dc0bd29926126d4fd3dc46022010ab51482b93e066ad7946bf4c9bef340600aa8b108c19c410554e3edc351278012103da29f6e2cc099bf603c50305613d27529d6e2a8a0c7757dc5b148fe8001c1f7effffffff02701df301000000001976a91467c87b8159f81cdc289edf19cab8f3b80a26ded188ac809c0204000000001976a914e09df74c9e44a71868d090ee25ad347c01de3ee388ac000000000100000001a937214679c8aa6b79e385a2f722e0b3b1046286ed28100660ab1bfc3f1a01db020000006b483045022100f2805fb32fce0304763b9a7394dd87c86a21862771665e356aaa3bfc658b203b02200b3a948f51bd115225b5cbd69fbeaa6635316d97a2103f78f1da6245a5968846012102e637ec08527bf402a7356e01b54880e7ee04caa3a683a40d98151c59be945541ffffffff02890b7d00000000001976a914bf7dfb385abf4af5ee8a2f998c04e4a8974f745088ac92f60500000000001976a914ae79e277ea067a9b2e14aac28489fbd5a6e39a5188ac0000000001000000010c9a471a31f6119cdea16b9191f781443f0b27842dd89515444b08033215c138010000006b483045022100d56655deb3e8bcf8cf208679372edfdf5f8d399dfcb2b3e4fcb7143f3abc9bd40220267821c57cbc752ef3844ff5a46c76ceb952024a15a240ceae61bc7c4dd297f0012103c123132d3d4c34c32bde4c26a2189639fbf7a1ba2e670cd1fe393a053c3f6528ffffffff0258bb0100000000001976a91410d74808df150bd217834ecc14b486c55834120788ac82baf600000000001976a914653621945c2fe1aabcaf0ff6a78cc815d877f9f488ac00000000010000000140ff2efd341fdc43c8c5e88a45e2a3f28234f2560c2497d8b0f87b5469df7ad6000000006b483045022100ce7e10fc5fdb0714659e2ed0ced29fde4e9a4a42ceb5257919d3a87665ecf39a0220624524f12539c5f4f4c97cff2df7d67b68d3ad3f0077e3db6602133fa14e4dee012102f808415e680de0148c07c4db4d2a2226968799cdfc4c9d2decb20c67aca351bbffffffff0240420f00000000001976a914d55ee9a20a19bbbf0f8697a51f40f19b869a036e88ac8bcc1800000000001976a914d0eb5c01dbfa363f9750774c5b4f10185e16283e88ac0000000001000000010a94d4de728b23dc9c2d996eb1f272c048125cffc5f70c13f76aec0203816c8f000000006b483045022100fdff65ff849b67e0906fad9246bf8432c0a82d947246241134a192e6256f6afc0220693e5bfcf2eeb1d0c95e5a89dc1c4ad0533404e14c50bc10e4af4d778998c44a0121024bb96b97b76402ca4eb828d41a5da5f25d6b60a70af62c87f52f0139a0247e46ffffffff02307ca20b000000001976a914f0119d3b5391517b8781066872a06aa3050801b788ac60b31e00000000001976a914dc7e4de11b932d81a4425c796da2e81149d252fd88ac00000000010000000170bb356bc6f582587960b82b5cca5a522a04763265fd823c5b28d0ac708ff091000000006b483045022100ba49cc3f1ade7351e1b53d3cda164c7eb671517aaad968feaee36531121d6f7e022014d021d2c34827623a8b963b6277d07e6459fc6f4b12fa983656647dc0d5485a0121029d9eba916f8c3d91587a7cbd42dc4fa3e0f04c9af02c733a64973c89b387534bffffffff028396a800000000001976a914dd5bed484d1b593e8e5340b3b066815b042f70af88acf24de002000000001976a9142aba685cf139e6cd00fbfd919e390a4e7df1ea6088ac0000000001000000018a2665aa6e0927a151efbda6d01c937ba54f09c26e6c319cdfe18770493dd48b000000006b483045022100f39120f6b631d770f8d95a19343700356bdf12524519fa8095ec188e3da95af5022057dcf5d7cda9a332f8b753bce89cb6e9eb30429676d090310ff8fd0a5ff112410121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02d0de6801000000001976a914f0a2f1c67ef4222ae52a14877e8503264d6b387588ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000019f8f6f46f26a924dffbfa7dd7aec6eceff93457610e2b1ed688c95d878ea7a77010000006b483045022100fe8dcd386a7d084022faa5be4c5b927eec4b88e9bdfb8c4d8532bba02bbf594b0220526bf62b738ab326a01a221ffd4a20be0cc88199f7b460188bde33fbf24608fc012103bca51dcc46680e44bd07fd5173d8a794b8af1d6487d504d33880c4a0ac19b48dffffffff024aef0600000000001976a91480cc9eac1269f098ef3cff22cefe9edfd768b01e88ace3c18400000000001976a914304b7a9d53cb13eca39e5f690b0cedad07bae9a688ac000000000100000001776771b211f636b2b11d64c885cbc8dd2f8a70d008f0d44591a9ce65877e132b000000006b483045022100afa3ca2977bbe453982832bad4d306231870f46d8739f7b754f358b63ea1808a02202b66c10a698dc1c659051bb94d30655f58088ef622afb5971dcdd76d6ec697700121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0da8a00000000001976a914204fb49a7fc7ebf05deb1b7f0d556c026f4e47a888ac0000000001000000010e255176480ec25a43687568a2c3649c5c66899e0087005cf57d187dc1eaecd1000000006b483045022100ba76236d62f2f67b84bcee6b8c7e14eb1599c47db0179ea0352504261ce339cb0220415985b1c41c794cea7b4045d6310dc7d5f26eab8c015bf534ad26aec2c922740121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290657d00000000001976a9142ccf5d8ad65fe734d5d99a7cf308d2155caf7f2588ace0091b00000000001976a91438860090779c6df12ea41cbe472359b62957527188ac00000000010000000177f2464e93eb488326437572a0b56fc9d30324c537262d66fdec9cd9e290adc6000000006b483045022100888fcf82556583eb229f627deb78fbd639da3c2697fed0d00fdd3fe7256f2ce902205c2fcc1e91fdaa59a7eaf00215a8fd2c6a7f2fbd91e2ee98fa75cc2ae580f6000121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02201d9a00000000001976a91489def75a8fb788a679f22dfa5345c9f133ea574888ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000018151a8ff35ab872067c2eec721a82e5aabaed5945273d23d8a8a2d333b929eed000000006b4830450221009cd3a7b001a4d2855e4f36b16b4f868bb76bab7e6e1c59c8c15bd232c98ed2d002203b4196bc9f7ab29e7645f9cc1a07ff20f574c45f981ee42ba3eeffe1f64aa8a90121029a53ad741219c815f012e960f4405d18f3a1961f7d649ae81a063a2487c22d6effffffff0280841e00000000001976a914d5abb8ac00c6959c378feb148323b98bd49541e988ac18c34704000000001976a9145b549868035856dee5145b75d27beaedb3edf24f88ac000000000100000001cbbc4e573d773a6165be372ecff34dde39d9e2f7deb7715a2ab3faaa2f8df8d6010000006a47304402205c3a1bfebeef5bff09e9c63327faf69eee827fec5c77a1506f352e57d130dea90220354e4c761042fb2f8f36fa10ada2a7348ea05be39bdf7d99591d94c4e85fa6b4012102c57c3b0a8d3bbb77cc99e148fd32310f5528395126965fec8862679c8bd327efffffffff0280841e00000000001976a914ff74a935d6f5bf9c149f10efd201b7fb9983729b88ac88172904000000001976a914b07c5b35c954c7fd3b2b39daba0df3ef46c7c34188ac0000000001000000014861b3b6a2737b62efb2d5a572921fba6f065f27ec8b74c3b02582c6e5c8290c010000006a4730440220070a23849da7f0f58eb77c025e32ea5ebcfd5c33bf90bf97f479cd49aca3167e0220225d2211eb93914ca0e484dbc9f502e8eb4b93a4ad638d865a97d6308f8afaf6012103e86ddb6fe3df077d839e235730c3818c34125e22b4933ea0dee3561b96533c19ffffffff0280841e00000000001976a9141c41a87d9f581de62a1e7e0dba682bda0383a71d88acf86b0a04000000001976a9147e087cee0c1b74ec718e1418a4a5a5d18c1e08d188ac00000000010000000146da060e9d8586b8b46c684ac68e38a9e37bfcfda8867259b970a424719b2688010000006a473044022032290d6078896c1e58bfeca1f9eaac6cbadb6ef7f9237e21ed9509bb77c67b7e0220669429afe7508b927ed0d31b58740f5e7291ab9aaee5a36534eaf9fb0296af54012102dde2e50ad9e2c5b07fed6b356b76eaeadfd7dc8cde2d868d4c548bef8112aaa3ffffffff0268c0eb03000000001976a914f819c43121750389b394011167a2282a2796398288ac80841e00000000001976a914160f442aafc9e12afe54885c177def530b765e0e88ac000000000100000001cd24089021d9b6261c2052df521fb512adbeff83b7771d6c20176e6967a204d4000000006b483045022100ac02d3ca2301104437335700fc7cb32cdd3b859c9313e6b5ae33f8de89c5c8b402205e60660f2222b09f1727581031391c5dae59412bc46bcfea62459119db9e15ab0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0200127a00000000001976a914cf09ea4634b5bb96c82c06cb97365b5c5f84d22588ac301b0f00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000018ef0a3ebd97f4d897eb643b27e4cbc17233a441c1e0a649b54295438ca18e529000000006b483045022100ab29fd58ee92015b6f80419cc54b879084a32463092b6d6ba5c924e26b26914b0220479ccbe3cca1cef5b86b4cf0443f0a4fcf7b7e50965070991bc9d606efed928b0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0da8a00000000001976a914771a7d1ec15ab698ff58a98eb2fe173c926b22f188ac00000000010000000155eb18e2320fd5a1721b90ea70871bb5eb82a7359fc8acc56e6a73919648771a000000006b483045022100986fa3c5318f63d4a852826112b0bea467d882215e38ad30aff53abc8e40e10e02205bb2442f4f0f2b88b86b2ed181fe0c61ad1510f3df91e7305b594f2262485b6f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0210df8800000000001976a91449bca11e088295c20333dea7c5e8a70b3063c11188ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000001816a8822c544a2771ec30dc0425e82a7fb7bf4548f15be7a74ff6b0545836cc4010000006b483045022100cd04d829ff95186c10514ef6fe6723a2a758fbd9539de877814404920f4a810002205327fc7c8e9d07d2671255f985d99457ce9998e9724b9841d6d8a4605664d6b1012103eb20647ad0700e4a20da7674bb7170e4a8b5b3405ff0fcd7a413e42fd6206871ffffffff02b0bae400000000001976a91401f891811089303fb4e907cf55f5b73c49c6caf788ac60ae0a00000000001976a91447fe5849bc4370a754e94cbe4e926ba407b0ab3988ac000000000100000001e8a910fd3f05638d439d1f09338a1df10844a8c305d3de5b2518222c5227eb43010000006b48304502210088c7f1417ba7af6987323610b0c2e922383fc571c03c88e995931165183eff72022056f781eb850970adb80dccf36f3814157a5957738052ac543260f97107a7763801210287b7cf0dd2765905d7e5dc4b30474d21837e8a1ee462dd12b5e16cf75d319127ffffffff029bcefc00000000001976a9147c443d62b0cbbcd3969538dda04e56f9860d0dbe88aca51d5001000000001976a9146e85c2704efeb3ec5064285d9b2406f70fea90fa88ac000000000100000001fb913c3a335f8253c20c149947fbc3dda67cad293b91580b16005b7d164bc403000000006b48304502210082b5bab93f1a35d265c6c6cbaa620810e1cee2437e37a1afc2735aec9249b2bd0220790bc112a0b4d0e9da60ff7f5bc645f15aebe0edbd630ffbc393b8f762a9082c0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff02a08f3e00000000001976a914da81d3fa9fd322983ec7e43bb46eda0b0f1f5edd88ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000139da200b400ab66126d8dce55898b8c290c44c797e40597f2dc737a65456c3c3010000006b48304502204a48960591c0472787fafb0ede188ada633b3b70c08f60f25528f6ca915b0ada0221009c9b7cb24a7a0683816c0fb42bbfa4878320b628228573dcc7a58a3820528aa0012102ef66fc53d127bb10e6571c8881a18271c10d039b380fc99e16097353f9236630ffffffff0241b5f900000000001976a914dd20a8903341d9efabf7df4f7e8bfdca05c133c188acba808e00000000001976a91482dad6ae232c1b977ac6416e4acf758d29480be088ac000000000100000001a57af39bab4187ea4c528911c92115f4a297d42057a1c8e569481f8604c85567000000006b483045022100fe9987ed4c19b6e5db66bb1be8ebaead78e0624756b637433333043e985dfd2c02200366453469ddf0db4913b74925e2af60eb718b05cfbac34b303b4316e34294a40121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0c81000000000001976a91451c5d817051928f8ab1330918cc13eb3231fb40c88ac000000000100000001e6da3293d3d761d12f1df1d2efc66ec77be0b37a18a2f0f239104db5b9e1ede7010000006b483045022100fdcdc80ac4adf4f40e1a4bb5817678852a08cbb8c1518b02852ad742d94bd186022066f67b49e6c2ae974551022836c44066e16458231214ed87e6d7786bc23943d9012103895bb384d5fa15aac61d77ca5c9c904e2778e73f798db89cbd7ae3d00a69324cffffffff0239550000000000001976a91443c2498401e674923e0e82e5edcec99dc824077088ac33d46204000000001976a9143b31bd659ae233c28d55d7c2495132eed1fea69a88ac000000000100000001b68f38680e7ea29b7c1c52d032f2b91b99c7d77373019f9653431ec99bb58cd2010000006b483045022100e0d7ab075d1767e38745cb16d357bc3ef140f07e40297f0660b57b277909140a02205f8143a000f2c31ce47dcb2b36ab8490e2505243a1781d8a4bb40d44435cac350121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02c0270900000000001976a914efa8e9a2e71650dd9816a775274908ba460502a688ac0cf97a16000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001aa2b9ff72f22db58e5c45b13c26846b0d864862b4e448c6fdc37e26235000d83010000006a473044022004aaaaba2b6f5b0d763656d8480f835169f28f3020ea52f728074f99d1fc7baa02205e310d11f338eef22f0d8965c5a1a6e3c3e48f8685d4d0330b169512d2da02710121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff02409c0000000000001976a914134b26e10583070eff5f3164bbf3bb570fb9dfd088acbc357a16000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000001027664cf2072f891cd97627185786e5094b598261a2826846dab1e0d9d2f07a7010000006b483045022100b3c87e3dc58c8439dc8ac8c46da9da2802ec9b2810c281707e0306cd738d915602203a9e6746df994e9666208d98804f95d17c4a2ab1a402a903c4c1960b863049570121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0220a10700000000001976a9143bb9cdc3ece1474b65eec2bc03397cf8fd987b7388acbe4d4929000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000012478e42e89096f434077404683aba5006ef39a6e7cacbea9e6edbd5b61d7eca3010000006b483045022100af1bd66374bf00976a040a0b0de28786759a3e5a12f8bd689e0fec6fcd032c4a02205903134193bda1b4db186ce3c8201dfea3ad07f8da0db3e79c2e8d44496b47d00121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff0267e50000000000001976a9142f303f7bf98a4dee67e27349122f4fb722282ed688ac47414829000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac0000000001000000015c192b5b837ed9030503bb869c8e277a706f93027d05dbe31794cbd24357081e010000006b483045022100d28312155f33af5157cb2ad7b045679a6b5c4d1e70e83e56ea4bee40681824a902203722d7f4b948c02bb5416cbecfb5d08a9e58e2456a83953363b8b8955e297b450121035f75b297af0306a021e623aa339fb1e07177b75573021757a789189bd4331b40ffffffff029e472200000000001976a914643e406ad6b41600d727d7763877a7de2a4d937188ac99d22529000000001976a91408ae76736aaff6f278745818a018bc0f9273b90088ac000000000100000002352e9e691b3c14e6a50eeb598eac65bd80b6a6ba41259e342af1d3a27217c1dc000000006b483045022100ab046930a42b7b1765feef18445a85a43a64236e55f9840308b3cc1cb96b142a022061a6e5982159b449069240c37bae804cc2a41e5d2c8057cabc0ca6384a25f79e012102e898373018aa6062bec933518f4f7bd6f71b1e21cd7aed6158b544a6af28fe3dffffffffd3395db02ac6e4f02ee89313a7e2da1a97afe48add0a4e234b8bb1723a4aa511000000006b483045022100b94395a3594e5653f7e84302ed01eb3e37ccced20415220f93481ef94453c98d02200c3974d68ab587a902c6794d2206374bd847f95b95be270adb2a07bbe8acc22d012103a9374fe2eb93dc73e63c29d46493341bb5b64ff89c44e196b95ba5ad599028ecffffffff029d9a0f00000000001976a914e71eff250b0630d79ca4e263630e2c61dcb6f48c88acfc4832010000000017a91471acd974894d1f213668016a59f73882392a16038700000000010000000190a7b1919973937bdeba4b3ded04ac1f4a586672cf13c41abca5b317f22f1e8900000000894630430220383461015d8a61997644125f8aa32f6a47b7f1883a26ccc87a5aefa60581c974021f3641c9be6ea61d349466e5581e95fb7687455f8fda3f54a3dbcf693d50ddf60141041bc774d6ec28fa00003f7994d75b16b4e0c3fd6a375ff316ea22f138ba965529fcebf727e6ab36a67c09e69e6c16508ca0c7dd056773f45df9d54c2a12f9b4cfffffffff0200dd6d00000000001976a914e89db39ab753c6d07da5d5992b1105941cbb038188acd2ca5300000000001976a914aecdf57a5136ff9b91e780b35aa36e683203ca5588ac00000000010000000163ba2dc09b3662d6920e6e44675d3623987b7de9a7674f6255ac95c86ee24131010000008946304302200a720d6f3238ffe04fae0de67406525fcc4da257299edf8f037ee912873d9197021f59fa66fa8769a8ff042177ecb8b7776dc5d415a997543901a91c2f6c3716d601410474235a4e0b3a44ad26e46885a8825b943d603f4d28f33abee31b7983245b97627848daacbdb979429921a1788a84d154c64dbe071fcdab4b28b355c04dc2519dffffffff0274be1300000000001976a914e2678d43a48793d5838e2664356d2529f3e5b53d88aca5684100000000001976a9147da1b8948e7c8ee47b5e8689f7ba3c55da0ed6f588ac0000000001000000017ea8f3cddc248338f29e4124c64c337108cea33cbc8503255df96b29339a59eb000000008a473044022069dff4843a106ef0f9349cccc5ac214ec78295b57ec315967c65a13532155a6c02207c06a3aeff15b4dbdaec2cb317080443f30d23acb0be112223e1efe2c7d5592e014104c3b032a654919bbadac9e22c3ac28c6fe5aa332e1f4611cc74614c3ef9eb766e358db4166687d57853ded01a7123cdf6bc17194ae6ff33b4d2034143ffdfaba7ffffffff02809dce1d000000001976a9149521b4960ce31e5f6010ac07a6e98778ceedf81488ac80d1f008000000001976a914e9e8b70f42f21748503da5163cef3bd20ed85dbc88ac0000000001000000019976607afeace5a527f482470379f258c7f2b3769ff202a6705aab381460dc16010000008a47304402201bec49ff689c3644e6260039ecc1f45911cea3d53a1da1a312688bcce97f1e8102206e04074ce7b747feaad9a2f8b2b4eaaf65400115afb73a333632bcc399a379c301410437f693a9a0b48248fe108dd4453a247657d58489e20efc07dd8e1175a3cf8e5dd7d62b61d4030a46c43b077d47629e6bbb0cef82a13fe64632752551885d9dcfffffffff0200b42d00000000001976a914a20c5773dd11c6138cdda12cab6339888aa8eda288acfbe45902000000001976a91489b36f026ab4672b2bb81811a8ed5b56d8bbbd7588ac000000000100000001175aab3689286f34a4bd0679ad47a3823ddedf4c3e24fb8ee670a1914bf38ede010000008a47304402207ffd0790c6979f3eaa3af0168f69af5c62206028093ce32373e460481e087cd002206c3e48c43766af4db76032ed71fac5370af4d894645ebf0540544b3c577e70060141041a1e02b6552ea8edc143580df651dc8c63c7bb5f712bc40c2b74a9cca8385bd7ddcd1d4f1bca9246837ae83e9e65351b1451c55298b5306382fc99f0785bcfebffffffff0260e47801000000001976a914a93411db6c196477f9874feef0ff040f2a396d7088ac30e76401000000001976a9144ce1bad2cd7a8f26576247f20e6470c7a449749588ac0000000001000000012ecee018ad8606d304b68093a93d6ce29f2ff72e7b0123148ba365e8f50de214010000008a47304402200c024e29325beeeb051afbfd8997822eea0e847e28f87aac7e87d4821c33f152022023801fb4b03256ffa58382390484b758599424df370beb1e0c06eefd6ef20ba20141043cced1a91f53030e27cc77bb5b4d09074046503eb6b0b421e8d0fe962d02d20f22a3af5a0021e58548306a2a14ad8bd8875154ae25dcfc3f05a894a0b312af95ffffffff0267b9ff03000000001976a91489f54e6f4834e6e9af1133e99e894b75ce92b8f888ac8e212f02000000001976a914e880d0c75ec4e0b1706d77c95a2861d8cd58941d88ac0000000001000000017cbc8ed7364ca984459cccef1064a1539a87f08077e68161fe3edcc83fdd334c010000008a4730440220184e1493750e12c0424b8a24cc5484861e2ecb5082e4d01f10100b15cb7bf4a102201a8f90350e74fc6b89fa09b990639b30c996810b3638cf4aa6d5cb387fcfcd80014104d7cca46db4d019050091efca2ddb22f84db422ddd3e5412f5047d5f164a03fe4a5f4921b117daeee43b579ad45599e7c9f6a0f3868ba3c14ac3425dc777aa446ffffffff0280c3c901000000001976a9140f435479fdd5915f30d0ec53956bd8f9df561f2588acda968e01000000001976a9144f4c3c6c608695d000ada658741b2c74657a992d88ac00000000010000000161f13dc990094509e7b42f6547bd85a5627e94cd25518dccaaffd04742719141010000008a4730440220190df8b356f2f818201efb0adce267a8983071307ec072e86a1b32b029b50f08022060696d8a18681b6b03ff32f7441f4c57464c7ea69396c41c6e7e1439d0807cf0014104a47a6d2cf0b0ea4378cf6bcb220e5a1e6540cc79d7aa8159944b951bb50de16b694e9fff7de2f82607498b6fdf49637b27897e75ed9fa9b37383853dc9fd2f6fffffffff025acb9c01000000001976a914c6e272e758974b3e62f255fe720d3433acf625e388acd0c5a30b000000001976a914c1181de3d914815f73488beb833ada384df9bde588ac000000000100000001915d175b7b4c984fff3fa34903f49269e70ccf53756469b770e8d089a2ae38fc010000008a473044022047ba8cf3423dccf745dc2d3ad232825d55142366c128a19eef05337d57f9a4670220588914eabdbd27390ea3efc2c1d3930a1c779f272a6ef5d741c71617181dc7be014104662d123f77c12b85cd810b293a8feedc85d0bae17fd7b2828116f83d74ee7949f874319ccf04d555f39b4eb39bcf06f0a9aa8e0c8f9d6a6d00e3f8de141fdb09ffffffff025e762700000000001976a914d95fdf3e2923a6e03d575d60874e141c2b095ab288ac99ee5b00000000001976a91418ad971c9a4b43a3d9b64f04d95857243b9200b888ac000000000100000001435fda4275f5eed149f1583d9b8fc8c241fc3901049f85323a909b47c7fa718a030000008a47304402202b98cabbd0390519633a6b98bcfa65d7e39a4fa667ad8f8ad41c65cf2b44ca1f02203fc590c6861273b7b6851a4c03c5ec6fdfc1b3667f4b1db3a3928fd9996871980141043bff7b473684842a592c4e3a525f4fa6adf4dc9283d6133ac1dfb9d5faa83605ae3a7fcc9ca4e18652b2fcf30ef8e6abad8dbe11433f3b0405bb8710583281aaffffffff026cda4801000000001976a914d86d62ad5f079e0b2df59f3d6a8a9791e401e7cb88ac044f2b00000000001976a914c75b5885ab89d1e965b212c18af6056681b96b1188ac000000000100000001b99b1f9130a9ec8654a4563a44861352356982be96e640c62d2f92659ace8258000000008a47304402200abe8bf1e5b8f2fc9dfcb567d1883bb31fed5ec039320f5eabac6edd4dfea5c302202ce1d344d5bcc038d833dd915004027aaa12180f7dfd90f733a2b89b63103b50014104ceb6a6735d2c1bbf8cb98ac86a913ee6b8c52f176c686032dc6e6cc4051561976962673e5749d123f10f10e0196e4088bf73c8bf6764ffba4920cc138ae3f75cffffffff0298bc0a00000000001976a914339b675e1964b342792e70dd90990fe3f161a15288ac58492601000000001976a9140925d3e6304ec2f4020b36915b0edf3928152a8e88ac000000000100000001c60743a3990c2b422bba35bac463bc362795ddb9e5e1aedf751932fe9e91732d000000008c493046022100c623b5e8b182433eb417e51c4c4c73ff693e59d4cb4cc5f9804abc7921119eb20221008b4bf3ee24a105537afcb4eab724af89632e1f8d7e90d8c2036b0dd69dbaf66d01410458aa045e796693592ad1c0f9787d384db12d01ac21f83eb2dbc01ac2867bad3d9c3079633919ac0929405d555c779945016f7326735590ee7c549f7484a55260ffffffff02905f01000000000017a91459c97c71e18d10dd6c8bece399fad89e51b429718780fc0a00000000001976a9141099aaf36b519918cb910590df0d3deb40a2a6a488ac0000000001000000017962982a879a0d77578c61961181ac576425d9275b281c70f272af6a50cf947d010000008a47304402201a548265fa9ec6d7b5315f2d2044075855a4687fc7daced6e4f3ddea102749720220489a6e9b47307e12d05ab21db9cf72e30f1723c1a197ff51afadf5332fc73b07014104f59e40aa5f1e7cff9a48652e5b956393cbb720ad6014798d852681779b021135df449dcb85f96630931abac99a2b0562c02cbb38403d804a8660a55adda93ef2ffffffff02528e0100000000001976a9145cd816f1abfa4340ed1dbfef0fee040eda04ab4f88ac1a3a0100000000001976a9147b0d09d785f0d04257fdd9079339fd8c3c51267a88ac0000000001000000014109001bfef7efd778d4ac0cf20907d810067984b496bcad2d2b4c4422a5254b010000008a47304402201e205fca551a11a846ecb95bb762165a52668938ff8c804b903a0e82535ead5902204e7cc481397ecf2e77c37ad9332a48b525f9b7f4b8d4927e1259b584e863aa5e014104a97b6a922622daeb24383bbe3b3262a7093a625c6097e9d1d8ac125878df8aa1e7ed8fa7b56436978d0cd8c31d5f04bc4500cfe588e7bfc091457f9683d434a1ffffffff02839c0100000000001976a9144a6d24d0657c150cdffa3e19f5b9ca3fab85581c88acb5c4b000000000001976a9148cbf5be921cb1ae293908ecd329f4f9024b7f2c488ac000000000100000001075ecf21d75905e38fa74492558092853922b95f138e7be73f694a82e6823e4a000000008a47304402204e7a831eb8431dd1c54d0f162138c467eaa10efa5b0af977f54796277aa1223b02202b77d26a497b080bb7e3d62eabe07e5faf8366d30313e1b4b688c0da0aaacc7a014104107c6cae014ad7d97003ad83e0f34c5f63fe6e1669086473e5d4395ad0fc041b39ba269fa2efd33c1014333c7aac3c2943a2aff044b226ee79f57d1f06debda1ffffffff02a0860100000000001976a914aa663ac6d9c21282193b9148192dadf7455e9a2688ac70fc4200000000001976a9141c2ab40b32a5d3094b922fbd8acff705bdf9e68b88ac000000000100000001c03b0a21bf7013368b0e93c4fe6beea937981fabc1a1a3d06c2a634e0a5924fe010000008b483045022100ff3acfc24961fe3dd9e5c462ea4ed7deb84a6a012fadf535e65860568099b079022042fc355b9f02271c053a7a84045927448d6d9c50fbdd4f87e009632b4dfda74501410414c4f2d625ec8b16ba51fea09976170055185de9315bf8ba3469b32e158559801462a08c3b39748084a8e6c87db67aa92115105b32e925f4cfea8e1fb86f482cffffffff02c6219202000000001976a914e5585e30519eb7f088b21c0dfb3a6fbd158f632b88acb96dee35000000001976a91422c5526fdbc3b8a9144703b785a72d5782c3367c88ac000000000100000001deb5fc9c75012001f61afb1ae7e5a9360a4f4b1fbe4f2002b8e2befc8d251c64010000008b483045022100f9557ff4c04207b5699d039d9cf249b2a82364cc3868cccf31eb54770304a6c302201d00fe262591cee5bff049ee86bde08e187913c4c00ade7bdec64815b45b9e61014104aab5e25e3e5bb152fcc112002e5fe132b8bccf215ae9da0316b4c592fb4db306e3db3806da59ace6e3a5475b42416a043123a271841f2b490a9cf2586ce6b853ffffffff02b07f5002000000001976a914db74dc5d8d5f06fd3c26f8bc0db2b47121205ba988acdf7d7507000000001976a9148360d0189eaf67f0b24ea7b289ec61475f7501a288ac000000000100000001ddc5f30f030e6b3e83780b2ba15fbd6f62f21522c1bf9c62492407036b3be487010000008b483045022100d218846dc5e0e9c9437ef012efd838adf342db2adc2e64185d5554b12e790e5a022024d308eb601e047faaa19ce35899d197e13ab2f8b12ac40c28bbeeb8b17957d20141044ea5ed048e7a56f3a4bb0c3dfd303617ef481369e9304e1c3c0ef5740d70da456c84032046b50b44e64f509f41b5db52c360fbaccceed86196710b9a1991ead6ffffffff025e762700000000001976a914cb926601139fd310f000165f492060abcf640cc988ac42a93601000000001976a91454e3685c8893b6d283fcc4b186c0d669c8ce112888ac000000000100000001afadaa57ff0b061f1da58d648ca7e02c63a7bc4df818512d17d053a45f8825f5000000008b483045022100dafe77e266223dd7a8b96940d0dd41a299823dbaded4488f2a1321730d4da8c7022065d1486566e9bd53c7c2a4c223d0c751e127624699858781b303b6f856bc3a7e01410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff02903c6f00000000001976a91448bf8f4b1d3fd7119827e12622fbdf38c55a6f3288ac6f801300000000001976a914da25a9fdae68aa9d8d0a8ebb44aa5892c306f3b888ac00000000010000000188f6595dd9f4c10e7081373170660a6b7eb92ffdbca19bd5b9044e6fdab903ac020000008b483045022100c82e72fdbef0c9bb00454500476141aed10aaa0aab3de4d5bb9896407d4f6db7022028a82c5ae5ae52216a0ec6d05f681b244552a2b5f3e890693799380bf184c91d014104d19d36a81409b86c777d2a2f4e709c7197fd738a5fc33d5c0ccde0eb8721d0597d28713711dca7c26d673180963e471d97a54795bc8e41dcdb17759d89a78ab8ffffffff029019dd00000000001976a9148f289a7eb1181236c68208765ed86ad2673cdee688acac624d21000000001976a914443f12eacc14df374acd393118503e7fc4c79a5688ac0000000001000000014526ac41de8ac46faf8fdb15e0b47d10c0f3279dbc77c392b2e7cd05ad00a456020000008b483045022100feba0ff52dcf44a53b653f5eac3fcf610e16753127f15d5949ca7ee501cbb86c022005a7615da7dc679e4f47937e60cd8da9d31ca199d14187f3e10c1a7c2aa5759f014104d27e2aa497c10a4b9c59cac083219fbd8e71c0b1eaaf77691b63f371d310ae6515069292ae84d3751f63f20c5a84e931fc82a3b21e10e7a04e80a54648da24f6ffffffff0274499b01000000001976a9141cc08e71e20b330a92a570fa6f2f35222e421a5288accd5c2101000000001976a914c818a6b3e990634aa93008edc9d0e86c199081b388ac000000000100000001fe5da73b657fc9c315ec7436c908129947c0bb377da4988d9992695f5fcec4fa010000008b483045022100db639d9166ed6565363e4c4c626817b2a8bec9cf9f391116eb395516c2ebbb3c02202ecc39553a61c63d24a0e285a972b0d85624883415cb50aa8cdbc47e8ee830340141045ecd59c94a3324ae6dca5d2f273429ace957fa5098480c0af23ccd2bb0009fa9e047a5e9e72e5d7fc8a7126850633c75807bb6ef9205b26ee55e77b8261f0e83ffffffff02b0692305000000001976a914231d1428aca537e7181fc5c48912ae661bfd9fe988aca1993400000000001976a9145597e8062c77ca2ac43896e2ac87396d6918287188ac00000000010000000161f13dc990094509e7b42f6547bd85a5627e94cd25518dccaaffd04742719141000000008b483045022100d8bf1a90527235e3d85447c08fdb8c6c1ce11e98f0f8509c2da68d1dfcc4092e022054de3b12a7b572628f23b019ce656f8ee28baf91e5f930906672f05d535d22ff014104401b445c1d3009dfddc7e4090418530f87ff99fa7ae34bae465b8342d2e08fcb2fda7a332ecb3403a362977e132e772bab5cb54da13c0cfcbb8744eea46eaeecffffffff0236155c00000000001976a914b7ccfe33ca650d3dca6d4d042715c3829b695ef688ac8a242700000000001976a914cf65d27fad09c4b45e75bac6dfe3509d04392f8c88ac0000000001000000015600d15ab7b25a10b4390a8bcfd1768bd7f588c71cff0713a3edc8626ebc6d9b010000008b483045022100a5f33d09ce93c6b464865e783d0461393ece97b682a83fd8edfd8e5425f4b1be02201866e91dcf85dcdb7b0562f9d08f31239b197236ddce35dc930d9c58c38d991f0141047aafcdf886aa17dbcb9387abba7d997de1c978130d4fccbdc51f89a84e8520ab2d7a1fed6506b9774fccae068390043181b43109f73502a6f2d05358e5407e40ffffffff02f0490200000000001976a91408a9c60df3b9a9058affd6d796eba2b580b7f9ea88ac6cb41100000000001976a914f8d5af3a7522f923652974bd34bfdec8fab01a5788ac000000000100000001c3fe3630216ea082103792d8783f391a9bad8ad5712d830f07e17e421258d67f010000008b483045022100b32a1074985ffb185409569e571f126c8194d0bd5fc3a964e362e4ee1d9702e60220451bd887ab0292a6dfb0e990bb037ba07e6ce504e1ea11f24b7ecd354ee62fde014104107c6cae014ad7d97003ad83e0f34c5f63fe6e1669086473e5d4395ad0fc041b39ba269fa2efd33c1014333c7aac3c2943a2aff044b226ee79f57d1f06debda1ffffffff02f0490200000000001976a914aa663ac6d9c21282193b9148192dadf7455e9a2688ac708b4000000000001976a9141c2ab40b32a5d3094b922fbd8acff705bdf9e68b88ac0000000001000000015b647a206ebf675a3d4ff2793786f5a1e6bf75f595ef58bc2211f0e7d8cd3225010000008b483045022100ad81f129f600edca3437208140c4b4ba388dae9a36ff75e00a4bf5b74513de5402206b88458d48551eb3ed8eaf652d7b5365aafd2475fbf79124a58e747d14f2ebe2014104aab5e25e3e5bb152fcc112002e5fe132b8bccf215ae9da0316b4c592fb4db306e3db3806da59ace6e3a5475b42416a043123a271841f2b490a9cf2586ce6b853ffffffff02b07f5002000000001976a914db74dc5d8d5f06fd3c26f8bc0db2b47121205ba988ac1fd72405000000001976a9148360d0189eaf67f0b24ea7b289ec61475f7501a288ac0000000001000000016941a70b4b3898d9ee26c15069a741b61d807978093af79eb809e9b4831d35e5000000006a47304402205aafe6ca6b3ea108456bea0f235c3128c293f76d280d749a16c23204b72f64e10220715bebaf7c9561146f9becfa9e7afeb203b13b1b1a44984328e3adfb784effa2012103dc76f390898c21bb9b8b7e53a6c861e03355d6ae56f790121d789bfa44440834ffffffff0310bf3a00000000001976a914d4a2681e7db09391f987d5a0c9c1958a6164571388ac90e00c05000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ace6b49a1b050000001976a914b28a53f439b972f2db9c9680a005d640e830359088ac000000000100000001e8bd6b9f7e08e9149c1a387c42ba8d19c8e989b3f5cb7ba0c7ae32124f8dfa42010000008a47304402201fc8942e2833e8b2566106eda56eae3d8a9d64338abab46d84b2a0c8af70716c022031ca1ad6c2f6608cfc6a156f80181597a18a47d98f10e67755c096631ff594ad014104551b1e0003bcef0db4819d8191b672392cef24a6d13ca5c8f5f6207693e587e913e287b3bb42c91b3e81a154e8eeda4fa21c410d18c90dae8d3062de82acf13cffffffff022fbb1300000000001976a9143f351045f778e91e337226aab7ab2b2f2135c3e488ac51fef804000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ac00000000010000000120bddaccb167d5061090abc1f59c8d179d5587f96ff9ef9689a186052a9409fa010000008b4830450221008e60a35ecf2f531c0d55187867fa499193780380ba5976fdc85ca08f3297d8db02201d9e4e25cf8cfa26a4ae760ffc3c3fbb20554e0cbbbd4b187e849f0a4e8fbd65014104551b1e0003bcef0db4819d8191b672392cef24a6d13ca5c8f5f6207693e587e913e287b3bb42c91b3e81a154e8eeda4fa21c410d18c90dae8d3062de82acf13cffffffff027c0b7700000000001976a91441a8dad1e784e4fa4c40a84755843b2586a543fd88acc5cb8104000000001976a914105d20612c4f3624386204598176cfb13a48fa4d88ac00000000010000000337ee96ba2dc1edbb65af690e7ab66ad2518ab2da5c6d5e571126ab32cbb2372e010000006b4830450221009de1d03ae4bfbaed4d5b171eb934525898d7cde7af7a665e7b46588d116573c402207bd3c04993ebc884e41d69798d4fa02db143573b15ab75d1bf9b5a4d6694613f012103a76be126c9d08432406d6e6fbfb5cc03324d9bde8eae7b72b4e71586d4489c21ffffffff31e35daab606346045b3cbdda2ffc435e84f8b8dbae6e34d971433b19febe920000000006a473044022045ace32620bc395d4187175e46f934905b491b178542d554727a33b23a1ae8c002203e1b769f070df327e4f26cb1d9374e1817493f82e7fcaf21c12edd009a433b6401210295db9944bd20a9d78d59f5199ae55b91742ba8ffd555425e97f8f17e98bf1187ffffffff66dc651f87a912b50b5d45110a1eb75bff64c6489584cb262674685092f0ea4d0100000069463043021f1f1418db2a9ab04a62ba8ae948ba94610ce3789e738536f9360f56e473d587022033468ed082ab76ce5fa55cfca0686b67622cdd05a5a994a64018563911c9724e012103a6eede2a81d823f67ee5610256e857182f49ed4444ef8773bb738203425eb89cffffffff0280841e00000000001976a914fac2ad0a0ccd563abd2d15a7a280b4a2f7e2495788ac5a5b0f00000000001976a914ab9b9df8a28ad1fbdb8575130909b9822dd31e4c88ac000000000100000003ed2029a0f24227cc8836c4c730a5924cbe728ccfa0a0e7fdac89385c56a7d510000000006a473044022054e48b01ada692ad9fb5a510c46afe65170ce9f4ed1709cdaa9b82dc625659ef022074ebaf1af4e56f36821dbc1739205b1db7eb2f53d9fac05339fa870160c24172012103d01ccbe0948b2a008db994a68428191812fd5016d78b09fc21d0becce89cb465ffffffffe569f3581f316d7db9106ecb97e39e36afef2c1cf6d235d6e86339296be2c02d000000006b483045022100a3acfc0475693884b34612caa53d04dbd7488db176d7236b490fdce2fc8c276f02205bb5e24576d312433a4f8cb286aebe9f44bc0bbaa348ecc1372994a2509502d6012103fffcc7f657d2a2368b8f58c143276928adcb949d00171befcc07a59f1de911a0ffffffff2cad593a889de9aa8bf6167d5aa0eb2a4da53a4a7d0f8038d7ad876ba5e8fd37000000006a47304402206ae0aaf1b341da94c60715e31abccd20e44d64583f6fafb0e4f6862c6b6ea86c0220745ef223262638626dcca5fb718fd680720889b9cff6c58ce21acd69a853ec990121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0250690f00000000001976a914ee3e38b648a77abfc4ce550042a6f5c3a7dc484888ac9055d300000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000024c4052a792a3f325d045eb3ea86b80be5ddd3247e8a7934d6e1db875669bc437010000008a47304402200dcaea399a77c0f2940063de262544ba0e639d4f5b64c06cf79c2c694279279f02204dbdcbb7499871b5c23648f6c12117f3674cec21d3a765a173f2f55f76e8436301410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff07ad7f5112dab5756d77a10500dbac92c24cb1e3dbbc7a4b21997833d18d6c0c010000008a473044022014b1054e1f7733dbba7185fccb58d48e6340692dd26b5fb83bc49043712101e8022044630fdd84e8bc10f109ece092a6c5336ce39497ae30ede2a7d6ecf4640022b701410461e6ce37992f76ea9312a79dd9e6694c950508f524abc56fc3bcacfdf8cea4da3837522b8bff5675a732ac04bec84905d09eb7e519f207fd20d72893f6299cdaffffffff0174be1300000000001976a9146af9d4719dbaed66a164325abe7a1b6db65617ea88ac0000000001000000025947b3b66be0c45300b39acf14af7025cd18340a6910e9586384c42ad7de0781010000006c493046022100b39b66139906089dc1a4fb49aaded039982f0c893c10d2a025a08db9ae37c0da022100eb4179eb57cb7b5fc7d39462d1fdc484262743514807ba9e1cd37dfc485b8493012102b789891a23a8de0661acad50624e6e3a5314b000577380f5d5ff5edd2522d539ffffffff6ade298009d733860c652b3840540a3ee8a2c205e4b0b1c993218902eb7895d3020000006b483045022032b236023b52a0fc261dc0767948df8353c12c2fa75fca5e43082436514d6e86022100a6caf7fe36e17c704adc839450c2f67a54272af36fdfd6232def1e751301eaad012102a50a033b80aa01b6c16ac800cf1b4e03dd3a46e3a959a012e448a39208060a8dffffffff02a0860100000000001976a914e114fb9450ebe9038a9cec050153658ee3e29cab88acc6620100000000001976a91434eae7ac67373d3905b8f1abd159296ef26e226a88ac0000000001000000021a3137d7d9054588e2d67d3edc4d600c5bc37c877a71467f4cd03a17dcc7188a010000006b48304502207bf7d38f7f53e9a256634fa9d938c0e0853b71d2431bd34c1c7eb45e6b31465d02210091855589296a8f2813bdaf58aa8a100c6d59a8b152fc59279b884f8e515aa3aa01210326068aa063bb790ca797aedc32f43ece8c5588a73a1305ff20a482cbee4e3a14ffffffff0d83615355af80421ad4c8162625f5fd381369f8458f610b37d856f92972581e020000006b48304502203d73b2bf889473891d727992dbc525ffadf57440d6a287b4af73ae3b39662df1022100bc8a062f9f551f8b5ac0b5a8d5025e6b3b60fd61a0c779ac5ade876d4116cef60121038655e8043898e5bbae44f1278b17b341feba7218adc38fac030fba60cdb6358cffffffff02a0860100000000001976a91403d8ef00d00bbfa82ff626c8e6af138c705427a988aca6140100000000001976a914708ba668f692ac73f15c0c1734fba66182e47be588ac0000000001000000018a3f9428030026477dfdadb750972ed82529db564302a96bcdc512ec6d5262e8020000006b483045022100b2cbc57df97e6475c459aabe40ea1c463dbe91434369b7582c7b87a7ce4c832b02204bea2c5b4eb7ecb9d1466c5c2b8e1cc72bc74973570e0d6d67d8ad9a465fde01012102850a43a38842d86dc50d4f39c9e7a7dffcf6b718b2bb6f750a0e39fd5c19a048ffffffff0442180000000000001976a914fbb6b2921838002eb814cc6c2e18523d92f1721388acd4170000000000001976a9148e957d54c8bae87d142300e8986f012591a23f1e88ac263b0000000000001976a9148bd11463c7ba02f6db23168eeff16c0a5338500d88ac1ab67d02000000001976a91499a41aa79409d33659cd5358b911d986eda1af7588ac000000000100000002f6dfb10cf8c9b69b32fab43baac1d7e424fd084c104794d01e5e87dadaa7a1f4f60000008b483045022100b798c4a046465ea9ad4c360021f83f5d3fd5630aa3aa1335c034208be1a3114d02201c54e1e30eab1e040708dfc14f890911211f0a3623b7cd22484143eaa0119c8501410420e4e2aef02306e37260cdac1325978a229aa465652a5231c8e906e97c73b2d5303980a7181129044b12d37f288ce5d3d22df314383674b1b78d3e0b4632e9fdffffffffc95e6aa046359353b03bde2e09b17b2b1632c8d52f1d94180a11836ed5b6b0f7020000006a473044022020fcb3dbcfebb2f493c23ad51bd5d49a3bc4671b9999aae7533479994e1f966b0220197860e87aa60bb5f54bbfbc226edf7ffa29d58f10d846e50d16b9b2cba748ad01210386c14ccc47de096a807a20a0df9b0f8c995957351c571f7c36a9a7cdad0c5aaaffffffff0210270000000000001976a914d93e05069aa9afa0a814a9565a1f8696e2d04b7e88ac86c60000000000001976a9140aa91889346e17d2c0d45851f1e0490608fcfe7388ac000000000100000001e47f6bfc50d96edaeb5acd6db4eb08b543a702f909f2e276584b629bdcbd358200000000db00483045022100bc18b609c8979390ba1f111ce54e537c375eb5c22e469e95f8f171c0d4ea59bb022040952b09ababa2bb5816a9e92f7a40bdaa68ecca07c800a81d010efeaa94898101483045022100cafcafdc258dc9a19116cc0106248e23f7904ab1f4197c30cc85a194a61a586f02203727c8bd1f4f5da5e58074cd197b34c112eefba1b37162334d95ae75a510c48c0147522102c65bbf3337d3efdb65bd9a85d848fa1a1b236643a3d18cda669f7f116983d7f92102661b085665768560effe2b1db80ad5084921c0ea2302b509676fb4e9a158afce52aeffffffff0180380100000000001976a914a6bc1a7327cc28126d5e466e10c840399ecb90f688ac000000000100000001a9a767bd57763eee57711b9c5e54bdd8c959ce62d2b6300ec8c2953173045fce000000006b483045022100a0a225429054416e5d19498588e3bafb34e221e3a1623e256e2fc273a7b735d60220759884ff416e165f7b675429054ce914d479b2abc1067c49f3772e88f2fd19a6012103e6a5de49eca7eeec9be818ada1c3c626e5545980bd50b9404ef330514eaaf9e2ffffffff056e055000000000001976a914b46d1b1e3af916966c0f45fe34ca590d6c14d3ed88ac705d1e00000000001976a914ffc9681e51871224ee19ea5874bd15d9095af34788ac56830300000000001976a914989ace22eb7388602a3604d92a367dd26991fb9088accbf22300000000001976a914ab5997673bb1be55088b1b987eb29a0625e3641c88ac71960200000000001976a91474fd1e583cdaa9dec2a60d8ced1d814af57d245088ac000000000100000002a5dd0be69757f1d9abea82a18e0eb45d8dcb441aba0138a17fa9cccf9a9e180fa30100006a47304402204b03c45e342f1bd7e61a0bcccf5ca2b6393e2a2c6b3c112853173c08265c86dc02206de8e374501cab42de1d44f97d8d10a1084c28b4d044d0e8ebfedad1a3958b4f01210320978cbfcccf1d33171b4d19a8c202a045291991e2222c4b52bcfcfddfba26f7ffffffffe34e5377be6c836291255ed6748a32310ee9618339d94a4d351fbe3d46a9b8a7240000006a47304402207869711ec81d0eefe323712a1476b1b4693c7d9a8b461e13a3aaf79103d9c863022070ec86da57388c58db58fac1232631a430c89874c2e6ac6002066dfe28d0497d01210320978cbfcccf1d33171b4d19a8c202a045291991e2222c4b52bcfcfddfba26f7ffffffff01ea460000000000001976a9145aac80abff85a2302e23b5e628462632610cc3d988ac000000000100000002bd08f232639c69327bd52e57157cf4d20dc79259f88a19436a849b930e673a34000000006a47304402206e66a604091a8f95fab67b90280b853f1713a1636cfe9c112c3b040749a75c1e02203a6d2f92f6b53143f2af3993dc27a0ddb1e2b19d97ea20a93f3f991bd616dcc70121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffe5588461e1ba296ea74342d47439d85c59a4fa0592154b73d97fa5552d5cd337000000006b483045022100c0d835302ddffcaff990cd898a95236099a70297f7f462dab053f9a84169664c02205d88a50f8736af0262704db67c066352c26352663d79178530ff1a1144195c40012102e356f1652142ae4df9cc29b7d4016db02af34b93e455c334e103a904c63a8467ffffffff01f0292502000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000020afdc709516ff038a4447555b8af227c77fe44628470ace25cd16bdea0d60f50010000006a47304402202c1ecf1d4d11d8ea117e8f47801488dc5de01c05293b279f3ce3194ba9ce81ae022027de83f9d3b9c02525158bc4f1e65b013d0fa5c5f116392d4fa2b4f9870df8e3012102235535cb00b18c233f241d5a0a6cb4deeb087f02576e221c53a217d8010ea97fffffffff987ea93417c0ebf535d5e480ccd3cb3c0a6eca0d017d459b25ed07fee646e960010000006b4830450221009756cb3972dd8d6d33533cf827d502d673ba8f99cde70cfaf3610cfcbdf0005102203aef8baf2ff0a09e01c63ec489f2a9e539d80ad3b47c430c5c1263277383b03b012102235535cb00b18c233f241d5a0a6cb4deeb087f02576e221c53a217d8010ea97fffffffff01d0be8b03000000001976a9140ea72fefe95f5474aa6d43205933795a2f79af7f88ac00000000010000000289922ae032065dc92995e660d1f5dc1af6b8642ed6551f904593a019eb3d11e8010000006b483045022100f60330abcaf984d54a7d0c5940ee473c829d594eb04889fd52729a36060b57ad02202eea09a906b324e87ea8d4d50b157c5a44dbf5775f27b0014124e5fc0f4610fe0121031b96c5a33ae4c2290567acfbb469c2e38aa3a507e022b0ce131d741d09df22a5ffffffff57bbbe36e1d7f2a732fab127f301fe88e612bd2f43d97a331da8934044225400de0000006b483045022100f49947fdb502027befea1fb7991cd78962d11ff98d1449f75d3f0c50d90c4aa0022002008170bf0c4d7930f7427d72ef9ed4040dd93c6c216adf240f19bafca3d15e0121031b96c5a33ae4c2290567acfbb469c2e38aa3a507e022b0ce131d741d09df22a5ffffffff01c4d80000000000001976a914bbeed08fe2fe55824799e41e6e5a7ffa0d98426d88ac00000000010000000222505cadf7b0a12bcd84e95bdf3777d810a9b89fe38e46e347d664a515694e2e010000006b4830450220719fece6d4d3d4646ca03d3f63430892701c3d11e88d0ab0a27379ad4fae36de022100fa91f3237b10f1ab3eade0447cdbafeb4832b15db21499506f9d9f58d7741513012103a77939530e843c87bcceb6b608a4c7c0a558e937a2314495f96cb8455defc54affffffffd05b32e2dc3637e96da536a3486c2ceb83c7d363abec21c667b3faf19eec1847020000006c493046022100911f64abd7fd115e62123641ac9f3a2b2b925d341b43d9c5ec3dbcf87cdf9d5b02210085bbf80c569f5b999987dd9b25db756725a6e0f5ba921320bb9e6755e2613da5012102abf9fde715d4a2c83287493bd8d808729e1f77287839cdb40a305041fb2b61cdffffffff02a0860100000000001976a914829e03ccb7954c79587ba0434ace2e61323e889188ac96ed0000000000001976a91405d6ebc3a496d89057d0be98c3d11d97a8dd415188ac0000000001000000013d951d254ba757ab945f21db507b26e7a43a877e296c71dcbfc90214da1856f901000000fc0047304402202b41b4478fe1f38657468fe969c0b2aebb12c8fcf41f69ea5e3393c66266f3f8022065c3c2cd9b9a375fb386d1271a010f4d5cce424ce1879fb6b5800fbf43a20a9f01473044022041ab844b1e92ab2a041e5500e7db748edbfdb2603d9675ec70bc03676416529502200be7d9bfca6e7dc8d8aeda6aaa1c811444f61d77b36ddd3891df0e5b018eb2dd014c695221028c1bfe6b1779f9e043658dc3ef94b47ce10c9c43ae8ffc6dd292995b9f21e7f621035119cc8b661d8f13f24781790a6eec7aa7896067f94586b4fd5b072f1e702f7a2103b7f64fe1a246f77042a171a853981b17c1c22c6f25964cd6b9e8c8dcb4c40f9853aeffffffff0280b2e60e000000001976a914f12f309f1d1ab37279230b1db249f2a073666fe888acb0ef61030000000017a914f6283121c52db1bb66f6381be58d28e6100ef286870000000001000000024631f3efb79df631a513996adfffd0c34fb7666fa83f30b76b1740869bd48d79000000006b483045022100a66c749a6bea70574ab3db5b28d97842e0b91227b5be3986a682b1c83b46c0600220449a917b95568f6c831e307250f3833b74bf4d2ca3f32343448ed248b50912340121031b74bd84c16c86ced1b103f4ae1e1023b3709499c6bbbfb7acff3836a5665632fffffffffde7b880ed7d3f7fa952f2b5d48824892ee693374144b59fd0e02e700b9c6f13010000006a4730440220432507729a0b5e2af354fe240bca298b17cedb21cadb4044e6e5f0b59717a7fd02207954ad4d568b3f80599cb573518378c5f53ed33fac1bd90fb43b2e9ea16a61c90121025475829222b5cd426277b01198aee63f19ae0439e2bb303f752354d5d5652729ffffffff0210d830740100000017a91458d3420652b3720ae27303dce44706ebe3dd25b88798921716000000001976a914cce77bd089a3289860e9817c187a7ac9cd80005f88ac000000000100000002489a809f96724f9286b07f6b0b4ea9232eca8fa58b2283cd44f2807d623249ac010000006b4830450220743420fd9fb0e5ff0265a6dfe9e274bb690437cb4be2484c718465ed21bda34b022100afc04b82d5addd799a0cab232ab68955b04e5979678cac924ef7f65c792a4ce2012102666b6dacac68a56b273ec31c7c3fa857aea722fad37cb2ce0e5637ca141b3f7affffffffff1588af29301db29574d1d5f2bdb971c790b90ac435afc1f33f72d40e700984020000006c493046022100f2f8fb7c6baabd98129022443748033a45f7322c48facfa1f70e49fe0352e03c022100b51b50d684faaf8b504ef0fac95a7d1a9bae97a60e3325642c274984c4ea8a9d012103f5d02db24dbc4a2ce2c255c0fa3bebd32dcc7fbb5336a85d0522a692b1532e22ffffffff02e6e9a900000000001976a9149528c07a318ad273d20ffcf705eed7303c83923888ac769f0000000000001976a9144e2013d48eadfdbeb2a791904b828591c04258a588ac00000000010000000208a56e9be90b64b77621aa1c4e2bb0f271f3946cad545bc8a36830ceb8b98af8000000006a4730440220032219f59b9a8c78617acb123f2e239ed0f9b3271f97f33b661084aef32a082002203e2e4556ae18b2b4755396e2576028c252385388d2e3a371c21a4aaca1827feb0121034f26f542b29fa004d08cb1ea2f8ea98a0b582109890275ecb40d22c5b8a2d199ffffffffaa24cf56435160fc4e390cd6919b4490a8dd703db2dae6cbd56a9ba223ac113e010000006a4730440220490fba9edfad3ac78209f5429fda119eab9db939ae64bc078c74c80a0247453b022027444516a1a116f5b2394e20ff262df0076ee4353547d5523cdf0a525f6a9c7b012103f4fc9295bd72824a72d0f8d51a44a0e3cc04292b835c6457e408fd8511ce0864ffffffff0234800700000000001976a914d390a4f6393b4b176b89c02ebfe2ccb4805ab19588ac53291000000000001976a9141ba4320e2b1baa190b5761ab47a0b3d2fd1e0e2988ac000000000100000002f4a75777085a23edd592a10daf63d58b754400462354b191b558bda6019bb48e290000006a473044022048c238e0e59b70b8f960f0fc7ad76206022686c38f18165704dd4af537aac497022034e942bb06f5fa6d908d11a91f916371cc7995404b7e9dede1f5c42603f97227012102951cf786f0db0eceb979fc5789c7c54495d375c6e0e1d9c0bf8e6ae6cc47d231ffffffffee023bdae2d56662505af8b07d5ceae93dc83a34e0ec4589119da10930784e1b010000006a47304402202fca6154229fff0903f2aa2b48f2f798e4cf3c06cbfef76bf2cc7ebae571c488022055a457d245453a084c604ccf984e81d6ff6087692339bd6aece05a38f89d3bee012103edf00c2a29c28eb371ac6f8167534123fc6a86c3f4102ca71983b4584a1f65c3ffffffff02404b4c00000000001976a914a7158ae172d699b5371a94fb8e0abce2edb526e888ac8eeb0a00000000001976a914bc42e27fc16681080bf5af3740d28b7c654f8c8388ac00000000010000000290fbbbf11d7b4060e284f372c0466e5e864f88d94f0bcb32d472e876e65b89b0000000006a47304402206cd4db6a62644271f8640d3552f38c12719871973f699567ac61d08641d75ab1022024a305f5234436fe3adc13fedbe1520d9bbd1898f9189ea75c9e2a508f6dbf10012103639b8126560f13b8da35398ccbd55acdc24d1fb87117f93d42d7b85bfb2d563cffffffff2ec3bcb3ad3959732467d09484d539879c022c819579b82b352ed745eb1cc288010000006a473044022021549792134a8fff5a8c09ccade3438ac886448228842c926c477e55e243af25022050c4a696322ddf585b31035f57b6dbce4d1de7f71874df90445d07eb9963da340121031d6af92bbfc36faa0c952b1005096195b1d3a0c7b6397cd5c8c037c5d3d0cc40ffffffff020741ff03000000001976a914d0b58c0e87e788d353a552cd187094df10c3e63d88ac142a9c01000000001976a9140385408b7cb3adac53978a672acfa2072c0f8a9388ac00000000010000000200d408d2b11c3e1caf274292d694cd5b662bfdb13a7e6a0ac9e945ad935738a8030000006a47304402202a544dceb60a23a85d628227ebf5be3b19441c3c191c4595872774c911b9ac4202203de707d553536f9b1b7c319e797a4e7bce8ad11c8c9d6ada96d781929f9992660121025f7c9ec13572b539352461678c4991763bd5b4754ff8449fd5ce6e5f1dc2fb88ffffffffbf0e16744a314d1916be7a6befcf7024c020f7a8850e83478b611f4f6ff2c692010000006a4730440220104f2814bd61208be32edeedada23ca94740ac394b325892afd86407c4f978c702203b25efb7e95861e1edde129fa4406f72800c46027e690819255cb96dc9da2007012103088398729490255637f591f97b6b91f7b547bd45e63fda780f892a21b4cb3417ffffffff02a0816a00000000001976a91485de29739a33321d8ff0f6eec6c9b30757265a8888aca0430305000000001976a914a5dfca68bbd4fd74ed9924a7453b1d6ff911882c88ac0000000001000000027ebb43e0aa15227e479b0a5d54eea697abd121083c636f4cc962d61eb92c61b3010000006a47304402203ac8fc5b0d72d33e3d1e1714a7cba03ade031d3a098a6cabbf7ac6a8cac370a40220578f556b148ca3f057791f75616c64cee20bf54aeb1ccfdcff3908ccd85839e30121027d48000a57d26f4e621da01dbbe7ce5a6629d1cf0f96970529110ef910b1dac6ffffffff3989d117ebc2a322e7ab68973a879b4ea2510a59be6d10a85985b0832b2358bb000000006a47304402206308feca2d139b85cab359b7e2d5a4700de320dbcccb2d1b913a2b24113a26a002203a47c037a1339595efb03d401d538158107fd824c344a10477efcb0ac41e9ff5012103caf3f19af08da1a9d94c7b307b06c63c6aa275534800fa38c86d6136d1e242e3ffffffff02404a1600000000001976a9149a9eb69cb72d1c95f9cbbfd838d2b3f76e9a3ab288ac30269f00000000001976a91438860090779c6df12ea41cbe472359b62957527188ac0000000001000000026d31d5e7cbe5acda85cd701654d1d2a3aa30a2713dca6557d83c7950ae98c481010000006a47304402202f93e93bf3120c824131d35742c87b4677faae6450ee70da56871342c4ac763002200888fa3f30a9c59a92945acc6fdc511321c8c555f344f9bb58c389014539a491012103e4df69393ca79a2ceba9500445b4d9860db79da899dd3ae703700048a1a13ea8fffffffff0d4d4a17d352c6a493cdef378fb75f614bf5a51282a9964c4ffd0f7815affbd010000006a4730440220527aa56d31729b4aa1c466fcec333e59c71f3e401d33569120c18d9cf27bb644022070d9a0fba7f8159c9755e8fd87111c564d0aec92be08d578c82952ad94f9d5bc012103e4df69393ca79a2ceba9500445b4d9860db79da899dd3ae703700048a1a13ea8ffffffff025cc92000000000001976a9140f8aa8dce27556bfbd1a1e5572cf7bb0657a6f0688ac2a160c00000000001976a914bbd06bfd2978564e890411801b39b5de7186c7d988ac000000000100000002b24759369fb552e01e5076903ec8026b269fa57673157118d19ecf568ca774c1000000006a47304402203351ea83d1b236148987cb2292d6a3c416d58efcde81cf4835a26a1d8d28b6cc02201c4f1542fdca71e9d2cdbeca7ca86bd1721f27d4233a854dc733a7824473eb850121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff2d2bdb7eb198934401e6f318725fa29cb74fcdb9b0e5e0a7c495f177d3f026cc000000006a47304402206daac33e5a846b9a8498d1941722f49fc018c8c50dd595ffdab85f3cfbf41f2302204fce78c73f1236c11ef75925e2144786b195784b99832d2111c24bf8b7370569012102aff6c2e9136f2fc2791136f91585cb43fb2f96aa455860386fab889c0bb78972ffffffff02c0ca1000000000001976a9142f2060ea8db4d560130f62bf83402e27a3f7c9b688ac90940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac00000000010000000296698c9f06b619f94088b486d8f35942e029eceee6107d0f513dd7b3bd57d1bb000000006a47304402202b85df2d5b0ef50ab9129bde72be90cb315a4e8b0d1b5e6eb6f798a2cb7ed001022008966ab8afdee05611dd7be0bc402f7fbe14651fcad5f3b4cca7adebcd422aee0121039fa9957e14aedd82d02d21adf17ef522fc748dd11a45c4558e7df491b31a6bcdffffffffe08b59012caaba42a7087f6866bab135121185c97222c610b355a0c23bc06b6d000000006a4730440220048b2d68e78c543b3683cec1c87a20ee9073ff6a50c3d857111635b0744a8bf102205d41105f11c75fb892a251db34c04c1e4ba8f862ed579c7cbfc521f08cd2a9370121035950ed2e52d1085c1f6b9cf1cfd13371d74e901b5bb7b8560c18e511cac5bc09ffffffff0238981000000000001976a914d0544a6427f839bb4b42fd180afd28ea567ffb2f88ac0d180000000000001976a91420b171f0d7f967e9a72a6c32ebb51df2fc45f00788ac000000000100000002d13320947a66e316d81f15639bab21cc9d797972466796cd331230f5999e713b010000006a4730440220446645355022bc878e165b821ae0f01199351543bc496a5e6d2d27cbbcec3aac0220283e0bd177ac458b68a127191d2cb1af911edef5ceb5aa155af83055fceec5e4012102b9fca07337c837fdf3e900271977c381f185ae9aae62629795a3a7291280d42affffffff3e3e80e5da402e01c5d465befffa928cc58a1a70b712aa8ccf2dc9405b401d58010000006a47304402202a99bf5ecf91d31cef6f7dbea58043d5716b72a0c535a3a405b5f9ceeadecbf202203cc37fec809eedef5e97ebec5397dd55cb76c72142e99f2b9b8754abfb71c421012102b9fca07337c837fdf3e900271977c381f185ae9aae62629795a3a7291280d42affffffff0220a10700000000001976a914b4902236a624916556f8b8aceaa1caaddc998f4088acd0fb0100000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac0000000001000000021ab6e95e6a1658e51626cf2d4cbcb16f7df5a1dba50c5ac5c0b4065c9abee5b7010000006b48304502210085109ff73bae0ce8f3a2be6bc8992c9b6d559cbbc874a83a816a3a9ec562510502202a1899ade00dd6d7ab8b398e2de06966c4a323c6982705be05aa4c535ba6765b0121029022c68dde6664ac8f62a20dbe069d8aae3df03747f7d741ea707b48aec52ffcffffffff364091daa03ce94a4826d05aaad417daa23e4459c7b2f96d051b5d309fbc702c020000006a473044022011010d1d6f13f555e48bbccc20000c99cb2a524cf74d132c45deee0630509edc02201b2e88a2e97220548828fd20ae8560bbb20fdebf88041126df87f7bd9baa9c2d012103d12b1ac47406c8fed02142bbc917749cc9a07d6696f557dd84c1bc86e0922a11ffffffff02a0860100000000001976a914ffea4609d672600057d53c594e205f42c7bad3cb88ac769f0000000000001976a91456d3c8d2d631fca0ddc9a7632b8cb856d967459188ac000000000100000001eb28ae30c5d3f8e0820b7af855b0788a4c5e0d67578073e2293441b687fdb42601000000fdfe000047304402203732a3b0cf66f11ea45e6c9c782be3ed256e4ab5e9c412f6c6648824977e652a022061566450bf04075a33effb56b8090e7ca384e1680a67623a5dc3132a362241af01493046022100c5b057da5191b5e58209c7a03449dd2f10c38b4b13810bebc73055f79e0e19b0022100dc35efeeb294c0fe4778d6c4061b2609a6486372ec2a259238e184d2a25eb4fd014c69522102a6d927876e8e045054ff9d69014de5c350463ab5335299244a74814ec19f85cc21037d8ae2373cea0a4093c00b16d6788dea4616140bf6198402c1a1c21ea77537c52103348ef123f0ddc55db1416780fdf7653db685b24dad28cd9baaa5ad5ed70e2cd053aeffffffff029eb50100000000001976a9145241b4b88c21c3d1e0b2d11462ab5f6a2fce697688ac82078f260100000017a91453943fab41e0c272fc20dd5fc9ae05f08dd5e48787000000000100000002637cbe1e202b0635e450116264be9139b3f7077e2cbcd398413cb3ae746e9416010000006b4830450221009d02a4c8cc99e765a67a7ac9f075f00d1e7240c244138544c773195be12ae348022069a230786289fc89ba17c31cef8730b8f7263d005346e08ffc0907b85671d008012102a60b79d1af03076b056d8ff81f597b811890b24729eef9825615c9d087590a27ffffffff895acc69dc1c74e5d780397ecd233e7b7216955c2511214afbb40048158cf2f2000000006a473044022024a11bb637b4353b14a691767154e311a51dfa9e91b96f1626e198a03119e6c202207986bdb2624dc16eddfe8694e71f640e741c58e3f63f3c052c04b476f9f11a6d0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff0290f73b00000000001976a9149c1a709ce2cb75befae335201e42fab6345c12da88ac607d8605000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000002604f5211c6d9b73f9836e6f36b97f40d4e35c05866e4ff4eba0e43373b72dad9000000006b483045022100ee0a4adc8489e387fac04ed6d0b2c9dd4933f0714ec96913947c68563d34fd6c02203e8c37d835dacfbde9ec5b2be65d5fb2d981b1f8d65d49441bfb8c908aac56b40121025dcd75054f6fd7924430a1ac2aabf221680d84d2c9ed106bd256755b763742c2ffffffff43c255b5b256ca32b881cca5995568d9ee5f49b982533c01fa838b34c3f57970010000006a4730440220232746e1a57cdb50a3ad047464b1a8aa0dca3a1da74762fdc0e6cd1986fbd242022000896d77dac2c645832b84b219cb99f4b3812536fed6091b5b0e4db5e89688060121025dcd75054f6fd7924430a1ac2aabf221680d84d2c9ed106bd256755b763742c2ffffffff0270de4700000000001976a914d5a1708c5ac5aeecddbdf733629ae8051c1dd22588ac605e2904000000001976a9147aefb9b659e52564d4a1952b8c19cade45c11ef988ac00000000010000000207ad7f5112dab5756d77a10500dbac92c24cb1e3dbbc7a4b21997833d18d6c0c000000006a47304402201dacc46ce8be71ea9f05d2ae0750ac002cde84fd268bf1f44e545f84e7cde4a8022057ff9c6fcceadae2c06e1937791945946ca48401120bb0b85833b301f27b6fa401210268520284167fd9cbec6418bfeaa69a6b95263ab6caf50de90bf66233531d065fffffffff1479b5550e244ed919e744422523d5a9c0c22617eccbf098431e7083f4ee67df010000006b483045022100bfa5e22048082957c0047f8b5cb54cc2c7b4a7628b3b787c3b26fc518fc77d0e02205ab51b87dc05d94570bd25bf80642ecd38b79b9444e7d5c8f1a2284b90f818ff0121024e7bed30964a816cc009240f419b452f2fa607f7817b0348ebf7839985d08adcffffffff02903c6f00000000001976a9146cfe792c3a0a0c98efd61f7b434e376faccc364f88acc034e516000000001976a914865cc3bd72f03ffe627e9afe34975f930cedc64188ac000000000100000002d733ef83497065f78e9e4be34e35712af59b3abfc0ab4b02a930290e246d99cb000000006a4730440220573df34812e951f576d181404668f9e51484f8429911ce2e4dbb9b3e01deafc6022024ee33c19718047fad973a5fc7fea69f31df876a0968c7d7aad5f86abf45243b012103ae10b9d6b42375e41d2a46a96024a8fbb06426ba9eac74ad96a52d44b23fe030ffffffff118054709c07a6f1470f0a0dff5e9a3e5cd08bc52e3587c23d9b14d082e5f3c4010000006a47304402204c835b72f876a9f6da1e43edb9374eb8a3d35c61be57c8affa7d4be0bbeb683e02203580f6995722102615a6382bd54ae037b6687eb9414201c7475c7144b781e3510121021db1104763e993b67d631fd8a32972986c469de4bc93e79abbbd5f8385fb42fbffffffff02a0816a00000000001976a91488b3202b82ea6bb8a6ce4ab731044baa6106283a88acb00de516000000001976a9149040b2841c344df3ff623d0eaaf4e52e2ade4f1488ac0000000001000000020aa4255cc5eab10cf63f33448fc15df8d9255cbaacd3e6743ed9b2864eeefef4000000006a4730440220168f76f37c6064bea3632d2d8d9efaee37e8fa596625bddd5d21b45021d4ce5202202ac5b211ad435f7e57f3ed47f4cef0d469a6316608e6174c80bd4514915e667a012103b9d88c1ecb240d015a2ccfcda0d2014961bcdfe03c4baed97f8dd0cfb48d2c6dffffffff22b6ad6133eaef65e9a7ba1491103bd92d45536dfc6cbed40789ea081b05a813010000006a47304402204681205dbb4bbcec817e6de0592d924736c08a31f9fe129ef3c241cf8443a7a802200cc2bc386d5dd0456a21aa8ac5afbb232859f5f6f1ada92f8521b20e1fd4eb5d0121020b1e3c88e6f3d59bd1261b90a7ea4cc6f2a4d1745578ae5f4e89f438fa117365ffffffff02a0816a00000000001976a91417165c22935f0bada6eea263fc2947b65f455a1088aca0e6e416000000001976a914061ec210d7eba807380593791f612537cb04408c88ac0000000001000000020fdcef2f39ed39d6e504b3e76ab3ddf1cae5ef357fc953b34e447fae76ab3cde010000006b48304502210080b4c0833662ff57e079876972c44bf51fb48837b39f09ed558ddd6e1a239f910220792801ff71a42eb8f52e248ad4c5d122930fe2ab80b09ce420eaf09cfaba768e012103e9ed96cb0e760f741bb000694e0290ebecd0bc840c7f335d781661c7dcd2a531ffffffff0b8703942b0d3f00d5181916f975d7d6b5a7332b921178422aa8b80032926651000000006a4730440220350cffdbebf231ba8d782f588929fcea2cd29c5828a86120d8c285925114f87002207847c151ef0eb77de8de6f2883c15299723f02316eb1bc65a85968cd5d8117ab012103e9ed96cb0e760f741bb000694e0290ebecd0bc840c7f335d781661c7dcd2a531ffffffff02d9100e00000000001976a91447c91ffb08cd7b928d747bc562360d3896bd769e88ac89d61500000000001976a9142f27cce7583b5c71d868acb03ac73a4ed8d0499088ac00000000010000000275c5b1d893cb0966184544f8f78f4d049800ef3d51ba6fba4c9b5531b17d0d09010000006a4730440220194a8228db0005cbd9946a483be56773919ca3e68723e0f152c5872861fd0da502201a800ec1e3cb712fbf92c3954047070076a6326def11a012ce6cb3b4cd4fee3201210217b98fc6ca373b5044a68c67b14f403eae104d374615ae7164aca72b8f3d31ceffffffffc1adcfe198c4f7a3d5e2d27861c75cb03ea586f3e1014a2f091a3f80acad1528000000006b483045022100b029f35c727e428829dfbe03fb4048ca42ed32b20a10971a51459169e5f7f2af022038b04d249cbde59f980291e8ba525147cc6f388c77f6ff48209c8380be65d9aa01210217b98fc6ca373b5044a68c67b14f403eae104d374615ae7164aca72b8f3d31ceffffffff0240951600000000001976a914d603e99c11a792ccd42d1390a790860f244b8d4788acc4090000000000001976a9147f99d0aca72e6e6273bb0fb5c73a4fcce97e09b788ac0000000001000000025e6c78b8f667c245c64fb1d0474478e0ccc9248e058a49a065f07aeb1845f6cb000000006a47304402203b349a7cf8eacfd777028e24dcdf7f0532a3590450d6a7c6cc198fdd1f7479b502205a5dfc5a7b28b71f6bc3abd918f77b9b51dc06274b551c61ffcee5d97956d6d6012102f2d6427219459a7f3d80f0701327ed1d46cbac18b492c71191d2dc5a0c4852e3ffffffff968effa108251b148ecebe8cc04ee2ab4ca1bbd14eafb5167db64966aa79a7f8000000006b483045022100e08bcebc8593e2e18ee8c90a72d76ac87faefa240f76c012466186d4c0229115022042fadd9c42d9b47f6a570c91aec8f442edc1d71bca13fcb3f6d791f08909f2920121029b3b1928d93d6647910cede207862966d9cbf3e9202dd3be7f33193b96a62848ffffffff02fe523500000000001976a9148526c6ae31dad6a30a2baf08a719108edebda61288ac58b9b100000000001976a91481acdcaf941addbc6598e550510bac80f1595fa888ac00000000010000000200d408d2b11c3e1caf274292d694cd5b662bfdb13a7e6a0ac9e945ad935738a8020000006b483045022100a3a364dede88d9417eb8be28826837bba4f735c78cccf6c7bc07ca9f47ae48e40220011c08383ed535177c748b72220bb4bb87566292114b996740865c18b6a2a42d012102cd982182218cc8483e81a9b0b97c5b5536a14701933153c203f44385585e0864ffffffffef11c6489fde3c8f26e38f8f701a732b188e63f3c785bc4e94922228939784c8010000006a47304402201e743d809fdde4adfeea9bf58c60edc46477cfb897ffe4ce288a52af9ed8723d0220604b7ec70bb3638c7a5cee8e0364465e8ba82c0ec62b25b685942ecc29a8bb6f012103e61a738968e9bfdba1baa2f60df937f08bdd35648386176646a1b84e60cc27a8ffffffff02a437ff00000000001976a9141d056a8219412baef83f66761f7b5a731efb7db088ac3055f90a000000001976a914144087efc23b69e22f8567b68f97085407c5e65c88ac00000000010000000288f6595dd9f4c10e7081373170660a6b7eb92ffdbca19bd5b9044e6fdab903ac010000006a47304402202d4ef2154a92724b4d88d92ed00bfc80b8b3968a02823ae073205cb9656ec1b5022005682d3ba3617f0ffd618fbcaf88eb092341972c27f085d36fc95a984cb58e7d012103480afd63e1776625a34e6e3725374f2d02f907cefaeac49a99d1d52c0e88fadefffffffff5a3809c204b01f7e8d35c385c8e0fb6816eaac3a0c664b58678773c4bdf4ec0010000006b483045022100c6658f4be327f7063e36d27fb3abf1beda3ad29753cb1a1a985d24f0e7ecd4ab02203cb27100074d4204e215acaffe7fc57e200181e541ce4e65d3abfb269af980e1012103695cd4d4cda0ecffc1fb02d6ef30e938fc547fe6aaf03bb71498023deb189098ffffffff020fd73401000000001976a914815fc57b3d7c354ad62167184b4887e5b022ecff88ac207c0405000000001976a9144a85bbcc358084671e19235231f8613af17b5b5a88ac000000000100000002979a4650eee45fbf65378519f4818366e7bbf7b36708ec477005f0b1b1f4d84b000000006a47304402203721acc3a0f80429505a77f019b5de4cfa48c0ec759e12e84e1d82c8972572420220193f92fb6fb174274a626f9172a4afa09e8c747012d9c5c529936ec2c0f1c6ff012102ab2338236898ab69a5286e8fe5c3ca1a3cdc283fe7d584c38bdb4acd3ce6f807ffffffff5bab42c2d23a54011c2a5b176c928a9524f9d5cc2e928abd17f28b30a6ec41b4010000006b4830450221009998ebc0850bcb1a6f3bb1d1c0ef323bf65325725eb5c83986e0cba666e6c1560220055d005a99e2035682014153c2065ed2805419802589cb3b82256ef69aaa67230121033e3e6e1457fb491ef9caea05dc9a07186a18ff54cdba199cfa191263ab79fca7ffffffff02a0816a00000000001976a914386ef9c107bee1e89d0e65e64b43ce66d744a65988acd0b80305000000001976a914e7a044d4be95e77616cc886ff8421a1f1d72efd288ac0000000001000000027f508c366baf8d4f6659cef470a7d53d3935ebc37854e44f25ee13962943ae19010000006b48304502210086226e67d0fa4adbe7fff6d10abf8a2eca0441958987eb297a53bc95b9e2837202200ef802e4bfc760f9dac9a3fefb9f86ce91bec76e3c3c6dc768d3a97d02fb9e44012103e124716d7ae92d6fdce83c6a9e09fa856e4cf1031a7fbfc8dd8df944c04133d3ffffffff828079d5d035e89f34f21f34b24c91358bb0e5c9c6bf7992ee27e9c3e55ccf6e010000006a47304402204b3a1f66349edd45858b5b5492dfb994aee2c7f8da3b01247fea886af648e4a202204f8996089afbdc5a2627445ec9e523aba10d3bc8fdd1dbc55baf8ee3504b831e012102b36d4cc56a1b60ce6e83179a7d6ccf766a08905abae4b468552439d62c3b47efffffffff02a0816a00000000001976a914f010927111dc57c36e0bad15103ff902f201270888ac207c0405000000001976a91428b859d550b60f738f63cd7683e20e4fccbc238588ac0000000001000000024d8e075f01d385010fa29db044c4d076eb81cee9f3edfea95107f30733943b75000000006a47304402202dceccb2ca0b0c827beeb8ab9a8a6e11336bdc485f8285b0032267d176c5b06002206df2c6c513ff8bdc2f4c95560dbdc707af4bb3c0d4b12b968663b448a07428b201210272cf64a12745a5f667f0dc6b9683935d904b82a2b87ad30bba9d889af41e33b8ffffffff6c8d26dbc1df66c9e89bc2f1e693ef9357b1a2c1c8718ab3ed95b67e6fc8e487010000006b4830450221008c69fe277bde53d4c58454ce79988dda6ab84a5166e982293f82b01b82cb1aea0220613d28378cd0fca023273413bef399df6ba4494bf114e369f83d505932e58a20012102a355c0f9ca1c4bd85b311e7022ae3dec8778a996aa59cb84024c8676d1b27d9fffffffff024e420100000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88acb06a0305000000001976a914f837b82d64e980f2ee90aa4a396813f3f384701b88ac0000000001000000026e8856e41cb25a7f83d9f0e80e9647eafff5734271a6f33034ffe582e7e9d67b000000006a47304402202ce7ab548ed6fd311f97e077ca5040bafb76613dcae65a0e7b4eb20ae78fd39b022015f3e1f02e76e2705945f1eccc3bc786d8e7767dabbd7984003373acf1b409eb0121038f699ad28531a2f289a047109887e7ca54eaf2a1145807691d3865f19149afebffffffffff780999a6c037a53b11036014f11413e47a121311e6d1b708e41b25046d941d010000006a4730440220178edaffdece00939f2ef53770b22ada9a80b6a85c3db70a06fdd30375821ffa02202c588b53297652c2977947760a18fb093edfd30f839f67c0a40890da08bdfc7a012102bcbeb1bd8ecf16341c125dc8cef22ce279cb2f7aa3a6962d3317bcab0df415d3ffffffff02a0816a00000000001976a914f1b982d0edbf0fe2800984b4072dbfa7ba1e456688aca0430305000000001976a914cc2a6c4456efa8a406b31f8fb176767f5008010288ac0000000001000000021999caae7cff20a3999d239c2ac37b33c691fe388093b486cfe60cbcdf2c14bf010000006a47304402200228be2c367747e4d10542951ddff0107a63eb75a4bfdde11ff1cd4187f43a4002203702c888fcd43092133c4251bef8217070431a2000547d0b2c29697468bf6cfa012103a7b1cfc17047b784204cebdad75a74830afbb93d7c93fea710b570f7b7700d1affffffff504896177154a66d9b0f14953e9723eb5de6243af2b04c302b80f1c15fe71a64010000006b483045022100ece38b3847607489b46b130939ffff67316e1df0746ceb217be1d880fc96c43b022039bf5bb9c97e31c994e3415fcee405a1a7e2897c1c3dd10d00a42485b05e067f012102006401aee16b4deead58f198578bd4362400781aa1373410fc3ae2814e698a70ffffffff02e85b1b00000000001976a91439d5fb440dcadbd39a8067d9143b1869491f182988ac40e72e00000000001976a914477971fc8627c655129474bf6a92f0de6dedc0c388ac0000000001000000026b7b73021876fa16c092979df237c2ec45d2661e29d9e864a39df89127f99828000000006b483045022100f2d64cf66df56887c66d17ddcb8e7aacbc99254d51bb4450c5874d666bf628b4022009650c243a6d9ed5aba09ad4ca68b3a61e8b2d7cc3f12e7180c3d115c3d57ea30121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffff7dc4f21e738303c1c6bbf25e6fc07d554ade3c6fbcfee00111168553636a7459010000006a47304402206f486f7208afd1709a459eb5126491bf278d61a673bcfeda8eb8a87fa33075ab02206d91ad84b46e7ba8c256681d16fcaab20e9b229973dc0df6b0c5a7df7e9790800121031f775a457c3c420076a89a5bd58cf366d5f3078fc644356a46556ed707c5506effffffff0290940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ace0c81000000000001976a914070ce73eb5b4238e7b3b75209e8903e2939973de88ac00000000010000000215988968ca5719bf744b642e8c524e0a3a4f128d2bf714a3ce69625b3d297e91000000006b483045022100c7d36e911e058977d4be5cf015194552b4ba0ce9b863d1bea755e250f760f2d402207ad8b1764fec18f4a0607904d565d6eff4743486768acad8eff31803d48d22df01210257f88cb0517870c1e55fcc3fa3e838867b1993b05c709b77813e856e3bb2181dfffffffff7613a242d4438cde80f0572337f058d89f9183df8bdc836081fc0e860b58e35010000006a4730440220428d125e9aac377530f332076c3505d548d8bad5cbb2d3300860002914c36e0402200de8b7172bb8dcbd64d896b706acdb75590d807b8a426c907ad45d447294d09b0121036ebc66d5aff1bfe99d9d03f1ca6ebc3e11189ba59033864172f7164041be7146ffffffff02a0816a00000000001976a91499c25bd194f0af99428fe390efd75a70dc38d7a588ac901c0305000000001976a914cb1219ed2c9f0c9a11b6709464a7ff32cac341e888ac000000000100000002b8509867370121d55ffd736c50ceaa4c19d12e95c007eed3db780ed06e1f75f7000000006a47304402204c5b48803b31edeeb5a2e89ffae3d49181ff5bc73da8f1ae315f98d00b4e259c02205e883051380c2185a6aa6f924f78bf271cf601a48e835a64b6036fcb7ea4f7d00121025b85c48f26ac5a19106c39d42e5979ecc66b31f102c48164ef3b84f7c3705d0dffffffff5080e1c8984e0208ca230a2c988b55512a899716178e34476b2e46774a9168d2010000006b483045022100dbc83beb38dac4d38b17abdb0080e741c160f0c6fd160840e4a887ac48a8f4d3022032200ee96c3538ec7343c16b098dcf24b622b0ce9838abb713d1b7d3967a11cc0121025ca57721b3498c782a8e10fe710d1bae2363cd4f802517eaae7316287335ba75ffffffff02a0816a00000000001976a914b41a83642bc3e0867722845009e045c0dad348a388ac202ef90a000000001976a91408bdfa92a6b7bcac61aaa43dbc49b76ef2be6e9f88ac000000000100000002b2f9560c47088f7174e0b94109a8646eb081886c1891ee4a5da1651029db759e000000006a47304402207d90047769423320a9a9595fedbc393f228aeb6147bdc12e8d0039fc96975ce502202af9bd606390b348afb757353cf3d293990b40e65f06f505c88e8d2e7f412490012102808f90269d17ecf4b9f44ab9306b1e594313abc75acc140725a32efba68ff979ffffffff7b5051cf1a7d59cd01e62e87a58c36b61319d2561565a68c211e18da2ad5a28c010000006b483045022100ee9bbc8372ee3f9e8576c455e447cd9564d2812e72595fba27300e388597d16e022032a779876485b2bf7a7d6ba149f80a8969bc6e4889c2425fdb8bedde844f1f3901210377c79f19e84e55475478f64bfe44fe849a16f71068d48536623281193f6501a7ffffffff02a0816a00000000001976a9140911f01392b31961af6dac6512a4a05447c547a888ac10550405000000001976a914148e47bf8fc40f7edf7a0f0a44f7e1a0b12e4f1888ac0000000001000000024271213ff55fd77d67f7ee0c7f9f975faa1d16c0b58df83dcd57a9db119a799b000000006a47304402200d8282ce1530b784f1260e859571a76828a6af7372f0b30ba7acc317d3b6564302202db4f4cfa4c47d0a013b8806c6663ee0375763f77dfe6e5c4d513c1cfc98520a012103866c2e2eddd89b9aeceb4cfce10b88b7a84799e1d65201e93383b4f3efdec5dcffffffff1f00ca1a8c6f2dc6510d63caac6bfffa661b165c1930b90ea5f998a7e493fa0f010000006b4830450220621d408c90b76618125924633dcfc4dc1668b7212fb43c6f2576f48f2e4a829b022100aa1872ad30f3aec0a8f0351f23ec4b07f6be8d92e44433f2c8d9ff54e8f97ddc0121027a577398f02f9f81cd79da218558570345fdaca3e0074eb5e1b6b45cb5188ea6ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088aca6140100000000001976a914e2c0a3998b12953bdf922f542ff4f43c7c9e0fb588ac000000000100000002c786075c5f31d7dd157defab97c577e5fcac791f2df79559d5dd13c9e851d3fe000000006a47304402200e1a652c53f1d8ab61f49efdeee94e2822e86dec02185afa5118397c99e09c50022070f21249760941cdc8e31ed48e5cd9a42b256f501bc6c410f74f0273e09da4e801210395b1e41d8fa1b78df22731b1f0f3fc471039584c0319c10cd5465f1d680bd4adffffffffe7dec6f027c5e60367b60c3dfc33dbc99ab31c0f08ba81db440b8f33f7ff5909020000006b48304502202fe70686fcee4e678d044b50ead1a58bc337551f6759bdd8ddba7744c621dd4702210099905778f2170084f6009a7324d016ec018b33a0db0c642464f03a8526b816ae012103e717b57f5fcd4a29dac75ce9d145e18da81b9b35794a554e4c4dcd8003d2cdb4ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088ac96ed0000000000001976a914344b23758ec64f844f02d3297d0514367d5a153888ac0000000001000000021a20714c27a7080858c0c5b5278a319235c42f4a383e95e363c2d902c7c4fbed000000006a4730440220611e4183e76dac7c4739e0a7cc68de7cb10bb4a3fb78f660886d4c3ba8c9b33802205efa15378cb3b9acd7ce2bc9dc7c1e90b2add78a3dde5b328346de9406c1116e012102ef3227458812b2bd2dd7f246f692be260ebd9ff2e5ad9f53cb79275aa5909910ffffffff05cd21215c05383cc01a3815b0988accb0b8d2cbcdb28561195c52fb98044aed020000006b483045022100f967f1758f3e4818d440467aa69cc37689c0579f9dc91b7f8b5ca01623edc8ac02204e727e700afd846258ca527f8f58898933c7caa9a81cfe98c8282fb18f5b976301210237e44cddcebe1a2eec07da0c4347bff5b0e418d172c1bb32f2a7f9d097da0209ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088ac83c60000000000001976a9149f4fbf3e3470e2fec2aa0ce6a1dee99440e3c41888ac000000000100000002d5cfa6db371dd89d41a07121d3abee951ebf6ed82800176cbf8d38d30d54f9bf000000006a4730440220413588ad17f2a1845d8ab29969f58015900edfdc087b556391ba84884e770da6022069f0a17cabad9ced0e0475085f95c8be78ff802a811387beab40fa3f0f0dd9d80121036964a9afc936bbd8d8ec62aa2f73ac111081e16e4c3aedcc124f814dbe5ba416ffffffffa9b0d8bc1234251f9289098566ee8c4b1f4bc0db80e606328e255ecb4f7c27fc010000006b483045022100d3cc6e4a31517497eab1e7d95d7a66869756e64c42d8648ee8de8d70ebf7fd0902205234226cd13824e40e8f7b58e4d9f6bc58ba638a548a57a5344c0b4a48b06597012103991b102b99ddf9c35ae1c15e9ef6f5764a616b544aafa8bd3d2f11f7e48449a2ffffffff02e0930400000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac10550405000000001976a9148137e8e362940fd5f0710a68018f96928ba8f6de88ac000000000100000002f46b732f4e448e6a19542ed0989d0772af8d72e8152e890b41a26ae1b0768a9e000000006a47304402203a2ab1246963313096df21d67564b9314d966ebdca7cf378b9f1c267c2254b65022023405fcf93530461af685e254783af5a9c47865c583616122085eb1c283cb8b8012102fea54ebe4aa11752f8ce702935bbeb94fc996624f9943b3bc97c99b5499fe5c1ffffffff03f6dafec083f45ae24c61d6b2b3349011a2b3ba7cd497fd408fcb29f44eafe0010000006b483045022100ec97d31ab3e71a785e0a424d2c91f7dc3415a8dce7b4b90cb78dff41884ee0910220329521b70398d1237a680c842c4db020dc4881c6b38ef9841eab4765abdd5cb301210322a797a52a8434dac1e0b400d3f29f21eec6bcbfe412baee2b39e3376d6c60f5ffffffff0280f0fa02000000001976a9145e973386efc0d41c2c14bae325f9e9b886ef465288ac002e0405000000001976a91406bd0618011c3ef1ec53fe3705579a134d4f717288ac000000000100000002c11b26274cd760b83f078755e1244b018edb4cdf07a484aec1ab07b2969ce39d000000006a47304402206c2ca65f6119ede86e24248e5d8198c4a74438affbcf9b7ad70c89333687ddce02203099f65e40684dad3a19576678b699afd0f87160c3a13b78fcc45f96ede38fcf0121029954ff4f448fad13b12b0ad579777849bdde42c2c9d1aa499f49da758b6b42d3ffffffff931e2dcc39c17027bd1dd8df5696df286f0845a01a1a7a74a98a34d73597c080010000006b4830450221008fbb32d4b16d18484ad20dde26ac310b0fb17d346463d58dfc4427b627d8eb3a02202b6ee992dc071bf9f335e6bdf736eefa25157a6d36d1834b8f883ffba7f67947012103d63a701ad1713a661966b434b17beca4f3c36f71744ce7bc2c585d39f60f506fffffffff024d94f002000000001976a9141a7be74c540d63af1cfa80ce51cf6793f00f625988ac1007f90a000000001976a91495303a5fbe53d9cc04c652fa05e62ac63707281388ac0000000001000000023085d1889da0651ff783e9e3ab4f85b72428c44ce599412d37d607707860bf41000000006b483045022100825e098d80742ef274047684f8b19fa6a41ef01d2c60635747060a34f90b0c7d02203bce2f02ddf6cf395b4cfc91ef27cfb4e5ccf80c8ba997543e5eccd9a925dd3e012103bad7d82b3b363dfa1f67d87b985bc6075698fe153e418265535acf7a7af28d22ffffffffe2138af8e35b213719076b01080dae538edd67e0171647f45aac25f8ec8591db010000006b483045022100a057c10d003d3e967fbda3094d008675a56882659c16d429d7fff649b947345a02206655261a08ee60f73fdaff9230028bedfcb07c0617e067fc4bde0ffe6829d9430121029c35ae2c0bb79c9da6261fd7548dbcc3d6144c10bea220cd14615adc868a0a2affffffff02a0816a00000000001976a914002ceeb17ee0df36623388087e681927fe70d9d188acc0910305000000001976a914c7547fa4574ef283c6d6f76298ae7f3e57e286cc88ac0000000001000000021e8357e879c792b2aaa13a45ac57415108cd81324c8c80e7b6f534775973eee2000000006a473044022053a162a420d30dc306b83e86b269f54f78a0439813ead2905c8eeeaf9600b2d2022050277e466d0bcca7e48f455cc1f23fb2722d108e67c47d4fdd6a2c1ec6a5aa5801210349a65d62102fb61e3a09e4d276e7f92144248a98eada25dd7bf3fa16bd05460cffffffff3a46056158443ee52b73ae3d84fecc3c1c8e64f9dfee5afeb3d42f9455afed83010000006a4730440220102900046fc27d1f57039674e6ed19d40c0ef6cc084cf699419bac07437cb6f7022073bed864c3a1e60b8acc8c1b4839d3e1f6d55a27ea9d01083058f45574b16680012103743e51e12e68bb309137ecee2a08506b7e404b42081ff0a4ba13a34a3f5cb6a0ffffffff0253957100000000001976a9143587d3d05411cd98d1786ce378331f58f97a7f7d88acb06a0305000000001976a914a7ba90f8826c8d6435773e42e0803e5820d046ea88ac000000000100000002c482a3f7e2d7f11d1c4aeb42ee682b174e68c94be6c39a19c8ab559f6a4a91d7010000006b483045022100ba3b33077db92a48f2fbfa90fde65eef5ac53dcfd741f6c5b3a2e37159e02d72022004edb88cc6a29e3a085a208aa26cfe2658d87ad0daa6b41f4d7a96aa8d38eda40121035847609306643963d2e2d844f5cfc0f9b76cb69fb9ffe5b4339d73bed2cedff1ffffffff2629c89243ed386ff1cf72db5f0338c6bafc9cd1d70b7c9d53ed46b227dc7cfb010000006b48304502210082abda1148da80864d5094c7dbdc35310765fba74f02b27b1887888411a9be59022077409db3cecf065570534e85e2d38f8dc7b35db27220c9f752175efd722cbe1c012103dbf00eaba88e27f17d9189a8e14052f3429b9761fc5d957330d202d97025057fffffffff0241fc1500000000001976a914f0d429e6d8d8d36c0165673d33b67e4e2f913f4c88ac749b8100000000001976a914df3fbd4149c7b6afeb53a67c7a90f162c6ca7c1888ac000000000100000002e3c3506f3e67cc88f93b58ea46c2fbb0edd096a8de6db87e44eb028c23036104010000006b483045022100ea6c8d0c8e3621b6b30395f81932e5af1542a3226491452e6f5f622cdacc60a60220728dd86f9e8516a97dc07cce71aa2f7acbe8d1f8a4b81b370c624b81138fcf390121024215b3589e7480ccd8629d5c713f283625b47e5aea4c6c841deea8d6e6df40ccffffffffd91d4ee8d48e1c30c31d83b0ab3cfd0f6e00548a225331eeb9092a359c996c08010000006b48304502210091d0e2339949706ecd24fc4b808349840456231463b5d5b13ad23891aa96ab4a02200d744f8de39e6428f729f1836c7b829f24eefa1634b9207ab3bd3a785a9f1be5012103681fc5f02e66cab042fb435cdfec50161bd8515face56daaefd17f2da2c11e71ffffffff02ba5e1400000000001976a91409aa254bb4657e3b21ec7d69f9fa247fa4cda6d788ac08305900000000001976a91419fa36dc4b0acbe1748b49f107a59381d3a978ca88ac0000000001000000027914a7327070ab80e4110e07f60e5d5e66956e720af978c93d1af3f9f82e591f010000006b483045022100bfc1a7e7691dcd7cce99629a5fab4545b74905f448208cfa0e5759f427ee8bc702207ffb0c5db35677a09a0e1017963a9d7494deee271f956fdbfdfed4540dcce54b01210385196dd616ca2f58f560a8bb45af8ce1e1bbecc208210d276ba4d7a8b52d6e8cffffffff6d3ad0129eb6b24cbf5da6a99096bdd8ebbe74b6f76869d80e571543430d405e010000006b483045022100c837d1c1ca9ffb8dfd0dd3fb0702d32049c9823a9ab4b16bc6da30036959f6d40220378ba55837e0c5dc61f21c904228696cdf00f8833faed12bc0a6e9f03c5de4ec01210385196dd616ca2f58f560a8bb45af8ce1e1bbecc208210d276ba4d7a8b52d6e8cffffffff02400d0300000000001976a914a8da469a68ea3583d96096477f64c39708faf98188ac916d1300000000001976a914f0c52aadbfa7f5762fa25cc52cfb51e85e93aa3788ac000000000100000002d1bd66fed81d7ab4cd76f7e78018e0a49858740a7de0082e3360b3bf8056527e010000006b483045022100c04d07e3a1fefbaf109b3d2623339c2ecabde6339343e417f2f2bc861e5bea8c022071f3a9bdec10f0d4198f3d55fa6ded000894f0eff5a880abb63cb731b0059df5012102e486b0256ecea008d8a08f12ca3bc4ec4405bbf094928996c06b23f8f6f22f7bffffffffb887239742339607f1545452bdfd77831dac89f28301578f63047ddfc2613118010000006b483045022100b0119f80160be6146de4248b5b8e84fff06a3f2ee2f0ffa7a342224938235a3d02207be2b03bc292fafa44b7a23a6635be7a32a63ce7c010d93df8652dd2bf88241c0121023eed42e6dcdc67c3fd705f550e52b46b3c3a28996070b32810d89b5ccdd2c825ffffffff02a0816a00000000001976a914d34efeae030a6205ca0ac732265135cb2e81276088ac80f50205000000001976a91464e1ac56c528361df4311a3a8b5a85435af76d8588ac000000000100000002bc56cccc848fb8d36da5137c0651dc76344524238105168203c4c77c451e348a000000006b48304502206fb16f4d7120b21b91fd5e764eeadb111dc38ec7679445b101190f231ea585ec022100f8f7708734757d7061420fe44fe817b00444047cb374e8841b9cbc3679362e330121023ebbee01e320256f627472e0ced6eb286c81b91d8d04c85946d7d94ef129c944ffffffff46c00e2c125416f55a3f80970e4c25ed1cacc38c962e7d47f30313917d3cf54b010000006c493046022100d80a9f80adde5743df3c434bf942c9398239618789afb4a441b0bae966fdb1dc02210081715bdc4e9281e745655792cd2c0df92b7fa3634ed7abfca60000e8527e6a040121031afefdb3aea29c87aea6715db312ec24e121c25869db8a63e73fc101f9618ae8ffffffff02a0860100000000001976a9145d652c3bbca3eddb6c023553ce0fc26036bd536088aca6140100000000001976a914d430b47b98608a0fd19b464141b3af901d2b12a388ac000000000100000001f8b80894ba7af99d6b17f16e34db171dcf84581da6b063376f9f6f54f0cdab24000000008b483045022100b93832b4c2d5e7d1262b21f850e76cef0866da3198d640d00a98334f671627e5022027fd034f97df2a81a61d80a9cf0853d11266ba3a4696604b482cd825919d98bf0141049e49d2bfecd21605de70bc503564344ca1ee45afc8adfb28656cd4e3325ae5b960a8241946734287de5215c62db9c3a4bbcffca3c7dae450a292142c119839c4ffffffff06ac840100000000001976a91412f4419859dcddb5d4d62d5f923ad6bda4c9db9f88ac6b040100000000001976a91415f3df88eaeba96ef97dd032645eafce0fefddf688acf0490200000000001976a9149c6bf207cd1ee30d1563b3b92d7523047c9ea32b88acc4fed403000000001976a91462686d5293c035838bb66dc0e04d380986e50c4d88ac15160500000000001976a9146fbc4ddbc9ae0d03465d9080785a029c74f93a2788acc0e1e400000000001976a914634b70f3c673e77a0febdf225ed1b0dfdfdc922188ac00000000010000000289a0948a1159e49be2991810a3181c0e76f104e991a2ba8c169cdce977410819010000006b4830450220152d2229317d63df460dd75a3b57962ae4448c48c1f912ca6833cc23a4df888a022100c1e4d403c743855b52d66f934ac6e0c096fafddb118d02f4dee160b07e8c91010121036fa2b565e6e89ae7be49c13a262c78090ce175e34c83137e5406acccd3fa55ddffffffff2685e93c245e6f9d01395241a09649da17edd20fc6c57895cefa03366db954df020000006a473044022059eeff76a500422300d4f72d9344f620fb9146f0d7929e166e60fadab849195602201fd1fbae2bd93b431f7b5b98c279a399f31f9d878427c1b32073e6d1ca5204960121035f936caf2cbd4621258c91648eb6670456039dcae2a63af9b6b074c0b259d301ffffffff0330ea8901000000001976a9145eae8b4267bb430c9ba061ff057c64ec041a707488aceebb2600000000001976a91494a0509f4e6d51c188e272acdeb792a5005f007788ac8bed0000000000001976a914ce8b25fae65ab92e27f2c4241e1d347398fabdcc88ac0000000001000000022d23d6a723e3265bd9d29237a2b3dd5614b4a047c298559f5b86603896cae947000000006b483045022100d7fbf5a9b6aa624a016e1ec3a97ab0f049d59128375a7255a6f65cc135608ce60220599bea73688398b6d8c19bcd28b7caa355fdad1d63c0ddb84d53c10c948446fc012103be40978a2d67087a9661fbddb819710e9eb9ed9fdf8755dcadbf96ec9c378d78ffffffff83c4107f884b5c6caeb2aa68d6e3ff77a664229ada5522908d9e14039a8959fc010000006a473044021f4d0c8a634d4d2002c372d00eb8752016a353aeed989da810a0fa0b75d04b01022100cc26aeee7821e7c61d4be101dd42731154e14abded80d34ce760675e4ab2c286012103b8c7ba97104cb235a36a128f6af372ab10b7ebab8dd9ee2c6286ef18275a2ea8ffffffff0230ea8901000000001976a914b74f3f01b5de6ac1f936191cc8d671dc0a8676c888ac8c3b0100000000001976a9142744ef1ac889dd840155b6eec2e3bf7974b1053288ac000000000100000002182c844d3f7aefa3f82e1d45971d707355b2c4e5f4c08939cc049bd792996cc6000000006a47304402206535935bd34578bc65ece5c3a73d0e345eae633b194f5c60dc0b3226e7309cae022045877a292a3f8ceb3152004cc5fd38df8646d011d8d8546c9b6a62c68d386198012102ce098a635247d8defff83a9e9979d33e142be12f16b3f3a582f76b0a67b6fe15ffffffff552478ed8a603ed609950e8a9ac513f153fb98b941732807e5583fcf1defe686020000006b483045022100af56fc68bea0514216f32507de5374f2ab1af386799b642044036007f295d3e602204a5ce213ee36499b62682282c20907f2b11d8dd0a5dcb328952e9aa34061258b012103a594e622dccdac09d20809d8d948c4110edbdd93ea640c3ff49a0bf5ad77c094ffffffff0390d4a900000000001976a914a04d2bd01bbb08b85b832ab10b6221e1b62eeb8388ac56150000000000001976a91495fa0f5cf5e377281a8e3909f0065abb33db77f988acc6620100000000001976a9143c8e7d9e535dfb641ae29f8647936b42ad03f2c688ac00000000010000000541312cb01869e8eee96368c1125b7d91535e17bb06798ad98f34a3e386e0f220950000006b483045022100c4c1b7c729500d73ab248632ca9b4819251d14386dd55ef1f61751103e158d5102206b09d5782e820aac90ee919fba9c17c2e9092581eb264d74b71d9a86ab274c090121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff5d0232ab5d44235c6efb2d9ae6394f4a49ced3ab40cf097d4a372dacde0ac00c0d0000006a473044022079beea33f9b1fb4e64eca165942cc4c323ab0356813a70a61ff4228d7d3ec974022047cd16c6655fe09cf3bd2ef680aadef6a1ffa9a32e0a48fcbc4764382f8cf0a30121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff6883c7480f7b8f160c362af655d21aa5c3b05da17db3ee50e2c45ead64b487586a0100006b483045022100a9cb3791411f06ef1db4dfff71575c4c67bbd4c896de608be61d731cf7289dd6022048a074e209192190e8343aa712457ef2cd7095888ed7a566b8e8a6e1d66ea9b60121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff38aebb7fe315aafa5998c30ec4c87adc3cb7f5ed9914f28329a69f5868acf7fe140000006a4730440220209d45e2c5af58540ce3b3da6c78153009b305b045663a155fd57edc39d0553e022052f92b778f2f5b5effe156b6283ac2518fc1ec566a4035bc15a45f9294579a200121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff78778be44551b3a9c75a7f34e09c2835e20b18b7482d1746eb192a1fc957205ddb0000006a47304402207fc9bc2725f54dbd085d88e61d5922576a4ac6c2095ef53178d5a0b4e2ce715e02202e6ac78aea942ed9c21e14046f44397c38e8e0c103531cd080fd481b6146006d0121028f652e4a54313088e7e7f4fb73d7728bb82a108d2e446cbf65283023b2055773ffffffff0250c30000000000001976a914e3e823e34f1abd9338dcc023f79fc830355b500388ac50470000000000001976a914b9f7064fc7bd10524f315e71956e0f99e5fa090588ac000000000100000002ed1dfdfc257a05eee55d7833522ff33b6afb3335f84ecda989ccf4e9e8cf10b7000000006a4730440220023f200081863df828758661b23750057954f8314f82315bf47e974412c3aa170220171df25777edfb4901ac766b2e8d7b249fa5ba7fea7d77ee5e87391ff6a57b940121037e90215017d835bbf982db3ec66e374b15524b5bc6bab254f36be25a9326fd3dffffffff0391cdb7a8718230ecdd8ada5b1138b65c29e0d64d1284a4eb1fe1c2a22f6a0b010000006c493046022100a354dc0132a6fbead889d9215c4c562791f6a733ea30c843b2c044506ab20ad8022100b51d8a757747be847f63baa551f0b3aa040dfddebf933f949faedf3efa23e32f0121022783ed97ace50a02111e2d687867c806bc723c22e5eb03b9c161b4fab3f9a863ffffffff0300c2eb0b000000001976a9143e6b6a70acd10259138599f7472f8fc97977899888ac95d43706000000001976a9143e54344264265a455002cbe159b0787cea39ac2188acb63b0100000000001976a914c6485a95e9f650fafa3111e412aa7f9a6ff76cb588ac0000000001000000022e25734283e4d31883f6568d4759ad8b59584869bcb84c755738a81e323a6667000000006b483045022100b33fb32e83d7e617d54ea2651ffc8b9009369daed5f09e676fc94dd4f55f77a80220141ed28bc68bcf41458dd166658137b6c9fa8b0cd8d1972b9d4bae124fcf5ff70121039f2a6031c9424202f7cef8b7b12988dc2c56b38f6daac9fcf780c97b619ea3e3ffffffffb13723bbf42ae5561cf3f466bcb4c0df37dccc32e672c7f86a8840017d009a1e010000006b483045022013e112f87bf5fc5445fe79b7f3bfdaf38a383bedd98f9bd56b4df984b71310e8022100b5133b073a783a9276cb3a896e4538bb38b1a82dfc6e141f4227d76c5039f48e012103ef5b44ef71910d7d33fa65e10a064190d79131d3a7526fa2fb18d370266e6c44ffffffff03f8b35d05000000001976a914e2950025e72cd9ff7a739daf8c63fa3c077e4eed88ac082d9800000000001976a914c905ed076ab36f9222d98f1293a9b5710554f0d388ac8bed0000000000001976a9141772488b619b5d385f559c160085f666da76d64288ac000000000100000002c93112ecb46b1b6edd7e7c21c1068a613027914337e434d3db9999dabd4eac16000000006a47304402203c6fe4d398bef623766173066a0dad9e32c43074c70d23f95974619c42789e0d0220355b4d9f94501f08827c6d34ebe1d7afadd55f7c12dc9112ed8eab395495898d0121027626b22d756246bc29cdecd6ec403b7bc05da3e428240e73101c1b1fd7f21056ffffffffbc518d87579634c9f199a6f3c9b052292e81cb9e2202b77938a518851f482c81020000006a47304402206e6d278d280580ce09e2c23c935d78fead2196bb5e5c3c0f4b2b7c22d00057c0022040c304d64bef92012bbd26c1981c03f5107d58c24e4b10a3bdb36501133efc460121026b177e551d34e63cbc7475f445ceb2734d3f608c9587e95862080c1931a98613ffffffff02f8b35d05000000001976a9142889eb319b1fbe0ec4827e4011a9bfecc89775eb88ac432a0000000000001976a914d8db6fc311acfdf22cb92a92a4b968f93d44571d88ac000000000100000002b732ab5d0ea01c1b58ed88fdb61b256ceeba317c073a74adfb58c21b91c06c02010000006b48304502203fd1b5563646d4a89241754a2ab181f982cf66019fbb5477d726424ea80a390a022100d9340ddc563e5882ea42d8816022afeb62caa59f3850a996d698d21de20e50b90121031a8eeff4fe549081d5381028ea9f2531e968932c730df9398527d9b8d1ddc26bffffffff13e16b0440de0e61f5b152f309a6f55b8639abc052020ef4fd9d3397b659d1b5020000006c493046022100e438f42104ff6d659c74de1a53e06eb63d6dc45bc0dad5ebcd8004f414c90e7e022100cca046e3de284a12f94431fb05c74b221043696627e1aaf8a16e087f3d03b29a012103b901443996926e27e51250587739796217b17b48cda392719a058c51e6dfde74ffffffff03ce9e5d01000000001976a91467a8ad6e235f23dedcf6cbaa465e817199e8d1ef88ac1aad0d00000000001976a9141ee89acb1fcf1a9f3363eab6d9624182da5b275c88ac1b4d0200000000001976a91473fb74c6e86395a5a4ad8cd1d257e36b7764e69788ac00000000010000000279d499e9fd2a66b61011031bd603897c8fae13ed3bfc65e86b53ced1e5f80ceb000000006b4830450220412846d13ac134ec893861c3eb454addefc5ed5e966544e47fb527d01ab3d34a022100c09bf4a7bfccb52b5b8551a4971b9b0774fac34523e590a5a70667942c539ae30121025f525f29817a6dd70a81994a34994a4d520cbf4007da8b14bb9a92a6f406a67bffffffff9a52481194ef1c2543ceb1d67cf490a29950b6663b110a5fcc8b0cdc7cf3cfad010000006b4830450220715b7fede9cf2c4d01cf5f3eae17a749200774706340df0fe8ffd169cd5566cd022100a2a8dff19c862d49f9a2626b8722b5fc10bcda792f64bd6e92db579af0fbabe701210340a6adb52fb0954c2bdebc47e3abbc857a83c7764c2b3faa557d9fcaa8957f1cffffffff03cc665801000000001976a914ff4b571a127127f8f544b7fda7caeec36aa78a4e88ac02380500000000001976a91499a32ce2a252df40f33914f3f7864b0aaa0814c688aca6140100000000001976a914ee922dd6e8b1d2d8a574dfbb489ca5b5b9982f1888ac000000000100000002c388b60d014270443e0a494c1877fdb61a75cb1e7376e03de8dd5418314640c4010000006c493046022100e6cc7e6298315f5cc86038c6c898bee65dab860d040b4dc7b2b0949781084f8f022100dace8e79689b2dc6965792f6a46a8cc91a7835e7ed438675e20a33cbfa7598f70121037fdeca29d7c527a18592af21ab5359290d4a808cc7e1ee31d7ec44949a4a2077ffffffffa68f29883331b94eb04cc601f7790e1fb4672333496cf750cd120494708b4459020000006a47304402200e6846a95544618e4d586efc9759589a7191ecaaeb66fc02d3178337bea6df9e022022a054431e43409698f9e1bf262cef80f59ec4c164d0b93e448f9fe91b3b4b520121032eb22df3cb89640b05afc6c480c6fabde5075fa7769ebf703258082d604afb7affffffff03886b0200000000001976a914ff4b571a127127f8f544b7fda7caeec36aa78a4e88ac7acc0200000000001976a91499ac65489e64a3f34e1057310be80856ad7d8ae588ac769f0000000000001976a914faca4ebcceaac4cfd42241d1858a2d80dce2b03a88ac000000000100000002c54d185ad1537b5f762acb43d0603b884aae69b99b884fa60c3da61f4f119343010000006c493046022100ddef0735487298b2976ef6b46b12fd658f61e378a45b7a2514610f9a026b93e10221009315e2b254cba47b4848d61d9cf34a4f623811bac6f637e73a8e1bb60cc21315012102e16b6bb2b9eaabc707918a5196e6a4fee5cc8ff71886c68e45de67e5ba2d062effffffff3c84944cca1481c0a2f707df70e402a12700f15baa6eff71b8dd757270e429b7010000006b483045022100ba90e20a78f9262587930e586eec1cfec6944d6754d1442645081feca5ed67e802204b942722f773d7bc6bfb552b03a6a709b3e0a469a2b32e4afa0acf40c6f8c9460121035eed887a2bd672f9c366e6f8b0b2f6193dc071f1a54d19b558da1bde2917073fffffffff0320a10700000000001976a9149c6a61169c66570f84bf1158ab25d1c3973d831b88ac74a81000000000001976a91469fa4c102148983da4c6e2edb95df8b5183b37dd88acb63b0100000000001976a91442fdcc754031590d4ee0d0641c5533af44fb07d788ac000000000100000002a47a706bc98ca88ca0028299e0fce33b7c81ac35b6dc7245be65e11cd004ae87000000008a473044022016db594c313dbeb1a0325fa8fe5093b9e6d23e1da227d6925c1e4661ed531935022063d7d7d738409da527c58e1c42461938a90ca8ce85c9f53c56fb249e84b2af2d014104f3e5ff8ede92ddfb66a0551624533d483617c54620eb3c34099d6cf34ca900d6e53b591adf84d3cd03491ed6102e960decb897fefb10e4f2dda3bcdd5ea8a3aaffffffff8d1cef0b8201973a09a4ac2af7080d804c2fbf45dbe05d64e655b116c96c6f7b010000008b483045022100e2b518a467153d3da730c34fafaa14322860cfa01f96a6d69cad6d61307285d902202f6400f04589aac6d031f30fb1c52fb62fe0ca50f2f14658c00479e5ad6aeffe014104104abb084087992bdea1607869e025713d3a6d0e3fb3df18a644cb65962f42a770ba3fd78103e1ae95daef4a316fca53ddbf32cd3fe25dbeda1746ab5219d7a7ffffffff02c0d8a700000000001976a914a081c3442ee3ea6308bc63e09a2e0035cf674a5e88ac8d259400000000001976a91412c83b0b7e8c4c0e29083c75051f17cace3e4dcc88ac0000000001000000024df7caa06951c89acf1eec8ba4d341db54317f332fc69bed968031d46edf9a80010000008b483045022100bb88f9a03e3773a1d77426cf034232a04a2c9585307a8a9ac6b9607a9e5c39f402202129924ea267e7a1835f04917fe24aea3045f2366cd65202247e6ddd32ca3e7501410403a90d2402ae72ca6054e35867909be4d819585d1643440b19f0244f3168513cdf3965397de743c4e5d522ffbdd83715f3741a8261f26a83c9574aadc36ead5bffffffffe00a39ef50d6d125850161a6c9e4da6f9a9a8bad8499ffea3da8e4a6da2972c0000000008a47304402200a9cab29dd338232390f1ccbb8ef4596f125bfc04cc3f6655c50e92608963ac0022072f167e796c76ab83df88de4ba42df4931b2f50d5bdd52e4383dbfa14593650d01410403a90d2402ae72ca6054e35867909be4d819585d1643440b19f0244f3168513cdf3965397de743c4e5d522ffbdd83715f3741a8261f26a83c9574aadc36ead5bffffffff0200a24a04000000001976a91450ef40a87ad99ea74722d88994dcac51f2ec26ed88acc4c80800000000001976a91436e71badefc6a8be535d4edbc452e884a431c3c688ac0000000001000000026af5b7e13e61c964a1a591ce415ae8e1b5456d9b8b8d1aab7ca70de94ea0be14010000008a47304402201e3bb5670f7cb52e783fe9fb3776353596ce875fef0a7df386477aba37bad0b80220129ae0a003375eb2995e3c1a155af199186017b0b0e858c0c6558914096bd3f90141042e173326aa9b7c4213256b6872a00bfb73de07691b7df66b368e52ed770168da2d02f6aff2ee18d9ff981308e207d45b40aa361d61328e2a074a78eedc734043ffffffff0915901c15946ce6a7feb1aa2bf733e768ab478c203cd93b8b0d7788122326ee010000008b483045022100f1f0b11f96a0e11f43cdc756bec353f3287e56c76a8ccc4c105224e6fc41a34e02204e8d20e5381f1f330e67f6a4e6b1e4595239bae32cb63dfb097885c795fedb200141042e173326aa9b7c4213256b6872a00bfb73de07691b7df66b368e52ed770168da2d02f6aff2ee18d9ff981308e207d45b40aa361d61328e2a074a78eedc734043ffffffff0230300b00000000001976a9148fef7e2d9c96c18533a3d2a86dbde87fed28272388ac88210700000000001976a914dfe4eb687a1c6e608faf810c76e63766640eb51188ac0000000001000000022c67382f2c18b7e34d504ba1af4e297a700b1f133f56251d0ace9900bcceecff010000008b483045022100dfcb00149cc1a5129ec85843df14b88754a40f0074a46344bafd6722cd33b68a022040f0d75c62d9c54fd95febc368b93b904bd123b3820c842b0804b780ccf67e2101410456f93e174a31f1057aba0d55dcc048a27379d4fbd340bc11e1f068f06dca0b515ae1816eeb1b5356ec865d6ff128eb1fc894ad9ef3e19ac7f6dc8bb0ac850800ffffffffcee4fbe04086954b39c47b10e859c586f6d56136bbd97bfb3b45d531ee0f5ba4010000008b48304502200d63d542e7f5678428ad6470a5c5d2a383edca12cd24c26cc0dc9d122cd5f9b20221009908750817c40d0483fb80548f51420849b0312a950a8b69ebe2772bccccd19c01410439bc6f1ce847b4372a9a542db9f9b750d1d98dcfd34bbfa8cb55370142d2c6433cf1742a66a1e3eee630a3f38a01e2acaf35e672acacf5dac147860becfc50e3ffffffff0200e1f505000000001976a91403dc89d6b8ba0d84bd68454367d0e6a71236141688ac04dde61e000000001976a914d8e14814f57c99df2a4b628164e88f67dbee8b4888ac00000000010000000277199154804960888e8d0745d43d50a937c82a1ae5e52ef70ec675fbdabe4856010000008b483045022100d709923a67c0ef12c61b70f02d3742367359d6ed1fdaaf9d134c4d6383a0793f02205b18fa9906e34b8a8f6374782b81b8614ef4e39d131551dba13c591702968363014104d2ba077618648729173247b68aaa2b6c7522eff5c7d012c1281a3405555d1cb7e0d15295c4b1c690e685ebe7a8bc4a1a1f0abe435a3e15f6136d241ff901ecb1ffffffff0e98d330867b214019556062ace520160707b8835e5b45620d2f447f6ebd78e8000000008b4830450221009571e578dc1e28217731a943e6becc3ed1c907f0cd21b3966978605c06127783022000d8835f8e8f1ed6750acf4d3fe5aee5e97ab915af9649ebf7bdb4cea0892679014104d2ba077618648729173247b68aaa2b6c7522eff5c7d012c1281a3405555d1cb7e0d15295c4b1c690e685ebe7a8bc4a1a1f0abe435a3e15f6136d241ff901ecb1ffffffff0248c54100000000001976a91405f3f88de8ec806b630f616744782b4a556ca30188acb32b0000000000001976a91438ce5195fc77c5f5eca8d8d7968c4d1da01c8b4288ac000000000100000002acaa643ce3062f048dfd839746485db87d32e1e7c804fd985692237a5d030170010000008b483045022100893c99955c92f890dcc8385db3679b9b0871e79530abc66c933b0efdf3a7737a02200da09a1163431589ae7d40c0c8a5250b6d57a6e233688242a6e47b116264c4200141044203a4ef6caa1d5aae410c11ca406a3a18acf331327ac6f3a606b64c77c7c8b8d406660da0bbd1265b1eda02deb55910df5d65f9f46bb28bbca8692e7f3e8192ffffffffd9035b8d84b5ceb2130066d4ebdeda0b280ce38e83069cbf5c04c2b248f4dc1d000000008c493046022100c40f81219ac0f9de2be602e0a3bd6892ae53d0696720765b0144d0056947af6202210083face63ed17861540dbf4030b56f4d900d604d24eb0015585e37e855b0f5f0a0141044203a4ef6caa1d5aae410c11ca406a3a18acf331327ac6f3a606b64c77c7c8b8d406660da0bbd1265b1eda02deb55910df5d65f9f46bb28bbca8692e7f3e8192ffffffff0219d82a05000000001976a914bf745065a9a0d079436846960b8cf63ae7fc8beb88ac327f0100000000001976a9143a08ee7ae37b004e305a60fad7b2125afca3568d88ac000000000100000002ac91491a902c0a1a0dee54f16cbc6a757c5bcf458a92d0f41ad7d3daa73671a2000000006a47304402203070471f2db07ac6013acf38a2227eeed5c360f1a5cc80b8aec5fc102e303c5202203586ef14b54d57fb4f4d823237382daba3ba7dc16cb807a082fbca85b1a74126012103aacbad6bba5541978ae6762f9f35bec99b7069252da2cb83e39ea869d1e7baf3ffffffff96b1bbb7818961ba558e102ae105ba242cc0685b53c7260808f5baefd21c42b6010000006a47304402207148afe56b6fe514e53a1e52f71b98df072b805b7589848f8e9058c90fd462fc0220750712d55b346370fedc740f012237506dca6af02e2b7e5d3fedc4c0a903e2cd01210217f2de125f68abf4c168633925bf4d599e080e944cc03fe905016911b39c5550ffffffff0219d82a05000000001976a91483505b3621e64bf2f68984c64ed2a263daf2455b88ac30a30405000000001976a9141b5ededc1e4da4a5ef8a9a1a9652680e4f77fca788ac000000000100000002bb70d71ca81c490dcebd3e2ba78f6ea60e0fca361785389550c1814cc9f91ee5010000006b483045022100d23f26b30eee4c6ebfcbf9cc1f73d85f799b2ec737bbbee3b6133284ec51f4e202206c2a7e0991a7af5d9d4b1fbb5f50501f0aeb7dbdc38a333a18d712e679ba65d501210316d8155b51902f2a243a23eaeafaca1f879ebfd965d80e720bf469b798a2cc51ffffffff7c51a9bcda17c518c84a037c2e2bbebf08ea27188b8208216acc89f9fb6ca1fe010000006b483045022100f5d77555277ce7edcf7135f2240c77e1797d3967899dc93d7fc4416aecf7bb7c02205e619acfae53f2c24b5d16bdbd3810df2ce04e4811e323426712d8f903ec0db50121027c4bfcfc08e84364f54b3233bd6f33a824b0e526e4dc06bec3d52636658d4909ffffffff02705d1e00000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac207c0405000000001976a914d54f583f742ae3f4665fbdcd343861ecc389ad4f88ac00000000010000000236eeee31d64e20665dcf7c1e5b8dc3dd009f93118eebfb61fd6d6cfe20084c94010000008b48304502210096cf1bc0e5900b9812eef425679ea848a89a2e86f0bd71fe7c34ada6b211b9e90220129288c4b262eec85d82dcc714c9222724eb76ddc07eb884fbec3b8b12c833910141044b000a8af1c4a99aecc87965e3ae299b55e036b012f1bbfc380f90d57d82d3a9d367ecf5357660f43dcd601617ffbf2fb8c313087c93a33900811ffdfc8bbb7bffffffff83b9e69214e8e0940c771f7eb1998f05d7bc51b7aee75e38c3453a9410c3f275010000008c493046022100cbd9478c0584c10dbb9246e8d81f1c3d5f05131f9707dbda5912457693d9dad3022100b996bb5ebdcd5654e7b1d9680e256bf62ed99afdae382ec5bb7f7ff7e387bbb60141044b000a8af1c4a99aecc87965e3ae299b55e036b012f1bbfc380f90d57d82d3a9d367ecf5357660f43dcd601617ffbf2fb8c313087c93a33900811ffdfc8bbb7bffffffff0210150701000000001976a914a73e3b8e8256278f2d8849663c82fb571effc6af88ac18b40200000000001976a9145103443c6b76d35b66504057b7ae71cebaa4bd7e88ac000000000100000002a81ba12bf435b8cbc67e5629269c894c0659cbb29f49aa7fd4027bef6e6b1202000000008b4830450221009992fe21779b49f357b3cac97d39fd530e296f131bc6cb93235f1f421ad4989c022045b3f00a979f846c7c8db129a979f0178a4086e167e2bfceb94b829814f4c809014104e4e089924d649c94b25c415b2a288bd9b5abeff856cf8462737a7226756479c78f790b28612567b1f9526079a8cb0a6ff1b6e4a6a205b48238c667ac7fa35405ffffffffd662930550d92a37b1264266c9cea93358a3170431817b47d9810834e61de7ec010000006c493046022100e1ab448ebae82e8b72f4cde8d1b5ff4a97c34df1d2e5c0dd7b4ea866f5a834ff022100e58a0a797456a0fb8ac5d7af5502a8b75af866ba1640460ebe143bc10737dcb90121038176eacd904c105210653546803131ae128921f9ba1a33f0b6756a630b0284dbffffffff038c3c0000000000001976a914ff1c46e1a76a389b44be4eb1d08c000579e728a288ac283c0000000000001976a914175cf0809e205420f2bc59cd682d94a0a1bc03e988ac56c20200000000001976a9141fd5f14f0f756d55ceb13be1a44085215e27aaf588ac000000000100000003b29dee04333b67229c0730193aa3f6986dda63f746c8279cb30acc089c843ca3010000006a473044022077225ce0ad0329759b64aa73685703d9c2c53aa3c54f9bfe9ab3283fd8848e8602200237202672a7ea33dfcf93bc706c4dbfa38532e89c1a2e4e2b8a84281f68225e012102d10cc4a5effd1aa9bf4cac4fa57497fbe93b1c64586074ee56e638eba392d4d6ffffffff4d5e6749ca3c442f9f6ecbbf7d1bef0136716635d5d150fb1828556c0de5d4b10a0000006a473044022069123f16f674d9a6f7d1757985ec74a1d8ac333e1c363d4eab5bd6d0d09cf511022019df6b5702c3e6f15a548dbcfaf3a8ca81f0bde3e1563a94aaee71fec31b62dc012103201dd5c598880b4b45b7c005c742ffa3ec57649c75b34c96d39de1d0c3233c58ffffffffb29dee04333b67229c0730193aa3f6986dda63f746c8279cb30acc089c843ca3000000006a473044022019ff9c54b810c609438be4c52dfe936a44b818cdb34cda41fed5b865e49190d70220527efe1f261c23ef43a00864c6e77fadd5124c4a9dc2a0f6854547e5e6ffe096012102d10cc4a5effd1aa9bf4cac4fa57497fbe93b1c64586074ee56e638eba392d4d6ffffffff0180969800000000001976a9149d1a13901e7d967b3f8c77a40ac2f6a1db595d3d88ac000000000100000006a99a07a35701952744a8583f663c0d55e96650aa2109a32f7bc573d62255b9a3010000006b483045022100a0c4a1a2d5104c91a6b674cb68bbe09fca0595186c7ca32af8d759cb2e75d029022005ae1c955fa981ebe0b465591166e37a1ccfa444dc34c613f73a4b5f4415366c0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff5bf9ef1d5e584d69616277d4ea37e1fbe7b8f8f373a85ee00e75d9068a2454ca340000006a4730440220209398d7fb0b095fc54dcd774170ea34ed87957f4897ade5511c1fa1bea8e48c02202d50f6d113e18171f516fb400478078e3ec4325a6145149e6cd5ae8e1a0a66c90121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffffa4524c5a1a27594262b0de5d44d13c34e3ad1c5c3a68e9f5fa18e29bf00818bc000000006b483045022100a95c50704d459acc37e28410b5536aa6da1bc82caf1c0f14105bafd82a649ad402200cc2c0dfcb4b24797084c4133fafbb60580f66ee3fb12e0ccfc74b14b024ea940121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffffd4f85f26b98234a99c2242833269b5808eebe4ba1b237d15b1986a0d82396684c30000006b483045022100da4be6a3afa6de3f105247deb4249250001578e722e0fd46f05ddfd88b5bac3c022072683ef1f199c4f784caffaec29c1d13ea115a35de5c8706c32538bc9d2eed600121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff6785ef6efa54daa712defd19cd5d39a4e57af4fe7354ea0edf20a3e100faaad9000000006a4730440220629e9b29a3713e63ec2abaa9a2f350a75ab402865df60c4508dfee766ab956090220557ca5cb0bb4573a27b228ac2769ab141993e4aa20d0cb985ae7ec9bfa1df74b0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff1d519546b9c39ca8f41b5d6f8f0b8f2a79bda7149563d082dd3be69153f39e0c000000006b483045022100cb0db43d5366fd0418a5f53604d70f7def70d062416d6bd3a0f8f54fb3ab045e02206a27d82e0ab0bfa885390a3ea8c54e0971888f517fce5439238dcde1da60462e0121036728a719f71f8940b2bb8399d1ff0f00a323b9eca50266b8d9ec581047581db3ffffffff01af170b00000000001976a9149587412cd6911f96a12865f1a4396b0b62cb37f288ac00000000010000000663b16748841f9ef7b86598199150d5ac79cda90226f6c2dfdaea5e1b37cc3b00000000006a47304402202939591bf677eeca1b0ae63322e77337446c6d0e02f054b6bdf4b26e320442a802204999f98aed007d1b01ca57bdfb9d5ceb174c16507fcb9d4465a94f8ee74e7edf0121023540aaa8026fa0f7db76ca1ac015b5fa97f2a933fe9d540ab46ac9036c54f5f8ffffffffb550c94e07aeae5646260a221bafe2fbd904260d0e193525bbd128d6a8d0d61d000000006b483045022100f117fdbe47c4a0f9e01a43f13971b57afcdc9735b46e3c2c0198ba760a05365502205872ec7682f8f108e75f212b21f79ceb01525b7abbfda0d40d56d1085e14f2b5012102bba8c28be56fad0b5fb7c9f3b66d3a8a3619d77b3896828a33a1175a479f1d2dffffffffdb598fc5c0a7b7301f186390670bc083a7efc5fa63ef738fe9386143bee41379010000006a47304402203dab5224d352de4a7afa0beb5299be6a9cfb77838743eded85f15cd9e02a23890220662e9e7d38a4d05c08a60552930425cc452cf7c3d5a61040b560948a532b37f801210396db7fc8829c256bd13aa646cddf3461bb79be25c52fbe67aa5d621cc1cb4326ffffffff5ee4346a40cc81387b37b3dab0e3ac7b73ed6f1be4d727451999681def9de5d3000000006a4730440220349f5fe9c032ab83ff17ec1cf198265411c948fd4b87f004d5b9185abe4cf9db02202babf60dc764aeb325aa04363bb5aee5d760693861a664338100433ddd09817001210281f473477d4b68e275166585aa74d201b84e398df5b2d2c5f169916a97cb771affffffff7413aaf36abbfc6ee9fe0e1073280d59f553af654320cb5ef61dbf24c0aa034b000000006b483045022100a50a03b753b72d2e1ddac9ce706465664120e6c49bdfe7d1eb21e365d371b8b2022067ce749580d51fc7987e40a09a20b1a83e2d10a258f092219ebf3b5e36ce0782012102365120c36c776b272b804fc44c70f2ccfca798109826d441d4ba2efe8da86ed4ffffffffcf7c43f22ed1de5d18d007c8f3a97a174c123f100616ebee1497517192c9a8ac010000006b483045022100833f808782de884c23134f4972f95d16c1c3359a58c241a5d5099badd4d87ff50220631f990cac53db8ed36e0b07bef80ed70685a104f9c50e7407ca1f47d497d35101210365660e62b048addb7aaddf3eaf487325f861ce1d51f793e46f7562bddf0d1635ffffffff02c8ebf000000000001976a91432d2725907fcf628c50868be1c911af2f7b0ca4488ac30322000000000001976a91472eacecd72014b53974227675ab6aecbdc821af388ac0000000001000000039c26d06d8ee95c66d59933a0d1eac8e0d98133ee37a07ca67247ae50097cd3ce010000006a473044022022eba58401cac10a4346321920a61e42ba53e980c282e5a9f460855e969fb71c022076cdeae244327ddb9d758879bf033ba9edc18afd60d611f5dc5a551c095d63690121020bd9e909f2f57062be729adab091e3f86699a84408e54a46f68b0008036f04b9ffffffff391c1955f30330c9ee0a7706d7c7a26f8ecca6d0c735caee17639eb0ff07c3d9000000006b483045022100d1bb384fa2c6d94a440b366c99fd3f9786fff40ef11bdec5b9be15884f78294a022064532a11a6eef165d7f1ca06f6a1d04c34934f5d103160d712b9986f81d94d4e0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffbf2985938d3e69a41629107bc065d7929f70b7d0a073a66070f592fc75e5246d000000006a473044022060223dd5520b2bcf09373d64b919eb7c223761272502207c0ba1309d8a87f35d0220696de16125e07bc6fe234354df72237d7e24ea29126636dc0df80ed18cead5de0121024b4bac1049d3f0d887c08497ac6eb5bc17c3229b86b1381e2ad575b748a7a1b6ffffffff0170c73600000000001976a91438860090779c6df12ea41cbe472359b62957527188ac000000000100000005a22c8cb1f11503fd8799b800522f743523740b948e823cc6c789cbe962890903010000008a473044022013d9564b5a4a159f5898829128694e963fa402b204f598ca9e188b21dd8b99fd0220627935a445894b7d918087d7ba8ea154770cada4e6993f20ef3f51a8bba7a67101410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4affffffffff179ba6e1e2c43272ff0f47aa5d5d3714ef1362322a27d319ca56e8268145827010000008a47304402201d4e83e0072eac84a1e9749d52cbd6d0ac58249bba2e1d3a7bed43dc4daaa4fc02207516be9f58ff0b2834898aa43edd5700e0a66b22bf1a7ccfdf22d3433ba0b5b601410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff4a11da012eaadaf2f5d65e04678add7f9e08093ad444d50eab674368a427b451000000008a4730440220572b06f069a56cab4429110a6437627df3f8ea6218cd2b2b5ca179843521007c02205dd2d04a02c92d478d56bc3d6eb1be4d4d99cad1e0e5eb4013b126b3ec45bc0601410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff6622cd902f4779046dc4994ea0afaaf219e34e10f1a2e16b00421780288100c8010000008b4830450221009e60eb5388ce0ea8d20058bccbff7a158687d8cc5a9953f7b20d8026700d95ac022041db0edf480de6be92ec727fd954d9fb18cefddd9f0aeeea6618eec9373dd35c01410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff235679db494fe7e8297838820c8e04ba9f12c5a9958860557752a52b72245573000000008a473044022024cb7a5660654bd422ce2b343bf085e501f4d2b51e8653d4ca1657dc883ef9eb0220117befde0ab3a20e2352accf99acde63204be51d1c70eac0aeb871b4f99fb0f101410415fb122fe2d91ea3f88672f29d9cc6a0ff812ecc0fe41a02fa10f9f5871c33297b71306b1c8fb19838e49e9ed834e37c09fec2fefc22ac0c6da31a8a684ab4afffffffff0280f0fa02000000001976a9144b0c84aa7192c91a247fb42aad33ed1e49651ede88ac14b71000000000001976a914a1691fe52de67c74b80b8844880311626fd9661f88ac0000000001000000036d4f3472421e15e7d4b7d5a115bd1bb8bc7824fd2052faa2e0f353c07fe2425b000000006b483045022100c628b1bd9bfce037e1602d491fe7daddda5d861bb36c20074069468f1cfe26fd022076a364b4ce5d1d342214e169477f3f5e992a31b37a29c3881c6a4c6d346141aa0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffffe5effde11753ef6985ee79fd39fecd350ed4d8ae3615b9c248624cf70c0bb8a6000000006b483045022100c62baeebe98330a4440f3cdde01fc671bc1d0593753023eb6e179ff306a1f79602205122bcc4772eac50cde34c9c113519ddce4795391e4546af8175ba8eef6c60dd0121024181a8fa7c766d99736e3008e4aa470600ce4525226ebff294e16d908c73306bffffffffb26f95c807c66aa3aa12a893ad9fdcc3bbc49a241c6b593a5a4db51130f180ca000000006a47304402204fcb3f31b3bd448fad68c2adde9387f7d64ae718ea3c730037371d26a78d618f02203f8a270f1c7732582270519057bed7c8762bb65e4d7b5af98b9f64ca2f0feb100121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff0190940d00000000001976a9141047de99fb080679cd3471f25255b3b6ab56cad388ac000000000100000003480f9580767106b10593c5c926a562b4b25d421c17c26fd0dd4a7ac0b00a2efb030000006a473044022004803c784d93137a1af11c471495773df13b4338b1de2831a0c0b088e2a0be2802206b0af739445eb8b67ef6c059fc89c4201fcc7d69372f75ff66f45f447c0bbaeb012102ee99ba735c181f6e89048c1e5e71827c9d0ad1c5fe4cd12dffc58040be4a3cdcffffffff2d7b4e4be44ffd952fe9b6c27ef75232cd0c183d42b80b963689f6f7a6d315d6000000006a4730440220422e528721789726034ff4804139460530782868df8ce686a965e0852dc4b72f0220429ee182cc59dba72198aa8ff8f5ad55f2cc910e43a89be1de37125f2c7cad74012102de3009e749c52ece318d6a42800bb256009cc85c779f4391c5b8c302b5289ec8ffffffff7f927998c5bac3f22dd9e9cf1ff60e4e9251d9ece0ed9615c9b5ee45bc724fa0010000006a47304402205f8c5b4f4db53d9f217dfcfdbb560f28581474dcf3ad81dd3ffe9bb3b33186d00220490135e47b5c2b94aaa038cf8efd37fbfed23a07c5bf102d80eee111a0a3f0b8012102dd0a67c2bcc4aa524c3d16c60a445165bb648de7f46a3b4fbbdacdb2b219a0faffffffff02906a0203000000001976a914dbd819f454012f9827139d5e6351a724c1e34e5388ac67362400000000001976a914ef85d20dd64d07ad3c9b40f8e7568c433ad37ae288ac0000000001000000031fed4f6f004b01aa4eeef2054d6632e86c3dfa0df05e409e80daccd0cdcc28fd000000006a473044022064ea02e9b6bb7489da4b6523910f5791eabb47701e34ca7dad20c61a0d93093c02207b54431c6c38dd5b7433f12779b942bbb553d31e43f0a10d4061a7f7f1550cf20121021fd10f89dc34565c18f2607b1565806092e483a829650960c9b69b00f2bd349dffffffff1ae4decc82ac597a2585bcb2ced28b2ea928bcfb6dbcd67739cb4ae7b633bc6f010000006a473044022029551e0856d72f28a8d2991361b935ba636f3466e0430e52215325d78f479b80022078f8704ef47b0c1e487def5d8b09a8914db39ac71fd384811e677f9319ebdf4e0121039390f8c35481e981ba3a35b55798632246a0bf140761f1a35d2c133a13ec1a34ffffffffb7fd2f52710f8f1d8e484ac0d72b7385730aef8a25365035fa5e61d29482a41d000000006a4730440220678c06f2170d3f18850270eabf6c410b318e3162494e39df9fabdecfcebd65a402200936bbc8649f0a6ab30e007eefdca143c5b37593dc7671161c7e0b12c40bf357012102af041cd4a6aafbe45282b620ada2a7a839a7344ee6d031f7845fc71facb61fbcffffffff02135bf300000000001976a91439787b312215d9ecc0cde51d60b81be51d372ef288ac577a1700000000001976a9147ea20ecec4742638782db565d48dcf7d55aa08aa88ac00000000010000000313b5efff1f4bf814094b6303870dce81bfd9468f03190cfa4ecd1219247f9c44010000006a47304402205b40da0b0e9cc61f0a1b1b48f660b2836d2962296222d60b87d97b4975af2c6202205ebaf2e77178fea6366669bccca73b79ba8acb8279c2d93e494dc44f6f1046c30121034f05cf7723cbcf3156eb297fa67a960322d4a2b3feda496c419c383b6df8206ffffffffff87aaf665d01c21633fb9d44902793bc84ec7434c3dfaa71fd438c139d766ffd000000006b483045022100cd16d6fa1039f56ccc547bbd3479bad948fb8e1664d865ef504da410f44bde9d02204cf17d312af69d62bac696595981ef2009ae011139bbce3f638002a77385989b012103507ae1bbbb5ec41ce9de7193419f296a01300237a41211eca23717cc02cc2779fffffffff87aaf665d01c21633fb9d44902793bc84ec7434c3dfaa71fd438c139d766ffd010000006a47304402203a3a357ad9007d2c1f1aa08d91900cf6b1154ba0d68e44a1731590b6278b8cd50220407c7c99cc5e5e39de1204c3d65d408936bde817e6f657fbcbcbb1b943290887012103502c85b05b25e0a79a689b65cde8aea35987b6e52a45c03619a1563a4909ee28ffffffff0210508b00000000001976a91470d71a3bf5bd2712ee5353cecf474dea5a7102f888ac6c07cf03000000001976a914619235f0cbc6dd6f770f5d76dc0f9a87bc5dcaf988ac0000000001000000037ea53eda6fc6f67399c1497da23f90e3f8c3998d576199a74c885e5367fef906000000006a473044022048746b724dcbd94308cf78dbdc520913af40741309f90fbf49620aa42a944ca202201b45c0589cf9ec320d0d54ccae85f1629422a7fd2c3d7ac5cbda6364979b6894012103f67aac6a5e05d86ff2f8818d170b19198d5755d14e7533bcdb6bc6955ef1a486ffffffff0167efc2fe2f4391b532b967be73d5a48f122a8a146c10ae582b64ddbb503ff6000000006a473044022031675371ade0681540e605e9cf6ec46f0dce12e94b2c10951ef3a28d0264e71b02205f427a75ee9b2303ec4d5b3edde305a28d3626f45b95280da68536b6e27277210121029e48abbc9546bbc1d121bdcf9b4584c3d762a2d7e46f1f462f1a437436648bddffffffff07eb618b4182ac91e7353205798488b22a2e4baab153c73973adbd207ebba5b9000000006b483045022100c2e9e62255830f521c44894f970276ae571eb3e441dcc194135b00a5c3a2153f022028001128702a347d51e3ef18b45f9d31922ad1e8ec35073134e2cca1b33f8b4a0121020d935423da23c95e8e790f821f5a6d55d77e6b1cf31a2f80465341dc2ef16a96ffffffff0298690f00000000001976a914d0bd0400bcdc79be736e058939fc6bcf733ec10b88acbe140300000000001976a914f4dd33b30c9019ef8453e107a176b08c370d187388ac000000000100000005c162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b00000000fd9d0447304402206e26153aeb854f53493b5103254cb8f5b51b14da752b65e57d670abed3d2791502206a8fdaafe4b4f58a0603895d750678ad3c525873426bdb04e0e4d780ddcb9009024dfa01002020202020202020202020202020202020202020002d2d2d2d2d424547494e20504750205349474e4544204d4553534147452d2d2d2d2d00486173683a2053484132353620202020202020200020202020202020202020202020202020202020200054686973206973206d79207374616e6461726420636f6e73756c74696e672061677265656d656e742c20647261667465642062792041646469736f6e2043616d65726f6e2d48756666003c61646469736f6e4063616d65726f6e687566662e636f6d3e204665656c206672656520746f207573652f64697374726962757465207468697320617320796f7520736565206669742e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000436f6e73756c74696e672041677265656d656e74003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020005061727469657320202020202020202020202020003d3d3d3d3d3d3d2020202020202020202020202000202020202020202020202020202020202020202000546865207061727469657320746f20746869732061677265656d656e7420617265203c4649584d453e2028e2809c436c69656e74e2809d2920616e64203c4649584d453e0028e2809c436f6e74726163746f72e2809d292e20004dfd01002020202020202020202020202020202020202020002020202020202020202020202020202020202020005365727669636573202020202020202020202020003d3d3d3d3d3d3d3d20202020202020202020202000202020202020202020202020202020202020202000436f6e74726163746f722077696c6c2070726f76696465207468652073657276696365732064657363726962656420696e205363686564756c65203120287469746c656420e2809c536572766963657300746f2062652050726f7669646564e2809d292e20002020202020202020202020202020202020202020002020202020202020202020202020202020202020005061796d656e7420202020202020202020202020003d3d3d3d3d3d3d2020202020202020202020202000202020202020202020202020202020202020202000436f6e74726163746f722077696c6c2062652070616964206163636f7264696e6720746f205363686564756c65203220287469746c656420e2809c436f6d70656e736174696f6ee2809d292e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c6963656e73652026204f776e657273686970206f6620576f726b003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020004c56a914718a00c73b3a1f6c268a337970005a053c68880688a9147c42474686e1dda1f88fdf59b30fd6faab1c9e018821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad0075740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b04000000fd9004473044022072de0b15a31fb1f48288e5b96e6f3ddd088f564a09cce34a8347cabcee835d2202201193def75abcee8098a070132f8727d272069d658db5493865ba20d15c9e71f3024de60100436c69656e7420697320686572656279206772616e7465642061206e6f6e2d6578636c75736976652c20776f726c6477696465206c6963656e736520746f207573652c20646973747269627574652c00726570726f6475636520616e64206d6f646966792074686520636f70797269676874656420776f726b732070726f6475636564207075727375616e7420746f207468697320636f6e74726163742e0054686973206c6963656e7365206d61792062652061737369676e6564206f72207375622d6c6963656e73656420627920436c69656e742e00202020202020202020202020202020202020202000436c69656e7420616772656573207468617420436f6e74726163746f722077696c6c206f776e20616c6c206f662074686520696e74656c6c65637475616c2070726f7065727479202876697a2e00636f7079726967687429206372656174656420696e207468652070726f63657373206f66206361727279696e67206f757420746869732061677265656d656e742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004e6f20436f6e666964656e7469616c6974792020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2020002020202020202020202020202020202020202020004d040200436c69656e7420616772656573207468617420436f6e74726163746f722028616e642069747320656d706c6f796565732c206f6666696365727320616e64206469726563746f7273292068617665006e6f206f626c69676174696f6e7320726567617264696e672074686520636f6e666964656e7469616c697479206f6620696e666f726d6174696f6e20646973636c6f7365642062792c206f7200776f726b20646f6e6520666f722c20436c69656e742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004e6f20506174656e7420436f76656e616e742020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d202000202020202020202020202020202020202020202000436f6e74726163746f72207374726f6e676c792062656c6965766573207468617420736f6674776172652073686f756c64206e6f7420746f20626520706174656e7465642e20436c69656e7400616772656573206e6f7420746f20706174656e7420616e7920696e76656e74696f6e207468617420696e636c7564657320776f726b206f7220696465617320737570706c69656420627900436f6e74726163746f722e20436c69656e7420667572746865722061677265657320746f20706179202432352c303030206966206974206272656163686573207468697320636f76656e616e742e004c56a91431f24aff099ddcc9a66d4f3569e69d7b544284c488a9148c047e59f93890e9be3945ce2652453bcbdbc38a8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5175740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b03000000fd69044830450221008ed4fce6cc5ffe978433b88328f01842f62bf20df59c7f816c35847549df5e9e02207425d2c00c76eaa8258540161a196cc3b7b0fd52a24637c0541c2ce52a0db8cc024d00020053696d696c61726c792c20436f6e74726163746f7220616772656573206e6f7420746f207365656b20706174656e742070726f74656374696f6e20666f7220616e7920696e76656e74696f6e73007468617420656d616e6174652066726f6d207468697320636f6e74726163742e002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c696d69746174696f6e206f66204c696162696c697479003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72e2809973206c696162696c69747920666f7220616e7920616374206f72206f6d697373696f6e2072656c6174656420746f20746869732061677265656d656e74207368616c6c006265206c696d6974656420746f20746865206c6573736572206f66202435303030206f722074686520616d6f756e742062696c6c656420627920436f6e74726163746f7220696e2074686520736978006d6f6e746820706572696f6420707265636564696e6720746865206e6f74696365206f6620636c61696d2e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000496e64656d6e6974792020202020202020202020003d3d3d3d3d3d3d3d3d2020202020202020202020004dc20100202020202020202020202020202020202020202000436c69656e742061677265657320746f20696e64656d6e69667920436f6e74726163746f722028616e642069747320656d706c6f796565732c206469726563746f727320616e64006f666669636572732920616761696e737420616e7920746869726420706172747920616374696f6e7320746861742072656c61746520746f20746869732061677265656d656e742028616e6400776f726b20706572666f726d6564207075727375616e7420746f2069742920616e6420636f76657220616e79206c6567616c206665657320696e63757272656420646566656e64696e6700616761696e7374207375636820616374696f6e732e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005465726d696e6174696f6e202620537572766976616c003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020005468697320636f6e7472616374206d6179206265207465726d696e61746564206279206569746865722070617274792075706f6e2031352064617973206e6f746963652e20546865004c56a914522ae24fc4f0c34fb602e354a976fe1f6de98c0988a914fc8cf080f742a8bfede168005c55195520be50108821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5275740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b02000000fd8d04483045022100991c46c63c05d74a7231dbdb7232e8ceb47a3fdeba8bbbda6ec7f7acfc53e5b50220400a43b0094272e01d5976c4ef08e735a5c3f903ef7c05eda22dc3342e55e487024deb0100636c6175736573207469746c656420e2809c4e6f20436f6e666964656e7469616c697479e2809d2c20e2809c4e6f20506174656e7420436f76656e616e74e2809d2c20e2809c4c696d69746174696f6e206f66004c696162696c697479e2809d20616e6420e2809c496e64656d6e697479e2809d2061726520696e74656e64656420746f20737572766976652073756368207465726d696e6174696f6e2e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005761697665722020202020202020202020202020003d3d3d3d3d3d202020202020202020202020202000202020202020202020202020202020202020202000416e7920707572706f7274656420776169766572207368616c6c206f6e6c792062652065666665637469766520696620696e2077726974696e6720616e64207369676e656420627920626f746800706172746965732e2020202020202020202020200020202020202020202020202020202020202020200020202020202020202020202020202020202020200043686f696365206f6620466f72756d202620476f7665726e696e67204c6177003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d002020202020202020202020202020202020202020004dfb0100436c69656e742061677265657320746861742074686520666f72756d20666f7220616e792064697370757465207368616c6c20626520656974686572204d69737369737361756761206f7200546f726f6e746f20284f6e746172696f2c2043616e616461292e205468652070617274696573206167726565207468617420746865206c617773206f66204f6e746172696f2c2043616e616461007368616c6c206265207573656420746f207265736f6c766520616e7920646973707574652e00202020202020202020202020202020202020202000202020202020202020202020202020202020202000456e746972652041677265656d656e7420202020003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d2020202000202020202020202020202020202020202020202000546869732061677265656d656e742069732074686520656e746972652061677265656d656e74206265747765656e2074686520706172746965732077697468207265737065637420746f2074686500736572766963657320746f2062652072656e64657265642062792074686520436f6e74726163746f7220616e64207375706572736564657320616e79206f7468657200756e6465727374616e64696e67732e2020202020002020202020202020202020202020202020202020002020202020202020202020202020202020202020004c56a9148bcf4b78d0400c6367c82122b9ab3714695195ae88a91429fd392f74766b0079e4bc94153473c53e80124d8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5375740087ffffffffc162b294758c73086eb0a8f28fd3cedb25f2bd6d8755a44b507353cd47e7893b05000000fda10547304402204c73c5fd27e000141df68e07a638d7787595581db61880aa1055bd65b261d40802202ecdc75f67947b34e9e20e366231bfb9dc8b0aad1287d32f6da234a94a77dd10024de901005369676e61747572657320202020202020202020003d3d3d3d3d3d3d3d3d3d2020202020202020202000202020202020202020202020202020202020202000546869732061677265656d656e74206d6179206265207369676e656420656c656374726f6e6963616c6c792e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005363686564756c6520313a20536572766963657320746f2062652050726f7669646564003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72207368616c6c2070726f7669646520636f6d70757465722070726f6772616d6d696e6720616e6420616e616c797369732073657276696365732e002020202020202020202020202020202020202020002020202020202020202020202020202020202020005363686564756c6520323a20436f6d70656e736174696f6e003d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d00202020202020202020202020202020202020202000436f6e74726163746f72207368616c6c206265207061696420244649584d452070657220686f75722e002020202020202020202020202020202020202020004dee01005061796d656e74206973206475652075706f6e20696e766f6963696e672e002020202020202020202020202020202020202020002d2d2d2d2d424547494e20504750205349474e41545552452d2d2d2d2d0020202020202020202020202020202020202020200069514772424145424341435642514a565271385858685341414141414142554151474a7362324e726147467a614542696158526a62326c754c6d39795a7a4177004d4441774d4441774d4441774d4441774d4441775a5463354f44426859574935597a41354e6d4d304e6d55335a6a4d30597a517a595459324d574d3159324979005a5745334d5455794e575669596a68685a6a6376464941414141414146514152634774684c57466b5a484a6c63334e415a3235316347637562334a6e63475630005a5542775a58526c636e52765a433576636d634143676b5177495879484f6630756479716851662f566b50586241715163386f4b42416e69683636374f61467100555a485662665456687a517a67766f46704c522b3377732f4d492b562f4f376c6b53324272754a75387138472b75644c546c324a324579583979324d2b59457000332f6b71616c66545579497356545a4c75474650536150524e52574d4159435534794e637363784739377875694a634e4c47344130554e496e322f696c474441004d0a0100793648335632502f34332b65446c79537a4d6d6247695078765a622b3073566561384c7563754b316c64764539385232646e64747331776467464d474e4f332f006f573471502f333477633631476673786f4672774138576437563942666d4f6f63684b796c4f62305178494b4b4d53624741764e682f417a776b66396852557a0047586e32374b397556377558626e32724d394f774a507557637172487243752f30567144392f2f70352f614d77332b7237685966534a2f30524f795967513d3d003d79566a66202020202020202020202020202020002d2d2d2d2d454e4420504750205349474e41545552452d2d2d2d2d002020202020202020202020202020202020202020004c6da914eedc07cdb32f755b5e696becaa148dbe2ca6620488a914e54ab11c7ae71772cbb72562871415147173c10f88a9143e8b1fae20e81def8b2c9261f20e01c6c765ed8d8821034c59815a38f4ac081b64532336475bef9606c772718979d816f0a4158d1493e9ad5475740087ffffffff01580200000000000017a91492a04bc86e23f169691bd6926d11853cc61e185287000000000100000007b5b1cbf32900be294db355096411105d0e1aaf6efb971a5b76e88c25f605518b050000006a47304402200ce58e5322b5c648c43a9138a66b4635a2ff11d6ee1ac14be502eaa2b4121a2c02202da6979c0920d2e1708e59efe85736e9054d68d68161e13ee2f012556afa8e9c0121024efc0404fa65339ef61c3a00701d02533f6b7256ce2897fae9c6ee16b74abc55ffffffffdd7139e8604d13a5b09787feef3e91bba6898c685c2f0e9b5ae949cabeb6b9e8120000006b483045022100de75e20caf5c16a46f75ca4e9f2c5635a10948097fcf0259f1147076307acd2e0220486742a379f40a45a6afdb30de3066d1cd991f92525998fc44e2a625d80aeb0301210251d7934af2658d0fcb89127ca187e1689a88d042c2690052b9490e0816e41046ffffffffa458174a9364e52b1774c8807ec89d269532abf935d81c684cd75c0dd11cd4f0070000006a4730440220727d65aee66d0471b66cb7c8247346942742f8a0cf573974c8a1a635c6c63fde02202b1320a0d65606044bf9592d8f9ca4dba9875201d68d2840e2536e283498d6b80121021eaccb8e2b73b9157f0e5eb63ebb02a514b1ba92a9d78d6cfeab171a1200f14affffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080d0000006a4730440220039774b92b0cd4e619e5fd486322baeee5db0a038e61cc0a348b5d1acf6288f102201776789db07000556f3fc466db36b49e9d6f9627d3ab14a3cade3d5d59c0d7700121020f6d08c3f950736cc861bc1c69e2002114055af3d915a15ab81bb738381bbde9ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208100000006b483045022100b817c339af5bf24599ad2ff80cc169d97281cf64d21a7a85cde1693859cae7fd02205eb534104411ab3d3607535dde1aa037ae93f832e0cd5564a843bac50d7c0161012102a0b69be867857efa76e9397d6bfd27e8e02c2292fbede9e68c0ae47d8f35dc29ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208110000006b483045022100d74923de574e4ae945357572b4ee68dfa81faffc5cbe4ab9701ae1bfdde5f1400220599584f41cbfcb80bce42ed683aae21dc1d3a8c2750875f837e3c4cff7c30c01012103fc32046a7c1f15d9ea1e382124780ee87bb6e4d3168a3ac2f5a92ad56c572dc4ffffffff3954c64d9e1984231962fb009faa6ef2eb70eee67c1e58579d904eb2415209de010000006b48304502210090b2474ed32792c5ee2061259237a4d910e21c3468e8d0668215ebc3d77071540220487538464fe334052a95bfdfebd7d3943601f06b533feabfdf5472f558f55bbd012103648a769f6830e65d76a251491e9ad5e069d81680c8b00b84b939d26a535c2b5fffffffff0200199222000000001976a914c0d16bd11bfb9494330102680a8b2c91ac8327c188ac00b5e60d000000001976a914078b3a6fec6f9ef9fce8351d55c5236b7d3885a488ac000000000100000003d9529bf62c1dc819a5cda32fec38692ee55ffd5e82a9377803198818298ec0c2010000006a47304402206a95f121058b1d20e16ae32f63a5780cacc8f129e87b14c1333c90171cced50802205d4b27c541580c6f8b5bc886a00738cb11643d8547805c0595e7d7396661268e012103cc8e6abdab3a6977115ff2aa9274632c29d58554f34f9959662cd3e0198d4731ffffffff66b2840ff7ea26d398ccbc852bc5423e5dde868603a86ad0268a1d0762ea90f8000000006b483045022100afef8abdf6c3b1a4b68d5c3e2fbd4bf58902752c7a4339374565dd194cd7e17d02206bda9723c738301abd0692bcfec7dcd15c4de855646372f0dcf2cbe9c3ae4da901210258681365e701d0d8a6f58cfc40d1adb7dca89e928708134631728850032161aaffffffff271adf8900251fb0c8d87c763ca5aa947053da90390311a755d3ae7449910fa8020000006c493046022100831f6cbcd74073725580911208fd7114b9153e156cb60e34f86844da7e6f991c022100ac09948def2e923c0b67660dccbb0d7890390b838218ab629a207e8a65b206b4012102a3b1052e6dae6c683240e13d47f8f9949192c0cf4e8df90f3487c8961b347a2cffffffff0300c2eb0b000000001976a914571f2391d85d2b7b7e5933b9f72359413c92c7a188acc42b0b00000000001976a914c17c7208c4a1672163959f47eb409149c6f343b488ac66780000000000001976a9144c6bd90537bddb79545f3a6657b7e0086349db5e88ac000000000100000006a60b72c5ba619dc04c46564050179c898df80137e696e0760e1dc482fe8f24832f0300008b4830450221009212620754803048486f486a84061ea6b1fcddbc2e1800136f780278f91b2f0c022028cbd928b226d1610d5db835613dc61980a08b954963122c344e5a7838a8d1cb014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffffffec031f2dce18945a4099eca56db0bba4ea1bb35f0f13c8aa05ea8eac759c70000000008b483045022100869ce088fd35341a39109ff10f1c14853b2cda68cffac898889d985fdf0b5594022074955afb9757aaf2205e4837036c573f52dcc5647c6fffe6791a9f5d9b8f34c4014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffffc4a1e6a87213cbba608214a8fe93171d7cf35d5d0803b801f17918852b2afa21000000008a4730440220193c616e7bd61b858a9eef497b17ce23aba39b715507bcfa6f24117fca6c2a38022062b12a5ba58e8def33ccab924644deab99eb1c6e3d10f1f77911db8c4cd9c502014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff1989729a465d8e6935d3f81fd9eea74f551c3e74381d7437ee591c16489de379000000008b483045022100b84cdfd300a6023908bb6b5fa8a658583815199afff4eab95587a83b6066774702205d74a9d04c1a56440acdc4c6722f9bbd9049f22ef3b53dde1d01dfb9fdda884d014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff94879440f59a23bd1ebb7f2a520d3e776b2ea834a3c28ec9208c37ea7e36e55d000000008a4730440220349c2a2021dc0658533d48aee864c7c7e714d665e49bde78b2753fdcc1461b56022010d92d73f8a3a33dd26de79c1ae3e8beecb237f8ce356ba60249d2ea4ca158fb014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9fffffffff0b6a05b5ed1c631a1a158234946e347f1a25a5d0079a07ad908265ae35cab70010000008b4830450221009c2c8ea7a23c400b456b4b497aac9867beca32fd1d4e9195bca0132d585805dc022017f7d68dff73f32bbf223e5965bdc0864f2933e21cfacdd7bad20a0c723d077d014104fc1cc9ad78243f47dcbb731f4f7140fe8f2995c5ed5e910159cb67f0f8cf98923833b5a7215839790b8ba74220d4cdb9c12fbe1cb3454c14a1fbc593bb83f0c9ffffffff0109f21f00000000001976a9141980502c78e8531c104c87353dcc82be07c0718588ac000000000100000006860da7c7d926eb9c735a7defdd689e3d98845e7bd6bffc439ec12ec374eccd32000000008b48304502210081f58f8ba3ba634946c7e28652736008d877ff90a629cea2208799fa2610eee8022070587ccc7fec40d9134a581a6a508ba2205b6ddd80c055d2b66f61651be46006014104f16e78a14b71c4995c36bdbd1a2be43e403a234e52874b0bc0813829866cfbeaf046b8669f8d0edd6555925e2d7ada37825d40fe57d3a537e261af57752a169fffffffff7d05334943bec488e842875172d516e27d6b095009559981ed0aede0a7a0d7c0010000008c493046022100bff2bbb56e756c8e0686115bd168a0d4f24f7ae9d7b465c48f988a5b3ac2c5e4022100f002d64ab94f5020964e3584b72ac9cc0161fd369a6a27f7d0c4ec624a5563e10141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff5e5c9f229f30a7604dd695b43529c18b5d1166cc69b60a961d4bce2c2f5977fa010000008c493046022100c7ad9617447585bd44f1370bbfa3e64e89e61731eaf1bc002ccdebc1d3151cb8022100b5fcbd1b95b38a802ed6ed277bda87843d92893070025b69f58e16f1d4adfd01014104f16e78a14b71c4995c36bdbd1a2be43e403a234e52874b0bc0813829866cfbeaf046b8669f8d0edd6555925e2d7ada37825d40fe57d3a537e261af57752a169fffffffff334d4de2a37da92b9758d2dc3aa22e3134523288b88f9aad798bb9d69b01068a010000008b4830450221008b145ae3a15ab6d7a8d860526370563501a57f63217c5e1bb13076ad41a48b0e022065b998b2f203b477bbe92e43559b18335ab6368c64cbfda9ea9cd7e195f3d1a30141048b6a00dba1a492db5035d9b801e706cecb6377076e17f8a57f28acb56c26401d6cca08ad4341ff93ea0f74e6dedc205b33cf1dbd5537f87436994fdbad482062fffffffff1ac394465ba5312cf97ffb70f467c345a44111444989a1ebcc7c6a962a9abb9010000008c493046022100c98cde5f315d964b1a106be00e75b7c16ba0ec0c4722677b55ba640b56bf61840221008646a722858ca5460742611db2a4de4f7c17a7a3c083355d2a69227aa638ab5f0141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff2e6fd288f4912f5a440a923d1d0d9aeba335b7197533f69fdc24f60773fa61b8010000008a473044022063ad90e01b52062bea1a0fba40c5f513ac94cb237c329b7a115be485eda035b702207dc36be9ccd2c34991a29fb245fba5111f631293bba29d4c74126c2de08f90f70141045d20352b47e7d91bf999e74ab9529cf5ca8385ee873355aaf87388cac6ac735fed75c8b9c947346a8cd43789c8e9cac4c5a2480c744f3c4f5e2e66e51832aa87ffffffff02c0448403000000001976a914b29ecadf735743ea23a01a6790d29c0189e0500788acd8960900000000001976a9142998e8a9049867b923fa5f496399096fda0d9eb088ac0000000001000000156af95cd11ab5d3350138d40a648f09b4149a518c4cdf8ec840005de0adddbba2000000006b483045022100e314784fd1a5498192968a3c6a6f9d1e3472d72185bd0be73154edaf33ab6c9502204823de1ed2101cd49edb937b5b7411575ed5840b74a9314228ccf89040ddbd5e01210238b5afd035d5435468014cc3731d3d1ec128c201650b7614036fd57b1c7f92fdffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e0f0000006a47304402201cd361c2b7b8a7fc883e2cbc6796fafffbfa814c53a97e9df6c533ae473011240220345db857fa58c52ec4d8e80faed06a846cb7385203c08c6cdbf4855be1fafba1012103ff5d8c9b0adea5e08d0b9dae8559c5b91d807c834b5018639eb1b98affe0f36dffffffff49a663e78cdb672ef346f2019e674174ca28b864ff7d2bfa05defebd2b5084a3000000006b4830450221009d55a0214334a3a59f1bf3c87d49e9422911b6dac2045455fa9e85b680974d6a02205c24c2d9f943d54bdfd0af50501edc328a4a7bf8441470b8daa2d6ff42265de3012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0ffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e190000006b483045022100d4f3cc2cf8e36f9286135e67f401486f6a4680b8cb3055fab7c9557a8e424eca022026277ab8b47647c8d9916305ad1b08e8615ae451170d470703d97a56dd51d84b012103fea9280369228824ccf30dff697a70280d91035cdc0a271faa0683cf0b8776aeffffffffc2be9e4ca9438e9a995bbe90cada7dbe0d7aabfd681fe7a760e860a037abcf5a000000006b483045022100a6311b5347814a7d6707ffbfced261b1e93dea471eaa1b80c1847e77f12c72c90220468b9dcd03c46b4c158d300d68ed13598e8cdcbde5899a8602ae752b1e30e3ba0121030cce664e0c7a4b416a02b9fe8ff76a68214e958cbc1af661ae42c0d7364e5091ffffffffa17f1c953b371b196f14faf73404bb8a02166a803f3e229eb6d04da40d7da46e3d0000006a473044022027ecd9c0087bf313fd43fb0590994efc8a90b600c63768ae98fe4dc7f17bbb9902200aa2847a21667a8c559959c1959657512c63a18e8eb10ca84eb0a5345e68cb3b01210350adefc65a86e370fd4fdd0151a7ecbbc2a8dcdfc084cc075e83d197e4014a3effffffff45c46d6a6720124705c25ab9777ac5dfc7c53c6a6c4c387f6edd2110393524be090000006b483045022100876f0a162e66be4209413c27e0b08680e76573af7b2f5767bbf60d997cb231720220105a5c4b8ba943cfe987632b786f4fa9fc03b9b9ee8c7758c37067d550196a7e012102cced0d0ffddbcf0f9194ed107b03b919f0f3074c41b53e7376c753f562e21647ffffffff36a71464956b3f64be91833460cd327af020013bf91d921618115849fc18d4d2000000006a473044022017af06393be23f12a4c9716ed56ccc84df8495fdc51669cecb3aa11e0e73f5d9022036832eba8448f577630234f47f4842e1712605a234d6d5eadd90ae4ab563c98e012103e6f7f28ac5db1f0bcbf18c6f21ebe4b66134d57f437643f795e44d0876305dc5ffffffff8e796a2be4b0813b35b6b3def8c1f6b23b1e6bc489f73a6af0d868a3117ea39a100000006a47304402201c705d82c63689ddb3d0555582d6577c652c6e0eadc7d6caba42af6e0a94328302203139cf082ea8615e60e958dca478aa7ba51750baedad9b1f7cf2e4997f9fc09e01210344aeaa967c6932c397a21cfe46560981638adfe95985818bc1b92195ee00b93cffffffff45c46d6a6720124705c25ab9777ac5dfc7c53c6a6c4c387f6edd2110393524be0b0000006b4830450221009f831750452301cf2123d01ad490904a3a4583664577632df2fad18231bf179502204c245e238846019388c6a5789969a8a5834dcc6464f715f178545d1884ea6b8801210321e1e777b76571abc953f9138b4ebfe4d378a59bdc9b88f393546ea0a65d09ffffffffffd41087f77c0ff528b6131f1c96ad766829c0975ce55ef6e13bf82ff096aa3cee000000006b483045022100fdb3b6d0b3184439d0058aafc13f2463b69f7694e253c74cb515de78d2e2732b02206069f42cd8597aa32b82e1f245e2b8f0ec35374083a305f8fda6c91c17b1933a012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0fffffffff1e3424b51cd6caac82571686f9f0df2a405ca9f45e9933f8efbcdc20da2569c060000006a473044022042568266070d02d014cb87d639521410d1b5e22f5709f32a41391327188dd2e402200550094be1358440b88e13ec5b868871958c3e6ad8adc238a51852db74d77f79012102a35c3171ae31a762209d6d628350c3d28e7124da414cf1d44e15d2f615280bf0ffffffff71dedaaa720485b6fd2886ec321fb60470312fd76fe41fcb25d2e8c32b5ff3d0000000006b483045022100a745f36bdf8baaf2118dcb0407d187cf4192f6bad13a37caf11e4a3eef382faf02204681f42a4ea5cd80144c10b7011dd4f343b79324a7222e62dc98bc4183e41a8801210345e2010b62d56cf5e79282d74deac6f9c2f1d9cf6746a1e960ca0cb18fb79f8dffffffffac3777e88e55e9cb150af0dfbea3f0f4ae11d7b39bad41fbdb47ed4a9c891948000000006b483045022100d5dd247e08cd72cfac6c3aa76995138465d9246225681c6045057ed4941933cb0220609502ccde406ef54241ecdf0edb49cee2272d6fc68f9957d5bd3d87d960e2df0121021a97caab63debfdb156e4ed5f6c68219c3f1eb95de3032b1f57ad1f123c1d858ffffffff9c9dd4b1906f8db5735fe94f2dbfec65fb2551951b3b448a6f38a24742c41de6000000006b483045022100a14979aa9be076fac6e448252f9895984d02e554cafbe8c89d10e1cd3bb805a1022034fcd2c77eff453ec3804ae410803841990a0c4119e1835e60c5296ef137080d01210345e2010b62d56cf5e79282d74deac6f9c2f1d9cf6746a1e960ca0cb18fb79f8dffffffffe5e4216f0619f1d8fbb94aad7f23dc091adf2e8afbf00b67744861cd1d4d0a15000000006a47304402207442a698da8ea7ee3f7808eb2dbd32196430d36ea319346e543e7e7fa600169f02207513c917c998f731435d80ccde038c6fafa89b17f4ad1af382cfdbeb8d7f6f78012103682a1ee1ee449924f96199b3b7d6bc5887a36af073014f69c6d09b7ceea09e04ffffffff3ac1fbabb025810b3d2d1a71138b6f8ac8717336e586c9e6468e9c16fe4c20d0010000006b48304502210089e7591fe30bb8531698f86b6686c14757115ca94549704ef63bf3898a5f164e02205acb550842243013fe211d2481a587965ec6e15871a8de167b74d90b883440270121022110aca8e9a8d8073613f2bb6679e1adb27f30bd8b4478233ac2bc3209e3ce55ffffffffc638e55a19331f8056658aaf80710876bd989d15edbe6dd506daff3a8b319555010000006a473044022019ee7ffebe9aa9051ec341e174004969b37f68e9445ff0163b2d40d1f105f24a022063bcfdb705266930b59b58780b77184c7a460affb065fd5da3bbfb4f914db6ac0121022110aca8e9a8d8073613f2bb6679e1adb27f30bd8b4478233ac2bc3209e3ce55ffffffff4b93253465059f3e3d071b82b5a804f193cf53e9c57bffb94c7fea061745206d000000006b483045022100e4aa6b909a1b570f65de2ffedb43d5f9605347e24439ef30daefb1516d1a49f002203fa103a695a0318a49163c32a69d047e3f5cbf3c8bd8d630fb446209042a03d901210235598827e3268015e559e00679829021014342335233fbc5719f7d7ebc0b2344ffffffffa3c12d507bbd3ba48918034ed31ca6205937c9cf260f4d7622103d744798b79c000000006a473044022056d26108c3b18a4d0bda657c06954c2a88cd51862bc006541ed494f11d9b7c5d022000d2b50fec1f342d862ebd7691f4860127947a4458d9083e06e901e0006a43ff01210224bb22b33b20d8cbbb2a0522d8f9c6d0e78965006e443ce843c305ec9ddab0eaffffffff346e1b8a8e10e1734fdc461b6ce153c0200ca2ecb6dc9b0ffe97c4c0e384e94f000000006a473044022005336469496a9c2d03499518470486ed9ea83bdee636cb1d8b6c258679644ba5022013bdc19bfe4fef05884c9ff947d149730b207bb365552e13dcdeb30c66ec260001210224bb22b33b20d8cbbb2a0522d8f9c6d0e78965006e443ce843c305ec9ddab0eaffffffff01cd55f102000000001976a914c7fe9f2b47bac34feac4442a91176b6707aa48b088ac00000000010000000385dc4f9bd841629c2549cb798c74b2fbd2135aa81cd178b74b4bd7beec4d990b010000008b483045022100c027692a70392a9c050ac7419f9d83a4310706b96e3f385b1fc10d2e225bce7c022003c81c085c37912236b31380f6b2b81fc73dd51d6a1742c381ee7923b8fdb671014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff6b6202ec1180d19c2fefc33c99d1f15ba5eb49d0190501bd32f7bf8834d93960000000008a473044022025199a900727c424bf5356820823907e39b649b3622cadf4eb889ef9f98690ec022055ca1d5a82f7911fbc78e82a9e208b554c76fcf2d664f94f183fdf5a550680b8014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff197953fd522666bd49d7a24d57dff1631f495877639ec2d3e78f2f8f49d8ae5e000000008a473044022023ae134a9243751aa229cb8c8071ae29dec5f1d895e17806886cacfcb5f55fcc0220751a2d0a05bf544381cbbbdd55acba79f593e714dc36b08629310ce199bad8e2014104fa98199bbb646800133c89bf55756d1074b176869efbcdc1920dddcc67a4a37e571aa4bc6e47cd1de23b6c31f5c4881023a92fb9451236144996f74be03da328ffffffff022dd04100000000001976a914c18ec0550cafcd1661b88e958d14031ecb4d0b5b88ac8f841700000000001976a914d20942f56282a083959b82ffa4c50f10a63962a088ac00000000010000000307440005094baffd6474d24fa7fb48199495f0acee6fa0ed3ef92709a7574cad010000008b483045022100a19620e7a1ac74fce8eef44c62d84efecaecfadda8b34872cdfd32b26f9904070220590c588c670bbff128e2dca9d4dcd6065f90c4c1f0c15c778fff1483d88278ec0141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffffd77b0a669cbb463a132bffa0d049778c440207602c1462a23e055baa83c92f7f000000008b483045022100eb06c4c624e3714836a93aea91791d0a1af9e01cd008fd478524566d2d0f1b49022029643a7fb1df2e81c72c4a6a14e0827eefe6f8d35b000ff50607623e0355c1ab0141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffff54cd089d6f8e6c2da46157228f60381144214039daaafcb7e60fe8c5f93db656010000008a473044022069fdedb0962f635a1e5d54d7a2234031ab849949b7d4738755fe0992be58f89f0220757dfe6e93edd3ca5710d78bd351023adcf4089ddbc7a8ff2abc60d93dd442920141043eac9a482884575fe2e1134ffa08d2e0cefaf66cc69522a73b95ae97c118f39b1cc6ed985c16cbc87f255bcafa39f56e612c775ba08085b157533711988f62e5ffffffff02b5400701000000001976a91497beda08251d956d1980fe405a279efceede7fd788ac58eb0100000000001976a914ba6a7f681e57d26f1552f70db941e24b8f1ab8b188ac0000000001000000150eedd54621891ad92feaee4c468687bf67d7193c9d811207285d3b7460808921010000006a47304402207b88c2d304048943bea1312de0839bbfa143256993b3aedee941eda03a9f64e30220769016ee38f38742c68341cdcb24d215420bfdfbace3cfee18c7b758e9431b5401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff02afbb3a433b9d188a22f52f480cdc45c77f255672c554dcaa831c8ceb4ac3ba000000006a47304402202dff316b95f35609f95589739fe228037700c6e836fc9f9f99f5da8eeca9c8fe02204789cdcb64e945ac4931c5b2d983530791b5d96ea5b8bec87c0d022ffab150b401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff7b5b7fd0925ac938f1392bb7713720dda0e6b7157102c0aa5ede80c27223f0e7000000006a47304402202c47a78f7b8884593e1639a8179d8dd5e752f8f4edf39484a5d01782ac5ea50c022041fa721de6c0c6ab76de8b00906fed2585473152cf141bcd7f8e8697bbc23c8d01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffcfe9cdc298dd823043bdeae08b2a77dde165e7a1029ea59697c26d6670694c03010000006a4730440220225a95dcb69a5be677246464266f3400a2ffef4247ef835ad4f901acacb1e5d8022042556522af5ac96cf824c56d5961c289a6036bf99466835ef37e868b7bf569aa01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297ffffffffff75d01e9762648cfdb7f0260bc1121e1231194bc27394cafb2cc9b8e448fefcd000000006a4730440220088cf2d9d37c0fa86ed25b3149508b3897a8be8ed3ed734a8f3903a132ca5618022041daea99c62b965a8c4a9db436c5e9c4dfc3fea2b0f39b5f1f0b96b34d7761bb01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff797e2f85ceacd5f3977c81a74517b2182644b73e1b7464a9436c782b3f9b4bbf000000006a47304402206c392031f451252e477e179470b34ff79c6d48cf15e4f1fe92b83d877bbc5abf0220541b0b9898925c9fdf7f2ea99d8561f9aa87e79f3493c92e8ec4a3f7f09f513e01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffd84fbddeb99ff93cf060bbe4af957a64e2e04727e24bcb70160ab8a3ac83675e010000006b4830450221009a39f1e1bcb9ab5287b72edaf03a6036565f51f1b825f01bdac34558a5fdb69502206c4521a1aa007fcec81967f1d02900269f924080e29812a99095de720c111b9201210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffb7885dfbd3f500f70bf97ade65a99bd1c4b10b6472e8c4854dfa3f2ed3ed7eca010000006a47304402203feb717ebbc9a5cf34a3916c859d29642f192dabc3a807921fb20a43b951d2740220170b8a2a59aaee95ed2ce827639e1951d7d04b9d68631003393d8ce5bbbeb7c901210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff33c7bfc2a09acd285ffc99b2c1c538da6ed91fbb23dd0ba7c1c0cc175ef8500e000000006a473044022042bdec211b828b4fb35ab1e963f3c75f800fe5bace1124e9a3b79c347f85ffb6022058759a71b31c7e535a7cd2a5eacbdc54d1a7dc06d89a29d524c155688d07327501210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff37eeadbb03b8ca49ea492ae875dee9a3404b4ee228efc659dc8f650a5b2f1a7b010000006b483045022100d8fe0e0d8e720822c606fde1a7bedee01630152e8ba5129a55e347e57afb4a4802201cac9c33715ae981192b40e499437a41832dfcb4027d301e27290690e8d56b2001210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff083f33a77c8c0b09f991fd388e3c1aa3fdc02720c0fc48d7e9b05453f1c6f21b000000006a473044022042ace20a648f25e079d0cf1ecdf9ad74e562a7018bc7ff53b94bba4f8cae9e850220192e04b9c43d27153faa5fca60b1e06fc3cddfcd76855642e928e8a6f664ec8301210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff5a8725e516a928f28bdfa797f9b5b4a91c5e4a4508a3df7b3464974b28d1305f000000006a4730440220559a4d1f3954f6b4fff71309430465e763f5e6d6ceb08e5a8ace8c0748b011f5022073456ef435d190262bacf6ac9457ce62128c457aa24b1f5aca2ab6f1b361a06901210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff3e423119b68bad2292d499c961635be354e6034c2a6153cbc9a1485b739afa87000000006b483045022100d7c4117dee84e7e76f676c4498365bd375629289894043cd610086aa374ae21e022052aded807dd2ccd92e177caa5d08db7958d5f0b52a55e03d36caeebbc9c82cc701210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff941f1736686e63d810ce0252f1331346493376336b03704d2ddac3ead9afe863000000006a47304402206d4f16732e9ead1a3a89c43b44c24200273e989a428547d3322f9c8b844aec6e0220197b836473145bb8c1f7ab957522f6497c9be7a7fd250aecca8f736562772c1001210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff42ed61bdb2892be9b71023ae7cbd3d90b0e44813a040f2a60a0e99ad23d3d566000000006b483045022100f154cd7a6ed77ee70e1b8cf3bfa2c66ad874a5b0410427f720c2b64035f3d27102200529948c63c3ed4535e76ac57eeee5d5abd4999e406b6ed899624d9c9b8cb2db01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffff0bea498798c3d19ab17df6df9668b3aeee2e7dab6fed11e71781ae101e3658010000006b483045022100d749f1b9cf784ad11b5bb671eb944ab80301f0ff06a9f1b97b3251d953790fb002203b0d633b6e67c74cf055c395d96746bcbd9d8f303d8db91a24b02150dac29cca01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffffce51322b39beb0f2cf12e48116f0f71c1995d955f7d71a79f6a601d6086bdf40010000006b483045022100cfeb04a2e44f6cc6537e7f494b529cbef1ade4f962a6a1bd91b8a2b7def03ed9022075c21a8f6809580c638aeaa28f518464f72e706cce327d627c56c89c3a24403e01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff7470bc83cf4651168def54f7e0caed83deb07ebc9799d1b34b10783983d65ed4000000006b483045022100bb8164b1ee21ab3dab377a357c87182e97eb093ed85142f7f144b09a884f3ae002204272632ecae7c02381ab2d338ec0eaf175a2c5a8d96588424f2f49581a341ec501210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff82884510e0f02eb232b590f0787f5847c893a8defc86b26af5e3cd921b9a1844000000006b483045022100bb66b2f7783c2013d603906ae09daba23d35c30986418fcaed1c3a16026868b40220285e53dc57ddfff8b493446519f6b559ac08dc36925434f0ca6868e61293776401210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff9f086f236860ac3222d043070c5a91a518be797f36429a9e79fb911e62521ff9010000006b483045022100ab794c98373b7b244d4321457b7674039d309fedfefa8a4659c8cd6b8195879e02206d8a6e913db5f7cab8372b81fb9d0c12068ac0bd08763ba390f31d424c1c66ef01210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff83950d4f7573ca6888f2fb28b84c33affa02873c4681ea410735bfcd2edc2b38010000006a4730440220716a57a77ca12743b5d7b9623de2ea8014e5c528bd5adbb713ec5260f168cc4702206b58bb0599c80ae059b6e66352e40b9dd20ecf4c175e58eabf28e8f1495924f801210279c10b608c0115a074494e2d3004aeca33addade2665f0ac0792bff07414297fffffffff0240420f00000000001976a914aa6d73b74d2308700d1706d374b1c781eaa0eb2688ac2f8c0600000000001976a914397052deb932aee90755dd067d8bda82f6c5653888ac000000000100000008819eefc91324f7c59824140102d16cab155074d3c0e6c30799aad00b7b015d0b010000006b483045022100a8b51bdd1c041fb88fee8957ac9d31d41de594676269b298ae5a70652b8215ed02203050b1568f2f21aec6c1a48bbcc71fda0979a426a7d03d7b212666b9473d8fc10121038a67981e039f40b34b6293102a508a5591ee119e1b66ac37dc9e4a0399138081ffffffff987ea93417c0ebf535d5e480ccd3cb3c0a6eca0d017d459b25ed07fee646e960000000006a47304402203603dd25abe3af32c228158158cc9a721bef053da3a41a65fab8d6787003384d02203dc49c4ccb2a0bb7897ef8c4bf354cd0bedfe09e2c4f0ce98a78150ce522a726012103176e1a4f9910e4a76bf4a472e2383fc2709f7e0d3bd788320dc5971a91224120ffffffff0afdc709516ff038a4447555b8af227c77fe44628470ace25cd16bdea0d60f50000000006a473044022059d131f21d082791c3e6a8ca3dbe1f72c7c843b170293e463eed11451db42dfb022026e72d4755e3e2138f472cd311574139eb1e4401d8457e4667cd5200ad170b4501210237e1e8eb9d04ba5e6607d8b2d252dc9bb6cfe4b2e63972bdb456853a597faaeeffffffff91fbfa5aa15c2d73967f15996c12679a182b6b3d41a78ca7c51c4efacce8be62000000006a473044022075a867cae15103357adc16737fa35b7b6b0e48754dd9688cf1a47ec69e1a2755022030fa16e42fe268a983302786504efcc7d930e6d22b8825145118436c70c889600121021d27865370d508559487fe37a9769852a8f13ddcc991b45c4d60df94e2b2ecbdffffffff9d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5350000006b4830450221009ff69b9ea160997d978ac8cba7aef5c42d1004d9f295ec72fcc873d061a27882022008ae5242175a2d781dac8eb68b3657ea025231beb8ea9ed5d827e2e6d685e156012103630d5d09a52aafade1a0d67ef94d1ec8fe036866c9a82cf1a2f71161a1721be4ffffffff9d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5780000006b483045022100ba72b7c49f41d76b96087e6842ebec0f741d0b5e2c6638deae6b4b0854ffae84022056ad077a81045366d8a5624277b30e65ad4a58e2944e20ac5e381a9b67747c90012103b69a2b64ddf7df334dfe4f682d646d27db6f85392e002c3014334e2e75cb447bffffffffbd3e33cf249fa8b9155c9ec2e92fc27abf9a0f9167e3975d466a4a6b4bce803a010000006a4730440220013c9cd0fa7ec8129b55dd083ef3ae5897bb22929259354ed4757195a061521e02202d51f2d1b23ab92037139818d3704db268c5e1f512511e89dea770e6172a0634012102203d41c4ef66496d4cc2116e63dc5d1652c52793c15d69fb03d4e4df80dfb330ffffffff0991589b0f4ef4cafe6eff660bf245059c997dd97c1b08f76520a3d50b298f2e010000006b483045022100b6e571b595ba04dd47035ad43c8d1849eea92bda67112ad92c392feec5574a37022012de75047eefa4de5f0136e33fed8c3d000f4489b2ff6f9b5b51af1db2bad080012102490b994a22bbb1e4cfdc374ffc89a482a1ee327483e9ba674617471b9e3f5cdaffffffff0311620f00000000001976a91498b68ac8c1b4f6be5ed097094ebd99df8b73989988acc09ee605000000001976a9143ea27cb55ca64e3672cb0bfc5500cf881a4fe85d88acc0d45407000000001976a914f87e8dff7e529699bff8e621acb7738b15ef0bd388ac0000000001000000024ce5339ba62ac895696f36436d97bf4e014d425121107e159429d806c436432601000000fc0047304402202ed540b1a1de820ee3a9bd5c51b864c3e80fe1db0169ac7c25efc3daf8e1b47c0220508dd345d5582bcf00a862463c502aea752dabfa41254487633c3dcde03f5ea301473044022037edee8fa4447e5b036a2a0480dbf8d1d5e622406ccc59fa7e357b973eb9220c02206f96603ed379bbaaf1550569653464cd92ba6ebbfd9ef5a4a2c42ca1e22827ea014c695221029e4109cc1472143ac35d17d08d6f23fe95c24b5a9c360b16063b23ecf6e7f7242102bbf21f7d822c684224fc2b86ab9564be7288a3e28e473a5a63bac2dedb29e1fa210358ad8427e4a13647f0b97341a005b936333247de7f5740216c5578f1e3e5e7ba53aeffffffff88611fc3c1368c2b8c42992ac6b17d8bff53ffe371ebc48f895534b46b791a3803000000fc00473044022038d5cb150f634d53516f660c89053a0ca37da9b956afcf815bf167375a0b7a100220392d823fcc331f783aa934ff173b9b3fdca16c17726686dabf86518299a44e6b014730440220046f01c9ebdda922b12900b0060a1dd1a4392cb68f046ac011d7dbd59a897ae802200797854853844761b9ece265904efdc805f97db7ed42f23f7e42f22bcbed23f9014c69522102a995fb65c2cf5fbf92064447b9d1c215fc92f05355e30f7b52ebd91e15bcadbe21028fa5722254d3e8917ba54710c0cc427d8a1bbe4e89e399e555fa633c65cbaa85210286aa0a6003d61f7040799f08b30f089b2049081de19af7cc6861cd8eb977ff8f53aeffffffff02dfd695000000000017a9143ad3245fa0d8c4a9314a65f325356f7a60dd85978764d24100000000001976a914857acf0e97e5c52b370fdabe2a3872e188d2955088ac000000000100000004a9808d72e1fb42366be1dd5a9a849438b4a3d35435c484e79e2c6001d767a6d3010000006a473044022017d281968d4da62840e5c4efb2734752fc1b78296272abbfe97ab76cc2af03b0022038697aedb4b5a81b19ea05e17ae678e3035728f4e53adf762bd712efd35977de012103360baebd37277e4879282f1f1445145d7238eb7da0ad6cdee36f7b22f69b76acffffffffa9808d72e1fb42366be1dd5a9a849438b4a3d35435c484e79e2c6001d767a6d3020000006a47304402207237b7946d79f65ab032fee607be84be3b992b4ca8b4907cbfe0f30b85f942130220446f740dffa39156d9456beac476f825d56cb0868df6350446fcaa77f9cfe225012102992c388ddeaf6764013956c6ec5f33bb431307657033fecf332495a7fb32dd76ffffffff6eb389b5739d777abd643047ac6b950f70cb45f76be05c75180d7b0e390e5504000000006a4730440220357eb3025a9a0837c8fe303c75833ea49c357b20cca0d67e081f6d9e094d53b202200fd16e60d8fd2ebed24e7db7719f74cef80e380b14d2c5e87f27486a3dde3d85012102456b9254fe15ba0bf29261cfbe2b00841e4d7c5fb62aa35f01d3f74c4f3200d2ffffffff6eb389b5739d777abd643047ac6b950f70cb45f76be05c75180d7b0e390e5504010000006a47304402202b1e82c6aa5005038db66bf95b17bb3c82f3c560395e942a0bb677e2c28ffdd40220354658cc698727e7d3e3047b6dbc1b10f480ec8902f7e7f9a134106cc201e77e01210291950e0069791a1f322d6e6473b10a86f725e89c18e155b3160fcbf3b733134affffffff0200374105000000001976a91406966b3f4bce3e79188f97c6cb3a84612535624d88ac4025c309000000001976a9148b147bd57edd9ba2c9e8e232550357292707507c88ac0000000001000000042f69d910e0a58b18ebd7563c4cad735b154354b216a84670e4650d1097f9058c010000006a473044022026b54d47527544ef8470cfc09fe335d5de83b939ea14a1a543abafe5897d865902202ec5eed1d3c3ee8685077500988b591c90e5ead92a257d8fd83fdfe97625c7fb012103921c3e7f6d8a26271aa669c9241ffed0431fecba2009b225a05345bd4b922802ffffffffc1474b48ce5362b74a05475263e200f7f14f57938caa7c81bce5fb1fbfcefefa010000006b48304502210090c270be6b78f1de566f9a44daebc9d4167d1fcc25f30c66d4519b48bc252472022073eefdb9a758ae4f285976261582dce6dbbf6baf6bc739d2602076e12974c73a012103d42441bb555ca6e389ac2623c291ee3f2980d9ef365b5531011bc955c46e2e28ffffffff2f69d910e0a58b18ebd7563c4cad735b154354b216a84670e4650d1097f9058c000000006a473044022015dc0ee31f5664058620fe1ed142549947d16ecdd3548727b472387a332f43f1022075ff617cdc0e75ffa9a8a88638e0c6417ea15dd428fa16a41f0e4172bc05296e012103667504a3bc7405cb4089d11284e99aa2d6c85b95cbd2bc7b45839241309790e3ffffffff21584474d6b0b4bc8c53c9cc4b09534265fcc103e9d27a4a8f89c2e39d41b310010000006a473044022016ac7f38d01eb11cc0111c06cb4b1033b2c709fa895391921c61dc0f957a058f02206611b4a1aa8422c9444c2b16bd669f8db9c823969dd9d32be405fb05f6cc169b01210225326486858039f7de923689da08567de6b59220b5c94c75fa7806ab7ae16d02ffffffff02e87ee30f000000001976a9141cfe17bcc5282df694a3adbad05b33e86cd04ac288ac58ea9112000000001976a914c3f482774ab14e68fbbcc9b9b6005e7412aa5dab88ac000000000100000004d86d31a392e340db1849f153f4ead374dd69a98d280a21cf413ea31dd2507e22010000006b483045022100fad3eed203cf675e387c13070f12a62985d195dd0e98ff14663192c37f69f5dc02206a7d4b7251e4cc0edddeb8f527a981fde93868ece07eff6781d2e44716e7035f0121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff4aac8cdeab369a8bf5ca943709aa1f5d0a0d1796c80c0840e775c19fcd956283000000006b4830450221009d28de08114d2863032c1b8485618b296bc353fe82610e18fe0bc47c2817741a02203eca8b045a772baaab987253e7c12ce9ffc1b4afb6b3c00dd945f2aa10297da70121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff5a4acd796bfc7ae82a621d423944763de029b621d6c64bff2332ff265a293675010000006a47304402204f874e721b0642d46406d4d542dd42550f7976f763edea22be776857674091e8022016985b0c857aed4b51d9089a8a9d19bd0b37b5ca85ce77545899a049eb9ea4770121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4cefffffffff44b23bc15d7e2d7360f75d0c6055a1054d5eaafa80bbbb8e41c7ff72314e459010000006a4730440220526d0c617a3eee31d7073768e921c10d45b1404f9d0353d36f25bcbd8fae829402200f9998d6013731e6ac9b4a72c207e0f7ca662cc7b2ed2a8e1019358eca3c9d530121024040f6ba07fffc5690eb30ac31ee613d78c9747677443731e173b5f9b2c0b4ceffffffff02002f6859000000001976a914872166765f45d3125a6e7b464c6adb42b44b80ed88ac76671511000000001976a914187381f0dc68434d35a2acf06b763ae25bb658b588ac0000000001000000046f86122af2abc36cd18b9017f5e218d0aeb0d48cd8d678ded1f3b7220a416fa3000000006b483045022100cfa0f801e12e7f9e2996fd57c51b3e0964cc2ec77cc871b2b20669af6027fd7e02201596d6e2cc05c85c1f1b15e3cc233bb1212ac6a1f578e8e37ba522399e9c1691012102e17409d4791004d9a3b385f38488f4b23733b25786512cd93a8010cc9a2aa9ecffffffff04581122477ae8acebbd7478151f823889d65df1ba47f1da0121cca34da0d36d010000006a473044022079e1496a985d36b491a422b172c24f5759411972b23f576b1413c6616890f16102203cd56961761bd5195e0800a3e6533cd88ba7077e849756ed1cc170105b6bc8f9012103fc048737cb94121174f58a314ea6c1a0005916fef76caddf0dfdafee83d17c2affffffff8f353e7d36e3fb1c11fc9f7e3b2dd50e86609646c0bc01f729946dec6687db33000000006b4830450221009c656ef4c7adecc1e10ed57f0ec7a6e9239bc7be2b09eb947396da37646e08790220142a96f0b572b72f91feb6fececb876eacfc3214c0b953b790db3fdbaf4a38be012103247e0e71ee443bb9b1de408b97d87649fe5754d80a3242175720c1b3092221c8ffffffff49f6541e700d9a821791dada89ad66e5b5e214486ba4d60caa30b2428370b9e1000000006a473044022020369771d94f1a424c67c4bbaab02bb4b23d36e25963ef32876b1b5d6ffce60d0220486ef8e02ae9e7bd2a07510aea84c9ffa517cc33cd85421683359959af9d046d012103b2bfd7dd05d860c989b3e2036a13d7ded1ef9ea7371e6c0ba9a49919d3bc718dffffffff023c481900000000001976a914df9dc0d20149390c51d0db0be76c24d1cdbac56388ac85d71b00000000001976a9149132e50950edf4e22b0913e20cf268dc328c484288ac000000000100000004c091f9d6b044a1fd252868ec88a925f68c97e3890aed180c3624fffeb62e6bb0000000006b483045022100af59c0874ecdf4c86306d7b4290ecb2efa7aab34df95f11a62ce9e1e5be38748022078df0c8dd9a39d44afddc9cabf4a7b649c6e2cc729584fc28a1153d89ac4429c012103b215067780dc087cf64bf86e3bef6458a4702e24d8a1a64786912ed6a8f04cb2ffffffff09b0aa0461429865d6bd65788ea7c3ca723877bd45826d7ac3c9aeb681b04f5c070000006b483045022100a760218c4c33cf40e8be1eb8e642a976e6f46b2fa0fc136a74a9b237711426a002200cb66f03fa88897f825f788e4a78ccf5f993f788bf0c912b5e4213802ff92879012102ec7e292405b2d9650af62312ce38f3d224a735ede955a7b62a67f0a487dc20e6ffffffffd45f83dfd49dcadf02ac6716c39d5d7b79cf2915466e2bb2347d14d353a2b49d050000006b483045022100858917399df867452d179347950d966b5964ddfa136cda7f51bf0002bf908e9e02203b07ecac7ae839da535e3113a7a792c71fffca257a1576f651838330587378ab0121030d842fdef76774c27c0219b891fd7aa0648ca647f009853caead84b2c822d2fbffffffff04eada01f1cf34f211ac22a7323629043b9852a6e3c157fef26a2df9229d206c000000006a4730440220280f97135e20900536bc6ec1809ab907efb81c1c5f2cbd741cf2b0051a5378f90220699754cf3eed6da597ea4b4cd964522f42ad39f0319a95a5dea0e0a53aa74e9b012102e36500ea9b9af4cf1f7b70461614bc427a72443190ecf032ccb53ae19f0e53c0ffffffff025d450f00000000001976a9143704bb5562051db89b7ffaf94ace4d49ad5b11c488ac01199404000000001976a91473f4cfee8d7f66ca82f82baca6c54fe8603c8c0488ac000000000100000004a76b969761615a5671cedba45a67f8051faa3be672aa0e2ab765d3e1e9406669000000006b483045022100e36e9a28711c767300434f3be36e98b7fe248e146091b1469e50f6b48959a02d022018b8e9f724853c59ba686b887d01488c22e11c84986a25fc09defd51ff7fd0310121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffffe6cfaac578c5caebda5aee698466583532b262bcc5d3c51e5da93054dca6111c000000006b48304502210094b8d219a82efe1be7a9d842859dd23ce195e7aad99bca186bf9539a7eb8da610220784353a960e29bd8d0d51d8d1887f968a4b5abd53ef2d70442aa97a45fcc866f0121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff53ec47319ef2c9daf1f34164d5174fa9f1b5104544598e3e2de1b2bbcc2eda44000000006b483045022100dd4533718b05d90121fbc6d1115d1932b325ce9936f8f667359af3d180c0aa4c02206f2d9fc7dc8b2b5e98134755baaa8637782eea74f9f32d5a4c12974f552256f90121031d696aa1ce74877b8c64a2332e701a09a5d87664dc7e8e8b4163d5ebcf77adaaffffffff5ce0040a695fcb46a324f93ebdc0bc171c3820e082e42aa09976ab4ee561737a010000006a473044022072977b3c4c552ef0f59b516f755006615513ce68fd0a43f6820a9cec9835cb9602201e7f77d450981e2646de2e382af3847bc597cda3a5add10310b727404717804c012102715cb8c7ebeb081b2126092171aaad613a0ecf61cfb6b454e1a9f3a4d1e25022ffffffff02a0261100000000001976a914004a0481479b06d262a066121ec8d1423a04f3e988ac70d23703000000001976a91438860090779c6df12ea41cbe472359b62957527188ac00000000010000000b81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd000000006b483045022100ac4fd58a8fbd2313e5ac0e43309ba7f5094d1589a241ab83e945f3962065befd02202c6bccf44c87ce7ed94844c0157a4e75e2663388e7fa6c26843043c14d0153ac01210370bda3953f887ea377fcaedbbe70b1fb3bb8f1706e33890fc19762191ae975f0ffffffff81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd030000006a47304402206b1f047b474de8f6019292930e0a83e24249fce870c9d82f7560cf7dd5ac496a022044366d8e639f0d5704e5aaff6c2f2a90fb45ddc3567f8c1df62d2f70757e4fef0121037306a3293f071ff9f2bf11cd6cee6f8ae1fb37e1b2f40397eb403e2e6c0afb38ffffffff81bc3de513c67613d87cb7a9f2a1724fae68d31398f3a14816d695311e4c45bd070000006b483045022100b47d46a53028b8958be5533d2ecc992adf47576071e823e3bc72dcf0f0542c1602206e928913281dc8ec19931ffa50f5451363a0ab9e719664173a67215517e8d0a50121024a512e398d4809589bf61bc9d883f5a7b261d16d3f7ac0b51f345a090c53a372ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4000000006b483045022100eb88e519991237c788d25251031cde1660177031bd7256e900f9ef81578c437d022071abad8e8339346471acd4e7afbb2f9fd673d81b962484dd0e6789bdc4a51d25012103ced4017b04a849c4ce47340953c50d4d8e98420db4f7ec5a0299c3b331456517ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4020000006a473044022028d7cacf11e28566264a33f11dce836cdee5f25792a5c18817eec64f4eeea049022006a61c77e5e91ce6c0e84dd38fa8948b3076c9a6b2f197fd57c12146e3c873ab0121032725d4e881be5db8a2e4b409b2b541d4a3c2831434277be38958ecf46a720074ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4040000006b483045022100d12e475e9bb6600d7c0fa72196b2965302b03684141bc6468d11c4a423bf44f4022075ca23aaf7d00882d6d952629428ad7d42a1d78d8cdb116f71b6735b0e5f4b040121033b20a6374c5c9b28c286037e482c06a6987994606dc6cd0f8600522ddcdb8857ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4050000006a47304402203a2202058f683d5030499ef64f84dcb699d4bc271fc9c066faf20113a4458a4f022045326903e2249910abfe1fb6172cf6255c8bff7edd4893f36a8e694b20f5e89d0121031c6c03f8be7fa1d02a5c08a6917ab587fe575c76bf1ef9e18978def130bb57d5ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4060000006b4830450221008eb76c20bc8cec96c2ea68d2cb6d41579b7f2832ae8af062a97df207af5ad1fa02205622b0c7f6a8cbe82e7b28e749b306af3ea272e4b63c6f3a891e7d2e79c67b63012102e143780bc5aacf49eb2f6a7dee340d7e36fd392558dc6b485e66da6ec8e61e5affffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4080000006a4730440220169d51188e8bcedd2f8117724324450d27cfec90e4a9142ad62ccffd83a51418022016b46a2a7fe1270dfb729da7d6b21c2f4efcaa0e9a033fd3a914f01c4cc9564c0121034d5b5b22be51662a7bf43194e8a818e7a6338775dd4ec9f70c9133982f71f3a9ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e4090000006b483045022100fe880738419f23d538debd15e9a6f2bc54f8adb66e6016097eaed63aa1f5c0e1022019237739ea8932041f4cea6c0a7d66ece41197b4edb3a1a8d4288276595be5ff012102dade633be2b53b6bb33d1216fcd839f37079af8c0d27b37dad1d23da2a724534ffffffff45860c1e6813ce5c8d9b6b7d1ef198ef1b6e442283cabb5a065f3003d442f3e40a0000006b483045022100a443e547efd6ca3bfed49af73ba1da0b1dfcf573df61c4b4bc2b743c3bcfeb1902201927fef3938aa0ba247baadf065eabf46624965ed705819c9c30131b4297f77a0121022d4aef0b943ff10a5db9cee175d6b677a0279bf740b85a3bffb38956b95fc9d0ffffffff0b00e1f505000000001976a9144f34965f7cf7468b1c5cb931ec0dac228450c7ba88ac00e1f505000000001976a914d0b0b7b3bc6e40cea4244ed4cfd98792e06731b088aca7a91000000000001976a914fb5621da951819e6c8e197dbeccd39dcc12034a388ac00e1f505000000001976a9146ed40a32dbea9cdb31a53ed36dfdbbde073adbaa88ac00e1f505000000001976a914dd8fb366dc97c7d61dc387d1cc5b31403dac35b088ac00e1f505000000001976a914b0c89352d5a4e9d55d4630b927b759addae6587988ac00e1f505000000001976a914d8bd8f30b4afa83d35d51ad07d7bfdfce5f3421088ac00e1f505000000001976a9143377aefeb352fbefc7ff051e33b417806fd5772788ac00e1f505000000001976a9142383aefb128b96b8fa51388017531d852de839c588ac00e1f505000000001976a914a3081442f2531f62d4dd7c2ce3b04cb63a15874e88ac00e1f505000000001976a914af5f1ff37d57c8c6031cb8a3c3a0e8e69b72bb9788ac0000000001000000043048434b55617a71edbc0aad8fb45486c69043e4df6c920ccc8e3d834dca046c450000006a473044022054a9c5d67f961ec7af89680e72ab3343c9d3de734e824c69b4fa77956e10f8610220217a0b1bb8f9ac186a6859df1925ef682675da504657b4beeb6f89ca34e2791101210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff43d6b66beb75fab0b69bc0e9eba35bc83ec51cde13fc0e93400241324f695e9bff0000006c493046022100cb228150748d3b22354c004961e7c4adc8dc84b1df48017f866664c20ca52e9f022100d76507a0865d54b4ef85d7dba59d02a5162e5ba2de1871962e37b96f142a71a801210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff65e8ab5e443bd8fb64f149d726113cb638dd18e5d9eebaee321d61d05f4e56f11b0000006c493046022100af628ae05abd1a15796dcc70e6f3f5d18f2f47542425811e1ebd28d4cd70fed7022100b50c02835fa510ae42a1769458c67e8b7a3a7c16c3b3552c061670681306f87701210229b0a6c102bf5c905d4bcf7b6724221fd978ab4ad42dc50d6b7a4e29e4abf168ffffffff023b06deeb2a5ab76b49efb698a6595de7f4924a6cb286601e0907e4e4d955a9020000006a473044022049c0677bae6785795e4e73c036a8051e5973c6b161623cee67aa7165d71f221402204d5172511f479dc80f8f89b069c1b6c6c92eff4f78f7ff3a315279506f5d48c301210261106ecb8cf50532bd50c9189f1ee971e4869fcda56e2f1193e7d4def7eed785ffffffff02b3bc0100000000001976a914e2b94a36ed7c4abee24f8ac390940cf1645882cb88ac6ced0000000000001976a9144f45d231b5f69d9cbfdf4124a864ac0d8ad64d4188ac000000000100000002eddec1fc14de1645a7b534ae4b8123e5cf48c252382a16665b32dc72d9ff9323000000006b483045022100ca44dfa913702060b34f62f334f89cd582e3e6d4e7d28c2fd74fa531a04a974a022079f51032183f800bfb42693f1264852eff33b74ddd4589385b01aa576b18d79601210314f9b7d67d523a169e179faf44aa1ec37f80ca767573f742b7bd1f8046eeae60ffffffff4fe25062aac5f1784d173aabba656ce8f0542dfe6fae4e603dfb38eece1e493b010000006b483045022100f8ca99a3270f16366ba150ff3d67b8cde689e48d6af9d14a4263e34462157488022020c9469553fc50866484a639ec6550f44b666f7bf47d5891e0732f08b6b750b50121024239c436650505a685179c4465c43480b2dcf5ccf09cf8e5c9b987f83bf016c2ffffffff02b3bc0100000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88acc0910305000000001976a914abdab17d18308bfeb8470a846f9916514f96ed6988ac00000000010000000e1eccbdb45c491935639c9b66b72bf16d8c5576e17bb65d8efe5b1d3b2b2b2b3a000000006b4830450221008944db7ca3b10067425b511372322e8c00a62fbb86648215b1ce550ba19cfe7d0220761b2e6eb8b368eca17965df25b6962eda141434b6b875c5e5779f0c06826f09012102f5c481ef4d22a7e34821c8895713c7767a0d488b762073af1e9149e133616c70ffffffff832f06b1e87d12646afa819ac8d9726d7922e7b77f9a118090604c5ef84749d9000000006a47304402206427c7770555138d853f0a80dec5aa2a3e1af2a7bfff121624eab92ad86738da02204d6715086e2abc3ed1d9c01992f9cc1bab995ccaf241c28048603c5a7f7486f3012102512e8f9d11e85db35c25cebef218b145823401b1f1953d7b735671179c1996c5ffffffffcda6e2b0b4bbb3e2d7b1aaae693c638ab79ebfd9eb320724e2ec942c2c712530000000006a473044022035bb82942bec739e7053bf027d9a131d9ff4e418575b8664483f8a2c1d83ba4b02207cbc9ceeff08261da12867f61943cf1bda5ca68740e71b9dca8a6fa4d4e53b1d012103bc1ad40a3dff2ef9b20463e77f1f21fe84274ee72b032ca51fa96b7e572d2011ffffffff37c1202665c58da251423c09919ebf8846d25a729e5ad6f6e0189d6fe703ee66000000006b483045022100e60258b2ede8aff281f74bd61faecb34a700dfa1c365e7f28d13b070078e1833022052826be3a2754cb48febcdcdb30cea20421a4b0e2316456472c0ede41718886d01210322294cbfc1e382a5b679448d7f955c986a2563087fecebd456eb1d0a8e3fc39effffffffe42550ad7f4dcd3091efaf87b590be523c0f789acad0e8e455a211086173d40b010000006a473044022011fc06c473a9b01bb50026913f3ec993f4e113d97dacba2d8919bebe19968eb902204b5989c935c2cde6291dc9434f44380d1943a7d20ed5f11c716906b091f492e2012103198553c2ed54d3c000cec7c48fe330ffc81cd74166ee6d14d818f7d31d7da607ffffffff17903c7e53fdc3bb3a887a44449cb8f84d4e8192a23e0d68c3e2b3c40faecf41040000006a47304402205135b64bd95574ce423ef65d492f342f4f0b89974df1f80c8fa8e2ec734b303302201cbf925be716f2fbb4ca9373093caf751a8052c958579811bd6a70e59f4dd9c601210353597b12daf4531de465ced64d9e66f5659ab81507d6072d26758274f6d3bf17ffffffff256a0d2cf29b1e14b2e0cac4dcc34fc00989c1df6256da96921267ad19406178000000006b4830450221008c8096e7d8bfe717a6e5ade9f6ee80de545b4ea150a3eef7163bfb43af8213010220415dbffe504bf47a52f0ebca4a8273467aa1c726f193a57d6bbdc5a94a5d8023012102fa223797977099b1d2fe22fcff8fe0f22b8e3f0a31545fff8f6b15ad64ef1e92ffffffff0f493c25fada0542ef3678339f9efd24c318945e87e97667b165df02e90cc4d6000000006a47304402200cf194e8e45a11360a4fde3d7e5f8e8c145d87419a69c67f11a62ff8ed650031022046a6528f085db791a9d5681d3e73e8e737855c522f0ff83ee82ca6b19c23e172012102a210cf6f57f17cf4cfd379aa649f5977515472ba77d5fc23517d8746c8c6c48dffffffff9a6779c9e474b79c2c34133d114eb061d05b14304e5105e1f414d808c5f880ee000000006a47304402207b81d12d834f77b22353d68c6a7b300e6a5a8d9e5428c37f28d0e9f597e6d02302201d512bbefb2350ce0701400f308f3016eb5d70f2d3e7b8dbd39b9b2e776caddc012103e611396508c8648cfc348ac1167a227dcb08e2067448236b6288806558e2a9f4ffffffffceb2ff8d229274cabf76baf43d685ac4de2cf560e2adfcb99826cdcdbeefb66d000000006b483045022100dd151c8327b5c385f4ee572f5149383900118c099a19c2b1ed83263089b50d2e02207e58e74ba95fcf57618d3aebc109f46bac5f46d6005b234831c4c2c684d081b9012103bb7e4e7f87f3ec1e69d47042636bd60cc8fde3e2cfddc70ab5a58ea9902ecebfffffffff6941a70b4b3898d9ee26c15069a741b61d807978093af79eb809e9b4831d35e5020000006b4830450221009c066cf80849f8b4a0a3dce862c4647bdd5c0aba87ffe3c86fa3777f06457d8a022022dd2948a53402c8ee9148346b897281509e14594b3621820d6092d2567d739e012102a62b9da8d00a065563c4875b20c8d8626274fc9a0e098e7441aa9f30e3f07be6ffffffff741df0ace0c9848d676c21014fb7a64bc972dc5c1b9d09882e2dd05be0713a76000000006b483045022100fa07ce177cf69430978f858c248356f9f338a61e92e0b44cc7ad2ffd757621c3022063dd40b3d6a10ed7fd8424d589d3dde8b32ddc7b1f0285e4b21c80b3160ce938012103198553c2ed54d3c000cec7c48fe330ffc81cd74166ee6d14d818f7d31d7da607ffffffffdb65bbe6477accd63f09c9eae81dd849561f53f8d5347cb1cca63fbc54462918010000006b483045022100c307d054758453bb0d00d7351a3339fb0ddfaf9530e3e57d2325154002574757022009cd09bb5607c48b64453f1b1f1e548792c49c10d7df87566cf2ab154b06f0080121029c5139c0bd06ba5cd961d60bdfe0295735d45d0f261d2dc128577d94247d1892ffffffff91a1361ce520453c78aaed3edeebd7af223c67f99dfd7e4a75ecaf9bbcba3fc7000000006a4730440220370e0dfd3241f2aa1b0e6422cdb997e7cd5a0a18daa3fa5405f2835483538456022069608fde2084135ed7764fe3a775df9f79b4781c6475f822d6012522a7941cce0121025c94a0fa16542482cfad7cdefe74e2781be72b43a12ec543cbbba2a6a23627a8ffffffff020358f660000000001976a91421d9a838ced609f2f42528a2af4391854ee764c188acc4800f00000000001976a9143a2e1595324d2dbd05287d72a0f4cf0014b0f18388ac0000000001000000072e1539e1086947ea5fa180cb1b768acb9798033038c0c7e1f85abfeeee9524ac000000006a473044022040eaad587504e3dc05399500554fc7523617301ef4029090bee0be0c3429a22902202fca55961740c7c2227c774a6aef1e4ade5334788616d7ca3444db504d94411a01210233823b7b56598284786ba6d8cfd9ed418e09a87574be33059887c54e78f15449ffffffff93c715685f2aa2ac0deedd01d514c6f2cff438bfcaaad42f6590d5245115b861000000006b48304502210084db57a857b5130ea477d3dcf65b85a8b1f4d118edd27c257ddc1934bed0c788022051204153c48fda2998d35e88957d4c7f696e018d5f9e81095a3fea80fccdbf90012102667b9161b3a987d1ae75d08bd3caeb037bc05859ce4080c799b920e7de34152fffffffff59f28de28df36e4a65c1afe2d008824536332bd4156ef9a722391bb8dc93e6093f0000006a47304402202985d68865c240f401f1a5206293354df79016989370368ecd9d6bd6ad67437002205f55a7f97ceb235640cf677aa4bca049c2728e3896915317f7c15ae7f1f3139501210285a3bedbe36f3c54516684fb3ffad1421356654240d5a6ddf5b20ab971863762ffffffffead3e0d9e44369ffce58cd281c49d5ad8f39c49cb65fee366461a2f5c982cf4a000000006b4830450221008037a38815035343b71b44ee691bb026e087baefcaf8495c9762994b0a57c7a902207544797040e8bcf73a7328f53a77e823a482e2a8c902e3cfb9f73c0dff1fde6f0121038b6540428c0796c6a5328f114ea7edcf360e38ed893d14041de1bd57d917d19affffffffa76b5e0b1c7d5fbc43e2f698ba995d56865198e8439e7227b7bd0672091cf6e2000000006a47304402204eddf8d81b97845ca655bd7ae1a6e29275f17b4b1c301a20db0d420e3f9395980220527b2563153cfe48dfbd2671c294ca0af86a4a1083f6f4810fdf1499f1221cac012102f70467569a29375dae92d35c007d496de6733e930ea38ea29d47299793f2bc81ffffffff1dfa5428ad8c6047ca78d63f2f04a129059cde969076d65b38e47ca9e0e4cc88010000006a473044022010ebacba7832aeaa70b0874b61051de864f26e83630722fc8100e259953af149022052b707fdf8ce506690c0d0029afabc41fcff292b805966b25ca8e679289ddb7d01210282b42dc8fc746b376c1641f33cf7c64d222a703aff32455afe75e9176713d0a1ffffffff2948a2530101a4ed00167fec66d3b477d8348c421873f65d6f7507bc77055ede010000006b483045022100e007623f44b6a33322438aae23e4de3f256db3e69f3511e30f48bc644143c81c02202edf2d8401af6585d56ac30c7a83efd88a443834f7fa36c1f524a97c60652663012103c8487b70c2340b52542918815ffcaaa2623bd1b4d83ca0e3ade700e4dc9a6944ffffffff02f718601b000000001976a9146704f88d046d59c86d9deb2e29d237b9cc7e8ccf88acf1440f00000000001976a914260cfbf537d5401e5fe60c6ef9fa72348100d6c488ac0000000001000000196123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0a0000006b4830450221008525ee1d88c93e9b2e0d4997a0a5e986aed404def89984f7650e27d8cf07e5790220359777703be7bf01ffbadb124a5728863641746c7da6cb5c3b5bbab2f8930c04012103e4ee7b5391ef723aca40ab8240f4d9b58cb0f6936c84a450368b8b1baae29a0dffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae7120000006b483045022100b77485adad1a5c364b48558f71425ae7a9a9e82fca0ad8faeac3967e26ce335d02205f362010c8c73e95a8d5e2e31e36b699ec67ea1e8659b4266b15384f73136d7a01210393e146a26868c645ee396844e37de0f935e1424123f5c0f56219b67cd7452fd3ffffffff11b2347e7261132e65c45a5a7b13536e8a64e7045bb3806846056ecdd3b97258110000006a47304402200d65120d022fc8d01e67014adeed2c7be47ef48c84606d04f58de1894505cc78022023ba7e93bccce8952c12c9168679ff9b0f3fbbce87180ccf025d45ef6c0372f10121035b987d0b0680a2dc3a6df57d4ab197b4f2346063f5056a866074b1547c90ca22ffffffff2547aecb2059ec30030e576e24505973f603b082b9f4613ee307ce0d45475fa9010000006b483045022100b8f8eacc70ed3e59d9dcfeb4b9752f2cf4649aca6096e14e954da4b84996b0d002202070968f771031476348fe7a0ebb07c9a334d95b3316953f00a887043afab4940121036f6cd5857ed89ebe2dfc5bcbda078f7cb586499acbbab4e310ddd1ad0dc8273effffffff800b9d1efefcbd90c435e63deaad265211c412877caeb786ced3c4f8f9d8a53f130000006b483045022100aff9cd832df2b974a8b06dc80455ca1f59557e3f23e22f1293e1bf0753b9a3d5022004155ab666c1b25502c793e1a66945d583364771c0ce15d2e366867ce6c2964c0121023fc53cb8fa5b23ccf95a8a8d16766cd754a256623820778b49d3bd808814c8d7ffffffff4c285e9e25b6799c9e19a65d5afd90e5a85a339ac29d1250c8d31535503049de0f0000006b483045022100db6779bfd8c15a29d5cc2d878b6cddcd71ee2cc5c6084f6e5db884d78e94d70502206f66be54472e08bf32b96333492938c089dbd7f8e6a1f441feda20d868dae59901210358afad1e50576f953d83c0a672dbf62623fef593cac3173eae5677e3451b090affffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208140000006a4730440220295be96d97a453e202805097a455ad0503b3fb62061cbe60ebe8e08f319834d402203bad741829ee78d9a858329f229118572f3c174ba37b3e9926018dd98d224475012102cbe176d942189550647429e6c092b135e7d257a45c32ea06686f158803c3d3edffffffff6b07d42eb24afac92e9f07f8937ae84e081394c110803dc8fa8f94e761aae3cd080000006b483045022100e2bf09bc5b67b1064dddfea96c56115b6a3a578e388fb6d9439abeb7f87228620220382e5794469975f626b09cc25520ddf0182e7cb0a58ab6804617273ac47b69e5012103c1b32a9d55335c7b5147c5bb80d1565845fea48c066583c912f60ea440c49b52fffffffff103049e0f0c7733038df7ac3cc3ee0ff18dae2e189283e0054f4b6611e3f6b9000000006b4830450221008f5d11da1b3ef7a0ac5e86e05ca503fddd8c4b2d86fa5e7416e569c7285a2a720220601af3499931e59a003e8069f2e04a01e8fbf8dc492fd5b5eda0b3d2f07c71d101210340f7a7827df5cdac10dc173d2f103a806a17496dbccd8a001e52d76f03050c80ffffffff6b07d42eb24afac92e9f07f8937ae84e081394c110803dc8fa8f94e761aae3cd0b0000006b483045022100f1156c6847ab6bc1a05b97c8b6d7e11c237c20e52155ca72632acdeeb19371a20220441d0a6fbabf83e0eda37e05b3b0a529f0d6235940b213ce6dcd60a576e3ed7c0121032c6c3eba03ac9b09130388468f07f4c03b2736cb73e8f8e870f8562f09350c0bffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208130000006b483045022100b9a5641cd8438395d311571d80eca4c16b9bc2cbda733f1e3dc83002325456e802205987bfc3c8c88c559ad07c568732ff899f93754f43a1291e2aa1cb83ef4502b4012103cdec1777bb145b9345df1875f15403070f408b9f69e40e4df4e9a7812a7a1374ffffffff8645c70310ba0f150c831ba92431cdba992b32348331b29f4b4e42151d674821110000006a473044022039c5649e2040b08134ebd78498fbe05c9dd5a3b7d9788fa84485a96f50533b40022021b96c3991d95b47585816c5914249d8e76f7237d0944c20586c35042ef1d9bb012102e0019fbdabc94eaa2323509f10feb15ef48a24a512b421fc0d27f74ff777a7f4ffffffff33de68e5fdf1302b3ecfc6e79b4da0f50810d4d98dcfec43e58913698555ea70090000006b483045022100f4cdb6558c11abb0da8ae21f6a7516f82a4b36c1af71fe8e93f41036d3d57e510220646477acbefbe10e679d0c8eba8a479bec25873a16f1d4022e34eb3922a4d2940121037f756d9be788b7d1d37472c890f2b9b6e7c73a897de7e2c4eebcd171b5d1b244ffffffff0652e525b82637a1838e85b889abb62d30c895b5642755147066f2a3e81af979040000006b48304502210085024477c17dad2e22fb55d2dace00dd2f2f028e14a38b47cc71e1ce0be018550220705dbd7e8b64baf8388d69a4cf0b516ff924d57dc8f9dad4d8b8e485f102d751012103da22982eface5c52469fab0b15ae7850369f892ff030e0223e4a90a4e296fa68ffffffff1f2ebf44f950419ff2498c15ee0c7e1be2c15374a2c8422d7476414852d56480010000006b4830450221009b07a4b6963fcc66c2118463225b52a75bec9fdf3863c4774ca836a5a5564eec0220239327d0df97b7e56d1cb2d401b12bf3185293c3dd10ea637410d21bf60b267b012103b0cdde22301f2a0ef9f23f435a52e989a244306440eb15c712d5e373a809fa8bffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae70e0000006a4730440220339e2bca1ecd2250b0657d8f6b8b2d353d35343f56abc231357dd44f6bb0839e022071b9a535803569e9ac5a490b6aca3f9492354892dcd0090bfbf98c3d58e8c049012103a02544af63026bcded0b7cb4195372cb5821ac34a55bebc3de5c83e8c2b930aaffffffff1646b1d8fe71e508a0a85b82858195a82176ec104b2b6505304de91bbd8faf93010000006a47304402203ab05e63ed3c88bd1157f6727b928c7f3ff0779dd16d87d37b840a310996db3102205f69015dca42744841cdd10878049a79d71759137f0a344bfce6a844ec48f8d1012103068056870eee1c8b00579edd794a2279282e8cafcd3b174ac0c593d0b80e86ffffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae70f0000006b483045022100afeea65ca40aeadb0adeaba2c959319d4ef6b2dc138629ebbb65b9908800ab16022077b98c4ed7de26c12c1262c89233a217979a8f878c7a42377ac4dbee253f0c660121030d93148f664dc156bb8b63152d319d5b4efbc77e3b843651d2208e4a488fa9abffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0c0000006b483045022100f5ac603c8795ca69bbb54d51f17b7123ccaed647245ed82b1392fa16d0741cb1022017cc07628f3442ade369442ed5152727ccb7bf506382c87afc5547d3ae8dec5301210384eaec7cc1826b5d8d6b5e44d2e72811813e87a34ff4ce4bb8b8fe3aef9b2ff6ffffffff4b641e8ebc9112552ddade99cf5c4b8816fc702be843eeb4a74b45c0fbd5f38a010000006b483045022100d0822f15f80058943608f832bbad476cfe74e836c7dc348ba0a9b38b37720f66022053dd5d7d14ae4171453a52e3966964cad0bde8912a28296145786356a856dde1012103eeaf93693efb47aaff34cc68976deef62e72561a86854ae18716619f66f29eedffffffff4b641e8ebc9112552ddade99cf5c4b8816fc702be843eeb4a74b45c0fbd5f38a000000006b483045022100a823704d9a2b4f0c51c21418cc111e739a3b90f011b6416d7dac4fb6c9097efa02205d860b0efd53518f62b85d284b550f4c422179a8d219f085d467305b5678d295012102c3f644ad5286b43c6a09b42c5435e87d760d4acf1ca2b1da9e0ce6daa08680f4ffffffffc8947469b161a17896486b273642576aca192b61b8c65fc10f7d400166f3eae7000000006a47304402204059941c017d85f8b47cfdc80021b1c23840065269c635c368390812e66bd5ee022057903722d7b25a3b69e13dda6c7aa04bb13b68b21499cb1279325489151df61e0121020cfd19b00cea2d696cd2602dbd8af999b997180ada23cb529103950426d31911ffffffff4dae1e41262cb398aa5fc8ec9aef959717a6630ff9ec4136c41f17882e22b8ea000000006a473044022016d06fa7ac16419210fa2bf31c208f7fda12a0d0dadc400b656f33f8189ba0ce02200831908cac90e133232ebf4794374a45a24ca6ca8b8acf9c16074bd784802a9f0121033ddf9500db250a5fcee739dec8a400d8b9b1c12ee89db3ebadfac4d9ca2224bcffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208090000006a47304402201f3db7a9bd47d98b402a4fd13e71bf9c9bec523d46c40dfe559399c9b61773a2022067c20c6de6e08b1d91cc867609983b537a05b081b9747760a2080036966e91c60121022e7b8f0cbaef47ab2c4718ef64608e61a842dfa0a8d81d3ad09db1ade341c03effffffff480cff04343adf2cb53f8eb28cd1fdf66ccdee8f1d0c856d7e248aace0cf1eba040000006b4830450221008930e7d678df725dc0af6e1f93713ea6f47250cfdd94a144f28ee8a10f4e102f02207c824df7bbb00c70007c4c40c70be7b79b92388ffeeef7decd4f1276d6e606950121021e46410e1f9aec2d74a6c41ed052820892c97962c918a306be72e1bfcfe3cdb9ffffffff1360566c00000000001976a9144ce1d946f1363e56cad54c08892cc9813a71785188aceeac0a00000000001976a914b3960cbeb5b40d62b92c90d8b8595df75ca6f32588ac90a38cda000000001976a9145f1708b2309af60159093043612e712c7187f6b388acc09a5e00000000001976a9149f12cbdf26ada0ec436edfb6aaaafd57f7a3989788acf0771195000000001976a914619975a78c21d3861c5ed1c0ce07653734aba4fa88ace03b6600000000001976a914016279a75b692e2894e2f526c955333695c2c7dd88ac00e6e849000000001976a914cd98fdd77ed0a1d2135291ac70920e35054ae56088ac40b56400000000001976a91486211625adfc6701c5af9143e0a0ac6d63916fdf88ac18ca0700000000001976a914d61c32ded3cdd773f06e109afb501ba4e6b18c7688ac50bc1600000000001976a914cd4a396eab9e4bc08829c94bda8466541682431388ac10270000000000001976a914b41bc220da5ecf631e50acbfdffdcf87fe493a9488ac10270000000000001976a914c0d16bd11bfb9494330102680a8b2c91ac8327c188acc0b6f394000000001976a914af647292f4c4d2e72e85a247450ad178db0c704688ac20f1ca00000000001976a914d380fd4164562b1be77cd9537f52c37f41e7f50388acb02e052a010000001976a91403d1cd2e83d105b05afca9e994072f54bc810c6688acb0481ce0000000001976a9143f32c0c9c9acb07a1476f0facf0b3cb38fc1c61588ac208b784f000000001976a914f65d9def92b48dc39df611f6dcdcebcbcad709bb88ac6e5c0100000000001976a9147e2a6256be6e638678577eea4621da469f02b83888acfed30a00000000001976a914cb1672c8495b4ece3a9de72d1def0ea2471eaa0688ac000000000100000011159fcc9cd142529d7e2460e835563ac6b801e07a16e18041ee8cc216fb323b35010000006a47304402207213ff7c207a465802e89f71b0b245d32702b16c03680a705183ac8809c648b802202dfc1850d5c7b0005482bd7b824dbf41c169d5830842f37b2991dc8bb831ace6012103ef3aa7c1538d0a3632ba9463af6c080129cadf4f6819117d962fc0e2b3fd2a33fffffffff511bfc106d4b4b6606d1f7e4c9aaa107073283b5f526fdf42cb10fb3ae67b38000000006b483045022100a3126f15b8c8e239c8537e2ff9327001cb56e6e742f40aaddb8ce4c1abc4d5dd0220510f953c1373daa6626daad1c51bf3d507e410ea85ce24361d6da1385c86f0be01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffffab864c168689d5fb2ccf5dc242573950f34e988ea89352c6563cc8153fde8a95020000006a4730440220292175f6371216e9bfb50fa8d0bf15cf2bd0be920fdf4cc2f25c01fb89ab90ba02202311fdef458a1fd2bbd9a3bebb86391d105e9e2d7f662bb64a32eecb6ab0b0160121039e177e244afca3dbbc5f4b60d7c16aa2ddbd7b68db94848a83c5eb809c4f64b8ffffffffaf638db891c1e05bd132981ee829ad71a73f3f0dd62e65b95d50d365acc865af010000006a47304402200992df12208525a173ba7c1a82e20874c38e1c575f80a330fd6ad0edc8bf4a4602204618fc927948d6f63b5fb9d069466be2c32761d8dc318e99e1c15c19a9739c5401210343863977b70823235cdbcc671c47a0a5472050e716b6b3571b4af1d28a204ba7ffffffffaf638db891c1e05bd132981ee829ad71a73f3f0dd62e65b95d50d365acc865af000000006b483045022100c701b4b5f9d63423d7ba4dd0dd29ffdc45ee76a351e79603acbcbc4bcbb756d30220746316af1b4474ab1f81652f1b8dbf5b18d79b5b3b2c01b40fc17333033dc3060121037590a1fc8f5f24bdb772aec49046f0d83e9a428b1d919189334114251c6c15fdffffffffdd7139e8604d13a5b09787feef3e91bba6898c685c2f0e9b5ae949cabeb6b9e8060000006b483045022100e6ad6cf7732a1785d12b3c5702f18cc0efca1568b909cf4ec1e6256655ad6729022005d85ef35540a9a91f2e0550f57c110efe0f10aee1465990f8d3fe0048fe5c3101210336568f57547fa9f47a7cb75f0c167546e5f87f0bf3f749c4ff43b487d6ce38c5fffffffffbd78550e1c457c6f0326981ce521da3dd8fddb73661945d82bd2c0a76e85c47000000006a473044022031fde10873a191e5c31952b5d871ad9be7f1764f2cae14cde2df85e5297e22df022038b9f6ccae01e0956cd0eab2ec30208e4c0d857b1b3a156b7856495d7cb59efd01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffff0173d0c9738b32500bf14042e397825aed73d2ee3efc32142a00820d2f3748b5000000008b483045022100b186a7af6046364e753085532f867d1f7cd0d9f06561eec99b8c2847629b5c6d02202d1de5c096b1717090f9d1c62a9ff8220303fc9bf62d9e419836c0bb02dcaec50141040739d353e3a1aa48c1bf99147ba24b05d6007e36af91480837db45d8614c993169a8a763919cb73cf98a46baad0c8828e95b11f5a433baa84113c52df576365affffffffb7402b75a9b8ac0d486ce49d8a1cd9c5434ada499d261035c56bd93ed29b01cc080000006b483045022100ada6870f2b7825b138ebbfb97d80bece1c945d50be48d02ddd9c6bcd88094f9302200b7d4ece236cca2f8c92f7fea7ed187e456a3b3093bc578cba57efb3e2b62733012102359edfb963073a606c50b6985e486895744595d90377c147a50f7e063759084effffffff6fd4e89c8fdbf8d056b596f26f96ae5c6d22a14c13d5364f8514636974e4d3bc000000006b483045022100c8ce1e4a696b8284aa2e446007533bfb66fe6b6c4508055e0294089fb3152229022026d3555980816100088a0cbf2e2ef05a71d80cb2bad3a5f18076206a94a35dda01210261d83898b6610809fbc2d5897dcd645acf86704e61a1acddeb5fe4b98dc4aa35ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560f0000006a47304402203edb601dd4b39abf32e2f36b5463345516114c258a7dfd774d3eeab7ae3e81c9022036cbae6b6813b337d61338b8b97bc06e6ea6ce6782c484bac028fa5d882347a5012103aa1c2538031f06639873d817ab23fd9dbc1223894608c3c13254a71e4c5510aaffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208040000006b483045022100bd53ffbd35bd144fbfb7965c6f8656611ca588033872020265462cbcd8a3503d02205d1f1b7a388956af5d7cc8e0de801ef697fd3bd1abcd6c24a98e8190b534a2c901210303f59916f0be19488d3ac301bcfa744ddce0812347d29dcc47902f43d8450c82ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556100000006b483045022100870e70389c9a63bd99121620234bd0d68c637c68d0a5419a261416af4d8c34960220713183add423b4cea9e6a94b4a588267d304b4c8f571e7b44b3a254c7e3f42310121038dcf7ec05cb0fe0b91e5617204639e764cdcab308ed15e8a6a03db3bb445046fffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556060000006b48304502210087af1dbe1db5161b520f8414cb1319045d747cc4a60f9046432e5c8816dfd4bc0220042f9f631f200bfe80f99a6e2d209a96e11bac5a861d3cf4645fd79fa5c68bab0121033f8c96493d58cedba0c1838728f979444026646f945fb5cb7750d1488a756d2fffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556020000006b483045022100b5b61010e05a69ac54c2a2a82ac4b503d952c4f1f84dffdaa6b064b8204ae87b0220070035871d0ca364d093cea20473199b24beb0220fa2347f99508901da3a39a60121021606f24625933fc17f25d3e24b87dddbe4c39cb1034a2d0ef98a825075a1346fffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080c0000006b483045022100b7fa2509a3083a5f78ac64073773b8c350071f4c1a21577a0197036c017af731022014867803d154b64d12a3685b6bfe07cc4567d389bd6ad45b3fb89ba828256999012102fdb27b100ce472ad2b2ef5e7cb7207c1aa5949248de526b147521ec8e1c6f2c6fffffffff40075ca48b9cfd9ff4dce9061c276bfc0851827e30c2688bd91154859dff9ac000000006b483045022100847f2cea2af12f96d813b35f66758e28d8e348e81ae8782867d7737f3f5a237f0220225541c76d8dfffa4e486b6698fe673a1cd7ecc1f6cc6f2fef7d503c03b90ec5012102d041c9b36e325edee8b5f2e8ccc2434b5c06cca9d5ff57f4247eaa185c60996fffffffff15a0d0c415000000001976a914be591e385dc9f5eea2fbc5fa898cc78d2398bff588acbaa3aeba000000001976a91460922d3958fe3d511e342df6ba4f20e703393afc88aca05be01e000000001976a91451786aef809e61cd5fd7c6eec677042e98f4534388ac006cdc02000000001976a914977dca296be32635c286dca23145dd54de7abbf188acc0fb6e0c000000001976a914e3bfd71e5b3c3f96b9a252987119a2ed1d66719d88ac0a2dd0c4000000001976a914e30066fb1c581d782831443d931b8fe7ed22a66c88ac8096240b000000001976a914bd443ab8fa36b8c1971217cdd329faee33bfb6fc88acf887c6c4000000001976a914a4cb7ab932995ce96d95820ee2e4573c96608f3e88ac808e0488000000001976a91477f71e0fc266998e4fd3fb202f6bc1773238d90988ac12a50900000000001976a9141232fb0ee6be3ba74eb4de6a8c8c96dd16f23d7d88ac3abadd53010000001976a9149017b9d8f59fbce9681622844a8987a7fe2cb2ec88ac10270000000000001976a91461b4701eb5c9ae7f1cc18041ad766fa74085d18688aca0a34300000000001976a91442952a77acb97e1f6a3945826cf49d6667c114a688ace0c9fa14000000001976a91407c25af50e249708f991413c0e8b216530919b5488ac400e426f000000001976a914a8284f3e648d13806b4d9a5597dc00590c642c5c88ac1e290000000000001976a914bd7e1e8d8dc505d9e5986ac3d922fce3c7b1d4bb88ac00d9b57f000000001976a914a35920f11d17efa28aa4d3d3afaa40f2e3312a7588acaee8ce11000000001976a914c2cc8c71c9afda85f3f0a46de108d89846f2959d88ac80406a11000000001976a9144195947a8d3de0f6479e8f099fe3720c7fa1276b88ace0dba237000000001976a9141bd2d025f0ba34be5c7dc140c2f862364b70ab9588ac5089210a000000001976a914e3ed8f3da0a1349db32a5b903de080aeb3f443d188ac000000000100000001196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020a0000006b483045022100d528c6703f778821cee367954b598f59f6c0dd7afed0d69af38498e522c8e2df02201d153b00319ede8c490a39ff48a3c82fd8f1ff7bbc8cc14e0302ba19e06470360121024674d01fd4f992437a4c3b25b70b5d30f718c2e9b2d2d7fa7de15accb80b1b7dffffffff028010b7c1000000001976a91412ebbb91991f7cf074644b7facbdf3a3f258497788acaa822692000000001976a9146e0a608f332ea137fdfe196909d71a5db3575e4388ac00000000010000000261d3b58d2f72ac91dbc4cf130e7d006546cb5424e629ea3a5a66bf4465bfbdad070000006b48304502210090c513a153e1732f824ea6591c3776d2610dae1f226d9fa97f4c82b0cb87273f02200a59ea54836e83ebc214a9c05778b2278be2b2edd93e27ede5e122dd09f27dfd01210318f9bbae99cdafafacd43a1fb7053905d86fa0d9331785b2644c239be32a513effffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020f0000006a47304402204b18245af5eeaf73cbc9debecd005c34a1d61360c321df82797e6f16140213e8022022baf5f7959854c2b40eba3cfc704ce4a59212bd30397d16a577c855c50704b301210228d6fbe6eb9ee532657f26d7d4886fc8b1464c4a278ad0787861f9c5b2daafd8ffffffff02401e6e06000000001976a914f42ec64c30075fdb6d28a0c34bb23c0172d0fd0188accef57512000000001976a914275dc816f05859350316dd11bd9bf06b38b051e188ac00000000010000000453f6f8495dd2d734c6856266fd06418191ff932d9bed41fc5c9debe2957d77a3010000006b483045022100be33eae64aa4735ce3fe3290c9d18deb0924ce5a89fc7330f5a15ba004830d71022069e53dbfad425b50cdf99b97f3d466feac8bef8ca37dc03b0dede9797ee0c4770121033b4266a54404d639d92949ef264192c1c7906c16119dd64012e599c7187345cbffffffffb3cfec85a3d2881481fa2a80054572c5da7dbbf895c1538dd50b771d85daff070f0000006b483045022100e3e4a09081661260222f5e399adc3f18601a976f6325b75122d7bcb28bb0fc0102200d4af4843c7267276d685695c1d65501f2880ae26187c1f29baa14ad1081cd850121033b4266a54404d639d92949ef264192c1c7906c16119dd64012e599c7187345cbffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560a0000006a473044022046b0b1b5590459eab1677aeb7696d49bc8e6508e81579975d7d466edbb24dafd022038ad02e7fb4e667435d9843534253383291b553d3e23fc20551ce7f99deec3150121030bb2a4448d624c5771d96cc9d0c2ee999ab627cae68305fab4c08c89ed5a631effffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556110000006a4730440220263ca3494b2af85ca670cf548706e316c4f2f65cb7b1ea3c202ea9a3d7bd8a01022051fc5a7c630bb4a0d8440348117290d1fdf122659d9c1cef8ba08a83f5c8e5c401210325236271e33936ac53e9ffbbe5936fb72c2aeaf2d7040c8b28c441216a1be651ffffffff02c0b8ca02000000001976a914a9586e1c4c45829520e5a27dbeb60b51583738e788acdbbb9e07000000001976a91481e2a8e9af62b241a44f17dfe98c193958577aa388ac0000000001000000042bb47ebd6b506484636a5357187ac605516fcacf5e7b6dbf0d507921e53a2e18000000006b483045022100f74f94e31670a6116a572fc31a88e8b51ba3a9169cbcf7afe6f897b9be2bf00a02207238d89ebf3b3f3e19dd8b3cd467b5fbc384e9ad331763688a96f35b8896f6eb0121028afea3428f046a9629145509aab0be079575b0e6df42af608cf64f389cc9552bffffffff511537ef31ac0c52a7ba90c9b06a817cc43deec5c0533d15fa38f1ace51319f4080000006b48304502210081adbdc31df598742d0cb14b851300fd534a05b55df5824b4c76e1bc614ef35202204486e4a27cd64960c05f641f4633dce85cd9ee244497b136e7044f71ea70b1ac012102c33652cc18460c06898033a799ac2a7cdefd586928b35e711eda1c89a9a7dbfbffffffff7744bf7f5baf9a77d223cb2b641b973b4f978d4e95e5bab7369b93786cc6c0f0000000006b483045022100fd5b6831792302921a4bc21d31f644076f10dcecfe3c3b1862376156a218fe1902204f28da53d2836dc0e27ca3d1b85b8575cf41f614ba8de36936a255d9a925385801210212632d26f7c14e8e4b76f56b97e96fd5c7885ee6ede953262cdd69b97ea6d141ffffffffd1c8536658e4c700506235e3120a1232922a5d4fcbee31d4fdd3bb58d977769f030000006b483045022100aae7dc2ab378ce8382c8def8f0192c5a99cbeb41c0824c3f2812496e9129d5b502205030c26396bd32ed4ef255b85ac093ec82475a6e8fb029427792af10f36fadf30121023b5e03659088648cfa6b5a86377b7f97fd9e9eb2bdaf10fcab2adb23ef0a1bfeffffffff04a22d0101000000001976a9144469cc59b6d244a84cf028cd5e84222dd5a1c4de88ac1db61501000000001976a91498143ade2f196f84c17cd53baac81de70a0c930f88acd6080901000000001976a91459540cf29593397272588224062065f1b61a269988ac5c961800000000001976a9149f5389b6b68fe426bd75b80b405afe075d91a3dd88ac000000000100000010a42d47160add4e5180e30a492ae63495b545350ef53e8f7a6f263e3d88145965010000008b483045022100bbaec976ab11a836eb3222c2ae969b837d3a233582519ef160a2d7c3dd3dd61102206cb2c61263d989b2950a29613227fb83d8a8138ed3aa9e39c6321602e3ed029801410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffc369ed547521e6c9e6dedb8035016ba96131e5e3978135d7c749feefa68c0e34840600008b4830450220277fc9a3f5762d90154ab4d3af14fb73720f2a505ea6cd73e86f09b2ac1240fb022100ad1fb225af50e04eae91232d855c1613658f6c76e0f5f7aef8ed367f10ef09c001410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff85a86ba9739fce0f1ba95c89c636172374ed15d3425585da84fcb06f0cb7419bb70300008b483045022038c5129e7856d664604d4f2087d74d0112c592e45b148253d2e4f1c28f5dbad00221008bc1920a86b282ee349fe518a0a4a5dc19c0bde79818d68a7ba9a50cc269d1db01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff7b487a69e552a2d0d29fb8ee80b3dfee1b8ad9972e605342d81e623ab6735bd8920100008b483045022100dfcdae4b798566aa48cf0920013c2eb4b42531c1e3a6fad07da5bac85f03739002206b6b5207005e327d670462adf94886030be441bc7449836ce143f33298e84cd301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff08fc0ac6732ce3dcb5dcc8784c8a4c7a4d2fa16b45de34fdbe34a068d1a99dcd2f0100008b48304502205c749ec9b1f8c7b81e1957681168a709ca74a71613006f41c5cc58eae50a2a80022100ee1a0f72b012d8398f11205bc8d446a947cd7c0ad621d1a7100a742e3e95e45201410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff3b44fcd72757c7453f154d1ef8c99d502e85a139ce05384c763ebd5279fbd9d8f40400008b483045022100a9b8674960b9cfb4e6aa576770e069bd3a0a2ada4015aa523bb38ed38be2701d022007b8a143e3aa1db3d9137a94224348c85c2005c5ff2dce1624516c08143333de01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824fffffffffe1021e1d9fa4d5b1da75792dda91bd66bc082265cc8dd8ec12748f2bb48001dfd0600008a47304402201c57b44cf1ad6e60dcb1bbde0fff9c070fdabd71ff0759f5799b34a67c80b5d10220570748c630f60a6273f04ac9422224c2c11debfc5884b3769c34a5a372f3abad01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff2e1097d43f83789a11d90b5084f0e8b5dfe3fbd0e745288051e67859958dc20b470600008c493046022100ef948770e2f4d2ff979473d6b3d740b4299ccb83abeaeaaed5ddd20ee18098ee022100fc48e8c64dcdf6e7634dbe8a708ef7b5f8ea402509e0373af4f8d8f746b30c1b01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff81e4563040aafdcba8ac842f4a7f4f4b2d478e6b691e33b9675ef909f11c57084c0400008a473044022042585b74fecc3d94bdc0525b64b8ef4094cd816b8843a9af62841ecdc046254b022007eff2f74e46853ec050ac797975718e488034db5954495e6060f620e8a14b2501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff138910ddc7c84ff22d827b186659f4f9d4f121a8f82959c32b5e7b301e16829fc30600008b4830450220290cf13a19df2d9891edd8bae9028491db307691db4789353c753d39f533051e0221009896e8920a41c5073ffaa2ae07fb65705622c0395f7e516933609a7672209f0801410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824fffffffff74b0c51664c0bb93fa25d96a0877b4767cea1b001301d8e415392bbb41f44880c0700008b48304502200db653502756f9283ac5d8619a50795381b001a1c2b569afc722fb2a07f109f0022100be6d044cb142fd253005754274249879d7cada9796ac8ece60629b461ffab1c601410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffdb7243c0b91485d5fb45408b7398cca2f5d028f47aa7a60d311360bccb437ffa860600008a47304402205deba9a6c9aed1cdeee86c7f9a1c3098d1e4da3d062983d95025fa8474a429c202207d118d05685b797767ebecc73a8483970d5fa28508fb26144afa9895350ccdd501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffdfaf3b90b8c08586d857403af4cd02d19dfa55008fae329acedf3c7ea75bc9592a0600008b48304502200af54262d748efceb2cffe1d35937b3fbe41b5469a93690b3992d8148a6d77da022100fe25ec2f7c5a9e8b0e74f7fabcec589408c19e8146719776847e8fbf361805c301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff3a9eb364ad691f850f5523caef4739678e88cdd517e9b42f3e57f51d452b24d9e00700008b48304502204d37efa7b14e962c5f640af48025122c989d14aa4fca230e277010ee33dbaca8022100b6464198588eddbbbbb9b495e96f88268b2119120c29e822df753a59a58f886301410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff983c484c85c726b0a2d35181f831a46f646fee746cb4825ae8681c7c353a94237e0500008b483045022100b3e5381f2e05b601790bc71c5f022ad96fca46428ec8d7a83a945ecdc365ea7902200b37fa13806d818c1d842dde6d24dfdc8cd2a8f90dd360e850d3ec3ef0324bd501410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffffe509bdb4964bd03131a06c5cf08520bd793b3b13af63357895c39f887d67abb6eb0200008a4730440220127387645bf44276e056688394034bc6b4a3a125d3f837a31ff8cc724b221e8e02201cf59e74b666583d41825f3db3cf2e312fb77815e9e28df0685324de1c1c4a6b01410420d96d93f67b5f542c55ac6fafc8624b40044ab15eb785df19a5dce5fb1afe845bb0c4847905f2873182cb495f38a72b81f7ce089726f29692a9f6820c503824ffffffff0274beea09000000001976a9149371ae178d4cd94ea8ac9fb7ee3da27e945e836c88ac27e90100000000001976a91403faeac00abed33f4e4b7f0e8e7e46363190da1588ac000000000100000015d5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556120000006a473044022055527222c3d03f7d31b0aa01f12d0a1560367a16c2957d605247313d6dcb5260022015b564e00a6e4fe0bb7aa30619c74c55caa3ade1b4236795bdf4e027400d8d22012102696d455a5d549e8eb04c9160cbe0ad192d081d62906ca0984a82e7d95fd110baffffffff61d3b58d2f72ac91dbc4cf130e7d006546cb5424e629ea3a5a66bf4465bfbdad080000006b483045022100f406a488d5f8a7fa43296ff348817f1a8eaaf8b1f8b9904edc876e119bab38a502203b13ba0de55be416b9a6999e51992820cdb3fbb938255540e93135832c8935df0121020706bf6d443b5b9ce106712c32252197708bd2aff10dbec0a64b517a6edc27fdffffffff3e675f53b4720d6b3434f5a664ed66e3b71bdab439dd56a4c99eb32ccf2f23f5010000006b483045022100e19f7ee9b6b46ec64492d8592247802c3f1808464c25e4b8be1692ca9451b23102206aee962bbeca8b7388cc2d5ae344311e4487804ba693f51211c0a14792fedeae01210200fbbbbd3661c9f621dd117bc62cecef2a6f07ac8cd9554802693bf972d7d70dfffffffff1b216386fe5995be32653b6255ef6ec1102196c73e2b596463460844127c2e3120000006a473044022025ad8f77e2b650a225aa516da4dc7fba167ff098c6ef680f2f6bba8baec583970220236abd17debf16466708fdeb14fd3f0c688832f3e32fbe674003486cf8dd8502012103082ab1c07f7a20efb7faeaefb8c74ce33f84d0e9b17dcdd7275a241cddcef1daffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c556040000006a47304402202012509a75015b807ff16cce877e8d669ce4e5ea7c0e5c5880ef20bcb175b80f022073333cd7bf17d58ac14f165499afaea1876ec2bfba84f5bd1d94ae0926bb4769012102f1f5ef25f20ab67d457cc2c939b7fa1988bfd1e70c05436cf07d6cfad2cefdeaffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab110000006b483045022100f5ba42fa52f3325c16e2ec9c0e877b32561cfcf095efb8f0ff3c4c8fc76ae3c00220689c70e76bafb1f4e401c457f01c3fcd8f6f57327534a59d8abcf39c912b989801210251e9bca2568e05b5615f54f1be129987c3cc941bf3e672043ad63a0f57503f45ffffffff3987423bb0a754a7d9008553dda307662c9e210b7128cc6bdeed9da98c90846e0a0000006a473044022007f5547c01af6865c708526ffb3cbe04f7f88bd450b00ffdbff82053784132d002200532cb72cbe992b8f57a7e3e72f92e8722105f668f673658bc5d3ec0e017830f01210270b514740d3754933ee16837c664ece8f964f9329e4c8fc4d538050b7a7404fdffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602120000006b483045022100f4379b9094a063955696f3980e68fb8a1cc0abfe49d411c5eeaa53dcb9a7d37a022013de51ee3f0d74b98ceeb7f80efe070f3d2e926307bcc88f7daf9cd562dded3d012102f86a7a2d4580c251ed840c0422663acbd329c394eee835e176a5e1fab1540fb3ffffffffd5eda52e20301fce6844f04b317cce48c410cbcd6648537c2dfc1092c284c5560c0000006b483045022100e7348632d08e00356f9b999327dad941beab204836ba48bba79f520d490f429e022008e3d6b84ae4080112cd1e3df265ef270758ddcaf323c9387e46fd040451773701210354133c35d16bce2b7cc755c78a5cf3134e26c417b6c43b5be72d5dc37b69e961ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208000000006946304302200498407b92b9fe009a496879085f302ec00a5a7ad8d83931c29b953a348f5ed4021f5aea5801ac737cb112e679140a3f0defeeac91f7521f1c75befd704b5d5d930121023bf53ced02dd2b96c19a8919c71f49ea964318b2dfb8c31f3c940b46bd623d48ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080f0000006b483045022100b364e98a8990a5ab253258397b9289b5e1de9e7e8b9ac9399985399c2f2e0600022061b68c56bd8a594f2c1aa8bc301a0c548e193a3e13633191a7b2099fbfa974050121026be3eaed514e069fa1dec551431eb4fe45bff8b5197787f3ba1210c0dd4a8478fffffffff1b216386fe5995be32653b6255ef6ec1102196c73e2b596463460844127c2e3110000006a4730440220767f4a43c86f4c67b07f143cca929696531ad08e4a541a15b2a925ffe666baa4022048ccf00356894d551b23b632fba94cd760e9caa77b8026ee17b9b2e944f535360121024abc39893dc9c91f5997575887f5780ec59ef69b20199907070054da82c3aa98ffffffff3d13a301b7ca19f195c7ad6b4fdd74df486ad51ca2a47707daf72da705fbf82f010000006b4830450221009c4852a09c8eae6835fd2545730719e79627d13579414ca5995a9049a5f5f75002202e1e4ce6521992f6f0cbf658c5bc28c89d238ba0243d1dc712b03744c35f3b0f012102c3d05cc6723c449e0541f5944dfa147e43cac660a711655bde25e6e1e48d851effffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208010000006a47304402200301abcd9da18372fc347db50d5b6950786a8d66a36cb066a6f495531d5bde6602205c70f3b0c8d15dba3c1a8e78de9824f0481de64831429d41678f67635d0cb8080121023884ad5407fcd6310bc4b7fc1b934ccdd7c07688580bf8b7f3f7984667b03d53ffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602100000006b483045022100970ea3f8e2a262b49964627c4e31c78a2f8f0566c68a79d003685afa6029a3b702207f1778c1aa11b2f9c87ac640d064d7c0586ff3d96a9a43d8c5fa22cd89d79f9e0121023ca6e7584d8fdf9776732f364f4a43d18886266cdddd7ca1880fe2008b604873ffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602000000006a47304402203204ecbf2ec2eb7fcba47a7c92e19ef609c7c7c6e1ff191d8a98ee7f0dd1a427022073682115c5698d5f6134eb751b0f31bf3dc6e88bb6578f0496ad9e9376d6013c0121028795f8b0a67a234e928da8fe2e738b85939f1ea31009a4e41355db54e14fc31dffffffff5487c26443f36492c9fcb740c917a70d5a978a457186382d52d93517b581b80c010000006a473044022062bf9c431e9a9774eaeb851ddabf71ee03552cc7ffb422c1873d0a1a4eb53cdc02205233c417ddf3d88b8f72f79c24f96d6119d284fb5b1b4c1e6e918c3b21750b920121033e070f6f281e381234477b5865377789ea442bf180b6b76d79fbc0357fcbb10effffffff6a5cb595037a940569804bc04f6d16a240c338152f6934dea8d5abe91b98abfd140000006a4730440220166b0a721753780f4751693afece8568beb11535ae93b233fc253d795fc7b02d0220330fd61224b22d05b9d60138d3b5aa6f7c22db58d237f843c6be5028ee18783601210210aacf8f2a034243784bd2e7f2e5b9295d508651c6a7555fa6a01e4b65e897abffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df0e0000006b483045022100eb9164606afeed8a0b4a6a341a95ebc08d4cae9abc9014c5890e5ad4d3bd3ecc0220456aafb5e920c64f0501d53de835c1a34941a32ac2114cd0c00005fceb51cbd60121034ba7be1ceba4fd6f8839ea76ff3094c61b586287dfe7fd1992b690a73bce36b9ffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab080000006a4730440220077ed68fe2192a933927df527acafd1af4c14d634c9f34f72df20a253bed3a8e02207499149f3c1968cf62b4f4bb6d859f9fb540ce046f0f515261d16a3df049e46c0121027e2d446f8e1bf0b3a03fa50b4af747d6714064a8a6bf656f3689d50928262447ffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df090000006b483045022100feabb57b36c3e6c541a620b8877a65bc8443e942e08bf560cf81bdcd522a837b02207cf277b4f433b3701a0f7e2ce43165abba5d1109d857497333314830df475a6b01210352ea39bad8cd7cef30a53049d60c366a4207e38ff8a3a4124fbf93c6dace85aeffffffff1556419da2000000001976a9143fcc1dcfbd3ae129deffbcf43b7d8b54027d627f88acb55d5600000000001976a914bb029d13dd17bd65787e88a9a12f07faa1270b6f88ac00daf89a000000001976a9146d3b6a80dbc5f918414e435cbb01c212cbfc5d0d88aca064ae6f000000001976a914e483d88548aff5069ca801bf2afff0fd5db0ff0388ac61410a00000000001976a9143836172bbb30d91db07a04a0ad4e62c57d5b0bbf88ac30cba059000000001976a91412d467cea7979ce5702394ec175395ec153e916a88acba814704000000001976a914ce4dd0989021d139aabc67e502c1d891ba870b1f88ac40ca2200000000001976a914e46151c672010e8f83f2056c785cc1eb086fe5a988ac19370000000000001976a914b4becba2cdf870d86ba464fdc16cae49fbc9587a88aced340000000000001976a91450430b77ba31f95b10d07f9a7b582f61b4a2ac6f88acd0300e00000000001976a9145ece69ca06ef02e6f111d04431aa6ee09a6542d788acb0fec526000000001976a91455769bb290f85c6cec681c16a4f5a09d0c766ae488ac00430738000000001976a91413c505de2c016067bc87ccc3d4e6f85e70ebe22188ac1080dd6e000000001976a9148267ce7be08c2f1fbab2e5011d645bdeaa9cbac688ac60c41e80000000001976a9149f7dcb4f09f9753a355ec8bc83a0cb1018463c9088ace0f7434d000000001976a91412d467cea7979ce5702394ec175395ec153e916a88ac705e3637000000001976a9142463099825b1a94f26cffcb1b7893a945f3be9dd88ac480a0a00000000001976a914be924a5ad4357d2c3a418936cab8c78ee0e71b0f88acfd676000000000001976a9149ee44d6b20b5e06fabae95c5d4a3fe8261d9aef588ac88260400000000001976a9143e86b64bc1fc0cd73728e10d0e516781a9db80da88ac10e9eb0b000000001976a91448365ca2314942de6755fa6a4fd04ab1a3a38b3688ac0000000001000000036a5cb595037a940569804bc04f6d16a240c338152f6934dea8d5abe91b98abfd070000006b483045022100b92188ccc613f9eeccc11eba2fed593f6de319f44cff7f64dbe1cdd92caa7b25022005afcf4948b3e417f1bf229009365c978f48da11213acd2d1274c8d70b3ce840012102fddabf9b7c31b0f0ea36ce87b5fd39f9cca9c1eebfad949ae15f3597a67d8476ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd090000006a47304402201bb1a024ca3526491d6b3ec1e36ea5d77c1a5633293f84c47fff43b1d2a07a6602203ed4f4828a6aa65b91d3398f8255e0ec10ac2d64e6977405599cc7c3dfa1fb4c0121032809bdf7a3f15310e00b9fd24b7be34837d015ed3cc80b5a5561431bd7849e3bffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd130000006b4830450221009cc8ac07fa6e79a40155b578b085ebdbb5adc8e3bd684486ce442e75661342fa0220024a38c68cb437514a6a409dd033af89ced7f22fe127ff6d745778b88fb68a2b012102fabd1e46d5d2914e756c5cb19a160b061b2bf3aa560223de5fe689b279165b27ffffffff02c0f7e606000000001976a914d23a2cf87ff6bd7a0ca40c10d2ab110b64f5b73a88ac82691d05000000001976a91487b8d4df1fdf28e513f4cff0f1aba8b181a31f3b88ac0000000001000000171cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca208030000006a4730440220182ed15b2c60770966e3b591595c5abdc6c1a02e4e05d0a4d9c35762f99d78f4022005cc0f71bacaa80b95f8380d2c6aa7bc618f4a14854a5780f6045a7eff6c85e801210203fda9e9fc2b5e757cabf5c28d5d93f73e49f478210dfc957b2d748d21a03bd7ffffffff35a7757973597042d66eee05991cabdabee55adc1183f2e89fbba83d9810ae65100000006b4830450221008a7309a6b2011810fd33b2009141cde1a8f28f07f8c8b8391a834d88ed448214022024c384fe0a8e0ad22d0420c0dca04a172bb4fde430bde57aaaa5306ca919ed1001210243d0b7d728a50462129f1a31a2fc5a192ed1d80ff1638ef2d36e1c635171e517ffffffffb9323943cc113451f065def62bd723a5129743859fec8ddc644d2113432c62ab050000006a473044022067641f19adb9e037a332991366c4ff34ebc9e162abfe1ce5a6f74666cae3f5ee0220313efce26ca919da3b3638db9d40faa48987e28ab913fd7147e9ee1f9e081fe5012103f056cfce34c8b3ce4656b2786822101f9a5694d3bec22cc5a04afdd6c51f1bcdffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df050000006b483045022100e60e70379382b43251a29b1790ad95634fd1a5dc9e25091f32eac3b3c9aeca130220559e64017bcfc9198eaa2fafc0772ee7de0dcf87f2ae26e7637188ad90a40293012102e72e3b819ef681e4697997c9982285876052b4906d9912e45165026cd9319bfaffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd000000006a47304402203a42356a06791a6cb962c0105298f5e71a41f7e40eb76b687f64b726db9287a802204ec9dc91f045eb3cbc26e6dd791c2e1490380af478407190302ed0477faf593e012103d4246309fc4f0db7a8527a62f27c6e2ed033bd520d0efcf18104a8e8b578f163ffffffffa6a58b662a6b7481726f9839957e8418fa9d2e18cda74f10a6a6a743d08471d0010000006a473044022025bc554dc15d8b6d669bfe712b3a128d7f9505fb5d253a8e27c6d85bbfb9847e022053421243065cd4ccccbaf39e3bf4961ef547fa90a87e08ae9e5bda9cde93515b01210249a2868c9b12afb3d87eece548992c266f37649a867543eecfa83d41bf180c43ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd060000006a47304402205f968c81133b8702f1cf2619b1e6bd53adc3c3d6e995eb5235afb3374450769802200e056f6476ddc0080aa42316d684ee8956bb35e77ed46848601e9347b35819140121027d24279e61d59ec0efb17171e17d6787dd06c62bc68ff3ca7e8f7e0eaa5b453cffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020c0000006a47304402204da0b624703f3992428906ac7e0e764869c06a142ffcbc902068d7a77a76ff4b02202785f0bccb028ce169dc4a136d92f5b0cd20eb36597a2b8c25ee78b25f9beb5c0121039620fda21814b9bec58509ecf2e0671ef8e4e90edf361a027f01d50aef85f881ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0d0000006b483045022100dce92f4a8f69ba2c989481c2bf33f85cf2f307efc038755d5fe9eeccb27e87be02203901e83c1a62b59814ea94d5edf16d145810ad8effe4a609fa8015a09c527523012103327d0fd0b9399bd4564dae81d01741f810ead31a168ce54b1264868b39e1ffdaffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602040000006b4830450221009431dc64514749a36b7b67e9fbf851f2e6160d3bd141fdde078952d21076b20e02205718be1ab1e3c5b35f3aaf6351de7991c72a38015ba060333b714b769a9ae2ea0121039d89fd34f339dad849035222a67c4d5961ba766fb3aebf05e0bc8b213ba0ae3cffffffff3a564554adf1793768e523aa57d4e9b4d3fb37864f5320a4f14df16f329dcfc1120000006a47304402200c1891117a641d2291c21ef306c60e9b747497fe67b7b27491479ed7a7be0e6902202266b5893d7b8291c470d096cb452080622f5495459ea838502bc6659fb1ebb6012102f80a7615ee49d42e9ce266cc3a16325aa93619f217b928ebccdd41ed87e5538bffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602080000006b483045022100b68bfa78ee84127a5929f604be85583b2f016407d994b3ff6a9db6989150738a02203ef0ccdc8781b828d8b940f1f50ab3fc329e20b2257413270c897344d030b37701210238450249b3fdf982d101124ee25d40718d3321024a8b3bd70465d6f594fd1ac3ffffffff9ef24927dc0b45471c13d95e35d140947a459d178d4e38e8a0f7c6f8f23318ca120000006a4730440220086526a21f7a86fa27bf8cbb6083c01b9daf8f6896a66671fd79e5da6a10bc01022078b3e5ae6174a849b0f7258b65361397daf2c3af879b9e47b736c56a3f2987f901210264d3bbe9047f260e3bafd6f7e769a63ae561d4be4278b059d94000144e24c34cffffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb602060000006a4730440220044deab5b46098ebf75887e59ba9345491b76508a27ea7d2eb65c2be2f10bb9402204f77b7760479fabb44db3b485ed4c4dfb7b5466bfc4bcdeb8a5a5181441a80b50121030cb211edf8301bc606c1640e1da8e40ea37412d0da6da3fc3d4b0d4531a73c84ffffffff1ca763343454481b2bc5cc77e88856b2b252dc07d76f6c970536a9738fac8dc30b0000006a47304402205a96e391d935fb7ea5cbbfac9114158f2c6a3989c15f2c10fdf8eabd9ecce395022010596e364a1b50b6445789739875919e54a561a2a0ff7f23a1e0928a0c9b860a0121023a4a866282519a6f6da167b1f2b0b3b80a9157a568159fdb981ac49f78110458ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd050000006b483045022100f218d987dd989b734624c78dae685fe7dc2daaa55db8779e049e0e6517010192022004c6d5f51f752b3c2a6bf0633cb80219d2480c0563b956f56e16668868c68b62012102cf98fe221e19da2643d92fe81c745ef15b824940309329691ca1a080d0ffb920ffffffffdbadb003e6588a84c2cafe8df3b6459bad2144f2a1f52620a64ad29376c68246010000006b4830450221009e323e2cd40e88f577eadd323cdd9f59eaa96ee0790c4bc51856da5ce7b370570220726897aa35eb4ae378c9a23e6fd1596aae76467cccf8cd3aa8f14fdecc43d2ad012102eb92f296d3bf0cb0827898c751be9095c2c3d5db500d85b90be9cb4fc606854affffffff196c05f4611402a414fd5426e53656a049b022a4731909cf7d54f92c166eb6020e0000006b483045022100862c47528784f3d41a0596585981efc88f1f91029db1c4384e8c58e6425df7ee02205fae4d97e2fee870e23430d1ca0df17f95b46c25d834fea043f43799dec4f9b3012102ecf996d191a23bf0c52257f8028a2d621d0fcd2a6f9d0f1b1fa07d0b031cf294ffffffff1cf8e54b5d1f42c4ddbb5d5979eeeb7b8bce5efee22253ed4292b6e58bdca2080e0000006a47304402201f59511cdf3f5e6565dc37db31d687e29dbe3d087bdc196fa74162e9640e0f5f022017448fbdc3191181ce661f29f93695152b251ac8cb223f32397921247cd3ec81012103c52ab347ef0ece04162229e289e921a5b56bfd6561d383bd472bcf9c5e10a75fffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd030000006b483045022100999b30cf0a7bd33c06b46b5a943ecd6a9f229e72328ac57887a0bc5d8ef864fb02200434b5f5cbbbf04b5f0c18892b6f25bb647312c9375363b3396b6c7af0590080012103fb2f9957eb14bea00bc39ddf21a1100103fb58581a631974ecbaf2b1dc8359f4ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0f0000006b48304502210081ad51cab316bd6806880ebfe9d372689de04583daeee8571878ee6a5e4c4a3a0220094e21d4b90e52ad6b041d7e676a5d04190232b0062b0856f8915eac4ed99027012102cf98fe221e19da2643d92fe81c745ef15b824940309329691ca1a080d0ffb920ffffffff6123c4018ab778506726a2e0eea8d7cb94a1589560601dbd6e0df8d3d91a72df060000006b483045022100e9d7858635d653b26ec84f61b623f60881f2d5716055c160694e8c403aeebb370220722dd07b062480d383ff79aa880e165f7c67a9f480d38e97682a502dc0e5a708012103cb220107fa56482467c1e0bfcffd92a2ab81d68f9339271d5145e1ad0c32c694ffffffff88f8ca3ae27878065c01861fac3139990a4bf623ac45ba5fc9f8f457f73accdd0e0000006a47304402207208d061701a9fc0a27da57d106998b611374e16675decf24cb0e1e6876686e602207662a73e87480296b887262422a86eb82c3f7fa5dc6b37b941b9e55ef1f4851a01210326bae26746b04b59d4c2f368f2e2f9aca584135ffc70ddcd134cef283365b241ffffffff1570e5660c000000001976a91440bc6e1a8c783876fb3d5681ee558673cb144cc188ac00fbf266000000001976a914824bfea00b8e9a4fb8ba22007e620aea04486e2188ac90bb090a000000001976a914ff3c8edd6318bbdab3ce9c4d6888fa937e7a058e88ac308d0d8f000000001976a914c2efcb06863b9bda55f950f75d63918b7df9081b88ac103f0d8f000000001976a914bbda1df35de1f79ddac2120ac0ad00501f2e6df888acb0d03477000000001976a9144965470d6bb4ddd2f536bd65b10871ce9c91fa3e88ac52c6418f000000001976a914a554efd037d02f59397f55653b21fbd137e4e58588ac204e0000000000001976a91483682422c004420ac3092329b817fee37aca6df288ac00a1f13f000000001976a91415c233d56db6ffb15e2cd536f5ded14e688fa0f188ac60ea0000000000001976a91487f4a5d17b83f5976b5894519e8dda182db0c50288ac9896fc01000000001976a9149829c407361d459569e41a5ee43214290e6838d888ac22393400000000001976a9145c5a2175663072f3808672b11f473baa1e7b1bb588ac009ce4a6000000001976a914f941fbd07ed397a005a1c361628ffe4de5dbd65988ac0027b929000000001976a9144965470d6bb4ddd2f536bd65b10871ce9c91fa3e88ac3843c574000000001976a914e6f64e5fdc6b53426393c6c18e9d579827ed9e5b88ac3878da15000000001976a914ef97246ff380ad79ae38909f203da9379d99fd8d88ace05d4206010000001976a914fe67816b10fa61850e78faab1f047f86cbb9128288acd0a20c8f000000001976a91470c6be9b64b456af6342d7032df006ea6750017788ac6029700b000000001976a914dcc17a6e42f3992123dc814782b6fc23634bfa9e88ac00752b7d000000001976a9141417099b92d195f94cbe737de835a72497cbc9a988ac4053cd0d000000001976a914bb8f0bad61f57f95add4c751f279354105bc8cc188ac00000000010000000311b2347e7261132e65c45a5a7b13536e8a64e7045bb3806846056ecdd3b97258100000006a47304402201cecfe79d9b0cc374b0a24ec9791ce17548b138ebe60dce3b8d549f65d57eb2f02202d7acb1398c18758a37a6dbeb9c0f6669fb0042d2f2b7906cce3e4d48bd7eecd0121029dfe974cbd2aa008ca27ba75731c9b123cb4d700c77a3404a6c5e2c8e9b0144cffffffff2968a2c9bc7cb619ead292ad82849a4a8c4937204b4619a0ff4b80c24d49248a070000006b483045022100f6362087c730d5f60673fe95c549e4a8e45a6a65ab70f3ba9887cb5ccf88273d0220456b6a74721d19c8c3a83762167f29488de46d1edb0cc49dc0cd46f1ce1f8a3c0121039d40dbdaa76507b2708e9a8ce913db793a1ca3e940680f8a01b1a4311bf8f2b6ffffffff2968a2c9bc7cb619ead292ad82849a4a8c4937204b4619a0ff4b80c24d49248a090000006a473044022028522917d00d8258206e6802389ae294f085b910618a3292d10fece0ee60d41d0220262fee75950ae2f20990c2c8832b9b13fa5e12f46d64d657570884daa31c102d012102c05d260ec1d5352e9e1a8bbecb472875746c68b92ae7a81a47f2537961fb3408ffffffff0280539a05000000001976a91436167803060f96816e5b4801dd82c84afb7887ec88acd0162a03000000001976a914403c67cedfa93e96b129a44ec1ba294b7b7513aa88ac0000000001000000019d3f91bdf173a66bf08409a3d6776b33d0aeee3222fda32e2800bca08efd93f5590000006a47304402200b551118b1c49df27dcd1c311c6d2e7a15f6db8d6f5b7e2ddf7b9a33e2058c960220246d6c6b249162e3101a771dce401c37f58da9ee3d4f0ba90853cc4f964aed6901210220950a44f5914cf0f4b2d43319eb96746562631e2e37d9777d3a993a04876101ffffffff57ff4a0f00000000001976a914c5b908bf2a82ecaff706c6588d61cf38161f717c88ac68981000000000001976a91483c71fb414c4fe7fb4b2c60f2ca6da5e0d6dbdb188acced70f00000000001976a9147d5e20ef7c195f563d1c64a67d05f06042293f6888acb0e21100000000001976a91477fb74114ae32777d00c8996a91daacc532f91cd88acf12c1000000000001976a914cee365810cd648028db83879749a2f9659bbc4dc88ac75ed0f00000000001976a914dafe8e206bb0245609134f0af5cd91f4a8dd12c588ac0bb11000000000001976a914d6ca59283f3f75991bcd2999955f230403865e6788acfac70f00000000001976a914080da666a7dbe111800ae96b0363e36192bb2a9888aca06f1200000000001976a914ea0b0d92986786ec4f29d3aba16b9332389eeedf88ac76d90f00000000001976a9145a6b298a688d3f5161184b844b06a1c2890bf05e88ac81a40100000000001976a91438c0375abdb4a582a61ef118ee2f214d83d75e2e88ac38500800000000001976a914a87d1cc11088e265aa7f79d916070a4e7297d08e88ac7efc0f00000000001976a91457f0e34300102f853bac1026438ca0ae58d8ecf688ac784e1100000000001976a914009a8d0112472fc8f28e477b38b0f07fd842f69f88acf1c80f00000000001976a9149370d4104dba14039b200e35404608198acc643a88ace0851200000000001976a9145701e33aa1c99e01f7426db9c019d8ef0375c95688ac932f0600000000001976a914b6fca6329db8420dab864a6f6d0cd91c86d90e7f88ac8e441000000000001976a9143ffc0d1f05d70eeef246802356c96ca551fee96088ac71aa0f00000000001976a914e774e1d68e05c61381f4f32a031df02dbb0be90488ace7011200000000001976a914bb7a7a0a2d705fa4e1b1d4bf384488429fd3250788ac83b51000000000001976a9149296a3c11775574233a17e8573e4fa5b809564dc88ac08bd1100000000001976a9146e9701b919ce65399ae4a5f9d4486f63cb8f813f88ac55661000000000001976a9148c13682c8088bdbdcfb574a4fbf5aef991a7343388acf6510f00000000001976a914b25417729ebac02bac2c5d5a571b174a2ee4a91888ac2e761000000000001976a914355c50f7f0ac7fb7d03b4d2de550e47b93e2798488ac834b1000000000001976a914b1dd01301bf16e8193740b1023098672e6213b6888acf8600400000000001976a9145475e1e068a752fa593e582dea9b523a7d0830be88ac12060200000000001976a91495ff891da6a97890108e6351d6d51015745c572888acb27f1000000000001976a9149131197746a52a2644e3d435cb3e2b9233527f3b88acb1de0f00000000001976a91461ecde31b0e4b8d5d40eb750c4857ffa313544f488ac7a430f00000000001976a9145d62f3ab440fa05382ba6c2f8b41e5c581d59abd88ac15371100000000001976a914eb3acbe499a1b8dd677cab9b279980de7ec1af7188acac7a0f00000000001976a9140846706a5256647c7383835f8d0185bd100a644188ac46011000000000001976a9147133a0f8ed9e2f3ab1dd43bfb7b0fc6c9fbab3b788ac89071100000000001976a9141b724277cf253bd484d21e3762ed1369e6578beb88acca4f1000000000001976a9141002b3a4cc8ff543f56975807835bea13526773b88acb8760f00000000001976a914b2b4fe2e91bae0f1d25cd740121466aba92bef8c88ac3cf21000000000001976a9143a6b13ccc1b766dd328c8b2b21a4b1facc53324888acaf7c1000000000001976a914e802928f7deb0ecf14e136f2029f85dd37c47b3a88ac418e0100000000001976a9142e174ed3ce191fd677120a0f14954f87821c534488ac684f1000000000001976a9149df60a6a89ba26284bc6ceeaed91779ac0f5b73088ac9b4b0f00000000001976a91401e5108d31929536cd3e59aedca73e200dbde3f688ac8df00f00000000001976a914811d8e097532db812fbfeb55656570ed6934477a88aceb3f1000000000001976a9141b1033f49b5398fd4a272af587f01fe0c7fbe07d88ac80f90f00000000001976a914717e49778a282ef6f7ae1aa425b3235ef314937988ac1b9a0100000000001976a9149cb9289d2d84db42171192629573d7e11b04e88088acbe530500000000001976a914667195a90706ff1cf49db560c9328c0f7ee9a51f88ac38671000000000001976a914ed24323d37742f822bd868552e5457fda9eb16f588accc821000000000001976a914ad44ad6d308934c556624b04f2da1c6b17b3b3a688ace8c10400000000001976a9147cbfdc950f7665207739d6ee9a0c313567ece27188ac44191200000000001976a9142b788153d9c91906113556b82d900cd81bdcdf4d88ac4d6f1000000000001976a914162b08eafb95e52d4bc71950f8f89c87a7784b3788acb4441000000000001976a914972794904dee236a678290034372a9f44ca21d1488ac28201000000000001976a9145f11bd6e5f62767dcbb1990864aad76a3d784c0c88ac0f1c1200000000001976a914326e825f5543710e1821f96d58bd996f5e8d8f4488ac88da0f00000000001976a914263b3f8ce0ad4a94c53ce77fb9d21ded8d1888ca88ac6e121100000000001976a9143d0b76c0a34511ed7b0f4379f608a91b3cbf228188ace0e20f00000000001976a91412b47187fdd828786d5ddf4124a614f16cf73ac388ac17730f00000000001976a9149efa185002f574bb5b1937cc9e3eb33e5d6f2b2a88acfa231100000000001976a914ebbd2c93fb4e0b32905f6a568db5d7ee1d4971b788ac22f10f00000000001976a9145d11b003b644c089f3c50c0dc0fb418778a6063688ac04241000000000001976a914ce32ea2d498c5a50e27631cf9450fe87cd5a08a288ac35081000000000001976a914d3502d00f42effe23e657e2658f04b6b25392af988ac9ef7e20e000000001976a9145514abb9f4cc3efd544d5f173044d25097a2d55c88ac36570300000000001976a914312f8f38d306561b1a7256a365a3e8df7e57836288ac5d3c1000000000001976a914a79e020b93c1ccccb6c894cf4361231704e8d1e888ac77fc0f00000000001976a914ab82ee544de32dc687726a992e214dc75f93361b88ac23b90f00000000001976a9147e2ec5b862777b628398dce201bc3c87e7a2a02d88acb5641000000000001976a914915d8f0aa522c5920f952f8b2f22ddd4fd60deec88ac00e00f00000000001976a914007a43b3d3b29c2b969aa2e42dcc79b27ce5c24088ac5dc80f00000000001976a914c83075f09d11f6e394fba404f8611283a14277f788ac65711000000000001976a914f26568a062cbfa2906ec9b97c5108766c55b892488ac1e641000000000001976a914557c1757cdda933721b0ab81b69369bb325922bf88ace7361000000000001976a914f92d61409ad8ca5e091f316bbbd0be90deb42d4c88ac0cbe0100000000001976a914598e3a315ef75e202ae09fc73e6a136e6cce65e988acef9d1100000000001976a914778070286a15342220a3308ac2f82d9cbb0dd6a088ac35f81100000000001976a9145bac8321860e12b037dfc1ce087591e82a4295b288ac95db0f00000000001976a9145cd2e1b93aceff18bb4b9247497f8bccd05970d088acc1eb0100000000001976a9140df21fbcd42da47d3018c116b8e6b391264c854f88ac377d1100000000001976a914a96e24094aa4da3acd691f89ca3f9224e6065e4b88ac1c700100000000001976a9141320e82084d5eafd170f9576bb5990bb6c034ca588ac0eeb0f00000000001976a91420d380d2dca0e0affa20168e41b0f7edb1e97f8d88ac3bcf1100000000001976a91400a0867abd4d9c5e84c39201bf3332362ab8ab1e88acfa8e0200000000001976a91424a15128c2087af9d7bd7a37301e0a2dd3364dfd88ac8c990f00000000001976a914507a7bf03ea16ee39fafb6d3c81c01a540e86d7f88ac6e751000000000001976a914c71888a0686a338673aa1c47d16d0433afe63cc388acb6b509000000000017a914e50a8f125e38a5260cfb3f9819972fdca7e96ac387000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f1b0000006a4730440220111d5ebb0be209937173acd331d298e3600b09a15eab51c755ae993ef3badbc602200cc34f15462a82e70238dd958e093fa2a14320c6ce40cff1bfac6333693ac2a00121029a290b6fbfb9414bab29b007c8aad2eb1d7ca098a97a10f9586f6807af7dd008ffffffffdbb62663e81fc3fde6933d0f9d0dcfc08ce032f9f2de8cb22662075f078057a4010000006a473044022049b7823caa94ea4dd62f5e5dbecfeb6b79101f0c0c342325068b2dcc682e5d5e02201e2def50ccffa73758f9e51ed53d987340e67549703c648edf7433a4d53b71aa012102a9c8c1afb8da8e9ce9880ea1ed70462679555fe063f41730f38f8a2e1a8f3b1dffffffff0212060200000000001976a91422d73e3a4dc40e7e909c753b96e76e679526b0fa88acb06a0305000000001976a91499e78cd9b82e26d047b92805cb96d95c11587b7e88ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f210000006a47304402207363ff904c9842518b9da96a83ea873e450dd573753899c2abd44fe5a83227c102204de198c5c623c048ae3a61a7631d2dff1673a34cca5d9f4b540eea4afec9bbcf01210370c8fd1fa0f37ed6c1418c94eef2a69887dc6ab1e061a1ccd058e32dfb3cdf8cffffffffe440f7def507c98522f47ee2b47223009dbf5ad209ac7d0a277edfa5b74a3314010000006a47304402205700f2da6cba47a54e595d8befcde7d92be724e4c285f62c516a89796ca7ecd90220622bb6795bf31dd43aa6cb107da0dcf65d5c47ae9fd920b2ee5b8ad7a6681a52012102a8e1a6d3ab64d0103d20d051b76738300f794eaadb3b90399bdc02f04b2dcd96ffffffff0246011000000000001976a914bc3c30530853cbcec3999001088a8663fc116da288acf0060405000000001976a914066e7b9247218848c5d203e907f2e41cbd3c69de88ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f060000006a473044022059e9fd3120d800e66a9a9ac00e8d7eaf9be0328dcf3e42804bbe8f7cd2bda752022035ba1a10d7bc10ab45fe0b4771c78c2c4e51d36b055289a187ebbe6f1ccefcab01210202d6ba64ed62c421bba9836d169554f383cf23eba1daa8cd4ad02471a0cfb390ffffffffebfc2fe00dca265fd211846740acf1c63797dbbf9a7d823991c19536b21a7a13010000006b483045022100ea17b04b5db96f87b499274155d5fc083cc56904141046cd6b960f468f2f5e700220710399104c8c8114870cddbb6efc85bc388bdb638a3e8c90ff6f8589a4ed8fea012102eab0f911ccae4a076d5c0f16ec633868beba34564a6a7e9410fcad5943fae6b4ffffffff020bb11000000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac901c0305000000001976a914d933d5d611a97ef8d34e0220e60b937cea94f24888ac000000000100000002aaa48fff3517ac2c88360b083310ec729f825b151db86fdc1428af6809df600f510000006b48304502210098fb23e5d8112613e1f6143f53a5c988b645c7c28286181de2e89452b0bcef1602204eb8522cff6072538f18eb1ee5c6eb0717f8686e13bc96a4037f11ca06b6195901210368605aedcec34cf7e5aea3f6458ba21de9d819b1fcb409567bafb475b4d1d429ffffffffcd4be262d8ad5d0b8f49b2bad259cb9dbf6e0493992b2070454b1e430f42860f010000006b48304502210087e9d0bde6a96af3067f9fc243e7a0853263ff734d2f32f0a35779a40ea08d83022019fb8ec5bbb7e83e38dbff1953f8379548ce92c75d714a81f21e58e6bf67edd401210226ff151c3782c26cf2bd31995bb8f225476fa8f1e718be39d0072efa3faef52cffffffff020eeb0f00000000001976a914dfba28dc856c9a949fb67a55b234adb957416dfe88aca0430305000000001976a91498e005108ac83b88c57814828b81885ce770033f88ac00000000010000000563c52f2ae296e4a64fee3604b977cc7cdf9e56b9620a2f0fbac4415e7ae1ea3a010000006a47304402207120444ffd7e32a273ba1835bbc589f9e8ed4a90ee7ac19b040358e684a8c8d4022052c5c99d4e9be2ed07030d59d2fc3a4beec243a3917d6836c58d14e9cdddb8e80121020cad537a9923a96698dd84bba715bfaf57a04ff9f62f69a686928d2eb72e2202ffffffff00d887065ecc8e6db1059195e6cf0eeb674cfe916deee4bc675056b5588676ec000000006a473044022008213bb62d98f5bc20346b549d280eb60bf79fa0087cc47f4c1c000431e1014b022064dad16c1f598a859c50dda7429630ee4c8609b848fc3a79b35a7094d45d9570012103e6f979cac9a74ec369bf59b72f0ae4f82021eec9230c3275c7aae0f66834c5c2ffffffff057b18acaeacea1bda074703ad2042ef816e8c1836a104d2cba48d590505220a010000006b483045022100a5e0be71a8debe197a4c39edf2f4cbd20bf81c98342e71b0199c6a940c26719f022003a0e06035b695e61372930510961b0407139a23961aaa4576027e3c9046ed880121039db960f5446d22aba6ecec890103d321ba5df44a59f0fe5fa3277142c57bfc73ffffffff4d0d424837c04a1f3b77755d311e39c68814595f7243e8f67d585ce3cb720538010000006b483045022100a1499eac399283e757938ce653c203ca09c3886f4a5e7c1d9f8a59a92ec20f18022078557b7b254ea244075d874f215a12bf712969dbfa504899529cb06838967aa50121039edfe608de4cb9d8615bf15ab1e2c37bd778382048e06f5d048f1f80f9eb28f2ffffffff4a7b5c25f8967c0713dab7bc37e57e0e703f47389e7ca185c5bcf8b9941ae3b8010000006b483045022100e9d2d6983f55b6268d18a857d7bc47c70bfa6bb0aee203e25a11c623c0e18cdd02204604b79c39ac2ec2ab5482ca6c01c94fa1d2d5a4f135ffb2c224eaff49bfdc1e012103a735d0a91a643d5cf3d8b78f967ebce7c88a76408db2e91e6c7aa774114677ccffffffff028f450f00000000001976a914d0207df1a478b8132ac27e909bc8a94c05fd091388ac00093d00000000001976a914069532d8f9ea4e62c38badbbeb6ad322cc461c8088ac0000000001000000041836afc3bd897a5e9110ee2680877cc7bfe1ec49c7dbf7d24ae7c8dae881900e010000008a4730440220118085f424c6287a23305274af5363cc383ee13ee4714744853891f929a344db0220567f5f0f233706df1f3e8efffb6132461bd1052eb28315e5e8604825090c563e014104b0b15e43c301e02efe8b47b80fd73df20b59e358068f1b9147cce08102c411036fae6f3a91bd8cd4c55ebec209564e3b597d1df2a75aae96150268721ce8099fffffffffb26e3f19c15c5cfe62bcacd3f8bcc36dfa93f83c7ab16f743d28863fbfb773c9000000008b483045022100a79fa38ad490ef4c66b4909df46c6e3b2d5c5566d2f857a479ff6e3610ac8d26022070b0c1d6f49476b4de6c10d0873b20c78777f7c183b003909d8e6070f47ac7e4014104b0b15e43c301e02efe8b47b80fd73df20b59e358068f1b9147cce08102c411036fae6f3a91bd8cd4c55ebec209564e3b597d1df2a75aae96150268721ce8099fffffffff71da3cb3976ca72914dea699207f3ac0cedbdf85d8872961c8c6c688e00b1486000000008b483045022100f8661d875117f4c50a740c54f88b8e2645fe367a7c8613d3b2bf2c3ba786e87d02206af59e8b5b9edee9ff8f8a02a3f2d680791ae8853bbfc68eedee09fd39bad3860141041d9932917299896a4bf5b9a43fc32b6244f400e501c040e0cd2d70c54cd825e2be6a1cf05a207e2a6c24f775d52afadca19261a2d24f7547b8c836a8f17ea273ffffffff6fb8be31aa34f410fb774d44f91ef4343f8e1197e4876c413cc8a8b871558e2b000000008b483045022100ee847e8f78459be5b481ac4469a7dd9ce8b49b7cbe21bff226decf84d79993ad02203ae25c6fafbfefd1d5d9d8b885593fbb2d7aefe6087d882b262c2b7ec2b39910014104a7d5318cd8f19594b6dd73f92183d027690d33e493a84c83c810c9c12635c92ac4369483977e1b0f48388228a98c29b64ef12a9f82b8e301e386ede502cbf44bffffffff0228230000000000001976a9140fdb0d62928786f5da514606cfc6ab6591e9392388ac14e5e700000000001976a91406c06f6d928000ecbd88ea99bcde72a0d4f3f84488ac000000000100000005873a8d859656054744c2849c6c50d99af8918858ff20ab34f796171765817296000000006c493046022100d68e7cff4a4abd48f8522ababaa641508253f2a81d7a4d9146a59218a36fe8a402210081cf67880201d87993a5a29ca77cb81705d1325079fe2dfde29e945bc2e5170d01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffffc00497ea0f6f8cdf4cf4d32b645a9f46b5ef9c0203c356c9d595ba61d98a62d8000000006c493046022100a51360e426c349fc030440566b7a3b7e9d7b4e35639d01c938a51e00f7d485580221009b0c30355deb50b0aff712669125c76bbf590c12dfbaccd8bae3f7bdca46e75801210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff2ce93cf131c43ab3b3fff0061738a3b4408c42e8eda4d66ff7db3bf38a201e5e010000006c493046022100e608c5ff0400d5fa819f51a1a4c25b4c7552318c55c96d83a00c7b9e76e80f3a0221008b3506d761936395ea6ac056464cf2e7bb2827b7914978cb108655eb2d0ce6cc01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff5fffb1fd69558844613a293ec6cb11a1f596791384b240c10da64eea8e2fff47000000006b4830450221008e5432d1ab36164724d7843f0bec50a8849add49e6722c54790a5a681864f37b02202d4433cd44518504237039931241cd50ee03cc3115046719bc7022f23229b73401210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff5484a335a10546235aa49ddfc3b3f4aad96348b43971d4c31358be6e4611b987000000006a473044022035ef90c1f3877a9c1b73782fdae1c1d515b1fa93b946a6ee11810a16f5daa861022040a421d967895be33d9c2178f5c3c6f335d96efb7c60679cc5bdab460af9cc3101210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff0220a107000000000017a91456fd2018804b730294decb2c5b64db5e649631dc8750c30000000000001976a9144c213cee459ba9be77a63a6338fea991f08be96488ac000000000100000005a089e69367c2df1534fd17afe75a1251990f35d1ae1e2ead27f19e213b49d1f5000000006b483045022100debddb6630716323de8f628d51dc36e7308fb60a0d0506c9118b2bc0ad30b34102202501fb4454960a00d4dd2b51665f110b84da2c4e241e92ca8a9767d457cc31bf01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff1a6bbcd6050250b37bcf2227492a2d6e1407bfb8207227ea02ab7894bf826f5a000000006b48304502203d39f463850662a467434667f68334ab2ef130b054f3b948b47cd44a6c00c031022100dac823101bfd4cc1917b4d63f764b645033091f7175d1a4382eb086a8e0f60fe01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffffeff72ec61c005796befa6e068fedf6f838c5d84574c692725284582f822735ee000000006c4930460221009ba6735e7152039b85386460687923f60571a7dd11fd6099509a202a00e873a2022100c276f6c9988470344b0fb8c6085b0c67389da5200ab09e438c8050ffd132ed8c01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff74e6ae82dbad0c37363c7426e1436722d310e3e66af768117cee01f2f334009d000000006c493046022100ae3ac8a3face719e12a029a9b4e812b60ab4fdf7fc428248559571dfc8ad79ae022100bf4388b1592955c5bfa4f27c304f9a998bb399dbb0e9302210f69a94eaf0e50a01210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff8292084e5eea655c4a3b37b5a6e2ee36e6a53c613fad2ded1335dae61b405f0e000000006c493046022100a1f0a2eff1ede0316ca1f1512cd6806c5f887b51a4c6abed7c7d0f4dcc103cea022100bf21eee08790836793ae45fcc93c103e6e7cd3d75e1e976d89d3088f30fae6a001210287936d8fd333d67042550a525a1a598a3edbb90cb049941d30913f945cdd0bc0ffffffff0220a107000000000017a91456fd2018804b730294decb2c5b64db5e649631dc87409c0000000000001976a9144c213cee459ba9be77a63a6338fea991f08be96488ac000000000100000007e58a911331f08ae1cb927ea9c2d55b073df111a31fb6cf456b44a7c29a13d981000000006a473044022078aad7c89fd30cd64ff7e4ae9862f6aa77e8cc5dd54dc7c819136823d19ab0520220397e8d1d41373c751b340ae36e5c755e12b3cd68ca1a880baf5a2c50beb93d2701210364318b9ad30aa93993a384db556966d2031f6f43e4842f3844bd1f65cd93ea9affffffffd912d419a7be246de1561d60b706a7d48f4346c4bde68d2c5da29bac515a50da010000006b48304502210091239c56c1b9fa16230e8da619b95c1e470d8b123c5d83e093be0c092a271f34022027ce7534139e0ca79bf1c95c0bdb94108d25895c7613d505fff6c56e245f8c7101210309048983e59de145c997fdbd9f5e05178171f992461bc29b61c6afbbe1ea416fffffffff158165f24cadd51043e21359f651937367fcb2e272a318bf745a02e1f6eb0f6c010000006b483045022100c085c9c78f51a1aa5c740a144144facc000168eadb69095aa0cb3d7075f2967d022064f6ce76354b92c33673d1e9339d688b294c6288902cbee5c1224f34143f27ea0121020cb417901a74c8accbb4539e9fbc015d841033a642a471b471a14bebe887f61affffffffc49e44882b4080297f86029b9cec0c3f1780a8aa129e0f969499ef16ed5c8109000000006b483045022100c0c17e4f731b1a53bbff8db0b4434ca58d462a7454468a4af73a6b7ad11cbd34022003b1ae1195713498b35ec996dfa9066e2f9a5b97b2f7197a18f494bd45a23ce3012103d4d363f33a55d239c53fb6fc05595b447f824f81d43496583965a1f5caf62695ffffffffb2aea8e0e4bf56e8229ebbbe4c00b33cc7674b1377ce04b2ac609c9b092f9e6e000000006a473044022061a09de0675efea1cc30ad1934df41679137373bf7a03bea5214422e723f443802202429de8d117f281f7a45c952157ff240c84abb06e515a49fbd2d22a99f94211e0121022b7d7106aa8e4169257a0b2deeb30e2419e2ccfb47d549fdb8938100a692b4beffffffff6b848ee947b03a8b6b8e37a284d79f5f02676feb34e693908e94a5028b9c1e63000000006b483045022100f07781b77dc1981078c7079d9a2a1b572d7468eb638de086ab4629e05f4e3f920220744c472e67311caf0b34984021524c4aea7d35bcc78dda6c45dc56e357f1d941012103dbe1c3932db00f29bb2a9fead1d616c52cd98b22fe97b8781592353c4851d92affffffff8fb585d2cfa36e1c2bb7b8d81072523b486bd6f0e0cb0dae81eb7824180b9d0e000000006b483045022100cb07224583b986f28c2b9608b6dabeabd8be68ab66a1f5a3185e8bcc166c893c02201a097f691966d5cb2cc2298c4ffd9700493ba3862a73e78564f58dc0dc521dc4012103d90039f7c825894480c88e0ff25b159d57839288d1af7dc03a74e1a8e3da0daaffffffff0d8d4b7508000000001976a9145798b1c2d9ad862e3f13230c73f8d3a45ba5d47d88acd3de0100000000001976a91490c5bca58fc058ae95cecf9cec3857ec038cb47588acb8e6c300000000001976a91485433c070225a28134942c30bb9aaa729d45cbce88ac2b7df901000000001976a914c10e37a8cd55d9ae65567d832a8d85a56714093088ac1b97e100000000001976a914ac4f0f5d94c6fa68101dd5ba7af0bd30bdfa6c6388aca8394701000000001976a91432a9d57674772ca22e8df9437ef435a175289ead88ace2843e09000000001976a9149cfb1ea1359dc239c324e14ec92f53ec6f266a9388ac5b420f00000000001976a914e518b376cad97add0337b7694304c0895c4424c088ac20d7aa0d000000001976a9149343f22e38dd0748df30e0676bf7e8f5bfe3689588ac40d2df03000000001976a914670ba66102010a8dbb4b834d2a536484b91d4c7c88ac70048f01000000001976a914013cfd5b16b326295a8c60bd4d9ba2b75264696d88acc0687804000000001976a914653cf6f017b060cc46ab3796f411ffa0bb095c1888acb9b55d06000000001976a9144556b5c73621dc38edf5ae67e7e6c1add6e8244788ac000000000100000004a25919b2d9ba5834827dc6e52790c9cfcf6a637484008b611aa9ca3af38336ea000000006a4730440220496b1f109dc487301c3bae236ca6f8efe691d6e09c8eec3d8d5f97719760375b02201fa6cc5ad6baacd8ed34815c37b57a5564e1a7fc6e8e8353194184ba92b42a1f012102bf07874177e347f83c839c66c1c52a7254d091878922e646dc50ce37fd841487ffffffffd3485a41cf92dac3a6c6fede35a8f7e7ee030d4874d47fc18172bdf56715dcae000000006b483045022100fcb4ce877306181168540a2fa68e451cbf0c201912396b807b9995e97a31b23d02206b8eaf5fb58bf5e74e43b8301bee6e8c5d10082412778bfc62cc017d8c0d7088012103729edb8599da8f125923e9a8207e5e7cd2c7027ed9a0212775a64ce1d600f0aaffffffffde100c0b556a7dfd90575b1fbaf37a1578ea39385403d79c2700d0ef367e0525000000006a47304402204f439a89da1f48711ecb229b0d429aaf7f6a9e8292594e183e9abf8c9342f4d302200ac2691f836dbe91a1dedc92118eb497e4f0462d530919046b12b05f186cb0bf012102b8924f3067c38fed22445d5371dd4ec67cc5c038aa2824a5f3c6b787082b86b3ffffffff76fdc1bbcd8cee9da6ec41cd7fab35ee604e5f108d0a5724d32197fd430faca8000000006a473044022022cdd1980a09779852623a041b8500ea95a27aa3ba7772fa435c7a2a0f7f7d310220222167e6ce5ed1ff8c45eaaaf95931c24b404987f04c5233c8b29e1ab0d960d00121028dd4ad13065e7cfe7b706f733ee6067e879497be5f595b6c2eb28c4bed31db3fffffffff07ce122000000000001976a9142467e249b29cb00598b2d0425f8135fedc7ed2e588acacfd0100000000001976a914b46d1b1e3af916966c0f45fe34ca590d6c14d3ed88ac20394200000000001976a9140202fddbb2435f742e4230d604af24815d797be188ac60900f00000000001976a9140d8884a248b37ee8a2312ef14c14e0654fab7b8688ac26250200000000001976a9148716b034aef06ecc5d98ce391c869a70db303a9188ac20d61300000000001976a914680ea70e06b0169c9756bf38c7736d0adf191aa288ac084e0000000000001976a9147d490fb2b7d9edcafe5dceb95abdf63b8a255c7188ac0000000001000000087609408a14b30aa7fed7c91485edd9fb19a0ff0b8e7655674bc0923cded59a0728000000fdfe00004730440220702d110a384922ba8687a7447bbf91373627b30be4481a12ff7a01690fe3bdaa02204958f9ae0bdd9b0b03641646989afb1b3712c20a5bccd841e0cbdbce008df60001493046022100f1365246bbbdeb9616e3a1581702c26d6323b34048f9508eb7ef45505b9df804022100cec9322439432f3ae6b5e7bbcc474c4b4e5b2fe52b7e21c2d70f89b48219fad8014c69522102f097ad5490aee78ca0fb0286d59c94d2ad258607cd68a1d2257182dccc69a1bd21032f732aa3f330907065589cfef2cc40fe288050c31d8956271f2d827a5f3d365d2103e0cb6f950544c56be8664abe8e7c9d32f37b33496480180a4f696425e4516b4453aeffffffff465db37737567a3e32b67d71fddd204996a294f87f3f5ae17395790c0da68c2255000000fdfd0000473044022060e2a023fd886a816704c473e5f2377bab62787ccefae0e357dbe77afb9bdce702200888336da996eb3af0fdab56d77192899c7019ad4edb361af404b409960eb7b0014830450220113163876c77e4e08eb0194000f0487481463699fe8b7a2ae69869830d7d543e022100fb321053d245b801a8c6c266836a83be89f1c6de0e59a3f834a602512c6625fc014c6952210317ed21dd6e3ef90c3aa1a6385ac7eff20b8d2ea574e8caac8fc2d2b05c9a3c88210380d8387ff569a9fe2f97d0c3c300dcc001abf283acbad5120b615d313a0ad74821036164c92b13ad43a1b58bd0f12ddded8e1b6981d44594ef9250701927f7b29e9053aeffffffff8d1b077ed5cf09d127814e2aeed3d07239ae203b3bf7ea7800d550c6a0b2f89102000000fdfd0000473044022006107410b6bded858373116de669203ec066c382e23ff3763f060b90718efaf002201f61dc47d0df192bbd8f2e871ad4bca5983bb700c3b95301552e4d2edf0cc38701483045022100b2b592ee57979e602cc2367fd7f1abf0a042c56d10ae0afbde60004f753a10db022058ef20df40d8de780723f289541ec2b924317d541617dce4d23e7ad4bc9d1e48014c69522102e12b9e6609d9104fa65e7af8ee70b7512b660268c39f797a14cacb5bd25f804721034a472f1ba414665eecce4ecde2e340cdf8da2cadd92b9cf1a89ef3e4a032c8c7210206cc704a962679606f44ad9d80be136ab49ab796125f80fdf28ed1a38a9cb07453aeffffffff8d1b077ed5cf09d127814e2aeed3d07239ae203b3bf7ea7800d550c6a0b2f89152000000fdff0000483045022100ab320f61862eb78a5eb324a70e6abd01f21ca2b735b2a669d8b2f3b1d2badbd702206de7796daa82262e78e2d8a8bdb655d9670e944017d881d5d0caad43de34d48f014930460221008deebbd859fa8d540cd68177eb40864a03b98fb78396a3c0162bcdb0e506c3ce0221008ab2718f51fee27f0ddaf53f96a3f24c54f2dad350523005e68dde6b36d3dd67014c69522103482d14cb45b034286818848616a4fc4b1bbba4a3af12c630421b87382f8f22e721034242b5a5492b8e89cde074e4a2ed873429acf40071748654dd8c6f8ce3e7d13e21023ee1e8c8e0731340babc372c9b516ef3993594abc7e87364cd5c56536227b9d553aefffffffffc7db1d32f29e6ecab3c94e7cc018b93974921a50faf4b8f93c0e68caf4f281d01000000fdfd000047304402206f02ed2f5c6f712a2fea9a3c57492784386b2a9cc7118459edbc15d29aa5a45102203911ef850036c24684ba0cbe4bb3d83136ded6c59d42651904c9cd0e647f6b0d0148304502201a3c03558809a02bf44fd2789ee7dc6f17313614f3af62148c9c5f5654b9744e022100e5f96611a3de5f76bcdf33db833e8edfc83c4c287d923abe8fae8c53f9253914014c695221022c32817fb3a4e32d6bfade84ab4b485029f68678e3fc3a6b4b7126e5d44e844021033315ab2973621dfc637d86d1fe36245df50d0a271078c1e1b51f5e094eeaeb2e2103d1cca2a83edf5a7d0cb9e9422af530e9916d3bd2f293b75419dc7cfc8e9a20da53aeffffffffe192f2a83d78167fb3e79617abc7ef1c62e0308cdeaaebb111a490a9804bc91338000000fdfe0000483045022100b3d66a272ca6b77fbc4f59c046d8c68f77daa524f9800b198185096bf2610ac302207758ece29b70a60344f178a600955a8a3105bd3a53f9309ab15e8731945b16950148304502207bb172374e02fb68acaad2f1d8b15ded9d70c3e0d6cc91e9aff973fe2b03a965022100a888842a2306c323319695e0513f705a6c58546dff95bfc7a439a55c5eea59cf014c695221022e24e284889f6a962522f74a872048ab9a49f6a45b4df1be46922af3294000bf2102808c2976f2fc730f43f9adb1e22ebfd96bf9363236a945ed69eaa4c9f399eaf52103604e127ffc4630e490fe4bbedbe69f10eb5d51725ee5b68ad0013e2e0b8337c753aeffffffff465db37737567a3e32b67d71fddd204996a294f87f3f5ae17395790c0da68c2227000000fdfe000047304402202888e7de5436dde7957d846dd1ef365ef736dbcda72dd21033552a16ce1c9528022001e840b5752d077b6600fd8af51496ae78744acfc85a2bdcfa82836c1267df170149304602210099ddfdae142cb42a0bfc19c2ff78cdf0fadf774891e9e5de2cfa7635bc7edab0022100ee594c99c814f61b1a1d516bc90e0f0da1d7c1829c8c3ff4c9b5a67de8a0cb57014c695221020dc3d127c2eddb411ff6eb7071d6e9a8c11208e47c95f899d35367a0fc3610f7210378d81d7721a8a9498db4612a5a5736834e4cdecdda2767b93e02820f176a77762103e957ff4984dd3e4c750e71a4b150b92b218d58cf045f2073788aa2055184170953aeffffffff5e023dde4f10a46a67094f66c4fef8dc3236b7e8590ea18f8824fbb68cc6067901000000fdfd00004730440220175fa15bdf400c7d5a6b031073ac16f1f30435420279802fcad283e13c982a0b02203ddb5127ae8399f3abdbc60c407c47bd981b98463a45177b49d9596495d5b08f01483045022044066221aac5ef641fd2ee53a0a8cad2f470a0cd9b19c395abd463284c0bc7d10221009ec719628246c7fe0762dc3781d9925ac4ddc99c3e64de78a0c3bd9507c15fce014c69522102eb42161ad73027321bc3e0334d2f657b74682af68821d024d4daa8b0bf7502d321032e7823d9adc9eece9f6a8a7cd71f1c619fc76e984df0c8588001d22585644c2a2103d0698947f0b5e38c96b3c5a801035f09c8de463e9dbb3ca238de42c309c4c2e553aeffffffff0436506800000000001976a914b5de8d287e058ac2967e1823016101a7cc700cf388ac409c7102000000001976a914174efcb83831aea5de5e489a1473f617481e628788ac8fddc5020000000017a91437d153e81c48278b77a099c09411d38362751846871b488315000000001976a9144bdb0b7712726c2684461cd4e5b08934def0187c88ac0000000001000000013f980a803270dd6a6786edfe545baa6a02299d5a05a593f15cae49a083e6288201000000020151ffffffff01384a0000000000001976a9140659ea0f166aecb428e51a9414992bf28cc0c9eb88ac00000000010000000121badea07dede0c45c6aa69d2579ebe56387f91e354c36079a33251ce4a860cd450000006a473044022006b63c164063d59ff707186a2ed039c6d5185edd96f264fc43d4376b884fce5202207498575f55a87cb4ae2bfe56072bac74438a8f4b29e3d488bb007307d206fa90012103ad488d5ba48f949825bce6b92439d788027f9cbc787951f7198c170a4b681a94ffffffff17701c0000000000001976a9142956227d413b490b989b552a4ab69be35fbc451c88ac5b1b0000000000001976a9142bd6d10e6740b2c5ebc0b85450ff2c69dd4529f788ac301b0000000000001976a9148ba8418e16e35622f665c481956d821f340a111188ace01a0000000000001976a9143eecb7f092221721da151281b7ce2e720bcacac088acb31a0000000000001976a9142b2545d96815677cd040c4692b8857057be9872388ac901a0000000000001976a914db2ae9e13aa7320a4bb3846dbe96d021009bd3d088ac181a0000000000001976a914b3e73a8cbabe69e4a170c438dd9c0cddea3455ad88ace8190000000000001976a914f559f58817c8c0db2c10178eff2277de1353491d88ace0190000000000001976a914f84505347756776975caac6ef0cbb6c654fc8d0c88acd8190000000000001976a91458b007ee9bba66cf9a2d8f2ef11188c0f3e2f85388aca8190000000000001976a914118bd8c9b9e021128943a0fb737fbcc55176d65688ac70190000000000001976a914cb503359f07ac61b140394b3a3a73719b2716c7288ac60190000000000001976a9149a005e082df0dce421a6402d9df949d7d30ffac188ac701c0000000000001976a914b8bb935415182eb63a99822116de4269398a23eb88ac00190000000000001976a914c0d99470ea82e172492dc65b4ad4f70d1c6ba85a88acc6180000000000001976a914e2ca06d3717aede4a1758d6fd26623beb18c155a88ac91180000000000001976a914ae0e6a316462c96ed3d9357c6026860dad06ea2188ac10180000000000001976a914ac670f702c391ecff364bf5482493352eece69e688ace0170000000000001976a91471ae8a29a1fb1b2bd6e8db48de40f576c9c3bb4688acd8170000000000001976a914d2fc79d8e848f4c5e529bdbaf2985fd32654ef4f88acb9c02f00000000001976a91442bd8225289a7abadd9ae3ca03c7728cff703b6188acd6170000000000001976a914ab3e698fca2f209c5062714159703d741001a7a088ac90170000000000001976a914c2f3d984b27f54fb595c3d9360b7b086ecce22df88ac000000000100000001935bda72d8644e92e2d6450cf91bce89e3652955768605179d0a046e74b618ce000000006b483045022100edf973ea0e40be7dad3146ec5149210060891ba2f43085658918dd5df91fe9780220737960ee427a263be22d1d9ec2f6b5d083dbddb399ed96900068b3ca526be3190121029e327a887d04cf47cb5c3c0a98752bc14b91a868b0a7d7354ac2028ecae6cbd3ffffffff01a0b39705000000001976a9147af1bab2645028cd20a491b7929dec96f94d5efc88ac0000000001000000025372c4c57f01eff16fe31289c4efc1d099380a2b67dbad9f55da402495440fab010000006b48304502210094ff5b3023b9f9657408cafba21827ef7fee96f19508515e81dca142316622e102206f44491df30309df6bb38fb459026d0eb2dd3b966506f6d28189ac0fc283bd700121022e1d51adaecfbc0e017738d48235c085906618cba0fc9941f03fddf0d0badc4fffffffffd447c8af81eefb0c2756569872623d364a3c7eeaff53252dff56b982556f83c0000000006a47304402203f67ce31c855e1823f2dd1debca9e4a5f39613b49022926e19cb5457f70624ce0220791cf612ded8a39f3f273e30015d1e6512be8282422b665c4828afb39076b2d60121031f4450d4aa56dd24b29ab792e4e0c7500e2961f197bd2bee6adcd21c3e3389e0ffffffff02c0d0010e000000001976a9141fa4e93cee43ca9aec1daa47b45fd0688a41489c88ac93a8ae20000000001976a9147b9e4573be924d06881b8153d6e5ab7522b000e288ac000000000100000001892b2fb2bc30fc18cc074a694a6ad0f3c7a76b529b422eaba93179960d47a48c000000006b483045022100f2887c5790a946300eec692f25fe951b59043b5f130cbea4055497a136e3f0b602201cdc394f8dcb3dda960469981d77cffd8c3e9e2fdbe8c5b9e4b680c995ac5eb5012103b202980f3554ff2359cca72e34e3a33de23a141848236160bf97b6f69b26f45dffffffff02b8820100000000001976a9144893c1f022614617af0f0217df7fa45f7a498c9e88ac0000000000000000136a11626c6b434954452d756e646566696e6564000000000100000001c7d45151e476d3ef37b8944d9f65b95cf5f9e4438d083764a0f5352de8031673000000006b4830450221008225c2e34e135406d6b6ca68608891a445b7ee804343c72ff044c5d4634b5719022057b87a9686d18434555ebfba15576190f4e34551798a2f2a664e455d7ce5653e0121024be17673c8cffa66ab1ee3969b6f89e0e31db476647d3ae431acbd5d4447b240ffffffff02535101000000000017a914b9bdab29754755bf730da0262a8ec8fbecaa85a68794620100000000001976a91492228f5b257c8cccd31262fd24837a3bda521d0088ac00000000010000000140e3777ba2a8e94ba5bdcc21652532cae692f3cf626817c8d07e8ab7178d782e010000006a47304402207aa519e1a01415cb116d176ee200a6558083c27e2e01fc1833fba8800b35407a022076d6814b9c61a5dc18646633acbadb10ef56c31e2a60b4e534ccb93c4efa3cb0012102ab6efabf8449c9c3f163c26848682c100bebb17f8e0f9ae7074308945b1508edffffffff02c07c7a11000000001976a914112725d290646acce6c36cfd283cad60bd2b621188acf8b95007000000001976a9146e43e09d38b9ca4a1a095a8161842e4803ec7ce888ac000000000100000001e02bbdb6fc8634876bbbb507ba4474407d474d34bc294c935476517527c9d8db010000006a473044022008da34bc1b9255e65b5c232e3f12a15eb766e5706aac5bc571922b9e1ddbedff02204f370c9a614b8d5362e8134709c82d96cd714f631adb96e79c3ab7266f9e1a770121028727951f9e85defc362016f841e8daa97ee6bcc297ff7009714df0389213619fffffffff02205fee05000000001976a9140d938222ff45ab1aa54bcc7f7369d6424f33004e88ac704c0601000000001976a91467fcd2894dbbfb5ce5b85b252bf8a838c2d6a45788ac000000000100000001c61ccdd6da33e60a7090a4373082e97eac451dc227644a09efc8847cc81fd47b010000006a4730440220270762d0afe35bb6b7c79625f691fdbd99e82ff1d6c47a64bd6c8b9bdcf5409f0220721054e9718272c772e4700fbf0ec91f26480c15dcc820403cea33523b26f9230121026d0f25723c8eac6872a367b9b014270f09c077ed371250ac4fa57d5ad381ef43ffffffff02a0860100000000001976a91419fe2c57cc57ba070cbb3d5c69d29e06e6e5adb088aca77e1100000000001976a91460f0c24dd4859f65b504af0394e22eacdc5333c588ac000000000100000001902b3b7bb311a221091be40807205f53ded1599ac1da99a6cbb3289ad384efb6000000006b4830450221008a9cb6210e5d2e478853db30bc86fb7887db9b7cd8f4aebab71274291ee0ab9b02206731912cf306aeed7e4b18c2e45233d0d706c23f51ca14daf75e3596102f70d40121030a7b28ff87f8e0c327296c12fc3e5779daee706969bd029345e04ff38ab25813ffffffff029c8a0600000000001976a914ee3294b4823a5b804c8c316315a8eb00124baf6f88ac7065c500000000001976a914d20dc2429bfdab9b6239a450cb828480ead1047188ac000000000100000001c54acaacadda3b75e3e7183570a7c4a3febda1e962abe68aa5d1ad0052240d91000000006b483045022100f9aed4750c10a0d1e0bbec3755bfefd1c9d628cd4ca1e74652c29e5f22e046ca02204473630d5c959bd0b9898c1d19d367d73fb81790f84b1b3d5786f44915db90d0012103260085357d1f06c1149873a6372a291b144d03890b8761924bf7e9f0010ec628ffffffff02f352bd00000000001976a91457d364528698fcde6f8018a77fd62e90ec16571788ac85ee9600000000001976a9144b28b59197ed1cf8ae58ed8f051c1e72a5fa3de888ac0000000001000000018ea0adf0b93418ae9002dd83ace465d27f8a00d0eea5f2757c8e8652e022b6b9000000006a473044022041db21de2713733f8f4fe78655b7589a488b8e73349b9eaa494adc6a0838d03102200158a7676749591a51fdf5e29bc2cbe0c01db9144ea19e85f287e3d15dfb3436012103b202980f3554ff2359cca72e34e3a33de23a141848236160bf97b6f69b26f45dffffffff02d07e0100000000001976a9144893c1f022614617af0f0217df7fa45f7a498c9e88ac0000000000000000236a21626c6b434954452d6b6a646637363134716173646a66693931383479657279383100000000010000000193bfcae914db1279814dea6726cfc748b755bbcc4a93a273a9c620f2508a78ab030000006a47304402203abaa04cab72480d6a829b6ac1e297d17c0216ea64cce0bdf35f24fca2d2b56c022057b1fa4a6faddfc24e582f53630994df25f93dbd7b6ee887c17526145a58b37801210359ed9fe4b091a14a825283ea157184972e40ee7bf19907f8f55475a7e09b57e3ffffffff02e0834e02000000001976a914466de898febb92569e14fa08f86c4c90ab9d91fe88accc8b0000000000001976a914c670fd303d0eed54dfc1f5510cf65a8d35c4b90388ac0000000001000000023afb3543779eee68de215e33294df8829f50d040d694591c6ecb90289353ff4201000000db00483045022100c0ec3c6093d278fce86c302c5530fbd392053d286b057e50239c8a1c064d3b1502200acb0a998419e0f498ac20e1289edb88481d6b27d25fbbb1b0410221705924e001483045022100b80149d2516873b9a9e1ed907564bd8eef80c0b1920535fd84a3f5b78cf6375d0220522cebee4005c2ed5b5a07f35caf016b519f362d92d762b871a7dceb6ddf5e110147522103fe703028715e95bbdd7ea2b1b1d42b497f1f30cea7f02313060e802b676edbe32102aeb999f6601af13b0f9391f642611e32bf1bb7db593ec1630c9fc6f9bbd1c35c52aeffffffff14254bb015e1c9544d767273680b13fc95a564194a6aa739611f1ded4c31a33d5e010000d90047304402205aea8894da710b14f0661ad722e79b074b6c1384418bdbc400f25bb3b951765402205094028481b583fe34222e78319ce57df25d5fea43d6581266d71439ea6a4daf014730440220582a636c2e9301ed94ed2a693199b3d46498d247823c1afa6691ae2dc8f7713402203bd3ed6421b7eb99c6f11709d7231b3ce1de42ea9ef76b252a40feaf0b17ce2d0147522103fe703028715e95bbdd7ea2b1b1d42b497f1f30cea7f02313060e802b676edbe32102aeb999f6601af13b0f9391f642611e32bf1bb7db593ec1630c9fc6f9bbd1c35c52aeffffffff0210270000000000001976a9147e39d0c3c9f2dd1cb6efff02ea2b3e66f0fed57988ac6c0700000000000017a9148511da076b68f24fc8a506e4688b4c0bca0e81c8870000000001000000019b8630b859bdc779e56cd05445c56f9217d733031fd346cbb886c8cb1ac79932000000006b483045022100b6c292ac096841a29de61a0cf7b555d374d46708452642a67798cdb8f6b30277022009f67af8ed398c382f42c2bc96057ad1fb39e55857ebd649f1691f15d1acf754012103e229ea70ab5ea17031d89e7c1e24e9c77639c847378fb953753d73a5ccd5c4faffffffff01be850100000000001976a9149b95ca317d2d4c255ebd4036410d2ded65ca872988ac000000000100000005cb135d9ee2626ca15b7dfe4d7610d2fa9d22bec1f42927518dc957827d87c58d000000006b483045022100f717c831ad1577900bd4fbbfa35f079c9771757b97688a6a3c88532e5843d9c7022030e31a108bb4e06f79810ce5de828fcba5ad9a20cac8fbf02a9ddb6ac8c7c8a9012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff218cbb397655ee7aaf4ee7f232545800346a96449546db79a9f9d054d145d891000000006b48304502202e26268ebc8529e41874136c429a9a82a5a59bc41b983574a9d874af9fe54ef1022100cc3c02aeb0c63db3c3e5f8534b03d41f7a28b007ad1dd26c6dff04e887b23a6d012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffffe96533968cd1cfc9a7a49fe56afb0496794f6989c711ed94431c0037ab92e0a4000000006b483045022100b75656bd4cb4119e95f7a74b687d9280d0a295fd7ddb8a06ce64923ae935c6a6022051b35243b48073d99a05862475774b57e59caf57320020e00eae61f411ae304d012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffffd8000b57b08873fdb6bb7e15a0506708cd3c3398be3a5a7f59030615c949a6d1000000006b48304502200203dc41d55f69f64c957592663f015314e145564456906743602246ec7e48f7022100f4416318828ba33e1732af39cdf7d1d6e845b3ee7c5a6315bb5d26668969b921012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff29c23a479db487a4157b66fb3582c5e8d28e94cfcc34ec2b4454cbac5b5bfcda000000006a47304402207bb2972b1d007357e82f537d3a74de5dfecb404def5f6bd7a794fd93bb9ba87a02204d4452cafd8874eb521e67f215ca60087de9e85d8894b542394301fa77668de9012102c331723cc8ed4bc09fe3a1107c2ad8c516af3e3852060bc6b4a47a9a791fcf67ffffffff040e120100000000001976a914a35c87540e251d00bd7c25b8561fd13c8e20621388ac060a0000000000001976a914568e17467b6f1d7a98430f189c4c3d2246f5ddde88ace8030000000000001976a914ac9d08a94f54186101973113614965453044ec5388ac4c330400000000001976a914a6559089e22b9bbc8eb6bb0dd02d341766c820aa88ac000000000100000001a42006a28d5d9b21d08919897c1c20ec84a75df119eb78140547089cc26a760b000000006a4730440220424789281497268eb87b0d9e448e043cd5356059c5bfb0335b0047cbb17084d8022063100c678b0eabc2f42066821ec8dd1c6b6e4b563b8bebb8bf91ad02c079850401210366c2654259c544a8ef1dadeab869b94bcb8b6e4da09f4698dfdde2b0a882b0b9ffffffff0260ff39a1010000001976a91427c82c6e4ce54acb9c2c67f1ab843715d50a3b1688acb9193777000000001976a914459100c6f8143640d5ba2f6f21d95c5557b0987188ac000000000100000001bea0f6596f6547a4a9ce96944f581cda73fe68e3882846fccae1bd9855db04cb000000006a47304402203fcd10fb496241f41465435ac740008018af0a1b9c6becabe3621a269dbd3eb202205f7b4cb0fdecc39baf170b0f6ae2d74b6bfeef593bb9ed0ed4d9dffb3bf5fd2a0121035411432297cdc797ff8e36bd513352e59b21c0cb6dd3bcf13b6a7baf344bafe4ffffffff024a34821e000000001976a91469a81bd81731c19ac60a473113e2ced672c9cc6e88ac43535a46000000001976a914edddf3ac5084f4df1058ad55d72e7d92b0773f5088ac000000000100000001b95bc5738e9c764338ee9afbd78644ea02df709d1a74ff18adb877528347dead000000006a473044022046d9e32c186e0fdec6b3df555c7e726a0b07080ca39aba6cb7cc287c50a60a03022065042320781b2b9403c15e50d05404c63238ffe3664db1186c11531ef01044a901210297b1240283700504758315c27f1958e8649fa5f8fb067f266925352a3a5cee17ffffffff02001c1902000000001976a914dd125f8605acc2cd784cfee8b7d8bff9f65fcb7e88ac32b96802000000001976a9148ab0a5bfca9ea41780a7b83381cc2dcbfc6298b188ac000000000100000001bfa3b6f9e193186e520e6d1bcd2dd42eed0aa3764a330e3922f325f8b8ddbc99010000006b483045022100c7a05b76a91407cadf8eb146b4fe09b7504f2654314325c8d5637c61f613cb6802202281ddad11ed6690609ec6ebb0715cda26621ff0cf4f5b69e47c2e9b4b5550ad0121024b30a1a48f4935058ac79273660a6d79550dafc71650152f14469ab3a9c8aa0cffffffff0203556d0e000000001976a914b4019007cff80b6b987f68191c1433b8d1cf6d6388acc0687804000000001976a91471729c6c03714a4a510299aab5b9030b944dccb388ac000000000100000001d70690b606e7ef96e7ef2e33460718ec7e93e9d5a98025be162e2dce64749db6010000006b483045022100f6562c9d7d2877dbac9a31de1634b3c7cbed91bef26972c9e0249fc4fb56e67e022040483f1c3c81ff807f82593d105ad37b1a0c7ed927c8bdaa1d558a9b4d0676170121022a023d7d15923fd2d3351323fe743dff984a87507dab7694adc75a80e22b6fc0ffffffff0288a3a815000000001976a914d05b8837feb7b1c20ef13ec76d2e3660e03680ab88acd4247c02000000001976a91471207fa6371951b4f6f53ca34213f753b5b4394788ac000000000100000001f231873fd290c03c2d8b13818893cb2fa88a6d7dc7dbbec29647f4f08343460c000000006b483045022100bd677305b3afd3e921f13773f92f5bcbbe732ac95f430665d0ce38f2dd715d84022071f3daaf83461cc15af5d0d2ba8dca0a8614de3a201f504c131f7a14d591a54001210240e251cfc6450738d6368155469814889a1af198adf2b65e226415af3f4b2124ffffffff0241f5e20c000000001976a9141a3265d7d31c2691570d5cb592417324cbfcff3988ac65adc508000000001976a9142d6c51edeaa5c20653638952b95a1282d145d5ff88ac0000000001000000015edf447e00d5ad32259ed93c7dce2191fc6401255f6641dab4a7333f8e8fc316000000006b483045022100abf99da57e19cb3fe61b95225ac22b0cfcd58a77bb885e16d28644371a5b35a802204009685cdbf260860ea34374b63b0f6888990d02a7202f5f7e00f6c88d448946012102319e5ddbbae6d9da7aada698790758a7db0d5424f50ab717c6fae1ecafda614effffffff0276889004000000001976a914a1b0e8d492135c75a1a109e249a8190e1b69ea2988ace96b5208000000001976a91483158b1f9e33ef4657f4e562d0f1f880d08eef4988ac000000000100000001b080e9eb487aa93eaae6df4d1cfc0b6a586f0634445bb856aa7c5cf43d41bcf20000000069463043021f1f87b9fdcbaa0f208283dadcab63c547d3b1cac6d08406f802d42a9c445aa202203b572ad168c39faa8b2ee3ec1761afd7ef2d45cd68b6f7e40783797d2d2837d60121021091eca140c51666414a3bb9d4f077f10f109ebbae632034b408846180a63b81ffffffff02c5a5e902000000001976a91408a07dec5cbc859b0ce62586b13d10e4cd8cdb2388accfe1a601000000001976a9140aa5ac2f732c75058f584c26489489f4ef15e7e688ac00000000"
diff --git a/benchmark/package.json b/benchmark/package.json
deleted file mode 100644
index d9c9fec..0000000
--- a/benchmark/package.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "devDependencies": {
- "bcoin": "0.15.0",
- "bitcoinjs-lib": "^1.5.7",
- "fullnode": "^0.9.0",
- "benchmark": "^1.0.0"
- }
-}
diff --git a/benchmark/script.js b/benchmark/script.js
deleted file mode 100644
index f14e8eb..0000000
--- a/benchmark/script.js
+++ /dev/null
@@ -1,85 +0,0 @@
-'use strict';
-
-var benchmark = require('benchmark');
-var bitcore = require('..');
-var async = require('async');
-var blockData = require('./block-357238.json');
-
-var maxTime = 30;
-
-console.log('Benchmarking Script');
-console.log('---------------------------------------');
-
-async.series([
- function(next) {
-
- var c = 0;
- var scripts = [];
- var block = bitcore.Block.fromString(blockData);
- for (var i = 0; i < block.transactions.length; i++) {
- var tx = block.transactions[i];
- for (var j = 0; j < tx.inputs.length; j++) {
- var input = tx.inputs[j];
- if (input.script) {
- scripts.push(input.script);
- }
- }
- for (var k = 0; k < tx.outputs.length; k++) {
- var output = tx.outputs[k];
- if (output.script) {
- scripts.push(output.script);
- }
- }
- }
-
- function isPublicKeyOut() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].isPublicKeyOut();
- c++;
- }
-
- function isPublicKeyHashIn() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].isPublicKeyHashIn();
- c++;
- }
-
- function toAddress() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].toAddress();
- c++;
- }
-
- function getAddressInfo() {
- if (c >= scripts.length) {
- c = 0;
- }
- scripts[c].getAddressInfo();
- c++;
- }
-
- var suite = new benchmark.Suite();
- suite.add('isPublicKeyHashIn', isPublicKeyHashIn, {maxTime: maxTime});
- suite.add('isPublicKeyOut', isPublicKeyOut, {maxTime: maxTime});
- suite.add('toAddress', toAddress, {maxTime: maxTime});
- suite.add('getAddressInfo', getAddressInfo, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Done');
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- }
-], function(err) {
- console.log('Finished');
-});
diff --git a/benchmark/serialization.js b/benchmark/serialization.js
deleted file mode 100644
index ee948a6..0000000
--- a/benchmark/serialization.js
+++ /dev/null
@@ -1,122 +0,0 @@
-'use strict';
-
-var benchmark = require('benchmark');
-var bitcore = require('..');
-var bitcoinjs = require('bitcoinjs-lib');
-var bcoin = require('bcoin');
-var async = require('async');
-var fullnode = require('fullnode');
-var blockData = require('./block-357238.json');
-
-var maxTime = 20;
-
-console.log('Benchmarking Block/Transaction Serialization');
-console.log('---------------------------------------');
-
-async.series([
- function(next) {
-
- var buffers = [];
- var hashBuffers = [];
- console.log('Generating Random Test Data...');
- for (var i = 0; i < 100; i++) {
-
- // uint64le
- var br = new bitcore.encoding.BufferWriter();
- var num = Math.round(Math.random() * 10000000000000);
- br.writeUInt64LEBN(new bitcore.crypto.BN(num));
- buffers.push(br.toBuffer());
-
- // hashes
- var data = bitcore.crypto.Hash.sha256sha256(new Buffer(32));
- hashBuffers.push(data);
- }
-
- var c = 0;
- var bn;
-
- function readUInt64LEBN() {
- if (c >= buffers.length) {
- c = 0;
- }
- var buf = buffers[c];
- var br = new bitcore.encoding.BufferReader(buf);
- bn = br.readUInt64LEBN();
- c++;
- }
-
- var reversed;
-
- function readReverse() {
- if (c >= hashBuffers.length) {
- c = 0;
- }
- var buf = hashBuffers[c];
- var br = new bitcore.encoding.BufferReader(buf);
- reversed = br.readReverse();
- c++;
- }
-
- console.log('Starting benchmark...');
-
- var suite = new benchmark.Suite();
- suite.add('bufferReader.readUInt64LEBN()', readUInt64LEBN, {maxTime: maxTime});
- suite.add('bufferReader.readReverse()', readReverse, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Done');
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- },
- function(next) {
-
- var block1;
- var block2;
- var block3;
-
- function bitcoreTest() {
- block1 = bitcore.Block.fromString(blockData);
- }
-
- function bitcoinJSTest() {
- block2 = bitcoinjs.Block.fromHex(blockData);
- }
-
- var parser = new bcoin.protocol.parser();
-
- function bcoinTest() {
- var raw = bcoin.utils.toArray(blockData, 'hex');
- var data = parser.parseBlock(raw);
- block3 = new bcoin.block(data, 'block');
- }
-
- var blockDataMessage = '0000000000000000' + blockData; // add mock leading magic and size
-
- function fullnodeTest() {
- fullnode.Block().fromHex(blockDataMessage);
- }
-
- var suite = new benchmark.Suite();
- suite.add('bitcore', bitcoreTest, {maxTime: maxTime});
- suite.add('bitcoinjs', bitcoinJSTest, {maxTime: maxTime});
- suite.add('bcoin', bcoinTest, {maxTime: maxTime});
- suite.add('fullnode', fullnodeTest, {maxTime: maxTime});
- suite
- .on('cycle', function(event) {
- console.log(String(event.target));
- })
- .on('complete', function() {
- console.log('Fastest is ' + this.filter('fastest').pluck('name'));
- console.log('----------------------------------------------------------------------');
- next();
- })
- .run();
- }
-], function(err) {
- console.log('Finished');
-});
diff --git a/bower.json b/bower.json
deleted file mode 100644
index bdfd3c4..0000000
--- a/bower.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
- "name": "bitcore-lib",
- "main": "./bitcore-lib.min.js",
- "version": "5.0.0-beta.1",
- "homepage": "http://bitcore.io",
- "authors": ["BitPay, Inc."],
- "description": "A pure, powerful core for your bitcoin project.",
- "moduleType": ["globals"],
- "keywords": ["bitcoin", "bitcore", "btc", "satoshi"],
- "license": "MIT",
- "ignore": [
- "**/.*",
- "CONTRIBUTING.md",
- "gulpfile.js",
- "lib",
- "index.js",
- "karma.conf.js",
- "npm-shrinkwrap.json",
- "test"
- ]
-}
diff --git a/test/data/bip69.json b/demo/data/bip69.json
similarity index 100%
rename from test/data/bip69.json
rename to demo/data/bip69.json
diff --git a/test/data/bitcoind/base58_keys_invalid.json b/demo/data/bitcoind/base58_keys_invalid.json
similarity index 100%
rename from test/data/bitcoind/base58_keys_invalid.json
rename to demo/data/bitcoind/base58_keys_invalid.json
diff --git a/test/data/bitcoind/base58_keys_valid.json b/demo/data/bitcoind/base58_keys_valid.json
similarity index 100%
rename from test/data/bitcoind/base58_keys_valid.json
rename to demo/data/bitcoind/base58_keys_valid.json
diff --git a/test/data/bitcoind/blocks.json b/demo/data/bitcoind/blocks.json
similarity index 100%
rename from test/data/bitcoind/blocks.json
rename to demo/data/bitcoind/blocks.json
diff --git a/test/data/bitcoind/script_invalid.json b/demo/data/bitcoind/script_invalid.json
similarity index 100%
rename from test/data/bitcoind/script_invalid.json
rename to demo/data/bitcoind/script_invalid.json
diff --git a/test/data/bitcoind/script_valid.json b/demo/data/bitcoind/script_valid.json
similarity index 100%
rename from test/data/bitcoind/script_valid.json
rename to demo/data/bitcoind/script_valid.json
diff --git a/test/data/bitcoind/sig_canonical.json b/demo/data/bitcoind/sig_canonical.json
similarity index 100%
rename from test/data/bitcoind/sig_canonical.json
rename to demo/data/bitcoind/sig_canonical.json
diff --git a/test/data/bitcoind/sig_noncanonical.json b/demo/data/bitcoind/sig_noncanonical.json
similarity index 100%
rename from test/data/bitcoind/sig_noncanonical.json
rename to demo/data/bitcoind/sig_noncanonical.json
diff --git a/test/data/bitcoind/tx_invalid.json b/demo/data/bitcoind/tx_invalid.json
similarity index 100%
rename from test/data/bitcoind/tx_invalid.json
rename to demo/data/bitcoind/tx_invalid.json
diff --git a/test/data/bitcoind/tx_valid.json b/demo/data/bitcoind/tx_valid.json
similarity index 100%
rename from test/data/bitcoind/tx_valid.json
rename to demo/data/bitcoind/tx_valid.json
diff --git a/test/data/blk86756-testnet.dat b/demo/data/blk86756-testnet.dat
similarity index 100%
rename from test/data/blk86756-testnet.dat
rename to demo/data/blk86756-testnet.dat
diff --git a/test/data/blk86756-testnet.js b/demo/data/blk86756-testnet.js
similarity index 100%
rename from test/data/blk86756-testnet.js
rename to demo/data/blk86756-testnet.js
diff --git a/test/data/blk86756-testnet.json b/demo/data/blk86756-testnet.json
similarity index 100%
rename from test/data/blk86756-testnet.json
rename to demo/data/blk86756-testnet.json
diff --git a/test/data/contract-hello.lua b/demo/data/contract-hello.lua
similarity index 100%
rename from test/data/contract-hello.lua
rename to demo/data/contract-hello.lua
diff --git a/test/data/ecdsa.json b/demo/data/ecdsa.json
similarity index 100%
rename from test/data/ecdsa.json
rename to demo/data/ecdsa.json
diff --git a/test/data/merkleblocks.js b/demo/data/merkleblocks.js
similarity index 100%
rename from test/data/merkleblocks.js
rename to demo/data/merkleblocks.js
diff --git a/test/data/messages.json b/demo/data/messages.json
similarity index 100%
rename from test/data/messages.json
rename to demo/data/messages.json
diff --git a/test/data/sighash.json b/demo/data/sighash.json
similarity index 100%
rename from test/data/sighash.json
rename to demo/data/sighash.json
diff --git a/test/data/tx_creation.json b/demo/data/tx_creation.json
similarity index 100%
rename from test/data/tx_creation.json
rename to demo/data/tx_creation.json
diff --git a/demo/index.js b/demo/index.js
new file mode 100644
index 0000000..8d10c67
--- /dev/null
+++ b/demo/index.js
@@ -0,0 +1,8 @@
+var fs = require("fs")
+fs.readdirSync(__dirname).filter(function (item) {
+ var reg = /^(test)/ig
+ if (reg.test(item)) {
+ require(`./${item}`)
+ }
+ return false
+})
diff --git a/demo/test-assetcreatetx.js b/demo/test-assetcreatetx.js
new file mode 100644
index 0000000..63d1a03
--- /dev/null
+++ b/demo/test-assetcreatetx.js
@@ -0,0 +1,62 @@
+'use strict';
+console.error('\n=====RUN-TEST-ASSETCREATETX-START=====\n')
+// usage: node test-assetcreatetx.js
+
+/*
+Build a transaction for asset create
+note:
+In addition to publishing assets miners fee, we need additional deduction 550WICC
+
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4. assetSymbol: Asset symbols, publishing success can not be modified (asset Symbol Capital letter A-Z 1-7 digits [A_Z])
+5. ownerRegid: asset owner
+6. tokeName: asset name
+7. totalSupply: total asset circulation
+8. modifiAble: Whether the asset can be updated
+9、feeSymbol: fee type(WICC/WUSD)
+*/
+/*
+构建发布资产交易
+
+发布资产除了矿工费,还需额外扣除550WICC
+
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、同一笔交易在确认之前无法重复提交(BPS = 0.1)。 建议通过增加随机手续费来解决批量启动交易的问题。
+4、assetSymbol: 资产符号,发布成功无法再修改(1-7位大写字母)
+ownerRegid: 资产拥有者
+6、assetName: 资产名称
+7、totalSupply: 资产总发行量
+8、modifiAble: 资产是否可以更新
+9、feesCoinSymbol: 小费类型(WICC/WUSD)
+*/
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y9wDyMys64KVhqwAVxbAB4aYDNVQ4HpRhQ7FLWFC3MhNNXz4JHot")
+
+var assetData = {
+ assetSymbol: "STOKENN", //asset Symbol Capital letter A-Z 6-7 digits [A_Z]
+ ownerRegid: "0-1", //asset owner
+ assetName: "SS Token", //asset token name
+ totalSupply: 10000000000000000,// total Supply *10^8
+ modifiAble: false //whether to allow modify
+}
+
+//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
+var assetCreateInfo = {
+ nTxType: 9,
+ nValidHeight: 8720, // create height
+ srcRegId: "8267-2", // sender's regId
+ asset: assetData,
+ feeSymbol: "WICC",
+ fees: 55000000000 + 1000000, // fees pay for miner min 0.01 wicc +550wicc
+};
+
+var transaction = new WaykiTransaction(assetCreateInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("asset create tx raw: ")
+console.log(rawtx)
+console.error('\n=====RUN-TEST-ASSETCREATETX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-assetupdatetx.js b/demo/test-assetupdatetx.js
new file mode 100644
index 0000000..4bda791
--- /dev/null
+++ b/demo/test-assetupdatetx.js
@@ -0,0 +1,56 @@
+'use strict';
+console.error('\n=====RUN-TEST-ASSETUPDATETX-START=====\n')
+// usage: node test-assetupdatetx.js
+
+/*
+Build a transaction for asset update
+
+In addition to updating assets miners fee, we need additional deduction 110WICC
+
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4. assetSymbol: Asset symbols, publishing success can not be modified
+5、feeSymbol: fee type(WICC/WUSD)
+6、 updateType: update type 1: asset owner 2: asset name 3. number of assets
+*/
+/*
+构建发布资产交易
+
+更新资产除了矿工费,还需额外扣除110WICC
+
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、同一笔交易在确认之前无法重复提交(BPS = 0.1)。 建议通过增加随机手续费来解决批量启动交易的问题。
+4、assetSymbol: 资产符号,发布成功无法再修改
+5、feeSymbol: 小费类型(WICC/WUSD)
+6、updateType:更新类型 1:资产拥有者 2:资产名称 3.资产数量
+*/
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("YCnMXzTmEbvjMHA8zLHA8ratHH5noPdFEENKfYPa2uVLcmL3wb6H")
+
+//update asset owner regid
+var assetUpdateData = {
+ updateType: 1,
+ updateValue: "0-1", //owner regid
+}
+
+//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
+var assetUpdateInfo = {
+ nTxType: 10,
+ nValidHeight: 28128, // create height
+ srcRegId: "0-1", // sender's regId
+ updateData: assetUpdateData,
+ feeSymbol: "WICC",
+ assetSymbol: "LOLLLL", //Symbol Capital letter A-Z 6-7 digits [A_Z]
+ fees: 11000000000 + 1000000, // fees pay for miner min 0.01 wicc +110wicc
+};
+
+var transaction = new WaykiTransaction(assetUpdateInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("asset update tx raw: ")
+console.log(rawtx)
+console.error('\n=====RUN-TEST-ASSETUPDATETX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-baasclient.js b/demo/test-baasclient.js
new file mode 100644
index 0000000..f8ccfa2
--- /dev/null
+++ b/demo/test-baasclient.js
@@ -0,0 +1,45 @@
+console.error('\n=====RUN-TEST-BAASCLIENT-START=====\n')
+
+var { WaykiTransaction, WalletManager, BaasClient } = require("../index")
+
+var wallet = new WalletManager("testnet").importWalletFromPrivateKey("Y8AvAr4cajNnYfzVU9gAzNuQ8rYWJ5Dq5XyTkczeb9mNmGxEKWua")
+console.log('wallet:')
+console.log(wallet)
+
+var baasClinet = new BaasClient("https://baas-test.wiccdev.org/v2/api")
+
+// get account information
+var response = baasClinet.getAccountInfo(wallet.address) //returns a Promise
+
+// get blcok count
+var countResponse = baasClinet.getBlockCount() //returns a Promise
+
+Promise.all([response, countResponse]).then(res => {
+ console.log("account info:")
+ console.log(res[0].data)
+ console.log("block count:")
+ console.log(res[1].data)
+
+ // broadcast transaction signature data to blockchain
+ var txParams = {
+ nTxType: 3,
+ nValidHeight: res[1].data,
+ fees: 10000000,
+ srcRegId: res[0].data.regid,
+ destAddr: 'wWTStcDL4gma6kPziyHhFGAP6xUzKpA5if',
+ amount: 100000000,
+ memo: "test transfer"
+ };
+ console.log(txParams)
+ var transaction = new WaykiTransaction(txParams, wallet)
+ var rawTx = transaction.genRawTx()
+
+ console.log(rawTx)
+
+ baasClinet.sendRawTx(rawTx).then(res => {
+ console.log("success-hash:")
+ console.log(res.data.hash)
+ })
+})
+
+console.error('\n=====RUN-TEST-BAASCLIENT-END=====\n')
\ No newline at end of file
diff --git a/demo/test-callcontracttx.js b/demo/test-callcontracttx.js
new file mode 100644
index 0000000..8843f14
--- /dev/null
+++ b/demo/test-callcontracttx.js
@@ -0,0 +1,35 @@
+'use strict';
+console.error('\n=====RUN-TEST-CALLCONTACTTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y9f6JFRnYkHMPuEhymC15wHD9FbYBmeV2S6VfDicb4ghNhtXhgAJ")
+
+/*
+Build a transaction for calling smart contract
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建调用合约的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var regAppInfo = {
+ nTxType: 4,
+ nValidHeight: 34400, // create height
+ srcRegId: '', // sender's regId
+ appId: "24555-1", // contact regId
+ fees: 1000000, // fees pay for miner
+ amount: 8, // amount of WICC to be sent to the app account
+ vContract: "f018" // contract method, hex format string
+};
+
+var transaction = new WaykiTransaction(regAppInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("contract tx raw: ")
+console.log(rawtx)
+console.error('\n=====RUN-TEST-CALLCONTRACTTX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-cdpliquidatetx.js b/demo/test-cdpliquidatetx.js
new file mode 100644
index 0000000..d35a159
--- /dev/null
+++ b/demo/test-cdpliquidatetx.js
@@ -0,0 +1,47 @@
+'use strict'
+console.error('\n=====RUN-TEST-CDPLIQUIDATETX-START=====\n')
+// const express = require("express");
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+
+/*
+Build a transaction for cdp liquidate transaction
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4. srcRegId: reg of the cdp creator
+5. cdpTxId: the transaction hash created by the cdp
+6. sCoinsToLiquidate: the number of liquidation
+7, feeSymbol: fee type (WICC/WUSD)
+8、liquidateAssetSymbol:get stake coin symbol
+*/
+/*
+构建cdp清算交易
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、srcRegId:cdp创建者的regid
+5、cdpTxId:该cdp的创建的交易hash
+6、sCoinsToLiquidate:清算的数量
+7、feeSymbol:小费类型(WICC/WUSD)
+8、liquidateAssetSymbol:赎回币种类型
+*/
+var cdpliquidateTxinfo = {
+ nTxType: 23,
+ nValidHeight: 501,
+ srcRegId: "",
+ fees: 1000000,
+ feeSymbol: "WICC",
+ cdpTxId: "009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144",
+ sCoinsToLiquidate: 2000000000000,
+ liquidateAssetSymbol: "WICC"
+};
+
+
+var transaction = new WaykiTransaction(cdpliquidateTxinfo, wallet)
+var cdpliquidateTx = transaction.genRawTx()
+console.log("-----cdpliquidateTx-----", cdpliquidateTx)
+
+console.error('\n=====RUN-TEST-CDPLIQUIDATETX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-cdpredeemtx.js b/demo/test-cdpredeemtx.js
new file mode 100644
index 0000000..c7e5879
--- /dev/null
+++ b/demo/test-cdpredeemtx.js
@@ -0,0 +1,51 @@
+'use strict'
+console.error('\n=====RUN-TEST-CDPREDEEMTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+/*
+Build a transaction for cdp redeem
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4, cdpTxId: cdp transaction hash
+5, assetAmount: stake coin amount
+6, assetSymbol: stake asset symbol
+7, feeSymbol: fee type (WICC/WUSD)
+8, regid of the cdp creator
+9, sCoinsToRepay: stake redeem amount
+*/
+/*
+构建cdp赎回的交易
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、cdpTxId:cdp交易hash
+5、sCoinsToRepay:销毁的wusd数量
+6、assetAmount:赎回的数量
+7、assetSymbol: 赎回币种类型
+8、feeSymbol:小费类型(WICC/WUSD)
+9、srcRegId: 创建者的regid
+*/
+var assetSymbol = "WICC"
+var assetAmount = 100000000
+var map = new Map([[assetSymbol, assetAmount]])
+var cdpRedeemTxinfo = {
+ nTxType: 22,
+ nValidHeight: 78,
+ srcRegId: "",
+ fees: 1000000,
+ cdpTxId: "009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144",
+ feeSymbol: "WICC",
+ sCoinsToRepay: 0,
+ assetMap: map
+};
+
+var transaction = new WaykiTransaction(cdpRedeemTxinfo, wallet)
+var cdpRedeemTx = transaction.genRawTx()
+
+console.log('----cdpRedeemTx----', cdpRedeemTx)
+
+console.error('\n=====RUN-TEST-CDPREDEEMTX-END=====\n')
diff --git a/demo/test-cdpstaketx.js b/demo/test-cdpstaketx.js
new file mode 100644
index 0000000..31d6112
--- /dev/null
+++ b/demo/test-cdpstaketx.js
@@ -0,0 +1,54 @@
+'use strict'
+console.error('\n=====RUN-TEST-CDPSTAKETX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+
+/*
+Build a transaction for cdp stake transaction
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4、cdpTxId: The transaction hash generated by CDP creation. If the value is empty, it means a new CDP is created.
+5、feeSymbol:fee symbol(WICC/WUSD)
+6、sCoinToMint:get coin amount
+7、assetAmount:stake coin amount
+8、assetAmount:stake coin symbol
+9、sCoinSymbol:get coind symbol
+*/
+/*
+构建cdp抵押交易
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、cdpTxId:cdp创建生成的交易hash,值为空时表示新建cdp
+5、feeSymbol:小费类型(WICC/WUSD)
+6、sCoinToMint:获得的wusd
+7、assetAmount:抵押的数量(最低1WICC)
+8、assetAmount:抵押币种
+9、sCoinSymbol:获得币种
+*/
+var assetSymbol = "WICC"
+var assetAmount = 100000000
+var map = new Map([[assetSymbol, assetAmount]])
+var cdpStakeTxinfo = {
+ nTxType: 21,
+ nValidHeight: 25,
+ srcRegId: "0-1",// sender's regid
+ fees: 1000000,
+ feeSymbol: "WICC",
+ cdpTxId: "0b9734e5db3cfa38e76bb273dba4f65a210cc76ca2cf739f3c131d0b24ff89c1",
+ assetMap: map,
+ sCoinSymbol: "WUSD",
+ sCoinToMint: 0
+};
+
+
+var transaction = new WaykiTransaction(cdpStakeTxinfo, wallet)
+var cdpStakeTx = transaction.genRawTx()
+
+console.log("----cdpStakeTx----", cdpStakeTx)
+
+console.error('\n=====RUN-TEST-CDPSTAKETX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-commontx.js b/demo/test-commontx.js
new file mode 100644
index 0000000..5113339
--- /dev/null
+++ b/demo/test-commontx.js
@@ -0,0 +1,34 @@
+'use strict'
+console.error('\n=====RUN-TEST-COMMONTX-START=====\n')
+// const express = require("express");
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+
+/*
+Build a transaction for common transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 10000000 sawi (0.1 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建普通转账交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 10000000 sawi(0.1 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var commonTxinfo = {
+ nTxType: 3,
+ nValidHeight: 34550,
+ fees: 10000000,
+ srcRegId: '0-1',// regid of sender
+ destAddr: 'wWTStcDL4gma6kPziyHhFGAP6xUzKpA5if',// address of receiver
+ amount: 1100000000000,
+ memo: "test transfer"// remark
+};
+
+var transaction = new WaykiTransaction(commonTxinfo, wallet)
+var commonTx = transaction.genRawTx()
+console.log("----commonTx----", commonTx)
+console.error('\n=====RUN-TEST-COMMONTX-END=====\n')
diff --git a/demo/test-delegatetx.js b/demo/test-delegatetx.js
new file mode 100644
index 0000000..ff3be55
--- /dev/null
+++ b/demo/test-delegatetx.js
@@ -0,0 +1,33 @@
+'use strict';
+console.error('\n=====RUN-TEST-DELEGATE-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("YCnMXzTmEbvjMHA8zLHA8ratHH5noPdFEENKfYPa2uVLcmL3wb6H")
+/*
+publicKey can get from "getaccountinfo" cmd if the account have registered
+*/
+var delegateData = [ // array, item is object data of delegate
+ {
+ srcRegId: "0369e834a7e5708d4c94b098447fbead8213c679cf4a37b953bfed28af104239d3", // regid of whom to be delegated
+ voteValue: 201 // delegate amount
+ },{
+ srcRegId: "02dc40112e2e12106c749c5bee34b4037b2dff4cd300ee5a57948961a6c9441e27",
+ voteValue: 202
+ }
+]
+
+//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
+var delegateInfo = {
+ nTxType: 6,
+ nValidHeight: 28128, // create height
+ userId: "", // sender's regId
+ voteLists: delegateData,
+ fees: 1000000, // fees pay for miner, >= 1000000 sawi (0.01 wicc)
+};
+
+var transaction = new WaykiTransaction(delegateInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("contract tx raw: ")
+console.log(rawtx)
+
+console.error('\n=====RUN-TEST-DELEGATE-END=====\n')
diff --git a/demo/test-dexbuylimitordertx.js b/demo/test-dexbuylimitordertx.js
new file mode 100644
index 0000000..8f52745
--- /dev/null
+++ b/demo/test-dexbuylimitordertx.js
@@ -0,0 +1,44 @@
+'use strict'
+console.error('\n=====RUN-TEST-DEXBUYLIMITORDERTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+/*
+Build a transaction for dex buy limit transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4, coinSymbol: currency type
+5, assetSymbol: asset type
+6, assetAmount: the amount of assets
+7, price: price
+*/
+/*
+构建普通限价买交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、coinSymbol:币种类型
+5、assetSymbol:资产类型
+6、assetAmount:资产金额
+7、price: 价格
+*/
+var dexBuyLimitTxinfo = {
+ nTxType: 84,
+ nValidHeight: 5360,
+ fees: 10000,
+ srcRegId: '0-1',// regid of the buyer
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ assetSymbol:"WICC",
+ assetAmount:10,
+ price:200
+ };
+
+ var transaction = new WaykiTransaction(dexBuyLimitTxinfo, wallet)
+ var dexBuyLimitOrderTx = transaction.genRawTx()
+
+ console.log("----dexBuyLimitOrderTx----", dexBuyLimitOrderTx)
+ console.error('\n=====RUN-TEST-DEXBUYLIMITORDERTX-END=====\n')
diff --git a/demo/test-dexbuymarketordertx.js b/demo/test-dexbuymarketordertx.js
new file mode 100644
index 0000000..dbcbd08
--- /dev/null
+++ b/demo/test-dexbuymarketordertx.js
@@ -0,0 +1,42 @@
+'use strict'
+console.error('\n=====RUN-TEST-DEXBUYMARKETORDERTX-START=====\n')
+// const express = require("express");
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+/*
+Build a transaction for market buy transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4, coinSymbol: currency type
+5, assetSymbol: asset type
+6, assetAmount: the amount of assets
+*/
+/*
+构建市价买单交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、coinSymbol:币种类型
+5、assetSymbol:资产类型
+6、assetAmount:资产金额
+*/
+var dexBuyMarketTxinfo = {
+ nTxType: 86,
+ nValidHeight: 5360,
+ fees: 10000,
+ srcRegId: '',// regid of the buyer
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ assetSymbol:"WICC",
+ assetAmount:200
+ };
+
+ var transaction = new WaykiTransaction(dexBuyMarketTxinfo, wallet)
+ var dexBuyMarketOrderTx = transaction.genRawTx()
+
+ console.log("----dexBuyMarketOrderTx----", dexBuyMarketOrderTx)
+ console.error('\n=====RUN-TEST-DEXBUYMARKETORDERTX-END=====\n')
diff --git a/demo/test-dexcancelordertx.js b/demo/test-dexcancelordertx.js
new file mode 100644
index 0000000..98bdb72
--- /dev/null
+++ b/demo/test-dexcancelordertx.js
@@ -0,0 +1,37 @@
+'use strict'
+console.error('\n=====RUN-TEST-CANCELORDER-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+/*
+Build a transaction for cancel order transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4, orderId:pending trading hash
+5, feeSymbol: fee type (WICC/WUSD)
+*/
+/*
+构建取消交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.0001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、orderId:挂单的交易hash
+5, feeSymbol: 小费类型(WICC/WUSD)
+*/
+var dexCancelTxinfo = {
+ nTxType: 88,
+ nValidHeight: 5360,
+ fees: 10000,
+ feeSymbol: "WICC",
+ srcRegId: '',
+ orderId: '009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144'
+};
+
+var transaction = new WaykiTransaction(dexCancelTxinfo, wallet)
+var dexCancelOrderTx = transaction.genRawTx()
+
+console.log("----dexCancelOrderTx----", dexCancelOrderTx)
+console.error('\n=====RUN-TEST-CANCELORDERTX-END=====\n')
diff --git a/demo/test-dexselllimitordertx.js b/demo/test-dexselllimitordertx.js
new file mode 100644
index 0000000..b0fb4c1
--- /dev/null
+++ b/demo/test-dexselllimitordertx.js
@@ -0,0 +1,36 @@
+'use strict'
+console.error('\n=====RUN-TEST-DEXSELLLIMITORDERTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+
+/*
+Build a transaction for sell limit transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建限价卖单交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var dexSellLimitTxinfo = {
+ nTxType: 85,
+ nValidHeight: 602371,
+ fees: 10000,
+ srcRegId: '0-1',// regid of the seller
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ assetSymbol:"WICC",
+ assetAmount:30000000000,
+ price:200000000
+ };
+
+ var transaction = new WaykiTransaction(dexSellLimitTxinfo, wallet)
+ var dexSellLimitOrderTx = transaction.genRawTx()
+ console.log("----dexSellLimitOrderTx----", dexSellLimitOrderTx)
+ console.error('\n=====RUN-TEST-DEXSELLLIMITORDERTX-END=====\n')
diff --git a/demo/test-dexsellmarketordertx.js b/demo/test-dexsellmarketordertx.js
new file mode 100644
index 0000000..8691d66
--- /dev/null
+++ b/demo/test-dexsellmarketordertx.js
@@ -0,0 +1,34 @@
+'use strict'
+console.error('\n=====RUN-TEST-DEXSELLMARKETORDERTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+/*
+Build a transaction for sell limit transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建限价卖单交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var dexSellMarketTxinfo = {
+ nTxType: 87,
+ nValidHeight: 602371,
+ fees: 10000,
+ srcRegId: '0-1',// regid of the seller
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ assetSymbol:"WICC",
+ assetAmount:30000000000
+ };
+
+ var transaction = new WaykiTransaction(dexSellMarketTxinfo, wallet)
+ var dexSellMarketOrderTx = transaction.genRawTx()
+ console.log("----dexSellMarketOrderTx----", dexSellMarketOrderTx)
+ console.error('\n=====RUN-TEST-DEXSELLMARKETORDERTX-END=====\n')
diff --git a/demo/test-messagevertify.js b/demo/test-messagevertify.js
new file mode 100644
index 0000000..1c597c9
--- /dev/null
+++ b/demo/test-messagevertify.js
@@ -0,0 +1,20 @@
+'use strict';
+console.error('\n=====RUN-TEST-MESSAGEVERTIFY-START=====\n')
+var { Wallet } = require("../index")
+var Hash = require('../src/lib/crypto/hash');
+var ECDSA = require('../src/lib/crypto/ecdsa');
+
+var msg = "WaykiChain"
+var wallet = new Wallet("Y9wDyMys64KVhqwAVxbAB4aYDNVQ4HpRhQ7FLWFC3MhNNXz4JHot")
+var signMsg = wallet.signMessage(msg)
+console.log("签名消息"+signMsg)
+console.log(wallet)
+//验证消息
+var msgBuff = Buffer.from(msg)
+var msgBuffHash = Hash.sha256(Hash.sha256ripemd160(msgBuff));
+var pubKey= wallet.publicKeyAsHex();
+console.log("公钥:"+pubKey)
+var vertifySuccess=ECDSA.verify(msgBuffHash, signMsg, pubKey, 'endian')
+
+console.log("验证成功?"+vertifySuccess)
+console.error('\n=====RUN-TEST-MESSAGEVERTIFY-END=====\n')
diff --git a/test/test-registeraccounttx.js b/demo/test-registeraccounttx.js
similarity index 50%
rename from test/test-registeraccounttx.js
rename to demo/test-registeraccounttx.js
index df23698..6ae5caf 100644
--- a/test/test-registeraccounttx.js
+++ b/demo/test-registeraccounttx.js
@@ -1,39 +1,31 @@
'use strict'
-var bitcore = require('..');
-
-//environment init
-//环境初始化
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-//import private key
-//引入私钥
-var privateKey = bitcore.PrivateKey.fromWIF('Y5Lrutj2nJmmCVJ9hmTmNyASJxUACu9b8djoobrHmoGye3uhXnrb')
-var publicKey = privateKey.toPublicKey();
+console.error('\n=====RUN-TEST-REGISTERACCOUNTTX-START=====\n')
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y5Lrutj2nJmmCVJ9hmTmNyASJxUACu9b8djoobrHmoGye3uhXnrb")
/*
Build a transaction for register account
note:
1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when registering a account, >= 100000000 sawi (0.1 wicc)
+2, fees: handling fee when registering a account, >= 10000000 sawi (0.1 wicc)
3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
*/
/*
构建注册地址的交易单
注意:
1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:注册账户交易时的手续费, >= 10000 sawi(0.0001 wicc)
+2、fees:注册账户交易时的手续费, >= 10000000 sawi(0.1 wicc)
3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
*/
+
var registeraccounttxInfo = {
- nTxType: 2, //REGISTER_ACCOUNT_TX
- nVersion: 1,
- nValidHeight: 34632,
- fees: 10000,
- pubkey: publicKey.toString(),
- minerPubkey: ''
- };
+ nTxType: 2,
+ nValidHeight: 34632,
+ fees: 10000000
+};
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.REGISTER_ACCOUNT_TX, registeraccounttxInfo)
+var transaction = new WaykiTransaction(registeraccounttxInfo, wallet)
+var rawtx = transaction.genRawTx()
console.log("genregisteraccountraw rawtx=")
-console.log(rawtx)
\ No newline at end of file
+console.log(rawtx)
+console.error('\n=====RUN-TEST-REGISTERACCOUNTTX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-registercontracttx.js b/demo/test-registercontracttx.js
new file mode 100644
index 0000000..407d220
--- /dev/null
+++ b/demo/test-registercontracttx.js
@@ -0,0 +1,46 @@
+'use strict';
+console.error('\n=====RUN-TEST-REGISTERCONTACTTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13")
+var _ = require('lodash');
+var fs = require("fs")
+
+var script = fs.readFileSync(__dirname + '/data/contract-hello.lua');
+//console.log("load script file:")
+//console.log(script);
+
+console.log(_.isString(script))
+console.log(_.isArray(script))
+console.log(_.isArrayBuffer(script))
+console.log(_.isBuffer(script))
+
+/*
+Build a transaction for deploy smart contract
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 110000000 sawi (1.1 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建发布合约的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 110000000 sawi(1.1 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var regAppInfo = {
+ nTxType: 5,
+ nValidHeight: 110482, // create height
+ srcRegId: "0-1", // sender's regId
+ vContract: script, // contract scrypt content, string or buf
+ description: "test contract", // contract scrypt description, string or buf
+ fees: 4200000000, // fees pay for miner
+};
+
+
+var transaction = new WaykiTransaction(regAppInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("reg app tx raw: ")
+console.log(rawtx)
+console.error('\n=====RUN-TEST-REGISTERCONTACTTX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-ucointransfertx.js b/demo/test-ucointransfertx.js
new file mode 100644
index 0000000..6a01968
--- /dev/null
+++ b/demo/test-ucointransfertx.js
@@ -0,0 +1,55 @@
+'use strict'
+console.error('\n=====RUN-TEST-UCOINTRANSFERTX-START=====\n')
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y8JhshTg5j2jeTrwk3qBJDYGi5MVsAvfBJRgFfAp14T91UY9AHgZ")
+
+/*
+Build a transaction for common transfer
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: handling fee , >= 100000 sawi (0.001 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+4, srcRegId: the regid of the transferor
+5, transferAmount: transfer amount
+6, coinSymbol: currency type
+7, feeSymbol: fees type
+8, destAddress: receiver‘s address
+*/
+/*
+构建转账交易的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 100000 sawi(0.001 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+4、srcRegId:转账者的regid
+5、transferAmount:转账金额
+6、coinSymbol:币种类型
+7、feeSymbol:小费类型,
+8、destAddress:收款地址
+*/
+
+var coinSymbol = "WUSD"
+var destAddr = 'wh82HNEDZkZP2eVAS5t7dDxmJWqyx9gr65'
+var transferAmount = 32432
+var destArr = [{
+ "coinSymbol": coinSymbol,
+ "destAddress": destAddr,
+ "transferAmount": transferAmount
+}
+]
+var cointransferTxinfo = {
+ nTxType: 11,
+ nValidHeight: 602371,
+ fees: 10000,
+ srcRegId: '',
+ dests: destArr,
+ memo: "test transfer",// remark
+ feeSymbol: "WICC"
+};
+
+var transaction = new WaykiTransaction(cointransferTxinfo, wallet)
+var cointransferTx = transaction.genRawTx()
+console.log("----cointransferTx----", cointransferTx)
+console.error('\n=====RUN-TEST-UCOINTRANSFERTX-END=====\n')
+
diff --git a/demo/test-ucontractinvoketx.js b/demo/test-ucontractinvoketx.js
new file mode 100644
index 0000000..6b20b71
--- /dev/null
+++ b/demo/test-ucontractinvoketx.js
@@ -0,0 +1,38 @@
+'use strict';
+console.error('\n=====RUN-TEST-UCONTRACTINVOKETX-START=====\n')
+// usage: node test-contracttx.js
+
+var { WaykiTransaction, Wallet } = require("../index")
+var wallet = new Wallet("Y9f6JFRnYkHMPuEhymC15wHD9FbYBmeV2S6VfDicb4ghNhtXhgAJ")
+
+/*
+Build a transaction for calling smart contract
+note:
+1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
+2, fees: >= 1000000 sawi (0.01 wicc)
+3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
+*/
+/*
+构建调用合约的交易单
+注意:
+1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
+2、fees:手续费, >= 1000000 sawi(0.01 wicc)
+3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
+*/
+var invokeAppInfo = {
+ nTxType: 15,
+ nValidHeight: 34400, // create height
+ srcRegId: '0-1', // sender's regId
+ appId: "24555-1", // contract regId
+ feeSymbol: "WICC",
+ coinSymbol: "WUSD",
+ fees: 1000000, // fees pay for miner
+ amount: 8, // amount of WICC to be sent to the app account
+ vContract: "f018" // contract method, hex format string
+};
+
+var transaction = new WaykiTransaction(invokeAppInfo, wallet)
+var rawtx = transaction.genRawTx()
+console.log("contract tx raw: ")
+console.log(rawtx)
+console.error('\n=====RUN-TEST-UCONTRACTINVOKETX-END=====\n')
\ No newline at end of file
diff --git a/demo/test-wallet.js b/demo/test-wallet.js
new file mode 100644
index 0000000..96c9d95
--- /dev/null
+++ b/demo/test-wallet.js
@@ -0,0 +1,17 @@
+console.error('\n=====RUN-TEST-WALLET-START=====\n')
+
+var { Wallet } = require("../index")
+
+var privKey = "Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13"
+var wallet = new Wallet(privKey)
+
+console.log(wallet)
+
+var msg = "WaykiChain"
+var signMsg = wallet.signMessage(msg)
+console.log("签名消息:"+signMsg)
+
+var pubKey = wallet.publicKeyAsHex()
+console.log("公钥:"+pubKey)
+
+console.error('\n=====RUN-TEST-WALLET-END=====\n')
\ No newline at end of file
diff --git a/demo/test-walletmanager.js b/demo/test-walletmanager.js
new file mode 100644
index 0000000..e683b71
--- /dev/null
+++ b/demo/test-walletmanager.js
@@ -0,0 +1,32 @@
+console.error('\n=====RUN-TEST-WALLETMANAGER-START=====\n')
+
+var { WalletManager } = require("../index")
+
+var walletManager = new WalletManager("testnet")
+
+//创建助记词
+var mnemonic = walletManager.randomMnemonicCodes("ENGLISH")
+console.log("助记词:", mnemonic)
+
+//切换成中文助记词
+var chineseMnemonic = walletManager.switchMnemonicCodes(mnemonic, "CHINESE")
+console.log("中文助记词:", chineseMnemonic)
+
+//创建钱包
+var walletInfo = walletManager.createWallet(mnemonic)
+console.log("钱包1:\n", walletInfo)
+
+var walletInfo2 = walletManager.createWallet(chineseMnemonic)
+console.log("钱包2:\n", walletInfo2)
+
+//导入助记词
+var wallet1 = walletManager.importWalletFromMnemonic('romance chunk tape soon bitter option wet space veteran matter embrace cactus')
+var wallet3 = walletManager.importWalletFromMnemonic(walletManager.switchMnemonicCodes('romance chunk tape soon bitter option wet space veteran matter embrace cactus', "CHINESE"))
+console.log("wallet1:", wallet1)
+console.log("wallet3:", wallet3)
+
+//导入私钥
+var wallet2 = walletManager.importWalletFromPrivateKey('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
+console.log("wallet2:", wallet2)
+
+console.error('\n=====RUN-TEST-WALLETMANAGER-END=====\n')
\ No newline at end of file
diff --git a/test/test-wallet.js b/demo/test-wiccapi.js
similarity index 75%
rename from test/test-wallet.js
rename to demo/test-wiccapi.js
index 8cbdb73..1a42c6c 100644
--- a/test/test-wallet.js
+++ b/demo/test-wiccapi.js
@@ -1,17 +1,24 @@
'use strict';
-
-var bitcore = require('..');
+console.error('\n=====RUN-TEST-WICCAPI-START=====\n')
+var { WiccApi, bitcore } = require("../index")
//environment init
//环境初始化
var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
+var wiccApi = new WiccApi(arg)
//Create Mnemonic Code
//创建助记词
var strMne = wiccApi.createAllCoinMnemonicCode()
console.log('New MnemonicCode='+ strMne)
+var switchCode = wiccApi.switchMnemonicCode(strMne, "CHINESE")
+console.log("switchCode=", switchCode)
+
+//获取助记词语言
+var lang = wiccApi.getMnemonicCodeLanguage(switchCode)
+console.log("language is", lang)
+
//Check if the mnemonic is valid
//检查助记词是否有效
var ret = wiccApi.checkMnemonicCode(strMne)
@@ -22,6 +29,9 @@ console.log('Check MnemonicCode Result=' + ret)
var privateKey1 = wiccApi.getPriKeyFromMnemonicCode(strMne)
console.log('privateKey1='+privateKey1)
+var privateKey3 = wiccApi.getPriKeyFromMnemonicCode(switchCode)
+console.log('privateKey3='+privateKey3)
+
//Create a wallet based on the mnemonic, '12345678' is the wallet password
//根据助记词创建钱包,'12345678'为钱包密码
var walletInfo = wiccApi.createWallet(strMne, '12345678')
@@ -40,7 +50,7 @@ console.log("Get MnemonicCode from wallet seed="+Mne)
//Get an address based on the WIF format private key. Note: privateKey2 and privateKey1 are equal.
//根据WIF格式私钥获取地址 ,注意:privateKey2 和 privateKey1 是一样的
-var privateKey = bitcore.PrivateKey.fromWIF("Y9dJaHVk7Rs4sVq1Uk8TGLW4PQzzesA7Lss2Xz1inZY9KMfHBSPE")
+var privateKey = bitcore.PrivateKey.fromWIF(privateKey2)
var pubKey=privateKey.toPublicKey();
var address = privateKey.toAddress();
console.log("New Create publicKey1="+pubKey,"New Create address="+address.toString())
@@ -50,3 +60,4 @@ console.log("New Create publicKey1="+pubKey,"New Create address="+address.toStri
ret = wiccApi.validateAddress(address)
console.log("Check address Result="+ret)
+console.error('\n=====RUN-TEST-WICCAPI-END=====\n')
diff --git a/docs/address.md b/docs/address.md
deleted file mode 100644
index 55adae2..0000000
--- a/docs/address.md
+++ /dev/null
@@ -1,65 +0,0 @@
-# Bitcoin Address
-Represents a bitcoin address. Addresses are the most popular way to make bitcoin transactions. See [the official Bitcoin Wiki](https://en.bitcoin.it/wiki/Address) for technical background information.
-
-## Instantiate an Address
-To be able to receive bitcoins an address is needed, but in order to spend them a private key is necessary. Please take a look at the [`PrivateKey`](privatekey.md) docs for more information about exporting and saving a key.
-
-```javascript
-var privateKey = new PrivateKey();
-var address = privateKey.toAddress();
-```
-
-You can also instantiate an Address from a String, [PublicKey](publickey.md), or [HDPublicKey](hierarchical.md), in case you are not the owner of the private key.
-
-```javascript
-// from a string
-var address = Address.fromString('mwkXG8NnB2snbqWTcpNiK6qqGHm1LebHDc');
-
-// a default network address from a public key
-var publicKey = PublicKey(privateKey);
-var address = new Address(publicKey);
-// alternative interface
-var address = Address.fromPublicKey(publicKey);
-
-// a testnet address from a public key
-var publicKey = new PublicKey(privateKey);
-var address = new Address(publicKey, Networks.testnet);
-```
-
-A pay-to-script-hash multisignature Address can be instantiated from an array of [PublicKeys](publickey.md).
-
-```javascript
-// a 2-of-3 address from public keys
-var p2shAddress = new Address([publicKey1, publicKey2, publicKey3], 2);
-```
-
-## Validating an Address
-The main use that we expect you'll have for the `Address` class in Bitcore is validating that an address is a valid one, what type of address it is (you may be interested on knowing if the address is a simple "pay to public key hash" address or a "pay to script hash" address) and what network does the address belong to.
-
-The code to do these validations looks like this:
-
-```javascript
-// validate an address
-if (Address.isValid(input){
- ...
-}
-
-// validate that an input field is a valid testnet address
-if (Address.isValid(input, Networks.testnet){
- ...
-}
-
-// validate that an input field is a valid livenet pubkeyhash
-if (Address.isValid(input, Networks.livenet, Address.PayToPublicKeyHash){
- ...
-}
-
-// get the specific validation error that can occurred
-var error = Address.getValidationError(input, Networks.testnet);
- if (error) {
- // handle the error
- }
-}
-```
-
-The errors are listed in the generated file in the [errors folder](https://github.com/bitpay/bitcore/tree/master/lib/errors). There's a structure to errors defined in the [spec.js file](https://github.com/bitpay/bitcore/tree/master/lib/errors/spec.js).
diff --git a/docs/block.md b/docs/block.md
deleted file mode 100644
index 5366611..0000000
--- a/docs/block.md
+++ /dev/null
@@ -1,46 +0,0 @@
-# Bitcoin Block
-A Block instance represents the information of a block in the bitcoin network. Given a hexadecimal string representation of the serialization of a block with its transactions, you can instantiate a Block instance. Methods are provided to calculate and check the merkle root hash (if enough data is provided), but transactions won't necessarily be valid spends, and this class won't validate them. A binary representation as a `Buffer` instance is also valid input for a Block's constructor.
-
-```javascript
-// instantiate a new block instance
-var block = new Block(hexaEncodedBlock);
-
-// will verify that the corresponding block transactions match the header
-assert(block.validMerkleRoot());
-
-// blocks have several properties
-assert(block.header); // an instance of block header, more info below
-assert(block.transactions); // an array of transactions, more info below
-```
-
-For detailed technical information about a block please visit [Blocks](https://en.bitcoin.it/wiki/Blocks#Block_structure) on the Bitcoin Wiki.
-
-## Block Header
-Each instance of Block has a BlockHeader _(which can be instantiated separately)_. The header has validation methods, to verify that the block.
-
-```javascript
-// will verify that the nonce demonstrates enough proof of work
-assert(block.header.validProofOfWork());
-
-// will verify that timestamp is not too far in the future
-assert(block.header.validTimestamp());
-
-// each header has the following properties
-assert(block.header.version);
-assert(block.header.prevHash);
-assert(block.header.merkleRoot);
-assert(block.header.time);
-assert(block.header.bits);
-assert(block.header.nonce);
-```
-
-For more information about the specific properties of a block header please visit the [Block hashing algorithm](https://en.bitcoin.it/wiki/Block_hashing_algorithm) page on the Bitcoin Wiki.
-
-## Transactions
-The set of transactions in a block is an array of instances of [Transaction](transaction.md) and can be explored by iterating on the block's `transactions` member.
-
-```javascript
-for (var i in block.transactions) {
- var transaction = block.transactions[i];
-}
-```
diff --git a/docs/browser.md b/docs/browser.md
deleted file mode 100644
index 8fb3150..0000000
--- a/docs/browser.md
+++ /dev/null
@@ -1,66 +0,0 @@
-# Browser Builds
-Bitcore and most official submodules work in the browser, thanks to [browserify](http://browserify.org/) (some modules are not fully compatible with web browsers).
-
-The easiest and recommended way to use them, is via [Bower](http://bower.io/), a browser package manager, and get the release bundles. For example, when building an app that uses `bitcore` and `bitcore-mnemonic`, you do:
-
-```sh
-bower install bitcore-lib
-bower install bitcore-mnemonic
-```
-
-You can also use a `bower.json` file to store the dependencies of your project:
-
-```json
-{
- "name": "Your app name",
- "version": "0.0.1",
- "license": "MIT",
- "dependencies": {
- "bitcore-lib": "^0.13.7",
- "bitcore-mnemonic": "^1.0.1"
- }
-}
-```
-
-and run `bower install` to install the dependencies.
-
-After this, you can include the bundled release versions in your HTML file:
-
-```html
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-```
-
-## Building Custom Bundles
-If you want to use a specific version of a module, instead of a release version (not recommended), you must run browserify yourself. You can get a minified browser bundle by running the following on the project root folder.
-
-```sh
-browserify --require ./index.js:bitcore-lib | uglifyjs > bitcore-lib.min.js
-```
-
-```sh
-browserify --require ./index.js:bitcore-mnemonic --external bitcore-lib | uglifyjs > bitcore-mnemonic.min.js
-```
-
-In many of the modules you can also run the command to build a browser bundle:
-```sh
-gulp browser
-```
diff --git a/docs/crypto.md b/docs/crypto.md
deleted file mode 100644
index 8dc4ecd..0000000
--- a/docs/crypto.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# Bitcoin Crypto
-The cryptographic primitives (ECDSA and HMAC) implementations in this package have been reviewed by the BitPay engineering team. More audits and reviews are welcomed.
-
-## Random
-The `bitcore.crypto.Random` namespace contains a single function, named `getRandomBuffer(size)` that returns a `Buffer` instance with random bytes. It may not work depending on the engine that bitcore is running on (doesn't work with IE versions lesser than 11).
-
-## BN
-The `bitcore.crypto.BN` class contains a wrapper around [bn.js](https://github.com/indutny/bn.js), the bignum library used internally in bitcore.
-
-## Point
-The `bitcore.crypto.Point` class contains a wrapper around the class Point of [elliptic.js](https://github.com/indutny/elliptic), the elliptic curve library used internally in bitcore.
-
-## Hash
-The `bitcore.crypto.Hash` namespace contains a set of hashes and utilities. These are either the native `crypto` hash functions from `node.js` or their respective browser shims as provided by the `browserify` library.
-
-## ECDSA
-`bitcore.crypto.ECDSA` contains a pure JavaScript implementation of the elliptic curve DSA signature scheme based on [elliptic.js](https://github.com/indutny/elliptic).
diff --git a/docs/encoding.md b/docs/encoding.md
deleted file mode 100644
index b41d4bf..0000000
--- a/docs/encoding.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# Encoding
-The `bitcore.Encoding` namespace contains utilities for encoding information in common formats in the bitcoin ecosystem.
-
-## Base58 & Base58Check
-Two classes are provided: `Base58` and `Base58Check`. The first one merely encodes/decodes a set of bytes in base58 format. The second one will also take the double `sha256` hash of the information and append the last 4 bytes of the hash as a checksum when encoding, and check this checksum when decoding.
-
-## BufferReader & BufferWriter
-These classes are used internally to write information in buffers.
diff --git a/docs/examples.md b/docs/examples.md
deleted file mode 100644
index 82f4774..0000000
--- a/docs/examples.md
+++ /dev/null
@@ -1,113 +0,0 @@
-# Bitcore examples
-
-## Generate a random address
-```javascript
-var privateKey = new bitcore.PrivateKey();
-
-var address = privateKey.toAddress();
-```
-
-## Generate a address from a SHA256 hash
-```javascript
-var value = Buffer.from('correct horse battery staple');
-var hash = bitcore.crypto.Hash.sha256(value);
-var bn = bitcore.crypto.BN.fromBuffer(hash);
-
-var address = new bitcore.PrivateKey(bn).toAddress();
-```
-
-## Import an address via WIF
-```javascript
-var wif = 'Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct';
-
-var address = new bitcore.PrivateKey(wif).toAddress();
-```
-
-## Create a Transaction
-```javascript
-var privateKey = new bitcore.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
-var utxo = {
- "txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
- "outputIndex" : 0,
- "address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
- "script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
- "satoshis" : 50000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo)
- .to('1Gokm82v6DmtwKEB8AiVhm82hyFSsEvBDK', 15000)
- .sign(privateKey);
-```
-
-## Sign a Bitcoin message
-```javascript
-var Message = require('bitcore-message');
-
-var privateKey = new bitcore.PrivateKey('L23PpjkBQqpAF4vbMHNfTZAb3KFPBSawQ7KinFTzz7dxq6TZX8UA');
-var message = new Message('This is an example of a signed message.');
-
-var signature = message.sign(privateKey);
-```
-
-## Verify a Bitcoin message
-```javascript
-var Message = require('bitcore-message');
-
-var address = '13Js7D3q4KvfSqgKN8LpNq57gcahrVc5JZ';
-var signature = 'IBOvIfsAs/da1e36W8kw1cQOPqPVXCW5zJgNQ5kI8m57FycZXdeFmeyoIqJSREzE4W7vfDmdmPk0HokuJPvgPPE=';
-
-var verified = new Message('This is an example of a signed message.').verify(address, signature);
- ```
-
-## Create an OP RETURN transaction
-```javascript
-var privateKey = new bitcore.PrivateKey('L1uyy5qTuGrVXrmrsvHWHgVzW9kKdrp27wBC7Vs6nZDTF2BRUVwy');
-var utxo = {
- "txId" : "115e8f72f39fad874cfab0deed11a80f24f967a84079fb56ddf53ea02e308986",
- "outputIndex" : 0,
- "address" : "17XBj6iFEsf8kzDMGQk5ghZipxX49VXuaV",
- "script" : "76a91447862fe165e6121af80d5dde1ecb478ed170565b88ac",
- "satoshis" : 50000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo)
- .addData('bitcore rocks') // Add OP_RETURN data
- .sign(privateKey);
-```
-
-## Create a 2-of-3 multisig P2SH address
-```javascript
-var publicKeys = [
- '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
- '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9',
- '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9'
-];
-var requiredSignatures = 2;
-
-var address = new bitcore.Address(publicKeys, requiredSignatures);
-```
-
-## Spend from a 2-of-2 multisig P2SH address
-```javascript
-var privateKeys = [
- new bitcore.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgwmaKkrx'),
- new bitcore.PrivateKey('91avARGdfge8E4tZfYLoxeJ5sGBdNJQH4kvjJoQFacbgww7vXtT')
-];
-var publicKeys = privateKeys.map(bitcore.PublicKey);
-var address = new bitcore.Address(publicKeys, 2); // 2 of 2
-
-var utxo = {
- "txId" : "153068cdd81b73ec9d8dcce27f2c77ddda12dee3db424bff5cafdbe9f01c1756",
- "outputIndex" : 0,
- "address" : address.toString(),
- "script" : new bitcore.Script(address).toHex(),
- "satoshis" : 20000
-};
-
-var transaction = new bitcore.Transaction()
- .from(utxo, publicKeys, 2)
- .to('mtoKs9V381UAhUia3d7Vb9GNak8Qvmcsme', 20000)
- .sign(privateKeys);
-```
diff --git a/docs/hierarchical.md b/docs/hierarchical.md
deleted file mode 100644
index 73972d4..0000000
--- a/docs/hierarchical.md
+++ /dev/null
@@ -1,52 +0,0 @@
-# HDKeys
-Create and derive extended public and private keys according to the BIP32 standard for Hierarchical Deterministic (HD) keys.
-
-## Hierarchically Derived Keys
-Bitcore provides full support for [BIP32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki), allowing for many key management schemas that benefit from this property. Please be sure to read and understand the basic concepts and the warnings on that BIP before using these classes.
-
-## HDPrivateKey
-An instance of a [PrivateKey](privatekey.md) that also contains information required to derive child keys.
-
-Sample usage:
-
-```javascript
-var bitcore = require('bitcore');
-var HDPrivateKey = bitcore.HDPrivateKey;
-
-var hdPrivateKey = new HDPrivateKey();
-var retrieved = new HDPrivateKey('xpriv...');
-var derived = hdPrivateKey.derive("m/0'"); // see deprecation warning for derive
-var derivedByNumber = hdPrivateKey.derive(1).derive(2, true);
-var derivedByArgument = hdPrivateKey.derive("m/1/2'");
-assert(derivedByNumber.xprivkey === derivedByArgument.xprivkey);
-
-var address = derived.privateKey.toAddress();
-
-// obtain HDPublicKey
-var hdPublicKey = hdPrivateKey.hdPublicKey;
-```
-
-## HDPublicKey
-An instance of a PublicKey that can be derived to build extended public keys. Note that hardened paths are not available when deriving an HDPublicKey.
-
-```javascript
-var hdPrivateKey = new HDPrivateKey();
-var hdPublicKey = hdPrivateKey.hdPublicKey;
-try {
- new HDPublicKey();
-} catch(e) {
- console.log("Can't generate a public key without a private key");
-}
-
-var address = new Address(hdPublicKey.publicKey, Networks.livenet);
-var derivedAddress = new Address(hdPublicKey.derive(100).publicKey, Networks.testnet); // see deprecation warning for derive
-```
-
-## Deprecation Warning for `HDPublicKey.derive()` and `HDPrivateKey.derive()`
-
-
-There was a bug that was discovered with derivation that would incorrectly calculate the child key against the [BIP32 specification](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki).
-The bug only affected hardened derivations using an extended private key, and did not affect public key derivation. It also did not affect every derivation and would happen 1 in 256 times where where the private key for the extended private key had a leading zero *(e.g. any private key less than or equal to '0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff')*. The leading zero was not included in serialization before hashing to derive a child key, as it should have been.
-
-As a result, `HDPublicKey.derive()` and `HDPrivateKey.derive()` are now deprecated. These methods will throw an error in the next major release.
-`HDPublicKey.deriveChild()`, `HDPrivateKey.deriveChild()`, and `HDPrivateKey.deriveNonCompliantChild()` have been implemented as alternatives. Note that these new methods will not be officially supported until v1.0.0. `deriveNonCompliantChild` will derive using the non-BIP32 derivation and is equivalent to the buggy version, `derive`. The `deriveNonCompliantChild` method should not be used unless you're upgrading and need to maintain compatibility with the old derivation.
diff --git a/docs/index.md b/docs/index.md
deleted file mode 100644
index fbadbd8..0000000
--- a/docs/index.md
+++ /dev/null
@@ -1,104 +0,0 @@
-# Bitcore v0.15.0
-
-## Principles
-
-Bitcoin is a powerful new peer-to-peer platform for the next generation of financial technology. The decentralized nature of the Bitcoin network allows for highly resilient bitcoin infrastructure, and the developer community needs reliable, open-source tools to implement bitcoin apps and services. Bitcore provides a reliable API for JavaScript apps that need to interface with Bitcoin.
-
-To get started, just `npm install bitcore` or `bower install bitcore`.
-
-# Documentation Index
-
-## Addresses and Key Management
-
-* [Addresses](address.md)
-* [Using Different Networks](networks.md)
-* [Private Keys](privatekey.md) and [Public Keys](publickey.md)
-* [Hierarchically-derived Private and Public Keys](hierarchical.md)
-
-## Payment Handling
-* [Using Different Units](unit.md)
-* [Acknowledging and Requesting Payments: Bitcoin URIs](uri.md)
-* [The Transaction Class](transaction.md)
-
-## Bitcoin Internals
-* [Scripts](script.md)
-* [Block](block.md)
-
-## Extra
-* [Crypto](crypto.md)
-* [Encoding](encoding.md)
-
-## Module Development
-* [Browser Builds](browser.md)
-
-## Modules
-
-Some functionality is implemented as a module that can be installed separately:
-
-* [Payment Protocol Support](https://github.com/bitpay/bitcore-payment-protocol)
-* [Peer to Peer Networking](https://github.com/bitpay/bitcore-p2p)
-* [Bitcoin Core JSON-RPC](https://github.com/bitpay/bitcoind-rpc)
-* [Payment Channels](https://github.com/bitpay/bitcore-channel)
-* [Mnemonics](https://github.com/bitpay/bitcore-mnemonic)
-* [Elliptical Curve Integrated Encryption Scheme](https://github.com/bitpay/bitcore-ecies)
-* [Blockchain Explorers](https://github.com/bitpay/bitcore-explorers)
-* [Signed Messages](https://github.com/bitpay/bitcore-message)
-
-# Examples
-
-## Create and Save a Private Key
-
-```javascript
-var privateKey = new bitcore.PrivateKey();
-
-var exported = privateKey.toWIF();
-// e.g. L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m
-var imported = bitcore.PrivateKey.fromWIF(exported);
-var hexa = privateKey.toString();
-// e.g. 'b9de6e778fe92aa7edb69395556f843f1dce0448350112e14906efc2a80fa61a'
-```
-
-## Create an Address
-
-```javascript
-var address = privateKey.toAddress();
-```
-
-## Create a Multisig Address
-
-```javascript
-// Build a 2-of-3 address from public keys
-var p2shAddress = new bitcore.Address([publicKey1, publicKey2, publicKey3], 2);
-```
-
-## Request a Payment
-
-```javascript
-var paymentInfo = {
- address: '1DNtTk4PUCGAdiNETAzQFWZiy2fCHtGnPx',
- amount: 120000 //satoshis
-};
-var uri = new bitcore.URI(paymentInfo).toString();
-```
-
-## Create a Transaction
-
-```javascript
-var transaction = new Transaction()
- .from(utxos) // Feed information about what unspent outputs one can use
- .to(address, amount) // Add an output with the given amount of satoshis
- .change(address) // Sets up a change address where the rest of the funds will go
- .sign(privkeySet) // Signs all the inputs it can
-```
-
-## Connect to the Network
-
-```javascript
-var peer = new Peer('5.9.85.34');
-
-peer.on('inv', function(message) {
- // new inventory
-});
-
-peer.connect();
-```
diff --git a/docs/networks.md b/docs/networks.md
deleted file mode 100644
index e8a54e2..0000000
--- a/docs/networks.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Networks
-Bitcore provides support for the main bitcoin network as well as for `testnet3`, the current test blockchain. We encourage the use of `Networks.livenet` and `Networks.testnet` as constants. Note that the library sometimes may check for equality against this object. Please avoid creating a deep copy of this object.
-
-The `Network` namespace has a function, `get(...)` that returns an instance of a `Network` or `undefined`. The only argument to this function is some kind of identifier of the network: either its name, a reference to a Network object, or a number used as a magic constant to identify the network (for example, the value `0` that gives bitcoin addresses the distinctive `'1'` at its beginning on livenet, is a `0x6F` for testnet).
-
-## Regtest
-
-The regtest network is useful for development as it's possible to programmatically and instantly generate blocks for testing. It's currently supported as a variation of testnet. Here is an example of how to use regtest with the Bitcore Library:
-
-```js
-// Standard testnet
-> bitcore.Networks.testnet.networkMagic;
-
-```
-
-```js
-// Enabling testnet to use the regtest port and magicNumber
-> bitcore.Networks.enableRegtest();
-> bitcore.Networks.testnet.networkMagic;
-
-```
-
-## Setting the Default Network
-Most projects will only need to work with one of the networks. The value of `Networks.defaultNetwork` can be set to `Networks.testnet` if the project will need to only to work on testnet (the default is `Networks.livenet`).
-
-## Network constants
-The functionality of testnet and livenet is mostly similar (except for some relaxed block validation rules on testnet). They differ in the constants being used for human representation of base58 encoded strings. These are sometimes referred to as "version" constants.
-
-Take a look at this modified snippet from [networks.js](https://github.com/bitpay/bitcore/blob/master/lib/networks.js)
-
-```javascript
-var livenet = new Network();
-_.extend(livenet, {
- name: 'livenet',
- alias: 'mainnet',
- pubkeyhash: 0x00,
- privatekey: 0x80,
- scripthash: 0x05,
- xpubkey: 0x0488b21e,
- xprivkey: 0x0488ade4,
- port: 8333
-});
-
-var testnet = new Network();
-_.extend(testnet, {
- name: 'testnet',
- alias: 'testnet',
- pubkeyhash: 0x6f,
- privatekey: 0xef,
- scripthash: 0xc4,
- xpubkey: 0x043587cf,
- xprivkey: 0x04358394,
- port: 18333
-});
-```
diff --git a/docs/privatekey.md b/docs/privatekey.md
deleted file mode 100644
index f813345..0000000
--- a/docs/privatekey.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Private Key
-Represents a bitcoin private key and is needed to be able to spend bitcoin and sign transactions. See the official [Bitcoin Wiki](https://en.bitcoin.it/wiki/Private_key) for more information about private keys. A PrivateKey in Bitcore is an immutable object that has methods to import and export into a variety of formats including [Wallet Import Format](https://en.bitcoin.it/wiki/Wallet_import_format).
-
-## Instantiate a Private Key
-Here is how to create a new private key. It will generate a new random number using `window.crypto` or the Node.js `crypto` library.
-
-```javascript
-var privateKey = new PrivateKey();
-
-// Creates a private key from a hexa encoded number
-var privateKey2 = new PrivateKey('b221d9dbb083a7f33428d7c2a3c3198ae925614d70210e28716ccaa7cd4ddb79');
-```
-
-To export and import a private key, you can do the following:
-
-```javascript
-// encode into wallet export format
-var exported = privateKey.toWIF();
-
-// instantiate from the exported (and saved) private key
-var imported = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
-```
-
-Note: The WIF (Wallet Import Format) includes information about the network and if the associated public key is compressed or uncompressed (thus the same bitcoin address will be generated by using this format).
-
-To generate an Address or PublicKey from a PrivateKey:
-
-```javascript
-var publicKey = privateKey.toPublicKey();
-var address = publicKey.toAddress(Networks.livenet);
-```
-
-## Validating a Private Key
-The code to do these validations looks like this:
-
-```javascript
-// validate an address
-if (PrivateKey.isValid(input)){
- ...
-}
-
-// get the specific validation error that can occurred
-var error = PrivateKey.getValidationError(input, Networks.livenet);
-if (error) {
- // handle the error
-}
-```
diff --git a/docs/publickey.md b/docs/publickey.md
deleted file mode 100644
index 9caf860..0000000
--- a/docs/publickey.md
+++ /dev/null
@@ -1,59 +0,0 @@
-# Public Key
-Represents a bitcoin public key and is needed to be able to receive bitcoin, as is usually represented as a bitcoin [Address](address.md). See the official [Bitcoin Wiki](https://en.bitcoin.it/wiki/Technical_background_of_version_1_Bitcoin_addresses).
-
-A PublicKey in Bitcore is an immutable object and can be instantiated from a [Point](crypto.md), string, [PrivateKey](privatekey.md), Buffer or a [BN](crypto.md).
-
-## Instantiate a Public Key
-Here is how to instantiate a public key:
-
-```javascript
-
-var privateKey = new PrivateKey();
-
-// from a private key
-var publicKey = new PublicKey(privateKey);
-
-// from a der hex encoded string
-var publicKey2 = new PublicKey('02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc');
-```
-
-## Validating a Public Key
-A public key point should be on the [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) curve, instantiating a new PublicKey will validate this and will throw an error if it's invalid. To check that a public key is valid:
-
-```javascript
-if (PublicKey.isValid('02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc')){
- // valid public key
-}
-```
-
-## Compressed vs Uncompressed
-It's important to note that there are two possible ways to represent a public key. The standard is _compressed_ and includes the X value and parity (as represented above in the documentation). There is also a longer version that is _uncompressed_ which includes both X and Y values. Using this encoding will generate a different bitcoin address, so be careful when selecting the encoding. Uncompressed public keys start with 0x04; compressed public keys begin with 0x03 or 0x02 depending on whether they're greater or less than the midpoint of the curve. These prefix bytes are all used in official secp256k1 documentation.
-
-Example:
-
-```javascript
-> var bitcore = require('bitcore');
-
-// compressed public key starting with 0x03 (greater than midpoint of curve)
-> var compressedPK = bitcore.PublicKey('030589ee559348bd6a7325994f9c8eff12bd'+
- '5d73cc683142bd0dd1a17abc99b0dc');
-> compressedPK.compressed;
-true
-> compressedPK.toAddress().toString();
-'1KbUJ4x8epz6QqxkmZbTc4f79JbWWz6g37'
-// compressed public key starting with 0x02 (smaller than midpoint of curve)
-> var compressedPK2 = new bitcore.PublicKey('02a1633cafcc01ebfb6d78e39f687a1f'+
- '0995c62fc95f51ead10a02ee0be551b5dc');
-> compressedPK2.compressed;
-true
-> compressedPK.toAddress().toString();
-'1KbUJ4x8epz6QqxkmZbTc4f79JbWWz6g37'
-// uncompressed public key, starting with 0x04. Contains both X and Y encoded
-> var uncompressed = bitcore.PublicKey('0479BE667EF9DCBBAC55A06295CE870B07029'+
- 'BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68'+
- '554199C47D08FFB10D4B8');
-> uncompressed.compressed
-false
-> uncompressed.toAddress().toString()
-'1EHNa6Q4Jz2uvNExL497mE43ikXhwF6kZm'
-```
diff --git a/docs/script.md b/docs/script.md
deleted file mode 100644
index 7faa1ac..0000000
--- a/docs/script.md
+++ /dev/null
@@ -1,136 +0,0 @@
-# Script
-All bitcoin transactions have scripts embedded into its inputs and outputs. The scripts use a very simple programming language, which is evaluated from left to right using a stack. The language is designed such that it guarantees all scripts will execute in a limited amount of time (it is not Turing-Complete).
-
-When a transaction is validated, the input scripts are concatenated with the output scripts and evaluated. To be valid, all transaction scripts must evaluate to true. A good analogy for how this works is that the output scripts are puzzles that specify in which conditions can those bitcoins be spent. The input scripts provide the correct data to make those output scripts evaluate to true.
-
-For more detailed information about the bitcoin scripting language, check the online reference [on bitcoin's wiki](https://en.bitcoin.it/wiki/Script).
-
-The `Script` object provides an interface to construct, parse, and identify bitcoin scripts. It also gives simple interfaces to create most common script types. This class is useful if you want to create custom input or output scripts. In other case, you should probably use `Transaction`.
-
-## Script creation
-Here's how to use `Script` to create the five most common script types:
-
-### Pay to Public Key Hash (p2pkh)
-This is the most commonly used transaction output script. It's used to pay to a bitcoin address (a bitcoin address is a public key hash encoded in base58check)
-
-```javascript
-// create a new p2pkh paying to a specific address
-var address = Address.fromString('1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14');
-var script = Script.buildPublicKeyHashOut(address);
-assert(script.toString() === 'OP_DUP OP_HASH160 20 0xecae7d092947b7ee4998e254aa48900d26d2ce1d OP_EQUALVERIFY OP_CHECKSIG');
-```
-
-### Pay to Public Key (p2pk)
-Pay to public key scripts are a simplified form of the p2pkh, but aren't commonly used in new transactions anymore, because p2pkh scripts are more secure (the public key is not revealed until the output is spent).
-
-```javascript
-// create a new p2pk paying to a specific public key
-var pubkey = new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da');
-var script = Script.buildPublicKeyOut(pubkey);
-assert(script.toString() === '33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da OP_CHECKSIG');
-```
-
-### Pay to Multisig (p2ms)
-Multisig outputs allow to share control of bitcoins between several keys. When creating the script, one specifies the public keys that control the funds, and how many of those keys are required to sign off spending transactions to be valid. An output with N public keys of which M are required is called an m-of-n output (For example, 2-of-3, 3-of-5, 4-of-4, etc.)
-
-Note that regular multisig outputs are rarely used nowadays. The best practice is to use a p2sh multisig output (See Script#toScriptHashOut()).
-
-```javascript
-// create a new 2-of-3 multisig output from 3 given public keys
-var pubkeys = [
- new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'),
- new PublicKey('03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'),
- new PublicKey('021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18'),
-];
-var threshold = 2;
-var script = Script.buildMultisigOut(pubkeys, threshold);
-assert(script.toString() === 'OP_2 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'
- + ' 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'
- + ' 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 OP_3 OP_CHECKMULTISIG');
-```
-
-### Pay to Script Hash (p2sh)
-Pay to script hash outputs are scripts that contain the hash of another script, called `redeemScript`. To spend bitcoins sent in a p2sh output, the spending transaction must provide a script matching the script hash and data which makes the script evaluate to true. This allows to defer revealing the spending conditions to the moment of spending. It also makes it possible for the receiver to set the conditions to spend those bitcoins.
-
-Most multisig transactions today use p2sh outputs where the `redeemScript` is a multisig output.
-
-```javascript
-// create a p2sh multisig output
-var pubkeys = [
- new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da'),
- new PublicKey('03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9'),
- new PublicKey('021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18'),
-];
-var redeemScript = Script.buildMultisigOut(pubkeys, 2);
-var script = redeemScript.toScriptHashOut();
-assert(script.toString() === 'OP_HASH160 20 0x620a6eeaf538ec9eb89b6ae83f2ed8ef98566a03 OP_EQUAL');
-```
-
-### Data output
-Data outputs are used to push data into the blockchain. Up to 40 bytes can be pushed in a standard way, but more data can be used, if a miner decides to accept the transaction.
-
-```javascript
-var data = 'hello world!!!';
-var script = Script.buildDataOut(data);
-assert(script.toString() === 'OP_RETURN 14 0x68656c6c6f20776f726c64212121'
-```
-
-### Custom Scripts
-To create a custom `Script` instance, you must rely on the lower-level methods `add` and `prepend`. Both methods accept the same parameter types, and insert an opcode or data at the beginning (`prepend`) or end (`add`) of the `Script`.
-
-```
-var script = Script()
- .add('OP_IF') // add an opcode by name
- .prepend(114) // add OP_2SWAP by code
- .add(Opcode.OP_NOT) // add an opcode object
- .add(new Buffer('bacacafe', 'hex')) // add a data buffer (will append the size of the push operation first)
-
-assert(script.toString() === 'OP_2SWAP OP_IF OP_NOT 4 0xbacacafe');
-```
-
-## Script Parsing and Identification
-`Script` has an easy interface to parse raw scripts from the network or bitcoind, and to extract useful information. An illustrative example (for more options check the API reference)
-
-```javascript
-var raw_script = new Buffer('5221022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da2103e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e921021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc1853ae', 'hex');
-var s = new Script(raw_script);
-console.log(s.toString());
-// 'OP_2 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 OP_3 OP_CHECKMULTISIG'
-
-s.isPublicKeyHashOut() // false
-s.isScriptHashOut() // false
-s.isMultisigOut() // true
-```
-
-## Script Interpreting and Validation
-To validate a transaction, the bitcoin network validates all of its inputs and outputs. To validate an input, the input's script is concatenated with the referenced output script, and the result is executed. If at the end of execution the stack contains a 'true' value, then the transaction is valid. You can do this in `bitcore` by using the `Interpreter` class. The entry point (and probably the only interface you'll need for most applications) is the method `Interpreter#verify()`.
-
-You can use it like this:
-
-```
-var inputScript = Script('OP_1');
-var outputScript = Script('OP_15 OP_ADD OP_16 OP_EQUAL');
-
-var verified = Interpreter().verify(inputScript, outputScript);
-// verified will be true
-```
-
-Note that `verify` expects two scripts: one is the input script (scriptSig) and the other is the output script (scriptPubkey). This is because different conditions are checked for each.
-
-It also accepts some optional parameters, assuming defaults if not provided:
-
-```
-// first we create a transaction
-var tx = new Transaction()
- .from(utxo)
- .to(toAddress, 100000)
- .sign(privateKey);
-
-// we then extract the signature from the first input
-var inputIndex = 0;
-var signature = tx.getSignatures(privateKey)[inputIndex].signature;
-
-var scriptSig = Script.buildPublicKeyHashIn(publicKey, signature);
-var flags = Interpreter.SCRIPT_VERIFY_P2SH | Interpreter.SCRIPT_VERIFY_STRICTENC;
-var verified = Interpreter().verify(scriptSig, scriptPubkey, tx, inputIndex, flags);
-```
diff --git a/docs/transaction.md b/docs/transaction.md
deleted file mode 100644
index 91c5db7..0000000
--- a/docs/transaction.md
+++ /dev/null
@@ -1,177 +0,0 @@
-# Transaction
-Bitcore provides a very simple API for creating transactions. We expect this API to be accessible for developers without knowing the working internals of bitcoin in deep detail. What follows is a small introduction to transactions with some basic knowledge required to use this API.
-
-A Transaction contains a set of inputs and a set of outputs. Each input contains a reference to another transaction's output, and a signature that allows the value referenced in that output to be used in this transaction.
-
-Note also that an output can be used only once. That's why there's a concept of "change address" in the bitcoin ecosystem: if an output of 10 BTC is available for me to spend, but I only need to transmit 1 BTC, I'll create a transaction with two outputs, one with 1 BTC that I want to spend, and the other with 9 BTC to a change address, so I can spend this 9 BTC with another private key that I own.
-
-So, in order to transmit a valid transaction, you must know what other transactions on the network store outputs that have not been spent and that are available for you to spend (meaning that you have the set of keys that can validate you own those funds). The unspent outputs are usually referred to as "utxo"s.
-
-Let's take a look at some very simple transactions:
-
-```javascript
-var transaction = new Transaction()
- .from(utxos) // Feed information about what unspent outputs one can use
- .to(address, amount) // Add an output with the given amount of satoshis
- .change(address) // Sets up a change address where the rest of the funds will go
- .sign(privkeySet) // Signs all the inputs it can
-```
-
-You can obtain the input and output total amounts of the transaction in satoshis by accessing the fields `inputAmount` and `outputAmount`.
-
-Now, this could just be serialized to hexadecimal ASCII values (`transaction.serialize()`) and sent over to the bitcoind reference client.
-
-```bash
-bitcoin-cli sendrawtransaction
-```
-
-You can also override the fee estimation with another amount, specified in satoshis:
-
-```javascript
-var transaction = new Transaction().fee(5430); // Minimum non-dust amount
-var transaction = new Transaction().fee(1e8); // Generous fee of 1 BTC
-```
-
-## Multisig Transactions
-To send a transaction to a multisig address, the API is the same as in the above example. To spend outputs that require multiple signatures, the process needs extra information: the public keys of the signers that can unlock that output.
-
-```javascript
-var multiSigTx = new Transaction()
- .from(utxo, publicKeys, threshold)
- .change(address)
- .sign(myKeys);
-
-var serialized = multiSigTx.toObject();
-```
-
-This can be serialized and sent to another party, to complete with the needed signatures:
-
-```javascript
-var multiSigTx = new Transaction(serialized)
- .sign(anotherSetOfKeys);
-
-assert(multiSigTx.isFullySigned());
-```
-
-Also, you can just send over the signature for your private key:
-
-```javascript
-var multiSigTx = new Transaction()
- .from(utxo, publicKeys, threshold)
- .change(address);
-
-var signature = multiSigTx.getSignatures(privateKey)[0];
-console.log(JSON.stringify(signature));
-console.log(signature.toObject());
-console.log(signature.signature.toString()); // Outputs a DER signature
-console.log(signature.sigtype);
-```
-
-Transfer that over the wire, and on the other side, apply it to a transaction:
-
-```javascript
-assert(transaction.isValidSignature(receivedSig));
-transaction.applySignature(receivedSig);
-```
-
-## Adding inputs
-Transaction inputs are instances of either [Input](https://github.com/bitpay/bitcore/tree/master/lib/transaction/input) or its subclasses. `Input` has some abstract methods, as there is no actual concept of a "signed input" in the bitcoin scripting system (just valid signatures for OP_CHECKSIG and similar opcodes). They are stored in the `input` property of `Transaction` instances.
-
-Bitcore contains two implementations of `Input`, one for spending _Pay to Public Key Hash_ outputs (called `PublicKeyHashInput`) and another to spend _Pay to Script Hash_ outputs for which the redeem script is a Multisig script (called `MultisigScriptHashInput`).
-
-All inputs have the following five properties:
-- `prevTxId`: a `Buffer` with the id of the transaction with the output this input is spending
-- `outputIndex`: a `number` the index of the output in the previous transaction
-- `sequenceNumber`: a `number`, the sequence number, see [bitcoin's developer guide on nLockTime and the sequence number](https://bitcoin.org/en/developer-guide#locktime-and-sequence-number).
-- `script`: the `Script` instance for this input. Usually called `scriptSig` in the bitcoin community.
-- `output`: if available, a `Output` instance of the output associated with this input.
-
-Both `PublicKeyHashInput` and `MultisigScriptHashInput` cache the information about signatures, even though this information could somehow be encoded in the script. Both need to have the `output` property set in order to calculate the `sighash` so signatures can be created.
-
-Some methods related to adding inputs are:
-- `from`: A high level interface to add an input from a UTXO. It has a series of variants:
- - `from(utxo)`: add an input from an [Unspent Transaction Output](http://bitcore.io/guide/unspentoutput.html). Currently, only P2PKH outputs are supported.
- - `from(utxos)`: same as above, but passing in an array of Unspent Outputs.
- - `from(utxo, publicKeys, threshold)`: add an input that spends a UTXO with a P2SH output for a Multisig script. The `publicKeys` argument is an array of public keys, and `threshold` is the number of required signatures in the Multisig script.
-
-- `addInput`: Performs a series of checks on an input and appends it to the end of the `input` vector and updates the amount of incoming bitcoins of the transaction.
-- `uncheckedAddInput`: adds an input to the end of the `input` vector and updates the `inputAmount` without performing any checks.
-
-### PublicKeyHashInput
-This input uses the `script` property to mark the input as unsigned if the script is empty.
-
-### MultisigScriptHashInput
-This input contains a set of signatures in a `signatures` property, and each time a signature is added, a potentially partial and/or invalid script is created. The `isFullySigned` method will only return true if all needed signatures are already added and valid. If `addSignature` is added after all need signatures are already set, an exception will be thrown.
-
-## Signing a Transaction
-The following methods are used to manage signatures for a transaction:
-- `getSignatures`: takes an array of `PrivateKey` or strings from which a `PrivateKey` can be instantiated; the transaction to be signed; the kind of [signature hash to use](https://bitcoin.org/en/developer-guide#signature-hash-types). Returns an array of objects with the following properties:
- - `signature`: an instance of [Signature](https://github.com/bitpay/bitcore/blob/master/lib/crypto/signature.js)
- - `prevTxId`: this input's `prevTxId`,
- - `outputIndex`: this input's `outputIndex`,
- - `inputIndex`: this input's index in the transaction
- - `sigtype`: the "sighash", the type of transaction hash used to calculate the signature
- - `publicKey`: a `PublicKey` of the `PrivateKey` used to create the signature
-
-- `addSignature`: takes an element outputed by `getSignatures` and applies the signature to this input (modifies the script to include the new signature).
-- `clearSignatures`: removes all signatures for this input
-- `isFullySigned`: returns true if the input is fully signed
-
-## Handling Outputs
-Outputs can be added by:
-- The `addOutput(output)` method, which pushes an `Output` to the end of the `outputs` property and updates the `outputAmount` field. It also clears signatures (as the hash of the transaction may have changed) and updates the change output.
-- The `to(address, amount)` method, that adds an output with the script that corresponds to the given address. Builds an output and calls the `addOutput` method.
-- Specifying a [change address](#Fee_calculation)
-
-To remove all outputs, you can use `clearOutputs()`, which preserves change output configuration.
-
-## Serialization
-There are a series of methods used for serialization:
-- `toObject`: Returns a plain JavaScript object with no methods and enough information to fully restore the state of this transaction. Using other serialization methods (except for `toJSON`) will cause a some information to be lost.
-- `toJSON`: Will be called when using `JSON.stringify` to return JSON-encoded string using the output from `toObject`.
-- `toString` or `uncheckedSerialize`: Returns an hexadecimal serialization of the transaction, in the [serialization format for bitcoin](https://bitcoin.org/en/developer-reference#raw-transaction-format).
-- `serialize`: Does a series of checks before serializing the transaction
-- `inspect`: Returns a string with some information about the transaction (currently a string formatted as ``, that only shows the serialized value of the transaction.
-- `toBuffer`: Serializes the transaction for sending over the wire in the bitcoin network
-- `toBufferWriter`: Uses an already existing BufferWriter to copy over the serialized transaction
-
-## Serialization Checks
-When serializing, the bitcore library performs a series of checks. These can be disabled by providing an object to the `serialize` method with the checks that you'll like to skip.
-- `disableLargeFees` avoids checking that the fee is no more than `Transaction.FEE_PER_KB * Transaction.FEE_SECURITY_MARGIN * size_in_kb`.
-- `disableSmallFees` avoids checking that the fee is less than `Transaction.FEE_PER_KB * size_in_kb / Transaction.FEE_SECURITY_MARGIN`.
-- `disableIsFullySigned` does not check if all inputs are fully signed
-- `disableDustOutputs` does not check for dust outputs being generated
-- `disableMoreOutputThanInput` avoids checking that the sum of the output amounts is less than or equal to the sum of the amounts for the outputs being spent in the transaction
-
-These are the current default values in the bitcore library involved on these checks:
-- `Transaction.FEE_PER_KB`: `10000` (satoshis per kilobyte)
-- `Transaction.FEE_SECURITY_MARGIN`: `15`
-- `Transaction.DUST_AMOUNT`: `546` (satoshis)
-
-## Fee calculation
-When outputs' value don't sum up to the same amount that inputs, the difference in bitcoins goes to the miner of the block that includes this transaction. The concept of a "change address" usually is associated with this: an output with an address that can be spent by the creator of the transaction.
-
-For this reason, some methods in the Transaction class are provided:
-- `change(address)`: Set up the change address. This will set an internal `_changeScript` property that will store the change script associated with that address.
-- `fee(amount)`: Sets up the exact amount of fee to pay. If no change address is provided, this will raise an exception.
-- `getFee()`: returns the estimated fee amount to be paid, based on the size of the transaction, but disregarding the priority of the outputs.
-
-Internally, a `_changeIndex` property stores the index of the change output (so it can get updated when a new input or output is added).
-
-## Time-Locking transaction
-All bitcoin transactions contain a locktime field. The locktime indicates the earliest time a transaction can be added to the blockchain. Locktime allows signers to create time-locked transactions which will only become valid in the future, giving the signers a chance to change their minds. Locktime can be set in the form of a bitcoin block height (the transaction can only be included in a block with a higher height than specified) or a linux timestamp (transaction can only be confirmed after that time). For more information see [bitcoin's development guide section on locktime](https://bitcoin.org/en/developer-guide#locktime-and-sequence-number).
-
-In bitcore, you can set a `Transaction`'s locktime by using the methods `Transaction#lockUntilDate` and `Transaction#lockUntilBlockHeight`. You can also get a friendly version of the locktime field via `Transaction#getLockTime`;
-
-For example:
-
-```javascript
-var future = new Date(2025,10,30); // Sun Nov 30 2025
-var transaction = new Transaction()
- .lockUntilDate(future);
-console.log(transaction.getLockTime());
-// output similar to: Sun Nov 30 2025 00:00:00 GMT-0300 (ART)
-```
-
-## Upcoming changes
-We're debating an API for Merge Avoidance, CoinJoin, Smart contracts, CoinSwap, and Stealth Addresses. We're expecting to have all of them by some time in 2015. Payment channel creation is available in the [bitcore-channel](https://github.com/bitpay/bitcore-channel) module.
diff --git a/docs/unit.md b/docs/unit.md
deleted file mode 100644
index 72017c4..0000000
--- a/docs/unit.md
+++ /dev/null
@@ -1,80 +0,0 @@
-# Unit
-Unit is a utility for handling and converting bitcoin units. We strongly recommend to always use satoshis to represent amount inside your application and only convert them to other units in the front-end.
-
-To understand the need of using the `Unit` class when dealing with unit conversions, see this example:
-
-```
-> 81.99 * 100000 // wrong
-8198999.999999999
-> var bitcore = require('bitcore');
-> var Unit = bitcore.Unit;
-> Unit.fromMilis(81.99).toSatoshis() // correct
-8199000
-```
-
-## Supported units
-The supported units are BTC, mBTC, bits (micro BTCs, uBTC) and satoshis. The codes for each unit can be found as members of the Unit class.
-
-```javascript
-var btcCode = Unit.BTC;
-var mbtcCode = Unit.mBTC;
-var ubtcCode = Unit.uBTC;
-var bitsCode = Unit.bits;
-var satsCode = Unit.satoshis;
-```
-
-## Creating units
-There are two ways for creating a unit instance. You can instantiate the class using a value and a unit code; alternatively if the unit it's fixed you could you some of the static methods. Check some examples below:
-
-```javascript
-var unit;
-var amount = 100;
-
-// using a unit code
-var unitPreference = Unit.BTC;
-unit = new Unit(amount, unitPreference);
-
-// using a known unit
-unit = Unit.fromBTC(amount);
-unit = Unit.fromMilis(amount);
-unit = Unit.fromBits(amount);
-unit = Unit.fromSatoshis(amount);
-```
-
-## Conversion
-Once you have a unit instance, you can check its representation in all the available units. For your convenience the classes expose three ways to accomplish this. Using the `.to(unitCode)` method, using a fixed unit like `.toSatoshis()` or by using the accessors.
-
-```javascript
-var unit;
-
-// using a unit code
-var unitPreference = Unit.BTC;
-value = Unit.fromSatoshis(amount).to(unitPreference);
-
-// using a known unit
-value = Unit.fromBTC(amount).toBTC();
-value = Unit.fromBTC(amount).toMilis();
-value = Unit.fromBTC(amount).toBits();
-value = Unit.fromBTC(amount).toSatoshis();
-
-// using accessors
-value = Unit.fromBTC(amount).BTC;
-value = Unit.fromBTC(amount).mBTC;
-value = Unit.fromBTC(amount).bits;
-value = Unit.fromBTC(amount).satoshis;
-```
-
-## Using a fiat currency
-The unit class also provides a convenient alternative to create an instance from a fiat amount and the corresponding BTC/fiat exchange rate. Any unit instance can be converted to a fiat amount by providing the current exchange rate. Check the example below:
-
-```javascript
-var unit, fiat;
-var amount = 100;
-var exchangeRate = 350;
-
-unit = new Unit(amount, exchangeRate);
-unit = Unit.fromFiat(amount, exchangeRate);
-
-fiat = Unit.fromBits(amount).atRate(exchangeRate);
-fiat = Unit.fromBits(amount).to(exchangeRate);
-```
diff --git a/docs/unspentoutput.md b/docs/unspentoutput.md
deleted file mode 100644
index 0aac09a..0000000
--- a/docs/unspentoutput.md
+++ /dev/null
@@ -1,32 +0,0 @@
-# UnspentOutput
-`bitcore.Transaction.UnspentOutput` is a class with stateless instances that provides information about an unspent output:
-- Transaction ID and output index
-- The "scriptPubKey", the script included in the output
-- Amount of satoshis associated
-- Address, if available
-
-## Parameters
-The constructor is quite permissive with the input arguments. It can take outputs straight out of bitcoind's getunspent RPC call. Some of the names are not very informative for new users, so the UnspentOutput constructor also understands these aliases:
-- `scriptPubKey`: just `script` is also accepted
-- `amount`: expected value in BTC. If the `satoshis` alias is used, make sure to use satoshis instead of BTC.
-- `vout`: this is the index of the output in the transaction, renamed to `outputIndex`
-- `txid`: `txId`
-
-## Example
-
-```javascript
-var utxo = new UnspentOutput({
- "txid" : "a0a08e397203df68392ee95b3f08b0b3b3e2401410a38d46ae0874f74846f2e9",
- "vout" : 0,
- "address" : "mgJT8iegL4f9NCgQFeFyfvnSw1Yj4M5Woi",
- "scriptPubKey" : "76a914089acaba6af8b2b4fb4bed3b747ab1e4e60b496588ac",
- "amount" : 0.00070000
-});
-var utxo = new UnspentOutput({
- "txId" : "a0a08e397203df68392ee95b3f08b0b3b3e2401410a38d46ae0874f74846f2e9",
- "outputIndex" : 0,
- "address" : "mgJT8iegL4f9NCgQFeFyfvnSw1Yj4M5Woi",
- "script" : "76a914089acaba6af8b2b4fb4bed3b747ab1e4e60b496588ac",
- "satoshis" : 70000
-});
-```
diff --git a/docs/uri.md b/docs/uri.md
deleted file mode 100644
index 9af6242..0000000
--- a/docs/uri.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Bitcoin URIs
-Represents a bitcoin payment URI. Bitcoin URI strings became the most popular way to share payment request, sometimes as a bitcoin link and others using a QR code.
-
-URI Examples:
-
-```
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2
-bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2&message=Payment&label=Satoshi&extra=other-param
-```
-
-## URI Validation
-The main use that we expect you'll have for the `URI` class in bitcore is validating and parsing bitcoin URIs. A `URI` instance exposes the address as a bitcore `Address` object and the amount in Satoshis, if present.
-
-The code for validating URIs looks like this:
-
-```javascript
-var uriString = 'bitcoin:12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu?amount=1.2';
-var valid = URI.isValid(uriString);
-var uri = new URI(uriString);
-console.log(uri.address.network, uri.amount); // 'livenet', 120000000
-```
-
-## URI Parameters
-All standard parameters can be found as members of the `URI` instance. However a bitcoin URI may contain other non-standard parameters, all those can be found under the `extra` namespace.
-
-See [the official BIP21 spec](https://github.com/bitcoin/bips/blob/master/bip-0021.mediawiki) for more information.
-
-## Create URI
-Another important use case for the `URI` class is creating a bitcoin URI for sharing a payment request. That can be accomplished by using a dictionary to create an instance of URI.
-
-The code for creating an URI from an Object looks like this:
-
-```javascript
-var uriString = new URI({
- address: '12A1MyfXbW6RhdRAZEqofac5jCQQjwEPBu',
- amount : 10000, // in satoshis
- message: 'My payment request'
-});
-var uriString = uri.toString();
-```
diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index a42397b..0000000
--- a/gulpfile.js
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-var bitcoreTasks = require('bitcore-build');
-
-bitcoreTasks('lib');
diff --git a/index.js b/index.js
index 181d101..a0a2ab6 100644
--- a/index.js
+++ b/index.js
@@ -1,91 +1,16 @@
-'use strict';
-
-var bitcore = module.exports;
-
-// module information
-bitcore.version = 'v' + require('./package.json').version;
-bitcore.versionGuard = function(version) {
- if (version !== undefined) {
- var message = 'More than one instance of bitcore-lib found. ' +
- 'Please make sure to require bitcore-lib and check that submodules do' +
- ' not also include their own bitcore-lib dependency.';
- throw new Error(message);
- }
-};
-bitcore.versionGuard(global._bitcore);
-global._bitcore = bitcore.version;
-
-// crypto
-bitcore.crypto = {};
-bitcore.crypto.BN = require('./lib/crypto/bn');
-bitcore.crypto.ECDSA = require('./lib/crypto/ecdsa');
-bitcore.crypto.Hash = require('./lib/crypto/hash');
-bitcore.crypto.Random = require('./lib/crypto/random');
-bitcore.crypto.Point = require('./lib/crypto/point');
-bitcore.crypto.Signature = require('./lib/crypto/signature');
-
-// encoding
-bitcore.encoding = {};
-bitcore.encoding.Base58 = require('./lib/encoding/base58');
-bitcore.encoding.Base58Check = require('./lib/encoding/base58check');
-bitcore.encoding.BufferReader = require('./lib/encoding/bufferreader');
-bitcore.encoding.BufferWriter = require('./lib/encoding/bufferwriter');
-bitcore.encoding.Varint = require('./lib/encoding/varint');
-
-// utilities
-bitcore.util = {};
-bitcore.util.buffer = require('./lib/util/buffer');
-bitcore.util.js = require('./lib/util/js');
-bitcore.util.preconditions = require('./lib/util/preconditions');
-bitcore.util.util = require('./lib/util/util')
-bitcore.util.BetItem = require('./lib/util/betitem')
-bitcore.util.VoteFund = require('./lib/util/votefund')
-bitcore.util.WriterHelper = require('./lib/util/writerhelper');
-
-// errors thrown by the library
-bitcore.errors = require('./lib/errors');
-
-// main bitcoin library
-bitcore.Address = require('./lib/address');
-bitcore.Block = require('./lib/block');
-bitcore.MerkleBlock = require('./lib/block/merkleblock');
-bitcore.BlockHeader = require('./lib/block/blockheader');
-bitcore.HDPrivateKey = require('./lib/hdprivatekey.js');
-bitcore.HDPublicKey = require('./lib/hdpublickey.js');
-bitcore.Networks = require('./lib/networks');
-bitcore.Opcode = require('./lib/opcode');
-bitcore.PrivateKey = require('./lib/privatekey');
-bitcore.PublicKey = require('./lib/publickey');
-bitcore.Script = require('./lib/script');
-bitcore.Transaction = require('./lib/transaction');
-bitcore.URI = require('./lib/uri');
-bitcore.Unit = require('./lib/unit');
-
-// dependencies, subject to change
-bitcore.deps = {};
-bitcore.deps.bnjs = require('bn.js');
-bitcore.deps.bs58 = require('bs58');
-bitcore.deps.Buffer = Buffer;
-bitcore.deps.elliptic = require('elliptic');
-bitcore.deps._ = require('lodash');
-
-// Internal usage, exposed for testing/advanced tweaking
-bitcore.Transaction.sighash = require('./lib/transaction/sighash');
-bitcore.Transaction.RegisterAccountTx = require('./lib/transaction/registeraccounttx')
-bitcore.Transaction.CommonTx = require('./lib/transaction/commontx')
-bitcore.Transaction.ContractTx = require('./lib/transaction/contracttx')
-bitcore.Transaction.DelegateTx = require('./lib/transaction/delegatetx')
-
-bitcore.Transaction.CdpStakeTx = require('./lib/transaction/cdpstaketx')
-bitcore.Transaction.FeedPriceTx = require('./lib/transaction/cpricefeedtx')
-bitcore.Transaction.CdpLiquiDateTx = require('./lib/transaction/cdpliquidatetx')
-bitcore.Transaction.CFcoinStakeTx = require('./lib/transaction/cfcoinstaketx')
-bitcore.Transaction.CdpRedeemTx = require('./lib/transaction/cdpredeemtx')
-bitcore.Transaction.UCoinTransferTx = require('./lib/transaction/ucointransfertx')
-bitcore.Transaction.DexSellLimitOrderTx=require('./lib/transaction/dexselllimitordertx')
-bitcore.Transaction.DexBuyLimitOrderTx=require('./lib/transaction/dexbuylimitordertx')
-bitcore.Transaction.DexBuyMarketOrderTx=require('./lib/transaction/dexbuymarketordertx')
-bitcore.Transaction.DexSellMarketOrderTx=require('./lib/transaction/dexsellmarketordertx')
-bitcore.Transaction.DexCancelOrderTx=require('./lib/transaction/dexcancelordertx')
-bitcore.Mnemonic = require('./lib/mnemonic');
-bitcore.WiccApi = require('./lib/wiccapi')
+var WiccWalletLib = Object.create(null)
+var WiccApi = require('./src/lib/wiccapi')
+var bitcore = require('./src')
+var Wallet = require("./src/Wallet")
+var WalletManager = require("./src/WalletManager")
+var WaykiTransaction = require('./src/WaykiTransaction')
+var BaasClient = require('./src/BaasClient')
+
+WiccWalletLib.Wallet = Wallet
+WiccWalletLib.WalletManager = WalletManager
+WiccWalletLib.WaykiTransaction = WaykiTransaction
+WiccWalletLib.WiccApi = WiccApi
+WiccWalletLib.bitcore = bitcore
+WiccWalletLib.BaasClient = BaasClient
+
+module.exports = WiccWalletLib
\ No newline at end of file
diff --git a/karma.conf.js b/karma.conf.js
deleted file mode 100644
index dc5d597..0000000
--- a/karma.conf.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-// karma.conf.js
-module.exports = function(config) {
-
- config.set({
- browsers: ['Firefox'],
- frameworks: ['mocha', 'detectBrowsers'],
- detectBrowsers: {
- enabled: true,
- usePhantomJS: false,
- postDetection: function(availableBrowser) {
- // modify to enable additional browsers if available
- var runBrowsers = ['Firefox', 'Chrome'];
- var browsers = [];
- for(var i = 0; i < runBrowsers.length; i++) {
- if(~availableBrowser.indexOf(runBrowsers[i])) {
- browsers.push(runBrowsers[i]);
- }
- }
- return browsers;
- }
- },
- singleRun: true,
- files: [
- 'tests.js'
- ],
- plugins: [
- 'karma-mocha',
- 'karma-chrome-launcher',
- 'karma-firefox-launcher',
- 'karma-detect-browsers'
- ]
- });
-
-};
diff --git a/lib/transaction/cfcoinstaketx.js b/lib/transaction/cfcoinstaketx.js
deleted file mode 100644
index 922321d..0000000
--- a/lib/transaction/cfcoinstaketx.js
+++ /dev/null
@@ -1,172 +0,0 @@
-'use strict';
-//cdp创建
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-var Util = require('../util/util')
-var BN = require('../crypto/bn');
-var Hash = require('../crypto/hash');
-var ECDSA = require('../crypto/ecdsa');
-var Signature = require('../crypto/signature');
-var BufferWriter = require('../encoding/bufferwriter');
-var Address = require('../address')
-
-var CFcoinStakeTx = function CFcoinStakeTx(arg) {
- if (!(this instanceof CFcoinStakeTx)) {
- return new CFcoinStakeTx(arg);
- }
- var info = CFcoinStakeTx._from(arg);
- this.nTxType = info.nTxType;
- this.nVersion = info.nVersion;
- this.nValidHeight = info.nValidHeight;
- this.txUid = info.txUid;
- this.fees = info.fees;
- this.feeSymbol = info.feeSymbol;
- this.stakeType = info.stakeType;
- this.fcoinsToStake = info.fcoinsToStake;
- this.publicKey=info.publicKey;
- return this;
- };
-
- CFcoinStakeTx._from = function _from(arg) {
- var info = {};
- if (_.isObject(arg)) {
- info = CFcoinStakeTx._fromObject(arg);
- } else {
- throw new TypeError('Unrecognized argument for CommonTx');
- }
- return info;
- };
-
- CFcoinStakeTx._fromObject = function _fromObject(data) {
- $.checkArgument(data, 'data is required');
-
- var info = {
- nTxType: data.nTxType,
- nVersion: data.nVersion,
- nValidHeight: data.nValidHeight,
- txUid: data.txUid,
- feeSymbol:data.feeSymbol,
- stakeType:data.stakeType,
- fees: data.fees,
- fcoinsToStake: data.fcoinsToStake,
- publicKey:data.publicKey,
- };
- return info;
- };
-
- CFcoinStakeTx.prototype._SignatureHash = function() {
- var writer = new BufferWriter();
- writer.writeVarintNum(this.nVersion)
- writer.writeVarintNum(this.nTxType)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
- if(this.txUid!=null&&!_.isEmpty(this.txUid)){
- var REGID = Util.splitRegID(this.txUid)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
- writer.writeUInt8(pubKey.length)
- writer.write(pubKey)
- }else{
- return false;
- }
-
- if(this.feeSymbol==null||_.isEmpty(this.feeSymbol)) return fasle;
- writer.writeString(this.feeSymbol)
-
- var feesBuf = Util.writeVarInt(8, this.fees)
- writer.write(feesBuf)
-
- var stakeTypeBuf = Util.writeVarInt(8, this.stakeType)
- writer.write(stakeTypeBuf)
-
- if(! /^[0-9]*[0-9][0-9]*$/.test(this.fcoinsToStake))
- return false;
- var fcoinsToStake = Util.writeVarInt(8, this.fcoinsToStake)
- writer.write(fcoinsToStake)
-
- var serialBuf = writer.toBuffer()
-
- //console.log(serialBuf.toString('hex'))
- return Hash.sha256sha256(serialBuf);
- }
-
- CFcoinStakeTx.prototype._Signtx = function(privateKey) {
- var hashbuf = this._SignatureHash()
- var sig = ECDSA.sign(hashbuf, privateKey, 'endian')
- var sigBuf = sig.toBuffer()
-
- return sigBuf;
- }
-
- CFcoinStakeTx.prototype.SerializeTx = function(privateKey) {
- var writer = new BufferWriter();
- writer.writeVarintNum(this.nTxType)
- writer.writeVarintNum(this.nVersion)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
-
- if(this.txUid!=null&&!_.isEmpty(this.txUid)){
- var REGID = Util.splitRegID(this.txUid)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
- writer.writeUInt8(pubKey.length)
- writer.write(pubKey)
- }else{
- return false;
- }
-
- if(this.feeSymbol==null||_.isEmpty(this.feeSymbol)) return fasle;
- writer.writeString(this.feeSymbol)
-
- if(! /^[1-9]*[1-9][0-9]*$/.test(this.fees))
- return false;
- var feesBuf = Util.writeVarInt(8, this.fees)
- writer.write(feesBuf)
-
- var stakeTypeBuf = Util.writeVarInt(8, this.stakeType)
- writer.write(stakeTypeBuf)
-
- if(! /^[0-9]*[0-9][0-9]*$/.test(this.fcoinsToStake))
- return false;
- var fcoinsToStake = Util.writeVarInt(8, this.fcoinsToStake)
- writer.write(fcoinsToStake)
-
- var sigBuf = this._Signtx(privateKey)
-
- var len = sigBuf.length
- writer.writeVarintNum(len)
- writer.write(sigBuf)
-
-
- var hexBuf = writer.toBuffer()
- var hex = hexBuf.toString('hex')
-
- return hex
- }
-
-
- module.exports = CFcoinStakeTx;
\ No newline at end of file
diff --git a/lib/transaction/cpricefeedtx.js b/lib/transaction/cpricefeedtx.js
deleted file mode 100644
index 605f9c4..0000000
--- a/lib/transaction/cpricefeedtx.js
+++ /dev/null
@@ -1,153 +0,0 @@
-'use strict';
-//cdp创建
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-var Util = require('../util/util')
-var BN = require('../crypto/bn');
-var Hash = require('../crypto/hash');
-var ECDSA = require('../crypto/ecdsa');
-var Signature = require('../crypto/signature');
-var BufferWriter = require('../encoding/bufferwriter');
-var WriterHelper = require('../util/writerhelper');
-var Address = require('../address')
-
-var CpriceFeedTx = function CpriceFeedTx(arg) {
- if (!(this instanceof CpriceFeedTx)) {
- return new CpriceFeedTx(arg);
- }
- var info = CpriceFeedTx._from(arg);
- this.nTxType = info.nTxType;
- this.nVersion = info.nVersion;
- this.nValidHeight = info.nValidHeight;
- this.srcRegId = info.srcRegId;
- this.feedPriceData = info.feedPriceData;
- this.network = info.network;
-
- return this;
- };
-
- CpriceFeedTx._from = function _from(arg) {
- var info = {};
- if (_.isObject(arg)) {
- info = CpriceFeedTx._fromObject(arg);
- } else {
- throw new TypeError('Unrecognized argument for CommonTx');
- }
- return info;
- };
-
- CpriceFeedTx._fromObject = function _fromObject(data) {
- $.checkArgument(data, 'data is required');
- if (!Util.checkRegId(data.srcRegId)) {
- throw new errors.InvalidArgument("srcRegId", "Invalid reg id");
- }
- CpriceFeedTx._checkFeedPriceData(data.feedPriceData)
-
- var info = {
- nTxType: data.nTxType,
- nVersion: data.nVersion,
- nValidHeight: data.nValidHeight,
- srcRegId: data.srcRegId,
- feedPriceData: data.feedPriceData
- };
- return info;
- };
-
- CpriceFeedTx.prototype._SignatureHash = function() {
- var writer = new WriterHelper();
- writer.writeVarintNum(this.nVersion)
- writer.writeVarintNum(this.nTxType)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
- var REGID = Util.splitRegID(this.srcRegId)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
-
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
-
- writer.writeFeedPriceData(this.feedPriceData)
-
- var serialBuf = writer.toBuffer()
- //console.log(serialBuf.toString('hex'))
- return Hash.sha256sha256(serialBuf);
- }
-
- CpriceFeedTx.prototype._Signtx = function(privateKey) {
- var hashbuf = this._SignatureHash()
- var sig = ECDSA.sign(hashbuf, privateKey, 'endian')
- var sigBuf = sig.toBuffer()
-
- return sigBuf;
- }
-
- CpriceFeedTx._checkFeedPriceData = function _checkFeedPriceData(feedPriceData) {
- if(!_.isArray(feedPriceData) || _.isEmpty(feedPriceData)) {
- throw new errors.InvalidArgument("delegateData", "delegateData must be array and not empty.");
- }
-
- for(var i = 0; i < feedPriceData.length; i++) {
- var coinPriceType = feedPriceData[i].coinPriceType;
- var coinType = coinPriceType.coinType;
- var priceType = coinPriceType.priceType;
-
- var price=feedPriceData[i].price
-
- if(!_.isNumber(coinType)) {
- throw new errors.InvalidArgument("feedPriceData", "feedPriceData[" + i + "].coinPriceType.coinType must be number.");
- }
- if(!_.isNumber(priceType)) {
- throw new errors.InvalidArgument("feedPriceData", "feedPriceData[" + i + "].coinPriceType.priceType. must be number.");
- }
- if(!_.isNumber(price)) {
- throw new errors.InvalidArgument("feedPriceData", "feedPriceData[" + i + "].price must be number.");
- }
- }
- }
-
- CpriceFeedTx.prototype.SerializeTx = function(privateKey) {
- var writer = new WriterHelper();
- writer.writeVarintNum(this.nTxType)
- writer.writeVarintNum(this.nVersion)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
-
- var REGID = Util.splitRegID(this.srcRegId)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
-
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
-
- writer.writeFeedPriceData(this.feedPriceData)
-
- var sigBuf = this._Signtx(privateKey)
-
- var len = sigBuf.length
- writer.writeVarintNum(len)
- writer.write(sigBuf)
-
- var hexBuf = writer.toBuffer()
- var hex = hexBuf.toString('hex')
-
- return hex
- }
-
-
- module.exports = CpriceFeedTx;
\ No newline at end of file
diff --git a/lib/transaction/ucointransfertx.js b/lib/transaction/ucointransfertx.js
deleted file mode 100644
index 3d06cf3..0000000
--- a/lib/transaction/ucointransfertx.js
+++ /dev/null
@@ -1,214 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var $ = require('../util/preconditions');
-var Util = require('../util/util')
-var Hash = require('../crypto/hash');
-var ECDSA = require('../crypto/ecdsa');
-var BufferWriter = require('../encoding/bufferwriter');
-var bufferUtil = require('../util/buffer');
-var WriterHelper = require('../util/writerhelper');
-
-var UCoinTransferTx = function UCoinTransferTx(arg) {
- if (!(this instanceof UCoinTransferTx)) {
- return new UCoinTransferTx(arg);
- }
- var info = UCoinTransferTx._from(arg);
- this.nTxType = info.nTxType;
- this.nVersion = info.nVersion;
- this.nValidHeight = info.nValidHeight;
- this.srcRegId = info.srcRegId;
- this.destArr = info.destArr;
- this.fees = info.fees;
- this.publicKey=info.publicKey;
- this.feesCoinType = info.feesCoinType;
- this.memo = info.memo;
- this.network = info.network;
-
- return this;
- };
-
- UCoinTransferTx._from = function _from(arg) {
- var info = {};
- if (_.isObject(arg)) {
- info = UCoinTransferTx._fromObject(arg);
- } else {
- throw new TypeError('Unrecognized argument for UCoinTransferTx');
- }
- return info;
- };
-
- UCoinTransferTx._fromObject = function _fromObject(data) {
- $.checkArgument(data, 'data is required');
-
- var info = {
- nTxType : data.nTxType,
- nVersion : data.nVersion,
- nValidHeight : data.nValidHeight,
- srcRegId : data.srcRegId,
- destArr : data.destArr,
- fees : data.fees,
- publicKey:data.publicKey,
- feesCoinType : data.feesCoinType,
- memo : data.memo
- };
- return info;
- };
-
- UCoinTransferTx.prototype._SignatureHash = function() {
- var writer = new WriterHelper();
- writer.writeVarintNum(this.nVersion)
- writer.writeVarintNum(this.nTxType)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
- if(this.srcRegId!=null&&!_.isEmpty(this.srcRegId)){
- var REGID = Util.splitRegID(this.srcRegId)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
- writer.writeUInt8(pubKey.length)
- writer.write(pubKey)
- }else{
- return false;
- }
-
- // var addr = Address.fromString(this.destAddr, this.network, 'pubkeyhash')
- //console.log(addr.hashBuffer.toString('hex'))
-
- // var size = addr.hashBuffer.length
- // writer.writeUInt8(size)
- // writer.write(addr.hashBuffer)
-
- // if(this.coinType==null||_.isEmpty(this.coinType)) return fasle;
- // writer.writeString(this.coinType)
-
- // var valueBuf = Util.writeVarInt(8, this.value)
- // writer.write(valueBuf)
-
- if(this.feesCoinType==null||_.isEmpty(this.feesCoinType)) return fasle;
- writer.writeString(this.feesCoinType)
-
- var feesBuf = Util.writeVarInt(8, this.fees)
- writer.write(feesBuf)
- writer.writeDestArrData(this.destArr)
- var len = 0
- var buf = this.memo
- if (!_.isEmpty(this.memo)) {
- if (!bufferUtil.isBuffer(buf)) {
- buf = Buffer.from(buf)
- }
- len = buf.length
- }
- writer.writeVarintNum(len)
- if (len > 0) {
- writer.write(buf)
- }
-
- var serialBuf = writer.toBuffer()
-
- //console.log(serialBuf.toString('hex'))
-
- return Hash.sha256sha256(serialBuf);
- }
-
- UCoinTransferTx.prototype._Signtx = function(privateKey) {
- var hashbuf = this._SignatureHash()
- var sig = ECDSA.sign(hashbuf, privateKey, 'endian')
- var sigBuf = sig.toBuffer()
-
- return sigBuf;
- }
-
- UCoinTransferTx.prototype.SerializeTx = function(privateKey) {
- var writer = new WriterHelper();
- writer.writeVarintNum(this.nTxType)
- writer.writeVarintNum(this.nVersion)
- var heightBuf = Util.writeVarInt(4, this.nValidHeight)
- writer.write(heightBuf)
-
-
- if(this.srcRegId!=null&&!_.isEmpty(this.srcRegId)){
- var REGID = Util.splitRegID(this.srcRegId)
- if(_.isNull(REGID.height) || _.isUndefined(REGID.height))
- return false
- var regWriter = new BufferWriter()
- var regHeightBuf = Util.writeVarInt(4, REGID.height)
- regWriter.write(regHeightBuf)
- var regIndexBuf = Util.writeVarInt(2, REGID.index)
- regWriter.write(regIndexBuf)
-
- var regBuf = regWriter.toBuffer()
- writer.writeUInt8(regBuf.length)
- writer.write(regBuf)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
- writer.writeUInt8(pubKey.length)
- writer.write(pubKey)
- }else{
- return false;
- }
-
- // var addr = Address.fromString(this.destAddr, this.network, 'pubkeyhash')
- // //console.log(addr.hashBuffer.toString('hex'))
-
- // var size = addr.hashBuffer.length
- // writer.writeUInt8(size)
- // writer.write(addr.hashBuffer)
-
- // if(this.coinType==null||_.isEmpty(this.coinType)) return fasle;
- // writer.writeString(this.coinType)
-
- // if(! /^[1-9]*[1-9][0-9]*$/.test(this.value))
- // return false;
- // var valueBuf = Util.writeVarInt(8, this.value)
- // writer.write(valueBuf)
-
- if(this.feesCoinType==null||_.isEmpty(this.feesCoinType)) return fasle;
- writer.writeString(this.feesCoinType)
-
- if(! /^[1-9]*[1-9][0-9]*$/.test(this.fees))
- return false;
- var feesBuf = Util.writeVarInt(8, this.fees)
- writer.write(feesBuf)
- writer.writeDestArrData(this.destArr)
- var len = 0
- var buf = this.memo
- if (!_.isEmpty(this.memo)) {
- if (!bufferUtil.isBuffer(buf)) {
- buf = Buffer.from(buf)
- }
- len = buf.length
- }
- writer.writeVarintNum(len)
- if (len > 0) {
- writer.write(buf)
- }
-
-
-
- var sigBuf = this._Signtx(privateKey)
-
- var len = sigBuf.length
- writer.writeVarintNum(len)
- writer.write(sigBuf)
-
-
- var hexBuf = writer.toBuffer()
- var hex = hexBuf.toString('hex')
-
- return hex
- }
-
-
- module.exports = UCoinTransferTx;
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 3417d8f..85736fb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,204 +1,237 @@
{
"name": "wicc-wallet-lib",
- "version": "1.0.3",
+ "version": "2.0.0",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
"@babel/code-frame": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
- "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz",
+ "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==",
"dev": true,
"requires": {
"@babel/highlight": "^7.0.0"
}
},
"@babel/core": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz",
- "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==",
- "dev": true,
- "requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.2.2",
- "@babel/helpers": "^7.2.0",
- "@babel/parser": "^7.2.2",
- "@babel/template": "^7.2.2",
- "@babel/traverse": "^7.2.2",
- "@babel/types": "^7.2.2",
- "convert-source-map": "^1.1.0",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.7.4.tgz",
+ "integrity": "sha512-+bYbx56j4nYBmpsWtnPUsKW3NdnYxbqyfrP2w9wILBuHzdfIKz9prieZK0DFPyIzkjYVUe4QkusGL07r5pXznQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.5.5",
+ "@babel/generator": "^7.7.4",
+ "@babel/helpers": "^7.7.4",
+ "@babel/parser": "^7.7.4",
+ "@babel/template": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4",
+ "convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"json5": "^2.1.0",
- "lodash": "^4.17.10",
+ "lodash": "^4.17.13",
"resolve": "^1.3.2",
"semver": "^5.4.1",
"source-map": "^0.5.0"
},
"dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "json5": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz",
+ "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==",
+ "dev": true,
+ "requires": {
+ "minimist": "^1.2.0"
+ }
+ },
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
"@babel/generator": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.0.tgz",
- "integrity": "sha512-dZTwMvTgWfhmibq4V9X+LMf6Bgl7zAodRn9PvcPdhlzFMbvUutx74dbEv7Atz3ToeEpevYEJtAwfxq/bDCzHWg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.7.4.tgz",
+ "integrity": "sha512-m5qo2WgdOJeyYngKImbkyQrnUN1mPceaG5BV+G0E3gWsa4l/jCSryWJdM2x8OuGAOyh+3d5pVYfZWCiNFtynxg==",
"dev": true,
"requires": {
- "@babel/types": "^7.3.0",
+ "@babel/types": "^7.7.4",
"jsesc": "^2.5.1",
- "lodash": "^4.17.10",
- "source-map": "^0.5.0",
- "trim-right": "^1.0.1"
+ "lodash": "^4.17.13",
+ "source-map": "^0.5.0"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
}
}
},
"@babel/helper-annotate-as-pure": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz",
- "integrity": "sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz",
+ "integrity": "sha512-2BQmQgECKzYKFPpiycoF9tlb5HA4lrVyAmLLVK177EcQAqjVLciUb2/R+n1boQ9y5ENV3uz2ZqiNw7QMBBw1Og==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz",
- "integrity": "sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz",
+ "integrity": "sha512-Biq/d/WtvfftWZ9Uf39hbPBYDUo986m5Bb4zhkeYDGUllF43D+nUe5M6Vuo6/8JDK/0YX/uBdeoQpyaNhNugZQ==",
"dev": true,
"requires": {
- "@babel/helper-explode-assignable-expression": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/helper-explode-assignable-expression": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-call-delegate": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz",
- "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz",
+ "integrity": "sha512-8JH9/B7J7tCYJ2PpWVpw9JhPuEVHztagNVuQAFBVFYluRMlpG7F1CgKEgGeL6KFqcsIa92ZYVj6DSc0XwmN1ZA==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-hoist-variables": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
+ }
+ },
+ "@babel/helper-create-regexp-features-plugin": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.4.tgz",
+ "integrity": "sha512-Mt+jBKaxL0zfOIWrfQpnfYCN7/rS6GKx6CCCfuoqVVd+17R8zNDlzVYmIi9qyb2wOk002NsmSTDymkIygDUH7A==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.0.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/helper-regex": "^7.4.4",
+ "regexpu-core": "^4.6.0"
}
},
"@babel/helper-define-map": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz",
- "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.7.4.tgz",
+ "integrity": "sha512-v5LorqOa0nVQUvAUTUF3KPastvUt/HzByXNamKQ6RdJRTV7j8rLL+WB5C/MzzWAwOomxDhYFb1wLLxHqox86lg==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/types": "^7.0.0",
- "lodash": "^4.17.10"
+ "@babel/helper-function-name": "^7.7.4",
+ "@babel/types": "^7.7.4",
+ "lodash": "^4.17.13"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
}
}
},
"@babel/helper-explode-assignable-expression": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz",
- "integrity": "sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz",
+ "integrity": "sha512-2/SicuFrNSXsZNBxe5UGdLr+HZg+raWBLE9vC98bdYOKX/U6PY0mdGlYUJdtTDPSU0Lw0PNbKKDpwYHJLn2jLg==",
"dev": true,
"requires": {
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-function-name": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
- "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.7.4.tgz",
+ "integrity": "sha512-AnkGIdiBhEuiwdoMnKm7jfPfqItZhgRaZfMg1XX3bS25INOnLPjPG1Ppnajh8eqgt5kPJnfqrRHqFqmjKDZLzQ==",
"dev": true,
"requires": {
- "@babel/helper-get-function-arity": "^7.0.0",
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/helper-get-function-arity": "^7.7.4",
+ "@babel/template": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-get-function-arity": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
- "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.4.tgz",
+ "integrity": "sha512-QTGKEdCkjgzgfJ3bAyRwF4yyT3pg+vDgan8DSivq1eS0gwi+KGKE5x8kRcbeFTb/673mkO5SN1IZfmCfA5o+EA==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz",
- "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.4.tgz",
+ "integrity": "sha512-wQC4xyvc1Jo/FnLirL6CEgPgPCa8M74tOdjWpRhQYapz5JC7u3NYU1zCVoVAGCE3EaIP9T1A3iW0WLJ+reZlpQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-member-expression-to-functions": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz",
- "integrity": "sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz",
+ "integrity": "sha512-9KcA1X2E3OjXl/ykfMMInBK+uVdfIVakVe7W7Lg3wfXUNyS3Q1HWLFRwZIjhqiCGbslummPDnmb7vIekS0C1vw==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-module-imports": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz",
- "integrity": "sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz",
+ "integrity": "sha512-dGcrX6K9l8258WFjyDLJwuVKxR4XZfU0/vTUgOQYWEnRD8mgr+p4d6fCUMq/ys0h4CCt/S5JhbvtyErjWouAUQ==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-module-transforms": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz",
- "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.7.4.tgz",
+ "integrity": "sha512-ehGBu4mXrhs0FxAqN8tWkzF8GSIGAiEumu4ONZ/hD9M88uHcD+Yu2ttKfOCgwzoesJOJrtQh7trI5YPbRtMmnA==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.0.0",
- "@babel/template": "^7.2.2",
- "@babel/types": "^7.2.2",
- "lodash": "^4.17.10"
+ "@babel/helper-module-imports": "^7.7.4",
+ "@babel/helper-simple-access": "^7.7.4",
+ "@babel/helper-split-export-declaration": "^7.7.4",
+ "@babel/template": "^7.7.4",
+ "@babel/types": "^7.7.4",
+ "lodash": "^4.17.13"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
}
}
},
"@babel/helper-optimise-call-expression": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz",
- "integrity": "sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz",
+ "integrity": "sha512-VB7gWZ2fDkSuqW6b1AKXkJWO5NyNI3bFL/kK79/30moK57blr6NbH8xcl2XcKCwOmJosftWunZqfO84IGq3ZZg==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-plugin-utils": {
@@ -208,444 +241,537 @@
"dev": true
},
"@babel/helper-regex": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz",
- "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==",
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.5.5.tgz",
+ "integrity": "sha512-CkCYQLkfkiugbRDO8eZn6lRuR8kzZoGXCg3149iTk5se7g6qykSpy3+hELSwquhu+TgHn8nkLiBwHvNX8Hofcw==",
"dev": true,
"requires": {
- "lodash": "^4.17.10"
+ "lodash": "^4.17.13"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
}
}
},
"@babel/helper-remap-async-to-generator": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz",
- "integrity": "sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.4.tgz",
+ "integrity": "sha512-Sk4xmtVdM9sA/jCI80f+KS+Md+ZHIpjuqmYPk1M7F/upHou5e4ReYmExAiu6PVe65BhJPZA2CY9x9k4BqE5klw==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-wrap-function": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/helper-annotate-as-pure": "^7.7.4",
+ "@babel/helper-wrap-function": "^7.7.4",
+ "@babel/template": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-replace-supers": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz",
- "integrity": "sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz",
+ "integrity": "sha512-pP0tfgg9hsZWo5ZboYGuBn/bbYT/hdLPVSS4NMmiRJdwWhP0IznPwN9AE1JwyGsjSPLC364I0Qh5p+EPkGPNpg==",
"dev": true,
"requires": {
- "@babel/helper-member-expression-to-functions": "^7.0.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
- "@babel/traverse": "^7.2.3",
- "@babel/types": "^7.0.0"
+ "@babel/helper-member-expression-to-functions": "^7.7.4",
+ "@babel/helper-optimise-call-expression": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-simple-access": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz",
- "integrity": "sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz",
+ "integrity": "sha512-zK7THeEXfan7UlWsG2A6CI/L9jVnI5+xxKZOdej39Y0YtDYKx9raHk5F2EtK9K8DHRTihYwg20ADt9S36GR78A==",
"dev": true,
"requires": {
- "@babel/template": "^7.1.0",
- "@babel/types": "^7.0.0"
+ "@babel/template": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz",
- "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz",
+ "integrity": "sha512-guAg1SXFcVr04Guk9eq0S4/rWS++sbmyqosJzVs8+1fH5NI+ZcmkaSkc7dmtAFbHFva6yRJnjW3yAcGxjueDug==",
"dev": true,
"requires": {
- "@babel/types": "^7.0.0"
+ "@babel/types": "^7.7.4"
}
},
"@babel/helper-wrap-function": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz",
- "integrity": "sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.7.4.tgz",
+ "integrity": "sha512-VsfzZt6wmsocOaVU0OokwrIytHND55yvyT4BPB9AIIgwr8+x7617hetdJTsuGwygN5RC6mxA9EJztTjuwm2ofg==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.1.0",
- "@babel/template": "^7.1.0",
- "@babel/traverse": "^7.1.0",
- "@babel/types": "^7.2.0"
+ "@babel/helper-function-name": "^7.7.4",
+ "@babel/template": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/helpers": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.0.tgz",
- "integrity": "sha512-wRi/ZcWQ+BUwmWBAAzQUvQil8xb5U6faQfSkLwbNYn5y/OhLHghV4w/5/inZKEUbQMmOOdhoJy9KRXbGrJCklQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.7.4.tgz",
+ "integrity": "sha512-ak5NGZGJ6LV85Q1Zc9gn2n+ayXOizryhjSUBTdu5ih1tlVCJeuQENzc4ItyCVhINVXvIT/ZQ4mheGIsfBkpskg==",
"dev": true,
"requires": {
- "@babel/template": "^7.1.2",
- "@babel/traverse": "^7.1.5",
- "@babel/types": "^7.3.0"
+ "@babel/template": "^7.7.4",
+ "@babel/traverse": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/highlight": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
- "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "version": "7.5.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz",
+ "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==",
"dev": true,
"requires": {
"chalk": "^2.0.0",
"esutils": "^2.0.2",
"js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
}
},
"@babel/parser": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.0.tgz",
- "integrity": "sha512-8M30TzMpLHGmuthHZStm4F+az5wxyYeh8U+LWK7+b2qnlQ0anXBmOQ1I8DCMV1K981wPY3C3kWZ4SA1lR3Y3xQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.7.4.tgz",
+ "integrity": "sha512-jIwvLO0zCL+O/LmEJQjWA75MQTWwx3c3u2JOTDK5D3/9egrWRRA0/0hk9XXywYnXZVVpzrBYeIQTmhwUaePI9g==",
"dev": true
},
"@babel/plugin-proposal-async-generator-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz",
- "integrity": "sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz",
+ "integrity": "sha512-1ypyZvGRXriY/QP668+s8sFr2mqinhkRDMPSQLNghCQE+GAkFtp+wkHVvg2+Hdki8gwP+NFzJBJ/N1BfzCCDEw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/helper-remap-async-to-generator": "^7.7.4",
+ "@babel/plugin-syntax-async-generators": "^7.7.4"
+ }
+ },
+ "@babel/plugin-proposal-dynamic-import": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz",
+ "integrity": "sha512-StH+nGAdO6qDB1l8sZ5UBV8AC3F2VW2I8Vfld73TMKyptMU9DY5YsJAS8U81+vEtxcH3Y/La0wG0btDrhpnhjQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0",
- "@babel/plugin-syntax-async-generators": "^7.2.0"
+ "@babel/plugin-syntax-dynamic-import": "^7.7.4"
}
},
"@babel/plugin-proposal-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
- "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.7.4.tgz",
+ "integrity": "sha512-wQvt3akcBTfLU/wYoqm/ws7YOAQKu8EVJEvHip/mzkNtjaclQoCCIqKXFP5/eyfnfbQCDV3OLRIK3mIVyXuZlw==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0"
+ "@babel/plugin-syntax-json-strings": "^7.7.4"
}
},
"@babel/plugin-proposal-object-rest-spread": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.0.tgz",
- "integrity": "sha512-KuSFLqkCkdXHJxhcfxWNxt8uVogH/bXXoKLUF/q7MehfHo0CRNjWLedB3iYjKssJ+D1gEmUB8h/E3g4/hFbQLg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz",
+ "integrity": "sha512-rnpnZR3/iWKmiQyJ3LKJpSwLDcX/nSXhdLk4Aq/tXOApIvyu7qoabrige0ylsAJffaUC51WiBu209Q0U+86OWQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0"
+ "@babel/plugin-syntax-object-rest-spread": "^7.7.4"
}
},
"@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.7.4.tgz",
+ "integrity": "sha512-DyM7U2bnsQerCQ+sejcTNZh8KQEUuC3ufzdnVnSiUv/qoGJp2Z3hanKL18KDhsBT5Wj6a7CMT5mdyCNJsEaA9w==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0"
+ "@babel/plugin-syntax-optional-catch-binding": "^7.7.4"
}
},
"@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz",
- "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz",
+ "integrity": "sha512-cHgqHgYvffluZk85dJ02vloErm3Y6xtH+2noOBOJ2kXOJH3aVCDnj5eR/lVNlTnYu4hndAPJD3rTFjW3qee0PA==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0",
- "regexpu-core": "^4.2.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-syntax-async-generators": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz",
- "integrity": "sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.7.4.tgz",
+ "integrity": "sha512-Li4+EjSpBgxcsmeEF8IFcfV/+yJGxHXDirDkEoyFjumuwbmfCVHUt0HuowD/iGM7OhIRyXJH9YXxqiH6N815+g==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-dynamic-import": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.7.4.tgz",
+ "integrity": "sha512-jHQW0vbRGvwQNgyVxwDh4yuXu4bH1f5/EICJLAhl1SblLs2CDhrsmCk+v5XLdE9wxtAFRyxx+P//Iw+a5L/tTg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-syntax-json-strings": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz",
- "integrity": "sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz",
+ "integrity": "sha512-QpGupahTQW1mHRXddMG5srgpHWqRLwJnJZKXTigB9RPFCCGbDGCgBeM/iC82ICXp414WeYx/tD54w7M2qRqTMg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-syntax-object-rest-spread": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz",
- "integrity": "sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz",
+ "integrity": "sha512-mObR+r+KZq0XhRVS2BrBKBpr5jqrqzlPvS9C9vuOf5ilSwzloAl7RPWLrgKdWS6IreaVrjHxTjtyqFiOisaCwg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz",
- "integrity": "sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.7.4.tgz",
+ "integrity": "sha512-4ZSuzWgFxqHRE31Glu+fEr/MirNZOMYmD/0BhBWyLyOOQz/gTAl7QmWm2hX1QxEIXsr2vkdlwxIzTyiYRC4xcQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-syntax-top-level-await": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz",
+ "integrity": "sha512-wdsOw0MvkL1UIgiQ/IFr3ETcfv1xb8RMM0H9wbiDyLaJFyiDg5oZvDLCXosIXmFeIlweML5iOBXAkqddkYNizg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-arrow-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz",
- "integrity": "sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.7.4.tgz",
+ "integrity": "sha512-zUXy3e8jBNPiffmqkHRNDdZM2r8DWhCB7HhcoyZjiK1TxYEluLHAvQuYnTT+ARqRpabWqy/NHkO6e3MsYB5YfA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-async-to-generator": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz",
- "integrity": "sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.4.tgz",
+ "integrity": "sha512-zpUTZphp5nHokuy8yLlyafxCJ0rSlFoSHypTUWgpdwoDXWQcseaect7cJ8Ppk6nunOM6+5rPMkod4OYKPR5MUg==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.0.0",
+ "@babel/helper-module-imports": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-remap-async-to-generator": "^7.1.0"
+ "@babel/helper-remap-async-to-generator": "^7.7.4"
}
},
"@babel/plugin-transform-block-scoped-functions": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz",
- "integrity": "sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz",
+ "integrity": "sha512-kqtQzwtKcpPclHYjLK//3lH8OFsCDuDJBaFhVwf8kqdnF6MN4l618UDlcA7TfRs3FayrHj+svYnSX8MC9zmUyQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-block-scoping": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz",
- "integrity": "sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz",
+ "integrity": "sha512-2VBe9u0G+fDt9B5OV5DQH4KBf5DoiNkwFKOz0TCvBWvdAN2rOykCTkrL+jTLxfCAm76l9Qo5OqL7HBOx2dWggg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "lodash": "^4.17.10"
+ "lodash": "^4.17.13"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
"dev": true
}
}
},
"@babel/plugin-transform-classes": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz",
- "integrity": "sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz",
+ "integrity": "sha512-sK1mjWat7K+buWRuImEzjNf68qrKcrddtpQo3swi9j7dUcG6y6R6+Di039QN2bD1dykeswlagupEmpOatFHHUg==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
- "@babel/helper-define-map": "^7.1.0",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-optimise-call-expression": "^7.0.0",
+ "@babel/helper-annotate-as-pure": "^7.7.4",
+ "@babel/helper-define-map": "^7.7.4",
+ "@babel/helper-function-name": "^7.7.4",
+ "@babel/helper-optimise-call-expression": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.0.0",
+ "@babel/helper-replace-supers": "^7.7.4",
+ "@babel/helper-split-export-declaration": "^7.7.4",
"globals": "^11.1.0"
}
},
"@babel/plugin-transform-computed-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz",
- "integrity": "sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz",
+ "integrity": "sha512-bSNsOsZnlpLLyQew35rl4Fma3yKWqK3ImWMSC/Nc+6nGjC9s5NFWAer1YQ899/6s9HxO2zQC1WoFNfkOqRkqRQ==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-destructuring": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.2.0.tgz",
- "integrity": "sha512-coVO2Ayv7g0qdDbrNiadE4bU7lvCd9H539m2gMknyVjjMdwF/iCOM7R+E8PkntoqLkltO0rk+3axhpp/0v68VQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz",
+ "integrity": "sha512-4jFMXI1Cu2aXbcXXl8Lr6YubCn6Oc7k9lLsu8v61TZh+1jny2BWmdtvY9zSUlLdGUvcy9DMAWyZEOqjsbeg/wA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-dotall-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz",
- "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.4.tgz",
+ "integrity": "sha512-mk0cH1zyMa/XHeb6LOTXTbG7uIJ8Rrjlzu91pUx/KS3JpcgaTDwMS8kM+ar8SLOvlL2Lofi4CGBAjCo3a2x+lw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0",
- "regexpu-core": "^4.1.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-duplicate-keys": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz",
- "integrity": "sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.7.4.tgz",
+ "integrity": "sha512-g1y4/G6xGWMD85Tlft5XedGaZBCIVN+/P0bs6eabmcPP9egFleMAo65OOjlhcz1njpwagyY3t0nsQC9oTFegJA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-exponentiation-operator": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz",
- "integrity": "sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.7.4.tgz",
+ "integrity": "sha512-MCqiLfCKm6KEA1dglf6Uqq1ElDIZwFuzz1WH5mTf8k2uQSxEJMbOIEh7IZv7uichr7PMfi5YVSrr1vz+ipp7AQ==",
"dev": true,
"requires": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.1.0",
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-for-of": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz",
- "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz",
+ "integrity": "sha512-zZ1fD1B8keYtEcKF+M1TROfeHTKnijcVQm0yO/Yu1f7qoDoxEIc/+GX6Go430Bg84eM/xwPFp0+h4EbZg7epAA==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-function-name": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz",
- "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz",
+ "integrity": "sha512-E/x09TvjHNhsULs2IusN+aJNRV5zKwxu1cpirZyRPw+FyyIKEHPXTsadj48bVpc1R5Qq1B5ZkzumuFLytnbT6g==",
"dev": true,
"requires": {
- "@babel/helper-function-name": "^7.1.0",
+ "@babel/helper-function-name": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz",
- "integrity": "sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz",
+ "integrity": "sha512-X2MSV7LfJFm4aZfxd0yLVFrEXAgPqYoDG53Br/tCKiKYfX0MjVjQeWPIhPHHsCqzwQANq+FLN786fF5rgLS+gw==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
- "@babel/plugin-transform-modules-amd": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz",
- "integrity": "sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw==",
+ "@babel/plugin-transform-member-expression-literals": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz",
+ "integrity": "sha512-9VMwMO7i69LHTesL0RdGy93JU6a+qOPuvB4F4d0kR0zyVjJRVJRaoaGjhtki6SzQUu8yen/vxPKN6CWnCUw6bA==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.1.0",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
+ "@babel/plugin-transform-modules-amd": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz",
+ "integrity": "sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-module-transforms": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "babel-plugin-dynamic-import-node": "^2.3.0"
+ }
+ },
"@babel/plugin-transform-modules-commonjs": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz",
- "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz",
+ "integrity": "sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.1.0",
+ "@babel/helper-module-transforms": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-simple-access": "^7.1.0"
+ "@babel/helper-simple-access": "^7.7.4",
+ "babel-plugin-dynamic-import-node": "^2.3.0"
}
},
"@babel/plugin-transform-modules-systemjs": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz",
- "integrity": "sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.4.tgz",
+ "integrity": "sha512-y2c96hmcsUi6LrMqvmNDPBBiGCiQu0aYqpHatVVu6kD4mFEXKjyNxd/drc18XXAf9dv7UXjrZwBVmTTGaGP8iw==",
"dev": true,
"requires": {
- "@babel/helper-hoist-variables": "^7.0.0",
- "@babel/helper-plugin-utils": "^7.0.0"
+ "@babel/helper-hoist-variables": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "babel-plugin-dynamic-import-node": "^2.3.0"
}
},
"@babel/plugin-transform-modules-umd": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz",
- "integrity": "sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.7.4.tgz",
+ "integrity": "sha512-u2B8TIi0qZI4j8q4C51ktfO7E3cQ0qnaXFI1/OXITordD40tt17g/sXqgNNCcMTcBFKrUPcGDx+TBJuZxLx7tw==",
"dev": true,
"requires": {
- "@babel/helper-module-transforms": "^7.1.0",
+ "@babel/helper-module-transforms": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz",
- "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.4.tgz",
+ "integrity": "sha512-jBUkiqLKvUWpv9GLSuHUFYdmHg0ujC1JEYoZUfeOOfNydZXp1sXObgyPatpcwjWgsdBGsagWW0cdJpX/DO2jMw==",
"dev": true,
"requires": {
- "regexp-tree": "^0.1.0"
+ "@babel/helper-create-regexp-features-plugin": "^7.7.4"
}
},
"@babel/plugin-transform-new-target": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz",
- "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.7.4.tgz",
+ "integrity": "sha512-CnPRiNtOG1vRodnsyGX37bHQleHE14B9dnnlgSeEs3ek3fHN1A1SScglTCg1sfbe7sRQ2BUcpgpTpWSfMKz3gg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-object-super": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz",
- "integrity": "sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz",
+ "integrity": "sha512-ho+dAEhC2aRnff2JCA0SAK7V2R62zJd/7dmtoe7MHcso4C2mS+vZjn1Pb1pCVZvJs1mgsvv5+7sT+m3Bysb6eg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-replace-supers": "^7.1.0"
+ "@babel/helper-replace-supers": "^7.7.4"
}
},
"@babel/plugin-transform-parameters": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz",
- "integrity": "sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz",
+ "integrity": "sha512-VJwhVePWPa0DqE9vcfptaJSzNDKrWU/4FbYCjZERtmqEs05g3UMXnYMZoXja7JAJ7Y7sPZipwm/pGApZt7wHlw==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-call-delegate": "^7.7.4",
+ "@babel/helper-get-function-arity": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0"
+ }
+ },
+ "@babel/plugin-transform-property-literals": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz",
+ "integrity": "sha512-MatJhlC4iHsIskWYyawl53KuHrt+kALSADLQQ/HkhTjX954fkxIEh4q5slL4oRAnsm/eDoZ4q0CIZpcqBuxhJQ==",
"dev": true,
"requires": {
- "@babel/helper-call-delegate": "^7.1.0",
- "@babel/helper-get-function-arity": "^7.0.0",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-regenerator": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz",
- "integrity": "sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz",
+ "integrity": "sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw==",
+ "dev": true,
+ "requires": {
+ "regenerator-transform": "^0.14.0"
+ }
+ },
+ "@babel/plugin-transform-reserved-words": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.7.4.tgz",
+ "integrity": "sha512-OrPiUB5s5XvkCO1lS7D8ZtHcswIC57j62acAnJZKqGGnHP+TIc/ljQSrgdX/QyOTdEK5COAhuc820Hi1q2UgLQ==",
"dev": true,
"requires": {
- "regenerator-transform": "^0.13.3"
+ "@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-shorthand-properties": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz",
- "integrity": "sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz",
+ "integrity": "sha512-q+suddWRfIcnyG5YiDP58sT65AJDZSUhXQDZE3r04AuqD6d/XLaQPPXSBzP2zGerkgBivqtQm9XKGLuHqBID6Q==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-spread": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz",
- "integrity": "sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz",
+ "integrity": "sha512-8OSs0FLe5/80cndziPlg4R0K6HcWSM0zyNhHhLsmw/Nc5MaA49cAsnoJ/t/YZf8qkG7fD+UjTRaApVDB526d7Q==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-sticky-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz",
- "integrity": "sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.7.4.tgz",
+ "integrity": "sha512-Ls2NASyL6qtVe1H1hXts9yuEeONV2TJZmplLONkMPUG158CtmnrzW5Q5teibM5UVOFjG0D3IC5mzXR6pPpUY7A==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -653,347 +779,253 @@
}
},
"@babel/plugin-transform-template-literals": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz",
- "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz",
+ "integrity": "sha512-sA+KxLwF3QwGj5abMHkHgshp9+rRz+oY9uoRil4CyLtgEuE/88dpkeWgNk5qKVsJE9iSfly3nvHapdRiIS2wnQ==",
"dev": true,
"requires": {
- "@babel/helper-annotate-as-pure": "^7.0.0",
+ "@babel/helper-annotate-as-pure": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-typeof-symbol": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz",
- "integrity": "sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.7.4.tgz",
+ "integrity": "sha512-KQPUQ/7mqe2m0B8VecdyaW5XcQYaePyl9R7IsKd+irzj6jvbhoGnRE+M0aNkyAzI07VfUQ9266L5xMARitV3wg==",
"dev": true,
"requires": {
"@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/plugin-transform-unicode-regex": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz",
- "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz",
+ "integrity": "sha512-N77UUIV+WCvE+5yHw+oks3m18/umd7y392Zv7mYTpFqHtkpcc+QUz+gLJNTWVlWROIWeLqY0f3OjZxV5TcXnRw==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/helper-regex": "^7.0.0",
- "regexpu-core": "^4.1.3"
+ "@babel/helper-create-regexp-features-plugin": "^7.7.4",
+ "@babel/helper-plugin-utils": "^7.0.0"
}
},
"@babel/preset-env": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.0.tgz",
- "integrity": "sha512-708gNL1KY2nSM683LYvL4iRBwa1+gkvtx7L53FNf2+LSsJJswf3T4Mn82C1ias/0cZUH+0LbwIYXUFdKM3sOsg==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.7.4.tgz",
+ "integrity": "sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==",
"dev": true,
"requires": {
- "@babel/helper-module-imports": "^7.0.0",
+ "@babel/helper-module-imports": "^7.7.4",
"@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
- "@babel/plugin-proposal-json-strings": "^7.2.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.3.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
- "@babel/plugin-syntax-async-generators": "^7.2.0",
- "@babel/plugin-syntax-json-strings": "^7.2.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
- "@babel/plugin-transform-arrow-functions": "^7.2.0",
- "@babel/plugin-transform-async-to-generator": "^7.2.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
- "@babel/plugin-transform-block-scoping": "^7.2.0",
- "@babel/plugin-transform-classes": "^7.2.0",
- "@babel/plugin-transform-computed-properties": "^7.2.0",
- "@babel/plugin-transform-destructuring": "^7.2.0",
- "@babel/plugin-transform-dotall-regex": "^7.2.0",
- "@babel/plugin-transform-duplicate-keys": "^7.2.0",
- "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
- "@babel/plugin-transform-for-of": "^7.2.0",
- "@babel/plugin-transform-function-name": "^7.2.0",
- "@babel/plugin-transform-literals": "^7.2.0",
- "@babel/plugin-transform-modules-amd": "^7.2.0",
- "@babel/plugin-transform-modules-commonjs": "^7.2.0",
- "@babel/plugin-transform-modules-systemjs": "^7.2.0",
- "@babel/plugin-transform-modules-umd": "^7.2.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0",
- "@babel/plugin-transform-new-target": "^7.0.0",
- "@babel/plugin-transform-object-super": "^7.2.0",
- "@babel/plugin-transform-parameters": "^7.2.0",
- "@babel/plugin-transform-regenerator": "^7.0.0",
- "@babel/plugin-transform-shorthand-properties": "^7.2.0",
- "@babel/plugin-transform-spread": "^7.2.0",
- "@babel/plugin-transform-sticky-regex": "^7.2.0",
- "@babel/plugin-transform-template-literals": "^7.2.0",
- "@babel/plugin-transform-typeof-symbol": "^7.2.0",
- "@babel/plugin-transform-unicode-regex": "^7.2.0",
- "browserslist": "^4.3.4",
+ "@babel/plugin-proposal-async-generator-functions": "^7.7.4",
+ "@babel/plugin-proposal-dynamic-import": "^7.7.4",
+ "@babel/plugin-proposal-json-strings": "^7.7.4",
+ "@babel/plugin-proposal-object-rest-spread": "^7.7.4",
+ "@babel/plugin-proposal-optional-catch-binding": "^7.7.4",
+ "@babel/plugin-proposal-unicode-property-regex": "^7.7.4",
+ "@babel/plugin-syntax-async-generators": "^7.7.4",
+ "@babel/plugin-syntax-dynamic-import": "^7.7.4",
+ "@babel/plugin-syntax-json-strings": "^7.7.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.7.4",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.7.4",
+ "@babel/plugin-syntax-top-level-await": "^7.7.4",
+ "@babel/plugin-transform-arrow-functions": "^7.7.4",
+ "@babel/plugin-transform-async-to-generator": "^7.7.4",
+ "@babel/plugin-transform-block-scoped-functions": "^7.7.4",
+ "@babel/plugin-transform-block-scoping": "^7.7.4",
+ "@babel/plugin-transform-classes": "^7.7.4",
+ "@babel/plugin-transform-computed-properties": "^7.7.4",
+ "@babel/plugin-transform-destructuring": "^7.7.4",
+ "@babel/plugin-transform-dotall-regex": "^7.7.4",
+ "@babel/plugin-transform-duplicate-keys": "^7.7.4",
+ "@babel/plugin-transform-exponentiation-operator": "^7.7.4",
+ "@babel/plugin-transform-for-of": "^7.7.4",
+ "@babel/plugin-transform-function-name": "^7.7.4",
+ "@babel/plugin-transform-literals": "^7.7.4",
+ "@babel/plugin-transform-member-expression-literals": "^7.7.4",
+ "@babel/plugin-transform-modules-amd": "^7.7.4",
+ "@babel/plugin-transform-modules-commonjs": "^7.7.4",
+ "@babel/plugin-transform-modules-systemjs": "^7.7.4",
+ "@babel/plugin-transform-modules-umd": "^7.7.4",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.7.4",
+ "@babel/plugin-transform-new-target": "^7.7.4",
+ "@babel/plugin-transform-object-super": "^7.7.4",
+ "@babel/plugin-transform-parameters": "^7.7.4",
+ "@babel/plugin-transform-property-literals": "^7.7.4",
+ "@babel/plugin-transform-regenerator": "^7.7.4",
+ "@babel/plugin-transform-reserved-words": "^7.7.4",
+ "@babel/plugin-transform-shorthand-properties": "^7.7.4",
+ "@babel/plugin-transform-spread": "^7.7.4",
+ "@babel/plugin-transform-sticky-regex": "^7.7.4",
+ "@babel/plugin-transform-template-literals": "^7.7.4",
+ "@babel/plugin-transform-typeof-symbol": "^7.7.4",
+ "@babel/plugin-transform-unicode-regex": "^7.7.4",
+ "@babel/types": "^7.7.4",
+ "browserslist": "^4.6.0",
+ "core-js-compat": "^3.1.1",
"invariant": "^2.2.2",
"js-levenshtein": "^1.1.3",
- "semver": "^5.3.0"
+ "semver": "^5.5.0"
}
},
"@babel/template": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
- "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.7.4.tgz",
+ "integrity": "sha512-qUzihgVPguAzXCK7WXw8pqs6cEwi54s3E+HrejlkuWO6ivMKx9hZl3Y2fSXp9i5HgyWmj7RKP+ulaYnKM4yYxw==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.0.0",
- "@babel/parser": "^7.2.2",
- "@babel/types": "^7.2.2"
+ "@babel/parser": "^7.7.4",
+ "@babel/types": "^7.7.4"
}
},
"@babel/traverse": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz",
- "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.7.4.tgz",
+ "integrity": "sha512-P1L58hQyupn8+ezVA2z5KBm4/Zr4lCC8dwKCMYzsa5jFMDMQAzaBNy9W5VjB+KAmBjb40U7a/H6ao+Xo+9saIw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.0.0",
- "@babel/generator": "^7.2.2",
- "@babel/helper-function-name": "^7.1.0",
- "@babel/helper-split-export-declaration": "^7.0.0",
- "@babel/parser": "^7.2.3",
- "@babel/types": "^7.2.2",
+ "@babel/code-frame": "^7.5.5",
+ "@babel/generator": "^7.7.4",
+ "@babel/helper-function-name": "^7.7.4",
+ "@babel/helper-split-export-declaration": "^7.7.4",
+ "@babel/parser": "^7.7.4",
+ "@babel/types": "^7.7.4",
"debug": "^4.1.0",
"globals": "^11.1.0",
- "lodash": "^4.17.10"
+ "lodash": "^4.17.13"
},
"dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ },
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
}
}
},
"@babel/types": {
- "version": "7.3.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.0.tgz",
- "integrity": "sha512-QkFPw68QqWU1/RVPyBe8SO7lXbPfjtqAxRYQKpFpaB8yMq7X2qAqfwK5LKoQufEkSmO5NQ70O6Kc3Afk03RwXw==",
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.7.4.tgz",
+ "integrity": "sha512-cz5Ji23KCi4T+YIE/BolWosrJuSmoZeN1EFnRtBwF+KKLi8GG/Z2c2hOJJeCXPk4mwk4QFvTmwIodJowXgttRA==",
"dev": true,
"requires": {
"esutils": "^2.0.2",
- "lodash": "^4.17.10",
+ "lodash": "^4.17.13",
"to-fast-properties": "^2.0.0"
},
"dependencies": {
"lodash": {
- "version": "4.17.11",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
- "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
+ "version": "4.17.15",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
+ "dev": true
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
}
}
},
- "acorn": {
- "version": "5.7.3",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz",
- "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==",
- "dev": true
- },
"aes-js": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.1.2.tgz",
"integrity": "sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ=="
},
- "ansi-colors": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
- "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
- "dev": true,
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "axios": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
+ "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
"requires": {
- "ansi-wrap": "^0.1.0"
+ "follow-redirects": "1.5.10",
+ "is-buffer": "^2.0.2"
}
},
- "ansi-gray": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
- "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "babel-loader": {
+ "version": "8.0.6",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
+ "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
"dev": true,
"requires": {
- "ansi-wrap": "0.1.0"
+ "find-cache-dir": "^2.0.0",
+ "loader-utils": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "pify": "^4.0.1"
}
},
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "babel-plugin-dynamic-import-node": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz",
+ "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==",
"dev": true,
"requires": {
- "color-convert": "^1.9.0"
+ "object.assign": "^4.1.0"
}
},
- "ansi-wrap": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
- "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
- "dev": true
- },
- "append-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz",
- "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=",
- "dev": true,
+ "babel-polyfill": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz",
+ "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=",
"requires": {
- "buffer-equal": "^1.0.0"
- },
- "dependencies": {
- "buffer-equal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz",
- "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=",
- "dev": true
- }
+ "babel-runtime": "^6.26.0",
+ "core-js": "^2.5.0",
+ "regenerator-runtime": "^0.10.5"
}
},
- "archy": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
- "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
- "dev": true
- },
- "arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
- "dev": true
- },
- "arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true
- },
- "arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
- "dev": true
- },
- "array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
- "dev": true
- },
- "array-each": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz",
- "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=",
- "dev": true
- },
- "array-slice": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
- "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
- "dev": true
- },
- "array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
- "dev": true
- },
- "array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
- "dev": true
- },
- "assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
- "dev": true
- },
- "atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true
- },
- "balanced-match": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
- "dev": true
- },
- "base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
+ "babel-runtime": {
+ "version": "6.26.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
"requires": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.11.0"
},
"dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
+ "regenerator-runtime": {
+ "version": "0.11.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
}
}
},
"base-x": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.5.tgz",
- "integrity": "sha512-C3picSgzPSLE+jW3tcBzJoGwitOtazb5B+5YmAxZm2ybmTi9LNgAtDO/jjVEBZwHoXmDBZ9m/IELj3elJVRBcA==",
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.7.tgz",
+ "integrity": "sha512-zAKJGuQPihXW22fkrfOclUUZXM2g92z5GzlSMHxhO6r6Qj+Nm0ccaGNBzDZojzwOMkpjAv4J0fOv1U4go+a4iw==",
"requires": {
"safe-buffer": "^5.0.1"
}
},
- "beeper": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
- "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
"dev": true
},
"bn.js": {
@@ -1001,71 +1033,20 @@
"resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
"integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
},
- "brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "requires": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "requires": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "brfs": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
- "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
- "dev": true,
- "requires": {
- "quote-stream": "^1.0.1",
- "resolve": "^1.1.5",
- "static-module": "^2.2.0",
- "through2": "^2.0.0"
- }
- },
"brorand": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
"integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
},
"browserslist": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.1.tgz",
- "integrity": "sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==",
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.0.tgz",
+ "integrity": "sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30000929",
- "electron-to-chromium": "^1.3.103",
- "node-releases": "^1.1.3"
+ "caniuse-lite": "^1.0.30001012",
+ "electron-to-chromium": "^1.3.317",
+ "node-releases": "^1.1.41"
}
},
"bs58": {
@@ -1081,447 +1062,119 @@
"resolved": "https://registry.npmjs.org/buffer-compare/-/buffer-compare-1.1.1.tgz",
"integrity": "sha1-W+e+hTr4kZjR9N3AkNHWakiu9ZY="
},
- "buffer-equal": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=",
- "dev": true
- },
- "buffer-from": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
- "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
+ "caniuse-lite": {
+ "version": "1.0.30001015",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz",
+ "integrity": "sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==",
"dev": true
},
- "cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
+ "color-name": "1.1.3"
}
},
- "camelcase": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
- "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
- "dev": true
- },
- "caniuse-lite": {
- "version": "1.0.30000929",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000929.tgz",
- "integrity": "sha512-n2w1gPQSsYyorSVYqPMqbSaz1w7o9ZC8VhOEGI9T5MfGDzp7sbopQxG6GaQmYsaq13Xfx/mkxJUWC1Dz3oZfzw==",
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
- "chai": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/chai/-/chai-1.10.0.tgz",
- "integrity": "sha1-5AMcyHZURhp1lD5aNatG6vOcHrk=",
- "dev": true,
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"requires": {
- "assertion-error": "1.0.0",
- "deep-eql": "0.1.3"
- },
- "dependencies": {
- "assertion-error": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz",
- "integrity": "sha1-x/hUOP3UZrx8oWq5DIFRN5el0js=",
- "dev": true
- }
+ "delayed-stream": "~1.0.0"
}
},
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "convert-source-map": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
"dev": true,
"requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
+ "safe-buffer": "~5.1.1"
}
},
- "class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
+ },
+ "core-js": {
+ "version": "2.6.10",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.10.tgz",
+ "integrity": "sha512-I39t74+4t+zau64EN1fE5v2W31Adtc/REhzWN+gWRRXg6WH5qAsZm62DHpQ1+Yhe4047T55jvzz7MUqF/dBBlA=="
+ },
+ "core-js-compat": {
+ "version": "3.4.7",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.4.7.tgz",
+ "integrity": "sha512-57+mgz/P/xsGdjwQYkwtBZR3LuISaxD1dEwVDtbk8xJMqAmwqaxLOvnNT7kdJ7jYE/NjNptyzXi+IQFMi/2fCw==",
"dev": true,
"requires": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
+ "browserslist": "^4.8.0",
+ "semver": "^6.3.0"
},
"dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
}
}
},
- "cli-table3": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz",
- "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==",
- "dev": true,
+ "crypto-js": {
+ "version": "3.1.9-1",
+ "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
+ "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"requires": {
- "colors": "^1.1.2",
- "object-assign": "^4.1.0",
- "string-width": "^2.1.1"
+ "ms": "2.0.0"
}
},
- "cliui": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
- "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
+ "decimal": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/decimal/-/decimal-0.0.2.tgz",
+ "integrity": "sha1-GUPsUjaKD996NywsEM8fy8kbk+M="
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": {
- "string-width": "^2.1.1",
- "strip-ansi": "^4.0.0",
- "wrap-ansi": "^2.0.0"
+ "object-keys": "^1.0.12"
}
},
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
- "dev": true
- },
- "clone-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
- "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
- "dev": true
- },
- "clone-stats": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
- "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
- "dev": true
- },
- "cloneable-readable": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
- "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "process-nextick-args": "^2.0.0",
- "readable-stream": "^2.3.5"
- }
- },
- "code-point-at": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
- "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
- "dev": true
- },
- "collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
- "dev": true,
- "requires": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true
- },
- "color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true
- },
- "colors": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.3.tgz",
- "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==",
- "dev": true
- },
- "component-emitter": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
- "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
- "dev": true
- },
- "concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
- "dev": true
- },
- "concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "dev": true,
- "requires": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "concat-with-sourcemaps": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
- "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
- "dev": true,
- "requires": {
- "source-map": "^0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true
- }
- }
- },
- "convert-source-map": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
- "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.1"
- }
- },
- "copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
- "dev": true
- },
- "core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
- "dev": true
- },
- "cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
- "dev": true,
- "requires": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "crypto-js": {
- "version": "3.1.9-1",
- "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz",
- "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg="
- },
- "dateformat": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
- "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
- "dev": true
- },
- "debug": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
- "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
- "dev": true,
- "requires": {
- "ms": "^2.1.1"
- }
- },
- "decamelize": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
- "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
- "dev": true
- },
- "decimal": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/decimal/-/decimal-0.0.2.tgz",
- "integrity": "sha1-GUPsUjaKD996NywsEM8fy8kbk+M="
- },
- "decode-uri-component": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
- "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
- "dev": true
- },
- "deep-eql": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
- "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
- "dev": true,
- "requires": {
- "type-detect": "0.1.1"
- },
- "dependencies": {
- "type-detect": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
- "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
- "dev": true
- }
- }
- },
- "deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true
- },
- "defaults": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
- "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
- "dev": true,
- "requires": {
- "clone": "^1.0.2"
- }
- },
- "define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "requires": {
- "object-keys": "^1.0.12"
- }
- },
- "define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "dependencies": {
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "deprecated": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz",
- "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=",
- "dev": true
- },
- "detect-file": {
+ "delayed-stream": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
- "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=",
- "dev": true
- },
- "duplexer": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
- "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
- "dev": true
- },
- "duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.2"
- }
- },
- "duplexify": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz",
- "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.0",
- "stream-shift": "^1.0.0"
- },
- "dependencies": {
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- }
- }
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
},
"electron-to-chromium": {
- "version": "1.3.103",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.103.tgz",
- "integrity": "sha512-tObPqGmY9X8MUM8i3MEimYmbnLLf05/QV5gPlkR8MQ3Uj8G8B2govE1U4cQcBYtv3ymck9Y8cIOu4waoiykMZQ==",
+ "version": "1.3.322",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz",
+ "integrity": "sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA==",
"dev": true
},
"elliptic": {
@@ -1532,3559 +1185,586 @@
"bn.js": "^4.4.0",
"brorand": "^1.0.1",
"hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.0"
- }
- },
- "end-of-stream": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz",
- "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=",
- "dev": true,
- "requires": {
- "once": "~1.3.0"
- },
- "dependencies": {
- "once": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz",
- "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- }
- }
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true
- },
- "escodegen": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
- "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
- "dev": true,
- "requires": {
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1",
- "source-map": "~0.6.1"
- },
- "dependencies": {
- "source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "optional": true
- }
- }
- },
- "esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
- "dev": true
- },
- "estraverse": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
- "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
- "dev": true
- },
- "esutils": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
- "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
- "dev": true
- },
- "event-stream": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz",
- "integrity": "sha512-qACXdu/9VHPBzcyhdOWR5/IahhGMf0roTeZJfzz077GwylcDd90yOHLouhmv7GJ5XzPi6ekaQWd8AvPP2nOvpA==",
- "dev": true,
- "requires": {
- "duplexer": "^0.1.1",
- "from": "^0.1.7",
- "map-stream": "0.0.7",
- "pause-stream": "^0.0.11",
- "split": "^1.0.1",
- "stream-combiner": "^0.2.2",
- "through": "^2.3.8"
- },
- "dependencies": {
- "split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "dev": true,
- "requires": {
- "through": "2"
- }
- }
- }
- },
- "execa": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
- "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
- "dev": true,
- "requires": {
- "cross-spawn": "^5.0.1",
- "get-stream": "^3.0.0",
- "is-stream": "^1.1.0",
- "npm-run-path": "^2.0.0",
- "p-finally": "^1.0.0",
- "signal-exit": "^3.0.0",
- "strip-eof": "^1.0.0"
- }
- },
- "expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
- "dev": true,
- "requires": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
- },
- "expand-tilde": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
- "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
- "dev": true,
- "requires": {
- "homedir-polyfill": "^1.0.1"
- }
- },
- "extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
- "dev": true,
- "requires": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "requires": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
- }
- },
- "falafel": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
- "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
- "dev": true,
- "requires": {
- "acorn": "^5.0.0",
- "foreach": "^2.0.5",
- "isarray": "0.0.1",
- "object-keys": "^1.0.6"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- }
- }
- },
- "fancy-log": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz",
- "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==",
- "dev": true,
- "requires": {
- "ansi-gray": "^0.1.1",
- "color-support": "^1.1.3",
- "parse-node-version": "^1.0.0",
- "time-stamp": "^1.0.0"
- }
- },
- "fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true
- },
- "fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- }
- }
- },
- "find-index": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz",
- "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=",
- "dev": true
- },
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "requires": {
- "locate-path": "^2.0.0"
- }
- },
- "findup-sync": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
- "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=",
- "dev": true,
- "requires": {
- "detect-file": "^1.0.0",
- "is-glob": "^3.1.0",
- "micromatch": "^3.0.4",
- "resolve-dir": "^1.0.1"
- }
- },
- "fined": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz",
- "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "is-plain-object": "^2.0.3",
- "object.defaults": "^1.1.0",
- "object.pick": "^1.2.0",
- "parse-filepath": "^1.0.1"
- }
- },
- "first-chunk-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
- "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
- "dev": true
- },
- "flagged-respawn": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz",
- "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==",
- "dev": true
- },
- "flush-write-stream": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz",
- "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==",
- "dev": true,
- "requires": {
- "inherits": "^2.0.1",
- "readable-stream": "^2.0.4"
- }
- },
- "for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
- "dev": true
- },
- "for-own": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
- "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
- "dev": true,
- "requires": {
- "for-in": "^1.0.1"
- }
- },
- "foreach": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
- "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
- "dev": true
- },
- "fork-stream": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
- "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=",
- "dev": true
- },
- "formatio": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
- "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
- "dev": true,
- "requires": {
- "samsam": "~1.1"
- }
- },
- "fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
- "dev": true,
- "requires": {
- "map-cache": "^0.2.2"
- }
- },
- "from": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
- "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
- "dev": true
- },
- "fs-mkdirp-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz",
- "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.11",
- "through2": "^2.0.3"
- },
- "dependencies": {
- "graceful-fs": {
- "version": "4.1.15",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
- "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
- "dev": true
- }
- }
- },
- "fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true
- },
- "function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "gaze": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz",
- "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=",
- "dev": true,
- "requires": {
- "globule": "~0.1.0"
- }
- },
- "get-caller-file": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
- "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
- "dev": true
- },
- "get-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
- "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
- "dev": true
- },
- "get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
- "dev": true
- },
- "glob": {
- "version": "7.1.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
- "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
- "dev": true,
- "requires": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- }
- },
- "glob-stream": {
- "version": "3.1.18",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz",
- "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=",
- "dev": true,
- "requires": {
- "glob": "^4.3.1",
- "glob2base": "^0.0.12",
- "minimatch": "^2.0.1",
- "ordered-read-streams": "^0.1.0",
- "through2": "^0.6.1",
- "unique-stream": "^1.0.0"
- },
- "dependencies": {
- "glob": {
- "version": "4.5.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz",
- "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=",
- "dev": true,
- "requires": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^2.0.1",
- "once": "^1.3.0"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "minimatch": {
- "version": "2.0.10",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz",
- "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.0.0"
- }
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": ">=1.0.33-1 <1.1.0-0",
- "xtend": ">=4.0.0 <4.1.0-0"
- }
- }
- }
- },
- "glob-watcher": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz",
- "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=",
- "dev": true,
- "requires": {
- "gaze": "^0.5.1"
- }
- },
- "glob2base": {
- "version": "0.0.12",
- "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz",
- "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=",
- "dev": true,
- "requires": {
- "find-index": "^0.1.1"
- }
- },
- "global-modules": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
- "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
- "dev": true,
- "requires": {
- "global-prefix": "^1.0.1",
- "is-windows": "^1.0.1",
- "resolve-dir": "^1.0.0"
- }
- },
- "global-prefix": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
- "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
- "dev": true,
- "requires": {
- "expand-tilde": "^2.0.2",
- "homedir-polyfill": "^1.0.1",
- "ini": "^1.3.4",
- "is-windows": "^1.0.1",
- "which": "^1.2.14"
- }
- },
- "globals": {
- "version": "11.10.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz",
- "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==",
- "dev": true
- },
- "globule": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz",
- "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=",
- "dev": true,
- "requires": {
- "glob": "~3.1.21",
- "lodash": "~1.0.1",
- "minimatch": "~0.2.11"
- },
- "dependencies": {
- "glob": {
- "version": "3.1.21",
- "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz",
- "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=",
- "dev": true,
- "requires": {
- "graceful-fs": "~1.2.0",
- "inherits": "1",
- "minimatch": "~0.2.11"
- }
- },
- "graceful-fs": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
- "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=",
- "dev": true
- },
- "inherits": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
- "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=",
- "dev": true
- },
- "lodash": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz",
- "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=",
- "dev": true
- },
- "lru-cache": {
- "version": "2.7.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz",
- "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=",
- "dev": true
- },
- "minimatch": {
- "version": "0.2.14",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz",
- "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=",
- "dev": true,
- "requires": {
- "lru-cache": "2",
- "sigmund": "~1.0.0"
- }
- }
- }
- },
- "glogg": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz",
- "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==",
- "dev": true,
- "requires": {
- "sparkles": "^1.0.0"
- }
- },
- "graceful-fs": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
- "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
- "dev": true,
- "requires": {
- "natives": "^1.1.0"
- }
- },
- "gulp": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz",
- "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=",
- "dev": true,
- "requires": {
- "archy": "^1.0.0",
- "chalk": "^1.0.0",
- "deprecated": "^0.0.1",
- "gulp-util": "^3.0.0",
- "interpret": "^1.0.0",
- "liftoff": "^2.1.0",
- "minimist": "^1.1.0",
- "orchestrator": "^0.3.0",
- "pretty-hrtime": "^1.0.0",
- "semver": "^4.1.0",
- "tildify": "^1.0.0",
- "v8flags": "^2.0.2",
- "vinyl-fs": "^0.3.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "semver": {
- "version": "4.3.6",
- "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz",
- "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "gulp-babel": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz",
- "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==",
- "dev": true,
- "requires": {
- "plugin-error": "^1.0.1",
- "replace-ext": "^1.0.0",
- "through2": "^2.0.0",
- "vinyl-sourcemaps-apply": "^0.2.0"
- },
- "dependencies": {
- "plugin-error": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
- "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
- "dev": true,
- "requires": {
- "ansi-colors": "^1.0.1",
- "arr-diff": "^4.0.0",
- "arr-union": "^3.1.0",
- "extend-shallow": "^3.0.2"
- }
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- }
- }
- },
- "gulp-concat": {
- "version": "2.6.1",
- "resolved": "https://registry.npmjs.org/gulp-concat/-/gulp-concat-2.6.1.tgz",
- "integrity": "sha1-Yz0WyV2IUEYorQJmVmPO5aR5M1M=",
- "dev": true,
- "requires": {
- "concat-with-sourcemaps": "^1.0.0",
- "through2": "^2.0.0",
- "vinyl": "^2.0.0"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- }
- }
- },
- "gulp-if": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz",
- "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=",
- "dev": true,
- "requires": {
- "gulp-match": "^1.0.3",
- "ternary-stream": "^2.0.1",
- "through2": "^2.0.1"
- }
- },
- "gulp-match": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz",
- "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=",
- "dev": true,
- "requires": {
- "minimatch": "^3.0.3"
- }
- },
- "gulp-useref": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/gulp-useref/-/gulp-useref-3.1.6.tgz",
- "integrity": "sha512-CMntxNp9LSk0F7itgOgqGqrO5pQL7eyQt6zhWi533VMFyMch8MNrSqjR7JyxEbPkts38s++W4ZmFVjx0NLMv8g==",
- "dev": true,
- "requires": {
- "event-stream": "^4.0.1",
- "extend": "^3.0.2",
- "glob": "^7.1.3",
- "gulp-concat": "^2.6.1",
- "gulp-if": "^2.0.2",
- "is-relative-url": "1.0.0",
- "plugin-error": "^1.0.1",
- "through2": "^2.0.3",
- "useref": "^1.4.1",
- "vinyl-fs": "^3.0.3"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
- "dev": true,
- "requires": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- }
- },
- "glob-stream": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
- "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "glob": "^7.1.1",
- "glob-parent": "^3.1.0",
- "is-negated-glob": "^1.0.0",
- "ordered-read-streams": "^1.0.0",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.1.5",
- "remove-trailing-separator": "^1.0.1",
- "to-absolute-glob": "^2.0.0",
- "unique-stream": "^2.0.2"
- }
- },
- "graceful-fs": {
- "version": "4.1.15",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
- "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
- "dev": true
- },
- "lazystream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
- "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.5"
- }
- },
- "ordered-read-streams": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
- "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "plugin-error": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz",
- "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==",
- "dev": true,
- "requires": {
- "ansi-colors": "^1.0.1",
- "arr-diff": "^4.0.0",
- "arr-union": "^3.1.0",
- "extend-shallow": "^3.0.2"
- }
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "unique-stream": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz",
- "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==",
- "dev": true,
- "requires": {
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "through2-filter": "^3.0.0"
- }
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- },
- "vinyl-fs": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz",
- "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==",
- "dev": true,
- "requires": {
- "fs-mkdirp-stream": "^1.0.0",
- "glob-stream": "^6.1.0",
- "graceful-fs": "^4.0.0",
- "is-valid-glob": "^1.0.0",
- "lazystream": "^1.0.0",
- "lead": "^1.0.0",
- "object.assign": "^4.0.4",
- "pumpify": "^1.3.5",
- "readable-stream": "^2.3.3",
- "remove-bom-buffer": "^3.0.0",
- "remove-bom-stream": "^1.2.0",
- "resolve-options": "^1.1.0",
- "through2": "^2.0.0",
- "to-through": "^2.0.0",
- "value-or-function": "^3.0.0",
- "vinyl": "^2.0.0",
- "vinyl-sourcemap": "^1.1.0"
- }
- }
- }
- },
- "gulp-util": {
- "version": "3.0.8",
- "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
- "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
- "dev": true,
- "requires": {
- "array-differ": "^1.0.0",
- "array-uniq": "^1.0.2",
- "beeper": "^1.0.0",
- "chalk": "^1.0.0",
- "dateformat": "^2.0.0",
- "fancy-log": "^1.1.0",
- "gulplog": "^1.0.0",
- "has-gulplog": "^0.1.0",
- "lodash._reescape": "^3.0.0",
- "lodash._reevaluate": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.template": "^3.0.0",
- "minimist": "^1.1.0",
- "multipipe": "^0.1.2",
- "object-assign": "^3.0.0",
- "replace-ext": "0.0.1",
- "through2": "^2.0.0",
- "vinyl": "^0.5.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
- "dev": true
- },
- "chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
- "dev": true,
- "requires": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- }
- },
- "object-assign": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz",
- "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=",
- "dev": true
- },
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
- },
- "supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
- "dev": true
- }
- }
- },
- "gulplog": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
- "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
- "dev": true,
- "requires": {
- "glogg": "^1.0.0"
- }
- },
- "has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "requires": {
- "function-bind": "^1.1.1"
- }
- },
- "has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- }
- }
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true
- },
- "has-gulplog": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz",
- "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=",
- "dev": true,
- "requires": {
- "sparkles": "^1.0.0"
- }
- },
- "has-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
- "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
- "dev": true
- },
- "has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
- "dev": true,
- "requires": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "requires": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
- }
- }
- },
- "hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
- "requires": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "homedir-polyfill": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz",
- "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=",
- "dev": true,
- "requires": {
- "parse-passwd": "^1.0.0"
- }
- },
- "inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "requires": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "inherits": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
- "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
- },
- "ini": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
- "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
- "dev": true
- },
- "interpret": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
- "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
- "dev": true
- },
- "invariant": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
- "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
- "dev": true,
- "requires": {
- "loose-envify": "^1.0.0"
- }
- },
- "invert-kv": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
- "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
- "dev": true
- },
- "is-absolute": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
- "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
- "dev": true,
- "requires": {
- "is-relative": "^1.0.0",
- "is-windows": "^1.0.1"
- }
- },
- "is-absolute-url": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-1.0.0.tgz",
- "integrity": "sha1-LX7w/QuyqI2sfpIlPGgIoKziS/s=",
- "dev": true
- },
- "is-accessor-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
- "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
- },
- "is-data-descriptor": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
- "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-descriptor": {
- "version": "0.1.6",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
- "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^0.1.6",
- "is-data-descriptor": "^0.1.4",
- "kind-of": "^5.0.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
- "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
- "dev": true
- }
- }
- },
- "is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
- "dev": true
- },
- "is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true
- },
- "is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
- "dev": true,
- "requires": {
- "is-extglob": "^2.1.0"
- }
- },
- "is-negated-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz",
- "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
- "dev": true
- },
- "is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
- "dev": true,
- "requires": {
- "kind-of": "^3.0.2"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "is-relative": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
- "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
- "dev": true,
- "requires": {
- "is-unc-path": "^1.0.0"
- }
- },
- "is-relative-url": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-relative-url/-/is-relative-url-1.0.0.tgz",
- "integrity": "sha1-h6nTXop4m0ngebTX1p1kYS6ODh8=",
- "dev": true,
- "requires": {
- "is-absolute-url": "^1.0.0"
- }
- },
- "is-stream": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
- "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
- "dev": true
- },
- "is-unc-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
- "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
- "dev": true,
- "requires": {
- "unc-path-regex": "^0.1.2"
- }
- },
- "is-utf8": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
- "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
- "dev": true
- },
- "is-valid-glob": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz",
- "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=",
- "dev": true
- },
- "is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
- "dev": true
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true
- },
- "isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true
- },
- "isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
- "dev": true
- },
- "js-levenshtein": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
- "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
- "dev": true
- },
- "js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true
- },
- "jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true
- },
- "json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true
- },
- "json5": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz",
- "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==",
- "dev": true,
- "requires": {
- "minimist": "^1.2.0"
- }
- },
- "kind-of": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
- "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
- "dev": true
- },
- "lcid": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
- "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
- "dev": true,
- "requires": {
- "invert-kv": "^1.0.0"
- }
- },
- "lead": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz",
- "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=",
- "dev": true,
- "requires": {
- "flush-write-stream": "^1.0.2"
- }
- },
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "liftoff": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz",
- "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=",
- "dev": true,
- "requires": {
- "extend": "^3.0.0",
- "findup-sync": "^2.0.0",
- "fined": "^1.0.1",
- "flagged-respawn": "^1.0.0",
- "is-plain-object": "^2.0.4",
- "object.map": "^1.0.0",
- "rechoir": "^0.6.2",
- "resolve": "^1.1.7"
- }
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- }
- },
- "lodash": {
- "version": "4.17.5",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
- "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
- },
- "lodash._basecopy": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
- "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
- "dev": true
- },
- "lodash._basetostring": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz",
- "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=",
- "dev": true
- },
- "lodash._basevalues": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz",
- "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=",
- "dev": true
- },
- "lodash._getnative": {
- "version": "3.9.1",
- "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
- "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
- "dev": true
- },
- "lodash._isiterateecall": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
- "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
- "dev": true
- },
- "lodash._reescape": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz",
- "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=",
- "dev": true
- },
- "lodash._reevaluate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz",
- "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=",
- "dev": true
- },
- "lodash._reinterpolate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
- "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=",
- "dev": true
- },
- "lodash._root": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz",
- "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=",
- "dev": true
- },
- "lodash.escape": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
- "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
- "dev": true,
- "requires": {
- "lodash._root": "^3.0.0"
- }
- },
- "lodash.isarguments": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
- "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
- "dev": true
- },
- "lodash.isarray": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
- "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
- "dev": true
- },
- "lodash.keys": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
- "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
- "dev": true,
- "requires": {
- "lodash._getnative": "^3.0.0",
- "lodash.isarguments": "^3.0.0",
- "lodash.isarray": "^3.0.0"
- }
- },
- "lodash.restparam": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz",
- "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=",
- "dev": true
- },
- "lodash.template": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz",
- "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=",
- "dev": true,
- "requires": {
- "lodash._basecopy": "^3.0.0",
- "lodash._basetostring": "^3.0.0",
- "lodash._basevalues": "^3.0.0",
- "lodash._isiterateecall": "^3.0.0",
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0",
- "lodash.keys": "^3.0.0",
- "lodash.restparam": "^3.0.0",
- "lodash.templatesettings": "^3.0.0"
- }
- },
- "lodash.templatesettings": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
- "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
- "dev": true,
- "requires": {
- "lodash._reinterpolate": "^3.0.0",
- "lodash.escape": "^3.0.0"
- }
- },
- "lolex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
- "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
- "dev": true
- },
- "loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
- "dev": true,
- "requires": {
- "js-tokens": "^3.0.0 || ^4.0.0"
- }
- },
- "lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "requires": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "magic-string": {
- "version": "0.22.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
- "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
- "dev": true,
- "requires": {
- "vlq": "^0.2.2"
- }
- },
- "make-iterator": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz",
- "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.2"
- }
- },
- "map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
- "dev": true
- },
- "map-stream": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz",
- "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=",
- "dev": true
- },
- "map-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
- "dev": true,
- "requires": {
- "object-visit": "^1.0.0"
- }
- },
- "mem": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz",
- "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=",
- "dev": true,
- "requires": {
- "mimic-fn": "^1.0.0"
- }
- },
- "merge-source-map": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
- "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=",
- "dev": true,
- "requires": {
- "source-map": "^0.5.6"
- }
- },
- "merge-stream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
- "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
- "dev": true,
- "requires": {
- "readable-stream": "^2.0.1"
- }
- },
- "micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
- }
- },
- "mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
- "dev": true
- },
- "minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
- },
- "minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
- },
- "minimatch": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
- "dev": true,
- "requires": {
- "brace-expansion": "^1.1.7"
- }
- },
- "minimist": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
- "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
- "dev": true
- },
- "mixin-deep": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
- "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
- "dev": true,
- "requires": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
- },
- "dependencies": {
- "is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
- "dev": true,
- "requires": {
- "is-plain-object": "^2.0.4"
- }
- }
- }
- },
- "mkdirp": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
- "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
- "dev": true,
- "requires": {
- "minimist": "0.0.8"
- },
- "dependencies": {
- "minimist": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
- "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
- "dev": true
- }
- }
- },
- "ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true
- },
- "multipipe": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
- "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
- "dev": true,
- "requires": {
- "duplexer2": "0.0.2"
- },
- "dependencies": {
- "duplexer2": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz",
- "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=",
- "dev": true,
- "requires": {
- "readable-stream": "~1.1.9"
- }
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
- "dev": true
- }
- }
- },
- "nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
- "dev": true,
- "requires": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- }
- },
- "natives": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
- "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==",
- "dev": true
- },
- "node-releases": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.3.tgz",
- "integrity": "sha512-6VrvH7z6jqqNFY200kdB6HdzkgM96Oaj9v3dqGfgp6mF+cHmU4wyQKZ2/WPDRVoR0Jz9KqbamaBN0ZhdUaysUQ==",
- "dev": true,
- "requires": {
- "semver": "^5.3.0"
- }
- },
- "normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
- "dev": true,
- "requires": {
- "remove-trailing-separator": "^1.0.1"
- }
- },
- "now-and-later": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz",
- "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=",
- "dev": true,
- "requires": {
- "once": "^1.3.2"
- }
- },
- "npm-run-path": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
- "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
- "dev": true,
- "requires": {
- "path-key": "^2.0.0"
- }
- },
- "number-is-nan": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
- "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
- "dev": true
- },
- "object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true
- },
- "object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
- "dev": true,
- "requires": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
- },
- "object-inspect": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
- "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
- "dev": true
- },
- "object-keys": {
- "version": "1.0.12",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz",
- "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==",
- "dev": true
- },
- "object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.0"
- }
- },
- "object.assign": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
- "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.2",
- "function-bind": "^1.1.1",
- "has-symbols": "^1.0.0",
- "object-keys": "^1.0.11"
- }
- },
- "object.defaults": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz",
- "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=",
- "dev": true,
- "requires": {
- "array-each": "^1.0.1",
- "array-slice": "^1.0.0",
- "for-own": "^1.0.0",
- "isobject": "^3.0.0"
- }
- },
- "object.map": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
- "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=",
- "dev": true,
- "requires": {
- "for-own": "^1.0.0",
- "make-iterator": "^1.0.0"
- }
- },
- "object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
- "dev": true,
- "requires": {
- "isobject": "^3.0.1"
- }
- },
- "once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "requires": {
- "wrappy": "1"
- }
- },
- "optionator": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
- "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.4",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "wordwrap": "~1.0.0"
- }
- },
- "orchestrator": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz",
- "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=",
- "dev": true,
- "requires": {
- "end-of-stream": "~0.1.5",
- "sequencify": "~0.0.7",
- "stream-consume": "~0.1.0"
- }
- },
- "ordered-read-streams": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz",
- "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=",
- "dev": true
- },
- "os-homedir": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
- "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
- "dev": true
- },
- "os-locale": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz",
- "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==",
- "dev": true,
- "requires": {
- "execa": "^0.7.0",
- "lcid": "^1.0.0",
- "mem": "^1.1.0"
- }
- },
- "p-finally": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
- "dev": true
- },
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true
- },
- "parse-filepath": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz",
- "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=",
- "dev": true,
- "requires": {
- "is-absolute": "^1.0.0",
- "map-cache": "^0.2.0",
- "path-root": "^0.1.1"
- }
- },
- "parse-node-version": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.0.tgz",
- "integrity": "sha512-02GTVHD1u0nWc20n2G7WX/PgdhNFG04j5fi1OkaJzPWLTcf6vh6229Lta1wTmXG/7Dg42tCssgkccVt7qvd8Kg==",
- "dev": true
- },
- "parse-passwd": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
- "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
- "dev": true
- },
- "pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
- "dev": true
- },
- "path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
- "dev": true
- },
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true
- },
- "path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true
- },
- "path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
- "dev": true
- },
- "path-parse": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
- "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
- "dev": true
- },
- "path-root": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz",
- "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=",
- "dev": true,
- "requires": {
- "path-root-regex": "^0.1.0"
- }
- },
- "path-root-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz",
- "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=",
- "dev": true
- },
- "pause-stream": {
- "version": "0.0.11",
- "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
- "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
- "dev": true,
- "requires": {
- "through": "~2.3"
- }
- },
- "posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
- "dev": true
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
- "dev": true
- },
- "pretty-hrtime": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz",
- "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=",
- "dev": true
- },
- "private": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
- "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
- "dev": true
- },
- "process-nextick-args": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
- "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
- "dev": true
- },
- "pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
- "dev": true
- },
- "pump": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
- "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
- "dev": true,
- "requires": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
- },
- "dependencies": {
- "end-of-stream": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
- "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
- "dev": true,
- "requires": {
- "once": "^1.4.0"
- }
- }
- }
- },
- "pumpify": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
- "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
- "dev": true,
- "requires": {
- "duplexify": "^3.6.0",
- "inherits": "^2.0.3",
- "pump": "^2.0.0"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "quote-stream": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
- "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=",
- "dev": true,
- "requires": {
- "buffer-equal": "0.0.1",
- "minimist": "^1.1.3",
- "through2": "^2.0.0"
- }
- },
- "readable-stream": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
- "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
- }
- },
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
- "regenerate": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
- "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
- "dev": true
- },
- "regenerate-unicode-properties": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz",
- "integrity": "sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0"
- }
- },
- "regenerator-transform": {
- "version": "0.13.3",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.3.tgz",
- "integrity": "sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA==",
- "dev": true,
- "requires": {
- "private": "^0.1.6"
- }
- },
- "regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- }
- },
- "regexp-tree": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.0.tgz",
- "integrity": "sha512-rHQv+tzu+0l3KS/ERabas1yK49ahNVxuH40WcPg53CzP5p8TgmmyBgHELLyJcvjhTD0e5ahSY6C76LbEVtr7cg==",
- "dev": true,
- "requires": {
- "cli-table3": "^0.5.0",
- "colors": "^1.1.2",
- "yargs": "^10.0.3"
- }
- },
- "regexpu-core": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.4.0.tgz",
- "integrity": "sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA==",
- "dev": true,
- "requires": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^7.0.0",
- "regjsgen": "^0.5.0",
- "regjsparser": "^0.6.0",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.0.2"
- }
- },
- "regjsgen": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz",
- "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==",
- "dev": true
- },
- "regjsparser": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
- "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
- "dev": true,
- "requires": {
- "jsesc": "~0.5.0"
- },
- "dependencies": {
- "jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true
- }
- }
- },
- "remove-bom-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz",
- "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5",
- "is-utf8": "^0.2.1"
- }
- },
- "remove-bom-stream": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz",
- "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=",
- "dev": true,
- "requires": {
- "remove-bom-buffer": "^3.0.0",
- "safe-buffer": "^5.1.0",
- "through2": "^2.0.3"
- }
- },
- "remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
- "dev": true
- },
- "repeat-element": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
- "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
- "dev": true
+ "hmac-drbg": "^1.0.0",
+ "inherits": "^2.0.1",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.0"
+ }
},
- "repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "emojis-list": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
+ "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=",
"dev": true
},
- "replace-ext": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
- "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
- "require-directory": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
- "require-main-filename": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
- "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
- "dev": true
+ "fast-safe-stringify": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
},
- "resolve": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
- "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
+ "find-cache-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
+ "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
"dev": true,
"requires": {
- "path-parse": "^1.0.6"
+ "commondir": "^1.0.1",
+ "make-dir": "^2.0.0",
+ "pkg-dir": "^3.0.0"
}
},
- "resolve-dir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
- "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
+ "find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
"dev": true,
"requires": {
- "expand-tilde": "^2.0.0",
- "global-modules": "^1.0.0"
+ "locate-path": "^3.0.0"
}
},
- "resolve-options": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
- "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=",
- "dev": true,
+ "follow-redirects": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
+ "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
"requires": {
- "value-or-function": "^3.0.0"
+ "debug": "=3.1.0"
}
},
- "resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
- "dev": true
- },
- "ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
- "dev": true
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
- "dev": true,
+ "form-data": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
+ "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
"requires": {
- "ret": "~0.1.10"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
}
},
- "samsam": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
- "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
- "dev": true
- },
- "scrypt-js": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
- "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw=="
+ "formidable": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
+ "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg=="
},
- "scryptsy": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.0.0.tgz",
- "integrity": "sha1-Jiw28CMc+nZU4jY/o5TNLexm83g="
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
},
- "semver": {
- "version": "5.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
- "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
- "sequencify": {
- "version": "0.0.7",
- "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz",
- "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=",
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
- "set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
"dev": true
},
- "set-value": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
- "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
- "dev": true,
+ "hash.js": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
"requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
+ "inherits": "^2.0.3",
+ "minimalistic-assert": "^1.0.1"
},
"dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}
}
},
- "shallow-copy": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
- "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=",
- "dev": true
- },
- "shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
- "dev": true,
- "requires": {
- "shebang-regex": "^1.0.0"
- }
- },
- "shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
- "dev": true
- },
- "sigmund": {
+ "hmac-drbg": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
- "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
- "dev": true
- },
- "signal-exit": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
- "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
- "dev": true
- },
- "sinon": {
- "version": "1.17.7",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
- "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
"requires": {
- "formatio": "1.1.1",
- "lolex": "1.3.2",
- "samsam": "1.1.2",
- "util": ">=0.10.3 <1"
+ "hash.js": "^1.0.3",
+ "minimalistic-assert": "^1.0.0",
+ "minimalistic-crypto-utils": "^1.0.1"
}
},
- "snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
- "dev": true,
- "requires": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
- },
- "dependencies": {
- "debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "requires": {
- "ms": "2.0.0"
- }
- },
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- },
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true
- }
- }
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
},
- "snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"dev": true,
"requires": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "dependencies": {
- "define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^1.0.0"
- }
- },
- "is-accessor-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
- "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-data-descriptor": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
- "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
- "dev": true,
- "requires": {
- "kind-of": "^6.0.0"
- }
- },
- "is-descriptor": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
- "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
- "dev": true,
- "requires": {
- "is-accessor-descriptor": "^1.0.0",
- "is-data-descriptor": "^1.0.0",
- "kind-of": "^6.0.2"
- }
- }
+ "loose-envify": "^1.0.0"
}
},
- "snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
- "dev": true,
- "requires": {
- "kind-of": "^3.2.0"
- },
- "dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
- }
- }
+ "is-buffer": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
+ "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
},
- "source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "js-levenshtein": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
"dev": true
},
- "source-map-resolve": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
- "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
- "dev": true,
- "requires": {
- "atob": "^2.1.1",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "source-map-url": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
- "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
- "sparkles": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz",
- "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==",
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "split-string": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
- "dev": true,
- "requires": {
- "extend-shallow": "^3.0.0"
- }
- },
- "static-eval": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.0.tgz",
- "integrity": "sha512-6flshd3F1Gwm+Ksxq463LtFd1liC77N/PX1FVVc3OzL3hAmo2fwHFbuArkcfi7s9rTNsLEhcRmXGFZhlgy40uw==",
- "dev": true,
- "requires": {
- "escodegen": "^1.8.1"
- }
- },
- "static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "json5": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"dev": true,
"requires": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
- },
- "dependencies": {
- "define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
- "dev": true,
- "requires": {
- "is-descriptor": "^0.1.0"
- }
- }
+ "minimist": "^1.2.0"
}
},
- "static-module": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
- "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
+ "loader-utils": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
+ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
"dev": true,
"requires": {
- "concat-stream": "~1.6.0",
- "convert-source-map": "^1.5.1",
- "duplexer2": "~0.1.4",
- "escodegen": "~1.9.0",
- "falafel": "^2.1.0",
- "has": "^1.0.1",
- "magic-string": "^0.22.4",
- "merge-source-map": "1.0.4",
- "object-inspect": "~1.4.0",
- "quote-stream": "~1.0.2",
- "readable-stream": "~2.3.3",
- "shallow-copy": "~0.0.1",
- "static-eval": "^2.0.0",
- "through2": "~2.0.3"
+ "big.js": "^5.2.2",
+ "emojis-list": "^2.0.0",
+ "json5": "^1.0.1"
}
},
- "stream-combiner": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
- "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=",
+ "locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
"dev": true,
"requires": {
- "duplexer": "~0.1.1",
- "through": "~2.3.4"
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
}
},
- "stream-consume": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.1.tgz",
- "integrity": "sha512-tNa3hzgkjEP7XbCkbRXe1jpg+ievoa0O4SCFlMOYEscGSS4JJsckGL8swUyAa/ApGU3Ae4t6Honor4HhL+tRyg==",
- "dev": true
- },
- "stream-shift": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
- "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
- "dev": true
- },
- "string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
+ "lodash": {
+ "version": "4.17.5",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
+ "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw=="
},
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
- "safe-buffer": "~5.1.0"
+ "js-tokens": "^3.0.0 || ^4.0.0"
}
},
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
"dev": true,
"requires": {
- "ansi-regex": "^3.0.0"
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
}
},
- "strip-bom": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz",
- "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=",
- "dev": true,
- "requires": {
- "first-chunk-stream": "^1.0.0",
- "is-utf8": "^0.2.0"
- }
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
},
- "strip-eof": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
- "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
- "dev": true
+ "mime": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz",
+ "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA=="
},
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
+ "mime-db": {
+ "version": "1.42.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz",
+ "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ=="
},
- "ternary-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz",
- "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=",
- "dev": true,
+ "mime-types": {
+ "version": "2.1.25",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz",
+ "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==",
"requires": {
- "duplexify": "^3.5.0",
- "fork-stream": "^0.0.4",
- "merge-stream": "^1.0.0",
- "through2": "^2.0.1"
+ "mime-db": "1.42.0"
}
},
- "through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
- "dev": true
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
+ "minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
},
- "through2-filter": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz",
- "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==",
- "dev": true,
- "requires": {
- "through2": "~2.0.0",
- "xtend": "~4.0.0"
- }
+ "minimalistic-crypto-utils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
},
- "tildify": {
+ "minimist": {
"version": "1.2.0",
- "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz",
- "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=",
- "dev": true,
- "requires": {
- "os-homedir": "^1.0.0"
- }
- },
- "time-stamp": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
- "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true
},
- "to-absolute-glob": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
- "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
- "is-absolute": "^1.0.0",
- "is-negated-glob": "^1.0.0"
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
}
},
- "to-fast-properties": {
+ "ms": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
},
- "to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "node-releases": {
+ "version": "1.1.42",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.42.tgz",
+ "integrity": "sha512-OQ/ESmUqGawI2PRX+XIRao44qWYBBfN54ImQYdWVTQqUckuejOg76ysSqDBK8NG3zwySRVnX36JwDQ6x+9GxzA==",
"dev": true,
"requires": {
- "kind-of": "^3.0.2"
+ "semver": "^6.3.0"
},
"dependencies": {
- "kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
- "dev": true,
- "requires": {
- "is-buffer": "^1.1.5"
- }
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
}
}
},
- "to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "object.assign": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
"dev": true,
"requires": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
+ "define-properties": "^1.1.2",
+ "function-bind": "^1.1.1",
+ "has-symbols": "^1.0.0",
+ "object-keys": "^1.0.11"
}
},
- "to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "p-limit": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz",
+ "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==",
"dev": true,
"requires": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "p-try": "^2.0.0"
}
},
- "to-through": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz",
- "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=",
+ "p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
"dev": true,
"requires": {
- "through2": "^2.0.3"
+ "p-limit": "^2.0.0"
}
},
- "trim-right": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
- "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
"dev": true
},
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
- },
- "typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
"dev": true
},
- "unc-path-regex": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz",
- "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=",
+ "path-parse": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
"dev": true
},
- "unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
"dev": true
},
- "unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "pkg-dir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
+ "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
"dev": true,
"requires": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
+ "find-up": "^3.0.0"
}
},
- "unicode-match-property-value-ecmascript": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz",
- "integrity": "sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ==",
+ "private": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
"dev": true
},
- "unicode-property-aliases-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz",
- "integrity": "sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg==",
- "dev": true
+ "qs": {
+ "version": "6.9.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.1.tgz",
+ "integrity": "sha512-Cxm7/SS/y/Z3MHWSxXb8lIFqgqBowP5JMlTUFyJN88y0SGQhVmZnqFK/PeuMX9LzUyWsqqhNxIyg0jlzq946yA=="
},
- "union-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
- "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
- "dev": true,
+ "readable-stream": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz",
+ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==",
"requires": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^0.4.3"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
},
"dependencies": {
- "extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
- "dev": true,
- "requires": {
- "is-extendable": "^0.1.0"
- }
- },
- "set-value": {
- "version": "0.4.3",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
- "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
- "dev": true,
- "requires": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.1",
- "to-object-path": "^0.3.0"
- }
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
}
}
},
- "unique-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz",
- "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=",
+ "regenerate": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
"dev": true
},
- "unorm": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.4.1.tgz",
- "integrity": "sha1-NkIA1fE2RsqLzURJAnEzVhR5IwA="
- },
- "unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "regenerate-unicode-properties": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.1.0.tgz",
+ "integrity": "sha512-LGZzkgtLY79GeXLm8Dp0BVLdQlWICzBnJz/ipWUgo59qBaZ+BHtq51P2q1uVZlppMuUAT37SDk39qUbjTWB7bA==",
"dev": true,
"requires": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
- },
- "dependencies": {
- "has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
- "dev": true,
- "requires": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
- },
- "dependencies": {
- "isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
- "dev": true,
- "requires": {
- "isarray": "1.0.0"
- }
- }
- }
- },
- "has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
- "dev": true
- }
+ "regenerate": "^1.4.0"
}
},
- "urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
- "dev": true
- },
- "use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
- "dev": true
- },
- "user-home": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
- "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
- "dev": true
- },
- "useref": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/useref/-/useref-1.4.1.tgz",
- "integrity": "sha1-Atq60QsahQJdlkJS/KMbgFkxrX0=",
- "dev": true
+ "regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
},
- "util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
+ "regenerator-transform": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.1.tgz",
+ "integrity": "sha512-flVuee02C3FKRISbxhXl9mGzdbWUVHubl1SMaknjxkFB1/iqpJhArQUvRxOOPEc/9tAiX0BaQ28FJH10E4isSQ==",
"dev": true,
"requires": {
- "inherits": "2.0.3"
- },
- "dependencies": {
- "inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
- "dev": true
- }
+ "private": "^0.1.6"
}
},
- "util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
- "dev": true
- },
- "v8flags": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz",
- "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=",
+ "regexpu-core": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.6.0.tgz",
+ "integrity": "sha512-YlVaefl8P5BnFYOITTNzDvan1ulLOiXJzCNZxduTIosN17b87h3bvG9yHMoHaRuo88H4mQ06Aodj5VtYGGGiTg==",
"dev": true,
"requires": {
- "user-home": "^1.1.1"
+ "regenerate": "^1.4.0",
+ "regenerate-unicode-properties": "^8.1.0",
+ "regjsgen": "^0.5.0",
+ "regjsparser": "^0.6.0",
+ "unicode-match-property-ecmascript": "^1.0.4",
+ "unicode-match-property-value-ecmascript": "^1.1.0"
}
},
- "value-or-function": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz",
- "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=",
+ "regjsgen": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
+ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
"dev": true
},
- "vinyl": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
- "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
- "dev": true,
- "requires": {
- "clone": "^1.0.0",
- "clone-stats": "^0.0.1",
- "replace-ext": "0.0.1"
- }
- },
- "vinyl-fs": {
- "version": "0.3.14",
- "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz",
- "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=",
+ "regjsparser": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz",
+ "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==",
"dev": true,
"requires": {
- "defaults": "^1.0.0",
- "glob-stream": "^3.1.5",
- "glob-watcher": "^0.0.6",
- "graceful-fs": "^3.0.0",
- "mkdirp": "^0.5.0",
- "strip-bom": "^1.0.0",
- "through2": "^0.6.1",
- "vinyl": "^0.4.0"
+ "jsesc": "~0.5.0"
},
"dependencies": {
- "clone": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
- "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
- "dev": true
- },
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
- "dev": true
- },
- "readable-stream": {
- "version": "1.0.34",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
- "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "jsesc": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
"dev": true
- },
- "through2": {
- "version": "0.6.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
- "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
- "dev": true,
- "requires": {
- "readable-stream": ">=1.0.33-1 <1.1.0-0",
- "xtend": ">=4.0.0 <4.1.0-0"
- }
- },
- "vinyl": {
- "version": "0.4.6",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
- "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
- "dev": true,
- "requires": {
- "clone": "^0.2.0",
- "clone-stats": "^0.0.1"
- }
}
}
},
- "vinyl-sourcemap": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz",
- "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=",
+ "resolve": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.13.1.tgz",
+ "integrity": "sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==",
"dev": true,
"requires": {
- "append-buffer": "^1.0.2",
- "convert-source-map": "^1.5.0",
- "graceful-fs": "^4.1.6",
- "normalize-path": "^2.1.1",
- "now-and-later": "^2.0.0",
- "remove-bom-buffer": "^3.0.0",
- "vinyl": "^2.0.0"
- },
- "dependencies": {
- "clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
- "dev": true
- },
- "clone-stats": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
- "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
- "dev": true
- },
- "graceful-fs": {
- "version": "4.1.15",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
- "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
- "dev": true
- },
- "replace-ext": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
- "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
- "dev": true
- },
- "vinyl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
- "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
- "dev": true,
- "requires": {
- "clone": "^2.1.1",
- "clone-buffer": "^1.0.0",
- "clone-stats": "^1.0.0",
- "cloneable-readable": "^1.0.0",
- "remove-trailing-separator": "^1.0.1",
- "replace-ext": "^1.0.0"
- }
- }
+ "path-parse": "^1.0.6"
}
},
- "vinyl-sourcemaps-apply": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz",
- "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=",
- "dev": true,
- "requires": {
- "source-map": "^0.5.1"
- }
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
- "vlq": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
- "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
- "dev": true
+ "scrypt-js": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz",
+ "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw=="
},
- "which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "requires": {
- "isexe": "^2.0.0"
- }
+ "scryptsy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/scryptsy/-/scryptsy-2.1.0.tgz",
+ "integrity": "sha512-1CdSqHQowJBnMAFyPEBRfqag/YP9OF394FV+4YREIJX4ljD7OxvQRDayyoyyCk+senRjSkP6VnUNQmVQqB6g7w=="
},
- "which-module": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
- "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
"dev": true
},
- "wordwrap": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
- "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
- "wrap-ansi": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
- "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
- "dev": true,
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"requires": {
- "string-width": "^1.0.1",
- "strip-ansi": "^3.0.1"
+ "safe-buffer": "~5.2.0"
},
"dependencies": {
- "ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
- "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
- "dev": true,
+ "safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+ }
+ }
+ },
+ "superagent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.1.2.tgz",
+ "integrity": "sha512-VwPCbi9H02qDtTbdY+e3+cK5XR0YHsJy9hmeCOXLQ8ezjq8+S1Bs4MdNRmpmf2QjDBetD7drG7/nEta7E3E6Sg==",
+ "requires": {
+ "component-emitter": "^1.3.0",
+ "cookiejar": "^2.1.2",
+ "debug": "^4.1.1",
+ "fast-safe-stringify": "^2.0.7",
+ "form-data": "^3.0.0",
+ "formidable": "^1.2.1",
+ "methods": "^1.1.2",
+ "mime": "^2.4.4",
+ "qs": "^6.9.1",
+ "readable-stream": "^3.4.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"requires": {
- "number-is-nan": "^1.0.0"
+ "ms": "^2.1.1"
}
},
- "string-width": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
- "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
- "dev": true,
- "requires": {
- "code-point-at": "^1.0.0",
- "is-fullwidth-code-point": "^1.0.0",
- "strip-ansi": "^3.0.0"
- }
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
- "strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^2.0.0"
- }
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
}
}
},
- "wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "unicode-canonical-property-names-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
"dev": true
},
- "xtend": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
- "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
- "dev": true
+ "unicode-match-property-ecmascript": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+ "dev": true,
+ "requires": {
+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
+ "unicode-property-aliases-ecmascript": "^1.0.4"
+ }
},
- "y18n": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
- "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "unicode-match-property-value-ecmascript": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.1.0.tgz",
+ "integrity": "sha512-hDTHvaBk3RmFzvSl0UVrUmC3PuW9wKVnpoUDYH0JDkSIovzw+J5viQmeYHxVSBptubnr7PbH2e0fnpDRQnQl5g==",
"dev": true
},
- "yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "unicode-property-aliases-ecmascript": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.5.tgz",
+ "integrity": "sha512-L5RAqCfXqAwR3RriF8pM0lU0w4Ryf/GgzONwi6KnL1taJQa7x1TCxdJnILX59WIGOwR57IVxn7Nej0fz1Ny6fw==",
"dev": true
},
- "yargs": {
- "version": "10.1.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-10.1.2.tgz",
- "integrity": "sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==",
- "dev": true,
- "requires": {
- "cliui": "^4.0.0",
- "decamelize": "^1.1.1",
- "find-up": "^2.1.0",
- "get-caller-file": "^1.0.1",
- "os-locale": "^2.0.0",
- "require-directory": "^2.1.1",
- "require-main-filename": "^1.0.1",
- "set-blocking": "^2.0.0",
- "string-width": "^2.0.0",
- "which-module": "^2.0.0",
- "y18n": "^3.2.1",
- "yargs-parser": "^8.1.0"
- }
+ "unorm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
+ "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA=="
},
- "yargs-parser": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-8.1.0.tgz",
- "integrity": "sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==",
- "dev": true,
- "requires": {
- "camelcase": "^4.1.0"
- }
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
}
}
}
diff --git a/package.json b/package.json
index 1ec39ff..c217742 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,12 @@
{
"name": "wicc-wallet-lib",
- "version": "1.0.3",
+ "version": "2.0.0",
"description": "A pure and powerful JavaScript Wicc Wallet library.",
"author": "coredev@waykichainhk.com",
- "main": "index.js",
+ "main": "./index.js",
"scripts": {
- "lint": "gulp lint",
- "test": "gulp test",
- "coverage": "gulp coverage",
- "build": "gulp browser"
+ "build": "webpack --mode production --progress --display-modules --colors --display-reasons",
+ "test": "node demo/index.js"
},
"keywords": [
"bitcoin",
@@ -24,17 +22,20 @@
"bip37",
"bip69",
"bip70",
- "multisig"
+ "multisig",
+ "wicc",
+ "wusd",
+ "wgrt",
+ "dex",
+ "cdp"
],
- "repository": {
- "type": "git",
- "url": "https://github.com/bitpay/bitcore-lib.git"
- },
"browser": {
"request": "browser-request"
},
"dependencies": {
"aes-js": "^3.1.1",
+ "axios": "^0.19.0",
+ "babel-polyfill": "^6.26.0",
"bn.js": "=4.11.8",
"bs58": "=4.0.1",
"buffer-compare": "=1.1.1",
@@ -45,18 +46,13 @@
"lodash": "=4.17.5",
"scrypt-js": "^2.0.3",
"scryptsy": "^2.0.0",
+ "superagent": "^5.1.2",
"unorm": "^1.4.1"
},
+ "license": "MIT",
"devDependencies": {
- "@babel/core": "^7.2.2",
- "@babel/preset-env": "^7.2.3",
- "bitcore-build": "https://github.com/WaykiChain/wicc-wallet-utils-js.git",
- "brfs": "^1.2.0",
- "chai": "^1.10.0",
- "gulp": "^3.8.10",
- "gulp-babel": "^8.0.0",
- "gulp-useref": "^3.1.5",
- "sinon": "^1.13.0"
- },
- "license": "MIT"
+ "@babel/core": "^7.7.4",
+ "@babel/preset-env": "^7.7.4",
+ "babel-loader": "^8.0.6"
+ }
}
diff --git a/src/BaasClient.js b/src/BaasClient.js
new file mode 100644
index 0000000..c62899b
--- /dev/null
+++ b/src/BaasClient.js
@@ -0,0 +1,48 @@
+const axios = require('axios');
+var _ = require('lodash');
+
+class BaasClient {
+ constructor(BaaSUrl) {
+ this.BaaSUrl = BaaSUrl
+ if (!_.trim(this.BaaSUrl).length) {
+ throw ('BaaSUrl is required')
+ }
+ this.instance = axios.create({
+ baseURL: BaaSUrl,
+ timeout: 15 * 1000
+ });
+ this.instance.interceptors.response.use(function (response) {
+ if (response.data.code === 0) {
+ return response.data
+ } else {
+ return Promise.reject(response.data.msg);
+ }
+ }, function (error) {
+ return Promise.reject(error);
+ })
+ }
+ async getAccountInfo(address) {
+ let res = await this.instance.post("/account/getaccountinfo", {
+ address: address
+ })
+ return res
+ }
+ async getBlockCount() {
+ let res = await this.instance.post("/block/getblockcount")
+ return res
+ }
+ async sendRawTx(rawtx) {
+ let res = this.instance.post("/transaction/sendrawtx", {
+ rawtx: rawtx
+ })
+ return res
+ }
+ async decodeRawTx(rawtx) {
+ let res = this.instance.post("/transaction/decoderawtx", {
+ rawtx: rawtx
+ })
+ return res
+ }
+}
+
+module.exports = BaasClient
\ No newline at end of file
diff --git a/src/Wallet.js b/src/Wallet.js
new file mode 100644
index 0000000..8e423bb
--- /dev/null
+++ b/src/Wallet.js
@@ -0,0 +1,34 @@
+var PrivateKey = require('../src/lib/privatekey');
+var Hash = require('./lib/crypto/hash');
+var ECDSA = require('./lib/crypto/ecdsa');
+var _ = require('lodash');
+
+class Wallet {
+ constructor(privateKey = "") {
+ if (!privateKey || !_.trim(privateKey).length) {
+ throw "private key is required"
+ }
+ if (!PrivateKey.isValid(privateKey) ) {
+ throw "Invalid privatekey"
+ }
+ this.privateKey = privateKey;
+ this._getAddress()
+ }
+ _getAddress() {
+ var privKey = PrivateKey.fromWIF(this.privateKey)
+ this.address = privKey.toAddress().toString()
+ }
+ signMessage(message) {
+ var privateKey = PrivateKey.fromWIF(this.privateKey)
+ var msgBuff = Buffer.from(message)
+
+ var msgBuffHash = Hash.sha256(Hash.sha256ripemd160(msgBuff));
+ return ECDSA.sign(msgBuffHash, privateKey, 'endian')
+ }
+ publicKeyAsHex() {
+ var privateKey = PrivateKey.fromWIF(this.privateKey)
+ return privateKey.toPublicKey();
+ }
+}
+
+module.exports = Wallet
\ No newline at end of file
diff --git a/src/WalletManager.js b/src/WalletManager.js
new file mode 100644
index 0000000..fb26b7a
--- /dev/null
+++ b/src/WalletManager.js
@@ -0,0 +1,39 @@
+var Wallet = require('./Wallet')
+var WiccApi = require("../src/lib/wiccapi")
+var PrivateKey = require('../src/lib/privatekey');
+
+class WalletManager {
+ constructor(networkType = "testnet") {
+ this.networkType = networkType;
+ this.wiccApi = new WiccApi({ network: this.networkType })
+ }
+ randomMnemonicCodes(language = "ENGLISH") {
+ return this.wiccApi.createAllCoinMnemonicCode(language)
+ }
+ switchMnemonicCodes(mnemonic, targetLanguage) {
+ return this.wiccApi.switchMnemonicCode(mnemonic, targetLanguage)
+ }
+ createWallet(mnemonic) {
+ if (!this.wiccApi.checkMnemonicCode(mnemonic)) {
+ throw "Invalid mnemonic"
+ }
+ let walletInfo = this.wiccApi.createWallet(mnemonic, "")
+ let key = this.wiccApi.getPriKeyFromSeed(walletInfo.seedinfo, "")
+ return new Wallet(key)
+ }
+ importWalletFromMnemonic(mnemonic) {
+ if (!this.wiccApi.checkMnemonicCode(mnemonic)) {
+ throw "Invalid mnemonic"
+ }
+ let privateKey = this.wiccApi.getPriKeyFromMnemonicCode(mnemonic)
+ return new Wallet(privateKey)
+ }
+ importWalletFromPrivateKey(privateKeyWIF) {
+ if (!PrivateKey.isValid(privateKeyWIF)) {
+ throw "Invalid privatekey"
+ }
+ return new Wallet(privateKeyWIF)
+ }
+}
+
+module.exports = WalletManager
\ No newline at end of file
diff --git a/src/WaykiTransaction.js b/src/WaykiTransaction.js
new file mode 100644
index 0000000..977c7f4
--- /dev/null
+++ b/src/WaykiTransaction.js
@@ -0,0 +1,29 @@
+var WiccApi = require("../src/lib/wiccapi")
+var PrivateKey = require('../src/lib/privatekey');
+var transactionParams = require("./transactionParams")
+
+class WaykiTransaction {
+ constructor(txParams, wallet) {
+ this.txParams = txParams
+ this.wallet = wallet
+ }
+
+ _getNetwork () {
+ let network
+ if (this.wallet.address[0] === 'w') {
+ network = 'testnet'
+ } else if (this.wallet.address[0] === 'W') {
+ network = 'mainnet'
+ }
+ return network
+ }
+
+ genRawTx () {
+ var privKey = PrivateKey.fromWIF(this.wallet.privateKey)
+ let params = transactionParams(this.txParams, this.wallet)
+ let wiccApi = new WiccApi({network: this._getNetwork()})
+ return wiccApi.createSignTransaction(privKey, params)
+ }
+}
+
+module.exports = WaykiTransaction
\ No newline at end of file
diff --git a/src/index.js b/src/index.js
new file mode 100644
index 0000000..6f6dddf
--- /dev/null
+++ b/src/index.js
@@ -0,0 +1,75 @@
+'use strict';
+
+var bitcore = module.exports;
+
+// module information
+bitcore.version = 'v' + require('../package.json').version;
+bitcore.versionGuard = function(version) {
+ if (version !== undefined) {
+ var message = 'More than one instance of bitcore-lib found. ' +
+ 'Please make sure to require bitcore-lib and check that submodules do' +
+ ' not also include their own bitcore-lib dependency.';
+ throw new Error(message);
+ }
+};
+bitcore.versionGuard(global._bitcore);
+global._bitcore = bitcore.version;
+
+// crypto
+bitcore.crypto = {};
+bitcore.crypto.BN = require('./lib/crypto/bn');
+bitcore.crypto.ECDSA = require('./lib/crypto/ecdsa');
+bitcore.crypto.Hash = require('./lib/crypto/hash');
+bitcore.crypto.Random = require('./lib/crypto/random');
+bitcore.crypto.Point = require('./lib/crypto/point');
+bitcore.crypto.Signature = require('./lib/crypto/signature');
+
+// encoding
+bitcore.encoding = {};
+bitcore.encoding.Base58 = require('./lib/encoding/base58');
+bitcore.encoding.Base58Check = require('./lib/encoding/base58check');
+bitcore.encoding.BufferReader = require('./lib/encoding/bufferreader');
+bitcore.encoding.BufferWriter = require('./lib/encoding/bufferwriter');
+bitcore.encoding.Varint = require('./lib/encoding/varint');
+
+// utilities
+bitcore.util = {};
+bitcore.util.buffer = require('./lib/util/buffer');
+bitcore.util.js = require('./lib/util/js');
+bitcore.util.preconditions = require('./lib/util/preconditions');
+bitcore.util.util = require('./lib/util/util')
+bitcore.util.BetItem = require('./lib/util/betitem')
+bitcore.util.VoteFund = require('./lib/util/votefund')
+bitcore.util.WriterHelper = require('./lib/util/writerhelper');
+
+// errors thrown by the library
+bitcore.errors = require('./lib/errors');
+
+// main bitcoin library
+bitcore.Address = require('./lib/address');
+bitcore.Block = require('./lib/block');
+bitcore.MerkleBlock = require('./lib/block/merkleblock');
+bitcore.BlockHeader = require('./lib/block/blockheader');
+bitcore.HDPrivateKey = require('./lib/hdprivatekey.js');
+bitcore.HDPublicKey = require('./lib/hdpublickey.js');
+bitcore.Networks = require('./lib/networks');
+bitcore.Opcode = require('./lib/opcode');
+bitcore.PrivateKey = require('./lib/privatekey');
+bitcore.PublicKey = require('./lib/publickey');
+bitcore.Script = require('./lib/script');
+bitcore.Transaction = require('./lib/transaction');
+bitcore.URI = require('./lib/uri');
+bitcore.Unit = require('./lib/unit');
+
+// dependencies, subject to change
+bitcore.deps = {};
+bitcore.deps.bnjs = require('bn.js');
+bitcore.deps.bs58 = require('bs58');
+bitcore.deps.Buffer = Buffer;
+bitcore.deps.elliptic = require('elliptic');
+bitcore.deps._ = require('lodash');
+
+// Internal usage, exposed for testing/advanced tweaking
+bitcore.Transaction.sighash = require('./lib/transaction/sighash');
+bitcore.Mnemonic = require('./lib/mnemonic');
+
diff --git a/lib/address.js b/src/lib/address.js
similarity index 100%
rename from lib/address.js
rename to src/lib/address.js
diff --git a/lib/aes-cbc.js b/src/lib/aes-cbc.js
similarity index 100%
rename from lib/aes-cbc.js
rename to src/lib/aes-cbc.js
diff --git a/lib/block/block.js b/src/lib/block/block.js
similarity index 100%
rename from lib/block/block.js
rename to src/lib/block/block.js
diff --git a/lib/block/blockheader.js b/src/lib/block/blockheader.js
similarity index 100%
rename from lib/block/blockheader.js
rename to src/lib/block/blockheader.js
diff --git a/lib/block/index.js b/src/lib/block/index.js
similarity index 100%
rename from lib/block/index.js
rename to src/lib/block/index.js
diff --git a/lib/block/merkleblock.js b/src/lib/block/merkleblock.js
similarity index 100%
rename from lib/block/merkleblock.js
rename to src/lib/block/merkleblock.js
diff --git a/lib/crypto/bn.js b/src/lib/crypto/bn.js
similarity index 100%
rename from lib/crypto/bn.js
rename to src/lib/crypto/bn.js
diff --git a/lib/crypto/ecdsa.js b/src/lib/crypto/ecdsa.js
similarity index 100%
rename from lib/crypto/ecdsa.js
rename to src/lib/crypto/ecdsa.js
diff --git a/lib/crypto/hash.js b/src/lib/crypto/hash.js
similarity index 100%
rename from lib/crypto/hash.js
rename to src/lib/crypto/hash.js
diff --git a/lib/crypto/point.js b/src/lib/crypto/point.js
similarity index 100%
rename from lib/crypto/point.js
rename to src/lib/crypto/point.js
diff --git a/lib/crypto/random.js b/src/lib/crypto/random.js
similarity index 100%
rename from lib/crypto/random.js
rename to src/lib/crypto/random.js
diff --git a/lib/crypto/signature.js b/src/lib/crypto/signature.js
similarity index 100%
rename from lib/crypto/signature.js
rename to src/lib/crypto/signature.js
diff --git a/lib/encoding/base58.js b/src/lib/encoding/base58.js
similarity index 100%
rename from lib/encoding/base58.js
rename to src/lib/encoding/base58.js
diff --git a/lib/encoding/base58check.js b/src/lib/encoding/base58check.js
similarity index 100%
rename from lib/encoding/base58check.js
rename to src/lib/encoding/base58check.js
diff --git a/lib/encoding/bufferreader.js b/src/lib/encoding/bufferreader.js
similarity index 100%
rename from lib/encoding/bufferreader.js
rename to src/lib/encoding/bufferreader.js
diff --git a/lib/encoding/bufferwriter.js b/src/lib/encoding/bufferwriter.js
similarity index 100%
rename from lib/encoding/bufferwriter.js
rename to src/lib/encoding/bufferwriter.js
diff --git a/lib/encoding/varint.js b/src/lib/encoding/varint.js
similarity index 100%
rename from lib/encoding/varint.js
rename to src/lib/encoding/varint.js
diff --git a/lib/errors.js b/src/lib/errors.js
similarity index 100%
rename from lib/errors.js
rename to src/lib/errors.js
diff --git a/lib/errors/index.js b/src/lib/errors/index.js
similarity index 100%
rename from lib/errors/index.js
rename to src/lib/errors/index.js
diff --git a/lib/errors/spec.js b/src/lib/errors/spec.js
similarity index 100%
rename from lib/errors/spec.js
rename to src/lib/errors/spec.js
diff --git a/lib/hdprivatekey.js b/src/lib/hdprivatekey.js
similarity index 100%
rename from lib/hdprivatekey.js
rename to src/lib/hdprivatekey.js
diff --git a/lib/hdpublickey.js b/src/lib/hdpublickey.js
similarity index 100%
rename from lib/hdpublickey.js
rename to src/lib/hdpublickey.js
diff --git a/lib/mnemonic.js b/src/lib/mnemonic.js
similarity index 100%
rename from lib/mnemonic.js
rename to src/lib/mnemonic.js
diff --git a/lib/networks.js b/src/lib/networks.js
similarity index 100%
rename from lib/networks.js
rename to src/lib/networks.js
diff --git a/lib/opcode.js b/src/lib/opcode.js
similarity index 100%
rename from lib/opcode.js
rename to src/lib/opcode.js
diff --git a/lib/pbkdf2.js b/src/lib/pbkdf2.js
similarity index 100%
rename from lib/pbkdf2.js
rename to src/lib/pbkdf2.js
diff --git a/lib/privatekey.js b/src/lib/privatekey.js
similarity index 100%
rename from lib/privatekey.js
rename to src/lib/privatekey.js
diff --git a/lib/publickey.js b/src/lib/publickey.js
similarity index 100%
rename from lib/publickey.js
rename to src/lib/publickey.js
diff --git a/lib/script/index.js b/src/lib/script/index.js
similarity index 100%
rename from lib/script/index.js
rename to src/lib/script/index.js
diff --git a/lib/script/interpreter.js b/src/lib/script/interpreter.js
similarity index 100%
rename from lib/script/interpreter.js
rename to src/lib/script/interpreter.js
diff --git a/lib/script/script.js b/src/lib/script/script.js
similarity index 100%
rename from lib/script/script.js
rename to src/lib/script/script.js
diff --git a/lib/transaction/assetcreatetx.js b/src/lib/transaction/assetcreatetx.js
similarity index 100%
rename from lib/transaction/assetcreatetx.js
rename to src/lib/transaction/assetcreatetx.js
diff --git a/lib/transaction/assetupdatetx.js b/src/lib/transaction/assetupdatetx.js
similarity index 100%
rename from lib/transaction/assetupdatetx.js
rename to src/lib/transaction/assetupdatetx.js
diff --git a/lib/transaction/cdpliquidatetx.js b/src/lib/transaction/cdpliquidatetx.js
similarity index 100%
rename from lib/transaction/cdpliquidatetx.js
rename to src/lib/transaction/cdpliquidatetx.js
diff --git a/lib/transaction/cdpredeemtx.js b/src/lib/transaction/cdpredeemtx.js
similarity index 100%
rename from lib/transaction/cdpredeemtx.js
rename to src/lib/transaction/cdpredeemtx.js
diff --git a/lib/transaction/cdpstaketx.js b/src/lib/transaction/cdpstaketx.js
similarity index 100%
rename from lib/transaction/cdpstaketx.js
rename to src/lib/transaction/cdpstaketx.js
diff --git a/lib/transaction/commontx.js b/src/lib/transaction/commontx.js
similarity index 100%
rename from lib/transaction/commontx.js
rename to src/lib/transaction/commontx.js
diff --git a/lib/transaction/contracttx.js b/src/lib/transaction/contracttx.js
similarity index 100%
rename from lib/transaction/contracttx.js
rename to src/lib/transaction/contracttx.js
diff --git a/lib/transaction/delegatetx.js b/src/lib/transaction/delegatetx.js
similarity index 100%
rename from lib/transaction/delegatetx.js
rename to src/lib/transaction/delegatetx.js
diff --git a/lib/transaction/dexbuylimitordertx.js b/src/lib/transaction/dexbuylimitordertx.js
similarity index 100%
rename from lib/transaction/dexbuylimitordertx.js
rename to src/lib/transaction/dexbuylimitordertx.js
diff --git a/lib/transaction/dexbuymarketordertx.js b/src/lib/transaction/dexbuymarketordertx.js
similarity index 100%
rename from lib/transaction/dexbuymarketordertx.js
rename to src/lib/transaction/dexbuymarketordertx.js
diff --git a/lib/transaction/dexcancelordertx.js b/src/lib/transaction/dexcancelordertx.js
similarity index 100%
rename from lib/transaction/dexcancelordertx.js
rename to src/lib/transaction/dexcancelordertx.js
diff --git a/lib/transaction/dexselllimitordertx.js b/src/lib/transaction/dexselllimitordertx.js
similarity index 100%
rename from lib/transaction/dexselllimitordertx.js
rename to src/lib/transaction/dexselllimitordertx.js
diff --git a/lib/transaction/dexsellmarketordertx.js b/src/lib/transaction/dexsellmarketordertx.js
similarity index 100%
rename from lib/transaction/dexsellmarketordertx.js
rename to src/lib/transaction/dexsellmarketordertx.js
diff --git a/lib/transaction/index.js b/src/lib/transaction/index.js
similarity index 100%
rename from lib/transaction/index.js
rename to src/lib/transaction/index.js
diff --git a/lib/transaction/input/index.js b/src/lib/transaction/input/index.js
similarity index 100%
rename from lib/transaction/input/index.js
rename to src/lib/transaction/input/index.js
diff --git a/lib/transaction/input/input.js b/src/lib/transaction/input/input.js
similarity index 100%
rename from lib/transaction/input/input.js
rename to src/lib/transaction/input/input.js
diff --git a/lib/transaction/input/multisig.js b/src/lib/transaction/input/multisig.js
similarity index 100%
rename from lib/transaction/input/multisig.js
rename to src/lib/transaction/input/multisig.js
diff --git a/lib/transaction/input/multisigscripthash.js b/src/lib/transaction/input/multisigscripthash.js
similarity index 100%
rename from lib/transaction/input/multisigscripthash.js
rename to src/lib/transaction/input/multisigscripthash.js
diff --git a/lib/transaction/input/publickey.js b/src/lib/transaction/input/publickey.js
similarity index 100%
rename from lib/transaction/input/publickey.js
rename to src/lib/transaction/input/publickey.js
diff --git a/lib/transaction/input/publickeyhash.js b/src/lib/transaction/input/publickeyhash.js
similarity index 100%
rename from lib/transaction/input/publickeyhash.js
rename to src/lib/transaction/input/publickeyhash.js
diff --git a/lib/transaction/output.js b/src/lib/transaction/output.js
similarity index 100%
rename from lib/transaction/output.js
rename to src/lib/transaction/output.js
diff --git a/lib/transaction/registeraccounttx.js b/src/lib/transaction/registeraccounttx.js
similarity index 100%
rename from lib/transaction/registeraccounttx.js
rename to src/lib/transaction/registeraccounttx.js
diff --git a/lib/transaction/registerapptx.js b/src/lib/transaction/registerapptx.js
similarity index 100%
rename from lib/transaction/registerapptx.js
rename to src/lib/transaction/registerapptx.js
diff --git a/lib/transaction/sighash.js b/src/lib/transaction/sighash.js
similarity index 100%
rename from lib/transaction/sighash.js
rename to src/lib/transaction/sighash.js
diff --git a/lib/transaction/sighashwitness.js b/src/lib/transaction/sighashwitness.js
similarity index 100%
rename from lib/transaction/sighashwitness.js
rename to src/lib/transaction/sighashwitness.js
diff --git a/lib/transaction/signature.js b/src/lib/transaction/signature.js
similarity index 100%
rename from lib/transaction/signature.js
rename to src/lib/transaction/signature.js
diff --git a/lib/transaction/transaction.js b/src/lib/transaction/transaction.js
similarity index 100%
rename from lib/transaction/transaction.js
rename to src/lib/transaction/transaction.js
diff --git a/src/lib/transaction/ucointransfertx.js b/src/lib/transaction/ucointransfertx.js
new file mode 100644
index 0000000..9d6fe33
--- /dev/null
+++ b/src/lib/transaction/ucointransfertx.js
@@ -0,0 +1,184 @@
+'use strict';
+
+var _ = require('lodash');
+var $ = require('../util/preconditions');
+var Util = require('../util/util')
+var Hash = require('../crypto/hash');
+var ECDSA = require('../crypto/ecdsa');
+var BufferWriter = require('../encoding/bufferwriter');
+var bufferUtil = require('../util/buffer');
+var WriterHelper = require('../util/writerhelper');
+
+var UCoinTransferTx = function UCoinTransferTx(arg) {
+ if (!(this instanceof UCoinTransferTx)) {
+ return new UCoinTransferTx(arg);
+ }
+ var info = UCoinTransferTx._from(arg);
+ this.nTxType = info.nTxType;
+ this.nVersion = info.nVersion;
+ this.nValidHeight = info.nValidHeight;
+ this.srcRegId = info.srcRegId;
+ this.destArr = info.destArr;
+ this.fees = info.fees;
+ this.publicKey = info.publicKey;
+ this.feesCoinType = info.feesCoinType;
+ this.memo = info.memo;
+ this.network = info.network;
+
+ return this;
+};
+
+UCoinTransferTx._from = function _from(arg) {
+ var info = {};
+ if (_.isObject(arg)) {
+ info = UCoinTransferTx._fromObject(arg);
+ } else {
+ throw new TypeError('Unrecognized argument for UCoinTransferTx');
+ }
+ return info;
+};
+
+UCoinTransferTx._fromObject = function _fromObject(data) {
+ $.checkArgument(data, 'data is required');
+
+ var info = {
+ nTxType: data.nTxType,
+ nVersion: data.nVersion,
+ nValidHeight: data.nValidHeight,
+ srcRegId: data.srcRegId,
+ destArr: data.destArr,
+ fees: data.fees,
+ publicKey: data.publicKey,
+ feesCoinType: data.feesCoinType,
+ memo: data.memo
+ };
+ return info;
+};
+
+UCoinTransferTx.prototype._SignatureHash = function () {
+ var writer = new WriterHelper();
+ writer.writeVarintNum(this.nVersion)
+ writer.writeVarintNum(this.nTxType)
+ var heightBuf = Util.writeVarInt(4, this.nValidHeight)
+ writer.write(heightBuf)
+
+ if (this.srcRegId != null && !_.isEmpty(this.srcRegId)) {
+ var REGID = Util.splitRegID(this.srcRegId)
+ if (_.isNull(REGID.height) || _.isUndefined(REGID.height))
+ return false
+ var regWriter = new BufferWriter()
+ var regHeightBuf = Util.writeVarInt(4, REGID.height)
+ regWriter.write(regHeightBuf)
+ var regIndexBuf = Util.writeVarInt(2, REGID.index)
+ regWriter.write(regIndexBuf)
+
+ var regBuf = regWriter.toBuffer()
+ writer.writeUInt8(regBuf.length)
+ writer.write(regBuf)
+ } else if (this.publicKey != null && !_.isEmpty(this, this.publicKey)) {
+ var pubKey = Buffer.from(this.publicKey, 'hex')
+ writer.writeUInt8(pubKey.length)
+ writer.write(pubKey)
+ } else {
+ return false;
+ }
+
+ if (this.feesCoinType == null || _.isEmpty(this.feesCoinType)) return fasle;
+ writer.writeString(this.feesCoinType)
+
+ var feesBuf = Util.writeVarInt(8, this.fees)
+ writer.write(feesBuf)
+ writer.writeDestArrData(this.destArr)
+ var len = 0
+ var buf = this.memo
+ if (!_.isEmpty(this.memo)) {
+ if (!bufferUtil.isBuffer(buf)) {
+ buf = Buffer.from(buf)
+ }
+ len = buf.length
+ }
+ writer.writeVarintNum(len)
+ if (len > 0) {
+ writer.write(buf)
+ }
+
+ var serialBuf = writer.toBuffer()
+
+ return Hash.sha256sha256(serialBuf);
+}
+
+UCoinTransferTx.prototype._Signtx = function (privateKey) {
+ var hashbuf = this._SignatureHash()
+ var sig = ECDSA.sign(hashbuf, privateKey, 'endian')
+ var sigBuf = sig.toBuffer()
+
+ return sigBuf;
+}
+
+UCoinTransferTx.prototype.SerializeTx = function (privateKey) {
+ var writer = new WriterHelper();
+ writer.writeVarintNum(this.nTxType)
+ writer.writeVarintNum(this.nVersion)
+ var heightBuf = Util.writeVarInt(4, this.nValidHeight)
+ writer.write(heightBuf)
+
+
+ if (this.srcRegId != null && !_.isEmpty(this.srcRegId)) {
+ var REGID = Util.splitRegID(this.srcRegId)
+ if (_.isNull(REGID.height) || _.isUndefined(REGID.height))
+ return false
+ var regWriter = new BufferWriter()
+ var regHeightBuf = Util.writeVarInt(4, REGID.height)
+ regWriter.write(regHeightBuf)
+ var regIndexBuf = Util.writeVarInt(2, REGID.index)
+ regWriter.write(regIndexBuf)
+
+ var regBuf = regWriter.toBuffer()
+ writer.writeUInt8(regBuf.length)
+ writer.write(regBuf)
+ } else if (this.publicKey != null && !_.isEmpty(this, this.publicKey)) {
+ var pubKey = Buffer.from(this.publicKey, 'hex')
+ writer.writeUInt8(pubKey.length)
+ writer.write(pubKey)
+ } else {
+ return false;
+ }
+
+ if (this.feesCoinType == null || _.isEmpty(this.feesCoinType)) return fasle;
+ writer.writeString(this.feesCoinType)
+
+ if (! /^[1-9]*[1-9][0-9]*$/.test(this.fees))
+ return false;
+ var feesBuf = Util.writeVarInt(8, this.fees)
+ writer.write(feesBuf)
+ writer.writeDestArrData(this.destArr)
+ var len = 0
+ var buf = this.memo
+ if (!_.isEmpty(this.memo)) {
+ if (!bufferUtil.isBuffer(buf)) {
+ buf = Buffer.from(buf)
+ }
+ len = buf.length
+ }
+ writer.writeVarintNum(len)
+ if (len > 0) {
+ writer.write(buf)
+ }
+
+
+
+ var sigBuf = this._Signtx(privateKey)
+
+ var len = sigBuf.length
+ writer.writeVarintNum(len)
+ writer.write(sigBuf)
+
+
+ var hexBuf = writer.toBuffer()
+ var hex = hexBuf.toString('hex')
+
+ return hex
+}
+
+
+module.exports = UCoinTransferTx;
\ No newline at end of file
diff --git a/lib/transaction/ucontractinvoketx.js b/src/lib/transaction/ucontractinvoketx.js
similarity index 72%
rename from lib/transaction/ucontractinvoketx.js
rename to src/lib/transaction/ucontractinvoketx.js
index 9f7adce..2ee9467 100644
--- a/lib/transaction/ucontractinvoketx.js
+++ b/src/lib/transaction/ucontractinvoketx.js
@@ -21,9 +21,9 @@ var UContractTx = function UContractTx(arg) {
this.destRegId = info.destRegId;
this.fees = info.fees;
this.value = info.value;
- this.feesCoinType=info.feesCoinType;
- this.publicKey=info.publicKey;
- this.coinType=info.coinType;
+ this.feesCoinType = info.feesCoinType;
+ this.publicKey = info.publicKey;
+ this.coinType = info.coinType;
this.vContract = info.vContract;
return this;
@@ -64,28 +64,28 @@ UContractTx._fromObject = function _fromObject(data) {
destRegId: data.destRegId,
fees: data.fees,
value: data.value,
- publicKey:data.publicKey,
- coinType:data.coinType,
- feesCoinType:data.feesCoinType,
+ publicKey: data.publicKey,
+ coinType: data.coinType,
+ feesCoinType: data.feesCoinType,
vContract: contract
};
return info;
};
-UContractTx.prototype._SignatureHash = function() {
+UContractTx.prototype._SignatureHash = function () {
var writer = new WriterHelper();
writer.writeVarInt(4, this.nVersion)
writer.writeUInt8(this.nTxType)
writer.writeVarInt(4, this.nValidHeight)
-
- if(this.srcRegId!=null&&!_.isEmpty(this.srcRegId)){
- writer.writeRegId(this.srcRegId)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
+
+ if (this.srcRegId != null && !_.isEmpty(this.srcRegId)) {
+ writer.writeRegId(this.srcRegId)
+ } else if (this.publicKey != null && !_.isEmpty(this, this.publicKey)) {
+ var pubKey = Buffer.from(this.publicKey, 'hex')
writer.writeUInt8(pubKey.length)
writer.write(pubKey)
- }else{
- return false;
+ } else {
+ return false;
}
writer.writeRegId(this.destRegId)
@@ -102,7 +102,7 @@ UContractTx.prototype._SignatureHash = function() {
return Hash.sha256sha256(serialBuf);
}
-UContractTx.prototype._Signtx = function(privateKey) {
+UContractTx.prototype._Signtx = function (privateKey) {
var hashbuf = this._SignatureHash()
var sig = ECDSA.sign(hashbuf, privateKey, 'endian')
var sigBuf = sig.toBuffer()
@@ -110,27 +110,27 @@ UContractTx.prototype._Signtx = function(privateKey) {
return sigBuf;
}
-UContractTx.prototype.SerializeTx = function(privateKey) {
+UContractTx.prototype.SerializeTx = function (privateKey) {
var writer = new WriterHelper();
writer.writeUInt8(this.nTxType)
writer.writeVarInt(4, this.nVersion)
writer.writeVarInt(4, this.nValidHeight)
- if(this.srcRegId!=null&&!_.isEmpty(this.srcRegId)){
+ if (this.srcRegId != null && !_.isEmpty(this.srcRegId)) {
writer.writeRegId(this.srcRegId)
- }else if (this.publicKey!=null&&!_.isEmpty(this,this.publicKey)){
- var pubKey= Buffer.from(this.publicKey, 'hex')
- writer.writeUInt8(pubKey.length)
- writer.write(pubKey)
- }else{
+ } else if (this.publicKey != null && !_.isEmpty(this, this.publicKey)) {
+ var pubKey = Buffer.from(this.publicKey, 'hex')
+ writer.writeUInt8(pubKey.length)
+ writer.write(pubKey)
+ } else {
return false;
- }
- writer.writeRegId(this.destRegId)
- writer.writeString(Buffer.from(this.vContract))
- writer.writeVarInt(8, this.fees)
- writer.writeString(Buffer.from(this.feesCoinType))
- writer.writeString(Buffer.from(this.coinType))
- writer.writeVarInt(8, this.value)
+ }
+ writer.writeRegId(this.destRegId)
+ writer.writeString(Buffer.from(this.vContract))
+ writer.writeVarInt(8, this.fees)
+ writer.writeString(Buffer.from(this.feesCoinType))
+ writer.writeString(Buffer.from(this.coinType))
+ writer.writeVarInt(8, this.value)
var sigBuf = this._Signtx(privateKey)
writer.writeBuf(sigBuf)
diff --git a/lib/transaction/unspentoutput.js b/src/lib/transaction/unspentoutput.js
similarity index 100%
rename from lib/transaction/unspentoutput.js
rename to src/lib/transaction/unspentoutput.js
diff --git a/lib/unit.js b/src/lib/unit.js
similarity index 100%
rename from lib/unit.js
rename to src/lib/unit.js
diff --git a/lib/uri.js b/src/lib/uri.js
similarity index 100%
rename from lib/uri.js
rename to src/lib/uri.js
diff --git a/lib/util/betitem.js b/src/lib/util/betitem.js
similarity index 100%
rename from lib/util/betitem.js
rename to src/lib/util/betitem.js
diff --git a/lib/util/buffer.js b/src/lib/util/buffer.js
similarity index 100%
rename from lib/util/buffer.js
rename to src/lib/util/buffer.js
diff --git a/lib/util/js.js b/src/lib/util/js.js
similarity index 100%
rename from lib/util/js.js
rename to src/lib/util/js.js
diff --git a/lib/util/preconditions.js b/src/lib/util/preconditions.js
similarity index 100%
rename from lib/util/preconditions.js
rename to src/lib/util/preconditions.js
diff --git a/lib/util/util.js b/src/lib/util/util.js
similarity index 100%
rename from lib/util/util.js
rename to src/lib/util/util.js
diff --git a/lib/util/votefund.js b/src/lib/util/votefund.js
similarity index 100%
rename from lib/util/votefund.js
rename to src/lib/util/votefund.js
diff --git a/lib/util/writerhelper.js b/src/lib/util/writerhelper.js
similarity index 94%
rename from lib/util/writerhelper.js
rename to src/lib/util/writerhelper.js
index 6ec59c0..f9afc84 100644
--- a/lib/util/writerhelper.js
+++ b/src/lib/util/writerhelper.js
@@ -103,12 +103,16 @@ WriterHelper.prototype.writeCdpAsset = function (map) {
for (var i = 0; i < delegateData.length; i++) {
var operType = this.VoteOperType.ADD_FUND;
- if (delegateData.votes < 0) {
+ if (delegateData[0].votes < 0) {
operType = this.VoteOperType.MINUS_FUND;
}
var votes_abs = Math.abs(delegateData[i].votes);
this.writeUInt8(operType);
- this.writeString(Buffer.from(delegateData[i].publicKey, 'hex'));
+ if (delegateData[i].publicKey.indexOf("-") > -1) {
+ this.writeRegId(delegateData[i].publicKey)
+ } else {
+ this.writeString(Buffer.from(delegateData[i].publicKey, 'hex'));
+ }
this.writeVarInt(8, votes_abs)
}
}
@@ -129,10 +133,10 @@ WriterHelper.prototype.writeCdpAsset = function (map) {
WriterHelper.prototype.writeAssetData = function (assetData, network) {
this.writeString(assetData.assetSymbol)
- this.writeRegId(assetData.ownerAddress)
+ this.writeRegId(assetData.ownerRegid)
this.writeString(assetData.assetName)
var minTable = 1
- if (!assetData.minTable) minTable = 0
+ if (!assetData.modifiAble) minTable = 0
this.writeUInt8(minTable)
this.writeVarInt(8, assetData.totalSupply)
}
diff --git a/lib/wiccapi.js b/src/lib/wiccapi.js
similarity index 61%
rename from lib/wiccapi.js
rename to src/lib/wiccapi.js
index 63b80ca..c072275 100644
--- a/lib/wiccapi.js
+++ b/src/lib/wiccapi.js
@@ -4,10 +4,6 @@ var _ = require('lodash');
var $ = require('./util/preconditions');
var Mnemonic = require('./mnemonic')
var Address = require('./address')
-var RegisterAccountTx = require('./transaction/registeraccounttx')
-var CommonTx = require('./transaction/commontx')
-var ContractTx = require('./transaction/contracttx')
-var DelegateTx = require('./transaction/delegatetx')
var Random = require('./crypto/random')
var Hash = require('./crypto/hash')
var buffer = require('buffer')
@@ -16,11 +12,78 @@ var aes = require('./aes-cbc')
var CryptoJS = require('crypto-js')
var HDPrivateKey = require('./hdprivatekey')
var CustomBuffer = require('./util/buffer')
-var RegisterAppTx = require('./transaction/registerapptx')
-var CpriceFeedTx = require('./transaction/cpricefeedtx')
-var UContractTx = require('./transaction/ucontractinvoketx')
-var AssetCreateTx = require('./transaction/assetcreatetx')
-var AssetUpdateTx = require('./transaction/assetupdatetx')
+
+var txMap = {
+ 2: {
+ txName: 'ACCOUNT_REGISTER_TX',
+ txAction: require('./transaction/registeraccounttx')
+ },
+ 3: {
+ txName: 'BCOIN_TRANSFER_TX',
+ txAction: require('./transaction/commontx')
+ },
+ 4: {
+ txName: 'LCONTRACT_INVOKE_TX',
+ txAction: require('./transaction/contracttx')
+ },
+ 5: {
+ txName: 'LCONTRACT_DEPLOY_TX',
+ txAction: require('./transaction/registerapptx')
+ },
+ 6: {
+ txName: 'DELEGATE_VOTE_TX',
+ txAction: require('./transaction/delegatetx')
+ },
+ 9: {
+ txName: 'ASSET_ISSUE_TX',
+ txAction: require('./transaction/assetcreatetx')
+ },
+ 10: {
+ txName: 'ASSET_UPDATE_TX',
+ txAction: require('./transaction/assetupdatetx')
+ },
+
+ 11: {
+ txName: 'UCOIN_TRANSFER_TX',
+ txAction: require('./transaction/ucointransfertx')
+ },
+ 15: {
+ txName: 'UCOIN_CONTRACT_INVOKE_TX',
+ txAction: require('./transaction/ucontractinvoketx')
+ },
+ 21: {
+ txName: 'CDP_STAKE_TX',
+ txAction: require('./transaction/cdpstaketx')
+ },
+ 22: {
+ txName: 'CDP_REDEEMP_TX',
+ txAction: require('./transaction/cdpredeemtx')
+ },
+ 23: {
+ txName: 'CDP_LIQUIDATE_TX',
+ txAction: require('./transaction/cdpliquidatetx')
+ },
+ 84: {
+ txName: 'DEX_LIMIT_BUY_ORDER_TX',
+ txAction: require('./transaction/dexbuylimitordertx')
+ },
+ 85: {
+ txName: ' DEX_LIMIT_SELL_ORDER_TX',
+ txAction: require('./transaction/dexselllimitordertx')
+ },
+ 86: {
+ txName: 'DEX_MARKET_BUY_ORDER_TX',
+ txAction: require('./transaction/dexbuymarketordertx')
+ },
+ 87: {
+ txName: 'DEX_MARKET_SELL_ORDER_TX',
+ txAction: require('./transaction/dexsellmarketordertx')
+ },
+ 88: {
+ txName: 'DEX_CANCEL_ORDER_TX',
+ txAction: require('./transaction/dexcancelordertx')
+ }
+}
var WiccApi = function WiccApi(arg) {
if (!(this instanceof WiccApi)) {
@@ -50,13 +113,58 @@ WiccApi._fromObject = function _fromObject(data) {
return info;
};
-WiccApi.prototype.createAllCoinMnemonicCode = function () {
- var code = new Mnemonic(Mnemonic.Words.ENGLISH)
+WiccApi.prototype.getBIP44Path = function () {
+ return this.network === "testnet" ? "m/44'/99999'/0'/0/0" : "m/44'/99999'/0'/0/0"
+}
+
+WiccApi.prototype.createAllCoinMnemonicCode = function (language) {
+ language = language || "ENGLISH"
+ var code = new Mnemonic(Mnemonic.Words[language])
var strCode = code.toString()
return strCode
}
+WiccApi.prototype.getMnemonicCodeLanguage = function (mnemonic) {
+ let lang
+ var dicts = Object.keys(Mnemonic.Words);
+ for (var i = 0; i < dicts.length; i++) {
+ var key = dicts[i];
+ if (Mnemonic._belongsToWordlist(mnemonic, Mnemonic.Words[key])) {
+ lang = key
+ break
+ }
+ }
+ return lang
+}
+
+WiccApi.prototype.switchMnemonicCode = function (mnemonic, targetLanguage) {
+ if (!targetLanguage) return mnemonic
+ var lang = ""
+ var ret = []
+ var indexArr = []
+ var dicts = Object.keys(Mnemonic.Words);
+ if (dicts.indexOf(targetLanguage) === -1) {
+ throw `${targetLanguage} is not supported`
+ }
+ for (var i = 0; i < dicts.length; i++) {
+ var key = dicts[i];
+ if (Mnemonic._belongsToWordlist(mnemonic, Mnemonic.Words[key])) {
+ lang = key
+ break
+ }
+ }
+ if (lang === targetLanguage) return mnemonic;
+ var wordArr = mnemonic.split(" ")
+ indexArr = wordArr.map(item => {
+ return Mnemonic.Words[lang].indexOf(item)
+ })
+ indexArr.map(item => {
+ ret.push(Mnemonic.Words[targetLanguage][item])
+ })
+ return ret.join(" ")
+}
+
WiccApi.prototype.checkMnemonicCode = function (mnemonic) {
return Mnemonic.isValid(mnemonic)
}
@@ -66,20 +174,23 @@ WiccApi.prototype.validateAddress = function (address) {
}
WiccApi.prototype.getPriKeyFromMnemonicCode = function (mnemonic) {
+ mnemonic = this.switchMnemonicCode(mnemonic, "ENGLISH")
var code = new Mnemonic(mnemonic)
var xpriv = code.toHDPrivateKey(null, this.network);
- var p = xpriv.deriveChild("m/44'/99999'/0'/0/0");
+ var p = xpriv.deriveChild(this.getBIP44Path());
return p.privateKey.toWIF()
}
WiccApi.prototype.getAddressFromMnemonicCode = function (mnemonic) {
+ mnemonic = this.switchMnemonicCode(mnemonic, "ENGLISH")
var code = new Mnemonic(mnemonic)
var xpriv = code.toHDPrivateKey(null, this.network);
- var p = xpriv.deriveChild("m/44'/99999'/0'/0/0");
+ var p = xpriv.deriveChild(this.getBIP44Path());
return p.privateKey.toAddress()
}
WiccApi.prototype.createWallet = function (mnemonic, password) {
+ mnemonic = this.switchMnemonicCode(mnemonic, "ENGLISH")
var salt = Random.getRandomBuffer(8)
var passbuf = new buffer.Buffer(password, 'utf8');
@@ -91,7 +202,7 @@ WiccApi.prototype.createWallet = function (mnemonic, password) {
var seed = code.toSeed()
var xpriv = code.toHDPrivateKey(null, this.network);
- var p = xpriv.deriveChild("m/44'/99999'/0'/0/0");
+ var p = xpriv.deriveChild(this.getBIP44Path());
var address = p.privateKey.toAddress()
var strAddress = address.toString()
@@ -236,7 +347,7 @@ WiccApi.prototype.getPriKeyFromSeed = function (seedinfo, password) {
*/
var xpriv = HDPrivateKey.fromSeed(seed, this.network);
- var p = xpriv.deriveChild("m/44'/99999'/0'/0/0");
+ var p = xpriv.deriveChild(this.getBIP44Path());
return p.privateKey.toWIF()
}
@@ -330,118 +441,18 @@ WiccApi.prototype.changePassword = function (seedinfo, oldpassword, newpassword)
return newseedinfo
}
-WiccApi.prototype.createSignTransaction = function (privkey, txType, txData) {
- if (txType == WiccApi.REGISTER_ACCOUNT_TX) {
- var register = new RegisterAccountTx(txData)
- return register.SerializeTx(privkey)
- }
- else if (txType == WiccApi.COMMON_TX) {
- var commonTx = new CommonTx(txData)
- return commonTx.SerializeTx(privkey)
- }
- else if (txType == WiccApi.CONTRACT_TX) {
- var contractTx = new ContractTx(txData)
- return contractTx.SerializeTx(privkey)
- }
- else if (txType == WiccApi.REG_APP_TX) {
- var registerAppTx = new RegisterAppTx(txData)
- return registerAppTx.SerializeTx(privkey)
- }
- else if (txType == WiccApi.DELEGATE_TX) {
- var delegateTx = new DelegateTx(txData)
- return delegateTx.SerializeTx(privkey)
- } else if (txType == WiccApi.PRICE_FEED_TX) {
- var cPriceFeedTx = new CpriceFeedTx(txData)
- return cPriceFeedTx.SerializeTx(privkey)
- } else if (txType == WiccApi.UCOIN_CONTRACT_INVOKE_TX) {
- var ucontractTx = new UContractTx(txData)
- return ucontractTx.SerializeTx(privkey)
- }
- else if (txType == WiccApi.ASSET_ISUUE) {
- var assetIssueTx = new AssetCreateTx(txData)
- return assetIssueTx.SerializeTx(privkey)
- } else if (txType == WiccApi.ASSET_UPDATE) {
- var assetUpdateTx = new AssetUpdateTx(txData)
- return assetUpdateTx.SerializeTx(privkey)
- }
+WiccApi.prototype.createSignTransaction = function (privkey, txData) {
+ var txConstructor = txMap[txData.nTxType].txAction
+ var txBody = new txConstructor(txData)
+ return txBody.SerializeTx(privkey)
}
WiccApi.PROTOCAL_VERSION = 1;
-WiccApi.REGISTER_ACCOUNT_TX = 2;
-WiccApi.COMMON_TX = 3;
-WiccApi.CONTRACT_TX = 4;
-WiccApi.REG_APP_TX = 5, //!< register app
- WiccApi.DELEGATE_TX = 6;
-
-WiccApi.FCOIN_STAKE_TX = 8;
-
-WiccApi.ASSET_ISUUE = 9;
-WiccApi.ASSET_UPDATE = 10;
-
-WiccApi.UCOIN_TRANSFER_TX = 11;
-WiccApi.UCOIN_CONTRACT_INVOKE_TX = 15;
-WiccApi.PRICE_FEED_TX = 16;
-
-WiccApi.CDP_STAKE_TX = 21;
-WiccApi.CDP_REDEEMP_TX = 22;
-WiccApi.CDP_LIQUIDATE_TX = 23;
-
-WiccApi.DEX_SETTLE_TX = 89; //!< dex settle Tx
-WiccApi.DEX_CANCEL_ORDER_TX = 88; //!< dex cancel order Tx
-WiccApi.DEX_BUY_LIMIT_ORDER_TX = 84; //!< dex buy limit price order Tx
-WiccApi.DEX_SELL_LIMIT_ORDER_TX = 85; //!< dex sell limit price order Tx
-WiccApi.DEX_BUY_MARKET_ORDER_TX = 86; //!< dex buy market price order Tx
-WiccApi.DEX_SELL_MARKET_ORDER_TX = 87; //!< dex sell market price order Tx
-
-
-//彩种
-WiccApi.LOTTERY_FOOTBALL = 1; //足彩
-WiccApi.LOTTERY_BASKETBALL = 2; //篮彩
-
-//足彩玩法
-WiccApi.PLAY_FOOTBALL_SPF = 1; // 胜平负
-WiccApi.PLAY_FOOTBALL_TOTAL_NUM = 2; //总进球
-WiccApi.PLAY_FOOTBALL_ODD_EVEN = 3; //单双
-WiccApi.PLAY_FOOTBALL_HALF = 4; //半全场
-
-//足彩胜平负投注方案
-WiccApi.FOOTBALL_SPF_WIN = 1; //主胜
-WiccApi.FOOTBALL_SPF_EVEN = 2; //平
-WiccApi.FOOTBALL_SPF_LOSE = 3; //主负
-
-//足彩总进球投注方案
-WiccApi.FOOTBALL_TOTAL_0 = 1; //大于2.5个
-WiccApi.FOOTBALL_TOTAL_1 = 2; //小于2.5个
-
-//足彩单双投注方案
-WiccApi.FOOTBALL_ODD_EVEN_ODD = 1; //单
-WiccApi.FOOTBALL_ODD_EVEN_EVEN = 2; //双
-
-//足彩半全场投注方案
-WiccApi.FOOTBALL_HALF_GOAL = 1; //进球
-WiccApi.FOOTBALL_HALF_NO_GOAL = 2; //没有进球
-
-//篮彩玩法
-WiccApi.PLAY_BASKETBALL_SF = 1; //胜负
-WiccApi.PLAY_BASKETBALL_RSF = 2; //让分胜负
-WiccApi.PLAY_BASKETBALL_TOTAL_SCORE = 3; //总得分
-WiccApi.PLAY_BASKETBALL_ODD_EVEN = 4; //单双
-
-//篮彩胜负投注方案
-WiccApi.BASKETBALL_SF_WIN = 1; //胜
-WiccApi.BASKETBALL_SF_LOSE = 2; //负
-
-//篮彩让分胜负投注方案
-WiccApi.BASKETBALL_RSF_WIN = 1; //胜
-WiccApi.BASKETBALL_RSF_LOSE = 2; //负
-
-//篮彩总得分投注方案
-WiccApi.BASKETBALL_TOTAL_SCORE_GREATER = 1; //大于215.5分
-WiccApi.BASKETBALL_TOTAL_SCORE_LESS = 2; //小于215.5分
-
-//篮彩单双投注方案
-WiccApi.BASKETBALL_ODD_EVEN_ODD = 1; //单
-WiccApi.BASKETBALL_ODD_EVEN_EVEN = 2; //双
+//设置交易类型
+// set transaction type
+for (var item in txMap) {
+ WiccApi[txMap[item].txName] = Number(item)
+}
module.exports = WiccApi;
diff --git a/lib/words/chinese.js b/src/lib/words/chinese.js
similarity index 100%
rename from lib/words/chinese.js
rename to src/lib/words/chinese.js
diff --git a/lib/words/english.js b/src/lib/words/english.js
similarity index 100%
rename from lib/words/english.js
rename to src/lib/words/english.js
diff --git a/lib/words/french.js b/src/lib/words/french.js
similarity index 100%
rename from lib/words/french.js
rename to src/lib/words/french.js
diff --git a/lib/words/index.js b/src/lib/words/index.js
similarity index 100%
rename from lib/words/index.js
rename to src/lib/words/index.js
diff --git a/lib/words/italian.js b/src/lib/words/italian.js
similarity index 100%
rename from lib/words/italian.js
rename to src/lib/words/italian.js
diff --git a/lib/words/japanese.js b/src/lib/words/japanese.js
similarity index 100%
rename from lib/words/japanese.js
rename to src/lib/words/japanese.js
diff --git a/lib/words/spanish.js b/src/lib/words/spanish.js
similarity index 100%
rename from lib/words/spanish.js
rename to src/lib/words/spanish.js
diff --git a/src/transactionParams.js b/src/transactionParams.js
new file mode 100644
index 0000000..b15385e
--- /dev/null
+++ b/src/transactionParams.js
@@ -0,0 +1,255 @@
+var PrivateKey = require('../src/lib/privatekey');
+
+var transactionParams = function (arg, wallet) {
+ let txParams = {}
+ txParams.nVersion = 1
+ txParams.nTxType = arg.nTxType
+
+ var txParamsHandlerMap = {
+ 2: {
+ name: 'ACCOUNT_REGISTER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.pubkey = pubkey
+ txParams.minerPubkey = ""
+ txParams = Object.assign(txParams, arg)
+ }
+ },
+ 3: {
+ name: 'BCOIN_TRANSFER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.destAddr = arg.destAddr
+ txParams.value = arg.amount
+ txParams.memo = arg.memo
+ txParams.pubkey = pubkey
+ }
+ },
+ 4: {
+ name: 'LCONTRACT_INVOKE_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.srcRegId = arg.srcRegId
+ txParams.destRegId = arg.appId
+ txParams.fees = arg.fees
+ txParams.value = arg.amount
+ txParams.vContract = arg.vContract
+ txParams.publicKey = pubkey
+ }
+ },
+ 5: {
+ name: 'LCONTRACT_DEPLOY_TX',
+ handler: () => {
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.regAcctId = arg.srcRegId
+ txParams.script = arg.vContract
+ txParams.scriptDesc = arg.description
+ txParams.fees = arg.fees
+ }
+ },
+ 6: {
+ name: 'DELEGATE_VOTE_TX',
+ handler: () => {
+ let list = []
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.srcRegId = arg.userId
+ txParams.fees = arg.fees
+ txParams.publicKey = pubkey
+ arg.voteLists.map(item => {
+ list.push({
+ publicKey: item.srcRegId,
+ votes: item.voteValue
+ })
+ })
+ txParams.delegateData = list.slice()
+ }
+ },
+ 9: {
+ name: 'ASSET_ISSUE_TX',
+ handler: () => {
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.srcRegId = arg.srcRegId
+ txParams.assetData = arg.asset
+ txParams.feesCoinSymbol = arg.feeSymbol
+ txParams.fees = arg.fees
+ }
+ },
+ 10: {
+ name: 'ASSET_UPDATE_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.srcRegId = arg.srcRegId
+ txParams.assetUpdateData = arg.updateData
+ txParams.feesCoinSymbol = arg.feeSymbol
+ txParams.assetSymbol = arg.assetSymbol
+ txParams.fees = arg.fees
+ }
+ },
+
+ 11: {
+ name: 'UCOIN_TRANSFER_TX',
+ handler: () => {
+ let list = []
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.memo = arg.memo
+ txParams.feesCoinType = arg.feeSymbol
+ arg.dests.map(item => {
+ list.push({
+ coinType: item.coinSymbol,
+ destAddr: item.destAddress,
+ value: item.transferAmount
+ })
+ })
+ txParams.destArr = list.slice()
+ }
+ },
+ 15: {
+ name: 'UCOIN_CONTRACT_INVOKE_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.srcRegId = arg.srcRegId
+ txParams.destRegId = arg.appId
+ txParams.feesCoinType = arg.feeSymbol
+ txParams.coinType = arg.coinSymbol
+ txParams.fees = arg.fees
+ txParams.value = arg.amount
+ txParams.vContract = arg.vContract
+ }
+ },
+ 21: {
+ name: 'CDP_STAKE_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.txUid = arg.srcRegId
+ txParams.fees = arg.fees
+ txParams.fee_symbol = arg.feeSymbol
+ if (arg.cdpTxId) {
+ txParams.cdpTxId = arg.cdpTxId
+ }
+ txParams.assetMap = arg.assetMap
+ txParams.scoin_symbol = arg.sCoinSymbol
+ txParams.scoinsToMint = arg.sCoinToMint
+ }
+ },
+ 22: {
+ name: 'CDP_REDEEMP_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.txUid = arg.srcRegId
+ txParams.fees = arg.fees
+ txParams.cdpTxId = arg.cdpTxId
+ txParams.fee_symbol = arg.feeSymbol
+ txParams.scoins_to_repay = arg.sCoinsToRepay
+ txParams.assetMap = arg.assetMap
+ }
+ },
+ 23: {
+ name: 'CDP_LIQUIDATE_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.txUid = arg.srcRegId
+ txParams.fees = arg.fees
+ txParams.fee_symbol = arg.feeSymbol
+ txParams.cdpTxId = arg.cdpTxId
+ txParams.scoinsToLiquidate = arg.sCoinsToLiquidate
+ txParams.assetSymbol = arg.liquidateAssetSymbol
+
+ }
+ },
+ 84: {
+ name: 'DEX_LIMIT_BUY_ORDER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.feeSymbol = arg.feeSymbol
+ txParams.coinSymbol = arg.coinSymbol
+ txParams.assetSymbol = arg.assetSymbol
+ txParams.assetAmount = arg.assetAmount
+ txParams.bidPrice = arg.price
+ }
+ },
+ 85: {
+ name: 'DEX_LIMIT_SELL_ORDER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.feeSymbol = arg.feeSymbol
+ txParams.coinSymbol = arg.coinSymbol
+ txParams.assetSymbol = arg.assetSymbol
+ txParams.assetAmount = arg.assetAmount
+ txParams.askPrice = arg.price
+ }
+ },
+ 86: {
+ name: 'DEX_MARKET_BUY_ORDER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.feeSymbol = arg.feeSymbol
+ txParams.coinSymbol = arg.coinSymbol
+ txParams.assetSymbol = arg.assetSymbol
+ txParams.coinAmount = arg.assetAmount
+ }
+ },
+ 87: {
+ name: 'DEX_MARKET_SELL_ORDER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.srcRegId = arg.srcRegId
+ txParams.feeSymbol = arg.feeSymbol
+ txParams.coinSymbol = arg.coinSymbol
+ txParams.assetSymbol = arg.assetSymbol
+ txParams.assetAmount = arg.assetAmount
+ }
+ },
+ 88: {
+ name: 'DEX_CANCEL_ORDER_TX',
+ handler: () => {
+ let pubkey = wallet.publicKeyAsHex().toString()
+ txParams.publicKey = pubkey
+ txParams.nValidHeight = arg.nValidHeight
+ txParams.fees = arg.fees
+ txParams.feeSymbol = arg.feeSymbol
+ txParams.srcRegId = arg.srcRegId
+ txParams.orderId = arg.orderId
+ }
+ }
+ }
+
+ txParamsHandlerMap[txParams.nTxType].handler()
+
+ return txParams
+}
+
+module.exports = transactionParams
\ No newline at end of file
diff --git a/test/address.js b/test/address.js
deleted file mode 100644
index feb5cab..0000000
--- a/test/address.js
+++ /dev/null
@@ -1,572 +0,0 @@
-'use strict';
-
-/* jshint maxstatements: 30 */
-
-var chai = require('chai');
-var should = chai.should();
-var expect = chai.expect;
-
-var bitcore = require('..');
-var PublicKey = bitcore.PublicKey;
-var Address = bitcore.Address;
-var Script = bitcore.Script;
-var Networks = bitcore.Networks;
-
-var validbase58 = require('./data/bitcoind/base58_keys_valid.json');
-var invalidbase58 = require('./data/bitcoind/base58_keys_invalid.json');
-
-describe('Address', function() {
-
- var pubkeyhash = new Buffer('3c3fa3d4adcaf8f52d5b1843975e122548269937', 'hex');
- var buf = Buffer.concat([new Buffer([0]), pubkeyhash]);
- var str = '16VZnHwRhwrExfeHFHGjwrgEMq8VcYPs9r';
-
- it('can\'t build without data', function() {
- (function() {
- return new Address();
- }).should.throw('First argument is required, please include address data.');
- });
-
- it('should throw an error because of bad network param', function() {
- (function() {
- return new Address(PKHLivenet[0], 'main', 'pubkeyhash');
- }).should.throw('Second argument must be "livenet" or "testnet".');
- });
-
- it('should throw an error because of bad type param', function() {
- (function() {
- return new Address(PKHLivenet[0], 'livenet', 'pubkey');
- }).should.throw('Third argument must be "pubkeyhash" or "scripthash"');
- });
-
- describe('bitcoind compliance', function() {
- validbase58.map(function(d) {
- if (!d[2].isPrivkey) {
- it('should describe address ' + d[0] + ' as valid', function() {
- var type;
- if (d[2].addrType === 'script') {
- type = 'scripthash';
- } else if (d[2].addrType === 'pubkey') {
- type = 'pubkeyhash';
- }
- var network = 'livenet';
- if (d[2].isTestnet) {
- network = 'testnet';
- }
- return new Address(d[0], network, type);
- });
- }
- });
- invalidbase58.map(function(d) {
- it('should describe input ' + d[0].slice(0, 10) + '... as invalid', function() {
- expect(function() {
- return new Address(d[0]);
- }).to.throw(Error);
- });
- });
- });
-
- // livenet valid
- var PKHLivenet = [
- '15vkcKf7gB23wLAnZLmbVuMiiVDc1Nm4a2',
- '1A6ut1tWnUq1SEQLMr4ttDh24wcbJ5o9TT',
- '1BpbpfLdY7oBS9gK7aDXgvMgr1DPvNhEB2',
- '1Jz2yCRd5ST1p2gUqFB5wsSQfdm3jaFfg7',
- ' 1Jz2yCRd5ST1p2gUqFB5wsSQfdm3jaFfg7 \t\n'
- ];
-
- // livenet p2sh
- var P2SHLivenet = [
- '342ftSRCvFHfCeFFBuz4xwbeqnDw6BGUey',
- '33vt8ViH5jsr115AGkW6cEmEz9MpvJSwDk',
- '37Sp6Rv3y4kVd1nQ1JV5pfqXccHNyZm1x3',
- '3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy',
- '\t \n3QjYXhTkvuj8qPaXHTTWb5wjXhdsLAAWVy \r'
- ];
-
- // testnet p2sh
- var P2SHTestnet = [
- '2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C',
- '2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda',
- '2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN',
- '2NB72XtkjpnATMggui83aEtPawyyKvnbX2o'
- ];
-
- //livenet bad checksums
- var badChecksums = [
- '15vkcKf7gB23wLAnZLmbVuMiiVDc3nq4a2',
- '1A6ut1tWnUq1SEQLMr4ttDh24wcbj4w2TT',
- '1BpbpfLdY7oBS9gK7aDXgvMgr1DpvNH3B2',
- '1Jz2yCRd5ST1p2gUqFB5wsSQfdmEJaffg7'
- ];
-
- //livenet non-base58
- var nonBase58 = [
- '15vkcKf7g#23wLAnZLmb$uMiiVDc3nq4a2',
- '1A601ttWnUq1SEQLMr4ttDh24wcbj4w2TT',
- '1BpbpfLdY7oBS9gK7aIXgvMgr1DpvNH3B2',
- '1Jz2yCRdOST1p2gUqFB5wsSQfdmEJaffg7'
- ];
-
- //testnet valid
- var PKHTestnet = [
- 'n28S35tqEMbt6vNad7A5K3mZ7vdn8dZ86X',
- 'n45x3R2w2jaSC62BMa9MeJCd3TXxgvDEmm',
- 'mursDVxqNQmmwWHACpM9VHwVVSfTddGsEM',
- 'mtX8nPZZdJ8d3QNLRJ1oJTiEi26Sj6LQXS'
- ];
-
- describe('validation', function() {
-
- it('getValidationError detects network mismatchs', function() {
- var error = Address.getValidationError('37BahqRsFrAd3qLiNNwLNV3AWMRD7itxTo', 'testnet');
- should.exist(error);
- });
-
- it('isValid returns true on a valid address', function() {
- var valid = Address.isValid('37BahqRsFrAd3qLiNNwLNV3AWMRD7itxTo', 'livenet');
- valid.should.equal(true);
- });
-
- it('isValid returns false on network mismatch', function() {
- var valid = Address.isValid('37BahqRsFrAd3qLiNNwLNV3AWMRD7itxTo', 'testnet');
- valid.should.equal(false);
- });
-
- it('validates correctly the P2PKH test vector', function() {
- for (var i = 0; i < PKHLivenet.length; i++) {
- var error = Address.getValidationError(PKHLivenet[i]);
- should.not.exist(error);
- }
- });
-
- it('validates correctly the P2SH test vector', function() {
- for (var i = 0; i < P2SHLivenet.length; i++) {
- var error = Address.getValidationError(P2SHLivenet[i]);
- should.not.exist(error);
- }
- });
-
- it('validates correctly the P2SH testnet test vector', function() {
- for (var i = 0; i < P2SHTestnet.length; i++) {
- var error = Address.getValidationError(P2SHTestnet[i], 'testnet');
- should.not.exist(error);
- }
- });
-
- it('rejects correctly the P2PKH livenet test vector with "testnet" parameter', function() {
- for (var i = 0; i < PKHLivenet.length; i++) {
- var error = Address.getValidationError(PKHLivenet[i], 'testnet');
- should.exist(error);
- }
- });
-
- it('validates correctly the P2PKH livenet test vector with "livenet" parameter', function() {
- for (var i = 0; i < PKHLivenet.length; i++) {
- var error = Address.getValidationError(PKHLivenet[i], 'livenet');
- should.not.exist(error);
- }
- });
-
- it('should not validate if checksum is invalid', function() {
- for (var i = 0; i < badChecksums.length; i++) {
- var error = Address.getValidationError(badChecksums[i], 'livenet', 'pubkeyhash');
- should.exist(error);
- error.message.should.equal('Checksum mismatch');
- }
- });
-
- it('should not validate on a network mismatch', function() {
- var error, i;
- for (i = 0; i < PKHLivenet.length; i++) {
- error = Address.getValidationError(PKHLivenet[i], 'testnet', 'pubkeyhash');
- should.exist(error);
- error.message.should.equal('Address has mismatched network type.');
- }
- for (i = 0; i < PKHTestnet.length; i++) {
- error = Address.getValidationError(PKHTestnet[i], 'livenet', 'pubkeyhash');
- should.exist(error);
- error.message.should.equal('Address has mismatched network type.');
- }
- });
-
- it('should not validate on a type mismatch', function() {
- for (var i = 0; i < PKHLivenet.length; i++) {
- var error = Address.getValidationError(PKHLivenet[i], 'livenet', 'scripthash');
- should.exist(error);
- error.message.should.equal('Address has mismatched type.');
- }
- });
-
- it('should not validate on non-base58 characters', function() {
- for (var i = 0; i < nonBase58.length; i++) {
- var error = Address.getValidationError(nonBase58[i], 'livenet', 'pubkeyhash');
- should.exist(error);
- error.message.should.equal('Non-base58 character');
- }
- });
-
- it('testnet addresses are validated correctly', function() {
- for (var i = 0; i < PKHTestnet.length; i++) {
- var error = Address.getValidationError(PKHTestnet[i], 'testnet');
- should.not.exist(error);
- }
- });
-
- it('addresses with whitespace are validated correctly', function() {
- var ws = ' \r \t \n 1A6ut1tWnUq1SEQLMr4ttDh24wcbJ5o9TT \t \n \r';
- var error = Address.getValidationError(ws);
- should.not.exist(error);
- Address.fromString(ws).toString().should.equal('1A6ut1tWnUq1SEQLMr4ttDh24wcbJ5o9TT');
- });
- });
-
- describe('instantiation', function() {
- it('can be instantiated from another address', function() {
- var address = Address.fromBuffer(buf);
- var address2 = new Address({
- hashBuffer: address.hashBuffer,
- network: address.network,
- type: address.type
- });
- address.toString().should.equal(address2.toString());
- });
- });
-
- describe('encodings', function() {
-
- it('should make an address from a buffer', function() {
- Address.fromBuffer(buf).toString().should.equal(str);
- new Address(buf).toString().should.equal(str);
- new Address(buf).toString().should.equal(str);
- });
-
- it('should make an address from a string', function() {
- Address.fromString(str).toString().should.equal(str);
- new Address(str).toString().should.equal(str);
- });
-
- it('should make an address using a non-string network', function() {
- Address.fromString(str, Networks.livenet).toString().should.equal(str);
- });
-
- it('should throw with bad network param', function() {
- (function(){
- Address.fromString(str, 'somenet');
- }).should.throw('Unknown network');
- });
-
- it('should error because of unrecognized data format', function() {
- (function() {
- return new Address(new Error());
- }).should.throw(bitcore.errors.InvalidArgument);
- });
-
- it('should error because of incorrect format for pubkey hash', function() {
- (function() {
- return new Address.fromPublicKeyHash('notahash');
- }).should.throw('Address supplied is not a buffer.');
- });
-
- it('should error because of incorrect format for script hash', function() {
- (function() {
- return new Address.fromScriptHash('notascript');
- }).should.throw('Address supplied is not a buffer.');
- });
-
- it('should error because of incorrect type for transform buffer', function() {
- (function() {
- return Address._transformBuffer('notabuffer');
- }).should.throw('Address supplied is not a buffer.');
- });
-
- it('should error because of incorrect length buffer for transform buffer', function() {
- (function() {
- return Address._transformBuffer(new Buffer(20));
- }).should.throw('Address buffers must be exactly 21 bytes.');
- });
-
- it('should error because of incorrect type for pubkey transform', function() {
- (function() {
- return Address._transformPublicKey(new Buffer(20));
- }).should.throw('Address must be an instance of PublicKey.');
- });
-
- it('should error because of incorrect type for script transform', function() {
- (function() {
- return Address._transformScript(new Buffer(20));
- }).should.throw('Invalid Argument: script must be a Script instance');
- });
-
- it('should error because of incorrect type for string transform', function() {
- (function() {
- return Address._transformString(new Buffer(20));
- }).should.throw('data parameter supplied is not a string.');
- });
-
- it('should make an address from a pubkey hash buffer', function() {
- var hash = pubkeyhash; //use the same hash
- var a = Address.fromPublicKeyHash(hash, 'livenet');
- a.network.should.equal(Networks.livenet);
- a.toString().should.equal(str);
- var b = Address.fromPublicKeyHash(hash, 'testnet');
- b.network.should.equal(Networks.testnet);
- b.type.should.equal('pubkeyhash');
- new Address(hash, 'livenet').toString().should.equal(str);
- });
-
- it('should make an address using the default network', function() {
- var hash = pubkeyhash; //use the same hash
- var network = Networks.defaultNetwork;
- Networks.defaultNetwork = Networks.livenet;
- var a = Address.fromPublicKeyHash(hash);
- a.network.should.equal(Networks.livenet);
- // change the default
- Networks.defaultNetwork = Networks.testnet;
- var b = Address.fromPublicKeyHash(hash);
- b.network.should.equal(Networks.testnet);
- // restore the default
- Networks.defaultNetwork = network;
- });
-
- it('should throw an error for invalid length hashBuffer', function() {
- (function() {
- return Address.fromPublicKeyHash(buf);
- }).should.throw('Address hashbuffers must be exactly 20 bytes.');
- });
-
- it('should make this address from a compressed pubkey', function() {
- var pubkey = new PublicKey('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004');
- var address = Address.fromPublicKey(pubkey, 'livenet');
- address.toString().should.equal('19gH5uhqY6DKrtkU66PsZPUZdzTd11Y7ke');
- });
-
- it('should use the default network for pubkey', function() {
- var pubkey = new PublicKey('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004');
- var address = Address.fromPublicKey(pubkey);
- address.network.should.equal(Networks.defaultNetwork);
- });
-
- it('should make this address from an uncompressed pubkey', function() {
- var pubkey = new PublicKey('0485e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b00' +
- '4833fef26c8be4c4823754869ff4e46755b85d851077771c220e2610496a29d98');
- var a = Address.fromPublicKey(pubkey, 'livenet');
- a.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
- var b = new Address(pubkey, 'livenet', 'pubkeyhash');
- b.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
- });
-
- it('should classify from a custom network', function() {
- var custom = {
- name: 'customnetwork',
- pubkeyhash: 0x1c,
- privatekey: 0x1e,
- scripthash: 0x28,
- xpubkey: 0x02e8de8f,
- xprivkey: 0x02e8da54,
- networkMagic: 0x0c110907,
- port: 7333
- };
- var addressString = 'CX4WePxBwq1Y6u7VyMJfmmitE7GiTgC9aE';
- Networks.add(custom);
- var network = Networks.get('customnetwork');
- var address = Address.fromString(addressString);
- address.type.should.equal(Address.PayToPublicKeyHash);
- address.network.should.equal(network);
- Networks.remove(network);
- });
-
- describe('from a script', function() {
- it('should fail to build address from a non p2sh,p2pkh script', function() {
- var s = new Script('OP_CHECKMULTISIG');
- (function() {
- return new Address(s);
- }).should.throw('needs to be p2pkh in, p2pkh out, p2sh in, or p2sh out');
- });
- it('should make this address from a p2pkh output script', function() {
- var s = new Script('OP_DUP OP_HASH160 20 ' +
- '0xc8e11b0eb0d2ad5362d894f048908341fa61b6e1 OP_EQUALVERIFY OP_CHECKSIG');
- var buf = s.toBuffer();
- var a = Address.fromScript(s, 'livenet');
- a.toString().should.equal('1KK9oz4bFH8c1t6LmighHaoSEGx3P3FEmc');
- var b = new Address(s, 'livenet');
- b.toString().should.equal('1KK9oz4bFH8c1t6LmighHaoSEGx3P3FEmc');
- });
-
- it('should make this address from a p2sh input script', function() {
- var s = Script.fromString('OP_HASH160 20 0xa6ed4af315271e657ee307828f54a4365fa5d20f OP_EQUAL');
- var a = Address.fromScript(s, 'livenet');
- a.toString().should.equal('3GueMn6ruWVfQTN4XKBGEbCbGLwRSUhfnS');
- var b = new Address(s, 'livenet');
- b.toString().should.equal('3GueMn6ruWVfQTN4XKBGEbCbGLwRSUhfnS');
- });
-
- it('returns the same address if the script is a pay to public key hash out', function() {
- var address = '16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX';
- var script = Script.buildPublicKeyHashOut(new Address(address));
- Address(script, Networks.livenet).toString().should.equal(address);
- });
- it('returns the same address if the script is a pay to script hash out', function() {
- var address = '3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm';
- var script = Script.buildScriptHashOut(new Address(address));
- Address(script, Networks.livenet).toString().should.equal(address);
- });
- });
-
- it('should derive from this known address string livenet', function() {
- var address = new Address(str);
- var buffer = address.toBuffer();
- var slice = buffer.slice(1);
- var sliceString = slice.toString('hex');
- sliceString.should.equal(pubkeyhash.toString('hex'));
- });
-
- it('should derive from this known address string testnet', function() {
- var a = new Address(PKHTestnet[0], 'testnet');
- var b = new Address(a.toString());
- b.toString().should.equal(PKHTestnet[0]);
- b.network.should.equal(Networks.testnet);
- });
-
- it('should derive from this known address string livenet scripthash', function() {
- var a = new Address(P2SHLivenet[0], 'livenet', 'scripthash');
- var b = new Address(a.toString());
- b.toString().should.equal(P2SHLivenet[0]);
- });
-
- it('should derive from this known address string testnet scripthash', function() {
- var address = new Address(P2SHTestnet[0], 'testnet', 'scripthash');
- address = new Address(address.toString());
- address.toString().should.equal(P2SHTestnet[0]);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('3c3fa3d4adcaf8f52d5b1843975e122548269937 corresponds to hash 16VZnHwRhwrExfeHFHGjwrgEMq8VcYPs9r', function() {
- var address = new Address(str);
- address.toBuffer().slice(1).toString('hex').should.equal(pubkeyhash.toString('hex'));
- });
-
- });
-
- describe('#object', function() {
-
- it('roundtrip to-from-to', function() {
- var obj = new Address(str).toObject();
- var address = Address.fromObject(obj);
- address.toString().should.equal(str);
- });
-
- it('will fail with invalid state', function() {
- expect(function() {
- return Address.fromObject('¹');
- }).to.throw(bitcore.errors.InvalidState);
- });
- });
-
- describe('#toString', function() {
-
- it('livenet pubkeyhash address', function() {
- var address = new Address(str);
- address.toString().should.equal(str);
- });
-
- it('scripthash address', function() {
- var address = new Address(P2SHLivenet[0]);
- address.toString().should.equal(P2SHLivenet[0]);
- });
-
- it('testnet scripthash address', function() {
- var address = new Address(P2SHTestnet[0]);
- address.toString().should.equal(P2SHTestnet[0]);
- });
-
- it('testnet pubkeyhash address', function() {
- var address = new Address(PKHTestnet[0]);
- address.toString().should.equal(PKHTestnet[0]);
- });
-
- });
-
- describe('#inspect', function() {
- it('should output formatted output correctly', function() {
- var address = new Address(str);
- var output = '';
- address.inspect().should.equal(output);
- });
- });
-
- describe('questions about the address', function() {
- it('should detect a P2SH address', function() {
- new Address(P2SHLivenet[0]).isPayToScriptHash().should.equal(true);
- new Address(P2SHLivenet[0]).isPayToPublicKeyHash().should.equal(false);
- new Address(P2SHTestnet[0]).isPayToScriptHash().should.equal(true);
- new Address(P2SHTestnet[0]).isPayToPublicKeyHash().should.equal(false);
- });
- it('should detect a Pay To PubkeyHash address', function() {
- new Address(PKHLivenet[0]).isPayToPublicKeyHash().should.equal(true);
- new Address(PKHLivenet[0]).isPayToScriptHash().should.equal(false);
- new Address(PKHTestnet[0]).isPayToPublicKeyHash().should.equal(true);
- new Address(PKHTestnet[0]).isPayToScriptHash().should.equal(false);
- });
- });
-
- it('throws an error if it couldn\'t instantiate', function() {
- expect(function() {
- return new Address(1);
- }).to.throw(TypeError);
- });
- it('can roundtrip from/to a object', function() {
- var address = new Address(P2SHLivenet[0]);
- expect(new Address(address.toObject()).toString()).to.equal(P2SHLivenet[0]);
- });
-
- it('will use the default network for an object', function() {
- var obj = {
- hash: '19a7d869032368fd1f1e26e5e73a4ad0e474960e',
- type: 'scripthash'
- };
- var address = new Address(obj);
- address.network.should.equal(Networks.defaultNetwork);
- });
-
- describe('creating a P2SH address from public keys', function() {
-
- var public1 = '02da5798ed0c055e31339eb9b5cef0d3c0ccdec84a62e2e255eb5c006d4f3e7f5b';
- var public2 = '0272073bf0287c4469a2a011567361d42529cd1a72ab0d86aa104ecc89342ffeb0';
- var public3 = '02738a516a78355db138e8119e58934864ce222c553a5407cf92b9c1527e03c1a2';
- var publics = [public1, public2, public3];
-
- it('can create an address from a set of public keys', function() {
- var address = Address.createMultisig(publics, 2, Networks.livenet);
- address.toString().should.equal('3FtqPRirhPvrf7mVUSkygyZ5UuoAYrTW3y');
- address = new Address(publics, 2, Networks.livenet);
- address.toString().should.equal('3FtqPRirhPvrf7mVUSkygyZ5UuoAYrTW3y');
- });
-
- it('works on testnet also', function() {
- var address = Address.createMultisig(publics, 2, Networks.testnet);
- address.toString().should.equal('2N7T3TAetJrSCruQ39aNrJvYLhG1LJosujf');
- });
-
- it('can create an address from a set of public keys with a nested witness program', function() {
- var address = Address.createMultisig(publics, 2, Networks.livenet, true);
- address.toString().should.equal('3PpK1bBqUmPK3Q6QPSUK7BQSZ1DMWL6aes');
- });
-
- it('can also be created by Address.createMultisig', function() {
- var address = Address.createMultisig(publics, 2);
- var address2 = Address.createMultisig(publics, 2);
- address.toString().should.equal(address2.toString());
- });
-
- it('fails if invalid array is provided', function() {
- expect(function() {
- return Address.createMultisig([], 3, 'testnet');
- }).to.throw('Number of required signatures must be less than or equal to the number of public keys');
- });
- });
-
-});
diff --git a/test/block/block.js b/test/block/block.js
deleted file mode 100644
index d4e643f..0000000
--- a/test/block/block.js
+++ /dev/null
@@ -1,268 +0,0 @@
-'use strict';
-
-var bitcore = require('../..');
-var BN = require('../../lib/crypto/bn');
-var BufferReader = bitcore.encoding.BufferReader;
-var BufferWriter = bitcore.encoding.BufferWriter;
-var BlockHeader = bitcore.BlockHeader;
-var Block = bitcore.Block;
-var chai = require('chai');
-var fs = require('fs');
-var should = chai.should();
-var Transaction = bitcore.Transaction;
-
-// https://test-insight.bitpay.com/block/000000000b99b16390660d79fcc138d2ad0c89a0d044c4201a02bdf1f61ffa11
-var dataRawBlockBuffer = fs.readFileSync('test/data/blk86756-testnet.dat');
-var dataRawBlockBinary = fs.readFileSync('test/data/blk86756-testnet.dat', 'binary');
-var dataJson = fs.readFileSync('test/data/blk86756-testnet.json').toString();
-var data = require('../data/blk86756-testnet');
-var dataBlocks = require('../data/bitcoind/blocks');
-
-describe('Block', function() {
-
- var blockhex = data.blockhex;
- var blockbuf = new Buffer(blockhex, 'hex');
- var bh = BlockHeader.fromBuffer(new Buffer(data.blockheaderhex, 'hex'));
- var txs = [];
- JSON.parse(dataJson).transactions.forEach(function(tx) {
- txs.push(new Transaction().fromObject(tx));
- });
- var json = dataJson;
-
- var genesishex = '0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000';
- var genesisbuf = new Buffer(genesishex, 'hex');
- var genesisidhex = '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f';
- var blockOneHex = '010000006fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000982051fd1e4ba744bbbe680e1fee14677ba1a3c3540bf7b1cdb606e857233e0e61bc6649ffff001d01e362990101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0104ffffffff0100f2052a0100000043410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac00000000';
- var blockOneBuf = new Buffer(blockOneHex, 'hex');
- var blockOneId = '00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048';
-
- it('should make a new block', function() {
- var b = Block(blockbuf);
- b.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- it('should not make an empty block', function() {
- (function() {
- return new Block();
- }).should.throw('Unrecognized argument for Block');
- });
-
- describe('#constructor', function() {
-
- it('should set these known values', function() {
- var b = new Block({
- header: bh,
- transactions: txs
- });
- should.exist(b.header);
- should.exist(b.transactions);
- });
-
- it('should properly deserialize blocks', function() {
- dataBlocks.forEach(function(block) {
- var b = Block.fromBuffer(new Buffer(block.data, 'hex'));
- b.transactions.length.should.equal(block.transactions);
- });
- });
-
- });
-
- describe('#fromRawBlock', function() {
-
- it('should instantiate from a raw block binary', function() {
- var x = Block.fromRawBlock(dataRawBlockBinary);
- x.header.version.should.equal(2);
- new BN(x.header.bits).toString('hex').should.equal('1c3fffc0');
- });
-
- it('should instantiate from raw block buffer', function() {
- var x = Block.fromRawBlock(dataRawBlockBuffer);
- x.header.version.should.equal(2);
- new BN(x.header.bits).toString('hex').should.equal('1c3fffc0');
- });
-
- });
-
- describe('#fromJSON', function() {
-
- it('should set these known values', function() {
- var block = Block.fromObject(JSON.parse(json));
- should.exist(block.header);
- should.exist(block.transactions);
- });
-
- it('should set these known values', function() {
- var block = new Block(JSON.parse(json));
- should.exist(block.header);
- should.exist(block.transactions);
- });
-
- });
-
- describe('#toJSON', function() {
-
- it('should recover these known values', function() {
- var block = Block.fromObject(JSON.parse(json));
- var b = block.toJSON();
- should.exist(b.header);
- should.exist(b.transactions);
- });
-
- });
-
- describe('#fromString/#toString', function() {
-
- it('should output/input a block hex string', function() {
- var b = Block.fromString(blockhex);
- b.toString().should.equal(blockhex);
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should make a block from this known buffer', function() {
- var block = Block.fromBuffer(blockbuf);
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- it('should instantiate from block buffer from the network', function() {
- var networkBlock = '02000000e74122c23a90d7bb207fad2cfd07fbdc33de36352b5561120000000000000000d6097b7aded2327c8ca979ff85367f664879a7a7f42e1914ab880e63276b8dd1b12eff54c02e171831fb8d1ea201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5b03984b05e4b883e5bda9e7a59ee4bb99e9b1bcfabe6d6d5cb348c1c7d580627835202f5ad93c2f3db10bb850a1a513979f8328d9f35aff1000000000000000006189dd01cf00004d696e6564206279207975313333353131373131ffffffff0111622195000000001976a914c825a1ecf2a6830c4401620c3a16f1995057c2ab88ac000000000100000001a9f062bdd6bf76f3059169ce8f30905e23b08b25e30570b2baca08ff2878b0e3000000008a473044022037da4b94dfbfe08e425b4b72476047bb45850fe9af109926dabebb8c7f0b93da022014de78058989b54d1a7ae19644c83ca4e26efd4000a4fe8e45659209468cd4cf014104861822906143d90a413c28c5aec29985ac36783d2c157fd0f87c55a5663aef51e74b0181740f3247aa1e7ab78b07379e1b1a94384c9442cfa5eeca8898769537ffffffff02e8030000000000001976a914b28ae06f3050160e775c806a42e7d1d127ab5dd388acb8820100000000001976a914017c96cc0f3a81c2604d9820dbb1b490127d2bca88ac000000000100000001b36da34608b43f5af519bff8f4ed4a30969963de3a7b7cd27ef897d14a0732f5000000006a47304402206ab21b1f1aa900eedfc4dbba741f972644647eb19627d1a664d1756d65e029820220070caebd37d1393e4e4af176f64d718bd860d6af08355a42cedeba6f509c240501210386b0396cf4aece2bf608adfd0e8d95414f6bdcd61b217241ec980d2f5f76eee6ffffffff01e882d000000000001976a914539c3e80f41382631d2d03c4778ed0fdf81b7d2588ac00000000010000000133f61c96b620149bdd45808dc8f2795bd8d9874a1d91fae44dad627445adc09a010000006a473044022035f04cdb8048e0a4995ae9bc8e59373f99b2751d5a920f7847d572090ea1265d022052e5eac0fd3e556171b4fe4bc15e4d5fd2a5f801d1707ce84dd9d74b1975abb0012102b9913536286170a0f6adcc2988cc2552bf1f97ec30d75d1ca6bd20b6b5394e62ffffffff0118fd6700000000001976a914539c3e80f41382631d2d03c4778ed0fdf81b7d2588ac00000000010000000151148eeeb3612d11bdd073f98f964c9431bd5ca67aa0ede8004e98f6d627f5dd000000006a473044022016838fbd4c9684407e771d2a99fc2a230ab655f315f1b5086949f286f71bff3102204ab02bf9e188619bc9b79bc9b01788f98900373a639b0888463fae7b3a4c66b20121029ac24d1abfa92582156ab553cc1562d56f48bcebadeadf1904fdff2dab74da62ffffffff0110ca4d00000000001976a914539c3e80f41382631d2d03c4778ed0fdf81b7d2588ac0000000001000000019c05873dc500ba9ae3616d92282c6a8723a8703be8c85fb880a4330b2995a56e000000006a473044022038ae1c068b089a73df1d369de616ce3bac0110fdb824523922934a6fb0e3f01102201fdb5edd8d77f2e97c4f898ac022be1e0c41d90550aa410d12471af305e520000121030c07ddac3638f0f9309d9e344fc9653aaf6430b4b38d703570763acb8246132fffffffff01d0aa4d00000000001976a914539c3e80f41382631d2d03c4778ed0fdf81b7d2588ac000000000100000001649072082c6150572663065f26554692502cbb8006f6ecac39e8cb421f5de070000000006a473044022004428233b5b46e36e244669d1370663c594d487b525cefb8d693e38286ba861202200f54176b57e8ec2a8e6ae4df41cf0cdc556fd7d6a58adef23e32bf6e744e1cf5012102820ebfafe39f5f4bf0b7e25ae9915cb7de8ceff88c0d01cac19bdb50a4b1e051ffffffff02c61b2107000000001976a914c225ab6924b62a12e85aa53f366eaee38609ed6d88ac3a986013000000001976a914c0fbecd8b2f85c31c5ac86630de53c7ae7ce464c88ac0000000001000000015a5c351916611a4b995dc75c482dd8afc6a813a5ce678cc7c5fb9e95b6e69bd3000000008b48304502201fe6c1b80f37c5e452c2ca4d1bee0fbc87e8fc17a13967d1cc9f685a29cc3e77022100f1a1fdbf297f50c46a2fe179170233181075260134fe3a8d8cf14490d72d10e9014104ec8286c3e7d962cd687cb9f3860c3e73866d4f79e57fe4df692680b6488c37b7009c4a963a5649323721ae3f20d6f393d7865f85b829a27f0b541bbdd7f15838ffffffff024e38c404000000001976a91484e16c064a30f69c78f9b3b42002fd89d8c900f988ac808d5b00000000001976a914a6e86762140b6d7f661b251cb7c3cf1afb2d870588ac000000000100000002507c35d72b8ebb55a43b5cf450f17f5f13cd3da4b263609cfc6e4508132a4ed1000000006a4730440220772619770d94488234ea4f47430f05cd5c78697a2e7791b12c6819602ad9004902204b2bc4aa967d0709a4c99d5f36f2317c44794489084cb593726c4062ad911cc3012102094d1fc9488b1ce68d021c6623b6d12ce2dfc0d6f527e6f2096765c245158624feffffffa216eab2a659f25ca6bc7bee9cc4a5e54772118f0a50d98f0656edfecdd849ad000000006a473044022009bb9bec4494389220e3188b37551b1dcabd035a7114a309c2ea62d1b7228d95022034beac693b005a9b5312b5c48c41f31da0665e1359be81dce8930c4c47de67f7012103fd5c201fed02e586282d48d353db05b58140e7a94e02d886204c35076eb70bf0feffffff029fbe0b00000000001976a91412ccec1db43e3a4cfde88e25129302f2a2246a4e88ac309b2400000000001976a9141e1800460fbaa6eda2ff7b52833555255af3926388ac8c4b050001000000010cc8087f431d229fa6daccad29eaa779c17312325e2cf651fa849b763fd85953010000006a473044022069b16749d22001b0a21744683d2d75ce9ad9f2492824912ab52b8830ea825dfc0220450abe230ceebfd021d262508ad447b249866e248c80d4e5c7827308671426c6012103fbef068b7a0dfdbda3f53acb71cbe12c39f76550177b975d2038c2e32dc430bbffffffff0211d58700000000001976a9148341537bc729cd32e1b6304ad7800357052c848988ac002d3101000000001976a914469dad04041ecfdd7e98079cda2dfde6015db7fe88ac000000000100000001eb4f434c6dfb2ea5e453afcc3b19c7834283196056e5e55222196a24898ec396020000006a47304402201a89a95ca205d07c70b327cd13d5cd17e02e79b0f1de9bc4e69bb50562cbab3702202970e1e064e68a9f2223c4a61e8065f4df299e87c62ca99598b1e375141ffe6401210358f1c439eb89915cb7f33e1c87373d6664684c0cb5095ea60ed585b78230a8f5ffffffff01d873070c000000001976a9149586513770ac55d28829279275f2932062d5816a88ac000000000100000001d0203c594d3a05ec4e01a649927a8ddd3ec45052bfb78e62e3da4bafb801160d000000006a47304402204255fb29cf9c7c8f451d714d9a076af5fe3f073a261194eb9f49ac5fc3f0ece802203d6e6d9f858da72b77edd739461702eee90facb55b4e682e009c9b40511391d50121027c386ac59a9a1dfbe52f11151388664d6ac544a9957ffc3c389b63a05404f479ffffffff01708a4f01000000001976a9149586513770ac55d28829279275f2932062d5816a88ac000000000100000001f0c4498ee70b44e5ef0fc7c9ae9d43d5dcc31f7498e161968eafe9935e2a57c5000000006a47304402205af8a8a26addfd6b631c8c4af22eb5f45f5c42bd2e2a060041c860f634e240fd02201510e5417cf1f9cc1ecb55980f13538a16a53952ff4ae8e1265557e68f4e8f95012102a7ac4f4831ea24367dcc21e2d586e56d06c78ce6859325686de71e479622dd62ffffffff0176200000000000001976a9144827ff0289efaf9374ce8db5d40a1e7e56fc36a188ac000000000100000001d77155da4a5b0435ea9369150cf44ec7556d3a716c79a4159c509cf1ac947ffc000000006b483045022100db0fe1cbeb3dd70f97633019424ab83046a01e4fc5c3d241d03226092fff7f58022050a7ec815892734a5ed85791433f79a1c436ab19d3dcb9706a378b2dacf86078012103f9ce7b512cbe79da51ea4bb25f24dc435ac87a55ea8cb5fa99411177255cc89fffffffff0110577500000000001976a9145cbb4918a6e7ac4c2de529afd3f0ead258fe129088ac0000000001000000015d011bd73d1c66ef56eff8bc3ca0ab99c500512119dd07028bfabf400dd22b22000000006b483045022100c9c30e7dac291752b08514d59ae9e034f8697ca1457cf55dba90d6d33e21f05b02207f802094dd1d6e427f45be7f8ce4ac4687eebd754a4a9ad148c2506ff5623d3e0121027544301ab1cdea80f629d7bd7a61eeff0f7c3eaed35679b4422b5e017189790fffffffff01f9744400000000001976a9148c692ee5b907848285c29f3dfeaa6ff9c79f156388ac000000000100000001602d404fe5970e4da1a5454baa50808a53df3d97bcacaf1ec798d5db3312e57c000000006b483045022100a9fc8ed2b99ae012b76d5cabcba58ba2c901c153f9572a6e359b18b4b0577fe602201b2f701e30400962b9441bcec0bd7e78baaf04e80480d874f6a156789a044195012102cba6951d129436ad8256685668bca8ce044a2e81fdceadeabfd39ac6b362ee00ffffffff018cfcd000000000001976a9149586513770ac55d28829279275f2932062d5816a88ac0000000001000000017cd5b2e220f41041f3b707945caf720be28057a269c6d4cc9945d984c34aa4f9010000008a47304402204a567d5bfda4edd2bf7a6e239307eb8b2ea84c3caea8542278409d09f6fe762e0220655fdbd14dfdfed1371d362a510d84e9afdd76083cac8087f83ccc084b451dbd01410486b1655a520d98dce4e50fd573a5579f69bf3fd73cbb3911d296ce47b0d27082bd9217421c00c4c52bdc227498a4ff061370be924913192efbc5b28a245119edffffffff0170c9fa02000000001976a9149090c8dae016b9fd3a9fdad72ba4df54b1834a3f88ac000000000100000001716ff994b731a312d2c4eec8915b9552465d4b21dd47f685a99e8e814315bde1010000006a473044022071d095a786bf87ba8ce3fb07dc75f9fd77ad74dbb296c12b10b3efbffad0c561022032c2e1ecec570e9a031a31a0ce41c099152ab179a543379b85c5ad10aee4a1770121025e06cd8d479b3808dcaf919b1289ab837316ce962732ef272b4fdac5777fee56ffffffff02a0f703000000000017a91461981717dc4d24394220e11fd09d42bf2ab5bcb5874f600000000000001976a914d4696a9c84387c12240ad5485fb9b4d6b7336b6288ac000000000100000001ee5a78d068854fcbfaa23774b9ce121f83bf809862266e97600883c3f108ecfc000000008a47304402201a01877972a71d7cf48e6213d5e79544aeb4c7b2852463f82b21a2c6264c1bea02205d622c4caf8f461dc92f2d1e9cba92d5b522a7e0029f22225466611ccd8817d3014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784ffffffff0120f40e00000000001976a914ca7eaccd4ef037929be65c7706992b055a41362e88ac00000000010000000121c6ce4a254c4d3138f1a7b61986720bd14d2903e7fbcc6aec3ffc88f8bb62dd000000008a473044022070ea08ad064f8b8709ada1680a6d153f1d52f3d1033c4c34fb45e6fb15ab552a0220070eca82b87d2bc4a44c1f6495456853b29dabdc092cbd18a9b498d6108c4f290141044a3460b7e035b73998236aca3312d8a694f7b1fceeac872e4ce65d012a6f7d8698fde52a204260e8ea1eb210597409b8ef2ad8ece83daafc40377071ffde1c6bffffffff0120bf0200000000001976a9142178ad5ea2623ae333116185b1540b29f09808f088ac0000000001000000016c2708faa270ae79b3c5c7e754d40609fd31cf4af60fbd56299c9cad52a5fc19010000006a47304402204faf65d5779f2c109ab8a9481c3f655846d2ce2e6af8c72334fc853daabb5bc602205aaf7bb1e112ae29fe9f01f8e4efb410612359c1cdb96511d8acf1ad3b32300c01210381ec871716e98a71777fecb4e18f05c56c3e44a079234f0c1cce75fc68e0d00dffffffff0225c91620000000001976a91460ff4529c00d5730ed8c63f6c2e0894e7b86e58488ac00497f0f000000001976a9143f2a486ea9689c05455033bb588917767c8ab10d88ac000000000100000001649072082c6150572663065f26554692502cbb8006f6ecac39e8cb421f5de070010000006a4730440220085b4b898bf767e25972b24cc21c4b43aec7f6dd501c8a4865be496ffd6a4edd02205da61f3c71fae81530f51d055a44e45186cf20c38128b92f34375d4ca0a1743e012102d5db1bacfc9a4c375a9223db95e33ae1f591af8dbdc600865e5053f225da24b9ffffffff0204bb5809000000001976a91495951cc4260ac3a378cda2e3395f811f88c4c7dc88acfe226800000000001976a9144a86401e50d73d8aa53a073b7c0c06157bda1ce488ac000000000100000001d33571f1fd3b59be9ad3d3f715dccbae79bb2e59b9cc933bf408855495f30cb9000000006a4730440220754a9a82cb29213bd687eb304c122ba75587fe91877ecd749ddc11c1582ce0cd02202fd6dbae3242b7095e82a105d0abcb63d28a4e3473af2bf4a5f2eecd58e0c5f9012103a3191ea65afb1b5974e502a53981381b5c5f6d34035c66d67cd2072f26d0a62effffffff02e082ce05000000001976a914ab5309ce0f75a383a80ec11e65750b3d1ac24a2a88ac204e0000000000001976a914c8b0325d344252d7df7a61ea11b9c1570a31680288ac0000000001000000016ac3a07914ec216826fd443655dec92110b86da10426ca8a5b447ba74ebd3841000000006a473044022072ac351fd4a03bb6a0e965bcfc3472d64a2e3afb0a5a65d41e59fe6faf7202b6022003cbcc236ed4178c3057b6b3e3c0f1bef577503631c20ccad7cdf9cbbe0cb047012103d24e158108ce0fa7322e1f95515e201b0d4f78c78b21652b3a276c109884eae2ffffffff024054fa02000000001976a914e6b42818894cf54e996aab26e94d7328f179357488ac005a6202000000001976a914b6dca96067a94ccded28ef8ddc9e6338aab7979188ac0000000001000000012bcbfdbb246f6795352e15ef30ffc30a823266d410b13940de1c6bebe2e950ec010000006a47304402200bf6a4e0d050186cad9ec0520faf230ae95069a23f1f1d7a94160e2671da26e102206e519151d5c82f41794df47ba57e2a747ad3b9351666c7b36d168134400e9de3012102af03be02630ba0a38a2f9d38832fedb4e8b5bf979422f234085fa44a38dfeb11ffffffff0210270000000000001976a9142d5e62586a3d244c5e3c4ecc32eaf7630639a1fe88ac8dd90f00000000001976a914420da0b7a488010afd9cc41cf96ff14a05ce970188ac0000000001000000016e726655a6ceef71c0629ee997aea74fbf3ae906699e069d6c9b93bd62d6f666010000006a4730440220527961b5de466f8eb082579be880d422866ce91255f3a2101f3f7bce6f4cf56002204e3e4909c9dd1b4ff736070d64590902ae3044118defe23a22f9e30c813c8d01012103f4aa7eaf4813e36dce5b07feb06be26c40d8650d6b87ff71e0748be9899ab50effffffff0210270000000000001976a91449254ac0c3f62eba4312a85dec152d34be8b95ba88ac60900f00000000001976a91497cc736c7499b6dc1016f728073d04783fad514988ac000000000100000001273aca4518c4bf276bd9ea75a9e2c1dedc724599104ecbde61f85c4c23a53e6e000000006a47304402203d9d92a705c310dc331da23c9c33133b238a326e0d137bbafa3fa573395e5595022050c5076a0ef48e2af4ae38d25e715dda448dfbce281b7571ceb85f643f1bdd7e012102f548a1debbe3727f8d01a8df06d03e2748c158570318c3e256cdc675db0fdd59ffffffff02020c8300000000001976a9146d860b78f982c94e590d4986f0ece2121202d94088ac4a0e1200000000001976a9140e51e95ce63f343d4268bd071a03c567ff80bb3588ac0000000001000000012db825d3ca7b56f1c9c60ccd4e4760222a3fb3c41a3271ea228350d27b4ded04010000006a473044022028d12c789842ae14d29cfbc6739c166414f9c508e45f1c1542925e72d8512de102204c8fd0be2c28f1acabfb34eaba2cd4930cd3d27478264c740f78145d43e3b2a90121022c3e626b9df73142c40993d79b995ea820b5c5237859f0e4c405a5a7d8c37e58ffffffff02b0633700000000001976a914e098b0eab9e76331604b9a9dc7446c62f20b6f1a88ac4015d200000000001976a914ccf3eb1c37695a7c5eedb040325b535bb4430b0588ac0000000001000000019c975c4bfb36f1faa640ac2b179aca4cfbf745dece1dfbd5acc26820fcb634c2140000006a47304402206ec42f99865e495ac51e1383876f4bda098f1406e7743378fb214612c40b09a102202d6ce2dcb64d57bb391590ca626ba19fdbc45396591f4b32e6271e1d3327a8cd0121022a023d7d15923fd2d3351323fe743dff984a87507dab7694adc75a80e22b6fc0ffffffff0222689001000000001976a914757662cfa0463ea90634d203c71ce57c5e092e9c88ac9d73c900000000001976a914e8d84dfd711bb9ec2b74e8bc2bfc95506f482aec88ac0000000001000000012812f85fdc7b6abbfe8a0b88a9a896273b986ac81b4323f8367676f4bb745ec2010000006a473044022045dc6d8e30bac58d090383a6f64c4856a03f09520c019ee3e8d8a47096293f3d02203a772ae961d0dce63c1ce6191235ad6306ba75d9a51146f0b6ff68bcfe70e90601210367c1a91e6ba1125d451539058ba452cd02a97b45381d3b3a70726cb46938491fffffffff0260900f00000000001976a914ca2eeeee7e725d58a2dc104ad5fed4cda700b46088ac66990301000000001976a9142bc3de6fe26eaf73f7e69ec00c6a295a6cf5c39488ac00000000010000000151b46528b920fc823690945fd7ea4629fb960bf408383bed8550cc1542e2b96f010000006a47304402202643a944d6d552e44957b4c94e6cf519c922613fe05369f11cc7e7bc2b7d2eea02205fbd2d5c3551304e91b5a8ea58097e104f99293f1f709adc4fa65492778a1a9e01210330b757708b1578b69440e07c9a13160e90e838fe05cd1e8c88eb6b70da950501ffffffff02d74e0100000000001976a91493eb43b95cc78327c0b962273bc12934b81be4e288ac3fe10300000000001976a9149093dba908264eec7eeabf40969842e3a4f31de088ac0000000001000000011cd13e76ea53b8862eed3b6c5b57e90c1ea82491f49f58aef2935113b05b00b4010000006a4730440220085d68cf406921d17752a717d8f744965c31d49c751231c10f7fe84f7d3eafe1022068f69330824a929f95bbc0b9ad6e3865c2479398e1023bce9295eb2364947d39012102afdc01cfd4f30ac98301015dbb4d95db2423effb73eb5562712834b293348132ffffffff026c2b1e01000000001976a9143bb03138f0525466232e9a5b3ef8d067740ab1a388ac4d538300000000001976a9148b95334f9e312aec176095274f4ba94e22b204ee88ac000000000100000001a3d41ae91943253125f5daf3557d225a0e902663916d61f532092d4622f4c798010000006a4730440220572b6675f8bdb97bb01e1ec1b3f4e5ff15ca23689f4ba8331f4ce7cbde672d16022042f483bd519cf8aa82b3dc9eddaef8673b244405bb94e0f04aea46ac4e68a288012103bfd8dcf3a70403a1ed4d1e519d9c4acb2eb922ca98b8588a8e50c0596b869e82ffffffff02442a0000000000001976a914e43126376d70c8ede82b626fd27f016e7bf74b0088ac3e810f00000000001976a914b02faa6a8a3776e9e8730edcf0a10474b06198fe88ac000000000100000001c323f4fd89d4cc5dbf5eef2cb3b708c5eb52ec6ab8b91e7bcc194482c90539f7010000006a4730440220423272b85b1758045a77f3e2f57a9293c59112c48d85c90410bc7964b97afc3b022022dcdb4e7f8c9254ae286fd6818b0c452f26ff6d85318ca97acf1f60bac370a3012103ee28fd365326672cc05f8e798e3c5a0ecfa00123c26b88e4f91cb81f58715c73ffffffff02e0673500000000001976a914cec8ad83c825d2f78c4f8a24f15253892f67618788ac28b90000000000001976a914b27940450993cdb1cfe6330958e82acb98d4b84488ac000000000100000001f02f961b41c006d8f72eeff8b3b57116217325e3d2db188720fb19b2a1fe8141000000006b48304502202631b16684b0ab481fe5189871507168360def8c43d893bc9bb9c36fccb61d140221009b1f2f853f113a3eb3f12543adb1f8b0e67de9d5a7d369ade56dc03d94535a04012102b87670dd656e3e542eaa7f0d12528dad3222d5eabad3dbe0866d0765b170967affffffff0278e00100000000001976a9142b84df243d010fdac32c714338fd811783d3d2fa88acb8f8c0c9000000001976a9143cc16c4522a396ea37a1d4ac57f700779601d5c088ac000000000100000001ca72c6efed43e4b8a86a6b4c7b3c988a239372a7ac6e84bac3961287309fa132010000006b483045022100d7d936b0f0c12ea909010e45fff284ead7d08569e3ffe716a2ce2c87c9245fd50220621f444a4a151d22cdb3ad5f586110db7b4f454b7eb0069685fa69260a0ef71c0121028f81e539260205ae7bbc22cf9c388b57cc5f9e2a180302db5a878f124107e4efffffffff02d3328702000000001976a9141f541dfebbeb51cd77f68ee3e879877f981658d388acabf9bd08140000001976a91485301528e5ad68e21925f1f38e60d9e11dc1eb7c88ac0000000001000000015eb75b01e18ca08845933b30a397ae03b6230a854c58836efd8ccf831666661d010000006b483045022100c3be50a3b07c6c4508df4cf3935816e8d5a12f44cc852b5f0e297c668c4c231f02200d20115aa2e66e9c79aabdc0c684b941b0e2e238e12329bca2f4f2f49c86860d012102da535e96fc5a1b3c3a77c07cf254e47bdac7220ce188892ce1e54511b49dc477ffffffff0280c3c901000000001976a914e1ed9eccb3653a240fcdbac8c76d52f17fc964f388ace0533546000000001976a9147da7a23cf7445bd6be3811dfe3af49fb7f0a2cc088ac000000000100000001ba183a01ead18e32468681b9cfae7d7dadebf3099381807b89df6b1f5351de2e000000006b483045022100bb685f3cc05680c798fdb0a8d66110079e0a19ad627ec75f4f5f677fcf4e82ce02207648e482d70beff1c7f783b12a99dd43f40ea57d63367e7fcf4c1cfb7cd04304012102105268f9eaa0f694ba4104a2fa34a2fe9ed0a6fa234febc64a7969c8e952bc64ffffffff02905a6a00000000001976a914d3e5c3a1f16fdf0008e07168506482d7482711ce88ac40420f00000000001976a9149913be3ba628eba6811bc0cc252eafbef73ee40288ac0000000001000000015efa958a8905fcdc2c5e0b222ebcbdf45a05356432a32a934cdceb3563019f5f010000006b483045022100c21f70b9addee155acc29ff3fe05d6c5a6246373c43e7ccfdb6d5fbee037b2bf022007d6bee18e535b45daaf6808dbdbe686d1b8fcbd92fe46aa31dbe4f7e377a616012102d46da59ba6dc1eb24c88295e14e4733696fa12bb04d68f2ea184727065f5bf66ffffffff02d2ba4a05000000001976a914174c26508d593f90ed1a55a6f092d381b3dd736788ac2b25544e000000001976a914c0a135c4b05a187289ed8d25a31cfa04bd1ca4aa88ac000000000100000001320aa3852a23214f3f444e2683f3b545a555cd46544d3aa97383f840839ea1f8000000006b483045022100b55e45c19fd6a810d045a77ca2fa33827e85bd88bf6147729d37de3aaad6b2fd022068d4b78993b5a0bdd364b002aeafde175f33592b1f7c51e5f0f95355cb54a3ae0121028d47279ea007706e624271a369bdae02d5658b6b5deadc1b0221518ed096352dffffffff0240420f00000000001976a914da5dde86d69a5d9dad88763f2df4b048953c7d0488ac80380100000000001976a914f5710c7a405f1aeca11b79ed8203ae5328853ba388ac000000000100000001777e61de7f2cea472a3a851bd5403599ecccb8ffb382582861e0f5172b1867d9010000006b483045022100fff70cc33bd128648a9dfe6c5b2e2bfad4f1c3eb5a8cbf97f0038409c8598aaf022064c89f5a37ca3980a171c0004333aa35a305b5ac1b11532218ad73401be3f26901210266ee2a40edde81f8acd7b19c219fc07ab476a2b4f8a3d7cfe81c5f511435f1a0ffffffff0230d6b601000000001976a9145621f431fa99c7d87e40573fa2bc31e781abba5c88ac00255602000000001976a9145ed051ff5a28a48678b34d635e7f203b9ef4e09f88ac000000000100000001cf8357bf24882d3a03544c4657de9f7cfd9191eb1f7bcc17ee2ec22e6a84e694030000006b483045022100a0af8623feedb5e3921487422de1347844340a5471c220042d1586aac492d930022029cea3c5dea4408d58e5fc366fe9cb1f992e73a1c3052a18a8dfcc4e1fe80c190121027bdf5ea599028ced662ed71b4f9c36b803ae07c70144c434dc872fe58176a8edffffffff02bed38101000000001976a91438675862d52a02d8ebb5b0c7746436521c9e5bd988ac25133200000000001976a914e5711ed1d4b0751bff7c8266f613c5b1fc6df31388ac000000000100000001e8d02977a8c854749336aa21237a74c1449a1432c97b9984f7ef73663f4d9add000000006b4830450220549ebac060a94f875f70893baef873558e5ffe9bef6662e4a74d3d3d41596f66022100dada2ca77d646fd9c24c1215abe80c3998e5521cd408fd3924073729e50231390121035fdd68c73f464c0364ad77084edd6566a2e94cd6ba60227fc2bb52f7dae31d8effffffff0270791205000000001976a9143341879a5abd625fb07c88d5681869438d39ec6688ac904cc800000000001976a9149307b74ca38170f6c4617efe73bb842aafe763ac88ac00000000010000000192c4bc2ee78b5faf50ab4b79658d38089283dcd2c9044fb7229505618d0a253b010000006b483045022100a23f73354759e9f97f814e82fd63079ce3ce37312c1679619298795115ab7501022001110cafbfffb01a2793bba530caf994c3344ae29d0b594ac2ac8b781be27dea012103be139acb8b1eb484385939a6cec7297ba3d65158407bcb62153b4af94a099581ffffffff0293b80000000000001976a914d5a99e28eaf7a5337a6f3a56a1d2436dea59fea888ac22479700000000001976a914ca4f1c265b75374e4102ac2559a5694fc8799f4f88ac000000000100000001c4c7b5e9622430320c9202d5af797a04283818ebc53aa4e450962d6c0c5b9d04010000006b483045022100889fdb81acc0348fe140e73cef1219dc2fe8af67e813eaf009d60ba59e39c5cf02200396f4ab692a5c4c17aedf5b129a39a49314917f4ba68d74d553eac2fe13c9e6012103881abad2f5b53ce1b1d1fed517344a0823a8bd2d6aeaa61776d5011e2376eff4ffffffff027c330000000000001976a91491373ef109cc861eb6e948b046753cd004aa11f288ac66559700000000001976a91439bcf6db3c66a9e032083b405c3b4dda0267f38388ac00000000010000000144a7f3a00f9bb763b2d5dcc4f54d3387cedfc47e19fffa6d83060956b0f1d197000000006b483045022100be57d9b2fb8578dcae72ec784e11d72f0956b56670deeff316746f438854f28902203530051affd587a800fa5a52904bc00fd3dd249501f0aa08898da73fc9e88cbc0121024bc3b58780d69d43cd8fcf9c850289567014f5d5963c1245b3fc8bef93498927ffffffff0268334100000000001976a914b0a72052ae4630c850c68b23885202b1596d956e88ac38a01b07000000001976a9147241ec9ac7c29efe9985fbc69927f70029b40af988ac000000000100000001579d2101d3b10dce5716e2a7c7b5727bb30086cfee4b6da1823f66f5b0baf213010000006b483045022100f1975cf86198a316ecda478fda199f134a9783e615f1d3df16816838d7d9306402200c2ca1dc6c200627624be248221aab8de11c86a483744aed29276c0a4b7bcab4012102b2d192c1740e213ef0804b579535234f45c69674473f5a691199c9ffd72f2bdbffffffff0279294e00000000001976a91408843fcfcce6c092f1ba9d17acbf644c803e422088ac87bf2901000000001976a914ecbc2f775d741490d4cfe4d3a61d6b57b7d2ab3788ac0000000001000000015edc6c135fb3b7b95c945c3a64a60ab38f42572dbca58b5dc22d678a7af1b45c000000006b483045022100e3e60dc61028174ba8198627b29242faa12232d57570db169c97b9cfa8acbb4502207fdfdb729a9a04afbb1f73e8765de137957d9be5d39f1ce442dfcbd00921e4fd012102b3c3b2d51c86500f1e754198e38474a6ceab39759d233e9299e514a4f789d3b1ffffffff02ec261a00000000001976a914eb29476acf4ad065d90af94e2662201a06f7ae3e88ac1a6e3400000000001976a91412082207ee0f399539b547ebff49727374bc2ae888ac000000000100000001d3addb2ceb3cfe904b0552c8467efa6306a42cf45b56426e19d6b6176d9e22e4010000006b483045022100ed5922e3053025c7527d5704def6ddb56f8a02ce45f56c1198d84fde89c0b214022020a980d86a056f378d4942c8ba6fbe3f18b55fee3406b15a300026311a151074012103ad9b97eecf95726db5713be1700376d33a5ff83aee6a15197075ef59285551b9ffffffff02b02a3400000000001976a9140d40bf9e554dd37839394a15c84ad2a3794b89a888ac52df2200000000001976a9140b71aeee3833b17c82ee31051df0668fc37d463088ac0000000001000000016fdeb0188cdae06b9e83d5aac5ec68c09136199b8165adb6cf75f5efa22e67af010000006b483045022100c92be15f1296a8a865ab2d6d41e781b7cb7b8d0dbaf5dae34fdb9ded70eef93b0220479b34b7f370d1f9cbbfab757b5e1880d8e35d4ab5c1fb1ae3aece33cacb4a20012102a106d4af749bdf605f5eac7ad9d46a72f7f0598fafb82a03c2e635ea68b8f4ddffffffff02cc880f00000000001976a9146c5184afd13a71dfde0dcb681813c3861866af3f88ac0b300000000000001976a914f425a393ebbe9a3fc3c34957d8bc691863c895c488ac000000000100000001d8de133e6f5c5411ed92c39e18cfa9aa5e71a50e7e0f3cb29db9e351341159e2000000006c493046022100c85b8d6ef594ea9a69f1fec82c117243b196a3485eadc66bbebcef98027b4850022100f3b83cc70610e77c9430f17f75d2d7e055f3733778145b4781734c1aab2ad02d0121028d47279ea007706e624271a369bdae02d5658b6b5deadc1b0221518ed096352dffffffff0240420f00000000001976a914da5dde86d69a5d9dad88763f2df4b048953c7d0488ac80380100000000001976a914f5710c7a405f1aeca11b79ed8203ae5328853ba388ac000000000100000001853160f3b6e2785caca300bac5430d2b3c7c0de1ab18b63bb96167f3da618f17000000008a47304402204b8babc6c254750f2008dbcd2e4b7ad04191228df503eda79ef225665ea09e3102206dca042aca915cf1490f63f859c81e7fe80dcf90ffb97344358dbd4f0bc2236a014104409e655d836f67c7c095da0184c65515431b296401602a3d68262869f3f992c6cc7f913a43be3ad0cc1df3d37512c80a1e37405b733a203243f0152512d4bb04ffffffff02c02a6410000000001976a9141a99c14fe5b2abad38bca2c355db786c7a82d6ad88ac30b57e05000000001976a914185c9e53b6e4171f1aa6b35390b2b960b71741d688ac000000000100000001f7c5a3cb32097876d35001d0ec50f28d7f0fbaede580a918ea4287c3f8e116c8010000008a4730440220665bf3b4cc7b07f2b53f4036b3b3bf74c85bab72efed6802c200c4eeb7deed9502206257341efe59353402f24e616634aa4c6e90388072a33dc5ffd0f205b768dcdf01410450dc028d6bfdc291021090ac8d42a568d69fa2638fc89dc76c4bc82cc2ce38186034560319fe0665f316c8dc66e31f779ab9665eb632e49067bc64c43568eb98ffffffff02201efc01000000001976a914e5665fa435239a42dec015c04ab3f83e80fa045a88ac0b74f1d8010000001976a9146187ad1cb7f4093a7ebd89dce4ef2354009388ba88ac0000000001000000015f73519677abddd79f854d9a93b4d6cecd211c6cd78ec302f60475fc6f9fa08b000000008a47304402201a454001be9d3404269c127a255d807a3536a92e4fbf449682288b03da44e6cc02203146198c92074a632bc37e92ef1c712c8615c825a33c14597ff77c587876826b014104b8789f0453d982a2f2b51a8bc5a3bc71e2ab9562cf2e7bd85dcd1ac21e8d3b77cdbbb2ac8c7f75eaa94fe23008370b3d0ca8e19c95b3071e89a6916c7e3c4d8effffffff0200879303000000001976a91433f4812fdd403247e86d7a1cd7e8cda3a09b9e2b88acf0135808000000001976a914a89469416e1cec6311eb04a798615429640cda4d88ac000000000100000001c9274bb3273d026c99e00cfdc35f0a70b01c35b08604c8d2243b0c8bbf476d6f010000008a47304402203e3e7237d3680c114d804843d6fbcb893b01ad31aa171843dbf089bdb01d8cfc02201470d19947d78f9c9299c57d6c3cb47b6c4fb0bc7d082fd6996984e0395740a80141040ef0c03173ad8917cd86938950401f95039526feaa187115c8a237504920cd0619883e1cc408ddc4808dc6ac7649ab6c08831f261aeff4631bdabbd263984a0effffffff0260e31600000000001976a9141030ab0117a2bcd090a0e044d87ecc80d6bab66188ac2a528c05000000001976a914ceeae18e590c48de17b3f978465c89894ed6f95788ac0000000001000000016a411d2a3de51595a80f22f2e1ba84576371d971472f9ac24b6132a1fb1fe808000000008a4730440220111aa46e1633d7be21c6dd89a26ea8174410b9db5545f663216a2161866749130220539f94c9ed985b977c7ef40f23e63eb9d899e4bd905ac449f388ead7b83b0bbf014104f8b6b50f288bf5805a54e71d76e0ed2483218fe9aa8c12a8bbbbd4c4e3999aa446a87edbc5722d01bd256259fd33cb24513c2514a684780ab490cbd93ca36092ffffffff0261464d00000000001976a9149e14f554d90fc1f8e80392953a9b4afc8ec2827a88acfb246800000000001976a91457d9454d85d5cdba9a6a1f0b54450012f3a1d03388ac0000000001000000013babeb83449c990c4fede2465099db7f217a1649e1207319d0907f04f5c43191000000008a473044022078bacdd5e66a1a12e33cebaf303c07cce0a43b757b9ea0f85ae33cfe66cdd2ee022050826d3c4427ef0bf5357fdb95db33d207c8fc9ad9c53459027c31046d549a8e014104293397b707b5a23a9ffee09940b3e16d9dd585dbb80e0b7ef083148c492d2b32e65f878c0d3926fbeaedbe0792f8a2bd04da33f8dbf507126af5078c044a1db0ffffffff0230e60200000000001976a914f5710c7a405f1aeca11b79ed8203ae5328853ba388ac00350c00000000001976a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac000000000100000001124d837c44bd2b345237f27bf759245ce2f7da168c67f13fc206e83bece9d4d5010000008b48304502210087b09589c4b5feb5e4663fb4d22e7068af25c6d4a4fec8edf6455ea5a4388578022059acaa0056cbf6c3a9b334b1f2018cfebcea18b4e7f84f6fe1aafe6798aee2e20141041e11ba348505b1e8be9a4e1723377ed31d03f1640cc68782e8a9d24e550181bf8a3e09d19edaafb0df0698882f4585ab5bcfc5e6c4169d58e7bf1068e55dc9feffffffff023a986013000000001976a9149a0f7f1e60867d16cb60a4dafa61dc32cd2e3a0d88acc8f8ff33000000001976a9146e971364ae0bede923b7cb28d367413510760b4788ac0000000001000000017966a2d0eb7fce33ace82bc4c0d1d4f8a96b4fd7d13f759fb60b90b56f37d38c010000008b483045022100ca95c5064dc2ee585c15fc1ee3fedcfdf7cceff3346faa18ebe8bce5842a30ba02203527488c6b4a5718bfce41a2de6fce65aa7138f1a2f6c72f3e55705a75bd7f2f0141047a69bd825ab06eb8d8b46fe4f86e2b806d4d536d4694b84c668675b0fe00b4d4b52eaa3655080863de126d28f393e9c77621d07d8c3bd0d1056a3d00a7171db4ffffffff02009d1c00000000001976a91475fe37e63a11f3dbc9dcef07825483b8105bcfab88acb9317802000000001976a914e80d9f396d5da926d25d8c7fcfbacca2c8c9fc6988ac000000000100000001deee959fee56f2612657baf6129364b6730ce35f2f2dab657ce22af82ee1b4a3010000008b483045022100f82e75a0a04a8cb14395ba3de6a47b68050796777c23c287012e3161a3bd0f6902203899b588ed685ca8896a012614d2c42115598ea08d55f5fc5cbf7f84b207816f0141048d6a16767516cfa38e2e9fe2af31e27dfb15cca7cd8c926d64a5a2c33480a895b3c83664b50714116d9c6e48cf3d87903bc54577bad0bb24d99e10010c3109c9ffffffff02d4f21b00000000001976a9144f51332849fb0546182081b805b5fc528b2120ab88ac8bad1000000000001976a914c6b2a32b468cef28a9d4a2304ff83f80314fe64c88ac00000000010000000111bbb5438301722fd575accaf2a839070aa7050fdb48e0da00835f14a49ba3fd030000008b483045022100c88c8f183041c7bb7998ec27cffe2fc02bf3e5a7f2b250423d70a72c0d90a43d02205fcca7bc718117b4e6f1e3ea5670b89682512e49734ed42900f7722a2c36e394014104094de7f3d8b58ebecaa329f2d9ee41c7040225415fe910753f491d2a9c044f721f7568760ca14e5e8c9fc70045e33f714cf83a152dce27d5027990a72324e0eeffffffff0242f33707000000001976a914b6b2df18fb4fa92b4e0f5f96ac3d5331c5cc36ed88ac0e21b204000000001976a914de82acab0f37d0a26ee5a51e58524d5eba30eba488ac000000000100000001f3aa5055dbb96f18313808c7c1305b3bbb5dbcee1c2398528c891fcd493faf19010000008b4830450221009efc33106f82dbdba82fd6319a6b53fe9baec4342d66d7b68518bb651199f0a302202cb1b73072a7a8cc290f10d9fa8ae41b749eb168d71f17280872b200474938e2014104417443fa374c00cca0ea30604c7aefd6f21b374a67b5ab3050075f9d62c12d47e43aad055ba447e2e4ec7676f683dd33d3e3646709dac153446ffde34ee2e34affffffff02bc750a00000000001976a91443262f596e7a65672ca56334a795cea898121dcc88ac4dc91500000000001976a914b1eeede25eb666a34bb33acdc5ae7850abbe81e188ac00000000010000000110c7918c6e46668bbc05114864e3f8fef4e96fa0f6cbed9faa1c753f6536d3b8010000008b483045022100e368c9ef534ec91c1cdbcd5f0e5f95ec670645e8a5a05a226dc3fb89c2d3878e02204f2b0d49bfa0e5f947adb2adb5f5da55b69dc016df97072003368fb79469c5390141048f60ccb14e412221aabf01f713eaf25d12e764505ab9f54d5faafa75482006f9891cd4a57ca98edea9719dd1f4874a5574f3062c585ead24c104f912d88f76c2ffffffff02a61b3400000000001976a9141fe1c54e815d5e667f310ca8f4fc610a06ce154988ac9ea55401000000001976a9140d4a24d35fe37112cc1be874ac266960fb666fdd88ac0000000001000000013e4feb6ed0f5b761429cbd095483bb9325d049e394b88b8f82d4af888a999479010000008b483045022100e6ea99c65c417aef733d0f6feae1a2e43c73461520d50e2bf7626665459b0a8f02200572553dba49b258332a3c2ce461b648ece6649c6cd206be04a6b7c5bdf082e601410420d2e23be09a121d8290649441d4d6a00a69df7f61281e0746c529c7429ab475371435829b91965f719894da5439e69cf04aaadb5a91a4a4d3b5a4eb396f6037ffffffff021c980501000000001976a9142b2a422e2ba5e050d1812a9d4f0bdb3c5c0a791e88ac71073102000000001976a914b8e02b9cd3b7a25f31e4fcfbf4f828ab9a177f9788ac000000000100000001b935034809ae629d9f29f0ded3440f4e2d8baf9f9cf89879b3610f51b165f254010000008b483045022100e63c9ff9aeaa8845a7feeddcda844988163b2c5ed529184121026d2553cb07ef022061528663de154ec2d3392a43a62b2ecea1d5d8fd7c859e1d89786ee2730ca28801410429d01739dace5cfac8447d8551d06718a609deaf1e826a7fc25c6648b88bd5da1cda9105f845aabb8c216a3857826d0aaeb32f0c71c45e574b5634b1820c8192ffffffff02978b6701000000001976a91486df3b2d24ae69ef12b1f0eb2fe4b2907047a5aa88acf43d5100000000001976a9148ab2ae9d4eefdf5c13e88b297b853b8461a7ac6988ac000000000100000001cb21cafaf3b7b016f86233c6364f6cbc16e314ccb4aa11b1ba260d47e1e67925010000008b4830450221008e893cbcbde1824f54b782da2ec8a075c29486273680b336f145aee0c11859e9022039ba1e22d90ab46600e4ea4c97a2f23def73b55a06f694e8569194eead821bdb014104c716b5b08e411785cb2712c12e58ce18c7a3c6aa31f707fd83fe40fa251edb1a9422a1beaab829623b55991f1222baa611c8f6ecc6f5d0837b6903bb49883134ffffffff02d31c5e00000000001976a914cbe6ca3c6ee0d502f6df956f3b9ddb80275d958288acd6072402000000001976a91428c553835cb95c12f1f9dc7b7ba9eac3eb7c3ed888ac000000000100000001f021ac29a2d0b05eb6e2b471c0af9113efcc7c8f6dc85d5513f56ee549cb91c8010000008b48304502210097b2e5921231da06c6c4e5d343104cc70b7e7b197eda82447a90b09f77b7074302200f23ae89a2e4c12fd309c27afedf5055a68461631107ff161baa3617938f66c901410423a38d2d3aa597789d39903b7eb80e989ecc66ccf10f5ca8bd274dbbb703c4a4596ffba4fe62de1aefe4580c761e72c2e1b4c6fce017e239e18888f71a41cd64ffffffff0220e88d00000000001976a914bf0b795fd8b79b7f62796070779727226577843388acf81f6a00000000001976a91438d8af7bc118d40dedf94b738f8fac011f05b64288ac0000000001000000011569a87b45e016068b575b73d60ee9ef7d35a8319a5255e2a547b4ff00794415000000008b483045022100aabf3e1277a077d5247d2a9d532b48a3e8e7b585281f69d8692ab1a988604e1a0220191cceb0cf29cd10aefef6444f11aa2b433d4c9d95d7fa354e61681c2af30e9a01410470d0259b8f0d5034c235c829a8b13915e04c747159f6bb26e89fee3bd9a0c50f60ae594e54243fc7639e1e2cf67c6594533a993b02a85293d87a66f598540571ffffffff02a0bb0d00000000001976a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac70110100000000001976a914ca7eaccd4ef037929be65c7706992b055a41362e88ac000000000100000001181fed550dc092404ea20275e94359f3e5d96161353811f48bdff313de0c125b000000008b483045022100fda418ec9a3147fdefda1309bf58137e7921e57d30d67dcced102b5d78e9905702201733f69f5754a8867923aafc9e5c4a96e315be2aac11021ed38b37dd4bb92ce2014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784ffffffff0190940d00000000001976a914ca7eaccd4ef037929be65c7706992b055a41362e88ac00000000010000000111bbb5438301722fd575accaf2a839070aa7050fdb48e0da00835f14a49ba3fd020000006a47304402200b77bf39c7a72b581b8fd7bccb0e032350f7abb7b4254cf8e0f5248c1d9ae9f70220526af0fb6a3b2cc92a82cb06bce250a06877f0fde151e67415e6a2f28405a865012103d799787474d743ed1b8df4d417783c1b5e2e78a102e33f277a64971390ea294dffffffff03945912e5010000001976a9149bc9957b09c245d39c3917510bd9e05736c67cbf88acf420cf00000000001976a91407981dcf86e5e13ba4c065d9f9476c34eabcfb4988ac80fb651e000000001976a914e65218b9a7683303f6dc805d402d25950257092c88ac0000000001000000018fefa67b4502fc780064b4d10b77cdddc2d0bcd2d69f799e51c0df2552ea939e000000006b4830450221008e50d557ef26f173463a86adba49966dabeccc7ffef92b4e4ce785b88a0ccc5c022052afcedc884a2f603e8a5b12a746795d6aea8226430db51f4bbb12e40b57f120012103674f89df91621af00629f97f566767f688355ebc97fc01d14c51b70fbda24525ffffffff03db3f2000000000001976a91427cdde93ddfa070233c68b694cb85fb9997aece888ac599f0200000000001976a914ff5c109fce9d655d33680d55e9c7a74c455883db88ac7b9e0e00000000001976a914c0192c748170eb5490b9163e0f5f7c3c9c50c34288ac000000000100000001740120c1e446bb1a839c9b9a1bcbdb8fbad2d68055c8d847810088d7a1468320000000006b483045022100d1bc0a611e92abbf8c4e8a44b6347ce1a366b2aba335ae345c8be11b144c638b0220662ae07f35733a14b0fa48eb377fe7318dee6e635d59e3a063234d7226c73fd9012103ce4498a8412968f705d75b1ba7b5d79299e20bb9cc19f4acd8eb59dd0916ddc2ffffffff04c059d100000000001976a914813c4d05243cb64d32b21460360112bfd3b499b388ac1495a000000000001976a9142e143d46f8fc8e6dc94dcdde9ab3c73cbe6d9cd888ac800e8500000000001976a914cba04cb546c9eccab7c6f835d60e0189843ee5b488ac20a10700000000001976a914b31a32c32834bde2651e51e36e22f37cca431e4a88ac0000000001000000025eae9c64a6e9a9a896b4b8f833844a96e6806b0e021307f4730dbbb097fe6645060000006a4730440220680d2fae8d08cf2ded9401c070efa27f98353740402e8b28a5943ba240049f2202205cc09fca3247aaac8c86db9337826e94b6f98f10817539105d1d1ba7b277f49401210224394819d214109a51c2abac3bceafd404a6a0591c1e9100db89f22e23c2ef66ffffffffda990246ee3a8368cc2e827ff0ba41172c9fd3a1089fc0ba62c1b0f95532a998010000006b48304502210080681ac2afc3f59503bd79ae605c7aabc4ac88b66115ed9994ea2db59218e42402205b61511542311259a37d93f9ca5e48933c05cd9c82ab35f4365b631a3c400a4901210224394819d214109a51c2abac3bceafd404a6a0591c1e9100db89f22e23c2ef66ffffffff01b0360000000000001976a9143b5b06bf745bd18b66e3dd4bba1824a16672eb7888ac0000000001000000025725fc135209a978b44c8d242d4e0365dab7ef21590bf6c6b9c6ba33e135331c000000006a473044022074df443fea96a9d6cbbff9a34931134045b3063c203dce34371178014e3cf1930220215dbda357261975ffffbd9039a947bc71acda571e231f12d05b23f91f68eb840121034dd36bfbfdd7e845479ee48682c4f782fe66e85d135ebb826d7ee119719bd9c4ffffffffc07afbf00251f537e8fedcc834f43246f8a97db021818e834a433898721b4be9000000006b48304502210085e2773bd046141d81d01d5b59e0d5986646ff2f2eb186d7028ccbd04199c981022006e4de78ece565e3c81849403f9190bd131acf1d86fc1a6e7cc43c059a95d77d0121024dac20befa60963a0dba41a7625a632d7398e49afb92111d0d4a2c7a8c688d95ffffffff0170cee4090000000017a914c3c8e5cc4486a617748d946eeeacbd99039d04518700000000010000000113564c11a0fb53e31b4c382e25cfe3dfe59e266759fd2895808def70f24bf7af00000000fc00473044022026e6f4ae9c5033efdb48aed1190f98e4177190846a4a66a7336d4dc21d6cc55902205bd1cf2fcfd1c194ce10f204117be485c21c94130f4b8d177f225779ab9a74c501473044022005afa168749712cdbe76694e51dcb060e37d33caad49d806afa3e6ad4189e552022011eec2bd514609fa9c390647561f03400cd67c9f047ecad32224b36f38dfb1f5014c6952210372f70a3f4ea93f6775c0e87486b1308115479ccfb219ac6aa62df34246b32ef02102748c8d6bea89f79627402514daabcd28814e4a543812ae334e101a40212303262103e981b390020a5465c4c3504e2e7f63838642812ead315580a5c3cc8848dc427e53aeffffffff01905f0100000000001976a914f9187f5c76e90d574746bd5f61883e753c0e1de188ac000000000100000002bd1452be9adfb2aaee1c51c312b44fc8adc35fd4c2fc4fcab5b2111c9a51a02d540000006a47304402202b7d09a5b90651e4e77a220000fa134feef96c570d182556f597b7bb8253043302207d0829f620d8bdc86dda3b141cc37e78393cb6e6c3ed88801bc17378ec74f0dd01210259f00dfb22a5f496d6575945175813e211c855fcb39f0a94f5c431fb512bfd40ffffffff39b53904843a12da55a44806f77f0d352ace33565ce0bda2bb21ba3d241353ea000000006a4730440220316c78a229aa870d5c3ee4c897f8924fd7fdeec5ada8a00a9f25445f2601781902206385395c271339a2dd6e285efbcab98d6112d3fc11edb810e860aad34b21f11101210299c4795dac95e81964bea178d62b007fa8fe7f047fd4a21161924783f0d880cdffffffff0140bf0f00000000001976a914eb84dbf2edd461b3e983f7de911239e150cc6f8d88ac000000000100000002d115fa1ae8fd0b6d5878dc787fe79712b546b53316a1f1cd5450abed7ef89206610300006a47304402202e4772a3f45f40da54d54d2d68b5d6f3f0b7f8737697362a0b7f4374873678c0022068d25a1dfe8faccd349a53e3c116bfb7af1a1051956da3f8ce19e74b35314849012102eb8e086efb575a031c5a01d9e10bb3984bb4bd88b2430cc60a3ffe3bd9df5026ffffffff07ddd6f71e0da29004d4649bc51729457c81ada42aadd970cb13b5766f3c82f46f0800006a473044022046c6e3d999914176aec9ad2bf3af460165812b4b1acbc5881ca8fbdf7445bb9d0220687c03a8fb427f305fc5daaf705694537bc8995becd735c72d9b8bb43b0b05a7012102eb8e086efb575a031c5a01d9e10bb3984bb4bd88b2430cc60a3ffe3bd9df5026ffffffff019c160000000000001976a91415a2c078b214cc95d7ad87c7eb45c264f2c9063c88ac0000000001000000027caa31452e709a5aea64e201b8d712751aaa63828dc1a466fc5eb5ca86d6fc79000000008b4830450221008089d52ee9a0ed71ad25441df44a8bc4c2ed82879fa430e73e3686030f5f080d0220099c02362fc29844694aa133f00207f71d7e8ff1650d1ef974f36cf32950b360014104d84611fa78824128dcacf21ecccce744620a8610e906072ae6cb573d01f9c333f02f9fb799afda52ff5116fdef053460f01e7c7a372ec4f94e0bee8af7125d93ffffffff68656e1123c69cf73337643417eebca345d41d5ca847393d3db0e451b8e40172010000008a473044022076bed872ddf06522b16804382c2c96a7828dbecd8e59547d6f46503e4349f89e0220437ae2fcf9046e306eef258a75f10332d0b775e93c0c5bd2920d654f40cd754b0141040d756049f1ec92e3d3c3cf01ae02ffea271c4b4aeecc71f7a278de5c09b9112c2e61db1aa4b430722931a60c4a89479a62f25694d8861bddff5941258f36a1ffffffffff024b630a00000000001976a914a0c5b38f7c2368e96dfc4526bf2ed463ca0d4b9288acb7620100000000001976a914a12136aca8620119ea6aa100ac3da9b99809b69688ac0000000001000000012596aa4b5997ecdd15a1d400697d8e52828a01cd65f7e35651164e4f96c49c63000000006a4730440220233648a5d8773ab004c2cc9d8982498a20c456653399115e38b8e6751a678fd90220479eabf4540a653d4c57950061fb8970a4063873b48b0e5ac63ebf2ecffdf16f0121026f4f7b5176851570e91b518d7d301d557a7404dffbc8a88fcd66bd525c0f3480ffffffff06e4884700000000001976a9149b7687c561eed2073b263a35f1a47753caf5b32d88ac70288302000000001976a914e63fbe349c4a83009a1eb1a365051fec31b4451688ace0775c00000000001976a9143b6aa25bc62434c30a4a798a9e3f3996bef7137888acac19ec02000000001976a9145ecf0cd918f472fb4a2a72a45b46dd95b13530f088ac603c1701000000001976a914de6e34bd2f7907743107141a500c599cb9ed1aca88ac100b3b09000000001976a91431d7bb7e733709288eb30d0f19811203bc7f4f7d88ac0000000001000000021fafffdb425cad075e85adc266dc22005480cf93fbace93fbf9023921c79477e010000006a473044022038edf155b171df595a8f38cc9ef2b9c517134301a7c607a28a68caf809e4cc190220782572761ceb03104779f6a0442e678df799edc73f25eb2c3497bfd1c5e686d001210245c19602bcfeae6f09481e45a847fa2d5391fd13712e9a9a12bbf61aa8e80527ffffffff9f8620f6c9f531ed3b5d1c5f55e7a511c24d1d855aac206c90276e35c2fe0684010000006a473044022056825d30a6ac44bb833ba62f1150fc8a4c2b31a5fd43909c2354065a9746ca1a0220408199839300a0c9137b3963f174a75700c119e88825ad840f061c8eab0a300a012102e20ee178f2eb8c71d6c19c82a1c27a43c90616e0fc8d065d181d530b455457aeffffffff02e2f94100000000001976a914dfba28dc856c9a949fb67a55b234adb957416dfe88ac34c0f201000000001976a9144c64073ba9d839d4cb578f88cf3f72690eddb5a388ac0000000001000000028eea3e838f3a9d04730a6c2c78373437160b36cce20c140ffe56f15c92a003dd010000006a4730440220590cb1f0005d74882aa09c87def0ec1762b7af74ab3ad267a5c09fafab9bfb9702207b708cfa0e4b66a7af158d0d7d4553c1a190887d4cd1c34e04502d366c64cef2012102aa621b1cac7e835b5ec78e6324136d3d70c9ac213dec4aa97b32d691eb081d8bffffffff7a38994b5605c572e160e7b7b9e9de1eb4c9889a8f300d8b7045168e4e03e93f010000006a47304402203cb6f7dfdedc77f35ab86df573b6b853dafc1a28d9154dfe93f8195ba0a06dd602203c3f05e8a5cff0f9510d27260d1c9df01181ccfcdaeddca804c462c44af52e3f012103d3e562c5114b26191c8bd2af9f195c5eb5c8f6b757a7e72016570169c7679374ffffffff02d75e1c00000000001976a914dfba28dc856c9a949fb67a55b234adb957416dfe88ac4943f001000000001976a9143b29af8b165554c52b710dda5285dec00038238c88ac000000000100000002b791f6682e071fe6b384ce2fb0c8f1fd58c867f9ae076e98be8190c454bc5211000000006a4730440220206e8872d69b18b7dc0b16fba168a81685c33b8bfe10da79c0730023bff7a787022076afd2b9e6f296f1fdfdc73d5cbd5fe510c75c647af8ded2b3670ce242d67dc50121023cb02d3bbd8bc227b20b6f8affa80464e1f9f2aa684f2e6175ad18f6f1ed3ac7ffffffff1b39183f6c881581dedce68a6a708602c9f897e86ffc8363beda770c957fe955010000006a47304402207dfd5c4ce70c05ee332904eea35315934125b7cb48e765ac0b9ab6d9600c516a02205377ab5b89a53398781e3e3a262aa45628f999308f3cbdd591d2a62c896351e001210338c12cce00a01ee5675f76a685a9bc57af8b3285a8b074e465880adf6794b8c7ffffffff0264ae0700000000001976a91454157b374cbe22e6d57577b5ea31ba7696f46c0c88ac18196f00000000001976a914ca359613589c6df6e4646d962effd2a6e6b7556088ac000000000100000002b5b715cd300ea36492e8fe95a1001a00c5120f9a3969a47cc9c7191978e87c80040000006a473044022007bd254e07ed53ecf3a100f4ee2539109404f8ce589c70c7e497cb116301705202201d268081223073aef6ac12a3798b367023e20c0ba5a40b93ee331b057ba06a10012103e8e47440766a0d1f4696f5520b2b0c86aaecb8b2a7a33de489c477d753a34677ffffffff0f9a358cb817afba91e264ff1b41364d98628b52bf1a7f0c916a9f08fbaa7850000000006a47304402200dc3cacdecdea6d5c81fe97534afc4510c42f94a6770fe515570c378e10a60db02203bd3b614870c72c0639df43af4441b34379ded3f85d9e5a0bc521fc0746d02b00121022552d66996d64cb87f4827433bb345a0b7a1d3b02f394c7e889fa9e1791f6c00ffffffff026f420f00000000001976a914ec4d996b5d9f22dd1e4ebcde6e06dce850d6d8f588aca0860100000000001976a91474ef9b69d30a2b2af63adc749ac3169d40abd67688ac000000000100000002cc129ac4ba3782defdbdabe80c93569371935a14805aba8f403a2587a36efde0000000006b48304502210092464f2d4cb41ec0d39a450fa9186752dea45fd92714739d5796ae8eb78321ce02206a26d3e3a3313d09ed604d2c4a2b54c640b8a001b0bc0f8f245d0e723d8c0d970121038795e76aea87acfdf50f3ea0a3fd7886dad42d6eea24b31827512298fddc7f92ffffffff85c6b1af317eb00c4996f718d3e4ba1a16f6bada87f2b088ed38c785cc7a4545010000006a47304402204e82c7d2e67150dacebf7d61c1dedd53f42ecd602d47a22d454af6b970d3ed6902205d7f516fef463fa02798a7c298df281d81071612d05a3bdabb9a1129ee8baf23012103e2405329b76406222ac182eb477bebb6bbdffc3ef2e7c593463ce80fde269dfeffffffff029cbd1d01000000001976a9141c6959c775b5052cf11a0f88a2e2974e31a8a3b788acdc7d5a00000000001976a9147c6cc52376541171ff54df4698ba81bdf5157f9288ac0000000001000000029692fd40f4e29b1f0cf49eff3e02e5c929483730421e5a9bbd7a4e73fdeed5bd010000006a47304402202bf7daebd603aaf7f4b9d582f140c2a0fdee2f25fbbb1624c7321640a7fcc97e0220010bf367935d627a51f40e4b127586e8a8b7a0e51e8bf110b013f4c8f8687624012103536b9d1c215dd201bc407510bc6412e95ab0fcae3bcd5cd652cf4a82069f2c07ffffffff2133ecf456f347a9ad36f2746167d2f92fd12b3ffe564f0168e8499f64b0b6cb000000006b483045022100e994ceaa431fcea10c2d694796ce0f4d2ab1a6787bc28fa38501bc78d3877b620220587efccb520c8fbfb31b73475bcb06e680cdf84b98e1e4fbb185dbb66ec81d55012103536b9d1c215dd201bc407510bc6412e95ab0fcae3bcd5cd652cf4a82069f2c07ffffffff0229303d02000000001976a914a79436ae0070b735d13053ab80ff3bc8d3847fef88ac29310200000000001976a914d4851ddc7a7a212119e5966bffdd773a4a79507d88ac000000000100000002a17278f78dc2f7f232559f7648bda45b5ac0de1bf24f394f6fd290f8d053776b000000006b4830450221008d1e8c702eb08fc8f29c2f1e7a92ec0e4feb37ab698327b84d11fd0e449f1f35022029c629969663a4e74bd267d1e8e4a8aa79f9f1c2cded78818ab42bce1c8311a5012103080030c8f06254fa1675a99e8d43bdd3b6cd7c54c1eed27dbfd6fb9f5239a0bdffffffff5ee938e6039b2265bfc85adad30e637d565319385cb6d62fd1a90f710dff89b8010000006a473044022062614fe509ab2087ad3dd28a613ae2d2bf806e445770a6268455807a781fa95902203d732e0185abd6baa5bccff351d076a8e2dcedda6929fa18843457d03aa71f9b01210359d7dd8e411ebcf6979752e44e1bff9d89b40d4108704cb7ada6c1c36d2c71eeffffffff0280fb1f00000000001976a9142a447615d9816e83fc4763a579965e1bdbd8070e88ac2f480f00000000001976a91478e5fb84b45767d0e16f8056b0b3c54bb1afe7fc88ac0000000001000000022dfccd5d3548f6977d59c7b50de23ac55053b5b7266dc7ff6277089e40c69bc3010000006b4830450221009b6ab9be70cc5ee818b2815d7daaaf1b987bf553aebb6e657a4abc6674edc7e40220305be626ae66f2f9e5cf0a9c95b586300f1b75f43b4d3ce8fe982621dc9103ae0121037a1f7216c20906ced708b56f4699dd4e7616a504ceb355af4021049737f8f3a6ffffffffd27117a6d9bedea429a9afe15a58e669a462b009cb712c705df1ccd2f47811c6010000006a47304402203a6933c7c2cd22ae0eae63e8ea3c708110a1ec495dc0e9471f445847885d871d02204b4de74b13180b1181d278c52e830cdd876595a86a0120b2cddbcd429cdd42a7012102618c263d7426a22aac903249263f42eb9781f7a1cf5c4ca1b191d3207ee9a2bcffffffff02f09b8219000000001976a914f7a6bae5731af376f690551e17a6f272e43bb25e88aca040dd00000000001976a914f00b08101bd21c669f58e9eb669743a31954c29988ac000000000100000002e9ff749dda3d1cc920635d8add3ee2959f4eb8e6de08892ea447b813d3911333010000006b483045022100b2524879f4df70682b0193b44f524a959da0c1c06076249a4bd659dc4b7af43702207d1014a1c1d18ef27bca1a9448acde908b9d778a6fe70af278a38d124587485d0121038e6dba49984aa152ef0235b279495490a48d3af44b1708c10d29968c5582b68effffffff8b68f63f412ef83d4d2043adb7cb199b515f790ca2b5e0936e167e228fa8d6ba010000006a473044022031d49e83a109d9b5a1c642c1c7680c9b59f37f808645fa48d63c6ba0dbeb1d6002200cd3bd2f7ebb25e5ba829dbb070a876c843669e516fda59e6dd08c00652bc95a0121029f5f4a4d9cd48691cfb8d8662193193271affd0d29b359cdfca0e1b5ec4233c9ffffffff0243adae01000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88acb1f66502000000001976a9144e47227e4f9265c307be2d9c116ce3bb5984fc2288ac000000000100000002fa8bb8e245285095b5b6cc54938a1b7ca962b0ec0253df633cd8a73f30a754f3000000006b4830450221008e2081de5ee39db3d5cae1823aa28dbefdcc45103604ebe41ebfa40d629999b402204c6b9a411ac007c91bb45a89f08fa8d039dd1f77cd4ccb0aee62c7a3930f913f012103acd7c49fa50c2d6d0ebda873cf8f2b853e55fd688972e2e07aea867abefc4744ffffffffae2e01136a8e2ecf92696aefe327f9a5d1d245759f8cf9b3fbcfafb1ab58432e010000006a47304402202627cf535e4a1d7acaac7cc1d35e1e7de4a25338755754d8fe63032c35a8aad202201ea21b0f1a766f919a5c83d5ee75043a18821daa04578cd709cae4c8c00fde58012103327a03c8df819cd44719936978102598f80e0f3e2a755f6810f224d3ef1e09b8ffffffff02cf0a0600000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac9a154f03000000001976a914a1196b3eab885462bb15b22a25f84a14811e6bb088ac000000000100000002e886cdfd7c9c1744798d6dbadeff47e1c49be1dd52646f568f9acb08d7fa277e000000006a47304402203f4c3a66f0746b942e36ffecad93d74112824136bdf9c598d839a92719549b3c022028f6d45d304e26747d48c3bec3045ae3b239ad516007b3d38badb1ea50205bae012103f0d831fce8615a857d39e695f45f247338afc87e85abc903598db38a5d628895ffffffff0fe0cca889ad4349942ede802af2053e63c51087afaf540186416a8041e2556b9a0000006b4830450221009355f5d5e0473ff99116f25735db998516771546c8a62eb5797a107bb924a19802203b80649b9fb59855601d19bd4ea34cd838077af0b1548c6773bed05230cba3a1012102d8da4b76f21aacc52fcf0ff6197c34856a18978fe1e7337b3f433bb5ef0f548fffffffff02219a0100000000001976a914bdb11212ce17c19563c95fee7c92149366b33c4d88aca7491000000000001976a914fc0abc5bdb6536b8ee53491f79a307b7e41efafa88ac000000000100000002114ae6e237a7608e1ed77f8eb4418b9733201944f547962e1bb8a7e917e47b0d000000006b483045022100b4bfa5600eb69ae778c5161e92b2ac264d51fb9d8290a1ce7c9f6385711883eb02203849342ead32d95c83b0732aea56d037e01bed1092e71fb4c5552a2fa591c6fb012102f9740daa1cc88c48e8b78e3b889af2f21aec7e3cad7d3d8ed6574572f1c31c5dffffffffa56f6719de1ae0f491e334f780a7204a833cde3a950fd150935d2fece7a83805000000006a473044022016761e99b60ba1c9599d9cfaec54c14f20582c8906a3336b1eeab77a899ceec0022054987514ba0626219ae5ba4eb0a0183830572def6a5073229853f4b96ba20cae012102a46391bd7ba047f50f67ebe58ea05b631df90cb096d0db736357bef6216ad0f1ffffffff02445b0000000000001976a9146ede94d77318a624286101afc4f12f5d66eea8ce88ac5a4f1000000000001976a9141e22b511b0ba3a65a794f58d8dfcfc58b35b671588ac00000000010000000268fb85cf40333c9d6c68099d574c189578a5a0e22b0975080ea340d99c17541c000000006b483045022100c03f78e69d3473b143d318b6b26782427f26865cb4d55011f020cf8a6b804d76022029da988e434b878ad34db92a6cb030715f9d20d2e3723ccd1718475fdfd76eeb012103fe9fa8f0045869889558c255ebba869b0f5bc2931ed2412af8dd05841471e681ffffffff1af0ca6a06cb4d3ff0708dbcc9b070b93ea843a86f67d6ef796d8b929432cb99000000006a47304402201843eff603cf74c309c6775cdd03e1089c4d47bb93719efa011be83a0a78f25d02205a6fb730c271cd701e0e7ab21bb0eae77a335a57b28063be7dd13a7c78cfc286012102f128af487ba7bd9a2c5363f0d858c796528c8ceb232eefd75c881aa43f4574adffffffff02400d0300000000001976a914a9385529fdad30064bda677835467c1059118e6a88acd6500f00000000001976a914b1f1b70012d186c87cae45b978ccf17241d53e4188ac0000000001000000025fa2f80bbfa0a59e95d5d21c7b3978ecfde71462e363c20b0f6874a732f69ee5010000006b483045022100f2f214d1eb1a9ac723799145d3f889ac5b21bce51ef9b48687d4af3293b1113e02203d891b3db82702852681a5bbb1b5ee1b0addefed37098c2cd3ece76a4ae0740c012103b5e87580b49bb682210712a2134e733b5335c039d01b827eff509abe7d0f2cb9ffffffffc5348ea29760b1ed1a0ffac627a58314c860cdbfa07864d88523f9ea89dc5420010000006b48304502206b9d8323493158adda276247574802ba9ab71a045c449045cfa6430d783d5c6e022100ed9c44471fd75fc0beb2690e67d052a0160692dd1ce5dfbecfe8da5f2a45f97d012103b5e87580b49bb682210712a2134e733b5335c039d01b827eff509abe7d0f2cb9ffffffff0240634800000000001976a9143cc8164e264fe4ae736c4083410d4c2cd30f452d88acc04f1300000000001976a914b6c945bc0f1ff79d1fce2b5864f5cdd62e0a7ae688ac00000000010000000269705dc38bcaac091786dbd082e377e071ef1c7b0f34b3e860ab97157bc9e090000000006b483045022100bca2d06dc1d7744ed538ac733eb6b107898e9395c458ae6f87678c0d4c62c06802207c0a068f528f67f046f63ca0df539e82b18441a6019add90d7fe6079db7729530121035e67c94c80626b9d35a4eb2d08281ff89d736a6b531f22c6731ad51d41355745ffffffffe0057a257aeebe7b2cdef5890ed9f7c549f7724716abb4e4e88cdacd08e061e8010000006b483045022100f1575f5258feaa5df6fb9cdb96875284e36773c26c8f689b56b82f5875049168022052ffc8bb404e8210ac9895d79569759b02bb83d72d239f67a840492ff578de4d0121036542ce5ef42cf0db962d58a183291deb34be7cf5f9a2c3fa404b43c5bb5e37b8ffffffff027000094f000000001976a914fb19253681ef5bf4ea16c708643698dd3846ecb388ac00cf7b05000000001976a914828d5dcb5c89dc352289e7d1d201b3a6ab3ee9b388ac000000000100000002c2211586b41a4bc97d01bbc2bafc4074a46aea31058c34911a7ae9e54087cb7f020000006b483045022100935217d81b8a302c4c8d706dca706a6f0192a531d0b0fd2b5aec33956061d069022036c58a8d87409387e0fa3db953b7dbd678f9bbd6ee058233b6a3d197548a59aa012102cd1f1602f26dde53fee26e989a16785fb5a4de6f2cec27ef09a8eff8f1306bd1ffffffff6c7e953c87dd495747226fa97c8888a99d778363aeadca95a1c93bde4ceb88db000000006b483045022100a7b9b1afa8bf629f2768269dedb1d6c5601fa7b8c71f2943d663f04cd861d89d022057d8481172aa5faa69c408aecf6ac67d46b24314abd1275b8bc0f91b934002900121038cdb5ab9f97b9e5c7a485d6c3b1577a2da3785e86479450b27a02e634cc642a8ffffffff02a0860100000000001976a9142d5e62586a3d244c5e3c4ecc32eaf7630639a1fe88ac6b470f00000000001976a914c6aaaede9f9d43193b7749d5c57c9ad1c4c327ab88ac000000000100000002c481e49d3c43af9803e5c2ab43cd65f7e683a9c4a582d192df4565bcd3439be5010000006b483045022100808ce8f7f0ac830207b9bc54dff1b11d5c0ffe3381e8b3de7854f1cf4fc2e90b022016b5a54a012d494438c7c04f37e75d8c7cb6fa6ead1c90323d05fd17625e915c0121030ae096c2324003b60aff4614385a5d0c78fd0202fcbd6ee74021b50fcc394dfbffffffffab402046c0ce06d4bb83206bc558cc075a3774ecf64a9d3ad1c3236143e46f2b010000006b483045022100a3952b2e1ce07249e655071d301fb4a3f60012fb38a81404cbacac9340aeecbd022029e2916ffe02943932c789635abc91dc213bc886422209f26ee6e83b513c5cc30121035897535e4918dcedbf540e47b1f44a42c2abf2918af9f83db348be90df4d6690ffffffff02599f0200000000001976a914dfba28dc856c9a949fb67a55b234adb957416dfe88ac6168190f000000001976a914e95b7436132f3a0a7a4f58b11708a73b2d597d4f88ac0000000001000000022f924c484cacc1c8008cdd196f03c7aa91a9a7b688fc0d7d16b3eb9f7a085f3c010000006b48304502210081f30eaaa2f75c6aa26dd1b6a1a4cf3a06003cf9f38e8d903752dc8bad382246022021ea28f2ae4350e8ca479288fcd07e93cde3727b087c923d8b979b2160c06904012103db1f92c07a99df028296c4dfa2f8eacc0980611d43613e279f1d71da0cebe2bfffffffff736b38a753465f81031cd2dca539625c0e785904a363c92ef57854357bc8f09b010000006b4830450221009602d7fba6edb9e06a708e6bf4d7a5d0fd4afdc82214510841c4225023c098070220037446eb63435bed4552df905f1d6a44b1252815adf3f1bcb4c5b12485b33891012103f0dfafbc9070eb84f4df5338e0a4d661e5add8e4f9d6f41000f14408d4204088ffffffff0200255602000000001976a914fdded20c0ea9bfbd6277fd8e662a6814319cedf588ace95ac402000000001976a91460cbca5891b04d6db63338d9e59048e77d4d90b588ac0000000001000000020e2a262144de4c498d3509463bcd50b6b02bafeed4adb4c7bb0d18f52cabff12000000006b483045022100fa08411f7cb42bb615b713fbe21e0257b72cb4f5f61c5a668c545cdbda8eb785022059e5a689c2c9d5260efcb0df8437d0033618cca583e0a35d97e31599156d8398012103c30c6695c1cd0570dc692a8223a0c72259377224721c0bd215cfc181cd7fdbedffffffffb01ec2d5d2476756358a2195dab0c77c4216484cc43965b95e01bd237438626f000000006b483045022100d0479500671b90b83de9eaa4fc369337b3118070c97226311cdfed89b0866b2f02201743fcf337a267c1ba5dcc1bfe186c98e51d8bc7788c1c329007bd8027b6cf4a012103a1be5261bc6e5885d1f881d016282faa9bf08205967be417085993db989169eaffffffff02394e0f00000000001976a914ef8994da5f26394a1f3b772fbf1b07a3bbcbfdde88ac20aa4400000000001976a9145c5463f5273c54c6faaff36f12b3e3d2fdd58af388ac000000000100000003b5dc3f08854409bf610c1369338329ecbcabbd30f86813ac44eaef68b2d398aa010000006b483045022100932a007751ad135aab3918808c4a262c728d1f0bdea0f8fb68dc98ed17a5b18c0220716ceff39e163cac1882f3a8abd9d7240fe426067281417f84f08129e28e73210121038ca47fb100bf5ecaccd7378c7d0d6320169d6192158f82c6940967c35ac227e2ffffffff7946a2ac77792419d935ec7b08a666d5305e6db00f767a10ac9745b67eb62478010000006b483045022100d5e5653a8f4f90f29686b27b0e3520ca157bb6f1f19c05dc2555a3b42e83ee7002205b4da1a5559e18fdfc12d9ec79cb566630bb56f80fba222c28ac4a651e0b37410121038ca47fb100bf5ecaccd7378c7d0d6320169d6192158f82c6940967c35ac227e2ffffffff8ce02cc3f66713b94f7dd4a9af382f3321c49a925b7dc33d3c45f236bfa5817f010000006b483045022100ce81963ff8916fbfe939d17efcc683b7eb2fedc3f7d9ad3e7d8427a14fac021102200534fadf789ac9c605650f749e398e40792e0939764a6b2974364d6a69461d1c0121038ca47fb100bf5ecaccd7378c7d0d6320169d6192158f82c6940967c35ac227e2ffffffff015ec05900000000001976a914a78b8d26957613f8d16d647c70213eb7e705266388ac000000000100000002c5ab219f6881a8fed6c8fb224630b44c51e9c75f6847633533d5515c5a9a1724000000008a473044022071bcf7933a1a325667060e2f689ed4543433b5457418b12e4e5aec320133966402202b21b656d4f9f099e82b8f013578d81abd35a06fa6d3fba0fa48e26ee992238d014104293397b707b5a23a9ffee09940b3e16d9dd585dbb80e0b7ef083148c492d2b32e65f878c0d3926fbeaedbe0792f8a2bd04da33f8dbf507126af5078c044a1db0ffffffffe296e946ad2212a4b4b4ecc1468a21576bcef94c965cf6e0c4a5a18ec96d2a37010000006a4730440220656fd430b4bf4a79b211bf6e82a74fbaf13c23f44ff3d4f7ffded6d70a2a28a8022048c458a111246e53f4aa47983b1ffdcdbb15c9bf519eddf34c0cee5f4c0f45610121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4bffffffff02d0a11000000000001976a914f5710c7a405f1aeca11b79ed8203ae5328853ba388ac20a10700000000001976a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac000000000100000002aea1c43db415e4e30a620d9de6557d1ec730b52ef7af744742856f00d122f579000000008a47304402207cc4bf147281ad9a57757d7ad9f7fc1164ec781fc1b1edf6bcc7a5b3f344bfc4022052754cc113d8b741f65be90efd1bc476581860132b5281cc58aca1f7ca3a3319014104a6c93aed872a7a83556c454db39973449982278c9d38f2328de2798646909f58552c6dc6d59c6c1da81c6bb180aa08ab13ec4bf5c7f39a995bb9758d19d60c7dffffffff99e274fce738828e563324729caa0767adbff6872e728ac5d4f9d494ad3cd848000000008a4730440220527f4adb1580aca6885fe0766750c91b4763c87b6509e81f0e54b33c9cf021ee02201998d3745caa90f7d56b175c370ba6a75975a80d60276ae120f9b6dad3d13f59014104eaf51b074e8c8b59badfe96dfd9458fd07e6368ca94116d5eea4fc7976c063e89463ab797da2d51c538eebc0974a95a929d13e98edb6563287474af7d1397702ffffffff02e69b1000000000001976a914f12aa4feb7d9803b624d85d72538ceed5aa2898b88ac8a8c0100000000001976a9146d116a93760198d2f043893ed5d8eb9088f38eec88ac00000000010000000205d4d2c1e92ca4e05ae626a32e283170afc735fc60904312833ffe31c1f7c8db010000008a47304402200eb58e6e83d58cbc8f99e0eee1fc3cebb722e423715f552335095117643fe28a02202e75a991ce1acc9c9b31cca94a558bc1a9c63b822cd66b46f634882824a7c02f0141042ec075981515fc9020e95c8d474a04d520100e17c48e0c1304ec35d6e33fcc8f7b7ceb2dd047a9d92a3c739089faf2ab3aab7311ab11cd882e48de02d4da9997ffffffff5ac4ee047e29eb7050e4f2e9a43195a1f875f624ef9d46daab96cbd156725c76000000008b4830450221008c39cb069d681752b00751ad5dccd2b00fb8bffd08c9ad43ca59bf782792fcd40220520ab6e4db72270afb6195a02d11049aa5410b5b4f9c69a1e13b9729fa960f890141042ec075981515fc9020e95c8d474a04d520100e17c48e0c1304ec35d6e33fcc8f7b7ceb2dd047a9d92a3c739089faf2ab3aab7311ab11cd882e48de02d4da9997ffffffff0247631b12000000001976a914f30ea2308c4c059b40111232999ac8ebf3c5c60c88acbff40300000000001976a914af50323ec6b3b12a5d6ac9ad81799b2f3e37ff8c88ac000000000100000002dfd757919106b76174a92af02561da7d4f804d389b06fc0131c107814fb3ecba000000008a47304402203834dd07a1effce5c9e474e3ed3992d3d7a0bc531a907fffe631ab61844147540220744e183eb5329ec16c0b2e65acdbb3477655585ff1805cb170813117f49f298001410456a9625593897575b54771d32d7037612c5d8ced907eae645d43aec3994dd010d9b43db7c50e134c6bd4644477192f5ec11bd838e943a384d5410b35f6e11357fffffffff7c3183ae2619c6d6aac6691339658391e47e2cb71e9eee8f3f88fea1a1af899010000008b483045022100ff84610e9cabbcaa98bb83ed73645436a31792e993bac9a766ce976aa3a12fc60220147bb35a35c2b426625e6b828c779bc1240e26f582ee4dfd1d51f1849f82652e014104c735efaedd169c5545c2eb27bd21fb50282798090c410faac286f3658f778f1c8286062f749d1703102d19446a53c92981a64a56de3dd13c2ab60ff18646e7a8ffffffff0200a3e111000000001976a914b104f5f94cfb336281c25d23a94d58b4d6ff310188ac94ed0000000000001976a914394c27ad741f345520157abccf2097a01de4d9ef88ac000000000100000002bdf33f8fcce5ebc3a436b9c28a61fdf8002760ee67a4bdef070ccc6ebdbc4844010000008b483045022100e5b09c224aab23028920f3d053cbba686e933cb92865a4177a62b6d787bddc250220183da984c55b8f08d59d851fad2a9496bf0de4f1e921a8249e452b6777d602ad014104060aa2bb92a0ab8a996038e393b3b0a9c89d77fd7e0f79fe56d2425ea3d249bce201565386a82781d1a045a8277fb69c982f5f7f5056a79c21c8da8cbf9bf2edffffffff31718e811b1f655b2d1495a8f80338781d27826a3091a04a8c33247496812653010000008a4730440220360566ef60561ed82612096495f0b070e67daac7def829d2e2b7c23ed81397f602201a156960cf0f946d736bac5d2d76976deb3f0721f43438926f7df2e8dc16443a014104060aa2bb92a0ab8a996038e393b3b0a9c89d77fd7e0f79fe56d2425ea3d249bce201565386a82781d1a045a8277fb69c982f5f7f5056a79c21c8da8cbf9bf2edffffffff024def3600000000001976a91410ccd94064fa2e1dfe3c3a1877d296d14600636488ac3fc60000000000001976a9142cb1dd92fa9aeb9420d35bdab9fd68293a2e6c8788ac000000000100000002fc1609b18ca3fcf95d806e06b3dc6782522838e7a3dee132bc43a44b1cd74290000000008a473044022024b4ffeee484e590c6dcb573630d25fd02d7948881083d0ac1997a54837ad77702200d02963fda604beedf1f254b0d37d2d95fbbc9f062c884b1156fb9b51b67a33b01410464be64caf9fce8219048e43f1679893f36a7817a727305b5873e9796c3fca526f94b46cab4901267a739606972af59619455d380a53d821ebd6e657f0391addbffffffffe840455f404eac395dc37fbf4e068213bfddaa38f1041407b7f17ec05df3e6df010000008b483045022100fca8e796b514fcef86ede7b2bf30375356ac18e31dd73e03fec9c04c42181c7f02204fc9595d11e61fc7bc6364325c89ec502daee9c2b2ecc6ecfcbf92a1a31dc368014104c39fd3d1cb89d5be371aa0837d0e93feb5ece3bf0f6d61690ab6c1b126730b3b90bed98c19b1a4818b2edfbd927dc9d450f3c9ca2c01565c23f89e0e806e6579ffffffff0290051000000000001976a914bc8d74df37f65c832ceb7e58464326ec9ba6998388ac9e3b0100000000001976a91492251b417cdbcc4eb991b4cb848fec85bd9f306888ac000000000100000002ace568f57549ad4d9d164c87709b5ca1ba3e29395cf70f1eda3bdac0e3a5b7ad000000008a47304402203e9c28e46d3027ce061046414f9be2dff479ebe93db3f7cc911eb39102b13af10220018fd9ade10af3b712ee00484e0ac296608e8c8aeae89ead469385dbcdd03f380141048eb9167d6ac5e47a6e53f4cce771be822a615a6f919661705528e8155d8d173d67ee9f0ca409a6697f2727a6d524692a335fe6766deeaa46209f3fa30404f01fffffffff6b5bf4e8492b9ea3eb50ee8b5823da3cd75f31f14bdaabff945d235093d16808010000008b4830450221009b5251ef4ac5fb22dd22d4bf4a3751a9f344a271080f6c6d449115d76083d74802206a70be002af0c7c4f3058f74acaf39d96f9b770234404934ea81fc2cb3b5aa3a0141042f53c8e430be2cd02d415f166ca79da8fa9ad64b3c691aa1c81543b2e299b12f0007c3051e0be2ce92c41295767dacad7959c448eb660fd8a806949a06b2658affffffff0200a3e111000000001976a91488bf392c6adea62ff4dc9d6d55a7826f345d739b88ac6eed0000000000001976a9144e03e6ed32f4d0f3585dc4a5c771fc589a0b921e88ac00000000010000000288c10545d1b34990a39ec293f61211dc7a6871a4d37e0c7cfb8df792c835b913010000008a4730440220760083dd6480a37ec194e2477714ed60dda6519e555e85060c08a4fcfa8616e00220565999c736c4f7a695532d5ecb25dabc68c89b33190980c861adaa524f182cae0141049b6c72b3831db502ed62fcdf85534de12f3d56a222d993e26e38fe139e59b0d650782f9650d7607196dce66374904fbcf1baebd6b5d7dbb8096de648ee6d540cffffffff49af6fd65d2ccf5265bf11594c5c5cbb9c10301bba8f837bb19c25ceebc0e1f6010000008b483045022100d13eaae86ecad48669bf83fc6207f3a47a105e5f4b1313ca46807fd80271684902207ea29df51897b053edc4419c1a68eca6420eea7f185e19b7a5db223b5142a7630141049b6c72b3831db502ed62fcdf85534de12f3d56a222d993e26e38fe139e59b0d650782f9650d7607196dce66374904fbcf1baebd6b5d7dbb8096de648ee6d540cffffffff0280a21900000000001976a914c3de9416f7f92a40dee37a2d1a90e4733622e02a88ac15240000000000001976a914efd63a6eab86c082f65232607f41df7b3e22fb5b88ac000000000100000002e6d394ae5bd33ad5b3b8fa0541ef2adabef79e061fe512088c551edf1ce2a201000000008a47304402206c1e3387f59add5d7783ab4853eeb08b4d26e3f334bdc2706eea31a49de3e24502204166271c44c75d24a978bcf5d04ab149d033d6a16799c8869d9c9ddc42572a9101410480df6adca7edf7b6ac450a470b0a00b67eb82f7739e7b829fe3985ca2d1696f161c7a794af1da6d8e8cccd1fc24de7025e37a83989bdb484274e4f1b531a5c47ffffffff8a1b54c0a4d3afc521de01f3d9040a7b7507d73247abba60f719a967bb14433a010000008b483045022100e97dbf54aa2905cb6a48ae02177affff2542ea62b579d1415c1efc07935f9d76022062dcd24e07f2cd043bec6fcf2b6e7f5d83ee87fc33da7fe75391d4e993f3494801410480df6adca7edf7b6ac450a470b0a00b67eb82f7739e7b829fe3985ca2d1696f161c7a794af1da6d8e8cccd1fc24de7025e37a83989bdb484274e4f1b531a5c47ffffffff02bf450600000000001976a914da5dde86d69a5d9dad88763f2df4b048953c7d0488ac9ade0000000000001976a9145f2839e8075dfe25989942ad2778a6cb1f28367a88ac00000000010000000219cb00628209dd4814a28f716e83460ad240420743e46c5f925db2cfd718238b000000008a47304402200bb788cf1c128107de1a93e1e21cabadb15824beeb41d232932ac13699cd11dc02207849c4b091e3672e6f176bd5b447fa3634e83b103926ad8e856adb7e41c4d9dd014104293397b707b5a23a9ffee09940b3e16d9dd585dbb80e0b7ef083148c492d2b32e65f878c0d3926fbeaedbe0792f8a2bd04da33f8dbf507126af5078c044a1db0ffffffffcfd51f86e568b026d11be583c597a125845de6065142758e266c6dbe9db8a27d010000006b483045022100ee430a5bca97fc7ac70245c9f893896eea6cee0deae2919c8000c3e7432356f902202302d77ebdd4a1eb3ef1ff738162ea2c368216e2ccb5415cd455c9a12bd36a080121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4bffffffff0242bf0600000000001976a9145f2839e8075dfe25989942ad2778a6cb1f28367a88ac88b40800000000001976a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac00000000010000000219cb00628209dd4814a28f716e83460ad240420743e46c5f925db2cfd718238b010000008b483045022100a73c958e920a94dc5aa2b031d9fafcccb2bbc6b426d15f56be19eaf95630b44602207f84e5367645cb86e51eda70f67b05532b62f7500785d9028e7b68eb08484bc701410480df6adca7edf7b6ac450a470b0a00b67eb82f7739e7b829fe3985ca2d1696f161c7a794af1da6d8e8cccd1fc24de7025e37a83989bdb484274e4f1b531a5c47ffffffff36412ad0920aa5c363524e445f8600f6301158d727288f56c04ebc120f7a5140000000008b483045022100b6898b1f3d301f4fbb81bb2a92de1ff3c10cc5c07cd2a91974aeffeadb2b1bdb02202d68f25865c4e11922e60be8cd4fdaa887d4275a611069646898d3e2eacbeeaa01410480df6adca7edf7b6ac450a470b0a00b67eb82f7739e7b829fe3985ca2d1696f161c7a794af1da6d8e8cccd1fc24de7025e37a83989bdb484274e4f1b531a5c47ffffffff01cc760700000000001976a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac000000000100000002181fed550dc092404ea20275e94359f3e5d96161353811f48bdff313de0c125b010000008a473044022033dbeb610009361bcbf5f8984b2abe7fe00e3e48d93f4222d2e82a34208cf91e022056bc9291adc93cc9e3dac7edb71ec1a4e34fc97ab428ba900832c478ce89bfe101410470d0259b8f0d5034c235c829a8b13915e04c747159f6bb26e89fee3bd9a0c50f60ae594e54243fc7639e1e2cf67c6594533a993b02a85293d87a66f598540571ffffffff3d8538714482ff493bc11d89d7554d1bd34fcbec692a97ab310ef0657c257bd8000000008b483045022100aa0e9191f91f98a11ac3bc148bc63ea268973e1f479e2e0f576a90a87c90a8400220345923cee26bfb4cef2474f59a6bcdc9db96302d47dff5b2ddba3fddb306f91601410470d0259b8f0d5034c235c829a8b13915e04c747159f6bb26e89fee3bd9a0c50f60ae594e54243fc7639e1e2cf67c6594533a993b02a85293d87a66f598540571ffffffff02a0bb0d00000000001976a914da5dde883cc084fad0d72ab4cdeb11205fc63bf888ac50c30000000000001976a914ca7eaccd4ef037929be65c7706992b055a41362e88ac0000000001000000026f8ce9f97b17ef4a29d33e7f0f19a5c0d379048594311c460e15783d89e514ba000000008a473044022011420ece4381ebf2880bbb3f472a832796532fdec42fee694d546292b2ddd56002205dcbde0dfabab8fe79416d3df0a663deff9f45b7e37ffdae76e334a357cc8be2014104da6bc6a6139bb008454bfc8371141a5fb8ba6de87e9ab1578ab4c31e1b25513d6d1b1b0e66b0e39a29f6baf19f9f0faaf51d22bac02b1c07eb08058498763784ffffffff3cc8543ae0f38541ad69ac9c9d4af6acf968575aee9eafab07017b61277e7b43010000006b483045022100b95b0de07d7b4ee5d89db1411b4a455a81daa9bd1b7fe45a6a83a451be94d26e0220026b410960a98edc0521a8fd51a80354f8594eeb2cdad94f300063554a92f1ad0121028d15246e451c1b64b013ad3e83b10cca9805aa0f1aec81149b2e02d71b77bf4bffffffff0220f40e00000000001976a914ca7eaccd4ef037929be65c7706992b055a41362e88aca2200900000000001976a914f0dd368cc5ce378301947691548fb9b2c8a0b69088ac0000000001000000028773f9efa141d42f501f5cc1c8694ba847a09e1113966559a1cf96d3198687a3010000008b483045022100b12995e84ab5b91d68a45420090bbd2a4d4fdbc91e48cd0e2401d83551670d48022051b21cf5d1909f81e6fe0f5e1edf2283903e8092a1d1b24726e4823442714d4d0141045004624f44b8d7172fc04c126c2629536f533c0174aacc87070167a4b6ab65981ffd6a8e220a53198fd14d8f1bc82ec0ce8db600c7390cf2a74808cfd896f002ffffffffa38749f84b00ffd22e22de1fcf6a5bdc3070557f8bd800e7f4fde67b6719bc89010000008b483045022100feb99393b1e4d80eda329f3146208da1f13204151955f8297d7bcfd6a67e438102205220dd1c50dccdb482c3427c768da37bb71a2d191b21f4150e36a06ac273cb130141045004624f44b8d7172fc04c126c2629536f533c0174aacc87070167a4b6ab65981ffd6a8e220a53198fd14d8f1bc82ec0ce8db600c7390cf2a74808cfd896f002ffffffff0280841e00000000001976a914270349d5f1a856c2317702cb4b8c9a3e31f76b4588ac50802000000000001976a914543027ebd4cc39877b31631a8b616e5229bf043e88ac000000000100000002bb6e625354fd3f403717fb5fff24b4f00cf5ef52d4f61ebc53e56b26cfb5f164000000008b48304502206e7fd08c23d34af8abe9abba51b9015ae59828e60d60ca4b332749c652f515f4022100a149fc9b3cbd694fa6b4ee658c97767c52405e4142cf018b428107fa2bea823701410426f96e96c52076004e0bdbe21485f69512f82d80980511d76e3b67ade5a58b2a3aa0754c78c2dbfedf89b7439268c02b58bbfc40600db582c2030bfa907408b6ffffffff3e8e253918d27342899a518d083278646a388a348fd94dac0281662f5266f952000000008c493046022100f348ea07d739eecbebc93656b4185f4dbafdb3f61e777ed463d36733ae1c5ed4022100e84b7d09d6bd5b192fde407a27b7f8114b4ec6012d3bea28d760d64204e2acb801410426f96e96c52076004e0bdbe21485f69512f82d80980511d76e3b67ade5a58b2a3aa0754c78c2dbfedf89b7439268c02b58bbfc40600db582c2030bfa907408b6ffffffff02610d2900000000001976a91454ab536bd2c85df8ed88c3942427c415fadbc07488acda351400000000001976a9140df75ad11969c404099bbcec9446ce766a41221388ac000000000100000002f6d5f482decf065e881e3b8dd18c3d53ebbeb82e24947be82d838f06d4d9938c030000008a47304402202718a4644f526346da9f44c820607f162921a6e6d741e2195d0885d238dcf2b302207811bfdc67534ffaf9bbdaf4da3f47a88cac37c11cff6848ac04436abab640e6014104689dd09a2134c5c6ada1541fc715c292395a622fb59096b942e2dc13b8318cec2f3cf1def51074ca8cfe6f2ba654e37430b01797bbd68d529a49ec3cb23c80a9ffffffffa803e6094b44ee1049d88bac8910f4010fca1b62fbc845760d5cb63a0d80bb16010000008b483045022100a602dc66832a3ec78fd258e0251a106f8467eb0b83f37bc4d9997b840b8dc1c1022000f04d410a6736330da64abdb7da91f7dd21fe57ae31f292a3b43e7e9f22b6cc01410452fac25ea480b3483e56df06f8f34ea12ad9f6efd071c792d8d64355fe4da6dba9750cdb9003dc9744042be98cfbefd42429c1b2a2e46f4e28345bb493ee1e08ffffffff03b1210808000000001976a914472e53c0a19483ab7d32a9debc65721789f00af888ac138e6208000000001976a914f562781e972686456514455c29b0d0c21f3abb7c88ac94ed0000000000001976a9144a36d029c3bfe8bbbeb4206478b1552b612415a088ac000000000100000002b85900e96279f8be262c776ccabce64f557b4021e8f671324a3e92ff7adc60c2000000008b483045022100befee20276bfe9a3a9e59965b99039180d3fdd75afc6d571b1d7d346a75b04cf0220778c9c5d793aaf2284c2ccdd52cb2714978b7a13351a73ca4be693525bfffc7a01410479ecc33109084e334c338e31ad4282c39440de359d946d4e66671c6478f80ba84ce6949681ff2e52f8e3f2e05080cc25592a662079633c1d75a6be3dae1b890cffffffff33ede880a22775417667dac13d94f2ca8aab606841b155b6d8a8c9d85ee2283c010000008a4730440220726f0140a3408d1a276a74a31711c7648f611c794db34bfb378c799c0553624102206900604a95f4b24ad32970354d793db0ce535b485beb9f47256b9453f27edfa00141049f1d8a77c4227b75aef9748e02e3c81767f4b551b0bf4d6469df1c0c87e4955a1c036495bd5017143f3b7489dadf5ee564f1d8627ec01e831228d2b557a70e01ffffffff03a0860100000000001976a914bd314932e2643a7fc53ea6e9db8f8954903c687688ace5540100000000001976a91405d99d15e7ce574767642428057bcb8815878f6f88ac94ed0000000000001976a914488402e337a27c5e1990f8158d5621d007ac996d88ac000000000100000002aade3463dfee6d1b8ab52537cf7400fa4768d624bd48528c81d2bbd46308139c230000008a473044022029a590e9af3b0eec2f7e7ab08c110fa0bae0cb8272709ca2e56583c9f40dd3b202202812625f2808d84df406babdb26bddda1687f1bb0440585513efa6cc501d34f701410479ecc33109084e334c338e31ad4282c39440de359d946d4e66671c6478f80ba84ce6949681ff2e52f8e3f2e05080cc25592a662079633c1d75a6be3dae1b890cffffffff550af905cefb299a098f5d9989587c19a7653753fe8232d7e003582b562deb1e010000008b483045022100b730d3dc5c39cba3fdc3831012680e2f6165894e44a8809ac1a06d90bc571a5002206f5007f1eeb08c73031a4f6147e4a57224109017777f8c926b0c3045206559e00141040333fecf212d7876c9e823dd139d3fdcc6433f63065bb6df4e6a2370009bb56970519ae201827a5aba6b4f7f47d0b72c9910763c7aed7419728140cf5001ffccffffffff03a0860100000000001976a9145ca37b62f843a168b4c304dffa176e888971ea4a88ac44480000000000001976a9148ce57da128e76afb72f35d6a1770178af5fb8fb588ac54510000000000001976a914a63fe52b9a7d54c8ef07a79bff9acea31d1fabbf88ac000000000100000002add9ab6b125165b9a08d8f709ef5018d995f90a4bc2baf661bb9baf60c561bab000000008a473044022004dea9857ab3543ef685efdedea2f516a553714edfa7299094924abd986860390220192cfd3c805d2838216eb2cf7460068158b27e5b12b605a7a4afebf497e4eb69014104e42aa0dc9c3e95e824fc43f361af768ac9fb3958d85dfc8f2d9c3642b41cd3a387c388dd6728b75784fb00907181021b01f75307cd1f55c71e30e56cb875282effffffff1de496d83543d397d5f7a85df548a2f2543ff5bbe35d39823d4873d1d6fb7550010000008b483045022100d12d74c4469a76b6d5a68e4dadadce2f04ffa09638d9e073f42c24eaf9e374ac02202099f90bc3026684aee486fcc5b399afc41092d8fce72f4805642d4a74ea08470141047e25cfe8a868e82a054641ccdd75c7643ba009432958b185a709d2a48129cd13d98f8d77f72ddff26c0c51b643e43066bf9a331ee2b11da6e5c751481e24f6faffffffff0392b62c03000000001976a914f33a3446bde3bb98efc4676014c2792d6d09bcb988acedb61000000000001976a9144a1f68109dca42d44ab4df8d4bcd58d32ae132b488acc6e30000000000001976a9144c9864fe2946035139773bf7c107247e9929627188ac0000000001000000032db47904bc4900f297e8d75c48bb5be7d21611ee57cc391ee1ee6de3db15476c010000008a473044022054e1ed8ef08c7bb0af9b3d9e9dc57d88bb0d158c66228c61f286c5263362215c02203a17fee2f7eeaa8e16b50a3f265e9f883a407b664d08210b85661f1fec53ccb101410464d46bb645d6f9eca350d806709e00f9f53d3357e403d5bca1c71230d58c474e931f896191c98b2028eafe3e3127d3cfbd600b78442fab715fc0192acfbabc36ffffffff60f73776facb40af231e413586187fb90110b5ca86e95ecdf325f7d955512c44000000008a473044022070de91c247070ec7f5618abdac25b0f0c609d685fdf53c745e86dceca6076d9e02202cee8d97f481484072016579b4c2beb9ab9a166cc31bd936883ef4a0a574a853014104abcb40d71a3a7cc16f9633a8a5d27861d53198f0f06d5e3260d6a2211fc25e2adc0dcbad7ed6e022ca7fc2bc53dd375eecba2655955cd37c5c2ed273f3d38a31fffffffffc0d2d353aa040a2408cd43c467a7bf23a7edc37c0bd6a69529bc72411203c5c010000008b483045022100b37e88bec14e072e5854dee2d655828e4ebdec7a7a3c62411e20b4814a01ac6702203318715db84c93dbc65f0a20909b36000fc48fa8d057c6608fa692d720b6fcff014104af3d0ffecb4cf642d1b73e8096bf73d5d5edde746f7b2f20ff3e684ce8162d75eb97844b0c1fda1932fd16619981f365864b5a84156506cf7bf33ebed0c8d7f9ffffffff026ee72d03000000001976a914b15131337b9b3d290e6e4429e1534771d55e86a688ac2b740200000000001976a914bbb737e6444189401d4d8a98c08afb399cfb205688ac0000000001000000021b06fa54ea348b0375d6afd257c3bbbac50ecafd5e0e585daf3e8d87d89ac7ef000000008b483045022100ebd9cde62571625523ad4c0a4d57b8e58c5d6a41e761cf2e396d392218df098102202dd41ced1104974fbba8535d81afa6d5595eb7a49a05fab3ca8e580056b0a8b20141049a7894a2b9ae3451f0f13cce15315fe69f31bc3857a6efab818b6e1617d962f6899a07602bf35a32e954ed2904596739d6904401fbd9dbec59b665dcbfa643daffffffff30d77fd44adb739c8049987a5c641103b4561e320f9c1a2d3900dca7e670e81e010000008b48304502210088b75ff97f3bf4c35e1eee5374c36cda60d801858cf9ac24fbe668b1b5453dcb02206b92d708003ddd84fca36896f334afc9ac2c3317745a28f60ac7c807053c3e0501410426f74a0bb07f232eb875de4f3f511bdf52ec2f92f9b029b70a3a7537f600e5baa0fa515fa5482708d169537b87972d7b63df73c23cee564022546f26772aee6fffffffff03a1191c03000000001976a91436cb7c1d5b9c52d37b24fbe8ef7b36dff93e656288ac96641c00000000001976a914c87b9699a7f45b81fc8ea5ca1040445be3e4ed7188ac94ed0000000000001976a91431a5070f13c596d6d70d5653be2ef861f8b0963488ac000000000100000002e265ca1488f1e4f826e33f996228eac9214516dc28eb771d54a61b6b4a1240b2000000008a47304402203a89f205597cd212db981dbde2143778ad87fd35a9f06d1ea35a09e3488cad9702207af35319ab5b6e32a703c0e2dbab32bce8b4a8337eafca60b6b3f163b5a4e167014104c050050a33240b943652854625020a92a6e4bb2d8bd9ae9ae5f1c092d99a10cca228c2fda9fb87b5209a3b8a0eaefde464a558e6201c9abbf1079233e43ffda9ffffffff49608af7672697979b0115fd9963e54400b246513c3ce59fce75add70181f8e8020000008b483045022100da744899eeb5161a9d982f1bf5d330e6119271ba497fd7a3555c72ace127233a0220744a1b9bf3a0d19e9c4f5d2496e76c21cddc9b032ddad9604cdbb4be0bbfe165014104f765397683b5af62d01ab2708aadb90c775e6a2cfdbb386f03f65703097f961118821487aec80af67e3b9707c1011b5ecf83bdb6f9e2f93f1a5f283fdf9e0bf4ffffffff02100d1c03000000001976a9143f8eeb5da54790785452145a94c4f2eaff78cd5088ac84c60000000000001976a9149c99dcaef83ac9ff5e81ba6c4620f924877d489a88ac00000000010000000392498c1329832ddf168765dd5325278966343c2f788e0fdbc375ca17a424ba59330000006b483045022100cba4cbe9b5bb2d6f312a1658552ea71bd6e78cafae9f748e870e0e6c79bd7e43022038963de40612d078b637e2a801d7d8a3d94e9b052d614bf202b6c9ab82b20a3b012103c054590554fc059039a0519ef407c7336178652930d09c620dc4fefec621bd1bffffffffe0d33964c2b8eb83ecf76c9b25b79595d6f9f44897c69b1f522d8b5c7cf6c86a000000006a473044022016174b530395460e770593f6b913aaec4d1abda9a8c4f37173f7148f5758b3e50220506753eda9bcf96a606b6d6b1801d888593d65bd925aa9fa21bba845ff27978b0121034163ba3439c948b2762906c11ed0885074c9d45479a830228899537357089086ffffffff0322c9836888efa7f8a54a743ac34780621a95fd6d76c52a7f9998be9c64b48d000000006b483045022100972d2f15136ed4cf6a806618b20099af99cee15d599d4a6980d82427916de31d02203d0b6e5967a1c8a6dea2ae2b516d9619a91a796fe172892fd38338f8ef5bed8a01210391dabd268cccd7c13a5f527bda8d976514a298a59ae7e093c862dcefd3b6dd05ffffffff027ea1c30b0000000017a91464a0363d19b5913ecd7fbfd3d7d0fb0b1227a39487a201ca15010000001976a9145bd0ce93ae8d518f715ba2892c3bb433b2554c1688ac000000000100000003bab657ebdaaec260f39698e6f3a5901b4820fa1b1472f0721fc7750cea59e94a010000006a473044022072f0461305904a2017480c048e8fc1c16af970e06fb18a4f882d71a22f73cf270220162404ecb3309b9797c349b3a0a6c7e5cf717a756b23c69d26877ba9d8975093012103f5af354bc11893a5d142a7dec5d31223fe180f3efb07219b28ac8bb78d2432b1ffffffff8487c8384bfbfb052c400d4202340608d4f8a429541a4b2b2269939057da9042000000006b4830450221008806be3e28ed4971bce05cef39916aeb7c8c37cb294177152076bcbc95d28aa6022057e7465cff8ba1e35b5e4af87cc5d97e8c35ac5ed53eba67485499a01d1f5190012102a5f1c6c743128c2bcb507ba68738e8116f8e0c2421e7f39955b677f956cf0e18ffffffff15f622e8919049707ee68ff4fc8cc70908e2833f772ba2e3dbf5548f90b3e250000000006a47304402203e3e04e7b273951d7346d41a9c4e9132092da7f80326dcd4c57f29fbbecb88240220017c93e80c36c6c99e205149649d61f737f7610b089a76adc7352613994dc231012102959683ad6f667636d6ac0583760d785a83a538f4de67e610c5adf01004eb5fb9ffffffff02c0e1e400000000001976a9148667a0b47a63a67ef38b833a589e333acfb360f088ac10090500000000001976a914b648c6f166a4c321d665b62eb5595bee38b6bd0288ac000000000100000003d662818c9116036316d5b1ef415557c50d5a49d1d9abb1f002472d18ea7649e8010000006a4730440220204cf8379d64fa04839ee58f8cf1db5a7d13d8a5289c29cb0916248b708b50ef02205d7e1ea13f1e65bacf68ef59cc750cc569f95431f639a1551dce62d2e56025ea012102bff66d64e5fde31244ecfb168b8f68542bc85bf323bac9e07e733af2dfa1736bfffffffff5443c88535d23f62d80abd7d7aa009c5c3705559285481badb71d73cb6f4ead000000006b4830450221009d82b6cb6dbe43dd1a03412432862b382d8628adbe738370dbbbdf72f4586c7002201fc44f13d788f8aba7de4cc3e178727c407620c9b658d82549e4b545b27e7ec8012102bff66d64e5fde31244ecfb168b8f68542bc85bf323bac9e07e733af2dfa1736bffffffff6d5c97e4ad9e977ae1f6c42d887a5a670f474cdfd1451d5fa6c13962f81e420f000000006a47304402207228d53e4c89b083b2747865aed8971a76924641426e88fac89329d59910190002204311d07f3c6cb13f9b32dbebaef23227f3a55c2b20446a2b3b3286c3f8327a82012102bff66d64e5fde31244ecfb168b8f68542bc85bf323bac9e07e733af2dfa1736bffffffff029f513400000000001976a91479ac58c0ec17d19ef2cb7853f4dd6eb4293a00b988ac7c782300000000001976a914c387c3ba41c54daa3e01eafefd36838b5fe8a27888ac000000000100000002e4fe9a7b03bd1abdcfdd587402827bf5f02fd4bafe1758049e1557d24adf023d000000006b48304502210095825a2e491b737395c2c5cade58c7a161ac8fe729858de307f9cb916f79647d022020b8469f31210e54917c52c0aa0bed7d04ca1bf5e10955edafe363ef99039691012103d56be50a08ec7d8ddabfa78590188d24f98ad437e2cfae7b7520fa062021fb5dffffffffe01f36cdaf5cece96e40b6af47b7a1bbf83525589227a3666473b49969927c2c010000006b483045022100f8549405d53d58bf2afbb4520bbdc071a31727c4749ca2c31b537599324b5669022021af2323ecb749a121c37576a5531cb65b32da75af5faf75942058849ec586e1012103c42c432bb89d4f541ffff5772871cd897fc149adc5a811d86985a5adc89aa4ebffffffff029f513400000000001976a914da53e43b441ea706fe63fdcf5e360463e83dce9b88ac0c1a2000000000001976a914ae806ee5fcceac6e7958c0af6905c37ad0ff1b1f88ac000000000100000003ff8278a55a71e2b4b25804f8c4e87bfb7286ebd077129e76effec957f048738d000000006a47304402206b28431597cf59d64418152d67b6ff14b5e89708a5d14cbfe505bed76c3a7a53022064baa4217cdcd76ede50f78b15ee9b63639bd2f63a7797e1f29ef31b34fed1930121024222dfc7ceb3a0755306a68b1c77c3147a48e6158943c38e9b900c379091441cffffffffa0037fdabd5442aab4b95ceacb22526b27b77844e93aaf6ce040ccaf9c64dacc010000006b483045022100fc111908aed79a663202225768e82083aef3f2e9eea707edcb331fb1781084e702205eef6812715e4cb597897c7192b66b4637645fd6ea2dcef6688da1640e3f806b012102fe622835f43bd4f78cc465aa379f76a21fca153bd421b4ec0e80fd802e439131ffffffffe72eb6138c6f8a05a1699797f6df1aedd954881f29ca4c978bc66cde321d2664010000006b483045022100859ececf2aa0b8e43995bc3abf94aab5ef90269cb8434048bbb97c7ce8fe31a3022076d92871bec8840c802ec245b2d028706cb04e0c60373f1e49158c516e9b08470121031136babf6e01a0ab7a1788e83e9792068bf2a4b1bc92a42601186063f6ff5e75ffffffff02c6a84e00000000001976a91407a5820f962325b4fe9d894c9f721cfd481618f488ac005a6202000000001976a9141e13f46b4fe4ca9020caada60df641c80ad82ae788ac00000000010000000370a7045990f6d00bfbca584703493bcbaae577fb62287dfd98367937d152a6db000000006b483045022100c4f1da6fe9ce03e908190886cd6627e80a59c4804cfae36c765438e99d33592d0220633eaf175453ed61d07be3c4937d35e835d27c1e2d8b1c36e60e6ba07f2b706e012103eebe1f21a4bbf4a026c9668a9dffa6285b09915a6da4abe6ec437004da8e3491ffffffff9c4864a6a744696a75563dfc9399019af8a6345d9c2cd7171ef281c04ac275d3010000006a47304402202e09d36241a4dbf105aa65f5e56f5473fea8198d001416a96fe2f7be5bec00b5022056af0f20f48eefc8d2d3dd131323c7cdb0488f30cf7dba0721ba0b8c3e06ce61012103f7f2917018fae7de83f0a04d2f73dba3ae39ec2c3d5c6b8ffc2f0024f5b33cf6ffffffff76c1281fefe8c53f2546ab3da5f40060d12cbc6d5e14253c63c50628c4d121aa000000006b483045022100dd9598b600b1e014a785a70a624522ea6672114f2c74653f4ed65c30c91161d602207e9e10918fd01b9f71d9d3698767c3880b9a33b8843c9c80a6a4386455a94d8201210212e631428341b5b408fb8e1001878c2495f1404722d5b2bd4fb06569eb58c706ffffffff02005a6202000000001976a914a94e5cf642c1e100b7777b789c07c614f353b62f88acc4450f00000000001976a91450c6cb882f47c64329ba865b9055ea95bb317bbc88ac0000000001000000034e5e7887a22d54d87d7e75c2d297d644e813cd5f54d8be892c2f389c86dcb7bf0c0000006b483045022100df137de8f526bf3cf57e8ed9f6c762cee6ac8f752d1e50d71b9bab98d1b8d0f202200633505ccb7698ed9bd1854fed686464a89624786f9cb52a50cb64cf81fe9cb70121036def04e46ecdaf13ecd6ad3a5db9647bebe79150179b867d0c0a2c760aa8d9b5ffffffff9123cfbfe058749491bee5bbdeef7dc5810cac18e41b1eee672c94c3f7a0b989010000006a47304402206b6d2b5450a98b534519abf7770652e02d927c4501da7cdf8b1afdf9a98e65de0220195edc0dbfe63fc809c00ed46e95dd0cb8766eda8043f8e696efca5a52f468bf0121036def04e46ecdaf13ecd6ad3a5db9647bebe79150179b867d0c0a2c760aa8d9b5ffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc13926307070000006b483045022100997b921015b253701c072d3b4afde5fe4e529cebb9e2a1d7f37736456184574c02204924afdd74d8267d3f5731ab6eceffab4ae03f0d5cc60b1464837064bb68d77801210312346d4ae2c915936986296c2c42c96f1fbfa931832af9b475f911855680f08bffffffff02e02bb002000000001976a91457162eb62138da24afee34646d9ee37de68546c288acc918a604000000001976a9148ebcf60d674bf740de4c61b39cb0a39c57120a0688ac0000000001000000032395e5d3ae093f701d604b23375ac44bd31aba63f61811e1a0d832b80847835e010000006b483045022100a1b23c4dc659eb71a34bb6626627c48d0594231d668730947c08c8f7d0f083ec022025e43b87ad01921c526d6d0c681420c33c098b43db86d88c3f9266205099636801210201676d6db697046ff852d66265d1343d8e97173ecf81940238d21a61763b5e53ffffffff4be714871033b0b7bff214d2ecd3841d20107f65e8095b29f54268e27030447a070000006b483045022100d66d8be96a3439bf4d63ca8bf49ed9cfd54268ce93db4d45e4f95bce6a2c924102203e3482c196206fd65a210f6d6221a967881dc92b01c2b7db5469dc1ad56aae2e012102a42d0ee4a818fbf92351ab0148580c159366fd90b95ebe6beead2db22fdcb8dfffffffff86d4f00e5528d34c382d32b55387b5f70f48758351ef67288d7d729c2b370e06120000006a47304402202b0d08309b5d56bc78926f93e9a4fc3dcd74a32499c76b7a83646279ff40462d022047d2868337d08775ebd31fc0ae62b3318910fc598b9e0b19570b5b2ce83971b0012102a42d0ee4a818fbf92351ab0148580c159366fd90b95ebe6beead2db22fdcb8dfffffffff02b8480f00000000001976a9143a93f10fbc5d799710e31e5edf01ec444f0ca51b88ac40420f00000000001976a914459cef560e3a369916ea9ea3ea9b707a053bbff888ac0000000001000000039d91aaa66da8edcddf1ae6b6260329b814489e6b0aff46e271003cdde6cdb4ab250000006b483045022100d25724b6514d817372d10dbd2e71a016aff7ddbcd8a4e6b3e59794912578c64202204b2e62af5892801804f14f804da633f61da891c71ab2b305cdffd3c4c2ec8d060121039c8804ab7b479fdce96dc4afe21fa77cdf31b4d15e8312f11adf5c0d02a3ceeeffffffff3237743d3b1999927d4190e1c452d9ef98ed8d821d03f635b4b15e71e1dd5cd6520000006a47304402203e6efedd80b5ff47dd02d70b67f0396b6316c1b2fa0f18e0e7104982471653120220280c3a8a0082e324fde1ba0ccfe50890417301c7e61299f7bde88507ed12137f0121035466ddf546ac8b55de30f9185a5c29ca4cb653b123c6aa20aa310cf23ab7114fffffffff294c939ae46cd1d247a2328c4179ad519de6766b5de6f1f5441397943925b1de010000006b483045022100894ce5326ad352ca174efa4029b91bc61a683fb0537310e8a86f83c764d3c0de02203ca7cfe5987ef468cbcbd3a904d1b980aa57036e5f3021377b7b5376cbdc380f0121022052d131c1afec8603217ba8677caa9323ff8d36bd729449ed69156b9f7aa674ffffffff02c91a0000000000001976a914761f7cd356e3395f23932d7bb337ea89866fc58d88ac7d500000000000001976a91428046bc33c89989db5c81a62a66c811f4c20b69688ac000000000100000006edd7610a7bc56727561ffab2ab4753925d6bf651ea27075ee85a1cd9f41d0608000000008b483045022100d48ef657d06fe457e5906e4db897c33e71398d2475ffe4d7d6725f469532add60220422686a3f0879d63df302e89af19801adb5bda0b711592097bfb5bb0e15a8d3501410423b5f7b2332ef81a045e01c67af6bed905ac5eee3a1712abcdb0ec6d84a8173c75b39c962b636b1028f707697c55a5a6e58ff8b43d28f9bc63a70949a85d18d2ffffffffa37bae54b5e8cf1a31f0549e0466e06c45548ff903da468a5b31904efbb255ad010000008b483045022100c961d69903a18b5870179debeba05dcffc172123dc9750601997d2f5082ae4e002207f009395775c2578d4bd7fbb774e344f38c05d3462bf2b6faac4756f7ac77630014104d4a6240fcf510dbf8f4bdcbaea74dfbe4b6d7344db67c30c2fbbc2e9c24d204ce024c00cf0722686e4fafc10f153b1dac6f260ea7307bff9b8ba4fb0b2c23a88ffffffff22b5f57dea707b4bcffa44f628bc9cddb82797aa2f0fe054bba6e01013e39aee000000008b483045022100e18b753345f6816b4035a361ee20f5ce370b0aab886b464000ba3e83fde250b902201152a1f130692561b78576861ec1ee93f9ea67b388c145ee29c88cc6d99f98db014104b4a4c2d644bbfe5545fdf00c34342387710aa4a60cd1194e168305f775e7e74641fc7529c2fbae5bd5cc3733f6866302a748d9b84c1a1a16e949215a5670fc6fffffffff51b06c532c42c185b91f04a2a55657bf6eeeaba35ac48bf5df977f7e0e46d69e010000008a47304402202ddad561b2a022b6cfcac80d9a17732858007eb46b082ded9736510c9c3d907a0220035c63609d9e6b6acdf2d3440c6fac76409c5621d6666011f1df1c0a59dc41f20141045c4906d48d260ed65be33c99e5cf6d381d9400aa027f1b6a2cde78679247cbc49f4ea9eca853668702797732f612dfa785b984185b8362a0662bf6de299fb98afffffffffcb9b2f6ad263eeace1ec1eb653ac873223e49f0e377a896bcf6040774251cf0010000008b483045022100d2123b325f58f80820c2ce6ee793a577de3d484afd7db8fe6e10487ada1d094c0220532eb8d3be9df32f7365bec27cc708187966ea9b7812c58d09eb94a7ebbe311e0141045c4906d48d260ed65be33c99e5cf6d381d9400aa027f1b6a2cde78679247cbc49f4ea9eca853668702797732f612dfa785b984185b8362a0662bf6de299fb98affffffffb95b40bcc0e2bc28e20a3cd237642f52c1165abc9727ce97cb8494a00a0720cf010000008a47304402203ac8593e88c20e9d3fa6e6a7797c5b6fcfbd0a837db3b59d3823631beff397d502206c01e6fca945d61b501e0d54f895981db4f560e35a8e90038203ac88eba8e28e0141045c4906d48d260ed65be33c99e5cf6d381d9400aa027f1b6a2cde78679247cbc49f4ea9eca853668702797732f612dfa785b984185b8362a0662bf6de299fb98affffffff02c667be04000000001976a914a73e49d9cf3d61329cf15929366761fcb3c0efe088ac345fa800000000001976a91406c06f6d92846223d090c353a01c873eabb2f70988ac000000000100000001888ba4f9bb01bf9d18bbab26c25f4ce989f799650e84c299bfad14c199a44583040000006b483045022100c189a9933b6e6fd4a717bcf9161aff88c0cddd698cfcb08848ad751faed45217022079d4ad9ea936c867f0009c26be35ab04c59cb10cd0b3129da83a92e8cc58feb201210223082d95d956cef3053996ab5eafb1dec04798401a3f444fc56a49bbb8787f49ffffffff0d2b270000000000001976a91463a19dd83408c8bba9b11b1bf3fa549f57694c6a88ac16270000000000001976a9146ec41bd2140dbeebf4a0dcc1e156d03382a7d68388ac1c270000000000001976a91490d809037623cb98d394e49b44e993b541366db688ac11270000000000001976a9147e80f64281739d87817f3e213bb90046d8fdb31c88ac17270000000000001976a9141cd0cb02580147e8d9d7f88e1bce63d723f9bb9788ace0270000000000001976a914556fe723c062476a9495ebbfe5c85d7ed55de11d88acc0270000000000001976a914e590dfa70eeb62a34590966e4f1fa55341918f4688ac5344cd01000000001976a914e03f6429b25bdccf13feb78c2eabf725919c1cfc88ac1f270000000000001976a91473923aef34dd69f94f2a2660e24e51bccd58ad3088ac11270000000000001976a9145daf72c8ec988397d3dd088799d61bfaf8c8ae2188ac17270000000000001976a91455e4a39188e3bfca34e162190d5da797299f913688ac0c8b0100000000001976a914a738f17c9422af56422e02099a6f7737ce637fef88ace4a50000000000001976a914e43bc2ae3e263afba96fca24f991b3e8ae6177e488ac000000000100000003869d5ea0650440be0334589d98a58f82101d76534e6a19eb5f22c84e9aae63ca010000006b483045022100d8e793670eff5f3a41dd083a5190ac0b5bfe10f67e0a18531e29f4ebd2f447cc022076289432c5dafb84a1ad3a922ab1e91a8d6f836d320dd31fab1095a618c495c901210329802bf3d593bcaa9ec40d1cd4568782e289f3d4cc28e622ada5517efda9e728ffffffff5c335e6084c8f739a9ec0975810e409f2f14627f622923753452c0a522911228000000006b483045022100d105cbb1f6fa5af93f719619d6446423c4b4a96f236a70a84a39fdad371ed8e60220239117bd6c601b58162cf45a3d151d5df645adccab95f57c2912442110001be001210329802bf3d593bcaa9ec40d1cd4568782e289f3d4cc28e622ada5517efda9e728ffffffffe12ace827af1168b1e055149893a5cf40ea91568384236b7e3a52d9381ddbf2b000000006b4830450221008377dc51c6f1a6810dbb38973314ff289868a70d03ae34b1b6e403cb01a74b0502205ae5b9512d8f199b2be4033f672e934107cfa29a887648e07670e43d4e3a729001210329802bf3d593bcaa9ec40d1cd4568782e289f3d4cc28e622ada5517efda9e728ffffffff04ac020000000000004751210329802bf3d593bcaa9ec40d1cd4568782e289f3d4cc28e622ada5517efda9e7282102e970a940f8bcdfb9e9165fe6de05c94b9b65f5bad1e17cea44b4099640874d3452ae22020000000000001976a9144bfe5fab8a0d3680187266ed77260cbca5ffc12c88acd2810100000000001976a9142d5e62586a3d244c5e3c4ecc32eaf7630639a1fe88ac22020000000000001976a914946cb2e08075bcbaf157e47bcb67eb2b2339d24288ac0000000001000000043fb289a48460716e4ed08da7f40d4ba66b16a28c77a1fbcd0cecb226ba9b95ef010000006b483045022100eed851fb6a7ec6c72588cc3e0d3ece38766d60dee4ac4ce55ecb865ce6d1868102201497abfb12e1fdf35e9eca23aea46f022d3a0feb0ca3267a8b2dd2fee003ce11012103c0a948938917a04fcee738927de1e769ac3c296ef3671832bce487f1689029bcffffffff022ba6eb9681568b49f3772656caf2dccecdb3fa0843eb6e77f2d0def34704f7000000006a473044022028b12fedad9a4d809b6bdf8897aa8cec209286dcc6f18db3f0948e59c3aadf4902206d142cbd57d008d016bd2fd9a7338fbeebecd3efed679329775134ab0ed880da012103c0a948938917a04fcee738927de1e769ac3c296ef3671832bce487f1689029bcffffffff841a2e91611714993a47566632e29faa1a1411b92bb3d3a35c4997b3f6de8c97010000006a473044022023c3b45dd6274055e46310f623ed00a3b9f3268fc7f31eb79c3d9ea266c2e54b02203b37dd29938acfdbcec421dc0bdf884d34100e9c04e066ade4a01e93dda40938012103c0a948938917a04fcee738927de1e769ac3c296ef3671832bce487f1689029bcffffffff65df3232638cff6bff9525ae6b0d7c5b563d06ab657a2b046d7e2dc00054f520010000006b483045022100dbaae1667bf3278f7c7ccdcec687393b0859c3f742b4f87f8a4070ed739feba30220620066ae3d31ad0eaf061168a61f6e103ba1096b3b88f3eb5e26ec7453e656e1012103c0a948938917a04fcee738927de1e769ac3c296ef3671832bce487f1689029bcffffffff02b0b33200000000001976a9147a14361a09d777e17437d38cf7f3e5e46f65cd6088ac21510d00000000001976a9141d319c9e95533e797a0f7886ba66bad810b30f0d88ac000000000100000004539796a9f1331b2171f0766ecb43d4db97d748e592499019b2dc90edc049cd84010000006b483045022100d97d5b8455320e04ffa9ba8e66bf3d226685581dc224812f0696e7e1820d931d022033dfac7674efcf93db65b365fcbe6cbb541b325b940ccad89f8ac81fc7626deb012103fcf4acccd7c34e8182d47bec14f77f8992a77bae1b19753581ee16ede9dbb713ffffffff0bdb924289d30abf1ca1ff5be9dda72b272116fcdb1b8324e10c50873bb3f59c010000006b483045022100e065599f095ac58d07f844c7b3df86f668207d9b6da35d8936fbffa9a2e1573002203c8c957712169d91239082098d29f1c9726a600ee398e43faa094ed3d27d09d0012103fcf4acccd7c34e8182d47bec14f77f8992a77bae1b19753581ee16ede9dbb713ffffffff76cd3b4d3c823924f56483f8d3657e0884b91766d533881c082e93312ab6075a7e0100006b483045022100b2cadb8030f826f50f10c3ee26bc5af3537d41b07fcc7264bb2b7388aa9c8923022017ed24099f967db3b0d61dd8c8cf15e0ff3447b7c55d34f32a854113462228c5012103fcf4acccd7c34e8182d47bec14f77f8992a77bae1b19753581ee16ede9dbb713ffffffffae740291fc71add2329a65c2503de2275ebb4caa3f44be304d2d3ca35ee79a1d010000006a47304402207442f403d042a7fd464bceac50eae27a6cd6e76d82b6452b1a2de78e55345e2202204fc6cf74c93ff0bffc9cd996fc914a7912a17a756cd4cf88f65af648344b027e012103fcf4acccd7c34e8182d47bec14f77f8992a77bae1b19753581ee16ede9dbb713ffffffff0220a10700000000001976a91467dc78286bb047d1fb34b61fb9596aef0377d60288ac5dc21300000000001976a9147d5aaa79d6cef73bdfa2c6d29ae0bc163a029b4788ac000000000100000008c7493c5a2b1cf714ffeef7345d4fdc844b5ae78caa497a0b5015adcca84e913f330000008a4730440220379d25f5499a8ba349ce13218aa7a4ca9fe8c7408ec0bda865a7823827b39c8f022068941ad4894175d405078385dfd86e8ca031f6a7fa6812b98a4be0ff923a1b8d0141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffffaba24afc9598fe456c67ba4563584bb63ecdded496dd253d3dd09c211ad14c34010000008b483045022100875741dec657aba23a90894e0e55312d7992108198288a5246ba1d649faf9f7e02204a1855b1ab58aca2fb903dabbf0bef465308038976b306e321c8e6b73c7be1a70141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffff708950e3f327dab9673004db5a5d8d6bb419437e9813511a682b57052929d9792f0000008a473044022027e4cff1c53e71b17d1c50e6b29d9291d406b81f51b458b58cc7b6a42ec4249f022023bf054acd5ecb18c22047759d54f45f05ea216f9baa92d069f94bbb2f23f76c0141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffffda42171bd2a4415c3bf6b90bf9732488a104418c7ce6d586f85b6cdc3d9880784a0100008b483045022100b559a877422b974111f75be12ea4681afe86a26d1a611f4748a682daf1e37fa3022014cd671a74399948b88a4d6bdb494ca360fe462ed6f025d5fb48b1ef9858fbff0141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffffbb58ad675838fd456317fa8cb07f2a83cbd35fc854da4ffed1119b114d6f4186000000008b483045022100bcd24dbcec2024a42bef06f6435a631edaeb6c52b54c669cac8590f6b0f83e89022073c928e1a421e58c1d4ef478b00ff67bc2268ec11632101474bb910bd723b76d0141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffffd5f0f20daea7d482155b4a24840145740de7a5eb62e041e13d9f9730cdba9899010000008a47304402200c7993991e94760ee0894e1f1534ba82db588a82f6a7c51f8815bb370938d0740220108e87d53c6bd30e08cd1d1582726cb663042cc09975289e9bac0d8eb483a3d7014104cec552e67ac80c9237132a133ad6a7ff8b577fb53988b4d6251924eda0658859d2e767e83dbf895ee1581c3c635ede319a4f684a39689d27af90e381d234cf7dffffffff5a8730c0cc6ee731d5d3ddb52d3515a1e577a83d83a6c15bf31c29db8be16942280300008b483045022100cb97f7c2f4353baf99d17e849ebb925ef20ad044b78e64da602ac2eb58043769022070e0686bb1eae1c29049ae3ac26845d4c5b7e45ddb64df7fd24aeef1fa6787af0141047a824fc5a97280f66e50f7a44b21896cafa17b6996567eccb467bd583a83963a96221214664efe412d91578cc74c38c512aa4e9dae1ae0d0063d1a219c04684affffffff770bc7f7c00d62beb0e59ddbfa130eca87e2aa3ddd7daa8de34018e7b462150c010000008a473044022035a8dc844d0af45a1f128f1b0f604a5a6d9cb3cac088e57672c97eb216a53dc702201e3ac62d6a59b0dba34542ee24ca3d3369fb789d04877af147297a8f0a112cca014104e6666dd418424d6b35af9d0f0c0285f596d517ae89e3ca1de3f884d8c00fae46f8de683e16fd7462e8e8c1b3ab63e1a921a3b2126c8e9d6c22f1a5e1c7a1c871ffffffff021ac00200000000001976a9148629714b466d5b8656661fc8c85e8997f190caa188ac803b0100000000001976a9143893a14ac05ebf6a52a9ed2838fcaebd39ab608688ac00000000010000000f55ad86faa09f030aee8f58e27b80bc7b849d8e7a0ba6b378302fbbae56e7df23100000006b483045022100f438e4794713e6e85861b5e821906186c97f3782021d52c13fcbc0c826c402770220344ebdcfb405ac946fb3c39c81c92c0925bb6536917c606e09771dabb9139b170121028dcf43555920b975673fa8d65de59e84c06574f9bd94b294d15e3697f590f612ffffffff47cea2934ce2500c3b5325e908393a56e1ff13c3df8b4deff73f7af45b3c2bc40f0000006b483045022100f72c5fb60b9d64509ea4a43508390897b30905bed8a96c77fff4d2311554a34c02204f898845dd3de6f0c81aee9c54e2f57f205464617c4f5e7fe4fdcacee518fdc50121020124b4a9dd247b5b1fe3dea733be14ca6ce3f56a6fe23bed4d4fad30b7f14b89ffffffff47cea2934ce2500c3b5325e908393a56e1ff13c3df8b4deff73f7af45b3c2bc4000000006b483045022100cf7a33ae908a62fe9221fd768a5f6ff58ef2359f46fc7cacbb7d3f8515e19f2502200bdc893f10a4fdc6e9a802c7a8102bccc1e9d5e33ac35a44bb7cb95b572aee070121029c82295543dd378c7d13073b439e16bc2f354e0566234d2c2f9904e53cf692e7ffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde030000006b483045022100dea9ab110eafe1cfc1dfde9fe730ef5bba8a96c6234cef33b3ce4126f622698202202e1d7ba8ff9bcf7156bac0c7923a5aab255b6931e3bffa3f906df27cea616271012102bb2833f994636ef7de7761ffeb80e77e8292f07611a2ca8ea254422dd0ad7dffffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc13926307060000006b483045022100f393863e5676490548f4dfe15a93b3e428717d871e124bdad6b7bd3d9093deb3022045b6a3641c5ff4065fde59e896723c883b4225a2d0bed59ac75b7498dac4c8120121029dcf8c7cd53a2b4b18ef4a1fd1fc4bde9cd1b2d22a7e40360e2b9943ee702740fffffffffcf1922514dc48c1bb631110c8ba6d92737b7bb991fff301438828f75d0ffc73000000008b483045022100d4895f52db026b7bd61e5d0c238705c4ae21730c58af92b8b481ebaaa30a7a16022045b04842653518ae9c11a0c334c87db3db8f7f31c8aad92e0fd52672ce523a0b0141043a1bdc3563e134448c92472f1389ec158fba49ddb4d4f257fbaac26b7cb9816bae29cc317bbdc96693165f1c8c300e7dcfd9b3f6de3734a1ee242c33d2ce1e1affffffff47cea2934ce2500c3b5325e908393a56e1ff13c3df8b4deff73f7af45b3c2bc4080000006a47304402203b20cf23c0958d659af0a085c18e3746ff5a80df5ab9653afc47c664a5f3f75502205e46ecd9da959da670e8346cbdd26c34acedcccb997f6f58b1265ae1d8e3cd750121037cdbced5fdc351a6607d68abe8949b25b3ccb1e95fea4d85a15c5fbf29db8ff1ffffffffb68e141800bb7d0cbbbbe5c842aaaa53fb27505f42c8040502b03ce547ca408b090000006a473044022067ea18daba0705333686aef070b728a25c9958680ac552a824153190e74137cf022046ff40f2cfd935c67897574684a0fef181548ff261563bbf69f1e8abbee42de001210368722eaa8e19a979040733f048e28708ca2a2baef5fedbe6612d7b0d595a5026ffffffff55ad86faa09f030aee8f58e27b80bc7b849d8e7a0ba6b378302fbbae56e7df23070000006a47304402204938ad3a90d183fb80189621e0a2c4a7b87ac0662777d1a69b9365aa640bf76b022049e86a8d64c087aa1a5bd945e3f685a3787fc974f96b54a652b798f53cd2e0a2012102cd34684a88a2165a1037b245ea8d917dcf49eae7f1d1d0ce1e830cb1cc73f984ffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde010000006a473044022053ea3754de7317ff847ee557a1125b7b396e74f1314e2765c9b45f283b300428022043b8925e4bb74de99ea12a8b20121d02c666a947122c0ae87c49e5f2a1b2e4ae012102960fda75ed6cede9ca4536a00fcbb99a9edfd510049341524dc9aa01528cd6a2ffffffffb68e141800bb7d0cbbbbe5c842aaaa53fb27505f42c8040502b03ce547ca408b0f0000006a47304402203b590d969e14b6786e2560ad027ca978709d0a69994d7f2ca0d7e2b40e560707022015ef73b332dbd7e88b3f51563d949d993759df371a783b3f213ae6175735bf9b012103d70c3c2407445bf30e1877562c686d487987205e6b39724aa60b85f6666697cfffffffff2fb6d5ef691bd78529c644197a5f5466acb759567ba50b43e3e68104cd4bdb77010000006a4730440220443e2f99436629352b710f8e46b439ee059295135724ceb4ff111022f042f3fd02206dee1bf9fcad1d736c2bf1cada1d223515c1144bebad1d333c45d06f9721cc40012103fdbd81b8921b932c64b40f0ee28e77aa15dc15dfd672e58b43a57549b3a316f3ffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde080000006a4730440220278710cd5b6300c62c1ccc92c5be0912de36be7e30a50661db0119988387a9f802207056df06530d756429bf6effa80cad5e37fe910ef29259d356de4b67932b63ed01210224f9be7f81dc4357a2f18ae0b698fc5c60134918514f25aef52c5da73c52bfeaffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde020000006a47304402205550ae898228e245332db632e1fc2ef85be0da85d809c419b834abdc0c370401022045a136d4aff7ef8cc3b6097143c2691cd843c4170f0f1e5423396b1e0a44c6c801210344de1a320b1f05a57b98e9687384a1cb232e1d76eae8a9a270900166bdef196effffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde040000006b483045022100a63a3e8038634cfe47b95607287451f007051c0680711f8c93490ae49b65a66502201b560e18e42c961733d29bca24cec4887e79cc9617674245166ad1298be5d0b3012102b4a6d812b3354b47c0c41561fd1667adffbeb48eb296f10a9db252ab0c6938b7ffffffff15c80d0903000000001976a91489214f459783ab99ab411d8f8338d8b366b126fe88ac60fbf56c000000001976a914ac52c193aeaca17ff5f8511272b06171c4639b6188acb6a40e00000000001976a9142a5817a0d0c1c24da4ea7b375600ecfe42fe7c9488ace0af015a000000001976a91469b1ebcb5d58d44ea9d92c34a6c853c063f0047188ac0cdc964d010000001976a914d4249ef620cf5b96db358135e4d392f130385fe588ac1035a830000000001976a9149292005022ba766c61496b85f7680c0375a040a588ac6603ae29000000001976a9141455543b92f177ee2d5046ae72275438afd8a7bf88ac06f42d00000000001976a914b85daec89f67060ec37c54e5eb417b44934a0f5b88aca6d8e823010000001976a914a8c4cbed19d6cd0406004e34254deb1657a79de688acba3cfa04000000001976a914b879050a15b00dbb29d88f14d079eefed99eed7c88ac92e14261000000001976a9145d1643253120d1799defdb730bb1a94be873c69988ac583daf29000000001976a914f507d70fda905feb6d3cf00e7ec49b5f4880fe6688ac9f5a0200000000001976a91447ced88f66c87207baaed3c98ba232aa69de537388ac00e110bd000000001976a914028e1f3dc45530fbfaab1a232c5d9777c1554a0388ac1ca8bc29000000001976a914ecf09155e97a9b3ef4926228536c1ac59539776388acb0770401000000001976a914ff933d6753f14b4aa554bac93d0c5229fd98028788ac802c05d0000000001976a914fd52a6126e4709da83504678931dfe37db457a6e88aca2a6f502000000001976a9142ae6b68848a2b43c78dd9ea34a0d68a066a185dd88acc46a0d00000000001976a914fe13b17ed6971a532e4464728e97601644ad462188ac50a75ef9000000001976a9148fc2714b3e339a16be73cd5bd2082dd63e69e4f588ac67992b00000000001976a9145123b7783a07eac14e4ff9905704a66cbc398aeb88ac000000000100000013d7fb3e99ec6ad179955cefea5e1940eed8d61c0f8f9674592c845a6fd8ca70ec000000006a47304402203e66268320b52ff95eb3970a945a39a8e72ff0e17924b940c0504ae506a827f1022054fb9c19d1446a52b7ec971a4217ccf5c6615844862bfdeffe64e1e82f68e68101210284fbc92cc6d4433cf6d02aeda5d19d4d67fd2f284e1de9168f0286d8b247e511ffffffffef43ef6705e4293b06868032b86f1b6d9bd092f54fa98dffe666b69f1d4500bb0c0000006a473044022057fcad6492f86370b903aa58d65fdcb1eaac10d5bfedee3b72a6bec433c6d26f0220748f6e3fe3ff107c1d7d8e0d5258a06e841e8d0de4f537d6a59e658f560d1de2012102feff76de7a04d338094cd290e82b2ab027e4f54983f966b7bb6943bcd1bace4cffffffffef43ef6705e4293b06868032b86f1b6d9bd092f54fa98dffe666b69f1d4500bb070000006a4730440220594130000dc237b189d2acbf7963a076a1243e436eba5ddabbe9482afa990da502203615011cbf4e8686d61fc27b49a5c0223a008b1c4c60fe5488b88af0ce89930b012103494ef6a3fdf2832bf96837eafdeb528d47b027a7477f0a466cab51d0ea5f3cb1ffffffffad6dd2e138f49e6c05ebd631fabc1d7795f73988eee66364b7e398022350b295070000006a4730440220631116baf74db92c0e8ad3c8dd84c23350c21ae2412faa9a5f78f410ef27bd1602205dd4fa83596799573b88fec9299d130497ef9adb6ba23b26fa711ebccf93074a012102decce366a6a724e883c1832f8b93fc33b32bf61fa0c757a5e9561c2cd58b6b94ffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde050000006b483045022100b62e9a1adee18146bdaa758826436d5c48967e11919c0d1c466d5271ecc78b2e02200264535c086f85f29fa2bd6cf4d73e50149a565e02bcf1463ce5511cf7e8588c01210376f2f130d1d27bde88f0a467f2c6ef28c97d516c4891e5d3112f197982a53185ffffffffb68e141800bb7d0cbbbbe5c842aaaa53fb27505f42c8040502b03ce547ca408b070000006b483045022100ac9e630853b2f4eab1d04f4f9c760ab06a8654539b973e8d0cd229444a06730302201c437d09dad554473f92b5116f2c954b1f8433eef58b8de5010b2ee37de9be640121024a2d0fb36c556f2e0f365ec91ad252c3bc57fd0d2542974d893a325da107ffb0ffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc13926307130000006a4730440220568609afdef0dc4a1e143ad11d2abbad05be7d553b0e251acc6defb1a7da155902202cfff19622227fdec91da6984ece10dd7810018686c4561d540634702045f8990121022221ffc3a562cf28c24193f0861790de03f0062934b7ce00d49a4c27dcf8ec00ffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc13926307050000006b483045022100a8e3ce7e600c4859f9f6f6b1609f2b83361d9ddaaf41aa57a04ab9d7e813307602201cabf9f783057560d4f44557361157cf0e830c0af6833eaed123853dcf311b830121038f21f9f3d38ee280e72d9135941663195a7fb0abe3e28f4d9b3bbb4b48583838ffffffffef43ef6705e4293b06868032b86f1b6d9bd092f54fa98dffe666b69f1d4500bb010000006b483045022100dac425607bfdb4658eb2feed11bbfa3e45e2a2888fa3e3e7e576c5eeaa0b84be022029b7ede1cd2ec4c72cbf03728a1eeb136e4eefc9e25a62fe2a6f00784be15b92012103be8103b917c25d5b250d74608d6fa4f8776463ba20b9f7e4e131b58ac29e7962ffffffff0d2f6a1abeb76bf038bf0de8a4946cecfdfca99caf6035a071684e1dc200d9f8030000006b48304502210093d02720b7f6bbd69afde4aac2b67ca828b5f41a7e765ce8da810f33fabcbf79022003a2f25d249e45959da9a3522307d8363a966de6ac58a782dbd1e9dbc1c59886012103adc3502860959d8731c39bfcc502d836899e9a4c432ed3e113469f2a86e3ded5ffffffff0b80f043e007e4a021dcd2b5cf448cd1a457bb14b5810da16ab5161ede0f2d43070000006b48304502210088106d9057ab0d0b7c0a0053ed7ced94249dd120fe7a7ef3c95820af1b2a42c40220152f79003d2c57a056401b9153981bc2ae3e9ee7e9d512852ae7b12afba6d51d012103570a61bd857d9945e74fd550aebedddeac46b8a15c1bea6a730101a00202902effffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc139263070f0000006b483045022100ed50345435ee34b9ad5ca3a25f7bb5767e3c1bee109fb6c54cdf7863994611f7022055c9baad30e6056519bd21e11d7cccb7759b6c4c910bb927d7ee0545a648355301210219848d7910dd1d9e5d20236577ea519fc6a59a6b84a44ecb8d475d121a5d3dc6ffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc139263070c0000006a47304402207f7027c0fd99046f6585089c33f1676932ba73a6738eb82dc6539b68c381c616022040b070d15820c7f4b99ee1f413047d4d014e549b80383693eccbc3127738a45b012103448381cbd4cc253e878dce1c51593b309e58f97574e918b70da1d348ff842609ffffffffb68e141800bb7d0cbbbbe5c842aaaa53fb27505f42c8040502b03ce547ca408b140000006a47304402203cdeec90e5b730533604c859327219cd975b3575bac8fd033e904f31c001b15e0220146f4b58a1db758e75c0dfcd6e1bbcf50736bb94b1f00680d3b4ebd01187fa890121038506951c80bef6103099d3c0c090eb75d6c5319856c6c17b8b222393e5917b27ffffffffd0af5d9e4198d457576e0f6f0660b2268c6c9c794dcf35b6fcb97f09b77962c5110000006b4830450221009ec10a2516bd3a0cbfd30612981964d5e1285912948e8e46f802b14e3eaf5e1002202d699385b4f94c11206669e1bea585aa4354a18a5ed6f3632ce85f30a06861dc0121031dc422f14ca460f8eda4b47481a417c9ea5285421a1e7403779beb05d77f6ae9ffffffff78f434073747d95b0e7528db9fdf01fbc1f7a7cdc41b83db2a5e74bc13926307040000006b483045022100aae2e85df6382393aa2584ebf3691ccdde0f8f8dde5a8fb4b899e6ae74087e5b022034c18eaf3164e88d67b97268ee041050ffeee8e8baae873fa0a414ea3d57690a012102015c9a906bb14f64e3fbe6373a7311b92cb8076e5239d33cce60c40bd94f6353ffffffff84d20e975f1b268e95a866a2ac1d91e48d6bec5f9a0df34269b996303b0c7162010000006a47304402203f4eeee326950e6c91ba8e2838744a874cfa864914b516346d89b2b11b01da14022020c69aaa0920bf592028280da9c89f997cbf840968d283ab13f825a59243d023012102207579fac69a3f8c702fa779fb4ffb3ce72084716abca9a014697ad91aa1069bffffffffd0af5d9e4198d457576e0f6f0660b2268c6c9c794dcf35b6fcb97f09b77962c5000000006a47304402204f848a906c1f955ffb82f606490a77313aa8a6d7bbd629b8274c1f3cb2ca6db0022039766c5dbad62568369608bbf30b60c5deee64fdf7c6cd5d29e61710b8067aeb012103991eb4f1a47dd1f634d1075142486ae74ab7abb0e68202a928cfb8cb2e76c894ffffffffab719c3ddd5d7945263f26143912927b79974e558d68df3a1236cb79be9c5cde070000006b483045022100931da94c1f8788283e064933a759178f8dcb6481744dd74d1d01982b20aa3c210220186f595a53ac7477bc9b2c847fa246cadc91cfd2bb91201e92dfd003e9fdf69d01210374865af212f1e5a1246107a8fe4ea81d1362d1a6bb63c91ed2f5bcca5ed3120cffffffff1566525609000000001976a9140fcb0e28c1cb5f16b7fa5169ed20865ee6e9e0f488ac00c2eb0b000000001976a914827742a437edbd9457730797678838cc770e4b3e88ac001c4e0e000000001976a9143f215fa3fcb48276dc8319223459383003e236af88acd0206f13000000001976a9149414c2506ce1d3f557a4b14c59206e81cb189e6188ac23e20700000000001976a9147f7d3fd076faad73a6700be65901e0bd27191deb88ac3ae0a023000000001976a914b8f95fe58db996aa2eb88bf5acef88fa266e0fda88ac76828d1a000000001976a914a77cba1d132c6f336e73afbfe656a2fd756620c888ac1265f501000000001976a9142eca8491b59821a95b4decb10d33de11a87c1af988ac80bbee02000000001976a914ac01ff5dd3b4c6d4f8499537163672ce1f7387aa88ac48280904000000001976a9148535af0a130683b1dc3c7667ae2cb6d77410169188acdad10f03000000001976a91483b63006fc1ae9483a0b9d443a6606fae2bf793988acd0f33d12000000001976a91463699a81cf865eb1b09cfc82148e8953d97d68b988ac7a8fe105000000001976a914a6a89f46fff859b8a0303aebd82da16c0ef0faab88ac53a0851a000000001976a914835e9f30a7c6b5341a4bd152d355987f9519213c88ace0fd1c00000000001976a91405ee1086e645298320abaad9bac166549429c41888acc45d1309000000001976a914104239a9d15fba7252a5620feab2ce33cdc4f91888ac00ef1c0d000000001976a914694b0ebbae242491eb7bada96b08d1630926ef9a88acdcd4e323000000001976a9146dd0ec807e8705d3cd6f14a965540ef1ca1e368788ac1bac1700000000001976a914e05b7c3a1c5dcee2cb962d4de5abe93bab16ae4588acd04da014000000001976a914dd0d7f52c52b5f8484f46a6951a74a95c294b0cf88aca16f9500000000001976a914969bbc4bba55af8b16aa169fc545698294954a1888ac0000000001000000283eed827ef96f1b7075210c7f049093cc760f0dc61d2d474a6b700734045c1a62010000008b483045022100d1e0bde370391361865b48a6d103b79573d8dcf24305000f5ed4c190fa8115d0022001b9a5ca7a2a36422c11eabd7f592d9e9916dd39b2932cc76e14753d88f6ce1c0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff4db464587f85685e87ae5c5ba62eec2d1a8f19952dc2584ace49ee9b7fc2af001f0100008a4730440220286cd99d44561316f447c5450d0396a6a0c4dae803e4f3cdcc91d5df7eb3134e022067076f79112da30cd65ddc59d0d5843e9f0f38e4ae1c558362b730dd1b1d17380141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff830fd53ee0997ec32ac64e171568ccdd3ad8033980e41429d0dc69914f51be83ef0700008a4730440220685e7ab1c7da0bd69fbd650b407a08989567c8894c085dbc6d252f89c2e900f302206bad211388fee8a3b96323e6c3a242c57bbd2dcb13e9c971b3b7139bf2b712d90141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff8c9db2a3fc07fd6004e6c2a71ef51ebaec7a6c1dca4f2874a5e61b4f8bb793ca1d0100008a473044022071385d36cb9efe530fc24929f001d4ddffd3d057716c78b174fb516358d0afdc0220350eb07e6dbe09802b4dfb41ae300082c952acb1636b85e5681ce209fa038c3c0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffcf215866352f9dd5ad7394d701e507f36c67b64428521bfe7b103f1130193d00240700008a47304402204d3eb9f948aac5b695cd99eb435551cd72327833229cc9e5b1d385333a44a6ab02203b161195dca449dd0c0c2c904716530344c70bd79411e5299a35cd9ff228ba160141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffa3467a857b4747d17c31d9701ee8f4ab337cfb71c2b7f71bde9a7a76ef414320bb0100008b483045022100ef05e86165d535c10ce5c7127dd96525f49afd5269dab4e9601f6729f74f8a7102206bfdd93df11f87c8fd0e03b92e57c0104617d85098a98e08e48204212106251a0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffc2e5c82ae5a7831c6e19f54394dc0959fe2e2ae889b2c6ee353af72cff8d0acb1e0100008b483045022100b8f6ac0a0fbe7a51912298a3aea6db020cb59b145551ae47ab2bc56c6f5c1746022007d79692e77679c0d9d9d04e63f8aa17d6c1bf4363e6728cc2c491fc6ff14a6b0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff1e3b385edfa983193c713af8ecaa6c6693f4c5ba4d2a07846790f0116dcb6c35530700008b483045022100942c7f577573d6f0b18b3b10857895a9cee2146db83fa2759bd0cb33e4156b9c02205a128e121a3def39d37446eff4a3a1b664a1fc372044fac8d5ee6fbbdbd1ed250141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1fffffffffda89832950b955e6865ac76c5bbd4a7c76b41ada24da7f21e1b48b7dc8272561f0100008a473044022071d5f7d2b4d3d73c736c0069007259118c8704f47bef9938ccfe7c6eb82c99b8022053d6fcad0a74a5c059c307dd6e702452880aeddc12046135eb786ad2a776f93b0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff3ed10d0764cb1816cf93160551da026692696726e9aebeae2bd1aada0c3528cad50100008b483045022100db8b85469e3b788491ffc218e76fd4a216df384f28db6a8b9e7bae87b3c9f9bb02203efa7aabd83d5c11ab1091e42d20b629a32e871e336a46723fffe39538c1bafb0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff27b5ab68d9ca206ca5a4470dd580b76feb370270ca0903803020b3d371f350aedb0100008a473044022066c3a71679ea23cdb2fef21ed2dd12f086255b44bfaff06828c64e274e736a010220414701c93a206e34624038374c74a154e67945f46de8b415f4b200009976d6c00141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff10aa5e5dd5de1713efeaa5a6198878e092cbedddf5b6abbcbd9335f660661c531f0100008a47304402207953f275f9dd7d68a901016d24ed6a080e4b34635f8bf4e54d5846ee811e92bf022064644bf657def7ea6c3be981686fce501baa7186513242c36aa77f9f304168110141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffba5f43bfef7cb6a50ceeeb163a61723e11410614c92de99012a061c40804cfaec20100008a473044022055f9c6cd9ff4b060081648265b198864bc4a727efe5f6e87b9254fabb84fd9cf02206175594222860690d32e1dd2efd51d67bbc35e1635016ab8d148d02c201554790141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff8d78152d1709bf625de8a6706d047e737a9b96bf5b661f25746e46f2ed22219e010000008a473044022067c29b5d471e24cee3b5757aeb9d712fc188c5f745d398ba991dc8ef7f71e1e1022067a1a350ede3095a6c67d280ba1f01f0d2fe0f5e6eb4dc2db57756ee9ac2f9990141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffaf938d296a140d1e5c33a8413b9809363bc9fd3db15613b8b2ed1436b95b63731f0100008a47304402200a6f18ab2dcf7d91f02575223b1821a40b168e18fb1ca0781599afb969fc3864022039c97aeb5d2427aece295e3bfa619db071000a0ad5660d596f31a2c4b56d717d0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff26d8bc4dc318d3483744f51f4d4a521e876c9d505b3b9a33562a6741a01a699fdb0100008b483045022100f62d7e2d683b6517195ceb39b41d5893abb2f437d38c8a468e5cf028b4b93e22022056d0e83d53df4785545a1431a82d953513e2759513639958ade8c1e4b8fb08bc0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffd2c71d0dc40fb8a428412023ac3cb072d902036d9d76383a52a4e0991dab3f57000000008b483045022100d504306e66407dded2769e8c9fd4fa26d08b25e1308e505dfd00b6fca157d5c6022012a62af4cca34b03e8ab3096d8fe9e1714ec96367dd299ecd2faa62f5f2f05060141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff626539cd2bb704ea8f58ef265a399ac8eb6ab9ee8f4b56303796392de6d71147000000008b483045022100fd553c743bf97d7aa461ffa84f0c22126e9ad10a393ee1cff8d2b14cf0b38e4f0220343d61595754fc7b6dfdd7461b9fb6315fa7a426f45c7ae33d2fa127f3eb5dfa0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff5e900e591609ef3853fb9d6c653a85a4419b0fe0a4bef72b40db6868cb8f939f000000008a4730440220457a09638551fe1fa85e10e3896ad610e410049e664ead147d9f9779f40a73a102200158696da4c13d004f63b755175a1a7141bb0e8e33c86b3ea42c70b9da060ef80141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffea26be75210fb968647fe384d9f07821d38f01ae174ae76bbe47a4f113693d18000000008b483045022100fbf10c5ec91e28d325e1553795eb880f894b695f494c8ccb47f30ab6aa4006f1022051461c846c1a138e8db8878c15b90b012daf4a2bb3bbacd883a3bf643c449cce0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff8b3714f7e1618f11937e6d24ab02b8d3c95e279adb9684d57d2efea263739687010000008b483045022100d1b55814828527fc47b2ad8571cb6bc6ca3a21e144e782e758a0c1b3e2c0bbca022024065a6ee8a2cf322031c3235ce90160dc4014717d09486b4940a4c4a88471e60141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff144d3477ab4a57dc3f78c9c1ab230861e9ab80aa9e04ac2f5ec3c07544f0230f000000008b483045022100ad3376b0d12ab79bf8976dab3cfea3c200b13e9770dc2ca4cf28b03205b2582702207dae7dea1cb35c9c3fafc2ccd09f7fba2fc82f6ea866ca42bcde69167503bb8e0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff3ce4ca74d951c5f45e02f9463a6a54b26c352d2aa83dfdf05cbabd760b0b5407010000008b483045022100c640f6b7f6f124593b1334db6fc74d80d87b550906c54f98c5ab73b99853f5bc02207ee54b250a462442647a828a06b6a1458b0c9017078fe533534f58cb6f1f6f310141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff9f559f0e4a8c65e5be2b18538329eb88ad8b4fd4ef9f4632d32ae0999e16e4ad010000008a47304402200300189f60ba8056981b6738091957b32c45ba5ebf8e2ab1ee15655d7764aa7902200cfb1d395fe1f585f1552c0ad23b54ea03eb25e6333b6fa446eda66cbdfc20a60141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff4fb8c745bc34284cf212ea6106cdeb8ce37fa14c549cc3765d9acf475ad09ee0000000008a47304402200634e0d7928bb8f85bd5178495fabfca9d27cfd9b808bd44980f8d473885adb7022003638f04d5bd20cc5201fd8a07fa042599edc831b6cc010dc7b25bba3e568fff0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffb937d2e2ff26accf1088a35825330ccd7f0d1d78b69b4f54111a37536a332504010000008a47304402206f38e86043e29102f01d449489c8a5a7a88358b1a08851fdfcdcc23d4de2e785022024b8ebd5e7ab3330c78a8c6e1b4b0cf07704b8b05b1cd9fececc5a8d86aa257b0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffd2f0ae14e2bc19114b22bd57630a484bf21bb5fadd218c5abaa2fe723830cf4f0c0000008a4730440220170aa2247f2108d525c55ade9d8dab7510ceb0d16e270f3153901018e2638dc702201666b69bd9466705fe02b059e769a9943db53d81c5c39655111a185ddec2cfea0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffc1754d047ecefb750fa1927be6de9fabf96e2becdd3617e26dbc45be68cad2d3010000008b483045022100c1cf10efacbbaa5a0e4debabf4748b9a90d182eb09fe76b43ecda6928aed1257022004507bb709efd770e975559849a0c95dcf950a6fd5c4a53c9469d492d45b3aeb0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff9d64f5c22f9d9290284bdde5fb286fcf684b236fd6bdece6e02d07776757a4c2000000008a473044022056ef3635e03a494f00108969d4b82a5857f3fa6373be1f022740158bcfcf771c02204fdfbd12fe204e4e467ccff61ca4f8962bf51fbbafea655e3f809a53a44177df0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1fffffffff465d892dafd2aadfd914ff8af877ae6e4d72d58ea10c4a438a708f0f873edd9010000008a473044022064840358fb7b292b624f14a08c110bbda0b174177bc305303d5ad4a78cb5009502202242bbbbc075012cfaea52e06846961436ab88535a3d6be34bf1c131866025d50141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff9748db5a541909357aa325359c6f0c797bb157156de96e5a9f5f20ca06882b64000000008b483045022100d35b0e57e370466553e88e86cbf54704cb3d2d826e9a1774055dd8382e8f155602204a1ee8659f9a760133e0832171c20e07907400668d3169daed4482aa62ead27b0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff6fea9d0b3b2b24cc6b352b27e4c3bc038752b143d3620d085e17ccd805661b83010000008b483045022100981712dca424adf195780c75384118271f41934022e89ebf47289ae78b43d2dc02205ff030bbb218cd7b4e15b035f962cc708f07929208cb172afb39e2f379f4c0450141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffb2f914cf1fe445e76933254e00ef9a4f8a3142377fa7592e2407292334d30baa000000008b483045022100c8565b696194a5e248b60cac7e82a567dae65a928c3bab1cff0c744df969907a02201bdead056a33689421fcdcac23186dfa11613782af793387c6805a04583223090141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1fffffffffafdeed2ef13e5a0ed961697460e2ee5c36536b91f5a4661dfc13d6a5200ad83010000008a473044022013c3b669571bc35a83293065275dc0e196332ce5703a00443dc6066ede813a3e02203a04f6e3617729763acb9e661747e1564a93b200799210268a2a0003c62205ad0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffe696cd39802f7e9bf2963eae114c9deb00bb86a03f6df452c43c53ee689f1ab0010000008b483045022100a4b17e6107a3b5b2a3a62cadfe018a725a250cecda572a23d006e16e4781195002202563cb9c19c605cf7a490023f6164627119a241e658ff58896ef1a6b592790b20141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff7662abb9e1a9a1b8ba8ce1222075cec7eaec1aba80aedaa090af514876c23dc7000000008b483045022100fb85e713601fa08b4da4682627224121437dd46f85fc0f9dd1305a36e6c351eb02207bbdeeb67050a83e2d919dced90fb930d6c1d6743379b56695485bc0652586bf0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff6a6be5256d050bda7f91301c1696841b9aa9d4610386d40369bc3e0c01c3aab8010000008b48304502210090cecf9de11738c28b534592e0139371c1f12f18590a1f39fdfef19dcc76ea79022075fba124cf04255677d433fe34864886a4d75cc66088e38e465f756a9e6a81980141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff5a51dfd9d76f6164401f31d30a1971a6e7467d19fb1a319b0d546ef3e87b777a000000008a47304402202c7345033ebf73b7fbd69a7ac26a62ae7293d1fbe4717880737c2b83e06f96b702202e1a34ccabb36fb3088c63f37e87eb4b744e1376afe8f25686a6c5483b7014670141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff4be714871033b0b7bff214d2ecd3841d20107f65e8095b29f54268e27030447ac60100008b483045022100c6f38ac86ff34b89f6c07512313d59c36ad958c12f9b4d2daaa6b92d108e2f8702202bf655afafde6df24343bdcb82d98c9dca52edbd9b5574405d41f3be017216450141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffffb4dbd3b8da503bfa60726dbb7eb38d39641236c692b699209496a44555c9968c010000008b483045022100e75a40386e6ef94ff84434e3c3e3ca02da3f6a718b62203b024f7aa5ee7028db02202f0e3726d743e74a8bbf9e89fb86ad35603e3a984960dcdb5b4fd7ddb509ef7a0141042a1f4f9afd99e458f577cba0afeaa3e7e1fa7cf3c8854cdef57f84ef18e87334f9abf072baf9368382424c83f89d208e2837cd7fb906dbb91502075db7366ba1ffffffff0200e1f505000000001976a914dd44b69a14f0ad169d628451f3793e8591639bcf88ac9e083001000000001976a914596d3055016c76fe13b46e299e458c03d0e102f288ac00000000010000000552bb594c351c7b26b6c29b84ba47688468bae4093fae25049abdd41911bb5ffb000000006b4830450221009078968631250c4690a3dc3562e598f186a8986b4b19ab2cdd9b85c2d9a44d9302205cf040c6418677d94caec9e37f59ccd681ca131a298ac54de8cbc9fdf5736f7201210383fe170364b867c94cecc3ee0f0c8ff5c19c18c44a42b2b3df36d59bf9b1fe19ffffffff534af251e89d80a5b0fda190c880d6ab909a37bf4ca44c1b3bae3154847c6e8d000000006a47304402203076c781e832a56dba20b51d807e6ae772918000cf0bc8105a74ffcbda158aee02201770b0049639dcb92e395d6422c2b1719fad48a1ed3c5065bba82d236e65a157012103b66c014184f07f571ab6fdac8864134038373e5abe905e3afdecf0f98189d15fffffffff92498c1329832ddf168765dd5325278966343c2f788e0fdbc375ca17a424ba590d0000006a47304402201860dc8a6203376581dbf581fa56745d43cc22f23976c712a456cc41599db1a0022032e02cbdb43e70d86fe741d3eefe990d1f3c05e316ccccd54986948e519a452e01210227997757925471709e647321fe566c74ab4487fea0831e405313349ea78ad5f6ffffffff3231f0e7ece48eece297979f6d67efd91015c8309256fe26a46b2431284d9518010000006b48304502210095b82ab7237217b26db7c7d226222388ec2d4daab988f7f980f8abbe49dac3fa02207a4c9ca49e021c79e0581fb6ae165f846957bd6343ab1a7e92f5c352a3f3fecf012103d7972106d09adcbb0f0fa60321eba7fc51ac06eda3c8f44963eb4c1cdeae8b5efffffffff7a7ad6e2267a5811506f4b4e0e84d01ecae49f4fa490847e69e2c31bc241da7010000006a4730440220040ab56b2dd8a818835d1d802957224157712e5e60bbc936fbd92f8e30f379720220188a1aaacf1cf4295cf42c8d096da5973939b32d47748137ca9ab279474f8ea501210390a8456aa253d30b208973ea44b074acdd0e4cb15e25d5f2de295290cb6bcca2ffffffff026fda0f00000000001976a914abcc5501c2bdab5c7ddfb8af54d12c46c418972588ac0008af2f000000001976a914c082abbfb3ec413ba489209b11aecaac5aacc4ff88ac000000000100000005638d152911ad71b0ae3128a7f552462e722f103bc34cfc4ee940454ac2af8e283f0000006a47304402205891102c12f372653a2ad7edcaf16b6344359b723ef301e63512c1b69fead374022042d4c7d9f55266f450e6285e0ae3d15a74a1213eebfd028847039927f6bf928b0121028c8bf6dcd49baf18e6ef57228ea54c9e4039b7f7d99946626434fc17c9e425faffffffff638d152911ad71b0ae3128a7f552462e722f103bc34cfc4ee940454ac2af8e28400000006a473044022012906e7d0c21d45416f386fa5e8b70e44ac657845d6276918ab6217c0811056102201adfafb846be7cfd7b8251d1567cc0b01b82e8db28ba3d5d9804a45809b897bf0121026baa49ed6bfe52f16f0d328b8bfeee05f99388b3b4641dce900c3684a95a28d4ffffffff638d152911ad71b0ae3128a7f552462e722f103bc34cfc4ee940454ac2af8e285b0000006b483045022100c6811fc1edf9421d07645f7f792056479f31016fb5d65eed08453047e8a9e3dd02206517429e0cbee9b1751e2479419d0cf93e5d1e0959bced6ed623bef870a6253c012103802fcdb8d6635484fd21c0320daf6b9b2e0b811db96442d9be99a822676a0fb3ffffffff638d152911ad71b0ae3128a7f552462e722f103bc34cfc4ee940454ac2af8e285d0000006b483045022100c07527eb9f0efe6a5fb8b23f35d1a47445baffdd40bffdf994768ddf19f97594022062dce10bfeaf75137fef51b619b049f3ab7456b5ad55eadcc4ad26a6403d37d7012103bdfc3fe7c752f21f3101b331c7ca0a8bd760b083260a02b000fea68c04684dbfffffffff638d152911ad71b0ae3128a7f552462e722f103bc34cfc4ee940454ac2af8e28650000006b483045022100d5c6a7d346c936496c2f00418bb649ccc15425726219013c14b7d6607a6bf03602201bca73549878a6179e5421dd89d280dbadaca281e3b1919a61e0b467a1b7e19601210362b1ebc2050133818f3ddb2bd1afaa712bd43da9e3baf8d91a905acc451af5e4ffffffff02409c0000000000001976a914ecb15a858fa33b5f121edd856b6110982e01f46088acd0dd0600000000001976a914ce3f9c438767b93be5503b14adc8b56c4d5df67588ac00000000010000000567d7a52aaf377a247714679712258769ca57afbf4cd0d7984f8580dca3021603000000008a47304402206ebd94b22d7b2ad26ddbdfe4002a34bf08e108d95ace0e4c828c103d112606d402203117f01fe96d349c13d117740f148132aa987e242b993f0be3e864a2168e5f9e01410443d0c474d738e11f29da45995202320b05c2a847f94a59ff6ab083857261d8e35213914d59cc963d83dfcb15d37120b9308b0db96f09cb49ee3956f128a9beb0ffffffffdd2f6ca977a4aaf843cf489cf0fb0ad61ad51ce11f34cfc482a76b7b838d4fca000000008a473044022056284030b1bc05ffb9d2d9ad9231d43e62ad2fd60b1e819d4747ddc4b01e435702200bcd2b125fb6e6733ab2824a5d077c16406c5cd079f0e2d7f0592c316f3763a601410443d0c474d738e11f29da45995202320b05c2a847f94a59ff6ab083857261d8e35213914d59cc963d83dfcb15d37120b9308b0db96f09cb49ee3956f128a9beb0ffffffffa6f00f891a86d3a630e09b43aa24b91ab5c7a9fb5904d7f4e82cdd7b52fe7330310000006a473044022040e7701c13339a22ecc7edb3f1a9d2f15989d27da10f825f84912abb5aa468b3022046984c24232b5295750535afe70204acceb604814aeb85d9da0f7f2f49d4faa3012103f7901b70bd57e655f3fa3842519b4aedcf2a7d1bb25937854b386a8bbe0900acffffffff612e526f4a0df2cd9c20b1aac8548577e6935ab0d26d0f4280ed7ebac6bd12bc000000006b483045022100e691b5777435676d61fd56d139234a64e6f3dc7ff5ee5f489f18de8088ea33280220597dcac0822fafd9fce5dc0a843ff806c8c31e797fd008565c0be1fc8973e2300121020febfe84f518d971c1c3158c878b61c3fb7250600c532cc0df8f0a02016cec26ffffffff61665659744ea3566b3795258247cc65bd597c4fdce1d47fb54dc8a1f1960543b40000008a4730440220569889e4ee6f12df5b249389ac33ed066e7a07b8939068ab92959d5305d8bec702206cb4a5a1f7c67b151b36c0f2278395242e4750bba43e02dc5af2aed710b79cce01410443d0c474d738e11f29da45995202320b05c2a847f94a59ff6ab083857261d8e35213914d59cc963d83dfcb15d37120b9308b0db96f09cb49ee3956f128a9beb0ffffffff01404b4c00000000001976a9148bc8d05aa085575014d2515cc23e7865b1728fed88ac0000000001000000013bf82ab6ec03fb21a12fc8434a2f409c6e05b6a59ef22e7dd27ca76754650ae8fb0000006b483045022100c173e802f6af265f13b3b90f4236e4d9c712c725b7c1df10c4c6db25cdc433c702206900e08269c384ed113caf8d4bf4cf12c0100e96c7c1c8fdb449465510dd068b0121038c5c3b57f3d238befbb3d2d30722c84a258e7a7c1c6104517c34bbc5628fad3affffffff01c6ab0000000000001976a914d702201d250b4286c770ec453efe24fb6cd685ae88ac000000000100000001f6155abd104103c8bf63c7c71373dc09dda4c2d274bd4daca3a3f9fbcbecaa0a000000006b48304502210089d02527090fd13eacc5db55b4b82de45f12fed4e2e024de611dd7c479ce2c7b02206ac4e5b9d68516d088e335678bc1055a9b412623aa0fef10d16426f340f423c30121023380650476b0473c1af2a2beb4a861e37fbc6d131626f60defd2660adcd7ac47ffffffff02a6558600000000001976a91405acb15c954eb47058ce41875e79fd573ab3569b88ac514b2d00000000001976a914c21ba1a47928f8bef6be74b75d0c20e095efa8d388ac0000000001000000015108c49440d32f496d75e4df926b9d44028574f26f3415d79d7b69851a9b37e4000000006a47304402206e6ff17253c0742b63090795267d5bc940b1b490cc7a22ad6289f77888f1d6510220041ffa2cf43ac960b94beed09012571490fe2b55ade666ab3cd22f47d2184af101210328e1bca9b6d122c93fabb896f88f278a2a2452999a0e503c44566cfa005302d5ffffffff02b0838500000000001976a9146b4744b1caa854a95c829bb750e9f1d20496e5c588ace6aa0000000000001976a91405b535c47c2c3833621182b5be2acfec19ed265a88ac0000000001000000012cc5d2942e896f62113305f7a171983a8fc8b7d0243975055d02fcc70d368a4b000000006b483045022100dac592e83757daebff93fcf84b43e5d6b8272a334fb65b9db1bc4f40fc8571d70220340fc78e510071e9be79a583de253920105c158f77bafa9f64ff7919067a2e7d012103c6d94cf9b34ddbf57655ae016139681e1d544480589da64ec7fa52cfc3b86d26ffffffff02f007d500000000001976a9140eed60663e5a3661056131458d1fa6dfa957209f88ac48aa67000000000017a914a97a15771369c7747cb3fedcfbeb8f6fbed3c96d87000000000100000001ebc0408c8fa08a7111298be3a425045354e89a2cbe0d8a72a0bf9fbaaae5ed3b010000006a473044022015489c2aebd9f29902801c9c1c4e0edfaf00a687a61c14447a98c7aa2a26294b02207dd3fe965c7fe87cb5fa349d7e28712d3dfeab7b1f3953f79dd28e755750dc840121034a74dbc431735a515e44a69e12d33717119159f9820a542e8f086bdac5da5e68ffffffff026d786300000000001976a91410b274988d65f957fb3fd7e8950e34d847a9495b88ac9632b600000000001976a914df29a6dfcc9407be57f07c7116bfc0bcae3b34eb88ac0000000001000000019ac686ad93e3190110b70c40a6db567fb6dc7b1cc70aa9b591390f5b80a70ee1030000006c493046022100bf2afe55acf5edf17f00476dabc468cce1aa87048f6a3aa58ee34828d801d513022100a629446e50c72d0c9eb78aa89d2cb95e4d63a3c9eea4bdbc12634072725c727f0121030749fcca4a7dd8e6a27fa6189ce4cad476a4ed5b4a2a40fda660852a54b22107ffffffff0218156400000000001976a9146737d81de609e9af1f8759a39b1fce6629d1357a88ac50160800000000001976a914f13f79a8b06c3f32b8aa0fdcaabfb17df1b2f30788ac00000000010000000108433a84a70189ae539cae0d92f87babf71ac70ac01eab375252730cba4e36d6aa010000da004830450221008a98e2763c78dc6ed251a430bcfcce4e435bbad9e1b82f36d1a6e172b01b14ea02202b4fbdcc6c9d53bf65279aaf2000518973be9d616c24c72cc50a9c04169a43d6014730440220379f36b1fa865cc7dd7105c95676fc86309e400b709aadc300a5c2d7e910a529022020df8f63955815031c4bc063bc9f46323d038f6ed5b154f4c6df2d02f820da37014752210204ee8c004fe69866d3b8f3a7c0189c9c057a04cc313005edc639f9f50be504602102d4767c371c863dbeff2b79b0907d25b3d6cec8c7b24a5a08ae565853698e27bf52aeffffffff0188130000000000001976a91436b5253fd9868b203ce55ad5cb0098f6b8a1aa6f88ac0000000001000000b87c4198e55d1e4ceef534b613c02910a5b575630d525050e0a1fe113dbff28aa3000000008b483045022100eeda446aeea3481faaa212da516c602432b0914969c7db1bc4dc762ce791f8840220302d9db3df494c5e69fe1ea5572ab5d13643689a609e749b4e25b1c2de12f46a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3277512f83aa03c92e1684f99b078b312e31b4512b85c2b1803de35906dd2064010000008a473044022000ade40c68e440f3cc3228770ceea71e32b730b302eca0faa5285c1424eb84660220260b07b9c9b8584225cd8f1f494fc2b847c67220a7f931bdf4195fabad232bf6014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa0119a50b72d800af4da404c23f6a0f9f2d5dc70b237b8a42437083e3f5ea591000000008b4830450221008e26d9f386a1dbe1bec9d64992fff72267d58c820f95777339a7beb33074274302202490d80c8e493b3c2aad40e8d46b3e5b422843c69dbe1ea54dcde9befb302058014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3e9719e662788884c92bcac44b49dc598beacce1b86c7cf354813251963970dc000000008a473044022070633190d0a813e19eb534246bf78e50750f7efa502968da05145b740b32dbab022013df01422c6e9579fdd7c702599dfa5d1e4a20ffe6549ddb77651ccd1c835d41014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff4f1dc75a10e37f7c07f25b42bfbdb8687b366efc4f35722fc66996437dade1ec000000008a473044022040664463aa5027baa60345d6085d3320fc923fa9e4b891ac2c63d8257c2843450220119695d223bd88abedb993dc5d7f163324b927a2c38200a7cb9e53e9e74ab7e7014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff2a60b2351dffb2858ad98d9bf14c8f2cbf843ca4fef386b6380ffd7dd030e430010000008a47304402201b99e239f503030ebe369f04047343ed2dd17600fec55819dc343a28304bb096022053debd56b2cf5d60a661ab6c217e1545be5de2ea329e2d02c275567867c58df1014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6e16cf94944e72e495e516c09595cbd1d80209917f8fbecfa3b8256ce822fccc000000008a47304402207e6ae3d939a29f5aa7c71b15b58ab64bf52e5fae57f1096e029d5e371d0c446602204aab472539cdde0526deaf4595d93c5eeefcadef136ac2b7416e09b181945f9e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff254a1807b6d5e9403375c54dcbd520555f3e6266dd4ca144d8bbc16f3870ce50000000008b4830450221008fc243d30ecaad533fe51664ed759f0ac389b1e9e265c7956856e16d25356d9d022033dd3c3f84be5a6d344f734a4146722a3a58820bad630c5b82bb1ea50e932856014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff47c4b165a7ce79f892ea3515670726db487f354984b3cb5894e9c414ba6483ef000000008b483045022100be633ae66d39450a26f732abf591b635f476e6736ee9dfeea05d6ef779e61a4302207d4dce0bb91815ed5f24bdc0b6a3214b0c661b62975ac351bab0fc736f8c87c9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff9de2082c61edb091a37250493c017922742c956803ddf7148a84cf59e5c72404000000008a47304402201e298e468241d16d1e15c6ebfd8174a15331755574e1ab5923fa47eb851cd208022078545a5af7a96537f5e6cf91f167f2eb84874e350a96805ca7bd900000d59266014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31fffffffffd64001351aacdc62258c3b6adc122a1db38491f4a8dfaca57bff5d005ce5ff3000000008a473044022011ee32514619892c0206b22ee435cae58ffb701d3e72f02d84f4fbefb2fe07be022048b2849b9ccb51959083e34195af970b96fadf32451b4f07500e1b567ea1de56014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff03cf3296b916bf32c037cd73e6fd5a25e6ad692fe0068842962ea6e436a4b321000000008b483045022100e16691b53d93ec9db9290b331967a970d3790ce63e4f8b77f86d4fa0887f6cf5022050f3b26be49efd4bc2e8050ce1edb098f00ed68736c926e17490ace907a6b022014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc485d158f7314bc0b2c9a66518e7acae4d396b8d573b50c552ca00108b4b4aba000000008b483045022100f9c2a5b8aa10dc498498e68ef463873b64adc8e3a46ea67f690180c7461a32fb02207709d8753ad5a56ce2b7abe36d3cc4ee66e15e949fe4afb0004256d8523069d5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffaf18b493a975a6ec7721fc23a8cc8e0c700780310dd587bb2b9f23a629e68a62000000008b48304502210090ece15ef481a340c19d65f6d100f426a604eb9a73296a8022352a1dcdf2f7ed0220158956495c8b0891d8905b24f50db1f1029a95130f9ae5b021ef3b6e9dd86bfa014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff407810ae14f48ffb8cbffdba13e00dc412d5965ed29730b2e37fb2558302906f000000008a473044022051844ab15f6ad2f31c443720a7944c940a48d309ef13fec718c9c77ede6a6f250220226faa94f75f1eff928f2e28b33615509189976ed6040c55002bfddc68350070014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffac0f6e6d5dea966c7ec24cc88c93067a7875e0f9d36e0f3cbd210b5715b6edd2000000008a47304402206aebb839d7f647e4cf973779dc38e636de9bac10fd998fec10d78e4afe01ed3402202557554620d5c7914c63b55c8219bfa0b3096794f347cca99200ddeb49e20153014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff957dedf22d0a86b4c020e8715dd8065bf8699d1a63bc7c1ddd74112f06cc81de000000008b483045022100a6b59866f2049ebfc358529f0d551ae8b2baace5c25776b238270109072f62fe0220108697a0fd6e455de2a601660efa6b00cd4f26722436f613a6736b933fac8d33014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd467f7377a086ce0704916327ceae6c1963d2ee38729f0cc8c66b4b6d7c4baca010000008a473044022026cd4956d3455e90b3f8c1c5a50ace75411e04b8f68a6a2027950b83c4ded28f0220321bdcbef2ad151cd16dc61320b32b5d295624f3348b70c2b7e90744cea4ed15014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff503880629d78f396845186291c3ce00fe99c8b62df583d5f3987d8ad69273de0000000008a47304402201a4147043ed4ae14d820288f5b746d6b0ab7b2a2a237251ab9acb5e73864493602203054cae22af872328f220c0b3b4ddef7fda256f34491591ff8c9e0e4f5baae6b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff19814da5f966f8ad13350f6a639d37c7ea7f66769cd3c3e8d08fb65e263a121a010000008b483045022100fa192e15b372b949f84e30bb31ddc236bd8edb48fec5254d35c22b250cff875d0220645ac2488f5341dfd75a8dd16832742e2ab141df84030254b09b67f277d9938a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff29742ee87db55f67e77c3acdbc812042d37e803c1cc1e1a451d8ca84ded54a02000000008b483045022100ee6ba558c1f6e302b201bc1e07824469490cb967dea4d5b6168e6727b1f870f402205ad60c9fc9dc75b3ed341b32d8c6f3b69e68658036bd4cf4f6a4ccbb298fab30014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffed776aac195f445a7f76b41416804b4182f96b617d0e2be718436b18333f1642000000008b483045022100956f4c4692cb71cbd568a8e84b9959de21293ce8d2605fb27def79b4444553fb02203e5d65820636ed4cc233bb670cb573e574da0651b05a5eb9f56fc682a45d7585014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5df8698fb02381bb28768dc0c4049dc377b0fb376ec3b7761a2b57a662e02bc3000000008a4730440220353f2709edd69a12b03238f6f343d487a17b33b247604fe032ccdbc5f13dfefe022067f0a3296881303aaebacb12b2dd859e4c123c338cd9f65eb8e7d9010a7ecd29014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff61fbdcfd7048345a445e00a48386285056f8d7a7ed9b52805a5e400117b87d1d000000008a47304402206b9ead4a53cafcf84fa44faba826205b9b2e340614efb10c4a670480d956b3b202202e47059725ef945f042369569297448c4e5928472a6881aa57d580a83c94600f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5061a471874e56a7591c26bc1802abd5bd2d0cd62f9138d90303f2b1875ed031000000008b483045022100c57982480c741738418e284d03c296d5a8680502c262de9336d334f7b9424ae502207fdbfea795314e434605a29fe15d2c9321db7dcae4c780dbf688c8da7299f1fb014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff53698b5ccc19c0f781f1429d418360f63cd2579ea8696d876af97a5717c3e5db010000008b483045022100e9a73aadbf54f29a239a65e6c842b772950b0a18ef26e4421e9a162d666ecdce0220439a00b842cf60195042db8a98aba17239f79089a31fe71161fd9350690b2f15014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff2641fc9b8e682eac377dd41360754ac38100f9065d237649f9fcb12acd902c8a000000008a473044022004e04b483d1b884161414df372a61df26466bff4ce271e39c16cbbecc84eedd302203672dc6d0f58d10cf0bdea1f647df855d66e206b854af4138f51c0757f20a094014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff52a934404054bdbb9ea752b99187b46745c28fea81025eb26ab667bdc8757040000000008a4730440220044022550bd2c3e57fff2e47d01170f57199ebc64081936e7f493588d227f01402207e6233f2d50023f83afa9e6f9174b3881c5e60f2f367b9850e0057fd3eeb1b9c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff627b10f07a1ca1017923798fdbd0b447bdb3cea80b399044dbbaac4827a6da66000000008a4730440220129e328bf95b2253bd7f510cdbe1280c8140ffad110d00008c3ac1e6c1636c2602201cc89204ad03315271c7306b7f6ba0f3fd9795e868597f767091f98bd689b645014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5eb612fad48ca64c6e9da2fc9bb0bb42cacb4f1cfedf960b664d408e61a8ce2f000000008a473044022078d986296e71bf978095d31d7404e5f7f49ac936b17bd401682cbcae354a23a4022071bdc4f2e7cad5fb521399d737fe10809a3f03e410372c60101c0ef633e53fed014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb3b1dea271be16cffb2723caca96800805133119df59a5413c4c18b2a73dced7000000008b483045022100c9e25c79d1fa49ecab1345b2989c63a87383c3b6b7d8161708741bcbda62c7d902200ca94940c6056f1960f5d19a0852e11e29f430afc8c12fe176bbb0d9245de2ff014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8eda448ed420c500b4751224a3c1bc829c82ddb2571c1604033499eefa415f44010000008b483045022100ac9a41dcf327bb5a9927a2b43ede6067427e24dc737b4331996b1fe326bb901f02202974a02008b35f66d87e2b8bbb6554c3cf26eead36baa4ffaade682c6fc8d6e0014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffea50912337935deeb270d8ec170ed43468f0f4ab8935513544e514e8cc82785f000000008a47304402205e668cac8f8200fc964b950a4e57668cba72f09915b2b5088d984a571eeb2f87022038295f8b5d84b1b784ca4059c3bb6a4c06098f27bde87d394bd896061ce95b32014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc3860da9b15f6097f6948d6dbdcef23d0599d6b8d8678e44a2ab4584fd5759d0000000008a4730440220086f115a6a3cc10160eb7e84bfdc0dedd27b2e53f7a9d4c353ad5cab37a49be702202030d5668c906219319a25e37c933616f05a0cbcd7588c62d73db831ffd09818014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffad775652988c4b5414d96411f13c557f5ab822adfce99be9b1168966329cdd2d010000008b483045022100cd8fd9d3d845b267e8069e906ced74999587703de5692d2192d0a52db62f20a0022049c2798b6a7b776e2e37b0f707d7846a7d04b91d01173a31dddc19c8230e1755014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff37cd20486aae1e6b1564221a8e51635db9380dcc3379d60922248ab16c687b38010000008a47304402203f16aa07ca09e56ff1dfc5d80cc9be3716d9b1cdeb27c7ababeafc5a8af0861f02202e9296d02d55d6fbbd801e86c62598fb519e38a60e980d4ed023dec2d5c8cdfd014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8e6bd97bd3b51402e59e71e99d131e3a1049a84ba6ff62c3b6fb41727d6e8d46010000008b483045022100fb0f62ed272d2be75dfc8a8ac33b6d82e251834f42eb1f604594efebd4b5ecf302200cc28c19730ed6eba6218826868c1c69b65cc706cf9357678c5ce8f0b8a20ad3014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff4e867af2aabb9bd83bd9100739079ea285883a30650f7e2e1481b52b7af97b2c000000008a4730440220539667b0654549b9b15816dcdeb6498ec687f6c67fd723096d1adf0fe22afead0220418b18da629e89af14787fdf547e41047d4c9a5bc71669ccd890d9021a33605a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7158df8dc7240f4cee203e70373fc27ac1fa11710b0483e606145d6b15011908000000008b483045022100c2c84d90e345c94614e34fe7c46f2375c49b84bb67c6ee11161439bdc1935f5f0220798e8cd6aa9da32ae8b84afd20aa4695970c0b5139f77bc4213c27b82dc8a03e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffde33795b1eac1a780dc22f07c04df835de23b71417f82fe77c395e212bfe33bf010000008a47304402204128e0aa2a2505477844653dfafd8323130c3e1308476049c7c479ad6972498e022002e8c192849b7e03211ad6756b0c14a4d80f4fa0a67418d6f1efc8a99ad79b7e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffe84954e619677efd1aeea6b00bc4452878d5918dbfb2a8e186fb6ee2fec4663d000000008b483045022100f273c82287b4fc9355546c2c1d4b2fa55127e554d26727d7b6fc231513fe31fb0220453a6f0103757d048cb574d7af5c48f3cba459ed1ec4a1c4c78e525fa1fe2f29014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8580a0ed63d7bb72b3173dfd709f5878b1dc3d00d97f799fae88290fb20fb7c8010000008b483045022100990eca1c490380afe9433aad3cb733b6159d2663d508a66a022e7ed8a51bb5240220170eceda6d93055cb505b19fcbe942841dee55f9a6148ef1c999f0d8f675e1f3014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff24589ca66e842e9eda1119cdcf750913bf57704a8db23f07aab13e419e9a3d3f000000008b4830450221009a3550d9b7c8289a19a9d5c0515965a0dc8eb836fca04f1958b322b756777b4602203a710b314c1fd1172d86f9235b3c8eaaeb6854a053a05d6f44c0c8c01f93e613014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffe510ab6abdc2f0eceac3bb9c719a8c7506d824737e9ef0bcba0f4c118fa2ecbf010000008a473044022023a97e79a14144efad96ef147eb6ba6e372492b2b6fd6fa2f0e0e7d5ff846f5e02207179786786eb72f4666aab36d0b5e766a984f9167cbaae8d53c37de339ee8e34014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffe5536289772ae083c041c11bf0a963ed22c608d1b5bd4115158d11bdf031430d010000008b483045022100813886331fd81eefa7bca4c9d67b159ef58267dda0d2821bbb99646b52fcb3d80220701b7aac212609cc13a344c41135ec3028fbc00294f0fcf4a8cf9a36ee5d6b9e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7c8f010bc0a031404fa7823393641d152200c555b47651b2e0825c197553236f000000008b483045022100c2809cdca3471f5196e5fee32487965c8ff919910aa58459c90c622d5544e5eb022025b9a4b474b021269be086d8b90b766c17a3a1bac4bdd336cd423f8afb2ade2a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffcdbe97681bb0119b19317af8ccb326e992fdd232327c00a76237cebbfa536ba7000000008a47304402202ed67072685202d2ad437ffb1e35ddc6652e7aa35010541ed9e69eac811b379e022035d8224cbfa385eda5d79a776fb33b97a6aaee526d46f45bfbe1bf34f9914b8b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa2f8d98625a03e292702649f7c3f9118663b8bee54a731698c84bedd814d0917000000008b483045022100a3f56fdfe39c9312164d646298bf9b91eadf6c803d7a8206af0a3e948455c56402204451edf99e7c5ce263f9479260cce2c1596f6a23dbe580e71b98b44087524ae6014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff219db259b8f0779017c8b183713041ce18312152443ba1ab61a22e3017f76d61010000008b483045022100bc08e13b2f94a8100830ce531b2b2a06e70a21cdfdca10eac7f889b54e31338602205ebd473a861350671e9f08991d4512e3ded92c8a091e6f98194f3b08fb4b8e4a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd8760ba4d949f9002282bf254a4b414e2f1ce4d3e0b874c21c4e5f6fd3974589000000008b48304502210083d38ba80768150228d781cbeaa44fce32e99fc44558266de28bd92ea4d61f6b02204911bdff074b0b7541599070385f6c7cfacdd0d64a018ba9502f50539e4f8b0f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa2aca55af7f47273c1efd1930d43b10dfcdb4dd9675c95acc11b8ce085d02b92010000008b483045022100a1a98d816e3d3ef94cf774e166dfd3853b8b44fd019f06254018bcdf9cffa3ab02203ca23adf7ee90210136f103a03857ae8f021f406e290c6f6ec47f9ce11b02ff0014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd796e114a60b46521652d943ec69f89b708c44034e1403b7e906e505ac5de134010000008b483045022100f84173dd064f7c9e978599df7eb8ec4e689e294fab7da9f681a8bcd64449b85a022034c80a3e6c40ec4e1ef3f86b21ab2b138851863aad5c9c1711f784e080431875014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff51149c823fa3c91390b6fac44db7b3e67a25682364486d09727f5fe357cc247d000000008a4730440220080d35dd7f0112a1b4e327249aa5526d3ce79e388f4786ceb0b171759611ef0e02204f7211fb127fd188f9d88f3a65d351dd4465f4dae7323db11d2b1c6ec0097693014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa4be8955ffd66dfd7e06c220abc009a36607b6c7002e95094cf48b5f8b8c738b000000008b483045022100d3919ea8cdd491a699c68b1a2eb23849110cdf07c7e5d5a59a528ad1d1ba80a6022033944f0def54dea79cb28ae27a40e0e2c45d417ad4e2a044f99d5a9eb8d463bc014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3a310aba7c3e3dfdd24bae393d7b3f9ab0d4ebe7a9b2ae7b9e0543d7737bd3f5000000008a47304402202ce7b6b9b16cf6ed83ea30c395fd277e1d1edc48fa8202e206d6ba17d6f92059022028ba664e1618965e6f586b84989cb0df0f23d7222374653cd95fb8eec206820b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb93c390e1b4b837fa28e8a91628b8f08c3134bd754c2bd2b3906d198db9be11a010000008a47304402205bdee36f23809b9ed67d9b40d41eaeb02a6f7c314800c61fdced84e6e6d4afd3022028d03be15d43bd22f799f86a5a1fbf8744a8633b50d36cb1eb14115c4a332394014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb60d5082bcbf074956e986273799c5f9cf561b1440aac7bd2921eb35150f305d000000008a473044022025ef764daff376fa6ddf9641d4c2e6682ffd764d14b3af80895d2cd29d9b0e5602206cadfcc1bf24fe780fe9690c26419c166540c03a3917e597c7bd24b00d54c649014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffae3f8629958ea057d99081e94e956aae9f0fed7631bfe2055d86d823f7300df8000000008b4830450221008e5698e1ad05c297cae346fab32e6e0e4d8ccd497ac99d85b3058db3aca5024b02202153ef5dfd5218229bfb61bec530bfb87cf6d62d923f5e2e57b20617f99b3e2e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5a645dbcfe1d7f8c84362491d30be34147e29f5c5fe89ce41071cf82cd4fc090000000008a4730440220237d6e715aeafe591a4bbce13ca2205d4742e67ba7126cbe2e0548ea84f240f002202781feac551bc415f954c68412e75dd8161152a1123ceb09a5158ef02493931a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffbbeb3c7158a5a0c1c013c7d716f889936dc7317510caa3e00c1bdb2b82d9cc09000000008a4730440220186ccadbc99b4a2a05aa2a8cf30c4e7b2941452c5b2932defb7e3a7ff22c51d40220257aca08118cae27a827856365b541420dd568bd42e64e342874bdf35fe28d12014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffe34c3dcd2193f88130bbe0662b898a005d0c95554752aa99b7a5bb8868b45e0d000000008b483045022100e791d6f955bdf42a7deec8968e677592e666fcd11dde697d4d3f8e53d13f68b3022021bf1cb5084685d614ce6d876da9cf353bb8bd6a85bf176bffce8f509a458c97014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb19eec286c735a140c6fa491c9ab42f997e0f7d7822074526af4281c1b3f3643000000008b483045022100e5dade3f507443886b3d6ae840999e9ab2196b2e2895e7fdc835eff9ce93cd96022059f81d7217ef38f296db35bff0ba928baf7edb86bc543e810bb37af621e73dfa014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3247d44c025670b907831a6611b123322eb8028ec5ff393b68b20315fd16d28b000000008a47304402203a6fee558c5d4c52bf67ff18a8361cb7af1f850dbb0f930da270f7ae80d93363022021b8c162a1fa670af36e206affcef61b9f8bdbbc3448ccedaa9819d5c3f2d8d8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8e972204e06c5792a1ebaaec8426654ab5e5a7b1f292c4f94fe5590c0f7d85d2000000008b483045022100c3b507fe529100d38feb60c5f6d09b685468094bf060e8b7f41836088e1ecc6d0220370a76e3ca0252710351e2af8b88a50580265e0a7f96c70d4bbf751a04c5614a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6dda38a03bdfa0c362bb6f2b2cab2c6f69f5711f297555af29382841a69e99e0000000008b483045022100829071fdb1c8b1e77ced838aa68b5b21885219b0658d252346cf8130fa3acf0202207996837b080bd26087ea3572ef33617851b41c7a10c905fa34d1f4cbe6258e01014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff75571451fdc37d95afab561755d8a7852356bce9d4ba3148786e0b055be9824b000000008b483045022100920ccbe0ac458f1933f038752c170bc0cc479356f64d5d1b32117a9518c1859402202a4cb804b739f3bacd1b9d4b6bba0ef7cc44bf581619d2ecfef9ade76a3c5f7e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7b8b65702b722659bb26abc601d21bea053f503af730879e73b44b2df07d2005000000008a47304402204a663f4a80cc5602e325e096645497216e4a799686e8f3b5f1463dbd7112dea0022031a9fa3d5dd682dedb0b8dbdfd53cdd318a43ad448f434e932e7db3c50e21c71014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5483de99c58fe38bb9f18e39c5bee7e293feab4e5a1cbf33d809a9009a778e9e000000008a47304402202c3e0974aa34f852c20cc355374a6bfed1d519bd76593454ab1ae355b7aea20f0220180f297e3c2a2b83bf369bffddcd162d9bbb491ce4cb74c18822fec9bec36e26014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb6920943981c338874eb4b81bdbb238f7f9f7c364ddc2a4101589859cddc29bd000000008b483045022100e3e4521e165b08889b8add001a7f2e6d2e4cf784e175659c023367551335bb3702204672996b313569c15d6c4b6e5a7582325264878af7dea45234b53b4a1e94d736014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb979117ecba981a558c7fdaeb120dfd674ff65deff370c3fc3d033a36e7595be010000008b483045022100a8eae5b8478ecba8abffe1314e280386f78009b6c388f6a3cca25b61e8e1976002205d957f4e19cba9b09b630b53d4f9effcf3f2e9b8e6c548d7c67d90b1dcd0ebdc014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3bde6a3172c412b733a84b7aabc70cf261ae4d0f1b7f435e6ee21c8a547b1a9d010000008b483045022100f5014f528e70fa7a109a77b6a920290fb412fafbb2b20a52bc4ad398b670e00302203c53316f83aa14db4fb3de7556545e54424752809e08aef42cc4fcc1ac4a4fe3014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffad564f40dba7d0351204717637ffdf446c2a838eab98508b3563b64e4738d14f000000008a473044022019a80059a77d926ea71a8fadb9c1e8a2f0538fe736be5bbe49411f8917f32ffc022073ac901cb186196c5f70faf346039ed9d2a534f3bf38d05db2be4aa1f6f7cd3b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff9a3335f1bd1029838236285fffa275d042c5c55edeb86f8e9f166f23b38b1407000000008b483045022100b4c615707e0084697d8bf79d0764cb02d6fe7c7a1325fcace111b177b02db1d90220658caecc16db36b4321d3bb85e348a74ef18ffbcb0247cc97fce27bcef8db6f5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff84e05905b9f91889ad2bbf1581de3b2cef77726987ddddfb45cb67407a28d4c6010000008a47304402203e6d59a681e2edda2718b013f7f2c88972b8385b9ed62a5349da1e9b9580279c0220454262933f9f008c0bec68c81c3188f29f124a3e2bf24dea8b875dd842196cb2014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffcf5c10bf6a3639a715e876dccbd829d0735b8072e793868dfb3ef72e0342aacc000000008a4730440220056b1c4c548224de2adb5b3019fb95b867767a84f5dd9bb9cc091392f607c7ed0220272772c57ef153d4523b82572a976f8974f79054d64754177db0e2579227888c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1353fd4879d2278fa903ae59f4822c219e87110b8ead3d31b2c3a6410bdef4fe010000008b483045022100ef2baf818f7f44bfd339aee5ab8609b1d344eb31a94184f8ad3ba1f19767dfb202201371689e1adb59af5c8ebc6e35f23eeabb612c43bf26403cec751b31fdd96bc8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5399d5a7d6530ad48628e7a038972745a1769c0c299898a9c9136f6ac5533a35010000008a473044022045534e0591902f508ff50fe55845729e88d44ff7d9bcb93a0afdb00576fb87d102205f79b79a3795b2857eee7aa819dd794012e73a4d10e58a33d8131e8337bf5e22014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffefca3bafc2d9d0b40da3bf3152ca227b5e380fe6c28829b00512007a5aeb4946000000008b483045022100f5fe50463e05d2a3a3750e3556ca046a768f67349a7ed109072f0e66bbd23f8802202fc58b737a8095d1bf0b0d22d836408581bf323d174afe9b293c4eba8e3ae44c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff19c71b3562d72d49250f6532ef8fc0e6e1d5e5a01dd36abd72be7d2bf011ee5d000000008a4730440220697b858e69242298680abfdb451fb9e82f9f6cb04c791a1c824b7c804cc16827022059d229da3b946f4f451e4e697e4485ea91a74207d4f5929602271335f7f3a8dd014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5bb75916582eee737a89e43d804d7c95a3ce0076efae967ab58d322497413a2c000000008b483045022100c55a8673ac09b50d1f55bcd8436834759b5d8b76525288234856c18aeb4447fe02204c512676c1411d8f7ba3bbf1668bba888e3732bee4284c3160102619c91e36cf014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff341eadc37fe707beb9cb10820d3dafed594c2db879bc86073590f0e425789b31000000008b483045022100e74da24be0cc25f466a4f32bf607ba08643b8f38fdc645995a5175ec064b174902207afdcb708992f7269c8e8abf22840fc77d8e5993192f96b502a66296e63e3430014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd7be31e7640389705769614fb7e7b1a406105f4c77f3430321288241eace429a010000008b483045022100dbe14444bd0d76a13deb03a407e007513fab9d8fedf00449dfa67c7c9b909986022051a761687d81fd381501b61a6c115c7e2996680a9985f4cf44a8fabb92d6647d014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff9921eb3073740ec243a76c2fb58f2ceffaf63abce4dfedb8128f51f1a17223f3000000008a47304402205a54eb9d87b9ddb8145e3e4c04e8f2b930f5b003d678980f823e13a205ba771902206169c29b8314c19f8bb7a26af21d9d63221321b9cdb87ebfb44ff742f0e9d0f7014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb8c300713e7999b0913f7dcf9615339400a7bd9f6d1158de1d291c15d96d7f4e000000008a4730440220799e39435b2080b98336c844d5a997ed783986d07a69567005548a5e5107464c022003d741fdcedd1fa7c4a82625b6f984bc6f16bac6d68db8a3ae4ed7b68e38a49c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff739960f57711539f31ab19c617003fd874fd35c224e00a7bdb754ef7572da76d000000008a47304402202f29fd429fa832762307779eb15d4fa0b4abfcfd33d00ac94d31e10669ac4b5b0220126c3399e52f5035ca9cbb1b21edc21757778196541461ff1384a25a1699f6c1014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffcb1cab67a095611e20621cc2fb878095609eff0fc0747b06bfe93111dbfa5838000000008a473044022073e8ca9be3260b524207a8fac634b1490e1ceaadf41119b4c10a07fc59f8ee2002200840eb9c98bfd9c3ee72297ca5d2f9b72ce7d3416a0998b62cd9116a960edaa7014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffffa386af16e1c935e1cf0f82b6c7029da3ff28136423dd647d8d6522269487ca000000008a47304402203cd12209d80f2d93fc31c3e4aefd8e807710efec83aae3fd34ddade3dc3ac2a3022030729e72abd3e3ba61a376152a97ef6bfbf02ba23c0dcd848ac1e208e5884420014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb6b803d129190d7560678decff3967de9813e32e191884a4406e3e4b8a38364e000000008b483045022100f32857b4044ba6701765a5ad531c16f3c129a681c30a156440f3d3a4e4ec8c56022002daa8432d861214fcfa164108768b74b7ff97886d3bad9885a655e0a6d61d98014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffedff6fb28d5cae891c26c8786af0447643fec708759e24cb16f4863052d5ed9f000000008b4830450221008a5e583a76082dd398b9b1a5bf97572895d434e5d1fb5e783e273e18b8fd75d002202c6f6a296645f5ab2522a69b7f0be28dfa36daec6b353f4c1caf8ae5ce7efaf5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3f06bdf732290cefa08becffadb08ac9c85aff5bcb320eb84344a0312dbb19f1000000008a473044022067475d8413b0ab578daac369522b046c4cc9d067e628edc50a9249365cbdc696022022717187cecf56df7e7478cfd5c1a41c0d2106a88560cac26e8ab496b5858b47014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff76d7eeebfe78df9b2345b901a3cf1b811d785d33bfc9ef69e0eee8ab2bac87e4000000008b48304502210089ab8911c742bb4190a24969ea3906d495f5ecf196ac962125b375e32080160302205b857923b24e44bc6818707e630f223c590773f7539952d188b6b439addf8d7f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1b67c1337d493431ba6555403bb29074f8594b9bd89bdc171268b6cb8d5fabbc000000008b48304502210086dc86d6ade4211304b0fd399c655c4d5b27431296dfb1f037996232452feac902204cfb1430b507445582343967e5f5def131cb786321fefc53d8c07176e2262a6c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8a5e0517eab85e25654c717a25c72505ff56570b395d1e6493f22d87085f3d1c000000008a47304402205df97747e1ebf980b5a7ce5c1eba4bad652307d1d36c230dcffa02fa91781d4c022010ceb03ce1a0ce334f92799e6cb58711e677ea3fcd2a5b23f8b415cdfc7703de014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc41c319801e90eadc57b4f08c09c204b0c87a8939d421eba2e8f46a05a814643000000008a47304402202ea29bdbd504a29e67206f618090c1ba496668561a93f0b26643bb132a944b2002201e789b05303dd5cc68aed8d9c5ff78d4a129bfb5536ffd6214ece0219ee5bd3f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff87411b1e6a12e903d3c2ddf919ff303feefe09afb13f8bb853ff9d0f987cacd3010000008b48304502210091f26b68caff41a6e423d36ff91102c24ad6ae4858ec791afad4367f2eae7897022076bf9bf94b8343a7bc630b607fa273ab0390f7cd2af9fa9b4d9de4b7a7112e80014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd4547281b9edc214d147cba1d7408b5ee26c6c2389348b7d3e7859b54714d98d000000008b483045022100bc0ef15413d09d82ef92d065210741e9241aebbe2c3bba552422c775861d894e0220174058888e772f68206baa57696941b0a538cb1bfcafe7713e5c33cb9b5e3383014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff00b9358cbb2deef7cf26a8e7dc8f8d2c31d1ee56d6c7042ca031f4c30564c9c9000000008a47304402206de0742f744af7968b90c7e1eef0735af93cdd12496760917f9e0dc5a17bf6dc0220788c2f233444bc8a8155121c53c68e2c10463f94e8f409d49914b05c1ef62ecb014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff005d8b79412ff14f0ada5292feaff0ffa9138e1276aeeea6f66c994ab57b47f2000000008b483045022100fbc626da5f5c298532fdb3aff395ca38f7a36fb9591c06ea6ecdfadbd72d8a3302201f9a078c57189ca9dc7f7f488b80598b75e25d2fb0eaf2fbe12fcd88124c161a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff920f59399168b74eb11785fa6701f41e692b2ffac1fa29b446de85fa0cde86c1000000008a473044022063ef51b31d42c8001ce1a15d57ac90d5bbc36ca39a091eac4e7f1373a0ac8a2c022022285e9e83fa333780162268473decaa3be30d62ac6f4e67d4e0353cf7eea38a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff0d4ed410fa70a65455632fc4e4cc609228151a21b5b9b0dfb292afda40a10c4a000000008a473044022067ed12233108143cbcd70f21e4ecdc6a89aa648be55d9b3597d2494eb5d664480220268784e125afc8e96d7b1a28b1f46af59701d4bbaa47529577cad8dc4bf27032014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffac8bead47aac599802cdf05d30f62b1404248fcc9f2e1d76b768384bde25796b000000008a4730440220250cdb1f8c7e33a6887554c8645aeffbad4434ea33703b51b032223ef9a8b00502205a95738f10bf77717776ab15173038cd68e7276b4b3ff9aa732553ef579c74db014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffbbf3cbe2bf5a4fcb0d10224b5e1dca14036a806de3bf46654ea18a6190054f8c000000008a47304402202fc4d3538bf1601ae9871f3e27cab9fc2eb427e05101fcbe0ea411d8a8238a480220076a72ab277f468eeeb1615c478071b6fff12300caadcfaba5bf4eedd5c8838f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb87e4c78efbb64f9f92b27c694b5b7c784f80606028c1d487994e47c2a274914000000008b48304502210097dcd6cdaa57786c862dc115db567e4cb386df0869908cf89c19bd17233d488d02207feb6656c0f769d06a9ca9b75f1ef13fa25822eccbc0fafaff044c6d908885c2014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd5773bfe1952cfc90cc46490fa0a126f52d72847a0ce0ab919f6bacc51850d3a000000008b483045022100a441d259d25af870d39eccc0685a6c8aee1ce27b400abdb07f9565f414bb5bda022032277fe7eb2a08390e50c89dcfdc937c3fc892ee9a946976c91202cfe7c427f8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffbc594876b467b2b0ecaf21d327681a3be9989778a5804ad49e8f817fa1f27997000000008a47304402205f001fa929d3092c150c243b31abcbb15a7dcddd7162abfe08b4dc33961c25bb022072ae3b951b7a660a8e1a91b7265fdad94182b3692b74cb0407e8247cbf56e96b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffe32b4cab0e68dc9ff28e822dec3745f0c103ecb2f337a29d22c0dacb4cb6e4a6010000008a47304402202daa1fa6db42805ea5c841eafe1c0dcab99f2e269d96c725ea176fe2116ed6c402201650154cb20b6a5f535558ab67f3dd16c621c1e745b7c142b4d8514a2cb59d6f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd1b5374661c8cae0e214e8309d8c04ed3cc9c7689f2b5a98354ec15d6d0be2a6000000008a473044022046ee82dedddc26ca99eed8499b12a695a9c7a2ef1381b17e50552ca61cd228d902206fdf2a5d54e55015105dcbdb19b33702dd1a01f2f1ca8e621c45cf759cbd282b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff2cd9d8b0c6e15541f1b8590154e02cc8950ee5e9b694907368db04134192325e000000008a47304402203f251d4d7843f0f9e8c2b679df7f4ff693df1b31cacc1470e5f7ceb8c6be0c7a02205706ab52b580d5be3385fbacb34593fa1f49d910e6411aff9938f8261ddb6fba014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd8d5f536f8cfb7e90a37fdaaea180db7bf30568e6c286bfc86fd92a36d00fcd5000000008a47304402201cf7e79bd55e39a9daad974e903caa4347a4fa79ae380caf41b5254bf74bb64402204ac03a15b33f5cf4132a67b307edbc814a37bf1c781581420d95d8526a94ac23014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff613c450cc4ada24ac4637e521fc758349f02f8b82183b0bdfa071e3d8fbda581000000008b483045022100cfe5bbf4116cc4a70b204abfceb2791581a072634364d27cd6638c8ecd7301360220708cfdcf732825f742679a83cc2922985f5aaac6458aeaae51f9262b35331165014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6d3c2512f4e9d6e1f992264b0f8d3876783f08bfe9dd96fe92c5fb21c971b075010000008b483045022100f051f41838cf40a4aa1faa774026b125ee8986d3b785694a56299e753484c587022049c5ebe12a1b44d198abe3b4ffadc266abd9741dfd1ab9533a03a5620527f6a8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1cdcd99d5fece0543ac159abe33fc1189fcd55988a133ccb74380e05833dff33000000008a47304402207c2e321bec96b02445d522bdcee1a17c2f693623afddfb4088c82ea5071ea56b02203b49d9b7d7118794ea6849e7d63387d894ffe8c881cd0edaeb6bca2db7476767014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5bb6206b44dbb0a762caab0ddddf0c6a7d2ec3a4eaaebfc1ce8611cc0438a626000000008b483045022100a43ce3cd6788b2ec10617d4540959da885d62fe90875c2c6dc6627a5d156d5f80220789fd46d7324dfd50e346f3a9568c36f05bfbd2c793ce19cff31c71dd9b0354f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff410a2272cbbdf4d1c3d85e487932959c1c66fa09467fbc32bd6bd478182c1698000000008b483045022100d02ea2ca50f8f4ad625f7f738e487fb523c75d104b06b9704870ebe4f457375702203eee932f0fc09aa5c19b54b5b51ba030b32e677c212438b36207560f340b912d014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff90f0ebc055fdabc61ec6fa5c2e1fabe664b66c8e95dd25abffa7116baf9eb787000000008b483045022100fdcc51cc1e937b35463fee6f1a49874980bbb8f5143ee587adda7a1c35ee8fbf0220762707a80fcc93e94c55fdf2b7d4daf640691810405f7b64bc6e353dac8471ac014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8242d17e7b3e7a61334eadc44357d499a397b9453570831735753b50768d3f69000000008a47304402206d684282153be872c4e11772cf9d915407a09f2ad49ad8b2ca76a44c79c9aa0202206f035aef0350317f6644280981d43975607ef5b157d74d73bff94b4216807662014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6e9d70f0655a4b92a677f7646b820b349cbb227aeb6f9d6cf0d1f72bbe891e25000000008b483045022100801dca6e34108199bb96d955eb37556ad3e8751b649e9991a082feda63cf756d02207aad67f56de4ae23028fc0eff5a905a26e5455cbbd45a6ac96c4ef356626e323014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7b470a939f1dafbef8d3dfb097800a0a678ce4c76ac700923849b1fb4afb7216000000008a47304402202758edc5a3f8b1e3433b8f094d8deafb6cea8b4ad77fc9548c67a54298b2846402204f1fc190cb5b4388f1f500640a99752e2cf481a07f67bfed4ea8ec56565455ec014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3fc6443e9c98af6c888f420a7b130d93fc5bb43f6d0dbe4cec07390ee72813aa000000008b48304502210087a84272b59b56835ac01806589a9a2b902327edb4f9449c710a0e09e0c2518b022062a1114886705a19d448d7e22c2bee2c13f64860eeb4ef2879d60b0226661e08014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff04d0bcba3b007db4a9c06564d40afbff8183f9ff23bbbdebf7ff995051d2fc94000000008a47304402203b031f0b0b884383d498e78a937854ca1d0316d4d17e4fc2d5c047ee7b98db2602206789a7890ef8a41f9877e6885337bdfe6b564d1b9f7f29ebe19e5cbf330e3f87014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff77e7c34ae68833d9dc46c3c81dceaf4bbafcb64546b021557dd5949d2918f60f000000008a47304402204fb919701f43f138d2be8cc68dbc8dda72e6e76c47e472e89589f8fe67ae211702202cc2b296ae6052d22da1e16abf57588579c89e41e60c16f8423fa675e4337076014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb9b5dfb3aad4209ebf9800b7cd1682b7c230aec93ad443385873bdcd22fd0df0010000008b483045022100e5a755a5d58cbcc719d782f0f26efc0cfea38a8eab375bf3267cc4327dc67d090220262a6641c87c0a5c465faadc8b9bc4558975b990633d8c7ceff85e4eed7e4813014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff97bc3f5ba4abc5b8868d26262a126dca3703b1ec087530408cf11356e89b03db000000008b483045022100d9e3088b40a6179018b0778f8dbdf2f4475c7e3c10d3dcda1334812333a47ff202207ec5631f210a76fc5c440c2d21bc05d5b9fe8f8b0ec84b0c3da0b93e509b5a5a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff504ffaba0bb537c161043856362ef433ad59008a179c5fd160b2b2752ebb3681000000008b483045022100a9549a4a6ad21118c583e75999aecee0c5150361e8ed244f08e3808b997ad7ed02201827c923c7c6001aa4b9fbb5ea514dffc5b5047393273df76ab9ec9a8a8b5895014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5822c751db3aec1f9c186ad04c647833fb306d65971aac91b93d28c9212c35f4000000008a4730440220707b3659923b8dfd76c7d903dbfbe0aadea217e6a275cd427d160149bf24a30102203f3cad64eb867d1e81f3eb5025bdeb94ec15df254367a6da85decb7f923cc6c5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7c8176d62010dceefdcaaf2041c93751f4921bcc66e11af6bd7407cd023b1c31010000008a47304402207500f7ae56f554fa5da181796d8a2c3789ef83a0c19a3195e512261669a52aca022004cf4984ac55396daacb6f0fdc158dafcf879916feec9b5293bfa295d7da6919014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffca192f3548af8c5e4527acb43698086b7d8554a6186f45d0f0677d4341497058000000008b483045022100d17b1db7013bea0ffc9682ae183367030034ab17951636bcf18196e818d4f96202207d284c19394d64d0db8485ff68086e140cd9c0c4750fdf23f98478fcbce2c945014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff302d83d4861b1805001d50261f5a57c16accfe008c71c7c2b3bc315a045650c0000000008b483045022100be2858873d48f5509da2f0d24f4c2e0ffa170242021e30cad8519884474cb13302206680758cb2cc534b2ba1d5a76cc50e25438ced3741410d0249dfae6c96b1b3e5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3a55da4edf4d70fa0365e33978ccb01e4cec1580f88151bd4afe464f13bb0bab000000008b483045022100867bc26135f26fc394d4fbb7543769cab8d396b441e8663fc98d90130469a7c50220048fb394a87e67e4aee54374a6838d96a04305c315a07f428b2a59acef6fdd38014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffca848424a7316a36a62d61706881a46ccdf9b674233ab36c9df770faea8027d5000000008b4830450221008b379fc7c944ae0c5aea0d999bfe255a4b246a83b7672010f95bbbefe19c92cc0220662010cc05e771ea21032c6f4322f9c519a51945eeeca629f5d2c2f3dc56a76d014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffab95bd888d54daaf79c9ffa61919094a7984e018ff7e96677c551672ac197120000000008b483045022100ed4e1245c7335d86da3d1344ab431a217added435df3f9e29b5f75951383381302200905a3663b79abde7b1908403a120baf9a86fc58f88858aa2b09f0c0aa4c929b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff005d5bf27713fcfbe9eb5241413b4b878d9ced694085b87b0c6b78862ed58133000000008a473044022040ef397be77a634b06a169811c7683c1d057c8e382b2e2a70818370acee89e0b022036d4d6132f815e5fb459c92b720f5af12b5ad492731d7dbc09c761693b4ea17e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff320d3d03fd2dc18439b9548d7a087b8e1e050e33903cd2fab7277ed219d605d8000000008b483045022100bdf2df098ed75d0a9a703cfd452a74ff2a11bc5e302086fa97e36866dd091184022033cbe0d4cecc337274d5b2995d403d4117180c41e68c7c1142800ef853f15773014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff24ec65c908b33ed3bfc086cf10e85df742308afbad37cd5af41c07ff85a2cf95010000008a4730440220650a1491229ba89784106d55904d0e19df732e583c0ee6324456bbf9186ffc120220331de16013fce3d496057903a7f68a53a1ff29e733523711c5afefbb64627a5a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff42a2a3b811d8fb56b7a4223ff019967eb5041ac5bf659adc358ba067ca0259bb010000008b483045022100e1909855740e31c8405cd39ca6777ed2e2d0b0416d3488d3ddd0463164724e5f0220623010050534f4f6c26d51cdc421b27fc657048380c1241d5e756ab11e121d04014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa1034a6a2d9d4c65ea7648a31226024d39153076ba09b9d45b393725915cfb30000000008b483045022100806de8e5fadd6eb2c5ecb78af6ea63382ca80e03984edcb888ccf894d912676c0220526be08d98dce7b22a87cf32c09d9f0f12502d29a03e0604330e0c8a87346e3a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff0698cb56a5908c6192e0c8e6d041af203127f9354211806fa07465725cafbfb7000000008b483045022100d376b3a52f06dd22289bdd9b40840a16bb3feeea3fa5af0ef0e327cd59bb51a102201c475286124ad3b3d21fc7ce1fae1a4682f5a3bdae3ca108f84aa71e4a5faff9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd2810d3708794a0ca2f443aa48fbe57059c8522aae88d7626aa003fca715027b000000008a47304402206ce297a3fff1f387e8b51e2ee0a3989188a6704d2c8aaecd6456c5149420486f022052905a95e2df32b446c965c28090ed6f6905fdd8b37576cf81894999a4836b18014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff07a5c3cde1aee46dd25ffeb5d2a38c389c0935e104dfe5fe80358da0c9ff1fad000000008a47304402205d25eacc41ac1542219bf37e4987cb43320e2bf9ed728f2bda380a687e64969b02203aaccc2840818b2e0b071eea44d4839d77f02ddbbd1e3d723dcde4a449a69e69014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd328309a12f9a353b568c8942f646f4d4872556b244975ee2c4f32b58d8532e1010000008a4730440220691de8e44b34e8f8d2258d5615367ad8411598cf558dd39d7e3a3263fc214cee0220375a35915efc51ac011244e40eccc9c9287767601a5c130e64944a8c6182ebc2014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffdf261cdd4022f6a492796611e95e22f39361baf7fffd3c2f869836b191326aa6010000008b483045022100c755e0ebaeec6c5876d9bae03b7c371c23cc88b742754a3566f034bb3382941302200a159f45ece620a9c7264483c5a35dda1c52f98d1e7c1664d0051ae265655cb5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31fffffffff1cddd934535d9494cd76b4fd950cc1f18a9bb4cd4f5bc8053d7f6595cb9a277010000008a473044022008d270eed1bf8eda19798a8587eed7dacc943b5ccdef759756861bd86d6979e80220123c49dca5b8c9f46e37e727b55fb6400a72d37bf0b869f98ca51a3068d9e24a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31fffffffff2121cbafc846910733618448595e5227285a4bbbb222ef751e79c276b8a5a5b010000008b483045022100ee978bb7a709e99b3de5bf0f4d213df1fff26145a9ba8b7eb1be7f4c62810b5402200f26d59fcc72489834d6b77659e065ba324c83b323350274d41628324f98e99e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd588a900826ff889224a12bc60ec4ddb1aedafe345c4dcef01b8f8ff53952c8c010000008b4830450221009bd2b206b18db4f2a79dc0468c778b5434cf032328a7388f5ce6ac1e1d930f46022049de0061a046f8c6a372f75f1f1ae33baa998085c5a67e93cc73bc8381cb5850014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff63c1431b6515b603e3ecee029845246a4cc30aa445fb16a654c7f3aaed307c8d010000008a47304402205fe9e3253c5b7062344b9446b6c110ff30979f120623839377800120229ff2a202204b3f996326348c13804c01e061de002e6a9f0eabff0122ea786f167ef9937906014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff39c83f0172a417fe3afa61601d11cc64db00491d0ea5f409c50782b7f185ef33010000008b483045022100dbf8faf92cb26d2cb7e849fd6779bd471cde07dd5e3af43fc5f91e16b9a58abc0220246d519d7f42eb64a5c36964863289dbad4a2a24597d48ae6215cc75c1bdb1b5014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffb38a77cc124413448d78400e54534142da5374de08023f1326915822b441f1f4010000008a47304402206c6acfb1a35cd54e5d6a37da42d382db6b2ca45b5e398b1f3af05905ebd1e1b1022001cf35c338d098a8a59735f504f5c79d4a02e3a929ab0d5e7c1aaec1b2c8a8bf014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1d32ac194c07011c38e81f7ea7dfddbfb63e947e47ebddf7d2f918de49d261f0000000008b48304502210099d9a8cd8d28b4b604fb600882695d6a134468dfaa32b560ff7b1199cd54850d02204e69288a83597f174823bb61228390061942013141194d70a828137036c329da014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6e6a9f6d2fc82e551a32366407056e8c3cbd83154553b1b03152df76ea7aff83000000008b483045022100e89ce7cbb9f6971f5de1445df82ce70763623f797b2466c2ff72759ff05d4b9d022028ed2d146dc025d6df3276baaa5ac4d7d58f44a61c58f05b755aa29de943c18d014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff132aad09768c7203015b216bccb0cb0ef8ad2f1a88c852b38ed2b47e54d84852000000008b483045022100fe99f91e45dc47fd23397588edbd85644daed0af86b8df537ba3e40ae8661c510220658080555caa11751066ad65a13227ec08dd22a090470f55cb8eee8d5c9d4aa3014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff74699364152cf9503099025f2633e64040215009f88c48f5a53a1846c76774d2000000008b483045022100bf3582ea3e3abd9e2e85e3f3d2c113b9d9744583b5a775260e5473932366a8c502207f3d6395d48bc3a2a9550ec8ba04988f12a846174f668a43bd7999d4cc289931014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffd3d918664de66eb38492b1a560dbabfd3aad8bc417230302c85de69084c5eb6c000000008a47304402204af19318445c1bac157f30c18f83cab8ab01a60aed6fe3dbea3c4262ee1e047a022079b0aee834f9c150ee80c227a08d04c1459be273e05b7a956bf0daf76c9faaa9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff8a78c1c76af02f23da8fa9972a64c4a2ea937fb9e74ded960ff6d9865c290361000000008a47304402201f1ff75678b2cde661d9924508f05680c655d0295254555ec1f0e0434523ecbe0220700157e0f1f855adf5896d1e859d1c528f519f583bbe9198b517b01962ace788014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7259a0d989c12b84cb6c8287ea3a14d991cb43eb82c9414561e11e433693e789000000008b483045022100c1723a623ac964b47f9eda1fa0d677b654509f2aafdf31a9ccec9b780322594e0220451a0afdde1853efdf6fa04255aa9145b2f32cec01dd3cf8eea533b553c6e9bd014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1a670f8e3a391c3c1825b5e240b4386d07e06c85999037e73350c2d8faf7fba5000000008a47304402202c038661489357f534f70cd4bc62f2de54cfc17ce3bdaf906f2597e024ddb70202203b4f23660e011052a1b6455f4e3a8475ccdf9aec711451fd36050e9e4ace6ecd014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7ef67493e1ca6e65e4689c761fa9ad0ea4db3a8c466754cc0e5274a87c88ba3c000000008a47304402204452da0cddc8ce6e0028d01784d158cbe16e53bb4d6b9bb47498885ceaa18c3b02206aafa51747d4df8aaab35ab3200446734e496cbb1a602434c4b64154bf4febeb014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff483c8cc18b5b1436540955c219dad2f7462def2c4f4b516dde21db381595ab64000000008a47304402204febc808cf2533b62b3fd11f7031bc63494b54bb5bb24b6ce9df1991d8361562022023d3a81bc83a769cf9177d38b728998dfff09983b0b91246f70f8b6d201d3be3014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff215bdac20fe63e8335f9ea0c43f0d8a25d33a98aaac3d9cce2f582e9963f1b60000000008a473044022073294aa66121a59af5a437731c9e5cc43551f4881c1b204f0eebd2ced278df4a02206006c675103253b36c272c2656522c816b0bd1507001d578d9141762cf8669c7014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa91d00e346908b7dbfb1b99d50cf97174326c96baf2c80f46b1fc2a3c59f21a3000000008a47304402200d4f7c879f014360685964a6bdd2c893166399ce0b58cf2dc4b0d41711e769b302204af0b15fcb364f1244e94d282d34de8d4e01cae46ea48122649c3a8344fc237e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff1ac78c4e3f938507b6221ab9c9f3a626f75401d0cc9cd52610f81f442c26d295000000008b483045022100d19a1aba79b29b94dd3e3cb9eea7e6fed13af4a92f12321e2a062fd6f7b7fc1f0220360a0bc78872046f29dd7cb5bc038f0150c9ea255e2e0f6c774c6c36c994221a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff2d91dce60581601295b0f7ff77b30b40fe9f78dcf2fad0fa9ba6fe314dda731c010000008a47304402204b331c66e6c6c57f1a62727e3b826a9a41a44d76d28e971e3b6840e12907bd8e02202cc7007afd33b189cd9bd8a942b39888e32d4add4d7986398d2b4332626b3517014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff935aaeb916d3407de9642165789893f1c9e7fd9efe32c9bc28d7aa47a3bc074c010000008b483045022100c0337f80e2292fde2a35c355caa3db54d007b37ca154ffcc1f6133beba00664e02205ec8fae0b65b7aeb3e22adfe233d9829b7c773c00a695b5b90bfb948f38e931f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6a25951027174bf71897b0053f6b7802c806aab3365985bda5f6bdb0d5471023010000008b483045022100cd020ee32cfc152bfb7bd9c1e6ca0b7338a7f06fe896d5eb98581147c8dd9c1f022034e74292c5371c6639d6feb59050fd30e6c520f7b68c44c2908e05643fb8b040014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff57ad14afc7991423c5334bcd87d1a13d16c0c8cd1be9c64b6353b0b35f902d3b000000008b483045022100b0b8801dd2230d1f0c6e4c077ae47917900902ff446472f257ff61c95eaf61a402207398f2dc2a16042acfeffa0196761f96c451b0a06db971f9180e17165438fed9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa4235ea316fd8e8acb55c1c21f1bd3301f60bb1abf38ccb8888e9c7abd0d8c55000000008a4730440220698bf4e31c91ae559f3f754c06740c98b74accaca0d2ff5d6e1c7536c44f169a02205e4dc61282e66f9e53bbb63e87c75d98d954478e1545beca45f498b12babf840014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff5e92da56e2fabe175184be5c050b88d35d5b8333642ddabb2e13738e856ca200000000008b483045022100c9345da7f30cc6828487a8283e1c64209ef0e29761c83297e61428224dddbde4022042085694970b494cec4a19a624ca03870ce6eeb57acda5aa8e71685dd20e6f9a014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff89b0db9276f277e311df97deee08b19339236b25ee841d663b1957ad953d1e0e000000008b483045022100ec0ea2ed79bf747637c932c567e958eef7efa699104e950fc358a5ca8f9d7b52022038e78b215d0e1decf4ca0ec3183548bc58806aabdb0ea6bf13c2f6762bc2e8a8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff092fa51d98dd7c8aaaa8b00a4887d80d4f74047e678a61ec5e5c73e32d61ffbe000000008b483045022100d3da2824110c0c6b7afea911a6abc92f600dcf8a011cc1c535ec00c520cd8a6b0220320c14ce6d4b7d3e4afe1ce756d9b53d8276c053856a5db720ed299ef2f2a83e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6af4728adb84d71999f175f0857930699508950727fbf3e99d44d8faa11391b0010000008a47304402203be009029197b002a5299979235fc2e87c014fd1cd05ee8437f5e07f1d959ce40220516915baa772c83c1db33dad66071223f90346ad4a80946cb3fec9de28ec180e014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff025d770801f54a073e14f1577ab3e392ce4cc606fed40dd10ce502ef2fd6319a000000008b483045022100e40f3c18270265710d1c13eff2973504e6e5495c6669d5be8e76ef37d467624802207cbc8d70d8d67d883865b5d830e88663230b501a71682bc24a85eeb4125bff49014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff6aaab7a7deeb45df42475cbb94dfe7ebfeb933a0701007d3598e570d52057eee000000008a473044022062eb92b45fde372be23a4303d6db8f18fcd5df0ebec8c4ac09e92671bc5c8ddc02205d619dda7697f12d0919c5e279fda221a7cdb34fc803c68397f7ad1a9113ebb8014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3f3f10bca4e619d545eec4c8de8d39f2f00d2e11496de84592bf0d359c882072000000008b4830450221008cfad63762e582869626df188e02d1c0ba60d007a8db4187fc24871712fa26b502200b4a6f3ddd6a111e50c677e26add7a86c3b7e3c6d4d0f1f323f12e5d74ce31e4014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffa331749f551ee590a5f2eb0908ddcf1bc11510ade17341b499718e1721c0c62b010000008a47304402207e8d20740a72b1c0f408a245a3205c56eaa719c7e8e582877103bdf29e123d5c0220503be1571dca8c2e9e7a33b886efe8950a2630f10e3346a84cacc5fa2228e3bf014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffbccbc5790606effb348cf836286c780c6924a187fa2a5e7d8b6a1e09d8a1bee0010000008b4830450221008b26d9f2a9c8fb48e4bb58936bffdf827e01021630dbb046bcbffe32b2a25e3d02207e9a0f8d87e894d79d26e7b1ae7c31fff681cf8f750a4cc53908323abaa6607c014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff091205b3a39937f559baa29509fd05f5a4ee8c99bcb2ea9dae01a711b09d5eea000000008a47304402200e5e51efcb65fe808bbd651899bd0066676423dfac8632741fdabdd6f871ad3c0220067c775af3a930d87517d9d47f5270ee842151c5f7b386a69813d34df6f56b94014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff3bd2e5f5963812c511990473f571df69b7c771ff39837f5cf78763f2d0ae720b010000008a47304402205c2112bc85801508d99068b15be0eb7e6659294b9d2fa5178590c213d220cd8c02207f5eca0f05a6e222a162fe315e37635ad0cb5c9eac15db1b4f034a43908e8bd6014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff2640720e73ca59450543e5d7e31df9d7627b3b813f39a4f9f1c5c0aa33eab6f1000000008a47304402204ecda19976af6e6ab59dbb8c2fd96d5f8b69cad6605517c2c0d5d83427b230a202202e575fa7b7702fc9600ed471c794903ea2b6654624e711b4e98fb9d68dee6ce9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc781bf6d0c5a01c9a664a9ecdbc430244a9959f1a1e6f411fcfef32a0effa4bf000000008a47304402206dbc53812699cdd117d98a2f40fecb45eef0a3cdb3421e1835f279bf71a8250e02205c7c5014c0274a4bf2354a69db5e1fb0619114e484fd7697218cbb1a4f1bc01b014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff73a878aa68bf12ed0f027367f0ca1b75ef3c685f93019f9a0fa2369428e99f84000000008a47304402201d9f838135c01a453e2f57b5e20b896510c4c6b3ff9c682fc52bf94a1bc726dd02201975732143c12b706a0389a002dd8eb8cf02cc35fed12eb4cb169b1c4ead5b80014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc6c0b577374e63c8be2f3673ee6877a15cb1957c2459d668e8c16791c18fd385010000008a47304402207a921c13c5b80154379a7e530d557e3f8f36438f87f9083638912e201f95a3d4022056a253d5f2fa5be5573fdb0e63762b44f34c2ca2837c506845ed1ff084f4de9f014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31fffffffff7178c2ad8a788cd9b8414c316a90e7a2b9aa4d0e3500a078bb78f78adaf2f27010000008b4830450221009d5983a820386a665e3abe92949aaba92ee9efd4dfce0f6cdc64ba1d5fa6952c0220564297e5930c4895c0c244be47377e1be4f207f96aa111219b1fa1e8200506c0014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff7e9eb93b7347214c7a4fe15bcbb753124a84ebd259013a148dd90cfe83f12a62000000008a47304402201178601ace2551471f7da7fb398c1f9e2d2f789e5d8a662fc32b73a983c7f36c022074affc15eeb6c499dc98bd7bf1de94f1bb60af71b6c0e2ac6b67f7e63623eec6014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff41c542485a6dd3e2acd62f57c34a6ff33dd73d875991c39b69f0a47cafae4c98000000008b483045022100fb311ce78f3bdadd9c80effea6446257f95429963414ce669ad9b50b1a59588d02201f39e30778ce8d91aa8732db5901cb9e4052d0551ec178853e736b1baab7d4b0014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffffc791001af9897690ee3b3aab38893b9c04295a2ea6caf83017dcdddf190b7c20010000008b483045022100d2ccbeff28c4019ccbeb67cbd0d669af90ec2bdd4d2301fd93ea0db8f3db9a220220116e9cd2ed250cf417d0f45a6361a47bd1f26d92a49a933a8042490627b68fb9014104a5ed97469860bbe8f05b9964dbc83bb17e5d14383a54fc4395e1e698d01011f6827632c50871df697d46faab766a267cd3b12a17244db5af311133953b440e31ffffffff0261236e23010000001976a914510e4273e56cb363926a149dd7b86e8838e98f9f88acdbed4901000000001976a914b526df90f2bb0c5830b469b8b8f96d25e127de5d88ac000000000100000001d27b447bd3730b2c58e05dbd5a6aec7473150f8f7e69482cd7e6eb3ab26d9f7001000000da00483045022100a698a2d989bd249ba70571230b354b8e54845663ff7d32afac2b3591154061e7022061d18cc45f7e6080799c2d18aa10d4e7b55f5b50fa3db99babd19c460c34c5f301473044022065da4ed1421c0d0c3e157c2cd736e4c22d6af912a84cf1fc0e6f418e51a7bf7402207bcd88362d13127897881bc9ed3120f114b6a5a027b6f2979e65810c1676882f0147522103eac01e7ba42cfdd382d140754497ca33bc561750077e8adf73f963e288df6ba0210396945cc1bba0e1920753033878225a9db6773e25ee54b34b9998da8d7264e73152aeffffffff0288130000000000001976a914ba5dbe9f26ce3e4019bedcc8d820f50cfe7f482088ac802429000000000017a914d9ac0ca54a0c406d20b84fdf9b3cda1809521c4b87000000000100000002ba215a16780773a6492d9a9faa379e245852ce64b772e9554437895f14686f91000000006b4830450221009ad06b19d68f485d5616de7d64a373cd959d4fcb8b263d78e77194a780fe40030220659a86324793846cd91dab815fe86f5965c574711f08b0e8bec67ca60f3efb1801210282d8a0845f70288da1c9733a34ac3d53f8af2d3af472f39b66a3c7d9a4d9f8fbffffffff4617c6d64467436a2ae1299d5ced9b686be607f0bd5614a717c81c718d362b79010000006b483045022100d34ddc1164b0a11ce669c9a46b6d1fd0c1cd7d1680d5e724670718f7ab529fad0220204f57df044d968962c62c8ab7f6b9df4a86c40d5b5d2ffb384dfcc6723e32ab012103093e395799cf1d2047d2bb108b849754bc5f9f8fe3072f40e72e56ed049512b7ffffffff02dc0a1400000000001976a914f44903978916e08286ca171309579ed21639218a88ac1c300000000000001976a914b803863ac070da84ae68b20626c5d6f47542495588ac000000000100000002b9d39f88260df204f6a0bf620b4fde95003d095cd6422a01946dc939ea8ee30801000000da0047304402203edfcd14022dc4624ef6197cd8549512273e5a38519a922b1584e07fe98aa45e022044745d2ca6eb1f2ddcc6d954029a0a5ebd263cc97a5f0c7d65af2610b798bc6701483045022100886f7f4c740f7fae0e76d9dd2be028c86c01950b930b7eb7a9057f612092e0ed02203134d8d0f080e4dd6dc85b60c51c03beef2e12138404aaaa53be0ace160c20110147522103cb5e916302a280d56688daf22122e67665cd9208ff4273dd2fa1fa39625950f3210369552a76669aed6e02979aa08d743409f55f3a668db8aa4aa50735a3cc231ac452aeffffffff2a4bf2c8f4ce17ef610b9c9afdd1dff65752d7b1ca0963b0ad5141350b5cefca01000000da00473044022002427e1469cbe60062b157454f42eb90780f2a86c78cbaff072b7908240604f3022042a6abd842e2e3d7921fe186f5c0089f22a0f5bd688d182f45bab62c6772f00401483045022100ad9be23e59184041b3cd082611ac83be295f7dcb5d23cab7bba38a2ddaa231e402202d47f2853f772f90baab685ec38f1121dde0279cca4c0e0b6de69ecb4ec1eaec0147522103cb5e916302a280d56688daf22122e67665cd9208ff4273dd2fa1fa39625950f3210369552a76669aed6e02979aa08d743409f55f3a668db8aa4aa50735a3cc231ac452aeffffffff02da534800000000001976a9145232cc109276d3307a91a54ce6f2c23c050082e588ac0806e62a0000000017a914df7131367555744a89e69ba16b645862dd753b8987000000000100000002a46329f00f5ce42835c20480cb8b7e9a5694a21653e194b7f1aa2bd79c98ed0700000000da00483045022100b1bd78e127df911775ce386e6004c556a31517a8c05bb03fb994b0551e4c728f022050e995dc70d5d933c6ca0baf8932235aeb8086fb45b6b2ef0ad55f26632c2bb301473044022071a0801adb35bf1ff897d6fed026f565508bdd8a7e675594523292fb66159808022004f5e611bd2a21307ae5f524b622d01162efd6fe5ca0f1a0b4e3a90525481ac00147522103729b6873394c29d1153f3ca9f4aafc84d825d6a68d793d373ce3cfb9cfbae53d21035734ae241e88a345de09a9b6810951e41781f610d2c8716aa25d634bd0c5401552aeffffffff320d8349e448c80a3638544e6a2b38730571812fe9ba0bfaf73898c9f08e1dce00000000da004830450221008c2de186e21b9cdf6a1c20fd3b29b79f12da360bcdca773beff8d030a870206602202ca28215f1f2c17c5c2b560af7f31fc84fefd61055edef25e07f4f911edbeb7801473044022043877b82b7fefc3b6f839eec53f056403a7923b1f61fc3bc02ad9ed6c44730430220640566554e16cc457bbf5317b2d83db8129d941328b022c89c1abe06dd3227330147522103729b6873394c29d1153f3ca9f4aafc84d825d6a68d793d373ce3cfb9cfbae53d21035734ae241e88a345de09a9b6810951e41781f610d2c8716aa25d634bd0c5401552aeffffffff02b0360000000000001976a9141d9357551b00179418f6a1c9fcd16938ca7a1bc388ac586209000000000017a914d16a297f5eb2d9a3f149d1e76885c07e55b331158700000000010000000490e92033022183502fc32e5a9920eb38944c0c5a7c3028d08683b14e369aebdb000000006a473044022076e178d40c102a5724dfe890d7a2d8870a31f6b20f42114637ffe922006ef62f022036e69d20e6a0e564b36495623f50c9fd5500cb5ad57563a6e98b6a04019d7b23012103569ac034acb343be34cce17996e90e5367227b473cefc946f6bfa19da60dec40ffffffff7620fbecf73fc14ddfe74e266f8e884cc645e38e99f64f2bcc5e8fb7c0c369d2000000006a473044022057c8251a4a12262eb30d92cd79ed091476f8d1c278274cb9a9c933eb615f748b0220610d008d558389cd737cf87cbbb4525ef602e2b9b4ab155da4af1b41d545abf001210310f74ae1830d58ec6a42284826c030475e3b8c58bcfe32ac3a9ed9f72600b413ffffffffc08e3516a48c9754d4ffde13d725a900943555c0ffbd91b745c198487201e505000000006a47304402202b4c1b05e480ef74cd8ddc9c72419212238a27b462c1c64c63d15739af0e7cef02200ffa0373a964f8b02bc7759ec411b65d20319af7babaf3dd6041d50f2b13f546012103057f484429b599b0b6b6fb6f2c6f2dc1892ca320b57d2f7e2d191c2a0eeff31dffffffff0eb66cecbd0c506f31bd65a96ec0933780e7b0d15f2fa9dfbcd962d444d0a628000000006b483045022100d39695bd98dc06360284a8f5e40094dda9be0901f86c3d01021630953693e10502200751956dc08e823737ff191d834b752e23e23db83a53b14abe99c9b23cf038c9012102a5f0e7ec7005fd18303f813fec8ba1846d6f8e401ce4356f27a644bb0c06618dffffffff029ffa0100000000001976a9147d690a03eb998edeacd67c2714a486087e1b698c88ac394c0f00000000001976a9147d6cd03388492a093456cf21149fc1962a17ebb688ac0000000001000000099f455fc2ab8ccddf2b1ee25c9bbbd118606364aec7f237ac75e8c8406d91bcbe1c0000006a47304402200a53dcca5564c250ba89c67a9b5daeb82a8a79cfeb08481cda4d98822c53e66c02206d953ecf27189cfd84b74f00e455734cd841e038372cdf91f12edd3a40286df8012103ebdcdeffc072cfa522ba305fe1fe0c6431be0abefef55f826ecd49807a53fcf8ffffffffbd7dd753cbf7d1edb51a170d82d2be5b29d4dc4d6944958eed2d485772d015c4140000006a47304402204a0c05c663005e865a6aadf41d9b2d7228aea34725eb8919a2d76a746e964b71022012c54eca0abdb155f588c79da79c794807fee244163fb049a31cf9ae78708758012103ebdcdeffc072cfa522ba305fe1fe0c6431be0abefef55f826ecd49807a53fcf8ffffffffbd7dd753cbf7d1edb51a170d82d2be5b29d4dc4d6944958eed2d485772d015c4d90000006a47304402201337ac7f3aa09842185a561c6bad4f5fbeb1a200071ab6ffb25495e4a9de3dd802201db68a253107f61ae76acff775609d899ae1ff52cbfa5b044bdfbbb778da416801210249abf28e6f462d56a0078ba3a45eb467a47701310838a2b515ea4f3f469ab0d8ffffffff894083ac923a4260dbb13f1bd3993ca10d3152fe2973297a94cde3de721db134010000008b483045022100e4f50cc4ff4b39106ab3183a3220a90ee5175ad9b933f28cccff4d060cae2e6602207cc1b9c082d786aeba7f89a92605a75e2096f74964b7961dfb1851d9b7fa64da0141047336b05430fee858729a60f791cbbe2e88d8aa90256ccc20558d80d7d3e3047b557ed522450279514207a5fa2af76c6d8df9e4c7b0fe04190631cb9f57358e4effffffffea113aa0c02d7b5515a60ff173cef170c13442e2163ec4ebb5427834cd056cd1000000008b483045022100d4b5f97c9b86b6dfd8f1bfbcb5ed2eac556fa254a93134087f476c155fb638d50220126dd77c277a80b858732ee366f4675d84840d5380867f8787ecacaf98455ffa014104192b7f06039a557345ae4b50b1290dc2af54e935387c6867c76ed4f67d7ab1192fc501dc94452fd3aebe9da5919d640ab3326dc9bcc04e12abae5298b01c24c5ffffffff0835921a048823a94d7600cb1a362578b4a0427d695fdacd4a4326dfd4a93e73020000006b48304502210099717705c7b33be308251f2de07895f5fa85e4680460ec8998a9e2d51405057a02203b84ce6e3461dea109f12258639c127858fd5a14e4bda13b26a24e4493be79fa012102b3613ca1742d38bf89511aa98217a11b7fe2f6c829b30b02f07744aa2acdd9edffffffff0835921a048823a94d7600cb1a362578b4a0427d695fdacd4a4326dfd4a93e73030000006b483045022100fac990201a2fd67e0d77f0495cb927641db216ce5b59be2a57eaa8ac25bed280022034c75345243656403945acd14317aafa805faff6b07f3ef2807401cb33012c40012103f4c2744ee15671eae703c6a5d74818e3dad735c043b8628851656a1c85d8cd3affffffff5159105b6d33699103a6e712b196b9cff22375e462ed13b2d491982efec2112e010000006a47304402201b8bee4547adcebdc29e2f9ed76e735df2449b79a4f4000418d48ef10ef2507b02201e97a396c2c5c926f8db831a4218d3c8fc70dfc6446f8da6e428a60c437009ef012103d8b4b62ba86bb31fad7d6297bab00f05b4a4346b119415b7922001a230c5f731ffffffff3e476b1db06c88385084ca98fa3b5a23e46b0fe4a2c0e4e5e6b0961d5c3decf8000000006a47304402205ccee8ae656ae9a79f215ac37f0266661eb42673ed134f3d2330ef767cbfdddf022024508069bd9bf158f79a8906fdfddbcc32f036f7bb09aa0029190c4aa76411f8012103d9289fc2e8662c1e7d79f3c140f069d7f5d12d83b260d764564e2ce9db068d0fffffffff0280f0fa02000000001976a914e221989cfd4b54c17999b9cc1de35904aeb2bbcf88ac5f490f00000000001976a9148584f2972d7d4fb42cbb978e35f4ada50e9e369a88ac00000000010000000416acccf6c13002c544c5d315f7a2af99ff4409c4be0a1c6b42de665b435b970b540000008b483045022100c34e3e676277cd728d4a1ca4cf86f764cb372a92f11fef56f64912de1b350460022050dbe5beb5b2e5b307e23030d1a198bfebea968c5a950efea57b2157c650ad6e014104475a197830331fe7fd1a89d49d119d1743074ca8ab85f5c6cf8127e834f4a0204a6a4a4a941d87f2017c18a0db424c36b0981bb1d974205d5f84afe9ea10d712ffffffff212751f66e30fe4342619c70a803a1e30f3a90ea0783b8ccfeb739294cecde5c0d0000008b483045022100a0b5e2456232c617806eb0f74f3509a7595dca7f281a40073dca1ef870ed782a022003f285302ab824e652d30124207db2bb14778a0ee69c0f6dd457c4c25a08517b014104475a197830331fe7fd1a89d49d119d1743074ca8ab85f5c6cf8127e834f4a0204a6a4a4a941d87f2017c18a0db424c36b0981bb1d974205d5f84afe9ea10d712ffffffff15968d47dbc33da80a24ca16201045c79992e41f36ee787b2b5608f8bd3023efb60000008a4730440220062e634821d2a7612a74b8652e36bc05aa5a9849e4b7a338b0de4d99e85c7fb602200a239bef9fbebbfc0793d5b34cefbf1627ab691ac230adf6c3170fe6224f4e8d014104475a197830331fe7fd1a89d49d119d1743074ca8ab85f5c6cf8127e834f4a0204a6a4a4a941d87f2017c18a0db424c36b0981bb1d974205d5f84afe9ea10d712ffffffffe3bae31e9608ab0b50f3b79db06877add30cd23f6b7c9c1854b7a1a4f54fda52b60000008a473044022054d643139f7d22c29d2e532f10c134ae6ab5380af6490e94ffa93ee70b35ad67022074a78160bd73de58d08721ca8849d943d987c2f683545c35ec905e1408bae7ae014104475a197830331fe7fd1a89d49d119d1743074ca8ab85f5c6cf8127e834f4a0204a6a4a4a941d87f2017c18a0db424c36b0981bb1d974205d5f84afe9ea10d712ffffffff01db8f0200000000001976a914f867fe60e2548a7143c254190a6d254c6dad7c3788ac0000000001000000fda5012a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d8070000006b483045022100c95e641e2007df0eab2ac26a805be3d72808cf84aad375706cab0f93e464b471022078a0db3467bb370304d97fea2a30d23876cfbf365dab4afaa0b12c9b9006c0250121027e52e8b25aa97fed2d2db4616604d7e3f400fbac239eb079790bf6a6b34b2610ffffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d8210000006a47304402200652f84ebb685da926ca8ff3ff87e2188e8c231d3e98a55d68cc1368c9b7617c02204871ee9906f44e8d91d644c73639acd5dfddcb66400fd77f313d3ca1000ad2ac012102ff192b32ceb6ca7c147da931b3886549e18ec1d47a482ce5375235458d479a5effffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d8270000006a473044022015108d406303a4e342f712d5548b6644e8d60ef67fc010934c8f254d239a0c4502207f2b24205d52f17d9a05e37ad58e24c494774469c31c8552ac35c7ce503d6621012102a5c4276fb5e2b3218fc67f5c3fd87bfc9fc75f12bc0e8fb6ad1c50a6df0009eaffffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d8420000006a473044022016d794d41b6dad8b62a6a51ed29153c69a4b97a1d686a804d4953984535af2f10220770f6483e72f3442c309f912fb6df3fae88ffa2679f90c839bccd39989bb32e401210221c7ab81dbf119a938f75adab81d255c60bde3836b7c7707ee9a7bdd301e80b5ffffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d8430000006a473044022045cbdc549be2e27a5ec8058b57f6dc10df757a16661eae6ce4a934e2facecad502207cd0662a5844a38a614ab8b2d171f80bb403f7ace9f3ee31978847b95b0dfc4601210360e66e446a61398bc9232016e6a2f34e5c26f362479398702acd988ce66807f1ffffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d85d0000006a47304402200755b40438bd36aad288bb02270dcac3c9ff1a66af1ceaace41f18d53482992b02203e622ba7dd901918b7b60e012c17160b8818769cbea764785e207e07d7fdd5eb0121026c9c8daf61faedc31b1adc045f6db1d90d8a46c7f457017d8f5ea01873d57789ffffffff2a0476d36095a99756f5ebaa9cd184f9ba4d4b52a515aef452cc90b61972d8d85e0000006b483045022100afd20a33bda3e233b956a0487c68dc8b63a8cea6560349527ddcc23628b5c51c0220713c89412c92651b35d50135bab2e5bb36060838105df48fcc9b121ed832cd83012103c798853d7f5fcc815ad4fde1183d3d80a40003b818fa86a21403aabfbd0d9959ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d000000006b483045022100893c5648ab3c75fbbb5d68d439407b7fc4803f1f1415c744f66af0ce8670885c0220735a7ea1f2967fd7aeab6ff2615d25eb3cf16c3dad0ccf5454aa6bb666e5622b01210252e8d828e4939310e60577062aa5414d03bda9248b3b1b284ac0ec0d77dc39ffffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d0d0000006a4730440220025185c440839506e1e56f75c0af7ad44deaa2867204d123c49a93d5a2df286202200dbaea862c2aa32c703fb724b4240b7450dc32c1c2ddd91fa0afd14ad4e18787012102f2b84f3bf02c118d60b1cd602d6126594993c70af1b6895127f3a7333d397011ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d190000006a4730440220229e610175b723981e63727a1140298737e63d79bed5dd1c27e46e40ce86893402200e38354cee3317a502bc7973242e87ff2fd2f5eaab9e331c22091c44544a1426012103d23bc2304b5382f53bc573bb7d3d32ce2fdd81eb1cd1910611c8f54dbb794771ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1b0000006a473044022066b171da2d12b9ec89351042cad56f0cbae009407d41ab80749eb4df35c7d8c1022070b874f9f4536c085c1b0924ffce4a6fc29d51060ecac9ccf88bbada2e6f81db0121022bccd2c3fe9a40ab0c9e6ae7cd4555920281bce457120b58a62f237a770f35a0ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1c0000006b48304502210082a58252112cd43f1d497df929795d5563754c6bca3b16ea4a47df84f927885802207e78f65a172111e10cf2daeb75136eb7c54a45abd55163dee42eba0c44285d47012103cec48e102fe0a049ebc494ddd3d14d3792b6735516ad9b50297c4733a17b90d5ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1f0000006a473044022010a136afcaa7177272947872dc34100aa39377d2e89e5bd9b2339062255a80e2022010a047d4e8921ea6045f14e83c905e2ebb99dd28df7c3c2f230e6cb980db377f0121021461bf989e3d749eef8073ecb337427f17042db80720c0e362f01793d6e42610ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d230000006a4730440220785f635d4fb6faffad8d4afd8a362c1cc1e2309814d20df0bdd30c90a1a3bae502203b0223b27fb4190eae8cf7b08796c4e8d6c66ba07fb97084475e5e89d41621f9012103cc1cb2bfb5a8610d0b253b93f9bd07c2bde18e387b149f2947b753b36566c511ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d460000006b483045022100bbf58acc4085bab384da8fbeef8d4fcc3eb6b4012708cf80e7a8c490ed866f4902203c125c27b5570a281e899029da2d44a4b23d8c6fd2758afe1f174a7a02ea0e210121025ea8074d10f85c04eef3b63930923fcbb122a5c9dfdbf41a56b47e91b3473c62ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d480000006a4730440220486cc50c3a9e70d5e6ac3447c0ad95a7614d14d524315bf21244476d41295a6f0220160a55e0608eea70362729a3b02affe32ce7616f3fa0640d9fd54222901659c3012102e4562907fccfcf4b9a743e4715d5a9cc1ba203054c63a5f4d0ac660870d35ebfffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d4c0000006b483045022100c4f759b47f2ec1d3c71f47d699be64fef5d91a85d2354fe902bba96e88f19e9b02202dc2f1fe29df71904873e3903d55b43f317b734a9d2bbff1f424c502f5d59ce901210201a71c6842cbee9ff2e7c0aecf1042ce5d30103f4f73d8ef35447ba56fa78430ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d530000006b483045022100e03965fd123dd8dd86ff71f4065e4140250bb15024287cf5a3360a5adcb49a1702205f491a0ab1c61ee5ea2081998bbf04cd15b16b6a0bb142f3e55af2b706be13c1012102ed801ac57a9715ea9d33bae10cf77e955e97d3eb8ec3e0610b2e1618aea49743ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d5a0000006a473044022064e7d380461dfd83426363c29426b53ccf537419b84dd67e9e8503e46c7cc32102201ddc0f4f953d82d63cbbf259487108a10100c04954879c502203f4d22b89ecd1012102b944e9570267305e26e166d0e782432bc5145c60d9b399eacff1b1b05497ace5ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d5c0000006a47304402207473f92e3e6a4f10b5a3f4ff1e4840e83b15b8078b2af3c86d71cad85e38a98202207602514d7405e834653e88c1e0daf07fd3c70db66228292296c2359c5c8ac1e30121026c9c8daf61faedc31b1adc045f6db1d90d8a46c7f457017d8f5ea01873d57789ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d5f0000006a47304402202ffb79456780f95c5aca97fec0e5ad0f107241a5dc045aa3a486dfee8739eec5022079fcd30c14439d1dac99b1c9f95bedf7b233a0bb24aad295a9cb0a33343e9ae301210375d0cd09e670b856e4d4d78aecfeae7ab5a7512c545fbeeec5e886eba5058191ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d610000006a47304402201c9fac88dcc73ec3f87ec5b6f155e1e81ccd9cdd7067eff5569ef7a7e6fb7af202201bf4a539f6ba10e224b3e9c21568f251aab2d3ff2756bc0138e4f7b48dd37f08012102d091a45a2368c4fa118ad23fe1759efd5b69aac7748ebdc04a3c7956c772bd42ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d630000006a47304402206b093609e4d69e2b01affac61f690085d61c06491189fa3452aa26a36c517a610220662249f96f5ba0048cbf0efed79318759a8d5bf002b9ce479bed7866d8e4d5410121020476e85e348a8447b7c73a039a774715c51466d82c55a24935264f22de8e5a6cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d640000006b483045022100d2dd95ab01f5896bfc6cb54e7b0b1913df9213a875677e81d69be50b60d3d18402204e8e4fdf7e9c7444223a0d089b00e711a0456a74f18ee292b69c655cc22b9f04012103640004c90bbe3d4afc532736742932f32ac2e2742845ffe1f0e11fde8b0737e5ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d650000006b483045022100b19fcfef7d9cdddae7f99f9d2a11716dd78bd3701d993ff799cf68e157c02479022000f9ed5c27432a938257b8cb23240768f85f7afbba600b88f492d0b8c8ebf77401210287fc31cc44bb9a7bfd7f487f5042c5ef237fdf4586f38696f62f7332aa526872ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d670000006b483045022100f88a016e2968e7b70a0f01ff5a5b121bad8fa6d2da58d4a53626228e5f492c5702201523c08ac69bfbbbc44ae6f287abac7d107df595de5a89c0a5ef1f87a215dfa90121020537f5d907e4ff313a83e488234fbb52aff34028d8d04106861ff4ef71abdb5dffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d680000006b48304502210099577e9abd6e030ec1a30c5424d35a5487ef75aba44b74b176bfc70e02bca30d0220128f31ac116af9e0f58f26b7b2ea8b96ec5c0eb1d2a0108fc9ea8995f8652a42012102ef521a7a55cbf3fe9950765a737d88289aa2bfcc2aa3c9ec8772b1c8d43a3ba6ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d690000006b483045022100d367f14810a9a9ff272a8920126288d185e2eb6419c61a2e9daaed6c057882df02201537548794e192b0e0dc9e0348ee37a2b6f9e96d42cbaea6854ff2ea232f1ef0012102220cbeb0304f1fc487b145533d5a59d270235b550775adbbe064133789d5a374ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6c0000006b483045022100853a1f1bdde73e98671dded1446ca76ed4a3866603729e9b4f22aab56b85178c02203b7d4c7496f70e23a806a8aa6f149fc01d9d0f1ed92e83eb3989fb8d2f388cec012102b1530fe1f946149b84d63d2366668fa931ec5860b8f7f3b0ecad46e0bff32260ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6e0000006b483045022100ec303a6cb61e91dc97cb48105de39620a2e0add2db15020832b7479b134f6152022062c3f8d863db9ec05e8f7f46c8119b66d645df5327a5abe0641fef4ac0ce7b8b012102f51dba1a63b3fcc2d5d57598461b9d8c63a159b6509d3d0b269ddaf3c0ea255cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d810000006a473044022043a339ce4571e5592faf6d59713ed8ec1419f6189750d65662b1650151fe359d02204267412810803c7ed0eceaf83813210df62b708e432f8240680edd99bad18665012102bdca2c5703625f8a3a800d14cabb4b622dfe766e29cbc4e03f3e2faa227e4ceeffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d830000006b483045022100f975b9bc745fef2aa6f0dd7af5f0d9b17b803d9bdaf73422f797996fac3f0fbe0220072095d5085ba7df3fac613addea427f2ce2bb9d1d168a5e0439e4187b9fa9870121024f20cc2f4c33c2d1161a439be2a7695eb3703ef7a203966d3f32b201089af9b7ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d840000006a47304402205275b466e547db4b7780968623b4229feb946b480a8fef793b6983d45a07670202204a9316d7edde843648368aeb70e8c86f8f8539c165962b626fc165edb89eb27a0121033a84598a27229755e6c2ace0c5fa4fffc51fcc46a4357a904409879a1218397bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d890000006a47304402202c06c9bb2815d4a271f6addfe592dde181d22dc47b3f8c7c8f188d5043305118022070675d3d59076900a0bca00a86886e8d08dccd8641649b1fe0627e29c9ed67b1012102092c130bafd3f042a14faf0791e49dee1c4e4c45fa8151f8c29e28a1eb156065ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d8b0000006b48304502210096ba3427c920a108c973adca05ae1d5d30bb6f232e6493d36ab00ba0b0d7c77f0220164120670bfa1eef85ce6b538afe7b9baa7179f00d03052bf97268c2f34f56c3012102e28092d1ada820e1aca104ffb1c7c48f3a2a5e8c5f90838939235dbf01a144c4ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d920000006a473044022039c06148010d4f7852bf61dbb5838ecc0aa1e2a26cb2b84b9bb9f6cbfc0e39e4022018985f0505f88b5a27ea1ff3a817706e50183dc46c21fe76fc64e71c9d2fd982012102e79e860ef42ad0f30a2f347b4c06dbe0d82a36ce559fa65044a7fc033372105dffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d930000006b48304502210096479f7298a3ecb791a14f2d919aaebc65c84ccb91535ea69272e1e8db30820a02207a99010921e49c95adae92c2f3274a9bce475fa95fc9db839abd352f0c2db82e012103daafedba4fd924b5c08c6c19f407d9a8dd8796c6db74f9a3473827dcb48f40c1ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d980000006b483045022100f716c60b8a68c37d9134092a89da0f534a3949c528e8356f35346cc6d0c3245d022071d89d381f0cfb13a3e6d759380166e6b87035e0613e34ebbed758ac6d057e4901210381f6523b99eda5a898dfb4f47e14d15bb956ed10e759b81f3e102747d2197dcaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d9c0000006b483045022100a817618f0995dbcb6a3dd14f28f8539c9e8bc0fd34ffdae1aca4ad7601f117ec02202b704b4ac8d9d509442f87c31c2f7f878a3129235f3dc036b68a4bc27ec383340121021813cdd05350838ff535db25d1605c183c7b4141d0ee2ef2bad24671945f35ceffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dab0000006a47304402207c68f2e388bd29780acef2a0d16352609edf43af8b358274d8ebf7fcdc663b98022034b180c7a304fb6433a8aa70816d7f846c41cb35cbe17ddf566b68b3bacf742e012102ab574812cea5df5f4ccb2bc7cb6a2ee3ff9188213cb664db475b749cb0991283ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8db70000006a473044022074e687a2c3b2f62436088a709ab64dcd91b55fb228580ae564d54645ffa82b6602207e1aa74c7c87f7c8bf8e8feff0d9aa6709533697db1a220c701b4bf1a6ab8e47012103d5ef5cb73c67cde8a2ceccf5d41dcb665955ba4d7ae511e049295ac0c796a4aaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dbb0000006b483045022100cf1b92ed2a335f4146964606de11dc787047444a52030825ec3a6496c37df65502203b72f38996a8cb7d4f40733a66ea0cf3e326b38b555dd47e565eb40f536df14e0121031f6390da5e2c34d9747e450778e62217b57d4bb4dd7b4093a6720675bbfab1aaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dc90000006b483045022100d7d20e06bb88f79785db6720af4e0dcae92976dabf6dbe407d885df621ba2eb502200c014a36b6ca2916f28ca41bdeb0750bf3b70e73fd364ea4d4a281919b19a6fc012103c0eb8b1c197366c5aca991758cb9ece316d77cbdabc880279b28ef0417fa96d8ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dd00000006a47304402206a52107134e27f4a2b5b50af9ebc41259b7de083e5fbb274074dd444f29ddca402206380a2a499c8d4db5eb956c57dc66a4a55c9075403dce289a199a2f99e476c97012103c017e13a66a2fbb5773eb8c158fd91d87d51398ee06058d52874555e24d90439ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dd10000006b483045022100a0249312c747a7c42fc5dede0624c940e4764256084fa5f4fc29a5bc29654973022068a2c9b827abcb7c9686ccc83231b9b7082449c8bddb0a3c01b7e6e6d28279bf012102c6bac6f6a26107f1b6ac7731d0eb1f68be1a960fcb936138d5ec1003e3009b9fffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dde0000006b483045022100c258e3c1990bdbba3f7d6db50f314ca6f78eb85c95cf99cc102b88b6baa7b3db022008c2f2c2ede6697abc4b42b268c228be25e8937ff904075709a335fb4276eb6f0121030504f2b3f5ef6f01d3300ebfc4d477b76aad88f96b8e17015c032f17ab4b7941ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8de90000006a473044022024787ddca037f88f5b1e264d57c904114bddf0deb99b9530f8f61cf48f21f9d6022030b3773a96d75274ceb3cef1696f92816f32f004b0e7d310c6dfb19a510bf5e7012102085bb3c49dcc6335149e8e7bb4bbe22f815814183ed53b7ee65de391462235dcffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dec0000006b483045022100cd48773c658caa98ab6a0b984b9112eed0f452783de35de5a37a7231b6c8c0d702200e5d8c4a6e625256895cd1bd296f35b50d176f184d4869d76e3626dff7e6bd9501210215fa4ab10ea2dc19364ca008396577725ebca25bdc5108617cc2915c344c575affffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dee0000006b483045022100b06b7a904c7df67eab6a9435bf0a6de07a20d5817fb0a50eb4abdb871765de4e022059ccd1fa0e0c12e37c243189ec2f8c5781a55ba6f0d276f255e91b1e8d7a0cad01210224d78b34605ccebe94d1ccf7428094f852dd5da910125aeba8b87cf1c12d9be7ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8df10000006a47304402207b033df5dce1e78551a20a3fe083096a2eb79f50843e706a80083c09d41ea2c8022075dd7b28eab6cd0434e201922fb634765142e07440a0bb5c6c71b8697d2e5945012103fdd7c5ed26ba61578966971b16eba7a3864044610a345b54bde3987184fb2ca8ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8df90000006b483045022100bfd439a666cb7c28d16b0529150f2f2596d633e80c2fed9638ea0efbdf8ca5000220242a25953596d500eaa364aa5c476b603736b59db0ff4d268dd99d4bf276af2401210253d4804dd1539f083fe2fff11ce66fba62baff916bf0c0272bf22c45a09772ceffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dfb0000006b48304502210088c9e18476c6a5826a80eec2f9b391ddcc5e9d280eb67225c26922b91da6b4040220755b38be69cc7aca30668127eadc1f51fca3b6e61d7dbde34cfc59c5b4ef34ca01210289e2a3024ce7a0451144fbf6017e31fd10998413361057f43e85b6a5d82f19f2ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dfc0000006a47304402200748712d5844e76a3f63870458dfa5eef7f3b04b821ca32d7db98954b6b5a688022039816fcbdca22667ddd285a0f89bd0d7649ed52e24d956fab67566412eec3cac012102838ffc97652219dcb7e571b0a88639c2a6bbc111e0b0c287aed28e49badebbf7ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dfe0000006b4830450221008b66cf0126f57bcabb0868476d8e27bd33bcb54ab0207a5c0e55ba6dde4f0ee902200ba2dde14385b206106744e55452b8451bc5a25feba480aad6c65646b0a07c48012102c47390ada367119450bf53473cb9a1bfcecc563d51ace4d258482fcc86e341dfffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dff0000006a473044022067b1df43975f5848b11db8f4ea0c79338fac49711fd89b3bf9da5005ee6bd88802205adb39dc244fd3442271b155ec8f56a7412889a051e51d62e3e16e11c3a3bab50121037171c297ba15cc70dd4d9c040944b085d555c97798758591eb95b42263f23b5cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d020100006a47304402204625d6b400ba3990c5ad379b90e970fe6d64307cc5bdbe71f9006c4ad8d0595a0220164c8deba9762dfb909a9bcb1626c943333f06461e2c58b51b41ad6340005afa0121021849eb6126a81231d59d590e73325f2eae6f8dd6758cedf5ce7cb04da2053956ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d040100006b4830450221008fbbe55a9d67fef6a04fc975f851ac54967fa0800270c04010341ce4228271840220549b04c3c7a8d5520b6c9f05f3f1cdc54ec209efcb28aad110b53b470a06b42e012102659d3c8aa3b8ed1f7ccaf816e04d6753fc0511959fc4092bf3402efdfd1ddaf5ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d050100006a47304402206f653ee2be1e3226eb4a725db388030f0fdc46b5ec6820f84fd34236bf2820cf022005a212288b956c70aacfdd4a4ea2b8a6d50b573cd7ffdc0f5769eb15bf31e611012103ad75d6dc4bb9b4b1ccf7c6859244167b3b46b218d5d7c10001d3096ffd0aac01ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d080100006a47304402204e1723e2d61967726cf3a2b0a162d7a4371d4d4b3f0fb207809f5ce1c55f547c0220018e66868f2d47e89738d4161682512248d58f3ed1e1a94afd6b173ab7911e1e01210275d67da7cbc7c0bc0e30740d659c8465c2e2af74fd0e2d29abdeddb82963c59bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d0b0100006a4730440220036f42f9ec22b5b7273358397b51b8fa134080a900ccdfc49db8f62aa5df8343022019000511752b4d1e9f9f7c452f098d65c116b25e12c10568e940f7254c4f6f1f012103628f06885c53e23474d28cd2610288270d191923617b0856e9e0bff0a807aeb8ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d0d0100006a473044022039b64c02fd04e0cab94a175c55ba7326cb051d43507500c57119beb86ca3b204022061aff32ba90e68522831abad438e34070f37b41e26f23cb7921f03f851357a2c0121020878a547339dbc2a9375ea4b3197d792daffa18461b2e33bac0edb76fac50f63ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d130100006a47304402203a72392081261036c93eabd9c6cdcddf15bfcae6de19785b939711dd093820a702207693129a5a6c141eb57366585e553b875b0a6480e77b9b6ec2de822b13a80ca70121038861dc0fdd8bdefa9747c60b91be7f88648e1c0db70341c7ca393cd1d9145a53ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1b0100006b483045022100a46259b42b8c8caef414dad6b9c1c39338848cc204df8e9e0467213037f563e40220676ce2f9215bf1ec1558bec6bcd259f245fb4b8b3e283cb523812a2262f92e120121030df38f26078d2072ae8c53866fcfce2398fbb3d1b39ae3ad0f79eb77de9facadffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d2e0100006a473044022000954c6bf95490186b020b7d456657cb19c71a851996448b0dbb7a69fbce5ed8022069de6c4eb1d106eaf56f728dc41adf33238b435c7c1caeb29ed9bcdcdaa82b920121026596df661f5d6ce02be34806c12efbd77636e7c0e9e8685eec7e9162adf6ce7effffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d310100006b483045022100a9f01e13961c4d024c59a169e4ff959735b29bcaa109c865dec40e54ecdbf925022042494176bffb8a64cdd934e62c1314ac32a0da057bd5c5494bbf64ab52226582012103483a33dfb5497521fe2133beaae584e2672327663d930cd866f24886ea51002affffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d3e0100006b483045022100834f8522b6e99a850694255e864c56efd473f5ba7f0bbbcdb5697872ea95823f022035ab23ba7be772044cbb77cc8eed0fcc22d10c67d444b6a57559d2b93293cb7b012103c357a607dfbed1b44707ac9abbc0b67b515a3369a10748dc3c5164336a4072ceffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d430100006b483045022100ef7c3b7682046528f18972baeb85a84b83bffc165dc26aa4fe2e188d350ab2860220068be06ddb4c5706c570921f960bdfcb4142a5c38e543669cf25adf1616b2ac8012103cc7aa2a2c6d662f66dd8e880611b4d9df0019f0d436cbae665a2e3994f3661f8ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d4b0100006a473044022034849a5b0860f2f6dae657f02aff9e558543ef689c052b4066931619a1d1fd5e02205d843fb322134487f975c718a9aac313517f9a58a91e5ccb42ac5903acad60bf012103435b160c6b7532d7a6df4b1b32a67f02a42451fc8f2c2535a3350dbe0c889e5cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d4c0100006a4730440220653b76c650c8ccb86f8880761ace38192a55848f4ee992b13d845b61edd227ef022031ace2a0fb499bc3e66300820f8fa277f2b45df3488f66c8a9b92a5120b03fb00121027965cba44c23b05468d010b09a66c88f11f837fc82d93e65735270d1c0e2af77ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d4f0100006b483045022100d6dc421210cb807fbd8237ce505035c3434b8607c6d8eded004fadb0d1d5bb720220681a22e1903957027f574b16f3eac1b51285365f216ca55f2916233844efe36e012102eb8582dc08ea8270bd164d684176a105fd70dd5165766194f1613ea501b7385bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d520100006a473044022054acdc886ef6db020e1a2bbfb7416608133796ea0f97734f60a53d38cad59bbf02204364f26aa2555905ffd368546b136cb1e44b83ef3ee3f8d20c6b252585e6a289012103feee761b7175fcd481dde6568aecc1dd9cf04df3d65b70f005541dfa9403763dffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d570100006b4830450221008118b31c53fbf7840f17729835a3ad7ff09d2b8ce8b2f4a1ef861759194da10502203b63de6d057dc7793a41e0e7c397e5993580863777c17f00456c976d104d395701210239e8726d971e4500e1988e528f061ab92d730e4b9a93155ffb540d41c05b11feffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d580100006a47304402206b8b0c86e8bf85d2d4ba4c3348a26dc4601ffa6c21258314cf76efdd2dda725402206a26aed98b41635581f887299376e70ffc9c17080e34783290969adb457e4fe701210261191a870744f836b3571a815a1b1ea13a7aa0ffacbf3d45943986ebe3768b8dffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d5f0100006a473044022068e6fe616d8d273bcb1e1f07746145ea7441a3b3fe73b0579f48a28abc22f43b022072097a0511e2af032bf7ef0cb89b08a5c636745489bc5faf6dac703eda0ca06b01210200385356b4ddde07e2d9bdd89f457ba05c5e9da33ad7b50a92051bd2a91a90a6ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6a0100006a47304402200c241b59ae006b8105e3b334020ac5f13381fad06dadf25b0698e60b2233e3e90220478a91dbdc52c1ec8f1af7e400d8d1332c4aeb38dcd9944b551d99a3e0586488012102a48b5b01a33b59a2a3eadf23d108ce1ca951ab4d5bc81c4e87c7284f70e28e48ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6b0100006a473044022054190595b148c32d55eab3bc9a38ee35d3aa6cd6814b64bdaa2403bfef15ec4902202563745d7d4815ec9d232cd8b38a4bdb463dde55d51203498e381fc1b60e6ad0012102d36d24cb8d752b99f3c771d502b762ace0991b697c4e4a23bfbb9740a9f48a99ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6c0100006b483045022100eef3daa0a589d1baeb18a95e511624676e3e2320030d00e4b0a160560b4a296a02203d02195e9883de19490407fa99d972a858a8a94264bd28e909d908d7172ffc33012102b99681d93faf7d71411527c099d59def01beb5aca0bbb37f48df055a24627828ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6d0100006b483045022100e8ef1e3d015f8b83d4950cd754fd5fb9ffaa2afbbcb7ab38e457242388c0736d0220760d4f9b3bf5e7498c8a15ab486b4bf174bec6a18385c37382e5dbf45ee0a70c01210281b87d0e4b299a674d62ec6d25454bfe20337f8d7ea3e3b1e689615cb5526cbaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d6e0100006b483045022100b8daa336abf403bcd90bc233616adcaa17c2e055725dbae1fbaefb95e8151da30220193f9022846b60b2cc43a633266413ca0b04f83be5f329bb006bced45d10fd7c012103048a2bcd8bf1d2964705c847c4d767a531342071436cc1703562fd5ca7937f3bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d820100006a4730440220386741223d2f6aab0307d1374bbf4840363a89344daec60ef1e05d253028b14b02204c33aaf3bf08d89ca6921ff2334f77f6939ed26fc4aef08a3a587c4d719a26fa0121033c07e5f15c4d4e4fa886adabdcff18f5160a0229be7f97ea925b10096c867f5cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d850100006b483045022100d6fc51f59b76711a70e77cd2b0a07cbe9f318a8b3eae0f593b9b1c23cef315dc02200e3d77a869930b29c12e7e487ef4b39fcb087de0f56e99d479b741adc85b0ca20121036fdcf58eb2d612438d6117303f666df1bf0f29d09b3fa886b351b80c81480acaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d890100006b483045022100a1d17f403f7e3bcca15116e50daa4d1aa96b6f7b53fcd6b6c180541e53e9aaa5022073f4c37082067d60b1fc6d78d432928f8d950ce558b20de68def7aa2c139695b012103bba57eaa6d0f43f79a382db7fa868b7917293e2a663512ee0b546117164bb91cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d900100006a47304402206b3f60e339b0754eb37c1abf84d52c3678acb419a27ebe69d8640a7916a0605a022062840aef8c126e2fef8c9f26c574399f9ff42bb0c7e43ccd2989bc0c5c58558a012103b922bff588b20500c8565f39e16fa7389954d354e813e9d044b7cae10f7e5eeeffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d940100006a473044022011cb2c0fd65e4f040a4af0e800a9d0da4d87c67aadfcbe8f943d6e5fe82a7c9f022055e92b0c643b6343da526f628b7e0decfd39064de9ed7a4680ecf4425fa1707a01210364f61b677581f5c898e5360e126cacf49c54422502b47ae3bc28f2df238af0daffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d9b0100006a473044022005836c5a53db3cf1383b361003663d5c91b43227ae0ef4e77aa9301a4be2a7a602205a298ea75a3463064108d5ff5ddd7f5d948e1e7587ab74f451cf367aedec3cd0012103045fc5c01ebea94b876878e8cb1f81644720b16ae3b43875921c5feabef1cbeeffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d9c0100006a473044022059c867737de096574360feb30b967cae2d1c7b40071babaae5407212202e74db0220295fa86daf9570e5b0206c42b45c91377d50d56fcd38bf3d6e0f62c0e2b3b6ee0121028955e012d5ffff6d63758ed9793352cae5ef426481be6c3e5fc71171d1b40a40ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d9d0100006b4830450221008203c9ad7210a05efd7c149e3248214b6a10ef2d54dd83e3f4c3d7ac94a482e702204fab424b741654ff5f409197485a507a2e900a5b4c097d315bf9cb4b276165530121030673a0b89d175ff09c2edd0b310b9582c2eec64036a02d536882189a8a6801dfffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8da10100006a47304402205fb0f84e129e1c53ad675452226509329f40c378f1e13e9c1ea3ed25c084a11702201625ee2a6b758153600dc122c127bfad5f30000df090a2b8b3bdeb61580c152b012102db821d5fec8b536e019e96f82161686fbbb0b3b15246db02173c6e93f02d0a81ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8da30100006b483045022100e88d325a434642d4c60c892d4c7c926b4df87dddf25155b289bcc161571f0fc802204dc4a084205abe098a957c0a970d8438e5330aa59edea71e222b8d44f60806b40121029a75eed8d11d13c7b36d336dec0c37a9ac360d0f7c43355a1cb8763dc4845e98ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8da70100006b483045022100c838056c473164edb49850a3165a1410d47758d7b1b82e53eb2288714e5f844002206e8fdc6b5a9b0f74082ed640ea7bf0df85ec48f60ce9e0f94caf849e8793974f0121039b4dd60a8065305889b5f07fe5f4de59c8ab144dc851ba405b5cf9282cbf8637ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8da80100006a473044022054bd2e818703bd381152b2a9837295a22a7e5364a3715196bc0026c26284ed9f02207b6549d92c8cee6981bb84b85b566e3daa40c0bb5514574e1df8f58c1d8764b90121027d510e7ef2d251d74ab897b4bfae915cfb3979a043552c0d8ede26a95ad91fb5ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dac0100006a47304402203f421411be23aaa66d1db5ac9228060f97acdd62f5966ee7a497187b0794d6cd022069fd055bcc7b9f25f4135ae382a3fcdeedd6e57716325c5cc23e6d1f94f38172012103b1d2977a5cef19d66d6d12e74e069993023e4cd6cd3373e845be0e4c79290ee1ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dae0100006a4730440220027ff809af616652e7c323497c7b21547e900f000fd0a83e11b87acbaa64f87e022014cd4203e604e9c99a4674bb54d3670dbba24402d49798500dab0d1dfe6554f601210330f147db0faee2e800e1bf2eed4841793d0bd0d5fe692847fd7065af8b0e01fbffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8daf0100006b483045022100b665474cf5b8553756bc64d8414b3f6cd25fa2580a143362a28293bd96f684af02206e3814dd31c78adb0fe855137f92f5f7eb2215ca68f88959d113ca61f66cf7c601210271eed898412d9d8d04b21b2484ec39d9308edd10651373b44e2c6972e486f302ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8db00100006a47304402205cea8138fb7e544c8f54d2afd9b4528c1ea43f09f6f51123edf629718440bf2502202abca4f1bd41da14d6da97831db5327126cebcea7425d0917a05aebcc0b4bc80012102399b853c2fdbf93a7e0d320bfe8a64c4125f58d485aba150baabeeff5bb8b646ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8db10100006a47304402200b81ad3776e89920bfa72699531edde8e3e836ec54b49c7922b4a66fc7bd1cc202201b41cd2817a419eaf667a071478ad1a424081437db7b7db0951ea30040fbcbdc0121034d3e3498a4f125bfc0cf3eeabe8ae604910a22c27a825c5f345ae7186023ae82ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8db60100006b483045022100d029c7090bb9b64d96920515b158a9c79bf6666be7c755e00fd85c48c8fb03de022037881d78f67dca093cddf2cba9d6f93e108afff9d8db2f5b46507bc3b2e92a84012102c3d8316da0c1250d9d9f22f225d72021344ba9ea3aef22dc9cb89d8d326baab4ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dba0100006946304302201f7935ab4459cd8b8ad9b3afee270c213218bdbc2f1afdd1c05517225901ea54021f3e95f71becd2a8ce281427810ab6494a2e213fad920dba6f960767282bacf3012102dd11e61aed947dfeb87f4898e5383715d9c4064a18f92dec576f484eacb2770dffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dbb0100006a47304402201a05238c25ee15f4d19e763e99463dc4d8514ddcedd5fbf52a7a60dda56df3d4022015ea1ddfafa6d335347b0797877718ae31b35d1470593db2d3315eaab301a0c2012102383c6cf9f6f16dcb47445d984395f04b1a41ddd42cc66d0aa1b40b2a685d43b2ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dc00100006a4730440220743442be0b13d5022b8cf31206d25592e6efc1ebf11c22e06e73ae664fc50456022014882eeb158f755f2d7443983729c5b81cfbd30965d948606fc475eee1ccd3ef01210280010e2da50bf224d2ad15cd764acf0aaae9bfc9efc45a8d88258cdcb673e95fffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dc80100006b48304502210094b490aac0d953e517725d7b8244c6f2f059b960405ddce907dc005e100a9fe6022022a5740dd9a927fc26146f25288bb9a387e9ad099568412fbe76d5e11e4768af012102b8e37b15ed2962547879341e41c3b55659929ee5c259df0b740320d0d627968bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dcb0100006a473044022004f18fe83b4490b4eca0383d3b56c9055b29efe6ca94c3acda476a428becd04f022021035ed356c63e0647e4cc8cbeaa083ddb6702728da9202058a4612a16f69b9a012103661abe9ca452dd39e739dcffe5a57fa01b09cbb16f0c77efb7e83203c60b0357ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8de80100006b483045022100c60c5ff1453a041d06b26b81759f846cf69fd75fa9360fa1c15e679bff52cd650220325d1dd7ec3d6a2300ce070fb7e72d76dcbf822eef29b766a897e09efea4a0a3012102a86b88cd9ba8ae114080ac297beb46a1e9d94175018f0593fecf69fbdf0de37cffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8def0100006a47304402202e4a26ec62104dd8984c9a870f84a9a499b5ebee1f300b3f18065101e7f5b096022012f1ff7449c51fd7ff622c285b39b720cee505c78d4eb64569340b6dc6977538012102727f658519de2b214fc282a4ce9f6deaf09ff34d20b95f45f97199916cae95aeffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8dfb0100006a47304402202748342a9a3e51f4bd4169d0f4839d147aea77db107c90eb2b664f665a1f730902201577f054d76941945c3dc672ce30d0775fff5251375c63370e8e05069c5bfc230121039a467d42aa858bb84b7115483e4aaa32a033b7bbc04969b1b283fe1eeda525afffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d030200006b4830450221009b58e8bb89bd25151988bdec1619da76f99cea0d5f1b1e36535b53fbe69630bc02204457ffa90d82212f9a3d3065adfdaddde9cd6940cdfa9b56a2410ddf31cca1090121035a3e4b6d57a68da2264a66e8dd4f95f08773b6bb45dcb13c0c4c0c02a1370bfbffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d050200006a47304402206e0afcd5808327fe657e0e5d9ad420d145a186e2dc7c2cce3b2ca8934e037b800220398f2ee374791529915a7311a11d0eab48e246bba355d73c6c0f7dcdcc9c575d01210398b42c0bdb3ee0a36db5bfaa54df1af62c8e618c45d2f607d50b41981021f5e1ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d090200006a47304402201a7b5700f0231c8b1b1b985cca610e1ba8398dd5e2ccb00afaaa021685c760d302200c1d98f9cd633fbc53576f4f35c47fe5f92bba44da9d63462045d061bef85142012102365bb4d19f31fb2ebb9e0dc2a3de342ca54c9851e11e395cb90fc00372ff0032ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d0a0200006a4730440220570faa67153cdb600537c95cabcc27a6f3be50adb1cb34415ddf28716e28fd30022033024b95a07e46808d4448c7672cf7e55b62c4996dcc49d9728db8d8b2171ea5012102869610d6807e1b8fa4ee9fc9ec77a5c65c815c459ff6c0c43ca58a385fb21ff9ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d120200006a47304402200691a6bd9a218b55b22d7c8fe7e30cb4b5fc8d9f0f467105a12840c4242e774902202ec960bb27f11ea233edd7e8846061744ff4ef43d190a1410e3f5b77960b754f01210310d3e7e2dd65d14ea328df383f942ce917d764a74b4211f1cd885c3a15f07072ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d150200006a47304402204d5eb7479a87d8f7c5e4b10fa730c2c8f7f249bb98f33ac3f33b653c83fe6d5a022052ff9a19d2cc5d405efe6c487414d62b5c7d37d63b7e7ecccbf247abb1303fa101210395fda29e25b649eb29f8ff2c5553a494ef95093cf746a8b229826a1de3361daaffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d180200006b483045022100aaf10af8a32cdfbae477c509516dbc21d22e9d849a2dc98f8385a7e52170eb6002203b774d805c6c76e876c98cc2809f50aad53a18e677991b3fcb05d672a3b751230121031afc3db826d4afc2b8ce67eb4cc00f1ee10f42618dfff7147d9a9cc70e09c3a8ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d190200006b483045022100d060760d508f9938cb5da7164203a7ccdf7c953c637e2b1e8fd6491e28c3232202205ae876673c4ca0350446b86e8bc4e1b06aec36ab7d1aaa8e426f4101758c04240121022abaf62caece617e1e21f254ea8f039d15b3e1d3114c873bc2b13a74b3284a85ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1a0200006b483045022100ca3e9d9e40d47a35652e0d2cf1492b6d6f99ec73e52c4326c2e217849822521002203cf8780eac3153cf7e6c278edaf55f7b23c124e7258f25a0948dc9e77eb008d1012103c974162d97e336a85a0ab0524dff7642361aa223e828b28043cbe72914b70b62ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1b0200006b483045022100fd1061fd38f51e8404eee8de6bd32532b963c85b0c60b6b12b2762b58d2645b702205d16be604e7503a4adb0b89ab83efe0a71f0a3805788ab21cd2191f2030b0291012102ce403cb7fb712e1c9843fade390efed93527e69b909bc4080590108b0f62185bffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1e0200006a47304402201b2c7422c861f1afeb4a10537250a58674319b40eaed8ab917bf4c01a6e3ab98022018f5a40ab9c659ebb24e8366d997d401959e2b1c5db310ed3360ddfc3c0b55940121038787f749b550633c0ce68c87a5978c93724f21deaca1e27bb75f18b48cec83ccffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d1f0200006a473044022049cb99756a94f213c4a117667726ecd2c30b66cd3a73dea718378bee7aaf006302200d64a25a5489927ec6d64dbfb6ff1c4fcb2c02d9177b70586eb5dbb90b48ffb10121032c416ccb3b041baef859872db424aa5364116abae839402eb16d2e66d5aca646ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d200200006a4730440220730f2ba94915cf66bce625f231d4b0f9205334b53feb95426c6293519163eca00220707e1a06c4b574a91fbb9b0b882ceacee3838ac5910f39c4078b9bc2a5442cad0121026ce0c77f80afd4c0034136698a4a96cdcf0075258293d883bf9f4370a1d1d25effffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d220200006b4830450221008fe9b998a72c096aeb74b8ef285beaa82d9c22446fb19f5850defa23acff457d0220223cc831bcbad7ff1119059054d1c867fe98cd14f90f9f45e39a4ac8d695bf20012102a0074a676f3348c8ef8e8f9d06f8c619f92f21a816a9b5be96c01079133f9153ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d260200006a47304402202d08bd80d982ba29d7222e51326737fbff9ad94ede724c59243e650f49afcbe402202275771bc11143e9f336119144226f52ba7d57976447b7501878f4cee6639882012103dc6a39ca42438d74f372f2e6c39b78cae0a6a0497ba9b324b37323a429c25693ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d430200006a4730440220772a000a10c3f2087d88503030079805ab985b3d923fb89fb5716f11dac5afe60220555cef4e3c4dc02c5f8fe6698ae4e48410eef130b328eec11f7f42b66b638f1801210221806710404c53649237bef9592c17097c4d173029ac24cba99e2e2654da33ffffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d4c0200006b483045022100aef1b74b7a4dc7d34369a87b59de0649e67b1c6a2569870eceaaaa1bbe772209022031f6cb38abe93ae0beb2e70a72dd291d83137675c8a65af97c647bdaccdb3a43012102fef18983aeb87b4361a6d0df281dd301db5976bb29cdfa0f6eed403be5921941ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d500200006a47304402203ee99c495c372e89ab7a116a584c0233105543463aa9677c63b3c11f8e59de85022048b4be2b999e1c80870e2ca9829b6a13144c3d530a6cbf7353fbdd5472ce8a97012103912a48f56f2dcc6877cfa5a5b34d6d1fb545c2dafe35b3bb3224f7df2c744b62ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d520200006b48304502210093b6a50d5d21ba73d2f4eaa931dad23fb37d9e14092bf5e6a998ced21a5129d502205f678ffdce4feda9a0cb651c677700a08643eb2af259bf7f7e7e05075ea5c2c70121035f91879f6236f544660bc6ef4db7b54a75d81877188804b624b2451a22d9e603ffffffffcce475baddbbe9b5f28e614a5077882d98fb5636ac0a8ea882a8158750a5af8d560200006b4830450221008ef854b9f8cfff81ba5cf3840a7e30757e8a04607902585d2d28ceb29838d4e2022070f0a093cff8838bfe9a7183025068bcf14d5c3a034082ad778915612a775354012102fa32f17b49b73beecba0c2f8227b08683b56eb78c8a40edca596a9010c91c51affffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1030000006b483045022100a796aae8ee86bc1b60cff71107f85b32a564b2fdce68a3325bea0e803462da06022036ffa4e3cce3e6f61c961904589e0382da12e356c5118ae975da0f5cb4ddf06c01210265d1581eb36fb426a10567e42a77c021f054af9baca4bc20cca40c4d7e7a6b72ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1090000006b483045022100e112752ad37ffefe392a93492df41fd20b3cc00a3dcd8bc58d1fcca5438148bb02205edb6517da39e5142d3bc08125aa71d400417138caf22f402a57131ac73ae442012102d09c0636e4ef75d55f30e3ce8bfd0e15b8dad9f4125fc896269d8d94ccdcccbaffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce10c0000006b483045022100ee1558240424404caf77056eb5bfc77476744b556b9a9fb53fe46598de76cb2d02200539461619399d4c70fbe092fec1a79486089c253ebee07ce0dcdfd87131f90e01210398b42c0bdb3ee0a36db5bfaa54df1af62c8e618c45d2f607d50b41981021f5e1ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce10d0000006a473044022009da225ff9f6ec4917fa24a10f2a25e42cce512c4a7877da14cb289588bda61e0220315b19e7880821a941d11541baa233a2a43a2807c2cd0192def20a52ece188ad012102e177e59930592cf7f25ed9e65932249f4395e9088234a938aa9e8dd8fea737bbffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce10e0000006a473044022026a21b23f0c94b2e4fddfe0623e95ccf58733375ef3a9aa56c5ee85e2f2b02ee022068682ec97d429d5dac141e98d47ba6974428e3436280e3eec253da257d5bf5ee012103feee761b7175fcd481dde6568aecc1dd9cf04df3d65b70f005541dfa9403763dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1100000006b483045022100e7d9d061b253fff6fbc7f5b533661e2b08ce7d4496b80d988b69b389887b6a6b022036c72c7d0f1b1f349fc8307dfe71d30edd93a3dffd73b613fa834f3daca076fc012102bdca2c5703625f8a3a800d14cabb4b622dfe766e29cbc4e03f3e2faa227e4ceeffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1210000006a47304402201f94668fedf809b34c1950e29bf98e749077eebe7b555ac6f182d1cbe95a4cfa02205d051a3b51213779e0f550b584674d33cdeb43a169cd2ebb63021172f63022520121031afc3db826d4afc2b8ce67eb4cc00f1ee10f42618dfff7147d9a9cc70e09c3a8ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1240000006a47304402204111c3e5248ff15a7b212cf8bdbce95d4318a4267310a0b488fd8f3385d723c802207ce823aa9d90642244d48b22cd62de54c2eea000df629d062cd2444725b7b2d401210310d3e7e2dd65d14ea328df383f942ce917d764a74b4211f1cd885c3a15f07072ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce12b0000006a473044022018dc25150db8380232511b5cb9302ea3d903cc7d666906716b4e30f0a739ff0c02206d772aaadf196d0147c85ca297ee737d41291df5f4541ec54d36c9b755b9ac8701210200385356b4ddde07e2d9bdd89f457ba05c5e9da33ad7b50a92051bd2a91a90a6ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1320000006a473044022059f1028839ab4af6940f16a1e516283d8f0e5a82634c05677fbd3cc35f77e0c202206cda1e5ea5f7fbe92eaa3762848e504c0d7f40374fe3176d81ed366e07076582012103bda66744af00c2926e8a9fe7d4e4b10b44978e31b6c1c621a2dd2192ea1cdc89ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1360000006a4730440220019aa11c92b978eca86cd3cbb88ad40f9035174559bf802195dbb8ac2d7099cd02205196846deb50c0cb171f46f247de8f98b3eee3eeeca79dcc8db095fee0372ca4012103b85351a7b2041a50095248f463f53e82bf504063491099fdc3b0c9a83190bf8fffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1380000006a47304402206d2295d8bf8dfa5b596ea218b3badbb648371beac8550de84899dc33affbfd6202204c882dce7c35e7fd922c2e603fb3eea9a9b1f4a955bfd50ee2ca9946127c1cf6012103c974162d97e336a85a0ab0524dff7642361aa223e828b28043cbe72914b70b62ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1390000006a473044022020cf5cfb7369179e400e3025a2f78d5be4f975ac26287e634a159dfe1c857b9b022038736df5d7fb7db76ded1f590123f73858a358c85e4688de3b6f73000f2d7c13012102365bb4d19f31fb2ebb9e0dc2a3de342ca54c9851e11e395cb90fc00372ff0032ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce13c0000006b483045022100e7bca4ae4c32b339a2359f07b7ec2ec369a19e874f06fb4e7a7a45a6aa5a0d2d02204b2dec6c29ab65723761f9a1fa1fd71959714a956fe67792fa67cb2521a2517a012102869610d6807e1b8fa4ee9fc9ec77a5c65c815c459ff6c0c43ca58a385fb21ff9ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce13d0000006b4830450221008251823c9ca39a29ee0f4e2bec048584bb6ae7be78a758372111f0a38515bad802200ac17d99279c9725233d40ca3a76b0d4ea888e5d459b9f8953257303f7dfefec01210375d0cd09e670b856e4d4d78aecfeae7ab5a7512c545fbeeec5e886eba5058191ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1460000006a47304402206a45ed38986493559e31b146a54279f6d3db81b6d458a6b492bc5d6da1846e9602206d2361598a468eb52b6ebda3a79e0c592a803059f9108926e2960a0696f9430c0121021d6d6d74787f56298827ba2de6b362ed728437b43636605185bd2c7d38b7a2c6ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1480000006b483045022100a759eac0127618b9b67b3eafb4f542e5ba700edc002460a72448622f770bf5ac0220444cd313d27bb968e215fbdd5ef938d2bac2269f62b19f75831d2c8a6c1bf55e0121035a3e4b6d57a68da2264a66e8dd4f95f08773b6bb45dcb13c0c4c0c02a1370bfbffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce14b0000006b483045022100ac393f5efb0faff6e47e460d94705b5c28e0d4660954c86bcb8d2dfd2024bc2802200f9758bb634bdae1e15deaf25dd18a014d642e3b372383d569ef1a051cbdf006012103d44ec737656e1fd7b52f1dd5d6e223eacfac855527cc86e5c89ea8230222bb65ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce14c0000006a4730440220643219e1e5397c263a571c823f6e2b69c35ce651c4da3c9ca4fd89160a481c9202206878f8d2dc692303c853868ac5083c094e8da9c2f1bb871ef700e2cb980b8a7d012102207ef56f0c83b6d2fdf865cfc9c8398a0e91d5ed6fbfdf5fb8607f1050fadc44ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce14e0000006a473044022059f45814196e8b57b0f82de0ab3703f78692b0048620c123d6f649563ec6b5bf0220057d85bdc145d2be54bd1b00151bc99f23ede82366d3113078d31aefd154faa7012103c08c0d0d0e4715e37f3f434e06fc3634a820e9dbb7db953efa1fa2b707ddd61bffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1500000006b483045022100a0da2f47b157feea9366a90a779be3850997faae8554b99e12e3724f8d153f29022077957501320a4648124d3b358f0c6bc3c075dfaf6443b410d4e833f1a2b35a33012103048a2bcd8bf1d2964705c847c4d767a531342071436cc1703562fd5ca7937f3bffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1550000006b483045022100d8c72f6baec07631b9bfe35474e29a8f4a730d84ded906892f05dcc5aa3526c10220663ae767e4a776030eb98f529b96567f6e73913c9a2b519d0d4d2ff6a491e46101210281b87d0e4b299a674d62ec6d25454bfe20337f8d7ea3e3b1e689615cb5526cbaffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1560000006a47304402207b418b4cccecdc3109842012a197fb955d9838ffe22390343cd4c6ec001c6430022001bc698f4b73de6406d16f6217a6c992f47e78b0dcc993248b12a0eb4088868c0121038787f749b550633c0ce68c87a5978c93724f21deaca1e27bb75f18b48cec83ccffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce15e0000006b483045022100a19e82cd51a2dfb1ace2e1cf2c4c33452467412d55e7fe175e563e71f3b2cdbe0220757786bb52a4c3cfd0e6f2d56d67dbdf2bffe4bf0f124d9cb7c5e2a95fc364070121022abaf62caece617e1e21f254ea8f039d15b3e1d3114c873bc2b13a74b3284a85ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1610000006a47304402202044ffc93608403fff54930e308033adc5359ebf9b65435fd1a29204d42e0837022044776b7fc9b011bcf390df52dc0b88f7573da88bfe53edf1f59c2feb210df3b8012102da7da607a3d5689f3b548b84158cd7d01b6a3d06ce46e21d30a89f2ae3b38d3bffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1620000006b483045022100b6e413a1f591c6c41b215ad6637d209faa8d5efa2820c6755496c3f3d0095e6a02206749a0b8a3b985b1866d2b75538dac1b4b6c1250fc97f20501c1404670089158012103ad415589158489b4849f08a35d5232ab97b8af419f54a51293eacaa207f1255fffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce16a0000006b483045022100acbd746359056e3d2c511c76b3ef543a4baf5db97011383f281795a30e6f1555022006bd970c51340437ce3e148dea839bbc96f5adaaa03fcd20cb72f7e4c8416696012103c808a9293397918ae34b7c6c754554ed70f7b092899f39f40c84efe6b44b3cb9ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1750000006b4830450221009c29bd4b22b5dbcbc8b723fc00808e5dde928458df472f7f1ef508f8b4915acd0220344d78cca5a0c0cfb03a8d5b4217944233529173f5bfb8777a301654b49315cc012102a0074a676f3348c8ef8e8f9d06f8c619f92f21a816a9b5be96c01079133f9153ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1760000006a473044022046d183986cc6462ad04761a493816a31700ad9bc60c4be0589354279973ca55d02200f653217d2f08fb2bf2f779f2839c577a8a4688f5d345c5c6e6a8e0f5436a621012102001c8add5f438e5bb88384cb5a0636eef778de49c72ebebb820d60ec450c72f3ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce17c0000006b483045022100b5ff9dd5493ace5193217c279274a800200c1cae77e90b66da01eed7c9eb47690220383c858d65d93c097ae532c236f337163d07a98aa0e623ed1395aa586108752f01210254e690cb1831c658615c1eb7619d37baa29261662d643a0346019186edd5e8e8ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1820000006a47304402201413569e40213407ec132964bf8a5f5c53f787abcf7f8cd8a211f2b626f009b9022040dfeb7ed9c53cca8a1825bbc327f9a42ee4254b610e2de491d7436fcfec11ba012102467d9c0ba7fdcb7c5bcfb88c409da4abd7bb7f0f1392ea537375d308beb726caffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1850000006b483045022100ef1ebf71f7b7b33b29cedb92462ee186247dab4ddf5977b5f385ff90033c6164022052c042fb195caf30b8fab1376d5703abe1565c49b4dd69d8ea5fa483e6e415d3012103dc6a39ca42438d74f372f2e6c39b78cae0a6a0497ba9b324b37323a429c25693ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1890000006a47304402206f171f092aa1c83b385293e6c8651d332b0a26bae1e4a1b936f579b64c85b51002207e1178443936f66cd0b64265378ff25bc74422fdb57e3561323ac04e688c76e601210201a71c6842cbee9ff2e7c0aecf1042ce5d30103f4f73d8ef35447ba56fa78430ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce18f0000006a4730440220403520ed55944828f742a4b8c72feac418271e14b516d2331f6de2173248c972022046784ac0666c9f8e9495e9ea027530c8254d382677ecc3730b1e07dba775fdd001210290297b638a0a815a09ee946947567946ce8d40ad4ca4b814e42d4b86d64e5161ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1950000006b483045022100bd08c38e9b00a560692034bbd25013f50d130a335c87a7e727fa97b6c228a3fc0220287d22c6826d9fa683a3914afb5a9c04959de7355fd6beb25ace68db19d3239e012102c6bac6f6a26107f1b6ac7731d0eb1f68be1a960fcb936138d5ec1003e3009b9fffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a30000006b483045022100848a82938d6268129d76e94c7b777f8c0a1d599ce007fa34d1eef5a711cc815e0220240cd29affd1c5daba89606afae3e6d98583c18731f2346cdb72be6eff28384d0121021a5795b6607ad6e840c9e286bd0483015f198c14579a07b09abe352f3adc21a8ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a90000006a47304402205acabe46f8f7371a38e439a909e0cdfe69ecb7b9f8d1af57057f6291e3e5544902206e16fd082122e56e3165afac33b873dd781610cb32b324f5ba2cb28a1ea8e08b012102aa40eec24fd5aa30cf2ba80b1dfcce8b3cea6f81b63c4798c40c52b0641d7d6bffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ad0000006b483045022100c7d466f3db1f924d4c43b80a717c9dbf42bad03e305e3dad837d987417567f120220474d5655aef0d0510388194185ae579bb5b3a66bb15dab578840a645c2e24100012102dcc2a5abc3a39b4840455b057c912c3685b6801e7df26d3674ef6d2ac12a8d9cffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1c70000006b483045022100e2a7032b935736a85de81c73b23872c3c9bcb6122eb18a40962ecd02049f3bb702205b510375ddae6c39ccff655ee40d8044d2af612b595e2b19e0dcaafc6e22ff380121029d46352f694824dfcc800fb6781602a527d7ed003be2d6b1d64c8e6eef50df7affffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1d50000006b4830450221008ffc2ab065cb3a260ad98968f6acbf193018b0062e8ea6a92e4f687377accd6b022012826fd27976709a57c0148d4840964f4a3c3e18b7fc1c070845ce13589fd32d0121039a467d42aa858bb84b7115483e4aaa32a033b7bbc04969b1b283fe1eeda525afffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1da0000006b483045022100df98058d7a7cd1e6157cdb1a5a2b1bd889cd20a55ddfbccf8035c31b7357e4df02206ab0498e35c1e28cda73de832e7266534fa4c07ab361e2775f3f4eaf1d71b14701210253261bb6c86f395e68f7480f90e0e7a47b32ce0d56b75be775345a5fd009ea25ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1e70000006a47304402206ed58549646a47e9bc7dfe95fe060fc5eab35bdbcfad49b3533bb35d2954287d02203ff50dff4929b869c1ac746749f66bddd6a6945e228d11286e40078b143b2087012103cec48e102fe0a049ebc494ddd3d14d3792b6735516ad9b50297c4733a17b90d5ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1e90000006b483045022100d748aaa58a76351cfa2adf3fbed17cac0188ec7c822430358bb67d4c5c0493b40220358651be876f294274b82e4ab27cbe614223cdeeba7f18ed4de9eea029430f98012102b99681d93faf7d71411527c099d59def01beb5aca0bbb37f48df055a24627828ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ea0000006a4730440220208d5ababeded05d060511ee084d4bfb8445a6bce9f0d3344ed18d387175315b02201a060f0adf15f82bae7fc1ce52d60d1ff80dde87bce1701fec63829f8869cd110121030df38f26078d2072ae8c53866fcfce2398fbb3d1b39ae3ad0f79eb77de9facadffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1f10000006b483045022100e64c57c363d4d317d4c63b2543af5d18d5c80a8c19ce959f1b3c64544debcf62022054414f5c39ecd2e4b7c3598bca35fb8f44b8c443c6369806f47275c4d69124ce01210381e1b57ebcdb3b56c0da96dd3f40c4809533f3949d00740175af286551fd39e5ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1f40000006a473044022000af69b4690dda54e96bcc22ef1ccc6e597ec9643bd791693b87a7541281dc4d022014b7c8bda024a5bc12db33999a3561e97831b0ba05297547e5975dbd793045fb01210291cded3a99d54bfbba91178c3ac811e0545b9ae98594cd88165bd8d8a6c5adcfffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1fb0000006a47304402205b306ce1132daac159bb1616dbfebeaf141abb669a6e8c0cfe6083ce5d2acc390220688d5478cf187590de77896b1edd9a2a203e95262edb5f269eef7b8ea83ada19012102ed801ac57a9715ea9d33bae10cf77e955e97d3eb8ec3e0610b2e1618aea49743ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1fd0000006a47304402202493af2acfd48e7ef306a2ca586cf1ce37b0b0df15dd529978d04d0c126b190402204cf7fa00378a962f5a02c13af86da3ebb83eb41757f47b4dde7364e207a73679012103661abe9ca452dd39e739dcffe5a57fa01b09cbb16f0c77efb7e83203c60b0357ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1100100006b483045022100976aacbc4b3226fde372eb72a011f8343e0996675b5ab5dca8caf4c9411498b102204ab6c4955d76ec1500c7c918c58ffc1baaa0cafe7d37f3fb3a3369dd924de9990121027d510e7ef2d251d74ab897b4bfae915cfb3979a043552c0d8ede26a95ad91fb5ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1190100006a473044022100dd2cb049a9f33e199f8cc28e3e7679eff17ef0aedfda59399558c0c49db19d90021f562725a736cf9b9c12b5f1db508915bb520a83340271fb8c94e205099d33260121025ea8074d10f85c04eef3b63930923fcbb122a5c9dfdbf41a56b47e91b3473c62ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce11a0100006b483045022100a5b1934e7acdf80039d21c94784cc4a0fcb3df42a349e03788b91de12f5ccc7202207961a88464ddf26ecb8c46902b55478d4224255d5be4d3e2b8715c4f5c0b64a4012102c059b935facfa01366100691c91328659bbdb885e3c802467cacd44e92bea4cdffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce11b0100006b483045022100961ea22b02b1cc46a09275dd082e1f59172ad5db2db9a092c179bac9910399c702204172b2a043a152abe48acd87505cfdf1d4c7bc61a60e4106d156286e15cc39cb012102cd0581d13ebd3d022a63c8d86140e52bccf1b454f824ab7fefdfd6a338c0a4a7ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce11d0100006a47304402202f5ec2b5364ee715fc43b743f73062f04c4bda8e3f287b840f16d32756f58efe02204aee179ba38fcfb3b077ede655d099d9cbaf546bc4159d30f27669e360d4ede5012103a1cdaec2cb6677a444b56fb6f4c7dfdad2f16e0e83da9d08bc0ab837d44ca694ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1230100006b483045022100ff8373e26ca26ca23c5e0f999e5ee448ecc8086c972b64619653a31da0a624e00220361762c6aac55ed25f420152a24133dc731b0a36803b496602a5ab5c5d220538012103966efefa3922def76bcb9c9da9ca320ff071df2253a95e554e88f0a43dbd1af5ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1260100006b483045022100f153ca090f3011070d662bc4b07e99ca4b134eb18f54226a923b090ffe79bfc80220447feb3a9d45e98a9707ec5bb9b7373cea53207529823c0db76c8655e173c6cb012103c0eb8b1c197366c5aca991758cb9ece316d77cbdabc880279b28ef0417fa96d8ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1280100006a473044022027f3f6b2eaf4d288835b317f989ad1188e49613b44c068eef0ec1a9f44a7c98102203e27fa6e447b42ab288937e4c2c2bac355db38c2681dc293ce88d3b9791c09350121026596df661f5d6ce02be34806c12efbd77636e7c0e9e8685eec7e9162adf6ce7effffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce12d0100006a47304402203b55c002ee815b3bdd84fa67e7ce831b70e8e3e7b1b65ff1ec8f504093845ed902200ea8bdf7d242d4fc592ac9d64a03e72c98a38fb73cf06d80e783badd944e3982012102407e47a6ad48d7be1d7769a0825e1c80da8c6e138d4a3244d02b82c86b134b73ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1440100006b483045022100fd421e1001a1a80d0f84072d648d66bac47a69fcc376596cee7f18e17cb5e41f02200b38c605e725a14f744f72dd62405aee66f6679d104dc0ab5870447990ab1f730121035619b45c3b340326aef6829d231c44907d48f1e9a9c79f2ad67bfbac67391755ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1460100006b483045022100c46d879804431bd6213fcd9154be70249545951b25a52f753b7dcb821c280f42022007f8b7abfa8419862c4a37142b476baf5e05a67b094828d06779a4bda7899e4d0121028e1b5a54a6a54245bf21f0848d672d3f688d11e9328f944365b146e38efb4bffffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce15f0100006a4730440220102fe149d1bdd0efdd007a7cc71c3b83b0386a848551748e7654e5e9dda4178602202db140ecb33fdafb218274777c946f42c28ee486a298488763a7a3781f0733a3012102b944e9570267305e26e166d0e782432bc5145c60d9b399eacff1b1b05497ace5ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1600100006b4830450221009224cd25356cfda7872374fccfc4113a6d050b6810ea69b6086722b30e653e3b02200eb98f74952c550e924daea631810f0931d8b4ff9327244fd38e8ff2accee5c301210394e8f35ed26bf683033a5275478aa2fef20dd21fbf5fc5baeb9ad4c4d4226698ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1630100006a473044022009eaf02543c90f2e987a81e1eef361c5315dbb17bb30475a4b2b0d1dd207d1bd02201210a494912a07390746a10294d9f9a371d06b9083625b66aaf43b17d41e82a5012103628f06885c53e23474d28cd2610288270d191923617b0856e9e0bff0a807aeb8ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1670100006a473044022044b02743085cca9ec5a2d5a81b6b99cfcb4339be69ba8b65fd9fb74815310bb902203d97807b80072d56ef4aff0395de843fe965323a5484d7edc2781af29654c7b201210360e66e446a61398bc9232016e6a2f34e5c26f362479398702acd988ce66807f1ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce16d0100006b483045022100a3e4fa2e154c224a621ddf06b086f79e62f183b89834a9dabc3d2dc9f468636a02202f0bfd705f6398d94d8970b305f1dba71eeda8f601ffbecd9f60ccc87b83008a0121039c596113a41cfd570dcd458350e7370af3986daa6e3953a1b5f6c4d9bd3114abffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce16e0100006a473044022013e0955cf80da8f0662294963cb6d3fd4c0eb694b7a7dc7d8ae1f615205a5a3002203e1790833a50d3d662582987ac0ecefe24db18987ec8bb3b46a6f81c2ae9ed31012103c357a607dfbed1b44707ac9abbc0b67b515a3369a10748dc3c5164336a4072ceffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a10100006a4730440220460db28bc3addb3370375346727656c1a8c55bb482b54583e4faf9466ce69bf802201ca90204d80bc78b716b84e2dce5f456c61c9de267181493149ad3d2c81388920121030f7d9bd8007d826c505a99dcbc9c155d1fee0bc95c4cf820501cbbd0566b2d0dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a80100006a47304402205a9859cc2f2518dd90e063c9cabad05a73657d133367687ca269a05558b4577902205aea5452e9feb3f57737b33c7d278d429acf81d66ca3550579d4cb4f3f098467012103f96fd1a1f4db52fc0457a3d13be145d0a6f332d4e70ad776a08522d749dba056ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1b30100006a47304402200d6c40bd724d9143caa8a19f9b690eaf19d40971af193b37986477432e7cb7a202207f1ecf7adefb6f34847e200d3236d4754213a2540eb639c3ea719a81ff7ab4dc012102727f658519de2b214fc282a4ce9f6deaf09ff34d20b95f45f97199916cae95aeffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1b70100006a47304402204b2577ee7c4e548440eb876a2ce5b2108f5ef2b50cd29e4af9ba76c9fe0a6ece022076de26cd97bada67601db24f5c1ee7585aa441256b955ea1a4100e05cab5f4c4012103531725f6d0eba124ee177084ce0be3312fc88d45ad517ff08791b95810f94670ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1b90100006b483045022100d93a9613b27c7d264e5169757cef11ead4c89928df6671df78adb3916d86727d022070358d8e0837fe188eb1f5ae61f8ad2e0bdbbaf4653dad1fa7d2a4534177c4cd012103771ab78fab9c924f56d9bed1f4567ca8eaa7b84958575f7724d1b8949ceb2d36ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1bd0100006a473044022036caa3da4ad597835733b9988a0c2c93a2ce84ab2cfba3e881ae8b3d78caa63c022056a559471c90dde6e92ec8c6e043e5f231ef229ac6d8938db3b07bf4c302252301210395fda29e25b649eb29f8ff2c5553a494ef95093cf746a8b229826a1de3361daaffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1d50100006a473044022053ed4be0141efa9996949751e9c0ab4f1a1ee2b9598836f9e93282a2bfce86db02207133eb7956820da32dad04c275735a9cd973839d71f0b4f8177d45b027dfd846012103483a33dfb5497521fe2133beaae584e2672327663d930cd866f24886ea51002affffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ea0100006a473044022035e53c2f8502874c854ae8d9d7ab6aaee793d9d2d69d814f82520422a8685f8102207e387d04d3c6fdf5b3e767afb6ba5988b43a10fec28dc798e3eebe9f048fbfaa0121035d9ce97541161d79ba3346e6c755cef41cc110b2fa78a658c349b3ba8e7ddbe1ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ee0100006b483045022100c0f43856a459c691b1065b11fb80c687618f339a13326257bcdec0baac9539fe022055e2273109decc4eafdbfdc0456b0dedf53d484fadc7ce5cb8756d5a8c159c3a0121023ede75e5bc13b2103eb0d3c8c7dfb60b6c7b810f49ce005a55ae4b7d0eb1f658ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ef0100006b483045022100eef38a4bb2747e5bb1800c3f4085ce43e56fc868aff98f3307a0358c158e33dd022079862e3b9f1abd528cb9a41b842ea5ca7e04212e810d65ad4fb899a9b0c6a2c8012102e79e860ef42ad0f30a2f347b4c06dbe0d82a36ce559fa65044a7fc033372105dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1f20100006b483045022100866fc8dfc71d4a3e6098b27e1f837dcb18e48cc3aa7ca3d5f223bdb9a7ccf8fd02200ccb4860b6375794e17eaf20ce7cf01cbe2e392c989857c0c1d055937be3b845012102765b7ef38aa3489505eb3927828dd8923aa0525d117a7ae20b1f59f96df0c7b1ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce11b0200006b483045022100cbd1c355903d6363fc5cf087016ddd2d18609fc669eced315e8ba9bdf6abcd1a0220027940c9598180501779ec8d1588367e24775d1982edbf54d601e00545e895ab012102812793e164e39f5631e622575caaa9cac7bf43737f7f95302280566b8c7f31aeffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1230200006b483045022100c6941f9c43f6257ca934f984adb1bf248f78098f40f72bbf2dd6aaade13f06d50220099e7a882d56cf1f075a2ed8106e477e3c4be7eac3e2de113fb7440fbfd1ab6d0121024f467b75f6c16df2f8239406df5646651b6be9e9f50b504b60ae9a1209a1e993ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1280200006b483045022100d3d4821b1600e7fc7c7ce3a66377b6085f5a02e9e67c755bbd182d34767e7fa8022017a414ba662470886ef289a686f761e27c6fc2280f5cfa5664b1e143f431a3790121020d934c98a189f626654c773dcb53de3de5690b48f0fc64ad92b25f8d08e9015fffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce12c0200006a47304402207f9e201874f3ffe97fed726620eb1b3dfbbed6f3ef2782caf09af8cf8a6623030220021479bd9ba60b76ffc4f081b5817c74b103d99869982d3b408eb678798d7e5d0121021813cdd05350838ff535db25d1605c183c7b4141d0ee2ef2bad24671945f35ceffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce12e0200006a473044022017c26f22dba6fcb856906553a64b4500749316af603077d318358fcd2c77ad970220230bca1d5f797d53a470dfad6278d92b2b94a505e6e3e8c33a11946c71963c1e012102a48b5b01a33b59a2a3eadf23d108ce1ca951ab4d5bc81c4e87c7284f70e28e48ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1310200006b483045022100dbb4430985bb573d8b8a577ca5347ab0d195468a9de0f23b69f5c9fe584f5dc90220293bae1aa0d291dcdecbe147c767361b90c43be5ba8a01bea34f3ed34caf4a96012103a52b0909c010f6df76c29f4e53ce078884d7a0edb027d3a680cf1ff2106ec18affffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1320200006b483045022100931b902c13c655ab99db6143feffd7c48b52491bb41491def8cb1c53f34f75ed02207a08369ec4a934c7136bddbd8570eb557b0c865c2d7e6d56c757ab7f7fa4ff6b0121023a186f3c944d8349cd144d419f2f043eebcf260f5cf06557d87a11b731c0e76cffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1360200006b483045022100f9d4917400ec6fdc41cdf2274f1760b54d1bcbecab9deb00efc294380d1ffc880220631d22cb4f9f2e3a7e0450023e6f089b6d00eaf9b37925d4bbf46ceee71b81a4012102c686a2956d0d18adeb6af37438ef2392a7e1b0c070d253212d333013500c408affffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1370200006b483045022100d8b04e92ba289360d3589e77ad35126c5cd759787b4bfbe2ba8163f3a9406f6b0220478f3638c63af6d2c6e5a2ef890523cbe4381a5b8e174673d599bc453cd20ce2012102d091a45a2368c4fa118ad23fe1759efd5b69aac7748ebdc04a3c7956c772bd42ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1390200006b4830450221009a5d8dbf8561fab292d34cba14d1b0bc76c475fa7229f1dfdc63d392349c7f770220343b743c1db463b91b443ef3bee68eacc92f01d6eda9c27a655bb47ce1f4ef700121030d170f347bc5ed046ce73ccf1a60d017ae7cee5f7254104bac52dd0de19ad91dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce13e0200006a47304402204446051fee410f77a847137e376f2f123575ae8352c4f11c4271f9c42c8210040220560aa920725767de3930e3b35473723a7ae39fc543ef8d10972e3508a142e7a601210367285ed00b1ea1c032beb9515c6ccde95b57965c483871b83cccdb58c20857fdffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1400200006a473044022004bff4c7ce6489cdb962c1900274a2879a9e7388c00267c4833f0742aaf54c5302202ec1183039fcd4c48afac3a97a214776b4d85b8cebff1216deb4c74d73fb6a420121036b80696a61486e2fe3bdfea251522ff9e66eb66a4c5162fdf60ac6c833ea90d4ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1660200006a4730440220679fb3854cf2634447696468f9367640b61737c23883bd45235c87d734759f0f02206981cccb33b6348a2f32c4abcc2b34e2cc127c97a9328319a464a3bc7ff7bef60121028035704b48f9cb31a48e577bee6c22f6c259f9b6b23d6c2cd325148e8112ab12ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1750200006a47304402204f79a45812f628cf1d11b79adfe77cd1d7a0ade3f64e983d5e5feb1e6dac132d022021ba37477841b0370cbeecc3c9ed844c1ea1d0569f4bccb735b772510023d45201210261191a870744f836b3571a815a1b1ea13a7aa0ffacbf3d45943986ebe3768b8dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1760200006a47304402203f35d4957abeae071b8f0cd2bd8acc52f364aeec88913fa3c75c5328da0b400a02206e6a4a1209bd4c2bdc6435aef7c9b2439ff0c093f1fc524dc4216d21277933440121022981500e07f5e6bac5b5187a33fe6ece5962db6f98defb2b5db580398ace645cffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1800200006a47304402203ed2fb6c30ebe4ebefaefb23e37e4ee7e636e46574350ca8da134a4c0176894e02202b105e20c5178946c576f2f530b70c532a9ec83f0d23b0769a8a5cc62be494e40121028ac506e0e8d1a686e602f6ab99fcf9db7d91f10d9f677f67fd5e3f2f273b167fffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1810200006a473044022053a357744855f26e6c45a8624588ddcc5fb697b08e75697b61105110f444930702201e2e5de286be705bf72fc6a619812c522b80f5aedc917b9e041e23cc52225ddd012102f9b763a3b03e3a2efd7861ce9863c32e863e919e96573c923581e8f64fcd495cffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1840200006b4830450221009a4cb0b438cc08110b96116ffe7a5f990feade8fa6bfe64e9cb53d71f0d2fd7f022028c58666bf6868e277af9f1f2f086b4e2be80ade355d66ed967b7f1c8aa444b3012102fef18983aeb87b4361a6d0df281dd301db5976bb29cdfa0f6eed403be5921941ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1850200006b483045022100efbe5a98380d87a33a1b32415542ff5804a3eb9e2849eb35a7869b812512610b022019f08404a2e2a990c4ec76d431d0b54fd990c7d364f56b0c9cd0a6e3f72f0d54012102092c130bafd3f042a14faf0791e49dee1c4e4c45fa8151f8c29e28a1eb156065ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1920200006a473044022035250088d01cada30ade05f3c3b36d70d861bd1cdf06043be51bbf8a1490275d022076c597cf590d29983e7e4a1e86b27d56fb7082927dbfbcce011b7493da642b230121026ce0c77f80afd4c0034136698a4a96cdcf0075258293d883bf9f4370a1d1d25effffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce19e0200006a4730440220776d3446fbcc8939e09783c04ea919190dd817947d9700df4f70f095c1777d2002205164b3ad67db0578bda2da7ad6b43ca6164d8cfdca77a080b4200fb1bb503bd00121036fdcf58eb2d612438d6117303f666df1bf0f29d09b3fa886b351b80c81480acaffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a40200006a4730440220093839389b62068ed30bc99a49d738d482022f88c6cd5176b109d44483a091cb0220684c0077fe2ac4bf51208dbdfba52b79d031afbc3e2629c21f7d1630383214aa0121033f10a61831dcba9c5a55a79d7e4889a24f71e2bd65f34ce770ec07654fe9c5c6ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a80200006a473044022054e1cbc2ddacfb9d34d95a304bb7f78d2dac06b168fbfbcca1d16871b1faffa002200794a401df56c7dd0dba4f8f2bde962345e2e1ecc89974056c79401f96f7fa330121029460ffd6c8b809d3cf267772a31a9ad2e94a0fad6677446fc81d03e5da48b73dffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1a90200006a473044022065a97b7d338e2476fd512d4895a7b8359cb7fb096b9401206109735be41ebab302200d556b237b96831f0b558c8c2bc2bf4614c237f893ea8c500a7656e518d3039e012103ff89a25c084b465f1c5d854078ceddd639920e4a06b1ac84dc033fee257752c3ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ba0200006b48304502210095d50f2221faa05a2f24f7abc226f3c580141969d72e26d0b7d706c1f95d69b702204929bbb23f7712b19c9cd84ee774a7c845e5dad1873713945904666acb0f5b52012102fcd18fe4278faafebc53b6da5660745d2f018def26e4ac1c23f055893256eb61ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1c80200006a4730440220154b98a27af29babd05fbdbddcd83c2945c12e193111bb01a81ff7c6d8074b7a0220025d9ee492e11b4f35ad0fc65c817f1371828a4961c3702680c0c7d5b2ba0548012103421a402b70c808024d2b6e353822aa266272106b814b4c84ccba22211d2288dcffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1d00200006b483045022100fe1af213c6c257329c6b91478180f36b9ab517134359e2710335e02c1479d302022050a2063bdcf822ed723e48d10ba43dd04a3eb8ed5ac4638c9be5b2f935a331a8012103cc1cb2bfb5a8610d0b253b93f9bd07c2bde18e387b149f2947b753b36566c511ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1d30200006a47304402201d6935d87c82a1e0d6c2fa606d0bc8701d047db1f57edc75ab6032a48c18d60a022037b3c5c7262125313c39886615ca74893bb863688203a7143f34b0c74746c7c301210257ef3ad11cdfdd5206252442bcb4a3c8bb6aa5c333e9292d28a6b08acd627c68ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1e40200006b483045022100ba49330e9f406e4c86e9967c64131bd0700b141f3833c75dd0044ea4479ce8e602206ff81e4d19a934f76348973aac37c345fb105371f288c7e217ac5fdef3809c1c0121027186a3f30963c7d158c4fca8c002f8565d9d19e010800f352ff841d101068eccffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1ec0200006b483045022100c52c36c0eb07d44c8f16179629353c3ea91a50f2b8c29ca2389c87a96f5edb780220087db3618d5258513284139dce469eef56b20c0388b3b508aa08f060cc73988b012102368b25c7524d1dcc32833d493cadd47cb44078f321fbbf0ce3ec4695c1f60f88ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1f10200006a473044022027fa07b35fcaa0720e069251fa2c0f89fbd80aa24688deeb3ce6684d1e1a787002203aea48c806ac23d7ccd9cccacd8993e0258ef48f27010247b0e3ab3b6e269bfa012103a841b267fbd3eaa91bd3cfafb1e825bc3ce407aaec3dcf141c3a7f3ba73b85a0ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1f40200006a4730440220670673d5e0db628e220c73e17aa0111e24f6796090fd66605e48825beaadae7b02201e5554bf875da04100c60f310f6ff44ee37cedf6457efbb8e35eb459088832580121031127a9b77b881ab4ff268cd9845cf781f63aff8f7882e0a7f3e207a720072751ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1fd0200006a47304402206f2314f3361b7a931a18598d5dc3a05eaeb6fd032b88c41efbfc7bd0fd5707e2022046b6866073a3badc6615fc1e67897a945a9b4b097cfba7c679efec8906cfc18d012102dbd4392d0aa21a4ed840662efba31af122eb1469ae9a02c4c2f83a5c8095a7f3ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1fe0200006a473044022048eebdbb1590bb51df31a0e61a2fe84e28380fb9fc2f599abb0dd97c59014bc702204f809646714ea082bf56d0c70a3d9e0a4659610f27056415d9a2f523ef5da413012103c017e13a66a2fbb5773eb8c158fd91d87d51398ee06058d52874555e24d90439ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce12a0300006b48304502210094178aa187fb866720628d18efe0273d3d23f6d81478a73f600c647fdb2054d802204b18dc266e41da1626f763df02d7287384a41451b8cf87421ef765bb5dda37cb012103978b1b884a950a5c50b0ef7a9c3274d03469f06cd1c4b6a9efa35572442099f4ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1410300006b483045022100c7431c64b989d55da3bd961e9476f32fc15ea62ca7b564f3da0920ccfc2f219b02205b3826c561c8b19aaad27b16fd275c083eaf5e4db56f332e4fd21469b680185f0121022bccd2c3fe9a40ab0c9e6ae7cd4555920281bce457120b58a62f237a770f35a0ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1020000006a47304402207e2ceb28d1d5ec8a3a2bae661d8dd900da5c1efaf2c62d0479d550c4fe5e05d8022011ae069c65ae1f7471d41835b7b7f18513bb316fdb0662b280e892083c5e6032012103cec48e102fe0a049ebc494ddd3d14d3792b6735516ad9b50297c4733a17b90d5ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c10c0000006a47304402205e30558218a9e2de55a0c2c60fc64f63f79d6cd9f3755d04b7b2059cea909cb5022045ae6c4d510ab2bd2b36c0fb1b26849ce4aee47c68ded194adb2713752cf46d1012103ad415589158489b4849f08a35d5232ab97b8af419f54a51293eacaa207f1255fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1140000006a47304402207d0e11f83485cb2e11872e112dd9ebe3bf915e80dbf7fd32dae074b40746046d022068fda22c86fdd9221ae00ee47da62511dc4c4c1aa06b3fca3800f088b90756fe01210319587887e9c21c023db40d7fd0bcfc1acbaed6796d02c1d6e66a31d0adebaa16ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1160000006b483045022100c25b07d519298d806e2144113a123ee190d6500223226363dfc5a4f194157c2d02207515d1538d54f66a197dbdec6868d035d41080944cd83c654250ad97efa6a2aa012102cbc5aba426b7bc5ffb99f5c3dceb94a6aec3e538b745cf2ade901614831f660cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11a0000006a47304402204b583ab90021b1114c79234a0c2f808724ba758e7eecc264ca6267c5544a60a002206584514632f12f4d2ce46683acdacbfd9d80242f522a2d037441352c29bbe1ca012103dbe7ba93d1eb0dc93928d2f6ce4e8a58786c5a713db103041f08001bdf6fb10cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11b0000006b483045022100843a6ebeec93c84e1a7024818a549fd8a81fe84f508c6f8db826969f6831d431022057c163146db80b195ace0ca7db23281f80ad82255e3277bf17c60a501321f6d3012103f96fd1a1f4db52fc0457a3d13be145d0a6f332d4e70ad776a08522d749dba056ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11e0000006a47304402206033b437f9eaed1d69b525249b99c1fde9b08a230d877f08d9ed1bb0937ac53e022006583b02855dfd2f0758263f3e15cc8db2950267b1140132c49f4b2f063482d901210355de154c8c1798416b3a9ad0a253c3b6ac8cf3f86744f3116a5a024f8776a0b3ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1260000006b483045022100b7c8006e9ef1a5388a03f4515559c7be9d4a3523a872beb859bd04f3d1c094a902204a1a77c44d4dd31406c1b5a4a0c47ec7d6a8229f9dceee04ffadd5c6cf682f2a012102134f3dd1d9aa169e979cfc942b4acf53f98f9eebd6035274e63a26488ee18481ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c12a0000006b48304502210080bd1b73bc7d89b162e759832cf34e4ff19f859338d245fdc0be2b082f39c69e02207b93a46e8ee07f28e0617b6376c5657119cdfad9bc1c6365493adc7ac91398a5012103e5c650c07667218e554028e18c0ffea102484ad04ddb1840e5a8b1330dcdf97affffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c12b0000006b483045022100f85e9ed8178cc1197ebb4b35f391e698ed19a1ced00737f4e4069888dc3e2f8d02202eec34d757281cca45433ec7f3ccf1477ec52fa601e6196f074e76b61e9c64150121029d73cd3df300cc294c5e08f354ab262e75f33e2cafd0f0c5fe9d640b5aeef2b1ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1310000006a473044022072b09fafaeebfe781e3a15524dac07146624d7677a162d4bb506077ae2c349a402203bd79dce9df9bdb2331bb084f3170ef43427bffabbd78a40bf9a0daeb60f4fce0121031381cb42f1d3adcf86e68d1f293189b11390543b91ca52e8dceaa03f9b30fb0effffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1350000006a47304402203a693560347b2ffbda244b509b03f1e8c8cdd9a3a24ce49fe8d5a340a6263ca802205d6db80a6d2569e6d3a611f056fc2c6ee557f5cb21aac34a0dd28ff12d7c18a40121032aa3ecfcfa7a4240529f51d0ef4101164b4986c156f82f74426e7aedc9196beeffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1380000006a4730440220780114e1a5cfb1d0d438e6b749da50a71f72448d96f7db63f637a55d4e7d323c02203a7c9735335711a506902067493be57b64b5d94b1ed2a6c97253c70701acbf82012102f9b763a3b03e3a2efd7861ce9863c32e863e919e96573c923581e8f64fcd495cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1460000006a473044022048dfdca6c8d4388167141b9e66952ab7aa9bc84975ca9871d2439d0cbf32a2cd02207777703ccd32aee6c7fcea7fe737ceffd3ebe1a2c5f8c5e240da6436d89d3a0c01210243a7aca40e7cdecfca37b1166207c581a3fce3d19374a4d3b8476ad6d1c70681ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1480000006a473044022051306324185a84f72dc97c72505739d9397781134c16bee0bd677779a3d42038022051b351286993c783accac0ec07a983e7f4a54c5299e9505d05e4228bc9aa6ce30121025ea8074d10f85c04eef3b63930923fcbb122a5c9dfdbf41a56b47e91b3473c62ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c14d0000006a47304402207045360fdd9c9dd44bd4c2bd82bd845fc50c561dcde952fc9b671909ee180d93022063fa229ea02da39b564876efd4475e2b90f1241d096abf92a03979f75055177501210294a8388e3dae50e5270bbcc5d216e2436640ae94e79f72e11369581dac0ee8ebffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c14e0000006a473044022076ba9aeec5c747ca6d4e110d2874100bb09b6fa79dc2d1a7477186971358bb62022005a30b40fb4dde5c0c32b8009c01ee8381cd709fdc6966a62cc0b5fed44d54de0121026cb924cbcc18026ad8a1863a0ba8e138421ee71d94b1209b3fbe80f3ade72095ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1510000006b483045022100a5df0ab8703d3ee32fa5d9ff2e5bf6532a2c88069cd49e1f8104f7371f93403e02203bc72f5e763406e3d5a2431f46c73c24b7b90cae435186e6118dfe07f6a4b0a501210240f55a69fe7db3396c0527e192be91e194ab10fd66540e77edca56cdfba8b1dbffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1520000006b483045022100b47b3f57485805b68b588a71e926150f781934eb03fa03e820d5d6352edfc75b02200460e42c19d41056a5fd609c5be852cd24cfc2e1bbffde82d3ab7074ce32a336012103c3ad46bdb26dc757802c7fcf7ec3ad7c2d80c798371314a0b18cd7116ed8e79cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1540000006b483045022100d43332fddb8939cdc4bcc18f2aaa708a49617b8dee4ac192b02f268731c4028f02207e7136b3611dd6fabdc23da7df847b00427bb4de75b5d7fd78a24b3b0fd42490012103154ae5898aa507a8b85734bc65e55a05f8ef7403b5eb930d2b10c6baaeae5bfaffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1560000006a47304402205cb847fea5f862fbaa3eb029fb66a7c2169f034a7609b43b85d963f8a42c053c02205c5b15ee1ea0a04dc7967a155501701cc4491ccbfab121589b03e3d74ab42da70121033f10a61831dcba9c5a55a79d7e4889a24f71e2bd65f34ce770ec07654fe9c5c6ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16b0000006a4730440220085045b614c0a88a793a23d1896f1cb4ecbe0f99a690a9a5f5265c4d39effaf8022055c98ce76470351a17848cd8c7eddd588b17ac79fff41214de315bde5fa8cab501210254e690cb1831c658615c1eb7619d37baa29261662d643a0346019186edd5e8e8ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16e000000694630430220449129beeb6eb697147309bda4503bcd54cfdf40c16adacf362c0a3982005851021f759ad3a2062961de9039021fe544ae6dfd26fd823558b8aff3c03982cad8bb01210381e1b57ebcdb3b56c0da96dd3f40c4809533f3949d00740175af286551fd39e5ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16f0000006a4730440220791daab85a89c37bdfc66800cc0aa8f301d1d0e074efeb22d953db7ea4d6e051022064a53999ddcf17140eaeca5b6281e871d35158c51634b5705d551ae128669d6f0121037229e6a626c5643a8775db71891525f555ef31dd5e17faa2f1f359875c25dfdcffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1700000006a47304402206f903ddde3fd2229d0bd46da2e93d081c92496530bc797934a89365f716940fa02205ee7f7789a5756f15382f0ab6ad5930c429205e81d27be3662dd4d478f6f97ab01210257ef3ad11cdfdd5206252442bcb4a3c8bb6aa5c333e9292d28a6b08acd627c68ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c17e0000006b4830450221008e99d744660ae4ee80d61f3e289b6152717ae18c186741fbb5871d6e8c602ba102200a49efaf0264d612cb280d3228005ca4226c693c8651dd82ccc99353c6f56ca101210275f3d5d97e27c20ec966c8b3915802dab7d9fcf9aac1054de04eb4349ee23800ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1840000006b483045022100d0424db7363d25d79d94b39ad46932e85c59db92bc7d69bccc54bce100270ad302200a56e8aadba19c1d826cbe04f5ab6ba9936b276fb1940f934bf6d0123d4c1142012103bdfbdfea12ccbf3f46026490bf9ae6d6f179e08523edef0c65a2842366f83b9fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1870000006a473044022057a783d20b70cdb2cbfbb567da26ffa725bc127994b964bcc7882a454c5f222002201834c10a2b8673457dba323f96fc489acf754ae9e7870ba4b3a968fabc617cc7012102de203808d960a70c9c03fb19b8b454f5b39bf2db7e539b329aee1a224dc10c30ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1a20000006b483045022100eeb03c49d146f9562a3e1b71ddb5a3e67a623ee426f9388ca3c48f9af64edaef022078c5670fcdb07157ccfcbe96a9c3cb8a5716bd6041ad2d882b4e2c8d994199f201210244b5dc8420f26953076388f782a00cd4a5e7f8459fbe010e07e46209e2e16d46ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1a80000006a473044022052b259d0a727b435292de04e0e5e3934e220ff0795e6431223eaf2bb4a029e8102203bd8f0965fcdeaf61d1eb0cb5dd8b915baa564aaf8f6123c0872e87d024f1ce7012103ad0ea873e25c5df4784476028a1b9712b488fd43f3d1328a78b6087251b148d8ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1ac0000006b483045022100a39e46811b1e3155a7591191ffef7a1f71119767564d3da0bc86fd2bdfd89d9d02202704758039b9b8b44882cda103d04d81fcda07166844bab9c155609351c1209a012102383c6cf9f6f16dcb47445d984395f04b1a41ddd42cc66d0aa1b40b2a685d43b2ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1b30000006b483045022100c445164a1e32975beba08880f10f3579b3f43a1f4a994a183a2ba517de03d2e502206480f1c5a629ed1172d3f830f1dd2e99e501b6bc422bc0405b45d6f7b812a73d012102da7da607a3d5689f3b548b84158cd7d01b6a3d06ce46e21d30a89f2ae3b38d3bffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bc0000006a47304402205584beb0b3396b2e500d9b1b36a4a4a70d870a047629eeef9155d4701423a94f0220252ebec6fedab9c85a52b26bdab1d555fcbca9cb964366ae03cd717013f3abe2012103a841b267fbd3eaa91bd3cfafb1e825bc3ce407aaec3dcf141c3a7f3ba73b85a0ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1c10000006b483045022100d28f4547be7d4bf9a542f02215689ecf6ccc92819416828f15ddbdff6c8bd44302205a3c58569507c10eeeb772411d5ae70235b94e2a969ca3e44aaf395d7d8740c8012102f8c0685818898b45bab049f8a425553ca599649058bcf93f4bd9be88e2f70d68ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d60000006a47304402200814800f4e931a46e5992ffd6b8bfef5c801862287d1c41c4ad4dc2723fccf3a022005744606cb083b5af3b10f85367bb5014ccf9d9054eaca427c8c26bfb4afe90f012103be185088cee0178a35d7d9341fc759408cf97ac2735bb05fcfbf6884b1548e68ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1da0000006b483045022100ab5de2d01a7e345ff79eb6000b25e017a690b98a5b5267514c594fcaeeeeeb9c02203532baac3b2a93cb6aae13c9d2da6434a442d21d4b61f003b7fee0f2aec7a17b012102ab574812cea5df5f4ccb2bc7cb6a2ee3ff9188213cb664db475b749cb0991283ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1e60000006b483045022100f260eedda49b27f03f7e49f255936eadaa8207554f9c461adeffabffaf71b146022072a0cf027cd2466e63475dff2f454d7181656c1710cde87b4f713164b1902f1b012103c98ba4248f4a629155630c476814dbe4d51eb5670e728c8e4325a114951b9feaffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1ef0000006a4730440220713b7a56314d8528f41d7d1b2587335f5fea69b8713eb3748de7fa4763d1333c022072c3974b293ea92f9a95a5d8eeeea5053c40fb54d681398a4b4dd924d5a75f4201210290297b638a0a815a09ee946947567946ce8d40ad4ca4b814e42d4b86d64e5161ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1f30000006a473044022023848ce5ec8185a7399c8c1790dfa15adf617af23c207091498faad353516b3202200d0bba502ce4253f7bca5fce44ff1791c068da0fffaf756b907b3be50acef16c01210201a71c6842cbee9ff2e7c0aecf1042ce5d30103f4f73d8ef35447ba56fa78430ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1f60000006a47304402204f70057f1b142bb52097127782cbdde144c00045650e7280d906ab93d881a41c02200fa1f37648d9df168d28872618908a7fa4dc39de7745d80beb5e9386357d8c670121034e7dc9404e4663f804876b10ac0a7c67d5e5bf69042c155fe64c65ee255b0c37ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1fc0000006a47304402204d849d3f2a32b257f606b713fd655c409d7d504a2d91c724ebc30e55c564d7560220292d49489ccc115c1109e450930e0e9d98219ad631796a81fa6eec6dea8048c30121025830212d902083c9426c82faf3d87a2795420890c03e98190b091ea2f86cad59ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1fd0000006a47304402204c46627c53cf4ce553e27fd12b569a991a6358eb202ff9b13a8e12bbc5959d8002203e5b608b05451f9131de70dbac159f516c7510eadbcce56a57a2bc23d1d7065d012103b86eec845d655828ce9dc6238aa912c4c66567cb1ff8e301fbcf5c5cac889ae6ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1fe0000006b4830450221008d10e50561f19f1b2bc7aafaac9111a6dd707efd8a092a1dae9118e45b743a0a02206ab8a588881cd446df171c8ec2c0d4bd14c0d670750928a0c2a64164260bcc350121027375441fa3ede1ac7a84778934aa509bd445fefb207609420c34af415c016ff6ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1010100006b483045022100d4235e80da9c8c59f0ed10c80c5dda053cbd230f99a663b5ef845ad26399feef02200e11adee8d75ed0e9263eb234ee8ad4ae3258e1b4c0cd3c42e5b109ab2dd6507012102df66553dd06d7331d250d82c7516d0462bc7f6c0a0a5e96351eb7d3d5decab21ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c10a0100006a47304402200f1e1e7afd45f2332be4846d7324ff84781ad833946eab93f79c0cb79d5c59c8022046308a18e592ec3b42d72df8fe352e697e2aa22c3b90300f5b6c174144d89f61012102f3018b097fb866dae7a8c5489421ac92bb977be9c0b3a5f165c423859b0984bbffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c10c0100006b483045022100d7e544f3805719ffcfad7e4a7a4a1b54fee6795bf1d26b0b65e8d0972e53fdd5022005cd9336bfe305cdf92dd5a2eae29b61b7779e6ec100073d08c67691d938b85c012102a48b5b01a33b59a2a3eadf23d108ce1ca951ab4d5bc81c4e87c7284f70e28e48ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c10e0100006b483045022100861da85671b0c175dfd9ca8597c08462647053db7d43066c26693d87ff63f36c02202ceef07bd6e8b24ede21d7b9323716599fc96061d898dbc8cebae698296f2ca8012102b944e9570267305e26e166d0e782432bc5145c60d9b399eacff1b1b05497ace5ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c10f0100006b483045022100921cca5c7093879de45e06394e868176eeb82f82d50ba9ec1e0033fd27b5fd3802204720d7118edb84192f86fadde7812f371ca65d655a265ce575d27d2dbb7c9861012102178c8a3273c867bd874609bfbe96839bee20545eaaf07e9ff89777d2817f1cebffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1110100006b483045022100e7e7b5053768a8db37c2866c77f41eaca267ea91a35d1d8d8c9fab9fb80d5ff90220319f65acc061f2cbb4e7c003af9c635dfbc5031d91972768a5ae8f2027e8cafd01210395fda29e25b649eb29f8ff2c5553a494ef95093cf746a8b229826a1de3361daaffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1120100006b483045022100a56ed9e4f0c3851ab1070bed261761126800179d8360b555225fa38fb900842902204bd095ebe85b2d12ca4dea2e94394d1064b251b884adb2d0c6858333b64146500121028e1b5a54a6a54245bf21f0848d672d3f688d11e9328f944365b146e38efb4bffffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1130100006b483045022100eb5e4152e99af6dd5f42b7f6ac22882748f024263d4f391ec4ff6ad577c3443002207a4a57b7eb8537aa75e342fc2f5e43c2ed943e188188b299132aa50026a4e06a0121023ede75e5bc13b2103eb0d3c8c7dfb60b6c7b810f49ce005a55ae4b7d0eb1f658ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1140100006b483045022100c36c26937afcfae4f40a0ad928712715d43582799bf6b8bcd6594e20b34802f7022077b83f2ce8440dd7df61632615d66af4c8dcd422e2f122ab98a01878124fa5f6012102c059b935facfa01366100691c91328659bbdb885e3c802467cacd44e92bea4cdffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1190100006a47304402200bb4881eee4fc55e254fad94c67442dc8fc2f421acabb80d0e86ab6c3a74309c022060c1e4e4a141ee3133736165fcffb50413866713a1d4bf01fbabf3f0a5f67cbb0121036b80696a61486e2fe3bdfea251522ff9e66eb66a4c5162fdf60ac6c833ea90d4ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11a0100006a47304402205e54387f30877b358fbfcea2d0eec5af1d4e573d81a072795c0a085ef72930d1022078717ec3adb219af592d17d981ac0f4d2c055f8bd4b32c22ad951a2e19c2e8b40121035619b45c3b340326aef6829d231c44907d48f1e9a9c79f2ad67bfbac67391755ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11b0100006b483045022100e5f0dd15f2da589e52c26cb96455269d4d3d7317e0f4ac5106b2f2f9965ad54e02205336d9686d2f1ad47c7e712e24b064e365bb977eed6d68ed8d87e79fcc288aa4012103a1cdaec2cb6677a444b56fb6f4c7dfdad2f16e0e83da9d08bc0ab837d44ca694ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11c0100006a473044022014669f8b19daabe1e9c6e7c97dd3f9e8e1260b45e543110e229c4ac2df7d0a3202206b44929e72e8097388c38a154fbbf47f213838c446b3cefb6d1ad9990744f7940121030d170f347bc5ed046ce73ccf1a60d017ae7cee5f7254104bac52dd0de19ad91dffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1240100006a473044022011cf1d95fce0cae6d692cbe96527e73e78295edc21ac05a80d1140cb6a8bef2602204385a2586735d35bcca6438afff35e48ceb9489be857e342452097e098928754012102cd0581d13ebd3d022a63c8d86140e52bccf1b454f824ab7fefdfd6a338c0a4a7ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1250100006b483045022100a0429b5e1577cd8e80a7aeea28317e348175723bc32440e8e104eb4adcae9c4702200edc7c39f7747dbe44ed29838bf25bcdc7e8e2826346cb55d56db8e90c54594e0121020d934c98a189f626654c773dcb53de3de5690b48f0fc64ad92b25f8d08e9015fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1260100006a47304402204023db73553e1cb230d304ce893f408c2997b08767bfc5b831fd0138c499c4e0022078522c39530867bc8d7d53927b0a37107d36664f023781be79ad28880e8e95f2012102812793e164e39f5631e622575caaa9cac7bf43737f7f95302280566b8c7f31aeffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1270100006b4830450221008d55f32d80e593826162f59cc290e38d98268879b5eafeeefd78cc177b1a89a002203ed550ba71a006389458fd12a7f440aff31df0b388ee00ca27c04ed436ecb6af012103a52b0909c010f6df76c29f4e53ce078884d7a0edb027d3a680cf1ff2106ec18affffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1280100006a473044022068adbbcbc81e989b5684ae88f758d2fd17a2b0c58781fe956b2aea3b232284660220561d1725741ba4ace25906d21e203111aeb31c79dcdcacddc7460d2f588f71bf012102dbd4392d0aa21a4ed840662efba31af122eb1469ae9a02c4c2f83a5c8095a7f3ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1290100006a47304402207a0c11df27f422bfed97dd1d245057402708f6155697702296ff55ea31a2d757022069172e61307badaa12e341d224a867e3319e4aa6d9760a1f588df7a5241a68ec01210360e66e446a61398bc9232016e6a2f34e5c26f362479398702acd988ce66807f1ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1320100006a473044022040dcde34453812617c17211b377be1487a67ab5bbe791187e76ac55784c26aea02204c9b2fdd516436285524e7c1e5e36913ada279d16bc3d22496fbf16ae37e4e4c012103771ab78fab9c924f56d9bed1f4567ca8eaa7b84958575f7724d1b8949ceb2d36ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1330100006a473044022016d9389cfac10f2fa72ea449609909ce7c094f89e72c96dfdf0d71ece091e5f8022039bcb2c5231034c3feebf78b79297ee505a484722ebbb1293a8c1a41fb5689680121029c3a25dc611d682d85bd00a5104a920092865e1ff4ad3bd2de36b4832ac374cfffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1340100006a473044022045f4e7457cce177cdf5b6113647c1c9eb16ec6a5a7ef947b44f71695d5c510ff02206ca62fe434a06e469ec392ccaf68ca333fafbf1f0c9de14269e76487eae80f5a012102c686a2956d0d18adeb6af37438ef2392a7e1b0c070d253212d333013500c408affffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1360100006a4730440220793d34fff42b616bf53f9ff8bb8d27bb69598a8964b2312d5c6f878be539e33302201baf5b3ed160ef3879825e9ad2bbe39cd2620c363a685a2ccbe4b213368819520121039c596113a41cfd570dcd458350e7370af3986daa6e3953a1b5f6c4d9bd3114abffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c15c0100006a47304402207e52360bfeaae3173266e7a808c5e7ca770a5cf3f2b25b549f652a061344a10202201d44b1a75a19743a51fe49ac0f5ff822b7b97f05e5940d129e41b04d9eb12ddb0121021d6d6d74787f56298827ba2de6b362ed728437b43636605185bd2c7d38b7a2c6ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c15d0100006a47304402207c0b6d0f79c00ae00ca763c5b3bcfb8f0f4dada2f28f12c19a23b56459f6987d022044d97882c3af733e68a17575c617850c1cc6ec93ad703140f84dabc99b477c25012103b85351a7b2041a50095248f463f53e82bf504063491099fdc3b0c9a83190bf8fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c15f0100006a47304402200c238b48948ae5254c72bbc5f9980d6f78c6411c63a952f783f871070c4ebdb502204590781da41c8207df5689360644253908edb9169cb052692df4ccd9cc1cf46501210209af668e09809496c4acee142dece9a37ad00839805a6769376a18f60a3a8bb3ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1640100006b483045022100c698c263e1b40b5bbbed6f3a619af92ccc9bd3af5a39a1b8cdd148f2429ceef202203a37aa84af3a5c0dc0e0b583f111ef78ad3c37ab80371ba27edfd4a848bf57c40121030df38f26078d2072ae8c53866fcfce2398fbb3d1b39ae3ad0f79eb77de9facadffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1660100006a47304402202fb63395b7e996c618015cae5a1971cef6614b73e9f3a321f9daa727c6a1a95102203c1eb0ab003436e3b4d7c9a959d6d6affa5dc6440ed7871607a2e14e7e5bcdd30121022bccd2c3fe9a40ab0c9e6ae7cd4555920281bce457120b58a62f237a770f35a0ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1680100006a4730440220326370ca79173884eaab15f5cc9254b673c6c598260668aee5cc34cc1f5f4c9d02205a2abf73b8f401be110719a34c4f4d8244896f1919e8b030cd7aa11f23debfbf012103563639e27c2df8e945bfac8bed17d2f0320ead623aa358c251ac00f83e833dc7ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16b0100006b483045022100d68f87f24772d287d9daa82728a092c0ba0f3eacc7e4e5a839a242e619136abf02203434f2aabe1b6335448342662bc4a4ad8575bba36e6dcbd54edc0d01b13d7297012103e9ae7c902f748221a9bc6dc13dd3894c4160c7d821e6c7acce0560e92cff231affffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16d0100006b483045022100d186b892201252aae37849971a29980d1f7d91bccac00ffe561ed836272738ea022070629d0257acb9d21d44f109bea479188f22ece0f3f2da617f41145cf411b556012103c357a607dfbed1b44707ac9abbc0b67b515a3369a10748dc3c5164336a4072ceffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16e0100006b483045022100a301dd8f780545ba68d7615a447210482dc64eb920d88c02a534e2bf267d12a00220166f0418ede111363814c147cece1681ab21973b7e4bb6511f7ec3d4f7c87b540121030b8d0dce74c5e9ef271e8e1882729ee0a272d0daeca7fade9c47413a30b6861fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16f0100006a473044022076e277afdf7cbd3af104116935edfcac34ccb56057f83bfbe9fd053f57f4ea4902200810a644d1f0f06eebf67723b62f0bea2e80469057497e5b68153acdcf5c0779012102207ef56f0c83b6d2fdf865cfc9c8398a0e91d5ed6fbfdf5fb8607f1050fadc44ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1710100006b483045022100f9321e8653cdb00782ce4786c743f1bd77fcc3565d4776c10baccd49dfaca93f022072a1f854351fa4e4cfdb77f655172b1205a862228d39c00b027c9a7e93c7a48e012103561b995e7c0bef58f05c78d6debf651b47596fa8642791cb87256d46bdd15a55ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1720100006a47304402200feee05210cfc4dbc0f3bd7f7dd7b1c2c635c2fdbc372d2f36ae9ea266bf216302201e35c025dc26f0e112214921bfc82696767f7d97e82067ca288c41ffe4cbdb40012102e79e860ef42ad0f30a2f347b4c06dbe0d82a36ce559fa65044a7fc033372105dffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1740100006a4730440220232103647230a1e5dcae5fe4ba1abf81b2fdd4b50cf078c8468e2df6f4d24a1202207db933d6441b0e2f4db35af53bc59e1215b35b7c14706d8c7d2f4b4627ff8db5012103cc1cb2bfb5a8610d0b253b93f9bd07c2bde18e387b149f2947b753b36566c511ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1750100006b483045022100c8dcaa349c76ad8e9ae0a80851938dc5e866d1a8bce653661e8aaf6fddc83df9022032e73f147b77fe6b9f901809f8090c37be4cfab701eb911ce20dec54864b5030012102001c8add5f438e5bb88384cb5a0636eef778de49c72ebebb820d60ec450c72f3ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1760100006a473044022024d5ce69fcd58219ab80ae61331d10339a69b45176c1fd077b9455b6532997920220146cbfb6b989f754b52aa6b3b6863d290dd455aab7d594b9e85d2e33e44735da012103ff89a25c084b465f1c5d854078ceddd639920e4a06b1ac84dc033fee257752c3ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c17c0100006a47304402207487ace7f49476c32429c0819c95eecb2856313240a1fc409146d297899fef4e0220746cb7ce7d8c5773dd3afbb9d8d36b5225b1f3e6a720eab6467cc5069ea5541101210265d1581eb36fb426a10567e42a77c021f054af9baca4bc20cca40c4d7e7a6b72ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1800100006b483045022100860ad1fc2b92937080c9615405b8a11bd3ae2b37b2f5d8c14588e43730c77a1202203c1184bb3a112c107f1f1decb5ff7c2e0ae31c3b591039be61e028932a621b0b012103ec9213e95d4f572091411c9e7451deb5df05c3f2400015c69336d453446edf8cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1950100006a473044022015458b01c46adff34da2313a67069c9c1533608e83a68fb11dc094a413f3bda402205740331af5fae271efd7be64ae0c24e69b6c864900a6c373409b721c598a4eae01210360c328e5bf3421491d2bbcd68819e4646163a526916f74ebd0675673fe82454cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1a00100006b483045022100c3c6e55c4025f8338c30ad6581250e41ed82b4ed1124e26802daf36e280fa7f602201e999e26e3dd3ac67227dc2a26f6c2ed90188b84039e282ce649d366e5b61a36012102de3bb7d8edcc2e5cba3d9850c5691d91a322e2888fb6f111351420320501c7b2ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1ad0100006a47304402204b720ed603fbb7fb0a8dc371f9170356fef1161bdbe5dc6ae889edc00ea65b5a02207b2423b8c0f226449abbaabb86bfccef1d28cfb2074e17e876cfa063997ff1130121035983a0bb2f97c118c75867afa075c44cbc81f8b448c00243a6297724e75dd793ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1b80100006b483045022100db246ef1d851733fe1f567357304164f1014724f2c8e485da0e10086774ef09702205e5866f0b3e5a82e7d32dc5358f29934cd0ac7a07e7353f3cfe0d1a8db45ed54012103783e97757e436c200c24647d6dfc414bdd4d6f859562c5fbf3d57fea7e24dcf8ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1ba0100006a473044022021389dbd672f0f893d0b7bc4559357fd3d11e46ed0db9b38dab8d005e82b994d02202fe086ac26d12e6842982f9653553187b9af48d6b1db3f4efb38d9c331613a86012103ba0be2c463e5b5d894f771f899811862b765d09c735fc16eadd9c2ef97030851ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bc0100006b483045022100d55f97b555c5064e6e8902e8e1802b918f6755ac0909dde8ec2ebb81992cd13702204aada200f3bacdcc800609e33d4b4164951da0f463e6ba0c11797612ba83eef50121039a467d42aa858bb84b7115483e4aaa32a033b7bbc04969b1b283fe1eeda525afffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bf0100006b483045022100da28401d08c132142b96a330b96aa9dc2b4d994b3276d4acea2d5ce645d2618502200561adf94be34b23fe59363858752e0dd0548118f1b0e20bcc6509b0f9482cbc012103bda66744af00c2926e8a9fe7d4e4b10b44978e31b6c1c621a2dd2192ea1cdc89ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d00100006a473044022057ea948e707dea3d86eaf12eefe16bad4923448478389b44fae09ef0988bd1ad022037a2a9d83f6cdf079fe31291f13085d5a209aceff48146f29c277600a63ed076012102ed801ac57a9715ea9d33bae10cf77e955e97d3eb8ec3e0610b2e1618aea49743ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d20100006b483045022100c8d05c1ec13543217056e91f658d2d69ef2261e1a96346bdddc618dfa9bf634b022020022c382c6f2dbf51aa3249d03b406742b115c31a833ea7822977cfaca0e7f20121035c7cc3e6bfce86040d9133c267210955e6b85537eacd0634e5f10aabc1bdd017ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1dc0100006b4830450221008c42775f4e2ce3c3394c33030f3a25a64888776bd28a56bab8773e283da24b0e0220272b6ae63f1010080142c9282a617ef00276194859444d2db717f8bf0c8e2ff501210367285ed00b1ea1c032beb9515c6ccde95b57965c483871b83cccdb58c20857fdffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1dd0100006b483045022100849109c514040b23c75d81bed0585d316c0a2dde3d8926621792a3f6a6a59f3f022074cfb8eb92a2517d026c8253351c28d29e95350a886361ab3a29fe7e96139bd1012103966efefa3922def76bcb9c9da9ca320ff071df2253a95e554e88f0a43dbd1af5ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1df0100006b483045022100f5ed0d3c85aa5ffd649a8a8087982289e7010357789e945428c6c4b269e4654e02201260a7eb8fc1b02c6de2b144463927afb4e3c87fc0c65a6d43d1625e40895a2c01210281d386c40c59fb1ef1881f1b84bcc92427b8536ab222c52235bae910c9285dacffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1e40100006a473044022056b14b482e057b70b89003edadc9fc9a9ccb4e89017fc42d2e4ed1926902a84002203b1be778de305d62f03bf5b22bf80ca30fe66bd2073f15998ee3cd3ceab4cceb012102ff192b32ceb6ca7c147da931b3886549e18ec1d47a482ce5375235458d479a5effffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1e50100006a4730440220243de4b91d94bebac601f72fb64a89b5e541d628a5944817624ec04905d3098e02207ff99fe167804fbcaab1d56628b72faaa2c7e3e1fe0dd05f9a01c1d368a066f9012102a5c4276fb5e2b3218fc67f5c3fd87bfc9fc75f12bc0e8fb6ad1c50a6df0009eaffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1eb0100006a4730440220502bbae45580b9a5166cb4a1be1a6d7c02af0579d8ae74d46894c6a13d191aa202200b3ac854054a1f17414eac57a710d19d5a93d41d0e9bd12584c7374d077fc2b70121024f467b75f6c16df2f8239406df5646651b6be9e9f50b504b60ae9a1209a1e993ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1ee0100006b483045022100a55afab22a2d9931970e0cc320e3ab9cee62f3ca47a8adc4923b0ee9b144f01802204182cf9c8272e6a9fe3e58c4632f75a37fc3e82bea741003fa096aa3183182080121023a186f3c944d8349cd144d419f2f043eebcf260f5cf06557d87a11b731c0e76cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1f20100006b483045022100f9e3d0bbc090c85f2510f346b6dbd76af2f9be724768c3854b7f0ee9c1fa4eb102202c9a6abe8581e308dcaf1a714c93984fa94e48f85ba2149a17f13087abd725c8012102fda3f6006fffb7975d967c5b473fa64b712ae2b469095b3cfec51eb70d665204ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1f30100006b4830450221008a53b245e639f2d6aef246709156a30f546d9e3a91e9359c5d4cb9f3eb80b3c202205f2db7f30bb163243825281a0f57340f0b768c029a44787c8ca83a9b26bd01200121035d9ce97541161d79ba3346e6c755cef41cc110b2fa78a658c349b3ba8e7ddbe1ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1f80100006b483045022100c53db2e6181df4b401c79e3ccb97358121dfaea7fbde135db1e1c15f7649ba6b0220753f38bb138baaa5ae2d8bba4a5d36fd55120b17a2471694969b1dded9e61b730121028ac506e0e8d1a686e602f6ab99fcf9db7d91f10d9f677f67fd5e3f2f273b167fffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1030200006b483045022100be20c7168865b2b8c53f452b112643415963ec2628b3115c26e94310d6ffdd2d02204165e6f64532a35a77a8b712541fbe4e32b240d815a9782806a994c5dc195d8f012103fdd7c5ed26ba61578966971b16eba7a3864044610a345b54bde3987184fb2ca8ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1190200006b483045022100e4a31fd6b7622848ff706a3c02a6f1e06433e917887638e904b6dc55f04e617102206e513e2af1634ff2c959df22cf622b403b9379f055452ef8a36070523370515f012103628f06885c53e23474d28cd2610288270d191923617b0856e9e0bff0a807aeb8ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c11b0200006a47304402201db8da5f70a05b7daf6bcfbd742cce7b6bedc1bfbf9c467d4ee220f2ba3fd07502207b1926a925c0f5d60e7a0d1bab7a0cd8f3dab5108bd50e7114740b8079203dfc012102e55506f1a590c2ab666ac1ee6a4867d29d5d5e51df33272e78d5e8cc0c805373ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1270200006a47304402207231aa4d05e65edf095e4c5f4ff545e9a083a549b98d217b40a552ee90f445e302205a6a26ecb8934140f5068074b21965616203e0791f2c784924c1ddef19a9da6201210221c7ab81dbf119a938f75adab81d255c60bde3836b7c7707ee9a7bdd301e80b5ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1280200006a4730440220789b372f1ad5a63e97ffc30cff76d758c9a05961bc4e4260d85c66642b6ba1bb02205c66855819f78af7257b4772e9c7d27f344dfda87982877bfbee590b35c3aa84012103c08c0d0d0e4715e37f3f434e06fc3634a820e9dbb7db953efa1fa2b707ddd61bffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1290200006b483045022100c0be199a0cdb2dbc6f9e52f1a52068adb7565332af7447f9fc22417a4662a76b022019ce6043d0b72e429e3d7ab48416d1e3e1505c83cb44f8fde10bf21621ac43e2012102407e47a6ad48d7be1d7769a0825e1c80da8c6e138d4a3244d02b82c86b134b73ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c12b0200006b4830450221009d74913022239d6f4b700d43a3c2098075991168de7c69240fc5db51f82b550802200223e44184e664e6258a3b25e81897a4c71da2cedf85c12e4c4c6b554407c911012102acbb90364ef941aa87dd5364e8bb3f15a88203c1ab377566825fd747e0aa6cacffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c12d0200006b483045022100ab0103e735f39f93dd8d1cd844ee98b4eaa17b29dcac2d968904074c3df5ce2902200b8290665fa178e26f057582c17032b1aee584f2f4288bf41fabfd6b78d37208012103235173889e3df92f2bf3cf88b52fbadd58211cb3df76b9cb5f5f7046f2500301ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c12e0200006b4830450221009fd5ae1aa33964e5f9cb4179373a3937b712f2645c8cc4ecc6e9c867c5898754022058ea415c52cb550abf515d05a8edeb09ddc6e5593093d35e8748f19db4f11f4f012103c017e13a66a2fbb5773eb8c158fd91d87d51398ee06058d52874555e24d90439ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1340200006a47304402205215e412351ae943b95161e9a9b2c6f471abf7b1002604d4bc6455f64500b4d002202629325596d78f14279277392e3d02f8ea195f5efe7aece2c4d1c728aec765dc0121029d46352f694824dfcc800fb6781602a527d7ed003be2d6b1d64c8e6eef50df7affffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1360200006a47304402200256fcb3d766d4b74ae66b46710e321b4778f9532823b778863201f396e6688a0220049967c904dde6af5f38d659741f524680a89d164e1fd5a3beab580dcbf4507f012102765b7ef38aa3489505eb3927828dd8923aa0525d117a7ae20b1f59f96df0c7b1ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c15f0200006b483045022100866edb83dcff43cbe923d2d13c3dc4d320e0fd02c2277d44c0b3a99f8fd07527022031620880000c14c9450f92165f9a472c722afc97b4a2f248a2ef6abffdfc762301210261191a870744f836b3571a815a1b1ea13a7aa0ffacbf3d45943986ebe3768b8dffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1610200006a473044022051caaa02be3eaec5c4ddcf798a87925382d30f419b78fe988b6fb2993872e51802203ec0755e03ae821074c1b3297a0bdb8b5b1de6169e165b1c1d11714127e107a6012102e4562907fccfcf4b9a743e4715d5a9cc1ba203054c63a5f4d0ac660870d35ebfffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16d0200006b483045022100c67adb798d345237fc08b938c1a1ccc489846dfad538d0ad39981eed8504a3cb02202ea640592068c08ef55fe09b4f1cfd5764104b7cfa5bcf690cf5e1acd6b1d36f01210362ed038dbba6b24df044dd51557462b845547273183bbe3aa6c67c0cabf0ea4cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c16f0200006a4730440220767d431ce4646cb5e6ba4c29b3bd4a8d07f878272bd48b0600ec40c9a08e9d9f022041d543294659ed9e5e5a74c9e7745dacbe956aff0cfc0de9fdffa13e36dffc8a012103745777d16ff9d42b2d09eec3d5132c7a719764f1ffc215769ab6c7beab05181cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1700200006a47304402202e9b385df79d95668e1517024507f5967ce07dfddf420f63b7c5fa2960435e3302204898f0c107da783bedd2b3a2cd9212beac7ccbd14a5453156309481516154c3b012102b642f0057b3d76784e58d22088b8845f67e27eea8d9ca92b8f4fcfb23a0b16a1ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c17a0200006b483045022100f6d23136a92adc72a106b6524e80665b09af34d7d1d850bc4accd8be5963cea6022033bec0a03be7c42cea86bef491b3ae3466228e9cddb8e8567d2fa5de4306e7ee0121030f3468386c873a408e11fcc45534d6f8151b883f036f5f377eb79ad8b51bce56ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c17f0200006b48304502210083d075cde413642af7280886b056445615f1936da2e38b42abd9e2186710683802205981df2dad0940540f773c5e51b66a77cf740cb33d33f9356e12832769c3781301210229b48fcff732b7873b310126a69d54fae60ce316874d6c762ccc9e085f68841cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1810200006a47304402201bdf3f5ea0b4b7e6be3c6bc38f2e7ebe431426a1bdc1da4c0100dcfffe57c09f02204c585cb0d2588985ec1e82b7a79c93cbf1c86a8f28c054d841fc16c2c05efd75012102424ba81a01cb0b447a1458c5dbe7fc113adbe6ca5c53052ebd28752249493d8cffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1840200006a47304402206d6746a56ceb9d8cc5b36ab610cf7d58db9529da6f5f3eeec2665cbfd40b6d280220702182d024b8514c6c3a618d10be2bca52a4d637194eecaa42a9843d81552a3e012102d09c0636e4ef75d55f30e3ce8bfd0e15b8dad9f4125fc896269d8d94ccdcccbaffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c18e0200006a473044022006d85918f570198f86ed13374e5332e4816e183676eaf31d0a46d945b301f1b1022064d13f7021af415b835b7a70ab24af05fe1f1e4e168327edd245cfd154ea1c5e012102368b25c7524d1dcc32833d493cadd47cb44078f321fbbf0ce3ec4695c1f60f88ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1950200006a4730440220267fbaf726513478d1f5146da71c7c345a0aa15aa0350c06ddcfa8d68069cf490220453f6dbc8a0ffc78073a40e8db5fa1df6203824742c26ed0b8c5a8f18ce34b1c012102e177e59930592cf7f25ed9e65932249f4395e9088234a938aa9e8dd8fea737bbffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1b20200006a473044022067e3a5759cb8b59d734d79858039b62ac12b62965f3aff64a54852e43e17b0900220248436c0008e12193254a62a3108842f95972243dfce14bd4d95e5c602034889012102fef18983aeb87b4361a6d0df281dd301db5976bb29cdfa0f6eed403be5921941ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bb0200006a47304402200dcafb80d9ffffefd5f73db3184d4d7fe09f29e89e04b081fe1d5eacfaf98d3002206868357ee66de526ae9572fbbfd564fba9b276da79b1011d5bf6ba5c082d16ae01210329030722d978a8f6da9f3f3d1e27ac87fd71ae0526ce122193dd184987e9c843ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bd0200006b483045022100e2b32957e6c07bdbb52999069e58b939e734d0e3f44515366a3175249c015b57022014efe65a78004edb3782490336ec554085b555af814572df03adac484649e331012102373e53ce9f2bf9d2bf03a673096e5d5765d0f3ba47dbe2c6c47e89b053945b7dffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1bf0200006b483045022100fd07cede26bcc15221644053fbe40325ab099366c531d582eda989084bbaeea40220688f6776208625084293987941d68271bdfbe207aa4dba732733326b08a93c50012102bdca2c5703625f8a3a800d14cabb4b622dfe766e29cbc4e03f3e2faa227e4ceeffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d00200006b483045022100be9b2ec070fe903959a0cbfd1c1ef0de5768b01989c7aaa9821a6ef5e1e79eea022026ec2fc6b51b0b189434f619223d07e3b2ffc6eaa4fec751fefafa7d5a85e4cc01210217585e9d7a441b1a5cf6227bdb4249ab19d692920b3c400defbaf04ba3971106ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d20200006b483045022100a2038e751e69fa057e5ec349af69363bc0070c6ddd6eae299a29f8f64cd3c0670220475bb60545bd230940b2345b073695ea814f83d740a4f071260537fc31532075012102fcd18fe4278faafebc53b6da5660745d2f018def26e4ac1c23f055893256eb61ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d40200006b483045022100d7c7a4703f594d4bb4ef266cf109b61078e58c5f52e33866b21175d4e389ab3102201aa1d2c08f5e71e299368f18240088a8a1af242bc1ae2551bad79e856aa35a7b0121038347dc7409a829d9b7583c54132795c2fa4450bb21f109a14f523dcd54f316ceffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1d90200006a473044022022b9efad0130159aeeb0aaaf6be556bbca5c3b9e953add448207cd344856743c02207ab80178349832cb98a5776ceeb85f2556ebffd95ab98abba379901e247926e80121026596df661f5d6ce02be34806c12efbd77636e7c0e9e8685eec7e9162adf6ce7effffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1da0200006a47304402205dc46a72acd6f4f72332b005cb859215b5ab31bc70f9b2273032db774321904a02202a6c9424fe921a84f76d89ccbc16103c5ca624058f9592e4ac89894d3b3eb20b012102c3d8316da0c1250d9d9f22f225d72021344ba9ea3aef22dc9cb89d8d326baab4ffffffffe8205279b473e7aa25b6e1af1d08ff7d4e374edb9b51523bb3f2de8c6a0909c1de0200006a4730440220544c2abfb1f99e93284482bebfd3896b433636853f3ed8268f0f150f6efa287f0220026e69e3111ae67bb6fe6c7ae47670e1c0c7a065a57e13bf48ef8646ec999d310121021813cdd05350838ff535db25d1605c183c7b4141d0ee2ef2bad24671945f35ceffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d340000006b483045022100c651f4093a0619d99e15655d93a8680c552fba5d06a9241aee29398c2d1c3b01022036d1f06847034cd02646e4656c48980e4c1b324a22807ffa1dd874bf2975bfa9012103fab9fe19ad44ff70410f6ae2819cbf9191d026eb2aaa6dabbadbba01a11da13dffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d3a0000006a473044022011b6be5a307d93a09f666cf934bb3a92e1bca61c45814302be50300a576d6247022051d2a7c1bba62b8a79f63b53f32497ab1dea583290e928899869908963a290b30121037229e6a626c5643a8775db71891525f555ef31dd5e17faa2f1f359875c25dfdcffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d400000006a47304402204e3d105dff49e720553a1bf76ccee35012481f65e41b1eff98a48c3b01f0aa6602201055db4eed7d203640ceab2589994188eb8dc5bdfdaa3a26d938ade6624c30f1012102b82efa454258adfd0e5ba4b328b2bc5330983f705b793cb181482e79f80e9930ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d4b0000006b483045022100a11e6dc3fc67eccdf62858e8f5106cd281d2f70d592d04ad2078c972d08efb0c022042e0ab45565cfa5a11c3ff4d62f8b6dbc6f4a526d79dcda0fd7bc6f983c41eb10121032c416ccb3b041baef859872db424aa5364116abae839402eb16d2e66d5aca646ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d540000006a473044022020a0b9610bdcbed7c2b0e0dcb59a2de6273493ccd33ac080dee77b7abee881bf022045de7dcfcbccf289835e7b690f75b6285352227cac888ea673c99216db7e8a52012102467d9c0ba7fdcb7c5bcfb88c409da4abd7bb7f0f1392ea537375d308beb726caffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d5a0000006a4730440220214f53a525785f646828a726ab51041b3a19eaca305e27828d6e2b022bbcc3bd022069aba6a28acbb70c6abd5755fc0757e319049c99eaa62e464a423c33e9a9ea17012103125358e37ef869b7d243e2cdde883514386a2ed00e185a976c22b51a377cf1a9ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d5b0000006b48304502210088e40beac5270955ee2ab00d6eff4e06bbb03873eb8b2f3db4c73af0e9b56ca2022063c22e296096c54fe4563df30cbf7024d3bb3af0ca305ca62a45d78a34b5696d012102c51cc9443ac01d5afa5a175d610649191434827fe0275828993a80468c417529ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d600000006b4830450221008c76c753bff610210392a3ece465a6cfd6be7204aac61f5c74541beec233c850022067c4cc522d4bf20de28f176cfb3e058fa0464d4e35ceffb404b52358cfd060e90121028a152ff0467a7e0003e2df129e0f4afe783b8b80b590680550768282d091864dffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d630000006b483045022100f598201a78ae3776c193609007ac99f082450a213b0b4532dda08ba61c8ef73e02204ba4c2fd15fc4e96cb82cfc7d777e9d7962b56a02ddc52b449d50ae7c05c45410121030504f2b3f5ef6f01d3300ebfc4d477b76aad88f96b8e17015c032f17ab4b7941ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d650000006a4730440220508e44f9c0972c721e0e02f8faa6c03598189d4321b8d95e59a08bc396d9ceb202201150e0cdd633ab30c4561c4bb15381a37ea0d1cba72f576d26c000f42be618ac0121031acd4aa6584cc492552970924773f327f01a195a7eaa11ce7403e8bf33deca9dffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d660000006b483045022100c8399cab0f1fba3aa80e1073168fc8625a5eddbe0a6c55fd95617bb7187c3616022014c487e3fc2a34cd239cbaae3cb9a84948a2c429b57c22657b40ce183074dae601210204c81ba289892783af47a530bb90b1ed2a40b5b075ba78c571f4ad7a23ce8789ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d9c0000006a47304402200cef576689285a1002b9ab7708a892f822f42b41cbdf56faef4c7a798e787cfe0220406e0e6d705044b1a8286d47d9d498b7a0f189899dfea712063b22d6b65331eb012102de203808d960a70c9c03fb19b8b454f5b39bf2db7e539b329aee1a224dc10c30ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d9d0000006b483045022100897cbe00d0d33e17f7286e2675dfd331e97558e38973b2d8de294241b28d694b0220516caee45cfa6d4c52cdcd70f8d33369ecffa9dc3bfc591ff41226119fc29c51012103dc6a39ca42438d74f372f2e6c39b78cae0a6a0497ba9b324b37323a429c25693ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04da10000006a473044022050e956aa0b79ef3acf680428387385202191016fe91f8da2a26e8c12c58534de02206451fcfb7a2772e55520314fecf74a4dedb980d2a1a9acff91e3bcc1781ade2e0121022f7408dd4da48b2e180101b9a68bd33fa5f4b50641138539b41910ae7f06ecdfffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04daa0000006b483045022100acfcdb0296ccc93611637ac70d2f901f8f2a7e6bf8e7beafea7b7b3edb5e3c7e02202291b9068ea1ffe02f03165ee164f4644719f93605c14e3793af5dda30403db90121027d238c0007250e50e13826c5ba631692699cbefc723f1af81bf4fdd7c1567c40ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dab0000006a47304402204fc6836bbc8ebf419e42eff8d3e83839b36d5c828653f08ad7cdc44bb26c286b02207e51ba252e7fa8b39d32f82a6d334c05227ebea45277f26893d96d0f76d430ef012103a980c6a7e06e582eb8e3f9e2f74800ca9253a7a019e0ea3c1235e471268fc253ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04db20000006b4830450221009aa80d095b6157670e141401e1e9f66b739f28ac53a559bb47e231e257edfd4502204b77c18f1da1bff0208cac1c31b3c2cd4d36240a702a8cb192f40b63935c298d012102da7ce91a1f9f94c4e4d87e474512777e0b7d702961152176968ea999dbfc3ec3ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04db80000006b483045022100dfed5ff1d938f1c11b82669de0a05813aa618496e2640ae6a298794b347a24fd022042f1e30b9796768af4e8e7a55ebfbc340c9564dfe2d12ecfc3a64215aceb722a012102fda3f6006fffb7975d967c5b473fa64b712ae2b469095b3cfec51eb70d665204ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dba0000006b4830450221009bde25cc62278c354ecb751b0a60da5f6b384af9a26a2d3ccae35f9fe5c875a70220440973ed436bfe8fbc4454c5718d0ad7a8238a1e802c56d065d6c15bd7fb30c9012103bdfbdfea12ccbf3f46026490bf9ae6d6f179e08523edef0c65a2842366f83b9fffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dbe0000006a473044022070fe68a82fd2be9294aa2be9554474dd434491373933037ac84b6c404a4ade7302201c1ed802e861efeaedaa53ebeb6a4303325dd5c096a2aa7e94671740c0f6a080012103bc3019acc5d6c21e5a1f3fe7ffd43a66cbb19bb9522addaf13eef3a229dcbf04ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dbf0000006a47304402205375add2afa177cc967def4c9145187595cbb691737df1ea22b5ddbb1e38428002204bcb401bef7a6a08c59e2fe9de725b7f8fdf11b0e8477551c36ed84a886961bf0121029c3a25dc611d682d85bd00a5104a920092865e1ff4ad3bd2de36b4832ac374cfffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dc00000006a47304402201cbf699e95c22ca00d541b298c30be2908f86947eedaacf3a1bbc2823a0ae275022051c995b5b499c3481812308aa38301825a65309839bd7016803ef79a8484c1f60121033c07e5f15c4d4e4fa886adabdcff18f5160a0229be7f97ea925b10096c867f5cffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dc10000006a4730440220248fca32d208085984d21faeb86a6d8591aee8efdc01f7fbe7c0f38aab8f4ded022011adac25a8a4aadb1cb6ff0d897996f19e3886051a529577dac27473dc25f25b01210275f3d5d97e27c20ec966c8b3915802dab7d9fcf9aac1054de04eb4349ee23800ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dc50000006a473044022001354d0f1440d1b246c9689a8adaa6daadd7d0aa7ab93b99974d344206e706e00220096f649c9de140e47f1ae1825491ed97e7905d8f3cf4683080be95924a12f179012103d402e991d2209db833cc442d2f237c4597c1ec046a1ce786759ae5a25cb540a9ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04deb0000006b483045022100bb822ed9466b3f2e10b5bc5eed6ac5adab802b54e2cd9228c00f24697c92de40022075b2d8e65ef1562b0ee2653706728a0ae977b3171c7ad35f94e89d690fe6e092012103435b160c6b7532d7a6df4b1b32a67f02a42451fc8f2c2535a3350dbe0c889e5cffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04df50000006b483045022100aab73969efd8dcf674232af198dea3c6a7f08321d67e7e4d0d753cd892f7aa4702206821823c64e00720df6efdde856f46091e88d405c3bd8cd56d0593f4de0c09fc01210218cdd60d110982bf9e30a2880577a203d6bce3ac23f49c97db76b14756a8b13effffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dfc0000006a473044022039f7a7216086e4c7b8dc1f812240cf87245c3b3687595ba3ae448cfe9063497c02203a55bb226dbeed02039841f74f393945e1a297b576a1c0183f33b930583c3a6d0121030f5851d0ecf4f3f67f7a7766457647b9a5f576f2f277020707b8b8d7c0f29fabffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04dfe0000006b483045022100e5e44d7bbbafd43ef8cee9d0b93173b847b38061f714866bc70838bffa498d1402205c76cc970c91cbb23437b0c66f34005d8ec7f781dde92bd3c233ac18f0bccabd012103aaebf34aedec0cd42deb2937c160fdcb97bd2a6eb6e6e7b39172e87c8eedfdf6ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d030100006b483045022100fd49010e2bbd1556647ed0c2ea093640625a66e7c735734d1e9c03e86f45e52b0220113b6503de9e447d9a5d49d16c9ef6fbd1e33bca1334a499ebb51d1d3cddefdf0121033324938acd374e47c423e07ce826a7a5bffc6daf37626544b2d06647ec9e757effffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d070100006a473044022022f9d9ced8975da0c22a1d52df023f018f1c38c0f998be2d91059a5d4ec3765e022071572117af11cc8b5ca9e1aea9a3e2b9b4d490055db52f37ed54fdbd0acdf54e01210217f2ab02d668df006ccee4e2d7f1775886f9bc0e05988fa6ada6bec60b76cfdbffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d1a0100006b483045022100d453aaaadad61755a3f489db54da02c61f399a75f18f16c58d9c3154ec7c7e57022028e757bdad5aa8fafb435d3496dffb03e6774ee713a9c879194ba97b98d1f259012103235173889e3df92f2bf3cf88b52fbadd58211cb3df76b9cb5f5f7046f2500301ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d240100006a4730440220064ee21337cf7f595e06a9387ba3817a6b8f01819d83aed4e8200e57b7e469ce02207f91702bcbeec7c438d67f44dd5ff94f7de9a4f7f2298f540795d1f1349b50cc012103661abe9ca452dd39e739dcffe5a57fa01b09cbb16f0c77efb7e83203c60b0357ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d260100006a47304402205bfaa9df8db1f052c1d21b3167be884fb2f800260d0a02cb5cc8363b3e719ac202206a396d3c916cb21efffbb216bc790f12e8c21244bb1e460aec5c4400ab33103c01210265d1581eb36fb426a10567e42a77c021f054af9baca4bc20cca40c4d7e7a6b72ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d340100006b4830450221008f2f454314cd66d6a2e387cbb571dd0772441cf92e94584084684feb897d13cb0220072df0d79cbcc8d28f0f061400b6a00157a0b9fb1d45d1d0fdce2438e15e5913012102207ef56f0c83b6d2fdf865cfc9c8398a0e91d5ed6fbfdf5fb8607f1050fadc44ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d380100006a47304402203e68893a11b612efaf965fcd5ccaff70bb988d5a07cb0ceb307094c5bc914b7702204888ca05a7a3bbde208ba0819c3503cae767ecdde2fe9c4b8930069a179e55db01210290297b638a0a815a09ee946947567946ce8d40ad4ca4b814e42d4b86d64e5161ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d390100006b483045022100ddf9e0b0abe6e8fc21f838018111b4fa9749a5ad3e0261798b3d55730672433702207d95da6999e8ba05a496a9374bada56bd97af55a8f78ebf6e2388a79fc2aa5340121039a467d42aa858bb84b7115483e4aaa32a033b7bbc04969b1b283fe1eeda525afffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d3c0100006a47304402205f3f21bb10e840235baf505e18847d8df04a1c916022d1689ea763be8fd6652e02200f3a1295695a119ce2827f63f1a968218b4312d4e6eb371793dda3f66dc9371a012103bda66744af00c2926e8a9fe7d4e4b10b44978e31b6c1c621a2dd2192ea1cdc89ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d3e0100006b483045022100a72ad4071f5adc2eab9b47dfc6d74f3fcb3e2c7011b7f9b2c1eda0dc50ef28a0022005bfb847bfa5a052300fdda82ca941101534e5c2d8cc2d5ab8cf52a53c5ae34001210362ed038dbba6b24df044dd51557462b845547273183bbe3aa6c67c0cabf0ea4cffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d450100006b483045022100a53fdf11cdab6b2d4bc27b339b64f83d1827327eac22379a1f03aae5c4bb6cb202206fb1826649a8debc88e6281d6ccb3b5204ae1d5ceb24ae52716d5aa6858c46a7012102a48b5b01a33b59a2a3eadf23d108ce1ca951ab4d5bc81c4e87c7284f70e28e48ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d470100006b483045022100ecfc64cf2fcab3e5bb5c98110844795dcf75370193679af93fe05eb5ace40141022027cce8d27fb4a9453dfe4340a45e271281b137e19a7b3b0943e7b12588a3669501210395fda29e25b649eb29f8ff2c5553a494ef95093cf746a8b229826a1de3361daaffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d490100006a4730440220098c7979cbaeb1ca9a6816db7339d0f1a31c34fa1164e92adf388a8c7a4d18a802202670fef7b6c49785e889cd3e5e9043b8e854f876ac3d034b7f00044b793a04b8012102406168425a18fced174a6c8f6b7fc4afd5a145ab318c4b5217578d904fecc423ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d560100006b483045022100a4d52a574aadad59af87ee34f29f0afaa903b86bdd87202cc254fe8f30368ca60220178bc9f0527cf301c665dd6c363627e085f8c28b359c1f57b33b39c5694a205c012102f2a31ffb3afc4e87b31ceab7ea9e6ebb8224fd3d8513a612467493b0ca9f16e5ffffffff011c68ff8b2108ae7807e39103235fe872654d9cab4dc4b4c40248394ad3e04d570100006a4730440220762ddae95bb59e460e1e028debe18f0eacc07c3490631507786f59f28475b7d8022064ca70bab2ebd8554e387092dbcba1b4af516025c73ab6d6690e63a7a3275d4d012102ab2e84067502ae4213ded3ee19b1f8c12f70fa8422079a7899bdee45911e5601ffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb110000006a47304402207f6ed6a18010b4372cf9c108128201887c2aa8430d78dc127a5e207b7983c532022037fc6c49baf10acc7d13d244549dc5ef4f0ea147b8103dc427bd81859b04def9012103b1d2977a5cef19d66d6d12e74e069993023e4cd6cd3373e845be0e4c79290ee1ffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb2e0000006a47304402205b81e12831deca0232a712a53f69ad51c1a38ce4628df041579e369a5becb1ea022072df22adc97f93c2fdf917e86783b6ffb825b963673c364ece198381fcd3a1ed012103d5ef5cb73c67cde8a2ceccf5d41dcb665955ba4d7ae511e049295ac0c796a4aaffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb300000006b48304502210084b5f49374556b9e2182a298e5b49665aca25c49bdfa9f9bb06e40ac424c6e53022034842bef214565d8a5a8867a85b0967981261326a86a58bb0c509ad3d54d65d401210330f147db0faee2e800e1bf2eed4841793d0bd0d5fe692847fd7065af8b0e01fbffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb430000006b483045022100c60469f511d1e4666c3d43c010db849fef48977b2e7e72603a394709811d8f8802200ecc8b6cf9fa117040f7408fd60daa3faab6fb751e8a2990b34bf84307d6340201210229b48fcff732b7873b310126a69d54fae60ce316874d6c762ccc9e085f68841cffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb470000006a473044022008440936d645d817009e6a745d6071a0636676643891a6a7fd7f661226fef995022070cd3eb6618f212e40829eb071c7aac15b6c3df486e8d62a54aa9d89e81f8f68012103235173889e3df92f2bf3cf88b52fbadd58211cb3df76b9cb5f5f7046f2500301ffffffffd22123dbb9e97d97bda1ae9dd0aada7170e584067c2645a1e3470c81dd16bedb760000006b483045022100fe13e74bbe60522286dc6ada0755874e0bada1edec8d04c2dc6c479a8cd322b902204c5de0e514ec352897408f575d320e38f33cb356ce5dfd055fd0f72c023fb68b01210362ed038dbba6b24df044dd51557462b845547273183bbe3aa6c67c0cabf0ea4cffffffff723233eaee72e43c545516c55435bd2c81a1b508f1c906714551ca5ab07ba82d020000006b483045022100f4527f6bf203b2c964694706971520b527bac35ec78720283998f4f97b5959db02206f01a395c2149b27fe13253f6cad37e27c3237ba19c71db17621340fa62e6e7b0121025f6b53f4faa269f8fd0cb9c21a84782627e9d7dc495a37aef947e0f19e5b490effffffff017f47e200000000001976a914b5f78d55fcc7580519f10cbc467c111f80ff743e88ac0000000001000000019683987f834045a0e96549f563eced5d2e2a4cc20c4adba16f92b97521a7666d000000006a473044022010c169383471633e7346c31ab98dd19887ec2d5f683368012f7f1088f44ff114022050cce93b0eeeed2df872a3fe3dd31fa73c6d30dfe4ab8aa0e3ee4f8c29e8ca88012102392568f053515eaa3fabe6d8cd1f0771fb4a9ee076dd0d8638b714d6603d2040ffffffff02dad11000000000001976a914b250a838f20ebe174ebdf6176bbd40b0eb10d58b88ac40420f00000000001976a914f98cf91ab614dbbf94c591227ca604423125e7a288ac00000000010000000295fc49fa80593f458ca163a6c284040cf780044524b920fdd3002484fbfdf68a010000006a473044022056ced18a1ce4b3b90aa97f270c5684321017b777d5aa543f27ac2fd7ead5275a022028906086a7f2a10259229392590c7d09f6712795b3b80cd5972277f00493a7850121030cd3a60e9d5bbe20759835497421404f2b3e7651231bbde6c49886dcddabc738ffffffff4be714871033b0b7bff214d2ecd3841d20107f65e8095b29f54268e27030447a410000006b483045022100ee0d50095e08db2eba2ee7fe0531e0309886282a957e73edd04b7747f31172b902205926eff21df9a3c67674e221652bc084133c30b997c448b80e2599341a947ec90121033ff747cbbb4c9c450d9355c58ebe034611ac5dfeb6593a764e86df584be9427dffffffff0200f91500000000001976a914b0ae71a83c999f387a433f3a87fe77cb6b6c768a88ac64040000000000001976a91409f37a533d5432e1a60d9059a3a70655844d0c6b88ac000000000100000011d2d484d34717203f37a6fc47c38ee78b86d983ad542c55b28977bf2451d6c084000000006b483045022100ad32aa03fd4243cda4cf67f8d6181169cd3cfb19e3f417b1aef623f8fd44de0002204ee1de1955af1862da265fb1cf7b446f58f157fec62d0ce27d81622414c051b10121035e34ca1654e4563a705184aa8fb851f001d140c4ef66ce255ab02f6e3280763cffffffff68602e161b5af094ff4ecce669954978277155de6a0629f6a95ae2619c251263330000006b483045022100b98e67cb2c7e02f755d580fac80a247390526b5f22da2ce2c4479f29c1714a7b0220340996366d4ef1fd58b946b6d8fc2fd331b27dfdec97e8353f3acc59cd25e378012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff7d3bb57753bb999d054605ed53b82043f8f9f3c5f2c5dedc27c883df8b05351e810400006a473044022075aaba9c3a7fab43faf8565e10c1aa01e88f3b1f56923ac6e1ae093216cb51bc0220792f30636726898ee70332220bd2f2a31957fa7a68eb5a0009bf0c593affffba012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffffdcf6d5a683d8432a0c2bbaff8263be61902a8b1e5f6187338d4b45687ceffe1a5b0000006b483045022100daa29798d4ee06152746331703887974c3242541c9ec3d1941b02fa6c51e6ed2022064c68e93d453adfcbac582e749392c3763470a9143cd13577cde3a1a47998e8d012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff26ab92f05388883725239c6621241455546e50f83b483a60a58f747889fe5e4fbc0800006a4730440220202baa87fd0fe9aade6f3e3a946edbfa446fba9ddfe7c9bc681a3f90a7824bc202202cefa396b41a51e163c95fc5d0bc1c0620fd6807a8a24ef6a119f0cfe911da7e012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff281ca586e067a9cfb126b6851b1af50b7f3b722aa7f4607d7a3cd872acf844645d0500006b483045022100d76665ec77e0217d1ce8bdbab918d38add30e55bebca850a114f645c6424522e0220524ae9f86bf0a30c290c1a5880b38f5e94fccf12a7ddc043173d23ef4e68a22e012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff84b66e3431cea1a4727e9fc6ff3714ecd50896fa5d49448926ad21bcf6aec25e550000006a47304402201c7063faff2bdc59db866aca354a613b8235284e9a3fdf33448f0f9abaf4046e0220413d78169cb4a300e0832087829833390c4ec4c47d7ea6b28c5d48ce8e5bd2d6012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff103aea34301370c042607edc89ff90f192b6d79e99e290633764bbe4b5cb4bfc2d0000006b483045022100a904af251cf29fad607a6ce56e100e4b073184ad68abc45abe391c3991d5841402206e2c9ba87522192c3a73b56e33a2a5c2b231535307f03e4ff6f0c40f3f0d85fc012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffffd4cffe9a2f50bb1a08eb4ddfb1a31ba86de783b35eb68d7b982e8aecc22df625350000006a47304402200c44ee6f856f3d89cfb335fb608592bb6d31a30b14d500c059b6d1e35304f4a502203a59c6aca5e258d1565ed0619fd7fba1b1a61e30744ff654d3a9434fd05934da012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff72de34fd4f59dcef28fd6a60f2fcbf276fdb9ae494473bb0265b64bc5001f7104b0700006a47304402205797eb9a000e9cb19b258e4dfe927ef647013122aacbd017469b92243a58ff5902203595440f7095c434574f298a86e279c158aa5d5a3c7052388ebb18851a5db78a012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff893cd3ef8130644b74d8f936e82595ca18ec095ca47a23233f4fffeda7e58c52430000006b483045022100d3e0662d420df1d2bd8c3ae3690adc005a5e2ac1ce82a7ffdb2c7f04e2483929022067196650e670abfc141a22f6cdc2e3be1cbaa8f3d7e58180caa868fbe7c29c06012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff7741337671b30cf29649d5f375332bfc3af8fefc3fb4704c7be4f5618843fda3360000006a473044022061db9a1f59eae734e414e7b5d3a3fbafd7b2d6876958641f98ece8a89756c8f80220739f2a3faaeeda4fcf855d81cf46be3d4eb065599ddb6e3d236016c401358dc7012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffffbd756bb55d6c80e929071c9171bbfa929fd434dfb1c11d2abb07b9a399958838390000006b483045022100f68a3b94ce1618b614eaecd52381c90ac0690f96dcc6b73896a15e34ec18576302205c72b3bd30b028e80597bf9230ab8a17f9029b8780d9802decef90db8ca70225012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffffdd18874296cf22078d7e2763b6c65451a6046c2050f86b0e1dcea83c5e450966230500006a473044022013b0623171e46dff5650499955e3339ebae67ad08070d21dda98515660115878022005c5e1717ba46a4992c15b4f9c683443a56227b5477b60cd96526033a043e461012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff30d17fa1464f3ee104ac73d36415ee929bd00aa0771110230739f3766c0572d3ee0100006b483045022100bc7f78de139843473cefb5e359828d74a49f58e94eb500741abcb9a346fdcb04022018fd4c13bf96206546b7d61e5fb15bc0176774fde2a7e3ffa7a55d095b1c34eb012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff7535ad709eee6d0c61f5670afb1613303a85195c7e81f9717e3d06316900634e290200006b4830450221008209ada22fd6f580d385fcdd03769295a28eab3ef39870665ad39a47464560af0220153642331e1cfbfe8111db19c15aa09fb5e5d336bbde270d0ec0e9eb52300da6012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff0ac876832debadeaf7b7fdcbdd09cda529b7ea962e34a433c89addf557e09e97390000006b483045022100e3df4777911c982e60a97873af56ef90fbac0408807bada0cbbbf9c7eeb7387f022010e3113809d9d3091937d0465a5d1a612728d1393e34313a1c589144a6bb6c15012102d25ecbeb1898e8b050e508da1c1655594869512a6fb172000f690e612b0676daffffffff02d8030000000000001976a9145978eb0c5724b0724478fc0ec651cc603c27258288ac08c90100000000001976a9141651fef006ab0ad0f4014d3b0a127a945b947b0e88ac000000000100000006161bbf26e83f566300cc382d948a94252750b8cbcec13e9a669817a11fb61f49450000006b483045022100f6a96333a865bd4d1adf14080fe18c76c1db5a493131100847616ed44a5b74ec0220680ec2afdda4a31c413d73665d388ce542f6d5f9a430bfaa588e48f19ed7fe15012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff47be55af3052320ebf5257de244e1b6ad33b6fa3e14e5822049ca50cd5f82c17850000006b483045022100e432633fb1f043a59632e1eb4911db10536eadf9cdc19f4e09e70ddf4e274d810220131c9b14a5acce5815ad4bf92921bd377bb685ff3b7f947583fe2dec84efacb7012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff10bff1960f98239427ee5beca495269f38b03d08fd3a2d87b94e9d3020f9edb6bf0500006b483045022100b33699cc861f5f5eca33161f1777f208be0108bf4079ce52d14fd0d68c40319d02207e97fdd1f7a69da9c0dd5c098962ef642d7b81e1faa2580eaf38f207a852d671012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff90decc43b6d900d53c0c9fd1609c50b6b97b2853be27046b534864bf9eb3002e190000006a473044022066f974a70cc86edc2b8675853f7a0c024cf36a9fff804872a95967f54070515d022006520defc864b59fac6eaf8a3747096389bd9f907cd02153f280af6159920f39012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff8b41bfadb911a722fc423944953b4e2d5952b364b53f56e45af1ea3f8d007ce1210100006a47304402204ccde391a43155fa75165ea9f609f82637548283d047197ac64e40c854630b300220444e75376a8cfb1852edb39021b078e4ed29674c35e2f41a72ae10772bbf38da012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff3237743d3b1999927d4190e1c452d9ef98ed8d821d03f635b4b15e71e1dd5cd6680000006b483045022100b96d784a7b063b17d2adaaa4d11335df5d42e988703db6390b1ef020d4074911022064b1cb831a479d57f01c407ce68fac31a138eeef9adc75e4aa958c9e73134712012103fd3d2c65beef2b22b8ffd69f9abc4c737dbd71104fdc8c8effab6db1aff46343ffffffff013cb00100000000001976a91427276168ff506f57631e733e921d96a63d2fb4f988ac00000000';
- var x = Block.fromBuffer(networkBlock);
- x.toBuffer().toString('hex').should.equal(networkBlock);
- });
-
- });
-
- describe('#fromBufferReader', function() {
-
- it('should make a block from this known buffer', function() {
- var block = Block.fromBufferReader(BufferReader(blockbuf));
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should recover a block from this known buffer', function() {
- var block = Block.fromBuffer(blockbuf);
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- });
-
- describe('#toBufferWriter', function() {
-
- it('should recover a block from this known buffer', function() {
- var block = Block.fromBuffer(blockbuf);
- block.toBufferWriter().concat().toString('hex').should.equal(blockhex);
- });
-
- it('doesn\'t create a bufferWriter if one provided', function() {
- var writer = new BufferWriter();
- var block = Block.fromBuffer(blockbuf);
- block.toBufferWriter(writer).should.equal(writer);
- });
-
- });
-
- describe('#toObject', function() {
-
- it('should recover a block from genesis block buffer', function() {
- var block = Block.fromBuffer(blockOneBuf);
- block.id.should.equal(blockOneId);
- block.toObject().should.deep.equal({
- header: {
- hash: '00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048',
- version: 1,
- prevHash: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f',
- merkleRoot: '0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098',
- time: 1231469665,
- bits: 486604799,
- nonce: 2573394689
- },
- transactions: [{
- hash: '0e3e2357e806b6cdb1f70b54c3a3a17b6714ee1f0e68bebb44a74b1efd512098',
- version: 1,
- inputs: [{
- prevTxId: '0000000000000000000000000000000000000000000000000000000000000000',
- outputIndex: 4294967295,
- sequenceNumber: 4294967295,
- script: '04ffff001d0104'
- }],
- outputs: [{
- satoshis: 5000000000,
- script: '410496b538e853519c726a2c91e61ec11600ae1390813a627c66fb8be7947be63c' +
- '52da7589379515d4e0a604f8141781e62294721166bf621e73a82cbf2342c858eeac'
- }],
- nLockTime: 0
- }]
- });
- });
-
- it('roundtrips correctly', function() {
- var block = Block.fromBuffer(blockOneBuf);
- var obj = block.toObject();
- var block2 = Block.fromObject(obj);
- block2.toObject().should.deep.equal(block.toObject());
- });
-
- });
-
- describe('#_getHash', function() {
-
- it('should return the correct hash of the genesis block', function() {
- var block = Block.fromBuffer(genesisbuf);
- var blockhash = new Buffer(Array.apply([], new Buffer(genesisidhex, 'hex')).reverse());
- block._getHash().toString('hex').should.equal(blockhash.toString('hex'));
- });
- });
-
- describe('#id', function() {
-
- it('should return the correct id of the genesis block', function() {
- var block = Block.fromBuffer(genesisbuf);
- block.id.should.equal(genesisidhex);
- });
- it('"hash" should be the same as "id"', function() {
- var block = Block.fromBuffer(genesisbuf);
- block.id.should.equal(block.hash);
- });
-
- });
-
- describe('#inspect', function() {
-
- it('should return the correct inspect of the genesis block', function() {
- var block = Block.fromBuffer(genesisbuf);
- block.inspect().should.equal('');
- });
-
- });
-
- describe('#merkleRoot', function() {
-
- it('should describe as valid merkle root', function() {
- var x = Block.fromRawBlock(dataRawBlockBinary);
- var valid = x.validMerkleRoot();
- valid.should.equal(true);
- });
-
- it('should describe as invalid merkle root', function() {
- var x = Block.fromRawBlock(dataRawBlockBinary);
- x.transactions.push(new Transaction());
- var valid = x.validMerkleRoot();
- valid.should.equal(false);
- });
-
- it('should get a null hash merkle root', function() {
- var x = Block.fromRawBlock(dataRawBlockBinary);
- x.transactions = []; // empty the txs
- var mr = x.getMerkleRoot();
- mr.should.deep.equal(Block.Values.NULL_HASH);
- });
-
- });
-
-});
diff --git a/test/block/blockheader.js b/test/block/blockheader.js
deleted file mode 100644
index 07e5008..0000000
--- a/test/block/blockheader.js
+++ /dev/null
@@ -1,302 +0,0 @@
-'use strict';
-
-var bitcore = require('../..');
-var BN = require('../../lib/crypto/bn');
-var BufferReader = bitcore.encoding.BufferReader;
-var BufferWriter = bitcore.encoding.BufferWriter;
-
-var BlockHeader = bitcore.BlockHeader;
-var fs = require('fs');
-var should = require('chai').should();
-
-// https://test-insight.bitpay.com/block/000000000b99b16390660d79fcc138d2ad0c89a0d044c4201a02bdf1f61ffa11
-var dataRawBlockBuffer = fs.readFileSync('test/data/blk86756-testnet.dat');
-var dataRawBlockBinary = fs.readFileSync('test/data/blk86756-testnet.dat', 'binary');
-var dataRawId = '000000000b99b16390660d79fcc138d2ad0c89a0d044c4201a02bdf1f61ffa11';
-var data = require('../data/blk86756-testnet');
-
-describe('BlockHeader', function() {
-
- var version = data.version;
- var prevblockidbuf = new Buffer(data.prevblockidhex, 'hex');
- var merklerootbuf = new Buffer(data.merkleroothex, 'hex');
- var time = data.time;
- var bits = data.bits;
- var nonce = data.nonce;
- var bh = new BlockHeader({
- version: version,
- prevHash: prevblockidbuf,
- merkleRoot: merklerootbuf,
- time: time,
- bits: bits,
- nonce: nonce
- });
- var bhhex = data.blockheaderhex;
- var bhbuf = new Buffer(bhhex, 'hex');
-
- it('should make a new blockheader', function() {
- BlockHeader(bhbuf).toBuffer().toString('hex').should.equal(bhhex);
- });
-
- it('should not make an empty block', function() {
- (function() {
- BlockHeader();
- }).should.throw('Unrecognized argument for BlockHeader');
- });
-
- describe('#constructor', function() {
-
- it('should set all the variables', function() {
- var bh = new BlockHeader({
- version: version,
- prevHash: prevblockidbuf,
- merkleRoot: merklerootbuf,
- time: time,
- bits: bits,
- nonce: nonce
- });
- should.exist(bh.version);
- should.exist(bh.prevHash);
- should.exist(bh.merkleRoot);
- should.exist(bh.time);
- should.exist(bh.bits);
- should.exist(bh.nonce);
- });
-
- it('will throw an error if the argument object hash property doesn\'t match', function() {
- (function() {
- var bh = new BlockHeader({
- hash: '000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f',
- version: version,
- prevHash: prevblockidbuf,
- merkleRoot: merklerootbuf,
- time: time,
- bits: bits,
- nonce: nonce
- });
- }).should.throw('Argument object hash property does not match block hash.');
- });
-
- });
-
- describe('version', function() {
- it('is interpreted as an int32le', function() {
- var hex = 'ffffffff00000000000000000000000000000000000000000000000000000000000000004141414141414141414141414141414141414141414141414141414141414141010000000200000003000000';
- var header = BlockHeader.fromBuffer(new Buffer(hex, 'hex'));
- header.version.should.equal(-1);
- header.timestamp.should.equal(1);
- });
- });
-
-
- describe('#fromObject', function() {
-
- it('should set all the variables', function() {
- var bh = BlockHeader.fromObject({
- version: version,
- prevHash: prevblockidbuf.toString('hex'),
- merkleRoot: merklerootbuf.toString('hex'),
- time: time,
- bits: bits,
- nonce: nonce
- });
- should.exist(bh.version);
- should.exist(bh.prevHash);
- should.exist(bh.merkleRoot);
- should.exist(bh.time);
- should.exist(bh.bits);
- should.exist(bh.nonce);
- });
-
- });
-
- describe('#toJSON', function() {
-
- it('should set all the variables', function() {
- var json = bh.toJSON();
- should.exist(json.version);
- should.exist(json.prevHash);
- should.exist(json.merkleRoot);
- should.exist(json.time);
- should.exist(json.bits);
- should.exist(json.nonce);
- });
-
- });
-
- describe('#fromJSON', function() {
-
- it('should parse this known json string', function() {
-
- var jsonString = JSON.stringify({
- version: version,
- prevHash: prevblockidbuf,
- merkleRoot: merklerootbuf,
- time: time,
- bits: bits,
- nonce: nonce
- });
-
- var json = new BlockHeader(JSON.parse(jsonString));
- should.exist(json.version);
- should.exist(json.prevHash);
- should.exist(json.merkleRoot);
- should.exist(json.time);
- should.exist(json.bits);
- should.exist(json.nonce);
- });
-
- });
-
- describe('#fromString/#toString', function() {
-
- it('should output/input a block hex string', function() {
- var b = BlockHeader.fromString(bhhex);
- b.toString().should.equal(bhhex);
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should parse this known buffer', function() {
- BlockHeader.fromBuffer(bhbuf).toBuffer().toString('hex').should.equal(bhhex);
- });
-
- });
-
- describe('#fromBufferReader', function() {
-
- it('should parse this known buffer', function() {
- BlockHeader.fromBufferReader(BufferReader(bhbuf)).toBuffer().toString('hex').should.equal(bhhex);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should output this known buffer', function() {
- BlockHeader.fromBuffer(bhbuf).toBuffer().toString('hex').should.equal(bhhex);
- });
-
- });
-
- describe('#toBufferWriter', function() {
-
- it('should output this known buffer', function() {
- BlockHeader.fromBuffer(bhbuf).toBufferWriter().concat().toString('hex').should.equal(bhhex);
- });
-
- it('doesn\'t create a bufferWriter if one provided', function() {
- var writer = new BufferWriter();
- var blockHeader = BlockHeader.fromBuffer(bhbuf);
- blockHeader.toBufferWriter(writer).should.equal(writer);
- });
-
- });
-
- describe('#inspect', function() {
-
- it('should return the correct inspect of the genesis block', function() {
- var block = BlockHeader.fromRawBlock(dataRawBlockBinary);
- block.inspect().should.equal('');
- });
-
- });
-
- describe('#fromRawBlock', function() {
-
- it('should instantiate from a raw block binary', function() {
- var x = BlockHeader.fromRawBlock(dataRawBlockBinary);
- x.version.should.equal(2);
- new BN(x.bits).toString('hex').should.equal('1c3fffc0');
- });
-
- it('should instantiate from raw block buffer', function() {
- var x = BlockHeader.fromRawBlock(dataRawBlockBuffer);
- x.version.should.equal(2);
- new BN(x.bits).toString('hex').should.equal('1c3fffc0');
- });
-
- });
-
- describe('#validTimestamp', function() {
-
- var x = BlockHeader.fromRawBlock(dataRawBlockBuffer);
-
- it('should validate timpstamp as true', function() {
- var valid = x.validTimestamp(x);
- valid.should.equal(true);
- });
-
-
- it('should validate timestamp as false', function() {
- x.time = Math.round(new Date().getTime() / 1000) + BlockHeader.Constants.MAX_TIME_OFFSET + 100;
- var valid = x.validTimestamp(x);
- valid.should.equal(false);
- });
-
- });
-
- describe('#validProofOfWork', function() {
-
- it('should validate proof-of-work as true', function() {
- var x = BlockHeader.fromRawBlock(dataRawBlockBuffer);
- var valid = x.validProofOfWork(x);
- valid.should.equal(true);
-
- });
-
- it('should validate proof of work as false because incorrect proof of work', function() {
- var x = BlockHeader.fromRawBlock(dataRawBlockBuffer);
- var nonce = x.nonce;
- x.nonce = 0;
- var valid = x.validProofOfWork(x);
- valid.should.equal(false);
- x.nonce = nonce;
- });
-
- });
-
- describe('#getDifficulty', function() {
- it('should get the correct difficulty for block 86756', function() {
- var x = BlockHeader.fromRawBlock(dataRawBlockBuffer);
- x.bits.should.equal(0x1c3fffc0);
- x.getDifficulty().should.equal(4);
- });
-
- it('should get the correct difficulty for testnet block 552065', function() {
- var x = new BlockHeader({
- bits: 0x1b00c2a8
- });
- x.getDifficulty().should.equal(86187.62562209);
- });
-
- it('should get the correct difficulty for livenet block 373043', function() {
- var x = new BlockHeader({
- bits: 0x18134dc1
- });
- x.getDifficulty().should.equal(56957648455.01001);
- });
-
- it('should get the correct difficulty for livenet block 340000', function() {
- var x = new BlockHeader({
- bits: 0x1819012f
- });
- x.getDifficulty().should.equal(43971662056.08958);
- });
-
- it('should use exponent notation if difficulty is larger than Javascript number', function() {
- var x = new BlockHeader({
- bits: 0x0900c2a8
- });
- x.getDifficulty().should.equal(1.9220482782645836 * 1e48);
- });
- });
-
- it('coverage: caches the "_id" property', function() {
- var blockHeader = BlockHeader.fromRawBlock(dataRawBlockBuffer);
- blockHeader.id.should.equal(blockHeader.id);
- });
-
-});
diff --git a/test/block/merkleblock.js b/test/block/merkleblock.js
deleted file mode 100644
index 4eb78e4..0000000
--- a/test/block/merkleblock.js
+++ /dev/null
@@ -1,230 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-
-var bitcore = require('../..');
-var MerkleBlock = bitcore.MerkleBlock;
-var BufferReader = bitcore.encoding.BufferReader;
-var BufferWriter = bitcore.encoding.BufferWriter;
-var Transaction = bitcore.Transaction;
-var data = require('../data/merkleblocks.js');
-var transactionVector = require('../data/tx_creation');
-
-
-describe('MerkleBlock', function() {
- var blockhex = data.HEX[0];
- var blockbuf = new Buffer(blockhex,'hex');
- var blockJSON = JSON.stringify(data.JSON[0]);
- var blockObject = JSON.parse(JSON.stringify(data.JSON[0]));
-
- describe('#constructor', function() {
- it('should make a new merkleblock from buffer', function() {
- var b = MerkleBlock(blockbuf);
- b.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- it('should make a new merkleblock from object', function() {
- var b = MerkleBlock(blockObject);
- b.toObject().should.deep.equal(blockObject);
- });
-
- it('should make a new merkleblock from JSON', function() {
- var b = MerkleBlock(JSON.parse(blockJSON));
- JSON.stringify(b).should.equal(blockJSON);
- });
-
- it('should not make an empty block', function() {
- (function() {
- return new MerkleBlock();
- }).should.throw('Unrecognized argument for MerkleBlock');
- });
- });
-
- describe('#fromObject', function() {
-
- it('should set these known values', function() {
- var block = MerkleBlock.fromObject(JSON.parse(blockJSON));
- should.exist(block.header);
- should.exist(block.numTransactions);
- should.exist(block.hashes);
- should.exist(block.flags);
- });
-
- it('should set these known values', function() {
- var block = MerkleBlock(JSON.parse(blockJSON));
- should.exist(block.header);
- should.exist(block.numTransactions);
- should.exist(block.hashes);
- should.exist(block.flags);
- });
-
- it('accepts an object as argument', function() {
- var block = MerkleBlock(blockbuf);
- MerkleBlock.fromObject(block.toObject()).should.exist();
- });
-
- });
-
- describe('#toJSON', function() {
-
- it('should recover these known values', function() {
- var block = new MerkleBlock(JSON.parse(blockJSON));
- var b = JSON.parse(JSON.stringify(block));
- should.exist(block.header);
- should.exist(block.numTransactions);
- should.exist(block.hashes);
- should.exist(block.flags);
- should.exist(b.header);
- should.exist(b.numTransactions);
- should.exist(b.hashes);
- should.exist(b.flags);
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should make a block from this known buffer', function() {
- var block = MerkleBlock.fromBuffer(blockbuf);
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- });
-
- describe('#fromBufferReader', function() {
-
- it('should make a block from this known buffer', function() {
- var block = MerkleBlock.fromBufferReader(BufferReader(blockbuf));
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should recover a block from this known buffer', function() {
- var block = MerkleBlock.fromBuffer(blockbuf);
- block.toBuffer().toString('hex').should.equal(blockhex);
- });
-
- });
-
- describe('#toBufferWriter', function() {
-
- it('should recover a block from this known buffer', function() {
- var block = MerkleBlock.fromBuffer(blockbuf);
- block.toBufferWriter().concat().toString('hex').should.equal(blockhex);
- });
-
- it('doesn\'t create a bufferWriter if one provided', function() {
- var writer = new BufferWriter();
- var block = MerkleBlock.fromBuffer(blockbuf);
- block.toBufferWriter(writer).should.equal(writer);
- });
-
- });
-
-
- describe('#validMerkleTree', function() {
-
- it('should validate good merkleblocks', function() {
- data.JSON.forEach(function(data) {
- var b = MerkleBlock(data);
- b.validMerkleTree().should.equal(true);
- });
- });
-
- it('should not validate merkleblocks with too many hashes', function() {
- var b = MerkleBlock(data.JSON[0]);
- // Add too many hashes
- var i = 0;
- while(i <= b.numTransactions) {
- b.hashes.push('bad' + i++);
- }
- b.validMerkleTree().should.equal(false);
- });
-
- it('should not validate merkleblocks with too few bit flags', function() {
- var b = MerkleBlock(JSON.parse(blockJSON));
- b.flags.pop();
- b.validMerkleTree().should.equal(false);
- });
-
- });
-
- describe('#filterdTxsHash', function() {
-
- it('should validate good merkleblocks', function() {
- var hashOfFilteredTx = '6f64fd5aa9dd01f74c03656d376625cf80328d83d9afebe60cc68b8f0e245bd9'
- var b = MerkleBlock(data.JSON[3]);
- b.filterdTxsHash()[0].should.equal(hashOfFilteredTx);
- });
-
- it('should fail with merkleblocks with too many hashes', function() {
- var b = MerkleBlock(data.JSON[0]);
- // Add too many hashes
- var i = 0;
- while(i <= b.numTransactions) {
- b.hashes.push('bad' + i++);
- }
- (function() {
- b.filterdTxsHash();
- }).should.throw('This MerkleBlock contain an invalid Merkle Tree');
- });
-
- it('should fail with merkleblocks with too few bit flags', function() {
- var b = MerkleBlock(JSON.parse(blockJSON));
- b.flags.pop();
- (function() {
- b.filterdTxsHash();
- }).should.throw('This MerkleBlock contain an invalid Merkle Tree');
- });
-
- });
-
- describe('#hasTransaction', function() {
-
- it('should find transactions via hash string', function() {
- var jsonData = data.JSON[0];
- var txId = new Buffer(jsonData.hashes[1],'hex').toString('hex');
- var b = MerkleBlock(jsonData);
- b.hasTransaction(txId).should.equal(true);
- b.hasTransaction(txId + 'abcd').should.equal(false);
- });
-
- it('should find transactions via Transaction object', function() {
- var jsonData = data.JSON[0];
- var txBuf = new Buffer(data.TXHEX[0][0],'hex');
- var tx = new Transaction().fromBuffer(txBuf);
- var b = MerkleBlock(jsonData);
- b.hasTransaction(tx).should.equal(true);
- });
-
- it('should not find non-existant Transaction object', function() {
- // Reuse another transaction already in data/ dir
- var serialized = transactionVector[0][7];
- var tx = new Transaction().fromBuffer(new Buffer(serialized, 'hex'));
- var b = MerkleBlock(data.JSON[0]);
- b.hasTransaction(tx).should.equal(false);
- });
-
- it('should not match with merkle nodes', function() {
- var b = MerkleBlock(data.JSON[0]);
-
- var hashData = [
- ['3612262624047ee87660be1a707519a443b1c1ce3d248cbfc6c15870f6c5daa2', false],
- ['019f5b01d4195ecbc9398fbf3c3b1fa9bb3183301d7a1fb3bd174fcfa40a2b65', true],
- ['41ed70551dd7e841883ab8f0b16bf04176b7d1480e4f0af9f3d4c3595768d068', false],
- ['20d2a7bc994987302e5b1ac80fc425fe25f8b63169ea78e68fbaaefa59379bbf', false]
- ];
-
- hashData.forEach(function check(d){
- b.hasTransaction(d[0]).should.equal(d[1]);
- });
-
- });
-
- });
-
-});
-
diff --git a/test/crypto/bn.js b/test/crypto/bn.js
deleted file mode 100644
index 085b40c..0000000
--- a/test/crypto/bn.js
+++ /dev/null
@@ -1,153 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var BN = bitcore.crypto.BN;
-
-describe('BN', function() {
- it('should create a bn', function() {
- var bn = new BN(50);
- should.exist(bn);
- bn.toString().should.equal('50');
- });
-
- it('should parse this number', function() {
- var bn = new BN(999970000);
- bn.toString().should.equal('999970000');
- });
-
- it('should parse numbers below and at bn.js internal word size', function() {
- var bn = new BN(Math.pow(2, 26) - 1);
- bn.toString().should.equal((Math.pow(2, 26) - 1).toString());
- bn = new BN(Math.pow(2, 26));
- bn.toString().should.equal((Math.pow(2, 26)).toString());
- });
-
- describe('#add', function() {
-
- it('should add two small numbers together', function() {
- var bn1 = new BN(50);
- var bn2 = new BN(75);
- var bn3 = bn1.add(bn2);
- bn3.toString().should.equal('125');
- });
-
- });
-
- describe('#sub', function() {
-
- it('should subtract a small number', function() {
- var bn1 = new BN(50);
- var bn2 = new BN(25);
- var bn3 = bn1.sub(bn2);
- bn3.toString().should.equal('25');
- });
-
- });
-
- describe('#gt', function() {
-
- it('should say 1 is greater than 0', function() {
- var bn1 = new BN(1);
- var bn0 = new BN(0);
- bn1.gt(bn0).should.equal(true);
- });
-
- it('should say a big number is greater than a small big number', function() {
- var bn1 = new BN('24023452345398529485723980457');
- var bn0 = new BN('34098234283412341234049357');
- bn1.gt(bn0).should.equal(true);
- });
-
- it('should say a big number is great than a standard number', function() {
- var bn1 = new BN('24023452345398529485723980457');
- var bn0 = new BN(5);
- bn1.gt(bn0).should.equal(true);
- });
-
- });
-
- describe('to/from ScriptNumBuffer', function() {
- [0, 1, 10, 256, 1000, 65536, 65537, -1, -1000, -65536, -65537].forEach(function(n) {
- it('rountrips correctly for ' + n, function() {
- BN.fromScriptNumBuffer(new BN(n).toScriptNumBuffer()).toNumber().should.equal(n);
- });
- });
- });
-
- describe('#fromString', function() {
- it('should make BN from a string', function() {
- BN.fromString('5').toString().should.equal('5');
- });
- it('should work with hex string', function() {
- BN.fromString('7fffff0000000000000000000000000000000000000000000000000000000000', 16)
- .toString(16).should.equal('7fffff0000000000000000000000000000000000000000000000000000000000');
- });
- });
-
- describe('#toString', function() {
- it('should make a string', function() {
- new BN(5).toString().should.equal('5');
- });
- });
-
- describe('@fromBuffer', function() {
-
- it('should work with big endian', function() {
- var bn = BN.fromBuffer(new Buffer('0001', 'hex'), {
- endian: 'big'
- });
- bn.toString().should.equal('1');
- });
-
- it('should work with big endian 256', function() {
- var bn = BN.fromBuffer(new Buffer('0100', 'hex'), {
- endian: 'big'
- });
- bn.toString().should.equal('256');
- });
-
- it('should work with little endian if we specify the size', function() {
- var bn = BN.fromBuffer(new Buffer('0100', 'hex'), {
- size: 2,
- endian: 'little'
- });
- bn.toString().should.equal('1');
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should create a 4 byte buffer', function() {
- var bn = new BN(1);
- bn.toBuffer({
- size: 4
- }).toString('hex').should.equal('00000001');
- });
-
- it('should create a 4 byte buffer in little endian', function() {
- var bn = new BN(1);
- bn.toBuffer({
- size: 4,
- endian: 'little'
- }).toString('hex').should.equal('01000000');
- });
-
- it('should create a 2 byte buffer even if you ask for a 1 byte', function() {
- var bn = new BN('ff00', 16);
- bn.toBuffer({
- size: 1
- }).toString('hex').should.equal('ff00');
- });
-
- it('should create a 4 byte buffer even if you ask for a 1 byte', function() {
- var bn = new BN('ffffff00', 16);
- bn.toBuffer({
- size: 4
- }).toString('hex').should.equal('ffffff00');
- });
-
- });
-
-});
diff --git a/test/crypto/ecdsa.js b/test/crypto/ecdsa.js
deleted file mode 100644
index 1ddae96..0000000
--- a/test/crypto/ecdsa.js
+++ /dev/null
@@ -1,325 +0,0 @@
-'use strict';
-
-var ECDSA = require('../../lib/crypto/ecdsa');
-var Hash = require('../../lib/crypto/hash');
-var Privkey = require('../../lib/privatekey');
-var Pubkey = require('../../lib/publickey');
-var Signature = require('../../lib/crypto/signature');
-var BN = require('../../lib/crypto/bn');
-var point = require('../../lib/crypto/point');
-var should = require('chai').should();
-var vectors = require('../data/ecdsa');
-
-describe('ECDSA', function() {
-
- it('instantiation', function() {
- var ecdsa = new ECDSA();
- should.exist(ecdsa);
- });
-
- var ecdsa = new ECDSA();
- ecdsa.hashbuf = Hash.sha256(new Buffer('test data'));
- ecdsa.privkey = new Privkey(BN.fromBuffer(
- new Buffer('fee0a1f7afebf9d2a5a80c0c98a31c709681cce195cbcd06342b517970c0be1e', 'hex')
- ));
- ecdsa.privkey2pubkey();
-
- describe('#set', function() {
- it('sets hashbuf', function() {
- should.exist(ECDSA().set({
- hashbuf: ecdsa.hashbuf
- }).hashbuf);
- });
- });
-
- describe('#calci', function() {
- it('calculates i correctly', function() {
- ecdsa.randomK();
- ecdsa.sign();
- ecdsa.calci();
- should.exist(ecdsa.sig.i);
- });
-
- it('calulates this known i', function() {
- var hashbuf = Hash.sha256(new Buffer('some data'));
- var r = new BN('71706645040721865894779025947914615666559616020894583599959600180037551395766', 10);
- var s = new BN('109412465507152403114191008482955798903072313614214706891149785278625167723646', 10);
- var ecdsa = new ECDSA({
- privkey: new Privkey(BN.fromBuffer(Hash.sha256(new Buffer('test')))),
- hashbuf: hashbuf,
- sig: new Signature({
- r: r,
- s: s
- })
- });
-
- ecdsa.calci();
- ecdsa.sig.i.should.equal(1);
- });
-
- });
-
- describe('#fromString', function() {
-
- it('round trip with fromString', function() {
- var str = ecdsa.toString();
- var ecdsa2 = new ECDSA.fromString(str);
- should.exist(ecdsa2.hashbuf);
- should.exist(ecdsa2.privkey);
- });
-
- });
-
- describe('#randomK', function() {
-
- it('should generate a new random k when called twice in a row', function() {
- ecdsa.randomK();
- var k1 = ecdsa.k;
- ecdsa.randomK();
- var k2 = ecdsa.k;
- (k1.cmp(k2) === 0).should.equal(false);
- });
-
- it('should generate a random k that is (almost always) greater than this relatively small number', function() {
- ecdsa.randomK();
- var k1 = ecdsa.k;
- var k2 = new BN(Math.pow(2, 32)).mul(new BN(Math.pow(2, 32))).mul(new BN(Math.pow(2, 32)));
- k2.gt(k1).should.equal(false);
- });
-
- });
-
- describe('#deterministicK', function() {
- it('should generate the same deterministic k', function() {
- ecdsa.deterministicK();
- ecdsa.k.toBuffer().toString('hex')
- .should.equal('fcce1de7a9bcd6b2d3defade6afa1913fb9229e3b7ddf4749b55c4848b2a196e');
- });
- it('should generate the same deterministic k if badrs is set', function() {
- ecdsa.deterministicK(0);
- ecdsa.k.toBuffer().toString('hex')
- .should.equal('fcce1de7a9bcd6b2d3defade6afa1913fb9229e3b7ddf4749b55c4848b2a196e');
- ecdsa.deterministicK(1);
- ecdsa.k.toBuffer().toString('hex')
- .should.not.equal('fcce1de7a9bcd6b2d3defade6afa1913fb9229e3b7ddf4749b55c4848b2a196e');
- ecdsa.k.toBuffer().toString('hex')
- .should.equal('727fbcb59eb48b1d7d46f95a04991fc512eb9dbf9105628e3aec87428df28fd8');
- });
- it('should compute this test vector correctly', function() {
- // test fixture from bitcoinjs
- // https://github.com/bitcoinjs/bitcoinjs-lib/blob/10630873ebaa42381c5871e20336fbfb46564ac8/test/fixtures/ecdsa.json#L6
- var ecdsa = new ECDSA();
- ecdsa.hashbuf = Hash.sha256(new Buffer('Everything should be made as simple as possible, but not simpler.'));
- ecdsa.privkey = new Privkey(new BN(1));
- ecdsa.privkey2pubkey();
- ecdsa.deterministicK();
- ecdsa.k.toBuffer().toString('hex')
- .should.equal('ec633bd56a5774a0940cb97e27a9e4e51dc94af737596a0c5cbb3d30332d92a5');
- ecdsa.sign();
- ecdsa.sig.r.toString()
- .should.equal('23362334225185207751494092901091441011938859014081160902781146257181456271561');
- ecdsa.sig.s.toString()
- .should.equal('50433721247292933944369538617440297985091596895097604618403996029256432099938');
- });
- });
-
- describe('#toPublicKey', function() {
- it('should calculate the correct public key', function() {
- ecdsa.k = new BN('114860389168127852803919605627759231199925249596762615988727970217268189974335', 10);
- ecdsa.sign();
- ecdsa.sig.i = 0;
- var pubkey = ecdsa.toPublicKey();
- pubkey.point.eq(ecdsa.pubkey.point).should.equal(true);
- });
-
- it('should calculate the correct public key for this signature with low s', function() {
- ecdsa.k = new BN('114860389168127852803919605627759231199925249596762615988727970217268189974335', 10);
- ecdsa.sig = Signature.fromString('3045022100ec3cfe0e335791ad278b4ec8eac93d0347' +
- 'a97877bb1d54d35d189e225c15f6650220278cf15b05ce47fb37d2233802899d94c774d5480bba9f0f2d996baa13370c43');
- ecdsa.sig.i = 0;
- var pubkey = ecdsa.toPublicKey();
- pubkey.point.eq(ecdsa.pubkey.point).should.equal(true);
- });
-
- it('should calculate the correct public key for this signature with high s', function() {
- ecdsa.k = new BN('114860389168127852803919605627759231199925249596762615988727970217268189974335', 10);
- ecdsa.sign();
- ecdsa.sig = Signature.fromString('3046022100ec3cfe0e335791ad278b4ec8eac93d0347' +
- 'a97877bb1d54d35d189e225c15f665022100d8730ea4fa31b804c82ddcc7fd766269f33a079ea38e012c9238f2e2bcff34fe');
- ecdsa.sig.i = 1;
- var pubkey = ecdsa.toPublicKey();
- pubkey.point.eq(ecdsa.pubkey.point).should.equal(true);
- });
-
- });
-
- describe('#sigError', function() {
-
- it('should return an error if the hash is invalid', function() {
- var ecdsa = new ECDSA();
- ecdsa.sigError().should.equal('hashbuf must be a 32 byte buffer');
- });
-
- it('should return an error if r, s are invalid', function() {
- var ecdsa = new ECDSA();
- ecdsa.hashbuf = Hash.sha256(new Buffer('test'));
- var pk = Pubkey.fromDER(new Buffer('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49' +
- '710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341', 'hex'));
- ecdsa.pubkey = pk;
- ecdsa.sig = new Signature();
- ecdsa.sig.r = new BN(0);
- ecdsa.sig.s = new BN(0);
- ecdsa.sigError().should.equal('r and s not in range');
- });
-
- it('should return an error if the signature is incorrect', function() {
- ecdsa.sig = Signature.fromString('3046022100e9915e6236695f093a4128ac2a956c40' +
- 'ed971531de2f4f41ba05fac7e2bd019c02210094e6a4a769cc7f2a8ab3db696c7cd8d56bcdbfff860a8c81de4bc6a798b90827');
- ecdsa.sig.r = ecdsa.sig.r.add(new BN(1));
- ecdsa.sigError().should.equal('Invalid signature');
- });
-
- });
-
- describe('#sign', function() {
-
- it('should create a valid signature', function() {
- ecdsa.randomK();
- ecdsa.sign();
- ecdsa.verify().verified.should.equal(true);
- });
-
- it('should should throw an error if hashbuf is not 32 bytes', function() {
- var ecdsa2 = ECDSA().set({
- hashbuf: ecdsa.hashbuf.slice(0, 31),
- privkey: ecdsa.privkey
- });
- ecdsa2.randomK();
- ecdsa2.sign.bind(ecdsa2).should.throw('hashbuf must be a 32 byte buffer');
- });
-
- it('should default to deterministicK', function() {
- var ecdsa2 = new ECDSA(ecdsa);
- ecdsa2.k = undefined;
- var called = 0;
- var deterministicK = ecdsa2.deterministicK.bind(ecdsa2);
- ecdsa2.deterministicK = function() {
- deterministicK();
- called++;
- };
- ecdsa2.sign();
- called.should.equal(1);
- });
-
- it('should generate right K', function() {
- var msg1 = new Buffer('52204d20fd0131ae1afd173fd80a3a746d2dcc0cddced8c9dc3d61cc7ab6e966', 'hex');
- var msg2 = [].reverse.call(new Buffer(msg1))
- var pk = new Buffer('16f243e962c59e71e54189e67e66cf2440a1334514c09c00ddcc21632bac9808', 'hex');
- var signature1 = ECDSA.sign(msg1, Privkey.fromBuffer(pk)).toBuffer().toString('hex');
- var signature2 = ECDSA.sign(msg2, Privkey.fromBuffer(pk), 'little').toBuffer().toString('hex');
- signature1.should.equal(signature2);
- });
-
- });
-
- describe('#toString', function() {
- it('should convert this to a string', function() {
- var str = ecdsa.toString();
- (typeof str === 'string').should.equal(true);
- });
- });
-
- describe('signing and verification', function() {
- describe('@sign', function() {
- it('should produce a signature', function() {
- var sig = ECDSA.sign(ecdsa.hashbuf, ecdsa.privkey);
- (sig instanceof Signature).should.equal(true);
- });
- it('should produce a signature, and be different when called twice', function() {
- ecdsa.signRandomK();
- should.exist(ecdsa.sig);
- var ecdsa2 = ECDSA(ecdsa);
- ecdsa2.signRandomK();
- ecdsa.sig.toString().should.not.equal(ecdsa2.sig.toString());
- });
- });
-
- describe('#verify', function() {
- it('should verify a signature that was just signed', function() {
- ecdsa.sig = Signature.fromString('3046022100e9915e6236695f093a4128ac2a956c' +
- '40ed971531de2f4f41ba05fac7e2bd019c02210094e6a4a769cc7f2a8ab3db696c7cd8d56bcdbfff860a8c81de4bc6a798b90827');
- ecdsa.verify().verified.should.equal(true);
- });
- it('should verify this known good signature', function() {
- ecdsa.signRandomK();
- ecdsa.verify().verified.should.equal(true);
- });
- it('should verify a valid signature, and unverify an invalid signature', function() {
- var sig = ECDSA.sign(ecdsa.hashbuf, ecdsa.privkey);
- ECDSA.verify(ecdsa.hashbuf, sig, ecdsa.pubkey).should.equal(true);
- var fakesig = new Signature(sig.r.add(new BN(1)), sig.s);
- ECDSA.verify(ecdsa.hashbuf, fakesig, ecdsa.pubkey).should.equal(false);
- });
- it('should work with big and little endian', function() {
- var sig = ECDSA.sign(ecdsa.hashbuf, ecdsa.privkey, 'big');
- ECDSA.verify(ecdsa.hashbuf, sig, ecdsa.pubkey, 'big').should.equal(true);
- ECDSA.verify(ecdsa.hashbuf, sig, ecdsa.pubkey, 'little').should.equal(false);
- sig = ECDSA.sign(ecdsa.hashbuf, ecdsa.privkey, 'little');
- ECDSA.verify(ecdsa.hashbuf, sig, ecdsa.pubkey, 'big').should.equal(false);
- ECDSA.verify(ecdsa.hashbuf, sig, ecdsa.pubkey, 'little').should.equal(true);
- });
- });
-
- describe('vectors', function() {
-
- vectors.valid.forEach(function(obj, i) {
- it('should validate valid vector ' + i, function() {
- var ecdsa = ECDSA().set({
- privkey: new Privkey(BN.fromBuffer(new Buffer(obj.d, 'hex'))),
- k: BN.fromBuffer(new Buffer(obj.k, 'hex')),
- hashbuf: Hash.sha256(new Buffer(obj.message)),
- sig: new Signature().set({
- r: new BN(obj.signature.r),
- s: new BN(obj.signature.s),
- i: obj.i
- })
- });
- var ecdsa2 = ECDSA(ecdsa);
- ecdsa2.k = undefined;
- ecdsa2.sign();
- ecdsa2.calci();
- ecdsa2.k.toString().should.equal(ecdsa.k.toString());
- ecdsa2.sig.toString().should.equal(ecdsa.sig.toString());
- ecdsa2.sig.i.should.equal(ecdsa.sig.i);
- ecdsa.verify().verified.should.equal(true);
- });
- });
-
- vectors.invalid.sigError.forEach(function(obj, i) {
- it('should validate invalid.sigError vector ' + i + ': ' + obj.description, function() {
- var ecdsa = ECDSA().set({
- pubkey: Pubkey.fromPoint(point.fromX(true, 1)),
- sig: new Signature(new BN(obj.signature.r), new BN(obj.signature.s)),
- hashbuf: Hash.sha256(new Buffer(obj.message))
- });
- ecdsa.sigError().should.equal(obj.exception);
- });
- });
-
- vectors.deterministicK.forEach(function(obj, i) {
- it('should validate deterministicK vector ' + i, function() {
- var hashbuf = Hash.sha256(new Buffer(obj.message));
- var privkey = Privkey(BN.fromBuffer(new Buffer(obj.privkey, 'hex')), 'mainnet');
- var ecdsa = ECDSA({
- privkey: privkey,
- hashbuf: hashbuf
- });
- ecdsa.deterministicK(0).k.toString('hex').should.equal(obj.k_bad00);
- ecdsa.deterministicK(1).k.toString('hex').should.equal(obj.k_bad01);
- ecdsa.deterministicK(15).k.toString('hex').should.equal(obj.k_bad15);
- });
- });
-
- });
- });
-});
diff --git a/test/crypto/hash.js b/test/crypto/hash.js
deleted file mode 100644
index c079fee..0000000
--- a/test/crypto/hash.js
+++ /dev/null
@@ -1,139 +0,0 @@
-'use strict';
-
-require('chai').should();
-var bitcore = require('../..');
-var Hash = bitcore.crypto.Hash;
-
-describe('Hash', function() {
- var buf = new Buffer([0, 1, 2, 3, 253, 254, 255]);
- var str = 'test string';
-
- describe('@sha1', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.sha1(buf);
- hash.toString('hex').should.equal('de69b8a4a5604d0486e6420db81e39eb464a17b2');
- hash = Hash.sha1(new Buffer(0));
- hash.toString('hex').should.equal('da39a3ee5e6b4b0d3255bfef95601890afd80709');
- });
-
- it('throws an error when the input is not a buffer', function() {
- Hash.sha1.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#sha256', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.sha256(buf);
- hash.toString('hex').should.equal('6f2c7b22fd1626998287b3636089087961091de80311b9279c4033ec678a83e8');
- });
-
- it('fails when the input is not a buffer', function() {
- Hash.sha256.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#sha256hmac', function() {
-
- it('computes this known big key correctly', function() {
- var key = new Buffer('b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad' +
- 'b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad' +
- 'b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad' +
- 'b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad');
- var data = new Buffer('');
- Hash.sha256hmac(data, key).toString('hex')
- .should.equal('fb1f87218671f1c0c4593a88498e02b6dfe8afd814c1729e89a1f1f6600faa23');
- });
-
- it('computes this known empty test vector correctly', function() {
- var key = new Buffer('');
- var data = new Buffer('');
- Hash.sha256hmac(data, key).toString('hex')
- .should.equal('b613679a0814d9ec772f95d778c35fc5ff1697c493715653c6c712144292c5ad');
- });
-
- it('computes this known non-empty test vector correctly', function() {
- var key = new Buffer('key');
- var data = new Buffer('The quick brown fox jumps over the lazy dog');
- Hash.sha256hmac(data, key).toString('hex')
- .should.equal('f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8');
- });
-
- });
-
- describe('#sha256sha256', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.sha256sha256(buf);
- hash.toString('hex').should.equal('be586c8b20dee549bdd66018c7a79e2b67bb88b7c7d428fa4c970976d2bec5ba');
- });
-
- it('fails when the input is not a buffer', function() {
- Hash.sha256sha256.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#sha256ripemd160', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.sha256ripemd160(buf);
- hash.toString('hex').should.equal('7322e2bd8535e476c092934e16a6169ca9b707ec');
- });
-
- it('fails when the input is not a buffer', function() {
- Hash.sha256ripemd160.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#ripemd160', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.ripemd160(buf);
- hash.toString('hex').should.equal('fa0f4565ff776fee0034c713cbf48b5ec06b7f5c');
- });
-
- it('fails when the input is not a buffer', function() {
- Hash.ripemd160.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#sha512', function() {
-
- it('calculates the hash of this buffer correctly', function() {
- var hash = Hash.sha512(buf);
- hash.toString('hex')
- .should.equal('c0530aa32048f4904ae162bc14b9eb535eab6c465e960130005fedd' +
- 'b71613e7d62aea75f7d3333ba06e805fc8e45681454524e3f8050969fe5a5f7f2392e31d0');
- });
-
- it('fails when the input is not a buffer', function() {
- Hash.sha512.bind(Hash, str).should.throw('Invalid Argument');
- });
-
- });
-
- describe('#sha512hmac', function() {
-
- it('calculates this known empty test vector correctly', function() {
- var hex = 'b936cee86c9f87aa5d3c6f2e84cb5a4239a5fe50480a6ec66b70ab5b1f4a' +
- 'c6730c6c515421b327ec1d69402e53dfb49ad7381eb067b338fd7b0cb22247225d47';
- Hash.sha512hmac(new Buffer([]), new Buffer([])).toString('hex').should.equal(hex);
- });
-
- it('calculates this known non-empty test vector correctly', function() {
- var hex = 'c40bd7c15aa493b309c940e08a73ffbd28b2e4cb729eb94480d727e4df577' +
- 'b13cc403a78e6150d83595f3b17c4cc331f12ca5952691de3735a63c1d4c69a2bac';
- var data = new Buffer('test1');
- var key = new Buffer('test2');
- Hash.sha512hmac(data, key).toString('hex').should.equal(hex);
- });
-
- });
-
-});
diff --git a/test/crypto/point.js b/test/crypto/point.js
deleted file mode 100644
index 95f5b53..0000000
--- a/test/crypto/point.js
+++ /dev/null
@@ -1,173 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var Point = bitcore.crypto.Point;
-var BN = bitcore.crypto.BN;
-
-describe('Point', function() {
-
- var valid = {
- x: 'ac242d242d23be966085a2b2b893d989f824e06c9ad0395a8a52f055ba39abb2',
- y: '4836ab292c105a711ed10fcfd30999c31ff7c02456147747e03e739ad527c380',
- };
-
- var invalidPair = {
- x: 'ac242d242d23be966085a2b2b893d989f824e06c9ad0395a8a52f055ba39abb2',
- y: '0000000000000000000000000000000000000000000000000000000000000000',
- };
-
- it('should create a point', function() {
- var p = Point(valid.x, valid.y);
- should.exist(p);
- });
-
- it('should create a point when called with "new"', function() {
- var p = new Point(valid.x,valid.y);
- should.exist(p);
- });
-
- describe('#getX', function() {
-
- it('should return x', function() {
- var p = Point(valid.x,valid.y);
- var x = p.getX();
- x.toString('hex', 64).should.equal(valid.x);
- });
-
- it('should be convertable to a buffer', function() {
- var p = Point(valid.x,valid.y);
- var a = p.getX().toBuffer({size: 32});
- a.length.should.equal(32);
- a.should.deep.equal(new Buffer(valid.x, 'hex'));
- });
-
- });
-
- describe('#getY', function() {
-
- it('should return y', function() {
- var p = Point(valid.x,valid.y);
- p.getY().toString('hex', 64).should.equal(valid.y);
- });
-
- it('should be convertable to a buffer', function() {
- var p = Point(valid.x,valid.y);
- var a = p.getY().toBuffer({size: 32});
- a.length.should.equal(32);
- a.should.deep.equal(new Buffer(valid.y, 'hex'));
- });
-
- });
-
- describe('#add', function() {
-
- it('should accurately add g to itself', function() {
- var p1 = Point.getG();
- var p2 = Point.getG();
- var p3 = p1.add(p2);
- p3.getX().toString().should.equal('89565891926547004231252920425935692360644145829622209'+
- '833684329913297188986597');
- p3.getY().toString().should.equal('12158399299693830322967808612713398636155367887041628'+
- '176798871954788371653930');
- });
-
- });
-
- describe('#mul', function() {
-
- it('should accurately multiply g by 2', function() {
- var g = Point.getG();
- var b = g.mul(new BN(2));
- b.getX().toString().should.equal('8956589192654700423125292042593569236064414582962220983'+
- '3684329913297188986597');
- b.getY().toString().should.equal('1215839929969383032296780861271339863615536788704162817'+
- '6798871954788371653930');
- });
-
- it('should accurately multiply g by n-1', function() {
- var g = Point.getG();
- var n = Point.getN();
- var b = g.mul(n.sub(new BN(1)));
- b.getX().toString().should.equal('55066263022277343669578718895168534326250603453777594175'+
- '500187360389116729240');
- b.getY().toString().should.equal('83121579216557378445487899878180864668798711284981320763'+
- '518679672151497189239');
- });
-
- //not sure if this is technically accurate or not...
- //normally, you should always multiply g by something less than n
- //but it is the same result in OpenSSL
- it('should accurately multiply g by n+1', function() {
- var g = Point.getG();
- var n = Point.getN();
- var b = g.mul(n.add(new BN(1)));
- b.getX().toString().should.equal('550662630222773436695787188951685343262506034537775941755'+
- '00187360389116729240');
- b.getY().toString().should.equal('326705100207588169780830851305070431844712733806592432759'+
- '38904335757337482424');
- });
-
- });
-
- describe('@fromX', function() {
-
- it('should return g', function() {
- var g = Point.getG();
- var p = Point.fromX(false, g.getX());
- g.eq(p).should.equal(true);
- });
-
- });
-
- describe('#validate', function() {
-
- it('should describe this point as valid', function() {
- var p = Point(valid.x, valid.y);
- should.exist(p.validate());
- });
-
- it('should describe this point as invalid because of zero y', function() {
- var x = 'ac242d242d23be966085a2b2b893d989f824e06c9ad0395a8a52f055ba39abb2';
- var y = '0000000000000000000000000000000000000000000000000000000000000000';
- (function() {
- var p = Point(x, y);
- }).should.throw('Invalid y value for curve.');
- });
-
-
- it('should describe this point as invalid because of invalid y', function() {
- var x = 'ac242d242d23be966085a2b2b893d989f824e06c9ad0395a8a52f055ba39abb2';
- var y = '00000000000000000000000000000000000000000000000000000000000000FF';
- (function() {
- var p = Point(x, y);
- }).should.throw('Invalid y value for curve.');
- });
-
-
- it('should describe this point as invalid because out of curve bounds', function() {
-
- // point larger than max
- var x = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEDCE6AF48A03BBFD25E8CD0364141';
- // calculated y of x
- var y = 'ed3970f129bc2ca7c7c6cf92fa7da4de6a1dfc9c14da4bf056aa868d3dd74034';
-
- (function() {
- // set the point
- var p = Point(x, y);
- }).should.throw('Point does not lie on the curve');
- });
-
- it('should describe this point as invalid because out of curve bounds', function() {
-
- var x = '0000000000000000000000000000000000000000000000000000000000000000';
-
- (function() {
- // set the point
- var p = Point.fromX(false, x);
- }).should.throw('Invalid X');
- });
-
- });
-
-});
diff --git a/test/crypto/random.js b/test/crypto/random.js
deleted file mode 100644
index cf08bc2..0000000
--- a/test/crypto/random.js
+++ /dev/null
@@ -1,36 +0,0 @@
-'use strict';
-
-var bitcore = require('../..');
-var Random = bitcore.crypto.Random;
-
-describe('Random', function() {
-
- describe('@getRandomBuffer', function() {
-
- it('should return a buffer', function() {
- var bytes = Random.getRandomBuffer(8);
- bytes.length.should.equal(8);
- Buffer.isBuffer(bytes).should.equal(true);
- });
-
- it('should not equate two 256 bit random buffers', function() {
- var bytes1 = Random.getRandomBuffer(32);
- var bytes2 = Random.getRandomBuffer(32);
- bytes1.toString('hex').should.not.equal(bytes2.toString('hex'));
- });
-
- it('should generate 100 8 byte buffers in a row that are not equal', function() {
- var hexs = [];
- for (var i = 0; i < 100; i++) {
- hexs[i] = Random.getRandomBuffer(8).toString('hex');
- }
- for (i = 0; i < 100; i++) {
- for (var j = i + 1; j < 100; j++) {
- hexs[i].should.not.equal(hexs[j]);
- }
- }
- });
-
- });
-
-});
diff --git a/test/crypto/signature.js b/test/crypto/signature.js
deleted file mode 100644
index 5ea73c0..0000000
--- a/test/crypto/signature.js
+++ /dev/null
@@ -1,340 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var should = require('chai').should();
-var bitcore = require('../..');
-var BN = bitcore.crypto.BN;
-var Signature = bitcore.crypto.Signature;
-var JSUtil = bitcore.util.js;
-var Interpreter = bitcore.Script.Interpreter;
-
-var sig_canonical = require('../data/bitcoind/sig_canonical');
-var sig_noncanonical = require('../data/bitcoind/sig_noncanonical');
-
-describe('Signature', function() {
-
- it('should make a blank signature', function() {
- var sig = new Signature();
- should.exist(sig);
- });
-
- it('should work with conveniently setting r, s', function() {
- var r = new BN();
- var s = new BN();
- var sig = new Signature(r, s);
- should.exist(sig);
- sig.r.toString().should.equal(r.toString());
- sig.s.toString().should.equal(s.toString());
- });
-
- describe('#set', function() {
-
- it('should set compressed', function() {
- should.exist(Signature().set({
- compressed: true
- }));
- });
-
- it('should set nhashtype', function() {
- var sig = Signature().set({
- nhashtype: Signature.SIGHASH_ALL
- });
- sig.nhashtype.should.equal(Signature.SIGHASH_ALL);
- sig.set({
- nhashtype: Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY
- });
- sig.nhashtype.should.equal(Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY);
- });
-
- });
-
- describe('#fromCompact', function() {
-
- it('should create a signature from a compressed signature', function() {
- var blank = new Buffer(32);
- blank.fill(0);
- var compressed = Buffer.concat([
- new Buffer([0 + 27 + 4]),
- blank,
- blank
- ]);
- var sig = Signature.fromCompact(compressed);
- sig.r.cmp(BN.Zero).should.equal(0);
- sig.s.cmp(BN.Zero).should.equal(0);
- sig.compressed.should.equal(true);
- });
-
- it('should create a signature from an uncompressed signature', function() {
- var sigHexaStr = '1cd5e61ab5bfd0d1450997894cb1a53e917f89d82eb43f06fa96f32c96e061aec12fc1188e8b' +
- '0dc553a2588be2b5b68dbbd7f092894aa3397786e9c769c5348dc6';
- var sig = Signature.fromCompact(new Buffer(sigHexaStr, 'hex'));
- var r = 'd5e61ab5bfd0d1450997894cb1a53e917f89d82eb43f06fa96f32c96e061aec1';
- var s = '2fc1188e8b0dc553a2588be2b5b68dbbd7f092894aa3397786e9c769c5348dc6';
- sig.r.toString('hex').should.equal(r);
- sig.s.toString('hex').should.equal(s);
- sig.compressed.should.equal(false);
- });
-
- });
-
- describe('#fromDER', function() {
-
- var buf = new Buffer('3044022075fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e62770220729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2', 'hex');
-
- it('should parse this DER format signature', function() {
- var sig = Signature.fromDER(buf);
- sig.r.toBuffer({
- size: 32
- }).toString('hex').should.equal('75fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e6277');
- sig.s.toBuffer({
- size: 32
- }).toString('hex').should.equal('729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2');
- });
-
- });
-
- describe('#fromString', function() {
-
- var buf = new Buffer('3044022075fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e62770220729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2', 'hex');
-
- it('should parse this DER format signature in hex', function() {
- var sig = Signature.fromString(buf.toString('hex'));
- sig.r.toBuffer({
- size: 32
- }).toString('hex').should.equal('75fc517e541bd54769c080b64397e32161c850f6c1b2b67a5c433affbb3e6277');
- sig.s.toBuffer({
- size: 32
- }).toString('hex').should.equal('729e85cc46ffab881065ec07694220e71d4df9b2b8c8fd12c3122cf3a5efbcf2');
- });
-
- });
-
- describe('#toTxFormat', function() {
-
- it('should parse this known signature and rebuild it with updated zero-padded sighash types', function() {
- var original = '30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e7201';
- var buf = new Buffer(original, 'hex');
- var sig = Signature.fromTxFormat(buf);
- sig.nhashtype.should.equal(Signature.SIGHASH_ALL);
- sig.set({
- nhashtype: Signature.SIGHASH_ALL | Signature.SIGHASH_ANYONECANPAY
- });
- sig.toTxFormat().toString('hex').should.equal(original.slice(0, -2) + '81');
- sig.set({
- nhashtype: Signature.SIGHASH_SINGLE
- });
- sig.toTxFormat().toString('hex').should.equal(original.slice(0, -2) + '03');
- });
-
- });
-
- describe('#fromTxFormat', function() {
-
- it('should convert from this known tx-format buffer', function() {
- var buf = new Buffer('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e7201', 'hex');
- var sig = Signature.fromTxFormat(buf);
- sig.r.toString().should.equal('63173831029936981022572627018246571655303050627048489594159321588908385378810');
- sig.s.toString().should.equal('4331694221846364448463828256391194279133231453999942381442030409253074198130');
- sig.nhashtype.should.equal(Signature.SIGHASH_ALL);
- });
-
- it('should parse this known signature and rebuild it', function() {
- var hex = '3044022007415aa37ce7eaa6146001ac8bdefca0ddcba0e37c5dc08c4ac99392124ebac802207d382307fd53f65778b07b9c63b6e196edeadf0be719130c5db21ff1e700d67501';
- var buf = new Buffer(hex, 'hex');
- var sig = Signature.fromTxFormat(buf);
- sig.toTxFormat().toString('hex').should.equal(hex);
- });
-
- });
-
- describe('#parseDER', function() {
-
- it('should parse this signature generated in node', function() {
- var sighex = '30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72';
- var sig = new Buffer(sighex, 'hex');
- var parsed = Signature.parseDER(sig);
- parsed.header.should.equal(0x30);
- parsed.length.should.equal(69);
- parsed.rlength.should.equal(33);
- parsed.rneg.should.equal(true);
- parsed.rbuf.toString('hex').should.equal('008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa');
- parsed.r.toString().should.equal('63173831029936981022572627018246571655303050627048489594159321588908385378810');
- parsed.slength.should.equal(32);
- parsed.sneg.should.equal(false);
- parsed.sbuf.toString('hex').should.equal('0993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72');
- parsed.s.toString().should.equal('4331694221846364448463828256391194279133231453999942381442030409253074198130');
- });
-
- it('should parse this 69 byte signature', function() {
- var sighex = '3043021f59e4705959cc78acbfcf8bd0114e9cc1b389a4287fb33152b73a38c319b50302202f7428a27284c757e409bf41506183e9e49dfb54d5063796dfa0d403a4deccfa';
- var sig = new Buffer(sighex, 'hex');
- var parsed = Signature.parseDER(sig);
- parsed.header.should.equal(0x30);
- parsed.length.should.equal(67);
- parsed.rlength.should.equal(31);
- parsed.rneg.should.equal(false);
- parsed.rbuf.toString('hex').should.equal('59e4705959cc78acbfcf8bd0114e9cc1b389a4287fb33152b73a38c319b503');
- parsed.r.toString().should.equal('158826015856106182499128681792325160381907915189052224498209222621383996675');
- parsed.slength.should.equal(32);
- parsed.sneg.should.equal(false);
- parsed.sbuf.toString('hex').should.equal('2f7428a27284c757e409bf41506183e9e49dfb54d5063796dfa0d403a4deccfa');
- parsed.s.toString().should.equal('21463938592353267769710297084836796652964571266930856168996063301532842380538');
- });
-
- it('should parse this 68 byte signature', function() {
- var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a51';
- var sig = new Buffer(sighex, 'hex');
- var parsed = Signature.parseDER(sig);
- parsed.header.should.equal(0x30);
- parsed.length.should.equal(66);
- parsed.rlength.should.equal(30);
- parsed.rneg.should.equal(false);
- parsed.rbuf.toString('hex').should.equal('17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632');
- parsed.r.toString().should.equal('164345250294671732127776123343329699648286106708464198588053542748255794');
- parsed.slength.should.equal(32);
- parsed.sneg.should.equal(false);
- parsed.sbuf.toString('hex').should.equal('61bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a51');
- parsed.s.toString().should.equal('44212963026209759051804639008236126356702363229859210154760104982946304432721');
- });
-
- it('should parse this signature from script_valid.json', function() {
- var sighex = '304502203e4516da7253cf068effec6b95c41221c0cf3a8e6ccb8cbf1725b562e9afde2c022100ab1e3da73d67e32045a20e0b999e049978ea8d6ee5480d485fcf2ce0d03b2ef051';
- var sig = Buffer(sighex, 'hex');
- var parsed = Signature.parseDER(sig, false);
- should.exist(parsed);
- });
-
- });
-
- describe('#toDER', function() {
-
- it('should convert these known r and s values into a known signature', function() {
- var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810');
- var s = new BN('4331694221846364448463828256391194279133231453999942381442030409253074198130');
- var sig = new Signature({
- r: r,
- s: s
- });
- var der = sig.toDER(r, s);
- der.toString('hex').should.equal('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72');
- });
-
- });
-
- describe('#toString', function() {
- it('should convert this signature in to hex DER', function() {
- var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810');
- var s = new BN('4331694221846364448463828256391194279133231453999942381442030409253074198130');
- var sig = new Signature({
- r: r,
- s: s
- });
- var hex = sig.toString();
- hex.should.equal('30450221008bab1f0a2ff2f9cb8992173d8ad73c229d31ea8e10b0f4d4ae1a0d8ed76021fa02200993a6ec81755b9111762fc2cf8e3ede73047515622792110867d12654275e72');
- });
- });
-
-
- describe('@isTxDER', function() {
- it('should know this is a DER signature', function() {
- var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a5101';
- var sigbuf = new Buffer(sighex, 'hex');
- Signature.isTxDER(sigbuf).should.equal(true);
- });
-
- it('should know this is not a DER signature', function() {
- //for more extensive tests, see the script interpreter
- var sighex = '3042021e17cfe77536c3fb0526bd1a72d7a8e0973f463add210be14063c8a9c37632022061bfa677f825ded82ba0863fb0c46ca1388dd3e647f6a93c038168b59d131a5101';
- var sigbuf = new Buffer(sighex, 'hex');
- sigbuf[0] = 0x31;
- Signature.isTxDER(sigbuf).should.equal(false);
- });
-
-
- describe('bitcoind fixtures', function() {
- var test_sigs = function(set, expected) {
- var i = 0;
- set.forEach(function(vector) {
- if (!JSUtil.isHexa(vector)) {
- // non-hex strings are ignored
- return;
- }
- it('should be ' + (expected ? '' : 'in') + 'valid for fixture #' + i, function() {
- var sighex = vector;
- var interp = Interpreter();
- interp.flags = Interpreter.SCRIPT_VERIFY_DERSIG |
- Interpreter.SCRIPT_VERIFY_STRICTENC;
- var result = interp.checkSignatureEncoding(new Buffer(sighex, 'hex'));
- result.should.equal(expected);
- });
- i++;
- });
- };
- test_sigs(sig_canonical, true);
- test_sigs(sig_noncanonical, false);
- });
-
- });
- describe('#hasLowS', function() {
- it('should detect high and low S', function() {
- var r = new BN('63173831029936981022572627018246571655303050627048489594159321588908385378810');
-
- var sig = new Signature({
- r: r,
- s: new BN('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A1', 'hex')
- });
- sig.hasLowS().should.equal(false);
-
- var sig2 = new Signature({
- r: r,
- s: new BN('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0', 'hex')
- });
- sig2.hasLowS().should.equal(true);
-
- var sig3 = new Signature({
- r: r,
- s: new BN(1)
- });
- sig3.hasLowS().should.equal(true);
-
- var sig4 = new Signature({
- r: r,
- s: new BN(0)
- });
- sig4.hasLowS().should.equal(false);
-
- });
- });
-
- describe('#hasDefinedHashtype', function() {
- it('should reject invalid sighash types and accept valid ones', function() {
- var sig = new Signature();
- sig.hasDefinedHashtype().should.equal(false);
- var testCases = [
- [undefined, false],
- [null, false],
- [0, false],
- [1.1, false],
- [-1, false],
- [-1.1, false],
- ['', false],
- ['1', false],
- [Signature.SIGHASH_ANYONECANPAY, false],
- [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL, true],
- [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_NONE, true],
- [Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_SINGLE, true],
- [Signature.SIGHASH_ALL, true],
- [Signature.SIGHASH_NONE, true],
- [Signature.SIGHASH_SINGLE, true],
- [Signature.SIGHASH_SINGLE + 1, false],
- [(Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_SINGLE) + 1, false],
- [(Signature.SIGHASH_ANYONECANPAY | Signature.SIGHASH_ALL) - 1, false],
- ];
- _.each(testCases, function(testCase) {
- sig.nhashtype = testCase[0];
- sig.hasDefinedHashtype().should.equal(testCase[1]);
- });
- });
- });
-
-});
diff --git a/test/docs.js b/test/docs.js
deleted file mode 100644
index 5ef532f..0000000
--- a/test/docs.js
+++ /dev/null
@@ -1,17 +0,0 @@
-'use strict';
-
-var chai = require('chai');
-var should = chai.should();
-
-var bitcore = require('..');
-var fs = require('fs');
-
-describe('Documentation', function() {
-
- it('major and minor versions should match', function() {
- var versionRE = /v[0-9]+\.[0-9]+/;
- var docIndex = fs.readFileSync('./docs/index.md', 'ascii');
- var docVersion = docIndex.match(versionRE)[0];
- bitcore.version.indexOf(docVersion).should.equal(0);
- });
-});
diff --git a/test/encoding/base58.js b/test/encoding/base58.js
deleted file mode 100644
index fc0a7e8..0000000
--- a/test/encoding/base58.js
+++ /dev/null
@@ -1,123 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var buffer = require('buffer');
-var Base58 = bitcore.encoding.Base58;
-
-describe('Base58', function() {
- var buf = new buffer.Buffer([0, 1, 2, 3, 253, 254, 255]);
- var enc = '1W7N4RuG';
-
- it('should make an instance with "new"', function() {
- var b58 = new Base58();
- should.exist(b58);
- });
-
- it('validates characters with no false negatives', function() {
- Base58.validCharacters(
- '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
- ).should.equal(true);
- });
- it('validates characters from buffer', function() {
- Base58.validCharacters(
- new buffer.Buffer('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz')
- ).should.equal(true);
- });
-
- it('some characters are invalid (no false positives)', function() {
- Base58.validCharacters('!@#%^$&*()\\').should.equal(false);
- });
-
- it('should make an instance without "new"', function() {
- var b58 = Base58();
- should.exist(b58);
- });
-
- it('should allow this handy syntax', function() {
- Base58(buf).toString().should.equal(enc);
- Base58(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- describe('#set', function() {
-
- it('should set a blank buffer', function() {
- Base58().set({
- buf: new buffer.Buffer([])
- });
- });
-
- });
-
- describe('@encode', function() {
-
- it('should encode the buffer accurately', function() {
- Base58.encode(buf).should.equal(enc);
- });
-
- it('should throw an error when the Input is not a buffer', function() {
- (function() {
- Base58.encode('string');
- }).should.throw('Input should be a buffer');
- });
-
- });
-
- describe('@decode', function() {
-
- it('should decode this encoded value correctly', function() {
- Base58.decode(enc).toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should throw an error when Input is not a string', function() {
- (function() {
- Base58.decode(5);
- }).should.throw('Input should be a string');
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should not fail', function() {
- should.exist(Base58().fromBuffer(buf));
- });
-
- it('should set buffer', function() {
- var b58 = Base58().fromBuffer(buf);
- b58.buf.toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#fromString', function() {
-
- it('should convert this known string to a buffer', function() {
- Base58().fromString(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should return the buffer', function() {
- var b58 = Base58({
- buf: buf
- });
- b58.buf.toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#toString', function() {
-
- it('should return the buffer', function() {
- var b58 = Base58({
- buf: buf
- });
- b58.toString().should.equal(enc);
- });
-
- });
-
-});
diff --git a/test/encoding/base58check.js b/test/encoding/base58check.js
deleted file mode 100644
index c2cc622..0000000
--- a/test/encoding/base58check.js
+++ /dev/null
@@ -1,124 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var Base58Check = bitcore.encoding.Base58Check;
-var Base58 = bitcore.encoding.Base58;
-
-describe('Base58Check', function() {
- var buf = new Buffer([0, 1, 2, 3, 253, 254, 255]);
- var enc = '14HV44ipwoaqfg';
-
- it('should make an instance with "new"', function() {
- var b58 = new Base58Check();
- should.exist(b58);
- });
-
- it('can validate a serialized string', function() {
- var address = '3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy';
- Base58Check.validChecksum(address).should.equal(true);
- address = address + 'a';
- Base58Check.validChecksum(address).should.equal(false);
- });
-
- it('should make an instance without "new"', function() {
- var b58 = Base58Check();
- should.exist(b58);
- });
-
- it('should allow this handy syntax', function() {
- Base58Check(buf).toString().should.equal(enc);
- Base58Check(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- describe('#set', function() {
-
- it('should set a buf', function() {
- should.exist(Base58Check().set({buf: buf}).buf);
- });
-
- });
-
- describe('@encode', function() {
-
- it('should encode the buffer accurately', function() {
- Base58Check.encode(buf).should.equal(enc);
- });
-
- it('should throw an error when the input is not a buffer', function() {
- (function() {
- Base58Check.encode('string');
- }).should.throw('Input must be a buffer');
- });
-
- });
-
- describe('@decode', function() {
-
- it('should decode this encoded value correctly', function() {
- Base58Check.decode(enc).toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should throw an error when input is not a string', function() {
- (function() {
- Base58Check.decode(5);
- }).should.throw('Input must be a string');
- });
-
- it('should throw an error when input is too short', function() {
- (function() {
- Base58Check.decode(enc.slice(0, 1));
- }).should.throw('Input string too short');
- });
-
- it('should throw an error when there is a checksum mismatch', function() {
- var buf2 = Base58.decode(enc);
- buf2[0] = buf2[0] + 1;
- var enc2 = Base58.encode(buf2);
- (function() {
- Base58Check.decode(enc2);
- }).should.throw('Checksum mismatch');
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should not fail', function() {
- should.exist(Base58Check().fromBuffer(buf));
- });
-
- it('should set buffer', function() {
- var b58 = Base58Check().fromBuffer(buf);
- b58.buf.toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#fromString', function() {
-
- it('should convert this known string to a buffer', function() {
- Base58Check().fromString(enc).toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should return the buffer', function() {
- var b58 = Base58Check({buf: buf});
- b58.buf.toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#toString', function() {
-
- it('should return the buffer', function() {
- var b58 = Base58Check({buf: buf});
- b58.toString().should.equal(enc);
- });
-
- });
-
-});
diff --git a/test/encoding/bufferreader.js b/test/encoding/bufferreader.js
deleted file mode 100644
index 78e4c76..0000000
--- a/test/encoding/bufferreader.js
+++ /dev/null
@@ -1,360 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var BufferWriter = bitcore.encoding.BufferWriter;
-var BufferReader = bitcore.encoding.BufferReader;
-var BN = bitcore.crypto.BN;
-
-describe('BufferReader', function() {
-
- it('should make a new BufferReader', function() {
- var br = new BufferReader();
- should.exist(br);
- br = BufferReader();
- should.exist(br);
- });
-
- it('should create a new bufferreader with a buffer', function() {
- var buf = new Buffer(0);
- var br = new BufferReader(buf);
- should.exist(br);
- Buffer.isBuffer(br.buf).should.equal(true);
- });
- it('should fail for invalid object', function() {
- var fail = function() {
- return new BufferReader(5);
- };
- fail.should.throw('Unrecognized argument for BufferReader');
- });
-
- describe('#set', function() {
-
- it('should set pos', function() {
- should.exist(BufferReader().set({
- pos: 1
- }).pos);
- });
-
- });
-
- describe('#eof', function() {
-
- it('should return true for a blank br', function() {
- var br = new BufferReader(new Buffer([]));
- br.finished().should.equal(true);
- });
-
- });
-
- describe('read', function() {
-
- it('should return the same buffer', function() {
- var buf = new Buffer([0]);
- var br = new BufferReader(buf);
- br.readAll().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should return a buffer of this length', function() {
- var buf = new Buffer(10);
- buf.fill(0);
- var br = new BufferReader(buf);
- var buf2 = br.read(2);
- buf2.length.should.equal(2);
- br.finished().should.equal(false);
- br.pos.should.equal(2);
- });
-
- it('should work with 0 length', function() {
- var buf = new Buffer(10);
- buf.fill(1);
- var br = new BufferReader(buf);
- var buf2 = br.read(0);
- buf2.length.should.equal(0);
- br.finished().should.equal(false);
- buf2.toString('hex').should.equal('');
- });
-
- });
-
- describe('readVarLengthBuffer', function() {
-
- it('returns correct buffer', function() {
- var buf = new Buffer('73010000003766404f00000000b305434f00000000f203' +
- '0000f1030000001027000048ee00000064000000004653656520626974636f696' +
- 'e2e6f72672f666562323020696620796f7520686176652074726f75626c652063' +
- '6f6e6e656374696e6720616674657220323020466562727561727900473045022' +
- '1008389df45f0703f39ec8c1cc42c13810ffcae14995bb648340219e353b63b53' +
- 'eb022009ec65e1c1aaeec1fd334c6b684bde2b3f573060d5b70c3a46723326e4e' +
- '8a4f1', 'hex');
- var br = new BufferReader(buf);
- var b1 = br.readVarLengthBuffer();
- b1.toString('hex').should.equal('010000003766404f00000000b305434f000' +
- '00000f2030000f1030000001027000048ee000000640000000046536565206269' +
- '74636f696e2e6f72672f666562323020696620796f7520686176652074726f756' +
- '26c6520636f6e6e656374696e6720616674657220323020466562727561727900');
- var b2 = br.readVarLengthBuffer();
- b2.toString('hex').should.equal('30450221008389df45f0703f39ec8c1cc42' +
- 'c13810ffcae14995bb648340219e353b63b53eb022009ec65e1c1aaeec1fd334c' +
- '6b684bde2b3f573060d5b70c3a46723326e4e8a4f1');
- });
- it('fails on length too big', function() {
- var buf = new Buffer('0a00', 'hex');
- var br = new BufferReader(buf);
- br.readVarLengthBuffer.bind(br).should.throw('Invalid length while reading varlength buffer');
- });
-
- });
-
- describe('#readUInt8', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(1);
- buf.writeUInt8(1, 0);
- var br = new BufferReader(buf);
- br.readUInt8().should.equal(1);
- });
-
- });
-
- describe('#readUInt16BE', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(2);
- buf.writeUInt16BE(1, 0);
- var br = new BufferReader(buf);
- br.readUInt16BE().should.equal(1);
- });
-
- });
-
- describe('#readUInt16LE', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(2);
- buf.writeUInt16LE(1, 0);
- var br = new BufferReader(buf);
- br.readUInt16LE().should.equal(1);
- });
-
- });
-
- describe('#readUInt32BE', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(4);
- buf.writeUInt32BE(1, 0);
- var br = new BufferReader(buf);
- br.readUInt32BE().should.equal(1);
- });
-
- });
-
- describe('#readUInt32LE', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(4);
- buf.writeUInt32LE(1, 0);
- var br = new BufferReader(buf);
- br.readUInt32LE().should.equal(1);
- });
-
- });
-
- describe('#readUInt64BEBN', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(8);
- buf.fill(0);
- buf.writeUInt32BE(1, 4);
- var br = new BufferReader(buf);
- br.readUInt64BEBN().toNumber().should.equal(1);
- });
-
- it('should return 2^64', function() {
- var buf = new Buffer(8);
- buf.fill(0xff);
- var br = new BufferReader(buf);
- br.readUInt64BEBN().toNumber().should.equal(Math.pow(2, 64));
- });
-
- });
-
- describe('#readUInt64LEBN', function() {
-
- it('should return 1', function() {
- var buf = new Buffer(8);
- buf.fill(0);
- buf.writeUInt32LE(1, 0);
- var br = new BufferReader(buf);
- br.readUInt64LEBN().toNumber().should.equal(1);
- });
-
- it('should return 10BTC', function() {
- var tenbtc = 10 * 1e8;
- var tenbtcBuffer = new Buffer('00ca9a3b00000000', 'hex');
- var br = new BufferReader(tenbtcBuffer);
- br.readUInt64LEBN().toNumber().should.equal(tenbtc);
- });
-
- it('should return 2^30', function() {
- var buf = new Buffer(8);
- buf.fill(0);
- buf.writeUInt32LE(Math.pow(2, 30), 0);
- var br = new BufferReader(buf);
- br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 30));
- });
-
- it('should return 2^32 + 1', function() {
- var num = Math.pow(2, 32) + 1;
- var numBuffer = new Buffer('0100000001000000', 'hex');
- var br = new BufferReader(numBuffer);
- br.readUInt64LEBN().toNumber().should.equal(num);
- });
-
- it('should return max number of satoshis', function() {
- var maxSatoshis = 21000000 * 1e8;
- var maxSatoshisBuffer = new Buffer('0040075af0750700', 'hex');
- var br = new BufferReader(maxSatoshisBuffer);
- br.readUInt64LEBN().toNumber().should.equal(maxSatoshis);
- });
-
- it('should return 2^53 - 1', function() {
- var maxSafe = Math.pow(2, 53) - 1;
- var maxSafeBuffer = new Buffer('ffffffffffff1f00', 'hex');
- var br = new BufferReader(maxSafeBuffer);
- br.readUInt64LEBN().toNumber().should.equal(maxSafe);
- });
-
- it('should return 2^53', function() {
- var bn = new BN('20000000000000', 16);
- var bnBuffer = new Buffer('0000000000002000', 'hex');
- var br = new BufferReader(bnBuffer);
- var readbn = br.readUInt64LEBN();
- readbn.cmp(bn).should.equal(0);
- });
-
- it('should return 0', function() {
- var buf = new Buffer(8);
- buf.fill(0);
- var br = new BufferReader(buf);
- br.readUInt64LEBN().toNumber().should.equal(0);
- });
-
- it('should return 2^64', function() {
- var buf = new Buffer(8);
- buf.fill(0xff);
- var br = new BufferReader(buf);
- br.readUInt64LEBN().toNumber().should.equal(Math.pow(2, 64));
- });
-
- });
-
- describe('#readVarintBuf', function() {
-
- it('should read a 1 byte varint', function() {
- var buf = new Buffer([50]);
- var br = new BufferReader(buf);
- br.readVarintBuf().length.should.equal(1);
- });
-
- it('should read a 3 byte varint', function() {
- var buf = new Buffer([253, 253, 0]);
- var br = new BufferReader(buf);
- br.readVarintBuf().length.should.equal(3);
- });
-
- it('should read a 5 byte varint', function() {
- var buf = new Buffer([254, 0, 0, 0, 0]);
- buf.writeUInt32LE(50000, 1);
- var br = new BufferReader(buf);
- br.readVarintBuf().length.should.equal(5);
- });
-
- it('should read a 9 byte varint', function() {
- var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat();
- var br = new BufferReader(buf);
- br.readVarintBuf().length.should.equal(9);
- });
-
- });
-
- describe('#readVarintNum', function() {
-
- it('should read a 1 byte varint', function() {
- var buf = new Buffer([50]);
- var br = new BufferReader(buf);
- br.readVarintNum().should.equal(50);
- });
-
- it('should read a 3 byte varint', function() {
- var buf = new Buffer([253, 253, 0]);
- var br = new BufferReader(buf);
- br.readVarintNum().should.equal(253);
- });
-
- it('should read a 5 byte varint', function() {
- var buf = new Buffer([254, 0, 0, 0, 0]);
- buf.writeUInt32LE(50000, 1);
- var br = new BufferReader(buf);
- br.readVarintNum().should.equal(50000);
- });
-
- it('should throw an error on a 9 byte varint over the javascript uint precision limit', function() {
- var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 54).toString())).concat();
- var br = new BufferReader(buf);
- (function() {
- br.readVarintNum();
- }).should.throw('number too large to retain precision - use readVarintBN');
- });
-
- it('should not throw an error on a 9 byte varint not over the javascript uint precision limit', function() {
- var buf = BufferWriter().writeVarintBN(new BN(Math.pow(2, 53).toString())).concat();
- var br = new BufferReader(buf);
- (function() {
- br.readVarintNum();
- }).should.not.throw('number too large to retain precision - use readVarintBN');
- });
-
- });
-
- describe('#readVarintBN', function() {
-
- it('should read a 1 byte varint', function() {
- var buf = new Buffer([50]);
- var br = new BufferReader(buf);
- br.readVarintBN().toNumber().should.equal(50);
- });
-
- it('should read a 3 byte varint', function() {
- var buf = new Buffer([253, 253, 0]);
- var br = new BufferReader(buf);
- br.readVarintBN().toNumber().should.equal(253);
- });
-
- it('should read a 5 byte varint', function() {
- var buf = new Buffer([254, 0, 0, 0, 0]);
- buf.writeUInt32LE(50000, 1);
- var br = new BufferReader(buf);
- br.readVarintBN().toNumber().should.equal(50000);
- });
-
- it('should read a 9 byte varint', function() {
- var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]);
- var br = new BufferReader(buf);
- br.readVarintBN().toNumber().should.equal(Math.pow(2, 64));
- });
-
- });
-
- describe('#reverse', function() {
-
- it('should reverse this [0, 1]', function() {
- var buf = new Buffer([0, 1]);
- var br = new BufferReader(buf);
- br.reverse().readAll().toString('hex').should.equal('0100');
- });
-
- });
-
-});
diff --git a/test/encoding/bufferwriter.js b/test/encoding/bufferwriter.js
deleted file mode 100644
index 85ed3c1..0000000
--- a/test/encoding/bufferwriter.js
+++ /dev/null
@@ -1,188 +0,0 @@
-'use strict';
-
-var bitcore = require('../..');
-var should = require('chai').should();
-var BufferWriter = bitcore.encoding.BufferWriter;
-var BufferReader = bitcore.encoding.BufferReader;
-var BN = bitcore.crypto.BN;
-
-describe('BufferWriter', function() {
-
- it('should create a new buffer writer', function() {
- var bw = new BufferWriter();
- should.exist(bw);
- });
-
- describe('#set', function() {
-
- it('set bufs', function() {
- var buf1 = new Buffer([0]);
- var buf2 = new Buffer([1]);
- var bw = new BufferWriter().set({bufs: [buf1, buf2]});
- bw.concat().toString('hex').should.equal('0001');
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should concat these two bufs', function() {
- var buf1 = new Buffer([0]);
- var buf2 = new Buffer([1]);
- var bw = new BufferWriter({bufs: [buf1, buf2]});
- bw.toBuffer().toString('hex').should.equal('0001');
- });
-
- });
-
- describe('#concat', function() {
-
- it('should concat these two bufs', function() {
- var buf1 = new Buffer([0]);
- var buf2 = new Buffer([1]);
- var bw = new BufferWriter({bufs: [buf1, buf2]});
- bw.concat().toString('hex').should.equal('0001');
- });
-
- });
-
- describe('#write', function() {
-
- it('should write a buffer', function() {
- var buf = new Buffer([0]);
- var bw = new BufferWriter();
- bw.write(buf);
- bw.concat().toString('hex').should.equal('00');
- });
-
- });
-
- describe('#writeUInt8', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt8(1).concat().toString('hex').should.equal('01');
- });
-
- });
-
- describe('#writeUInt16BE', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt16BE(1).concat().toString('hex').should.equal('0001');
- });
-
- });
-
- describe('#writeUInt16LE', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt16LE(1).concat().toString('hex').should.equal('0100');
- });
-
- });
-
- describe('#writeUInt32BE', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt32BE(1).concat().toString('hex').should.equal('00000001');
- });
-
- });
-
- describe('#writeUInt32LE', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt32LE(1).concat().toString('hex').should.equal('01000000');
- });
-
- });
-
- describe('#writeUInt64BEBN', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt64BEBN(new BN(1)).concat().toString('hex').should.equal('0000000000000001');
- });
-
- });
-
- describe('#writeUInt64LEBN', function() {
-
- it('should write 1', function() {
- var bw = new BufferWriter();
- bw.writeUInt64LEBN(new BN(1)).concat().toString('hex').should.equal('0100000000000000');
- });
-
- });
-
- describe('#writeVarint', function() {
-
- it('should write a 1 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintNum(1);
- bw.concat().length.should.equal(1);
- });
-
- it('should write a 3 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintNum(1000);
- bw.concat().length.should.equal(3);
- });
-
- it('should write a 5 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintNum(Math.pow(2, 16 + 1));
- bw.concat().length.should.equal(5);
- });
-
- it('should write a 9 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintNum(Math.pow(2, 32 + 1));
- bw.concat().length.should.equal(9);
- });
-
- it('should read back the same value it wrote for a 9 byte varint', function() {
- var bw = new BufferWriter();
- var n = Math.pow(2, 53);
- n.should.equal(n + 1); //javascript number precision limit
- bw.writeVarintNum(n);
- var br = new BufferReader({buf: bw.concat()});
- br.readVarintBN().toNumber().should.equal(n);
- });
-
- });
-
- describe('#writeVarintBN', function() {
-
- it('should write a 1 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintBN(new BN(1));
- bw.concat().length.should.equal(1);
- });
-
- it('should write a 3 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintBN(new BN(1000));
- bw.concat().length.should.equal(3);
- });
-
- it('should write a 5 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintBN(new BN(Math.pow(2, 16 + 1)));
- bw.concat().length.should.equal(5);
- });
-
- it('should write a 9 byte varint', function() {
- var bw = new BufferWriter();
- bw.writeVarintBN(new BN(Math.pow(2, 32 + 1)));
- bw.concat().length.should.equal(9);
- });
-
- });
-
-});
diff --git a/test/encoding/varint.js b/test/encoding/varint.js
deleted file mode 100644
index 47e722c..0000000
--- a/test/encoding/varint.js
+++ /dev/null
@@ -1,126 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../..');
-var BN = bitcore.crypto.BN;
-var BufferReader = bitcore.encoding.BufferReader;
-var BufferWriter = bitcore.encoding.BufferWriter;
-var Varint = bitcore.encoding.Varint;
-
-describe('Varint', function() {
-
- it('should make a new varint', function() {
- var buf = new Buffer('00', 'hex');
- var varint = new Varint(buf);
- should.exist(varint);
- varint.buf.toString('hex').should.equal('00');
- varint = Varint(buf);
- should.exist(varint);
- varint.buf.toString('hex').should.equal('00');
-
- //various ways to use the constructor
- Varint(Varint(0).toBuffer()).toNumber().should.equal(0);
- Varint(0).toNumber().should.equal(0);
- Varint(new BN(0)).toNumber().should.equal(0);
- });
-
- describe('#set', function() {
-
- it('should set a buffer', function() {
- var buf = new Buffer('00', 'hex');
- var varint = Varint().set({buf: buf});
- varint.buf.toString('hex').should.equal('00');
- varint.set({});
- varint.buf.toString('hex').should.equal('00');
- });
-
- });
-
- describe('#fromString', function() {
-
- it('should set a buffer', function() {
- var buf = BufferWriter().writeVarintNum(5).concat();
- var varint = Varint().fromString(buf.toString('hex'));
- varint.toNumber().should.equal(5);
- });
-
- });
-
- describe('#toString', function() {
-
- it('should return a buffer', function() {
- var buf = BufferWriter().writeVarintNum(5).concat();
- var varint = Varint().fromString(buf.toString('hex'));
- varint.toString().should.equal('05');
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should set a buffer', function() {
- var buf = BufferWriter().writeVarintNum(5).concat();
- var varint = Varint().fromBuffer(buf);
- varint.toNumber().should.equal(5);
- });
-
- });
-
- describe('#fromBufferReader', function() {
-
- it('should set a buffer reader', function() {
- var buf = BufferWriter().writeVarintNum(5).concat();
- var br = BufferReader(buf);
- var varint = Varint().fromBufferReader(br);
- varint.toNumber().should.equal(5);
- });
-
- });
-
- describe('#fromBN', function() {
-
- it('should set a number', function() {
- var varint = Varint().fromBN(new BN(5));
- varint.toNumber().should.equal(5);
- });
-
- });
-
- describe('#fromNumber', function() {
-
- it('should set a number', function() {
- var varint = Varint().fromNumber(5);
- varint.toNumber().should.equal(5);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should return a buffer', function() {
- var buf = BufferWriter().writeVarintNum(5).concat();
- var varint = Varint(buf);
- varint.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#toBN', function() {
-
- it('should return a buffer', function() {
- var varint = Varint(5);
- varint.toBN().toString().should.equal(new BN(5).toString());
- });
-
- });
-
- describe('#toNumber', function() {
-
- it('should return a buffer', function() {
- var varint = Varint(5);
- varint.toNumber().should.equal(5);
- });
-
- });
-
-});
diff --git a/test/hdkeys.js b/test/hdkeys.js
deleted file mode 100644
index ec680d7..0000000
--- a/test/hdkeys.js
+++ /dev/null
@@ -1,372 +0,0 @@
-'use strict';
-
-// Relax some linter options:
-// * quote marks so "m/0'/1/2'/" doesn't need to be scaped
-// * too many tests, maxstatements -> 100
-// * store test vectors at the end, latedef: false
-// * should call is never defined
-/* jshint quotmark: false */
-/* jshint latedef: false */
-/* jshint maxstatements: 100 */
-/* jshint unused: false */
-
-var _ = require('lodash');
-var should = require('chai').should();
-var expect = require('chai').expect;
-var sinon = require('sinon');
-var bitcore = require('..');
-var Networks = bitcore.Networks;
-var HDPrivateKey = bitcore.HDPrivateKey;
-var HDPublicKey = bitcore.HDPublicKey;
-
-describe('HDKeys building with static methods', function() {
- var classes = [HDPublicKey, HDPrivateKey];
- var clazz, index;
-
- _.each(classes, function(clazz) {
- var expectStaticMethodFail = function(staticMethod, argument, message) {
- expect(clazz[staticMethod].bind(null, argument)).to.throw(message);
- };
- it(clazz.name + ' fromJSON checks that a valid JSON is provided', function() {
- var errorMessage = 'Invalid Argument: No valid argument was provided';
- var method = 'fromObject';
- expectStaticMethodFail(method, undefined, errorMessage);
- expectStaticMethodFail(method, null, errorMessage);
- expectStaticMethodFail(method, 'invalid JSON', errorMessage);
- expectStaticMethodFail(method, '{\'singlequotes\': true}', errorMessage);
- });
- it(clazz.name + ' fromString checks that a string is provided', function() {
- var errorMessage = 'No valid string was provided';
- var method = 'fromString';
- expectStaticMethodFail(method, undefined, errorMessage);
- expectStaticMethodFail(method, null, errorMessage);
- expectStaticMethodFail(method, {}, errorMessage);
- });
- it(clazz.name + ' fromObject checks that an object is provided', function() {
- var errorMessage = 'No valid argument was provided';
- var method = 'fromObject';
- expectStaticMethodFail(method, undefined, errorMessage);
- expectStaticMethodFail(method, null, errorMessage);
- expectStaticMethodFail(method, '', errorMessage);
- });
- });
-});
-
-describe('BIP32 compliance', function() {
-
- it('should initialize test vector 1 from the extended public key', function() {
- new HDPublicKey(vector1_m_public).xpubkey.should.equal(vector1_m_public);
- });
-
- it('should initialize test vector 1 from the extended private key', function() {
- new HDPrivateKey(vector1_m_private).xprivkey.should.equal(vector1_m_private);
- });
-
- it('can initialize a public key from an extended private key', function() {
- new HDPublicKey(vector1_m_private).xpubkey.should.equal(vector1_m_public);
- });
-
- it('toString should be equal to the `xpubkey` member', function() {
- var privateKey = new HDPrivateKey(vector1_m_private);
- privateKey.toString().should.equal(privateKey.xprivkey);
- });
-
- it('toString should be equal to the `xpubkey` member', function() {
- var publicKey = new HDPublicKey(vector1_m_public);
- publicKey.toString().should.equal(publicKey.xpubkey);
- });
-
- it('should get the extended public key from the extended private key for test vector 1', function() {
- HDPrivateKey(vector1_m_private).xpubkey.should.equal(vector1_m_public);
- });
-
- it("should get m/0' ext. private key from test vector 1", function() {
- var privateKey = new HDPrivateKey(vector1_m_private).derive("m/0'");
- privateKey.xprivkey.should.equal(vector1_m0h_private);
- });
-
- it("should get m/0' ext. public key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'")
- .xpubkey.should.equal(vector1_m0h_public);
- });
-
- it("should get m/0'/1 ext. private key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1")
- .xprivkey.should.equal(vector1_m0h1_private);
- });
-
- it("should get m/0'/1 ext. public key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1")
- .xpubkey.should.equal(vector1_m0h1_public);
- });
-
- it("should get m/0'/1 ext. public key from m/0' public key from test vector 1", function() {
- var derivedPublic = HDPrivateKey(vector1_m_private).derive("m/0'").hdPublicKey.derive("m/1");
- derivedPublic.xpubkey.should.equal(vector1_m0h1_public);
- });
-
- it("should get m/0'/1/2' ext. private key from test vector 1", function() {
- var privateKey = new HDPrivateKey(vector1_m_private);
- var derived = privateKey.derive("m/0'/1/2'");
- derived.xprivkey.should.equal(vector1_m0h12h_private);
- });
-
- it("should get m/0'/1/2' ext. public key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1/2'")
- .xpubkey.should.equal(vector1_m0h12h_public);
- });
-
- it("should get m/0'/1/2'/2 ext. private key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1/2'/2")
- .xprivkey.should.equal(vector1_m0h12h2_private);
- });
-
- it("should get m/0'/1/2'/2 ext. public key from m/0'/1/2' public key from test vector 1", function() {
- var derived = HDPrivateKey(vector1_m_private).derive("m/0'/1/2'").hdPublicKey;
- derived.derive("m/2").xpubkey.should.equal(vector1_m0h12h2_public);
- });
-
- it("should get m/0'/1/2h/2 ext. public key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1/2'/2")
- .xpubkey.should.equal(vector1_m0h12h2_public);
- });
-
- it("should get m/0'/1/2h/2/1000000000 ext. private key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1/2'/2/1000000000")
- .xprivkey.should.equal(vector1_m0h12h21000000000_private);
- });
-
- it("should get m/0'/1/2h/2/1000000000 ext. public key from test vector 1", function() {
- HDPrivateKey(vector1_m_private).derive("m/0'/1/2'/2/1000000000")
- .xpubkey.should.equal(vector1_m0h12h21000000000_public);
- });
-
- it("should get m/0'/1/2'/2/1000000000 ext. public key from m/0'/1/2'/2 public key from test vector 1", function() {
- var derived = HDPrivateKey(vector1_m_private).derive("m/0'/1/2'/2").hdPublicKey;
- derived.derive("m/1000000000").xpubkey.should.equal(vector1_m0h12h21000000000_public);
- });
-
- it('should initialize test vector 2 from the extended public key', function() {
- HDPublicKey(vector2_m_public).xpubkey.should.equal(vector2_m_public);
- });
-
- it('should initialize test vector 2 from the extended private key', function() {
- HDPrivateKey(vector2_m_private).xprivkey.should.equal(vector2_m_private);
- });
-
- it('should get the extended public key from the extended private key for test vector 2', function() {
- HDPrivateKey(vector2_m_private).xpubkey.should.equal(vector2_m_public);
- });
-
- it("should get m/0 ext. private key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive(0).xprivkey.should.equal(vector2_m0_private);
- });
-
- it("should get m/0 ext. public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive(0).xpubkey.should.equal(vector2_m0_public);
- });
-
- it("should get m/0 ext. public key from m public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).hdPublicKey.derive(0).xpubkey.should.equal(vector2_m0_public);
- });
-
- it("should get m/0/2147483647h ext. private key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'")
- .xprivkey.should.equal(vector2_m02147483647h_private);
- });
-
- it("should get m/0/2147483647h ext. public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'")
- .xpubkey.should.equal(vector2_m02147483647h_public);
- });
-
- it("should get m/0/2147483647h/1 ext. private key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1")
- .xprivkey.should.equal(vector2_m02147483647h1_private);
- });
-
- it("should get m/0/2147483647h/1 ext. public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1")
- .xpubkey.should.equal(vector2_m02147483647h1_public);
- });
-
- it("should get m/0/2147483647h/1 ext. public key from m/0/2147483647h public key from test vector 2", function() {
- var derived = HDPrivateKey(vector2_m_private).derive("m/0/2147483647'").hdPublicKey;
- derived.derive(1).xpubkey.should.equal(vector2_m02147483647h1_public);
- });
-
- it("should get m/0/2147483647h/1/2147483646h ext. private key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1/2147483646'")
- .xprivkey.should.equal(vector2_m02147483647h12147483646h_private);
- });
-
- it("should get m/0/2147483647h/1/2147483646h ext. public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1/2147483646'")
- .xpubkey.should.equal(vector2_m02147483647h12147483646h_public);
- });
-
- it("should get m/0/2147483647h/1/2147483646h/2 ext. private key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1/2147483646'/2")
- .xprivkey.should.equal(vector2_m02147483647h12147483646h2_private);
- });
-
- it("should get m/0/2147483647h/1/2147483646h/2 ext. public key from test vector 2", function() {
- HDPrivateKey(vector2_m_private).derive("m/0/2147483647'/1/2147483646'/2")
- .xpubkey.should.equal(vector2_m02147483647h12147483646h2_public);
- });
-
- it("should get m/0/2147483647h/1/2147483646h/2 ext. public key from m/0/2147483647h/2147483646h public key from test vector 2", function() {
- var derivedPublic = HDPrivateKey(vector2_m_private)
- .derive("m/0/2147483647'/1/2147483646'").hdPublicKey;
- derivedPublic.derive("m/2")
- .xpubkey.should.equal(vector2_m02147483647h12147483646h2_public);
- });
-
- it('should use full 32 bytes for private key data that is hashed (as per bip32)', function() {
- // https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
- var privateKeyBuffer = new Buffer('00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd', 'hex');
- var chainCodeBuffer = new Buffer('9c8a5c863e5941f3d99453e6ba66b328bb17cf0b8dec89ed4fc5ace397a1c089', 'hex');
- var key = HDPrivateKey.fromObject({
- network: 'testnet',
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- privateKey: privateKeyBuffer,
- chainCode: chainCodeBuffer
- });
- var derived = key.deriveChild("m/44'/0'/0'/0/0'");
- derived.privateKey.toString().should.equal('3348069561d2a0fb925e74bf198762acc47dce7db27372257d2d959a9e6f8aeb');
- });
-
- it('should NOT use full 32 bytes for private key data that is hashed with nonCompliant flag', function() {
- // This is to test that the previously implemented non-compliant to BIP32
- var privateKeyBuffer = new Buffer('00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd', 'hex');
- var chainCodeBuffer = new Buffer('9c8a5c863e5941f3d99453e6ba66b328bb17cf0b8dec89ed4fc5ace397a1c089', 'hex');
- var key = HDPrivateKey.fromObject({
- network: 'testnet',
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- privateKey: privateKeyBuffer,
- chainCode: chainCodeBuffer
- });
- var derived = key.deriveNonCompliantChild("m/44'/0'/0'/0/0'");
- derived.privateKey.toString().should.equal('4811a079bab267bfdca855b3bddff20231ff7044e648514fa099158472df2836');
- });
-
- it('should NOT use full 32 bytes for private key data that is hashed with the nonCompliant derive method', function() {
- // This is to test that the previously implemented non-compliant to BIP32
- var privateKeyBuffer = new Buffer('00000055378cf5fafb56c711c674143f9b0ee82ab0ba2924f19b64f5ae7cdbfd', 'hex');
- var chainCodeBuffer = new Buffer('9c8a5c863e5941f3d99453e6ba66b328bb17cf0b8dec89ed4fc5ace397a1c089', 'hex');
- var key = HDPrivateKey.fromObject({
- network: 'testnet',
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- privateKey: privateKeyBuffer,
- chainCode: chainCodeBuffer
- });
- var derived = key.derive("m/44'/0'/0'/0/0'");
- derived.privateKey.toString().should.equal('4811a079bab267bfdca855b3bddff20231ff7044e648514fa099158472df2836');
- });
-
- describe('edge cases', function() {
- var sandbox = sinon.sandbox.create();
- afterEach(function() {
- sandbox.restore();
- });
- it('will handle edge case that derived private key is invalid', function() {
- var invalid = new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex');
- var privateKeyBuffer = new Buffer('5f72914c48581fc7ddeb944a9616389200a9560177d24f458258e5b04527bcd1', 'hex');
- var chainCodeBuffer = new Buffer('39816057bba9d952fe87fe998b7fd4d690a1bb58c2ff69141469e4d1dffb4b91', 'hex');
- var unstubbed = bitcore.crypto.BN.prototype.toBuffer;
- var count = 0;
- var stub = sandbox.stub(bitcore.crypto.BN.prototype, 'toBuffer', function(args) {
- // On the fourth call to the function give back an invalid private key
- // otherwise use the normal behavior.
- count++;
- if (count === 4) {
- return invalid;
- }
- var ret = unstubbed.apply(this, arguments);
- return ret;
- });
- sandbox.spy(bitcore.PrivateKey, 'isValid');
- var key = HDPrivateKey.fromObject({
- network: 'testnet',
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- privateKey: privateKeyBuffer,
- chainCode: chainCodeBuffer
- });
- var derived = key.derive("m/44'");
- derived.privateKey.toString().should.equal('b15bce3608d607ee3a49069197732c656bca942ee59f3e29b4d56914c1de6825');
- bitcore.PrivateKey.isValid.callCount.should.equal(2);
- });
- it('will handle edge case that a derive public key is invalid', function() {
- var publicKeyBuffer = new Buffer('029e58b241790284ef56502667b15157b3fc58c567f044ddc35653860f9455d099', 'hex');
- var chainCodeBuffer = new Buffer('39816057bba9d952fe87fe998b7fd4d690a1bb58c2ff69141469e4d1dffb4b91', 'hex');
- var key = new HDPublicKey({
- network: 'testnet',
- depth: 0,
- parentFingerPrint: 0,
- childIndex: 0,
- chainCode: chainCodeBuffer,
- publicKey: publicKeyBuffer
- });
- var unstubbed = bitcore.PublicKey.fromPoint;
- bitcore.PublicKey.fromPoint = function() {
- bitcore.PublicKey.fromPoint = unstubbed;
- throw new Error('Point cannot be equal to Infinity');
- };
- sandbox.spy(key, '_deriveWithNumber');
- var derived = key.derive("m/44");
- key._deriveWithNumber.callCount.should.equal(2);
- key.publicKey.toString().should.equal('029e58b241790284ef56502667b15157b3fc58c567f044ddc35653860f9455d099');
- });
- });
-
- describe('seed', function() {
-
- it('should initialize a new BIP32 correctly from test vector 1 seed', function() {
- var seededKey = HDPrivateKey.fromSeed(vector1_master, Networks.livenet);
- seededKey.xprivkey.should.equal(vector1_m_private);
- seededKey.xpubkey.should.equal(vector1_m_public);
- });
-
- it('should initialize a new BIP32 correctly from test vector 2 seed', function() {
- var seededKey = HDPrivateKey.fromSeed(vector2_master, Networks.livenet);
- seededKey.xprivkey.should.equal(vector2_m_private);
- seededKey.xpubkey.should.equal(vector2_m_public);
- });
- });
-});
-
-//test vectors: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
-var vector1_master = '000102030405060708090a0b0c0d0e0f';
-var vector1_m_public = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
-var vector1_m_private = 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi';
-var vector1_m0h_public = 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw';
-var vector1_m0h_private = 'xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7';
-var vector1_m0h1_public = 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ';
-var vector1_m0h1_private = 'xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs';
-var vector1_m0h12h_public = 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5';
-var vector1_m0h12h_private = 'xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM';
-var vector1_m0h12h2_public = 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV';
-var vector1_m0h12h2_private = 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334';
-var vector1_m0h12h21000000000_public = 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy';
-var vector1_m0h12h21000000000_private = 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76';
-var vector2_master = 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542';
-var vector2_m_public = 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB';
-var vector2_m_private = 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U';
-var vector2_m0_public = 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH';
-var vector2_m0_private = 'xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt';
-var vector2_m02147483647h_public = 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a';
-var vector2_m02147483647h_private = 'xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9';
-var vector2_m02147483647h1_public = 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon';
-var vector2_m02147483647h1_private = 'xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef';
-var vector2_m02147483647h12147483646h_public = 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL';
-var vector2_m02147483647h12147483646h_private = 'xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc';
-var vector2_m02147483647h12147483646h2_public = 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt';
-var vector2_m02147483647h12147483646h2_private = 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j';
diff --git a/test/hdprivatekey.js b/test/hdprivatekey.js
deleted file mode 100644
index 6b63e62..0000000
--- a/test/hdprivatekey.js
+++ /dev/null
@@ -1,311 +0,0 @@
-'use strict';
-/* jshint unused: false */
-var _ = require('lodash');
-var assert = require('assert');
-var should = require('chai').should();
-var expect = require('chai').expect;
-var bitcore = require('..');
-var errors = bitcore.errors;
-var hdErrors = errors.HDPrivateKey;
-var buffer = require('buffer');
-var Networks = bitcore.Networks;
-var BufferUtil = bitcore.util.buffer;
-var HDPrivateKey = bitcore.HDPrivateKey;
-var Base58Check = bitcore.encoding.Base58Check;
-
-var xprivkey = 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi';
-var json = '{"network":"livenet","depth":0,"fingerPrint":876747070,"parentFingerPrint":0,"childIndex":0,"chainCode":"873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508","privateKey":"e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35","checksum":-411132559,"xprivkey":"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi"}';
-describe('HDPrivate key interface', function() {
- /* jshint maxstatements: 50 */
- var expectFail = function(func, error) {
- var got = null;
- try {
- func();
- } catch (e) {
- got = e instanceof error;
- }
- expect(got).to.equal(true);
- };
-
- var expectDerivationFail = function(argument, error) {
- return expectFail(function() {
- var privateKey = new HDPrivateKey(xprivkey);
- privateKey.derive(argument);
- }, error);
- };
-
- var expectFailBuilding = function(argument, error) {
- return expectFail(function() {
- return new HDPrivateKey(argument);
- }, error);
- };
-
- var expectSeedFail = function(argument, error) {
- return expectFail(function() {
- return HDPrivateKey.fromSeed(argument);
- }, error);
- };
-
- it('should make a new private key from random', function() {
- should.exist(new HDPrivateKey().xprivkey);
- });
-
- it('should make a new private key from random for testnet', function() {
- var key = new HDPrivateKey('testnet');
- should.exist(key.xprivkey);
- key.network.name.should.equal('testnet');
- });
-
- it('should not be able to change read-only properties', function() {
- var hdkey = new HDPrivateKey();
- expect(function() {
- hdkey.fingerPrint = 'notafingerprint';
- }).to.throw(TypeError);
- });
-
- it('should error with an invalid checksum', function() {
- expectFailBuilding(xprivkey + '1', errors.InvalidB58Checksum);
- });
-
- it('can be rebuilt from a json generated by itself', function() {
- var regenerate = new HDPrivateKey(json);
- regenerate.xprivkey.should.equal(xprivkey);
- });
-
- it('builds a json keeping the structure and same members', function() {
- assert(_.isEqual(
- new HDPrivateKey(json).toJSON(),
- new HDPrivateKey(xprivkey).toJSON()
- ));
- });
-
- describe('instantiation', function() {
- it('invalid argument: can not instantiate from a number', function() {
- expectFailBuilding(1, hdErrors.UnrecognizedArgument);
- });
- it('allows no-new calling', function() {
- HDPrivateKey(xprivkey).toString().should.equal(xprivkey);
- });
- it('allows the use of a copy constructor', function() {
- HDPrivateKey(HDPrivateKey(xprivkey))
- .xprivkey.should.equal(xprivkey);
- });
- });
-
- describe('public key', function() {
- var testnetKey = new HDPrivateKey('tprv8ZgxMBicQKsPdEeU2KiGFnUgRGriMnQxrwrg6FWCBg4jeiidHRyCCdA357kfkZiGaXEapWZsGDKikeeEbvgXo3UmEdbEKNdQH9VXESmGuUK');
- var livenetKey = new HDPrivateKey('xprv9s21ZrQH143K3e39bnn1vyS7YFa1EAJAFGDoeHaSBsgBxgAkTEXeSx7xLvhNQNJxJwhzziWcK3znUFKRPRwWBPkKZ8ijUBa5YYpYPQmeBDX');
-
- it('matches the network', function() {
- testnetKey.publicKey.network.should.equal(Networks.testnet);
- livenetKey.publicKey.network.should.equal(Networks.livenet);
- });
-
- it('cache for xpubkey works', function() {
- var privateKey = new HDPrivateKey(xprivkey);
- should.not.exist(privateKey._hdPublicKey);
- privateKey.xpubkey.should.equal(privateKey.xpubkey);
- should.exist(privateKey._hdPublicKey);
- });
-
- });
-
- it('inspect() displays correctly', function() {
- HDPrivateKey(xprivkey).inspect().should.equal('');
- });
- it('fails when trying to derive with an invalid argument', function() {
- expectDerivationFail([], hdErrors.InvalidDerivationArgument);
- });
-
- it('catches early invalid paths', function() {
- expectDerivationFail('s', hdErrors.InvalidPath);
- });
-
- it('allows derivation of hardened keys by passing a very big number', function() {
- var privateKey = new HDPrivateKey(xprivkey);
- var derivedByNumber = privateKey.derive(0x80000000);
- var derivedByArgument = privateKey.derive(0, true);
- derivedByNumber.xprivkey.should.equal(derivedByArgument.xprivkey);
- });
-
- it('returns itself with \'m\' parameter', function() {
- var privateKey = new HDPrivateKey(xprivkey);
- privateKey.should.equal(privateKey.derive('m'));
- });
-
- it('returns InvalidArgument if invalid data is given to getSerializedError', function() {
- expect(
- HDPrivateKey.getSerializedError(1) instanceof hdErrors.UnrecognizedArgument
- ).to.equal(true);
- });
-
- it('returns InvalidLength if data of invalid length is given to getSerializedError', function() {
- var b58s = Base58Check.encode(new buffer.Buffer('onestring'));
- expect(
- HDPrivateKey.getSerializedError(b58s) instanceof hdErrors.InvalidLength
- ).to.equal(true);
- });
-
- it('returns InvalidNetworkArgument if an invalid network is provided', function() {
- expect(
- HDPrivateKey.getSerializedError(xprivkey, 'invalidNetwork') instanceof errors.InvalidNetworkArgument
- ).to.equal(true);
- });
-
- it('recognizes that the wrong network was asked for', function() {
- expect(
- HDPrivateKey.getSerializedError(xprivkey, 'testnet') instanceof errors.InvalidNetwork
- ).to.equal(true);
- });
-
- it('recognizes the correct network', function() {
- expect(HDPrivateKey.getSerializedError(xprivkey, 'livenet')).to.equal(null);
- });
-
- describe('on creation from seed', function() {
- it('converts correctly from an hexa string', function() {
- should.exist(HDPrivateKey.fromSeed('01234567890abcdef01234567890abcdef').xprivkey);
- });
- it('fails when argument is not a buffer or string', function() {
- expectSeedFail(1, hdErrors.InvalidEntropyArgument);
- });
- it('fails when argument doesn\'t provide enough entropy', function() {
- expectSeedFail('01', hdErrors.InvalidEntropyArgument.NotEnoughEntropy);
- });
- it('fails when argument provides too much entropy', function() {
- var entropy = '0';
- for (var i = 0; i < 129; i++) {
- entropy += '1';
- }
- expectSeedFail(entropy, hdErrors.InvalidEntropyArgument.TooMuchEntropy);
- });
- });
-
- it('correctly errors if an invalid checksum is provided', function() {
- var privKey = new HDPrivateKey(xprivkey);
- var error = null;
- try {
- var buffers = privKey._buffers;
- buffers.checksum = BufferUtil.integerAsBuffer(0);
- var privateKey = new HDPrivateKey(buffers);
- } catch (e) {
- error = e;
- }
- expect(error instanceof errors.InvalidB58Checksum).to.equal(true);
- });
- it('correctly validates the checksum', function() {
- var privKey = new HDPrivateKey(xprivkey);
- expect(function() {
- var buffers = privKey._buffers;
- return new HDPrivateKey(buffers);
- }).to.not.throw();
- });
-
- it('shouldn\'t matter if derivations are made with strings or numbers', function() {
- var privateKey = new HDPrivateKey(xprivkey);
- var derivedByString = privateKey.derive('m/0\'/1/2\'');
- var derivedByNumber = privateKey.derive(0, true).derive(1).derive(2, true);
- derivedByNumber.xprivkey.should.equal(derivedByString.xprivkey);
- });
-
- describe('validates paths', function() {
- it('validates correct paths', function() {
- var valid;
-
- valid = HDPrivateKey.isValidPath('m/0\'/1/2\'');
- valid.should.equal(true);
-
- valid = HDPrivateKey.isValidPath('m');
- valid.should.equal(true);
-
- valid = HDPrivateKey.isValidPath(123, true);
- valid.should.equal(true);
-
- valid = HDPrivateKey.isValidPath(123);
- valid.should.equal(true);
-
- valid = HDPrivateKey.isValidPath(HDPrivateKey.Hardened + 123);
- valid.should.equal(true);
-
- valid = HDPrivateKey.isValidPath(HDPrivateKey.Hardened + 123, true);
- valid.should.equal(true);
- });
-
-
- var invalid = [
- 'm/-1/12',
- 'bad path',
- 'K',
- 'm/',
- 'm/12asd',
- 'm/1/2//3'
- ];
-
- invalid.forEach(function(datum) {
- it('rejects illegal path ' + datum, function() {
- HDPrivateKey.isValidPath(datum).should.equal(false);
- expect(HDPrivateKey._getDerivationIndexes(datum)).to.equal(null);
- });
- });
-
- it('generates deriving indexes correctly', function() {
- var indexes;
-
- indexes = HDPrivateKey._getDerivationIndexes('m/-1/12');
- expect(indexes).to.equal(null);
-
- indexes = HDPrivateKey._getDerivationIndexes('m/0/12/12\'');
- indexes.should.eql([0, 12, HDPrivateKey.Hardened + 12]);
-
- indexes = HDPrivateKey._getDerivationIndexes('m/0/12/12\'');
- indexes.should.eql([0, 12, HDPrivateKey.Hardened + 12]);
- });
-
- });
-
- describe('conversion to/from buffer', function() {
- var str = 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi';
- it('should roundtrip to/from a buffer', function() {
- var priv = new HDPrivateKey(str);
- var toBuffer = priv.toBuffer();
- var fromBuffer = HDPrivateKey.fromBuffer(toBuffer);
- var roundTrip = new HDPrivateKey(fromBuffer.toBuffer());
- roundTrip.xprivkey.should.equal(str);
- });
- });
-
- describe('conversion to plain object/json', function() {
- var plainObject = {
- 'network': 'livenet',
- 'depth': 0,
- 'fingerPrint': 876747070,
- 'parentFingerPrint': 0,
- 'childIndex': 0,
- 'chainCode': '873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508',
- 'privateKey': 'e8f32e723decf4051aefac8e2c93c9c5b214313817cdb01a1494b917c8436b35',
- 'checksum': -411132559,
- 'xprivkey': 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvN' +
- 'KmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi'
- };
- it('toObject leaves no Buffer instances', function() {
- var privKey = new HDPrivateKey(xprivkey);
- var object = privKey.toObject();
- _.each(_.values(object), function(value) {
- expect(BufferUtil.isBuffer(value)).to.equal(false);
- });
- });
- it('roundtrips toObject', function() {
- expect(HDPrivateKey.fromObject(new HDPrivateKey(xprivkey).toObject()).xprivkey).to.equal(xprivkey);
- });
- it('roundtrips to JSON and to Object', function() {
- var privkey = new HDPrivateKey(xprivkey);
- expect(HDPrivateKey.fromObject(privkey.toJSON()).xprivkey).to.equal(xprivkey);
- });
- it('recovers state from JSON', function() {
- new HDPrivateKey(JSON.stringify(plainObject)).xprivkey.should.equal(xprivkey);
- });
- it('recovers state from Object', function() {
- new HDPrivateKey(plainObject).xprivkey.should.equal(xprivkey);
- });
- });
-});
diff --git a/test/hdpublickey.js b/test/hdpublickey.js
deleted file mode 100644
index d51ee35..0000000
--- a/test/hdpublickey.js
+++ /dev/null
@@ -1,275 +0,0 @@
-'use strict';
-
-/* jshint unused: false */
-var _ = require('lodash');
-var assert = require('assert');
-var should = require('chai').should();
-var expect = require('chai').expect;
-var bitcore = require('..');
-var buffer = require('buffer');
-var errors = bitcore.errors;
-var hdErrors = bitcore.errors.HDPublicKey;
-var BufferUtil = bitcore.util.buffer;
-var HDPrivateKey = bitcore.HDPrivateKey;
-var HDPublicKey = bitcore.HDPublicKey;
-var Base58Check = bitcore.encoding.Base58Check;
-var Networks = bitcore.Networks;
-
-var xprivkey = 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi';
-var xpubkey = 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8';
-var xpubkeyTestnet = 'tpubD6NzVbkrYhZ4WZaiWHz59q5EQ61bd6dUYfU4ggRWAtNAyyYRNWT6ktJ7UHJEXURvTfTfskFQmK7Ff4FRkiRN5wQH8nkGAb6aKB4Yyeqsw5m';
-var json = '{"network":"livenet","depth":0,"fingerPrint":876747070,"parentFingerPrint":0,"childIndex":0,"chainCode":"873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508","publicKey":"0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2","checksum":-1421395167,"xpubkey":"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"}';
-var derived_0_1_200000 = 'xpub6BqyndF6rkBNTV6LXwiY8Pco8aqctqq7tGEUdA8fmGDTnDJphn2fmxr3eM8Lm3m8TrNUsLbEjHvpa3adBU18YpEx4tp2Zp6nqax3mQkudhX';
-
-describe('HDPublicKey interface', function() {
-
- var expectFail = function(func, errorType) {
- (function() {
- func();
- }).should.throw(errorType);
- };
-
- var expectDerivationFail = function(argument, error) {
- (function() {
- var pubkey = new HDPublicKey(xpubkey);
- pubkey.derive(argument);
- }).should.throw(error);
- };
-
- var expectFailBuilding = function(argument, error) {
- (function() {
- return new HDPublicKey(argument);
- }).should.throw(error);
- };
-
- describe('creation formats', function() {
-
- it('returns same argument if already an instance of HDPublicKey', function() {
- var publicKey = new HDPublicKey(xpubkey);
- publicKey.should.equal(new HDPublicKey(publicKey));
- });
-
- it('returns the correct xpubkey for a xprivkey', function() {
- var publicKey = new HDPublicKey(xprivkey);
- publicKey.xpubkey.should.equal(xpubkey);
- });
-
- it('allows to call the argument with no "new" keyword', function() {
- HDPublicKey(xpubkey).xpubkey.should.equal(new HDPublicKey(xpubkey).xpubkey);
- });
-
- it('fails when user doesn\'t supply an argument', function() {
- expectFailBuilding(null, hdErrors.MustSupplyArgument);
- });
-
- it('should not be able to change read-only properties', function() {
- var publicKey = new HDPublicKey(xprivkey);
- expect(function() {
- publicKey.fingerPrint = 'notafingerprint';
- }).to.throw(TypeError);
- });
-
- it('doesn\'t recognize an invalid argument', function() {
- expectFailBuilding(1, hdErrors.UnrecognizedArgument);
- expectFailBuilding(true, hdErrors.UnrecognizedArgument);
- });
-
-
- describe('xpubkey string serialization errors', function() {
- it('fails on invalid length', function() {
- expectFailBuilding(
- Base58Check.encode(new buffer.Buffer([1, 2, 3])),
- hdErrors.InvalidLength
- );
- });
- it('fails on invalid base58 encoding', function() {
- expectFailBuilding(
- xpubkey + '1',
- errors.InvalidB58Checksum
- );
- });
- it('user can ask if a string is valid', function() {
- (HDPublicKey.isValidSerialized(xpubkey)).should.equal(true);
- });
- });
-
- it('can be generated from a json', function() {
- expect(new HDPublicKey(JSON.parse(json)).xpubkey).to.equal(xpubkey);
- });
-
- it('can generate a json that has a particular structure', function() {
- assert(_.isEqual(
- new HDPublicKey(JSON.parse(json)).toJSON(),
- new HDPublicKey(xpubkey).toJSON()
- ));
- });
-
- it('builds from a buffer object', function() {
- (new HDPublicKey(new HDPublicKey(xpubkey)._buffers)).xpubkey.should.equal(xpubkey);
- });
-
- it('checks the checksum', function() {
- var buffers = new HDPublicKey(xpubkey)._buffers;
- buffers.checksum = BufferUtil.integerAsBuffer(1);
- expectFail(function() {
- return new HDPublicKey(buffers);
- }, errors.InvalidB58Checksum);
- });
- });
-
- describe('error checking on serialization', function() {
- var compareType = function(a, b) {
- expect(a instanceof b).to.equal(true);
- };
- it('throws invalid argument when argument is not a string or buffer', function() {
- compareType(HDPublicKey.getSerializedError(1), hdErrors.UnrecognizedArgument);
- });
- it('if a network is provided, validates that data corresponds to it', function() {
- compareType(HDPublicKey.getSerializedError(xpubkey, 'testnet'), errors.InvalidNetwork);
- });
- it('recognizes invalid network arguments', function() {
- compareType(HDPublicKey.getSerializedError(xpubkey, 'invalid'), errors.InvalidNetworkArgument);
- });
- it('recognizes a valid network', function() {
- expect(HDPublicKey.getSerializedError(xpubkey, 'livenet')).to.equal(null);
- });
- });
-
- it('toString() returns the same value as .xpubkey', function() {
- var pubKey = new HDPublicKey(xpubkey);
- pubKey.toString().should.equal(pubKey.xpubkey);
- });
-
- it('publicKey property matches network', function() {
- var livenet = new HDPublicKey(xpubkey);
- var testnet = new HDPublicKey(xpubkeyTestnet);
-
- livenet.publicKey.network.should.equal(Networks.livenet);
- testnet.publicKey.network.should.equal(Networks.testnet);
- });
-
- it('inspect() displays correctly', function() {
- var pubKey = new HDPublicKey(xpubkey);
- pubKey.inspect().should.equal('');
- });
-
- describe('conversion to/from buffer', function() {
-
- it('should roundtrip to an equivalent object', function() {
- var pubKey = new HDPublicKey(xpubkey);
- var toBuffer = pubKey.toBuffer();
- var fromBuffer = HDPublicKey.fromBuffer(toBuffer);
- var roundTrip = new HDPublicKey(fromBuffer.toBuffer());
- roundTrip.xpubkey.should.equal(xpubkey);
- });
- });
-
- describe('conversion to different formats', function() {
- var plainObject = {
- 'network':'livenet',
- 'depth':0,
- 'fingerPrint':876747070,
- 'parentFingerPrint':0,
- 'childIndex':0,
- 'chainCode':'873dff81c02f525623fd1fe5167eac3a55a049de3d314bb42ee227ffed37d508',
- 'publicKey':'0339a36013301597daef41fbe593a02cc513d0b55527ec2df1050e2e8ff49c85c2',
- 'checksum':-1421395167,
- 'xpubkey':'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8'
- };
- it('roundtrips to JSON and to Object', function() {
- var pubkey = new HDPublicKey(xpubkey);
- expect(HDPublicKey.fromObject(pubkey.toJSON()).xpubkey).to.equal(xpubkey);
- });
- it('recovers state from Object', function() {
- new HDPublicKey(plainObject).xpubkey.should.equal(xpubkey);
- });
- });
-
- describe('derivation', function() {
- it('derivation is the same whether deriving with number or string', function() {
- var pubkey = new HDPublicKey(xpubkey);
- var derived1 = pubkey.derive(0).derive(1).derive(200000);
- var derived2 = pubkey.derive('m/0/1/200000');
- derived1.xpubkey.should.equal(derived_0_1_200000);
- derived2.xpubkey.should.equal(derived_0_1_200000);
- });
-
- it('allows special parameters m, M', function() {
- var expectDerivationSuccess = function(argument) {
- new HDPublicKey(xpubkey).derive(argument).xpubkey.should.equal(xpubkey);
- };
- expectDerivationSuccess('m');
- expectDerivationSuccess('M');
- });
-
- it('doesn\'t allow object arguments for derivation', function() {
- expectFail(function() {
- return new HDPublicKey(xpubkey).derive({});
- }, hdErrors.InvalidDerivationArgument);
- });
-
- it('needs first argument for derivation', function() {
- expectFail(function() {
- return new HDPublicKey(xpubkey).derive('s');
- }, hdErrors.InvalidPath);
- });
-
- it('doesn\'t allow other parameters like m\' or M\' or "s"', function() {
- /* jshint quotmark: double */
- expectDerivationFail("m'", hdErrors.InvalidIndexCantDeriveHardened);
- expectDerivationFail("M'", hdErrors.InvalidIndexCantDeriveHardened);
- expectDerivationFail("1", hdErrors.InvalidPath);
- expectDerivationFail("S", hdErrors.InvalidPath);
- });
-
- it('can\'t derive hardened keys', function() {
- expectFail(function() {
- return new HDPublicKey(xpubkey).derive(HDPublicKey.Hardened);
- }, hdErrors.InvalidIndexCantDeriveHardened);
- });
-
- it('can\'t derive hardened keys via second argument', function() {
- expectFail(function() {
- return new HDPublicKey(xpubkey).derive(5, true);
- }, hdErrors.InvalidIndexCantDeriveHardened);
- });
-
- it('validates correct paths', function() {
- var valid;
-
- valid = HDPublicKey.isValidPath('m/123/12');
- valid.should.equal(true);
-
- valid = HDPublicKey.isValidPath('m');
- valid.should.equal(true);
-
- valid = HDPublicKey.isValidPath(123);
- valid.should.equal(true);
- });
-
- it('rejects illegal paths', function() {
- var valid;
-
- valid = HDPublicKey.isValidPath('m/-1/12');
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath("m/0'/12");
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath("m/8000000000/12");
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath('bad path');
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath(-1);
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath(8000000000);
- valid.should.equal(false);
-
- valid = HDPublicKey.isValidPath(HDPublicKey.Hardened);
- valid.should.equal(false);
- });
- });
-});
diff --git a/test/index.html b/test/index.html
deleted file mode 100644
index 87c0cf3..0000000
--- a/test/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
- Mocha
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/test/index.js b/test/index.js
deleted file mode 100644
index 47bad73..0000000
--- a/test/index.js
+++ /dev/null
@@ -1,16 +0,0 @@
-"use strict";
-
-var should = require("chai").should();
-var bitcore = require("../");
-
-describe('#versionGuard', function() {
- it('global._bitcore should be defined', function() {
- should.equal(global._bitcore, bitcore.version);
- });
-
- it('throw an error if version is already defined', function() {
- (function() {
- bitcore.versionGuard('version');
- }).should.throw('More than one instance of bitcore');
- });
-});
diff --git a/test/mocha.opts b/test/mocha.opts
deleted file mode 100644
index 9409cf5..0000000
--- a/test/mocha.opts
+++ /dev/null
@@ -1,2 +0,0 @@
---recursive
---timeout 5000
diff --git a/test/mytest.js b/test/mytest.js
deleted file mode 100644
index 40d8623..0000000
--- a/test/mytest.js
+++ /dev/null
@@ -1,236 +0,0 @@
-'use strict';
-
-var bitcore = require('..');
-var buffer = require('buffer');
-var scrypt = require('scryptsy')
-var aesjs = require("aes-js")
-//var privateKey = new bitcore.PrivateKey(null, 'testnet');
-var privateKey = bitcore.PrivateKey.fromWIF('Y8JhshTg5j2jeTrwk3qBJDYGi5MVsAvfBJRgFfAp14T91UY9AHgZ')
-var address = privateKey.toAddress();
-var publicKey = privateKey.toPublicKey();
-
-/*
-var info = {
- nTxType: 2,
- nVersion: 1,
- nValidHeight: 601606,
- fees: 10000,
- pubkey: '02ab72cfecc7055501b397e1150b3dc528f2fd5647241924824a5afc0b5a818221',
- minerPubkey: ''
- };
-
-var register = new bitcore.Transaction.RegisterAccountTx(info);
-console.log(register.pubkey)
-var ret = register._SignatureHash()
-console.log(ret.toString('hex'))
-
-register._Signtx(privateKey);
-
-console.log(address.toString())
-console.log(privateKey.toWIF())
-console.log(publicKey.toString())
-
-var buf = buffer.Buffer.from('123')
-console.log(buf.length)
-
-var hex = register.SerializeTx(privateKey)
-console.log(hex)
-*/
-
-/*
-var commonTxinfo = {
- nTxType: 3,
- nVersion: 1,
- nValidHeight: 602371,
- fees: 10000,
- srcRegId: '54528-1',
- destAddr: 'wh82HNEDZkZP2eVAS5t7dDxmJWqyx9gr65',
- value: 10000000000,
- network: 'testnet'
- };
-
- var value = 10000000000
- var tmp = (value >>> 7)
-
- var commonTx = new bitcore.Transaction.CommonTx(commonTxinfo);
- console.log(commonTx.destAddr)
-
- var ret = commonTx._SignatureHash()
- console.log(ret.toString('hex'))
-
- commonTx._Signtx(privateKey);
-
- var hex = commonTx.SerializeTx(privateKey)
- console.log(hex)
-*/
-
-//var contract = bitcore.util.util.getSpcContractData('wUCVEiaEzNvWMo9B1gwQ4Us8oNz8T1zZVn', 100000000)
-
-/*
-var iteminfo1 = {
- playType:1,
- betType:1,
- times: 1,
- money: 200000000
-}
-
-var item1 = new bitcore.util.BetItem(iteminfo1)
-
-var itemList = []
-itemList.push(item1)
-
-var iteminfo2 = {
- playType:2,
- betType:1,
- times: 1,
- money: 200000000
-}
-
-var item2 = new bitcore.util.BetItem(iteminfo2)
-itemList.push(item2)
-
-console.log(itemList.length)
-console.log(typeof(itemList))
-console.log(itemList instanceof Array);
-
-var contract = bitcore.util.util.getBetContractData('397FB303-393A-4C10-9142-B1FDCD80B722', 'wUCVEiaEzNvWMo9B1gwQ4Us8oNz8T1zZVn', 1, itemList)
-
-var contractTxinfo = {
- nTxType: 4,
- nVersion: 1,
- nValidHeight: 602623,
- srcRegId: '54528-1',
- destRegId: '418581-2',
- fees: 1000000,
- value: 0,
- vContract: contract
- };
-
- var contractTx = new bitcore.Transaction.ContractTx(contractTxinfo);
- console.log(contractTx.vContract.toString('hex'))
-
- var ret = contractTx._SignatureHash()
- console.log(ret.toString('hex'))
-
- contractTx._Signtx(privateKey);
-
- var hex = contractTx.SerializeTx(privateKey)
- console.log(hex)
-
-*/
-
-/*
-var votefund1 = {
- operType: bitcore.util.VoteFund.ADD_FUND,
- pubkey: '0210a1a5ad1b00492fcd241905e361c80f7bb641361ef219350018e3205ca322f7',
- value: 100000000
-}
-
-var item1 = new bitcore.util.VoteFund(votefund1)
-var itemList = []
-itemList.push(item1)
-
-var votefund2 = {
- operType: bitcore.util.VoteFund.ADD_FUND,
- pubkey: '03d1ed364d09d95605a173f8fea3fac84ae73fdb87e52ff4d7c837f16a9ba6b1e6',
- value: 200000000
-}
-
-var item2 = new bitcore.util.VoteFund(votefund2)
-itemList.push(item2)
-
-var delegateData = bitcore.util.util.getDelegateData(itemList)
-console.log(delegateData.toString('hex'))
-
-var delegateTxinfo = {
- nTxType: 6,
- nVersion: 1,
- nValidHeight: 770746,
- srcRegId: '54528-1',
- delegateData: delegateData,
- fees: 1000000
- };
-
- var delegateTx = new bitcore.Transaction.DelegateTx(delegateTxinfo);
- console.log(delegateTx.delegateData.toString('hex'))
-
- var ret = delegateTx._SignatureHash()
- console.log(ret.toString('hex'))
-
- delegateTx._Signtx(privateKey);
-
- var hex = delegateTx.SerializeTx(privateKey)
- console.log(hex)
-
-
-var code = new bitcore.Mnemonic(bitcore.Mnemonic.Words.ENGLISH);
-console.log(code.toString()); // natal hada sutil año sólido papel jamón combate aula flota ver esfera...
-var xpriv = code.toHDPrivateKey(null, 'livenet');
-console.log(xpriv.toString())
-var seed = code.toSeed()
-console.log(seed.toString('hex'))
-
-var password = "pleaseletmein"
-var salt = "SodiumChloride"
-var data = scrypt(password, salt, 16384, 8, 1, 64)
-console.log(data.toString('hex'))
-*/
-//var arg = {network: 'livenet'}
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-var strMne = wiccApi.createAllCoinMnemonicCode()
-console.log(strMne)
-
-var begin1 = new Date().getTime();
-var priKey = wiccApi.getPriKeyFromMnemonicCode(strMne)//计算耗时
-var end1 = new Date().getTime();
-console.log('耗时:'+(end1-begin1),'priKey:'+priKey);
-
-var begin2 = new Date().getTime();
-var addressFromMn = wiccApi.getAddressFromMnemonicCode(strMne)//计算耗时
-var end2 = new Date().getTime();
-console.log('耗时:'+(end2-begin2),'addressFromMn:'+addressFromMn)
-
-var ret = wiccApi.checkMnemonicCode(strMne)
-console.log(ret)
-
-ret = wiccApi.validateAddress('wPcHigM3Gbtbooxyd3YyBXiMintZnfD7cE')
-console.log(ret)
-
-var reginfo = {
- nTxType: 2,
- nVersion: 1,
- nValidHeight: 601606,
- fees: 10000,
- pubkey: publicKey.toString(),
- minerPubkey: ''
- };
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.REGISTER_ACCOUNT_TX, reginfo)
-console.log("test createSignTrasaction: ")
-console.log(rawtx)
-
-var begin3 = new Date().getTime();
-var walletinfo = wiccApi.createWallet(strMne, '12345678')//计算耗时
-var end3 = new Date().getTime();
-console.log('耗时:'+(end3-begin3),'walletinfo:'+walletinfo)
-
-var begin4 = new Date().getTime();
-var pri = wiccApi.getPriKeyFromSeed(walletinfo.seedinfo, '12345678')//计算耗时
-var end4 = new Date().getTime();
-console.log('耗时:'+(end4-begin4))
-console.log("test getPriKeyFromSeed:"+pri)
-
-var privateKey = bitcore.PrivateKey.fromWIF(pri)
-var address = privateKey.toAddress();
-console.log(address.toString())
-
-var Mne = wiccApi.getMnemonicCodeFromSeed(walletinfo.seedinfo, '12345678')
-console.log(Mne)
-
-var newSeedInfo = wiccApi.changePassword(walletinfo.seedinfo, '12345678', '87654321')
-console.log(newSeedInfo)
-
-pri = wiccApi.getPriKeyFromSeed(newSeedInfo, '87654321')
-console.log(pri)
\ No newline at end of file
diff --git a/test/networks.js b/test/networks.js
deleted file mode 100644
index ea265cf..0000000
--- a/test/networks.js
+++ /dev/null
@@ -1,128 +0,0 @@
-'use strict';
-
-var expect = require('chai').expect;
-var should = require('chai').should();
-var bitcore = require('..');
-var networks = bitcore.Networks;
-
-describe('Networks', function() {
-
- var customnet;
-
- it('should contain all Networks', function() {
- should.exist(networks.livenet);
- should.exist(networks.testnet);
- should.exist(networks.defaultNetwork);
- });
-
- it('will enable/disable regtest Network', function() {
- networks.enableRegtest();
- networks.testnet.networkMagic.should.deep.equal(new Buffer('fabfb5da', 'hex'));
- networks.testnet.port.should.equal(18444);
- networks.testnet.dnsSeeds.should.deep.equal([]);
- networks.testnet.regtestEnabled.should.equal(true);
-
- networks.disableRegtest();
- networks.testnet.networkMagic.should.deep.equal(new Buffer('0b110907', 'hex'));
- networks.testnet.port.should.equal(18333);
- networks.testnet.dnsSeeds.should.deep.equal([
- 'testnet-seed.bitcoin.petertodd.org',
- 'testnet-seed.bluematt.me',
- 'testnet-seed.alexykot.me',
- 'testnet-seed.bitcoin.schildbach.de'
- ]);
- });
-
- it('will get network based on string "regtest" value', function() {
- var network = networks.get('regtest');
- network.should.equal(networks.testnet);
- });
-
- it('should be able to define a custom Network', function() {
- var custom = {
- name: 'customnet',
- alias: 'mynet',
- pubkeyhash: 0x10,
- privatekey: 0x90,
- scripthash: 0x08,
- xpubkey: 0x0278b20e,
- xprivkey: 0x0278ade4,
- networkMagic: 0xe7beb4d4,
- port: 20001,
- dnsSeeds: [
- 'localhost',
- 'mynet.localhost'
- ]
- };
- networks.add(custom);
- customnet = networks.get('customnet');
- for (var key in custom) {
- if (key !== 'networkMagic') {
- customnet[key].should.equal(custom[key]);
- } else {
- var expected = new Buffer('e7beb4d4', 'hex');
- customnet[key].should.deep.equal(expected);
- }
- }
- });
-
- it('can remove a custom network', function() {
- networks.remove(customnet);
- var net = networks.get('customnet');
- should.equal(net, undefined);
- });
-
- it('should not set a network map for an undefined value', function() {
- var custom = {
- name: 'somenet',
- pubkeyhash: 0x13,
- privatekey: 0x93,
- scripthash: 0x11,
- xpubkey: 0x0278b20f,
- xprivkey: 0x0278ade5,
- networkMagic: 0xe7beb4d5,
- port: 20008,
- dnsSeeds: [
- 'somenet.localhost'
- ]
- };
- networks.add(custom);
- var network = networks.get(undefined);
- should.not.exist(network);
- var somenet = networks.get('somenet');
- should.exist(somenet);
- somenet.name.should.equal('somenet');
- networks.remove(somenet);
- });
-
- var constants = ['name', 'alias', 'pubkeyhash', 'scripthash', 'xpubkey', 'xprivkey'];
-
- constants.forEach(function(key){
- it('should have constant '+key+' for livenet and testnet', function(){
- networks.testnet.hasOwnProperty(key).should.equal(true);
- networks.livenet.hasOwnProperty(key).should.equal(true);
- });
- });
-
- it('tests only for the specified key', function() {
- expect(networks.get(0x6f, 'pubkeyhash')).to.equal(networks.testnet);
- expect(networks.get(0x6f, 'privatekey')).to.equal(undefined);
- });
-
- it('can test for multiple keys', function() {
- expect(networks.get(0x6f, ['pubkeyhash', 'scripthash'])).to.equal(networks.testnet);
- expect(networks.get(0xc4, ['pubkeyhash', 'scripthash'])).to.equal(networks.testnet);
- expect(networks.get(0x6f, ['privatekey', 'port'])).to.equal(undefined);
- });
-
- it('converts to string using the "name" property', function() {
- networks.livenet.toString().should.equal('livenet');
- });
-
- it('network object should be immutable', function() {
- expect(networks.testnet.name).to.equal('testnet')
- var fn = function() { networks.testnet.name = 'livenet' }
- expect(fn).to.throw(TypeError)
- });
-
-});
diff --git a/test/opcode.js b/test/opcode.js
deleted file mode 100644
index 5de57bd..0000000
--- a/test/opcode.js
+++ /dev/null
@@ -1,165 +0,0 @@
-'use strict';
-
-var _ = require('lodash');
-var chai = require('chai');
-var should = chai.should();
-var expect = chai.expect;
-var bitcore = require('..');
-var Opcode = bitcore.Opcode;
-
-describe('Opcode', function() {
-
- it('should create a new Opcode', function() {
- var opcode = new Opcode(5);
- should.exist(opcode);
- });
-
- it('should convert to a string with this handy syntax', function() {
- Opcode(0).toString().should.equal('OP_0');
- Opcode(96).toString().should.equal('OP_16');
- Opcode(97).toString().should.equal('OP_NOP');
- });
-
- it('should convert to a number with this handy syntax', function() {
- Opcode('OP_0').toNumber().should.equal(0);
- Opcode('OP_16').toNumber().should.equal(96);
- Opcode('OP_NOP').toNumber().should.equal(97);
- });
-
- describe('#fromNumber', function() {
- it('should work for 0', function() {
- Opcode.fromNumber(0).num.should.equal(0);
- });
- it('should fail for non-number', function() {
- Opcode.fromNumber.bind(null, 'a string').should.throw('Invalid Argument');
- });
- });
-
- describe('#set', function() {
- it('should work for object', function() {
- Opcode(42).num.should.equal(42);
- });
- it('should fail for empty-object', function() {
- expect(function() {
- Opcode();
- }).to.throw(TypeError);
- });
- });
-
- describe('#toNumber', function() {
- it('should work for 0', function() {
- Opcode.fromNumber(0).toNumber().should.equal(0);
- });
- });
-
- describe('#buffer', function() {
- it('should correctly input/output a buffer', function() {
- var buf = new Buffer('a6', 'hex');
- Opcode.fromBuffer(buf).toBuffer().should.deep.equal(buf);
- });
- });
-
- describe('#fromString', function() {
- it('should work for OP_0', function() {
- Opcode.fromString('OP_0').num.should.equal(0);
- });
- it('should fail for invalid string', function() {
- Opcode.fromString.bind(null, 'OP_SATOSHI').should.throw('Invalid opcodestr');
- Opcode.fromString.bind(null, 'BANANA').should.throw('Invalid opcodestr');
- });
- it('should fail for non-string', function() {
- Opcode.fromString.bind(null, 123).should.throw('Invalid Argument');
- });
- });
-
- describe('#toString', function() {
- it('should work for OP_0', function() {
- Opcode.fromString('OP_0').toString().should.equal('OP_0');
- });
-
- it('should not work for non-opcode', function() {
- expect(function(){
- Opcode('OP_NOTACODE').toString();
- }).to.throw('Opcode does not have a string representation');
- });
- });
-
- describe('@map', function() {
- it('should have a map containing 117 elements', function() {
- _.size(Opcode.map).should.equal(117);
- });
- });
-
- describe('@reverseMap', function() {
- it('should exist and have op 185', function() {
- should.exist(Opcode.reverseMap);
- Opcode.reverseMap[185].should.equal('OP_NOP10');
- });
- });
- var smallints = [
- Opcode('OP_0'),
- Opcode('OP_1'),
- Opcode('OP_2'),
- Opcode('OP_3'),
- Opcode('OP_4'),
- Opcode('OP_5'),
- Opcode('OP_6'),
- Opcode('OP_7'),
- Opcode('OP_8'),
- Opcode('OP_9'),
- Opcode('OP_10'),
- Opcode('OP_11'),
- Opcode('OP_12'),
- Opcode('OP_13'),
- Opcode('OP_14'),
- Opcode('OP_15'),
- Opcode('OP_16')
- ];
-
- describe('@smallInt', function() {
- var testSmallInt = function(n, op) {
- Opcode.smallInt(n).toString().should.equal(op.toString());
- };
-
- for (var i = 0; i < smallints.length; i++) {
- var op = smallints[i];
- it('should work for small int ' + op, testSmallInt.bind(null, i, op));
- }
-
- it('with not number', function () {
- Opcode.smallInt.bind(null, '2').should.throw('Invalid Argument');
- });
-
- it('with n equal -1', function () {
- Opcode.smallInt.bind(null, -1).should.throw('Invalid Argument');
- });
-
- it('with n equal 17', function () {
- Opcode.smallInt.bind(null, 17).should.throw('Invalid Argument');
- });
- });
- describe('@isSmallIntOp', function() {
- var testIsSmallInt = function(op) {
- Opcode.isSmallIntOp(op).should.equal(true);
- };
- for (var i = 0; i < smallints.length; i++) {
- var op = smallints[i];
- it('should work for small int ' + op, testIsSmallInt.bind(null, op));
- }
-
- it('should work for non-small ints', function() {
- Opcode.isSmallIntOp(Opcode('OP_RETURN')).should.equal(false);
- Opcode.isSmallIntOp(Opcode('OP_CHECKSIG')).should.equal(false);
- Opcode.isSmallIntOp(Opcode('OP_IF')).should.equal(false);
- Opcode.isSmallIntOp(Opcode('OP_NOP')).should.equal(false);
- });
-
- });
-
- describe('#inspect', function() {
- it('should output opcode by name, hex, and decimal', function() {
- Opcode.fromString('OP_NOP').inspect().should.equal('');
- });
- });
-
-});
diff --git a/test/privatekey.js b/test/privatekey.js
deleted file mode 100644
index db45f60..0000000
--- a/test/privatekey.js
+++ /dev/null
@@ -1,457 +0,0 @@
-'use strict';
-
-var chai = require('chai');
-var should = chai.should();
-var expect = chai.expect;
-
-var bitcore = require('..');
-var BN = bitcore.crypto.BN;
-var Point = bitcore.crypto.Point;
-var PrivateKey = bitcore.PrivateKey;
-var Networks = bitcore.Networks;
-var Base58Check = bitcore.encoding.Base58Check;
-
-var validbase58 = require('./data/bitcoind/base58_keys_valid.json');
-var invalidbase58 = require('./data/bitcoind/base58_keys_invalid.json');
-
-describe('PrivateKey', function() {
- var hex = '96c132224121b509b7d0a16245e957d9192609c5637c6228311287b1be21627a';
- var hex2 = '8080808080808080808080808080808080808080808080808080808080808080';
- var buf = new Buffer(hex, 'hex');
- var wifTestnet = 'cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG';
- var wifTestnetUncompressed = '92jJzK4tbURm1C7udQXxeCBvXHoHJstDXRxAMouPG1k1XUaXdsu';
- var wifLivenet = 'L2Gkw3kKJ6N24QcDuH4XDqt9cTqsKTVNDGz1CRZhk9cq4auDUbJy';
- var wifLivenetUncompressed = '5JxgQaFM1FMd38cd14e3mbdxsdSa9iM2BV6DHBYsvGzxkTNQ7Un';
- var wifNamecoin = '74pxNKNpByQ2kMow4d9kF6Z77BYeKztQNLq3dSyU4ES1K5KLNiz';
-
- it('should create a new random private key', function() {
- var a = new PrivateKey();
- should.exist(a);
- should.exist(a.bn);
- var b = PrivateKey();
- should.exist(b);
- should.exist(b.bn);
- });
-
- it('should create a privatekey from hexa string', function() {
- var a = new PrivateKey(hex2);
- should.exist(a);
- should.exist(a.bn);
- });
-
- it('should create a new random testnet private key with only one argument', function() {
- var a = new PrivateKey(Networks.testnet);
- should.exist(a);
- should.exist(a.bn);
- });
-
- it('should create a private key from a custom network WIF string', function() {
- var nmc = {
- name: 'namecoin',
- alias: 'namecoin',
- pubkeyhash: 0x34,
- privatekey: 0xB4,
- // these below aren't the real NMC version numbers
- scripthash: 0x08,
- xpubkey: 0x0278b20e,
- xprivkey: 0x0278ade4,
- networkMagic: 0xf9beb4fe,
- port: 20001,
- dnsSeeds: [
- 'localhost',
- 'mynet.localhost'
- ]
- };
- Networks.add(nmc);
- var nmcNet = Networks.get('namecoin');
- var a = new PrivateKey(wifNamecoin, nmcNet);
- should.exist(a);
- should.exist(a.bn);
- Networks.remove(nmcNet);
- });
-
- it('should create a new random testnet private key with empty data', function() {
- var a = new PrivateKey(null, Networks.testnet);
- should.exist(a);
- should.exist(a.bn);
- });
-
- it('should create a private key from WIF string', function() {
- var a = new PrivateKey('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- should.exist(a);
- should.exist(a.bn);
- });
-
- it('should create a private key from WIF buffer', function() {
- var a = new PrivateKey(Base58Check.decode('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m'));
- should.exist(a);
- should.exist(a.bn);
- });
-
- describe('bitcoind compliance', function() {
- validbase58.map(function(d){
- if (d[2].isPrivkey) {
- it('should instantiate WIF private key ' + d[0] + ' with correct properties', function() {
- var network = Networks.livenet;
- if (d[2].isTestnet) {
- network = Networks.testnet;
- }
- var key = new PrivateKey(d[0]);
- key.compressed.should.equal(d[2].isCompressed);
- key.network.should.equal(network);
- });
- }
- });
- invalidbase58.map(function(d){
- it('should describe input ' + d[0].slice(0,10) + '... as invalid', function() {
- expect(function() {
- return new PrivateKey(d[0]);
- }).to.throw(Error);
- });
- });
- });
-
- describe('instantiation', function() {
- it('should not be able to instantiate private key greater than N', function() {
- expect(function() {
- return new PrivateKey(Point.getN());
- }).to.throw('Number must be less than N');
- });
-
- it('should not be able to instantiate private key because of network mismatch', function() {
- expect(function() {
- return new PrivateKey('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m', 'testnet');
- }).to.throw('Private key network mismatch');
- });
-
- it('should not be able to instantiate private key WIF is too long', function() {
- expect(function() {
- var buf = Base58Check.decode('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- var buf2 = Buffer.concat([buf, new Buffer(0x01)]);
- return new PrivateKey(buf2);
- }).to.throw('Length of buffer must be 33 (uncompressed) or 34 (compressed');
- });
-
- it('should not be able to instantiate private key WIF because of unknown network byte', function() {
- expect(function() {
- var buf = Base58Check.decode('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- var buf2 = Buffer.concat([new Buffer('ff', 'hex'), buf.slice(1, 33)]);
- return new PrivateKey(buf2);
- }).to.throw('Invalid network');
- });
-
- it('should not be able to instantiate private key WIF because of network mismatch', function() {
- expect(function(){
- var a = new PrivateKey(wifNamecoin, 'testnet');
- }).to.throw('Invalid network');
- });
-
- it('can be instantiated from a hex string', function() {
- var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
- var pubhex = '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc';
- var privkey = new PrivateKey(privhex);
- privkey.publicKey.toString().should.equal(pubhex);
- });
-
- it('should not be able to instantiate because of unrecognized data', function() {
- expect(function() {
- return new PrivateKey(new Error());
- }).to.throw('First argument is an unrecognized data type.');
- });
-
- it('should not be able to instantiate with unknown network', function() {
- expect(function() {
- return new PrivateKey(new BN(2), 'unknown');
- }).to.throw('Must specify the network ("livenet" or "testnet")');
- });
-
- it('should not create a zero private key', function() {
- expect(function() {
- var bn = new BN(0);
- return new PrivateKey(bn);
- }).to.throw(TypeError);
- });
-
- it('should create a livenet private key', function() {
- var privkey = new PrivateKey(BN.fromBuffer(buf), 'livenet');
- privkey.toWIF().should.equal(wifLivenet);
- });
-
- it('should create a default network private key', function() {
- // keep the original
- var network = Networks.defaultNetwork;
- Networks.defaultNetwork = Networks.livenet;
- var a = new PrivateKey(BN.fromBuffer(buf));
- a.network.should.equal(Networks.livenet);
- // change the default
- Networks.defaultNetwork = Networks.testnet;
- var b = new PrivateKey(BN.fromBuffer(buf));
- b.network.should.equal(Networks.testnet);
- // restore the default
- Networks.defaultNetwork = network;
- });
-
- it('returns the same instance if a PrivateKey is provided (immutable)', function() {
- var privkey = new PrivateKey();
- new PrivateKey(privkey).should.equal(privkey);
- });
-
- });
-
- describe('#json/object', function() {
-
- it('should input/output json', function() {
- var json = JSON.stringify({
- bn: '96c132224121b509b7d0a16245e957d9192609c5637c6228311287b1be21627a',
- compressed: false,
- network: 'livenet'
- });
- var key = PrivateKey.fromObject(JSON.parse(json));
- JSON.stringify(key).should.equal(json);
- });
-
- it('input json should correctly initialize network field', function() {
- ['livenet', 'testnet', 'mainnet'].forEach(function (net) {
- var pk = PrivateKey.fromObject({
- bn: '96c132224121b509b7d0a16245e957d9192609c5637c6228311287b1be21627a',
- compressed: false,
- network: net
- });
- pk.network.should.be.deep.equal(Networks.get(net));
- });
- });
-
- it('fails on invalid argument', function() {
- expect(function() {
- return PrivateKey.fromJSON('¹');
- }).to.throw();
- });
-
- it('also accepts an object as argument', function() {
- expect(function() {
- return PrivateKey.fromObject(new PrivateKey().toObject());
- }).to.not.throw();
- });
- });
-
- it('coverage: public key cache', function() {
- expect(function() {
- var privateKey = new PrivateKey();
- /* jshint unused: false */
- var publicKey = privateKey.publicKey;
- return privateKey.publicKey;
- }).to.not.throw();
- });
-
- describe('#toString', function() {
-
- it('should output this address correctly', function() {
- var privkey = PrivateKey.fromWIF(wifLivenetUncompressed);
- privkey.toWIF().should.equal(wifLivenetUncompressed);
- });
-
- });
-
- describe('#toAddress', function() {
- it('should output this known livenet address correctly', function() {
- var privkey = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- var address = privkey.toAddress();
- address.toString().should.equal('1A6ut1tWnUq1SEQLMr4ttDh24wcbJ5o9TT');
- });
-
- it('should output this known testnet address correctly', function() {
- var privkey = PrivateKey.fromWIF('cR4qogdN9UxLZJXCNFNwDRRZNeLRWuds9TTSuLNweFVjiaE4gPaq');
- var address = privkey.toAddress();
- address.toString().should.equal('mtX8nPZZdJ8d3QNLRJ1oJTiEi26Sj6LQXS');
- });
-
- it('creates network specific address', function() {
- var pk = PrivateKey.fromWIF('cR4qogdN9UxLZJXCNFNwDRRZNeLRWuds9TTSuLNweFVjiaE4gPaq');
- pk.toAddress(Networks.livenet).network.name.should.equal(Networks.livenet.name);
- pk.toAddress(Networks.testnet).network.name.should.equal(Networks.testnet.name);
- });
-
- });
-
- describe('#inspect', function() {
- it('should output known livenet address for console', function() {
- var privkey = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- privkey.inspect().should.equal(
- ''
- );
- });
-
- it('should output known testnet address for console', function() {
- var privkey = PrivateKey.fromWIF('cR4qogdN9UxLZJXCNFNwDRRZNeLRWuds9TTSuLNweFVjiaE4gPaq');
- privkey.inspect().should.equal(
- ''
- );
- });
-
- it('outputs "uncompressed" for uncompressed imported WIFs', function() {
- var privkey = PrivateKey.fromWIF(wifLivenetUncompressed);
- privkey.inspect().should.equal('');
- });
- });
-
- describe('#getValidationError', function(){
- it('should get an error because private key greater than N', function() {
- var n = Point.getN();
- var a = PrivateKey.getValidationError(n);
- a.message.should.equal('Number must be less than N');
- });
-
- it('should validate as false because private key greater than N', function() {
- var n = Point.getN();
- var a = PrivateKey.isValid(n);
- a.should.equal(false);
- });
-
- it('should recognize that undefined is an invalid private key', function() {
- PrivateKey.isValid().should.equal(false);
- });
-
- it('should validate as true', function() {
- var a = PrivateKey.isValid('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- a.should.equal(true);
- });
-
- });
-
- describe('buffer serialization', function() {
- it('returns an expected value when creating a PrivateKey from a buffer', function() {
- var privkey = new PrivateKey(BN.fromBuffer(buf), 'livenet');
- privkey.toString().should.equal(buf.toString('hex'));
- });
-
- it('roundtrips correctly when using toBuffer/fromBuffer', function() {
- var privkey = new PrivateKey(BN.fromBuffer(buf));
- var toBuffer = new PrivateKey(privkey.toBuffer());
- var fromBuffer = PrivateKey.fromBuffer(toBuffer.toBuffer());
- fromBuffer.toString().should.equal(privkey.toString());
- });
-
- it('will output a 31 byte buffer', function() {
- var bn = BN.fromBuffer(new Buffer('9b5a0e8fee1835e21170ce1431f9b6f19b487e67748ed70d8a4462bc031915', 'hex'));
- var privkey = new PrivateKey(bn);
- var buffer = privkey.toBufferNoPadding();
- buffer.length.should.equal(31);
- });
-
- // TODO: enable for v1.0.0 when toBuffer is changed to always be 32 bytes long
- // it('will output a 32 byte buffer', function() {
- // var bn = BN.fromBuffer(new Buffer('9b5a0e8fee1835e21170ce1431f9b6f19b487e67748ed70d8a4462bc031915', 'hex'));
- // var privkey = new PrivateKey(bn);
- // var buffer = privkey.toBuffer();
- // buffer.length.should.equal(32);
- // });
-
- // TODO: enable for v1.0.0 when toBuffer is changed to always be 32 bytes long
- // it('should return buffer with length equal 32', function() {
- // var bn = BN.fromBuffer(buf.slice(0, 31));
- // var privkey = new PrivateKey(bn, 'livenet');
- // var expected = Buffer.concat([ new Buffer([0]), buf.slice(0, 31) ]);
- // privkey.toBuffer().toString('hex').should.equal(expected.toString('hex'));
- // });
- });
-
- describe('#toBigNumber', function() {
- it('should output known BN', function() {
- var a = BN.fromBuffer(buf);
- var privkey = new PrivateKey(a, 'livenet');
- var b = privkey.toBigNumber();
- b.toString('hex').should.equal(a.toString('hex'));
- });
- });
-
- describe('#fromRandom', function() {
-
- it('should set bn gt 0 and lt n, and should be compressed', function() {
- var privkey = PrivateKey.fromRandom();
- privkey.bn.gt(new BN(0)).should.equal(true);
- privkey.bn.lt(Point.getN()).should.equal(true);
- privkey.compressed.should.equal(true);
- });
-
- });
-
- describe('#fromWIF', function() {
-
- it('should parse this compressed testnet address correctly', function() {
- var privkey = PrivateKey.fromWIF(wifLivenet);
- privkey.toWIF().should.equal(wifLivenet);
- });
-
- });
-
- describe('#toWIF', function() {
-
- it('should parse this compressed testnet address correctly', function() {
- var privkey = PrivateKey.fromWIF(wifTestnet);
- privkey.toWIF().should.equal(wifTestnet);
- });
-
- });
-
- describe('#fromString', function() {
-
- it('should parse this uncompressed testnet address correctly', function() {
- var privkey = PrivateKey.fromString(wifTestnetUncompressed);
- privkey.toWIF().should.equal(wifTestnetUncompressed);
- });
-
- });
-
- describe('#toString', function() {
-
- it('should parse this uncompressed livenet address correctly', function() {
- var privkey = PrivateKey.fromString(wifLivenetUncompressed);
- privkey.toString().should.equal("96c132224121b509b7d0a16245e957d9192609c5637c6228311287b1be21627a");
- });
-
- });
-
- describe('#toPublicKey', function() {
-
- it('should convert this known PrivateKey to known PublicKey', function() {
- var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
- var pubhex = '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc';
- var privkey = new PrivateKey(new BN(new Buffer(privhex, 'hex')));
- var pubkey = privkey.toPublicKey();
- pubkey.toString().should.equal(pubhex);
- });
-
- it('should have a "publicKey" property', function() {
- var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
- var pubhex = '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc';
- var privkey = new PrivateKey(new BN(new Buffer(privhex, 'hex')));
- privkey.publicKey.toString().should.equal(pubhex);
- });
-
- it('should convert this known PrivateKey to known PublicKey and preserve compressed=true', function() {
- var privwif = 'L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m';
- var privkey = new PrivateKey(privwif, 'livenet');
- var pubkey = privkey.toPublicKey();
- pubkey.compressed.should.equal(true);
- });
-
- it('should convert this known PrivateKey to known PublicKey and preserve compressed=false', function() {
- var privwif = '92jJzK4tbURm1C7udQXxeCBvXHoHJstDXRxAMouPG1k1XUaXdsu';
- var privkey = new PrivateKey(privwif, 'testnet');
- var pubkey = privkey.toPublicKey();
- pubkey.compressed.should.equal(false);
- });
-
- });
-
- it('creates an address as expected from WIF, livenet', function() {
- var privkey = new PrivateKey('5J2NYGstJg7aJQEqNwYp4enG5BSfFdKXVTtBLvHicnRGD5kjxi6');
- privkey.publicKey.toAddress().toString().should.equal('135bwugFCmhmNU3SeCsJeTqvo5ViymgwZ9');
- });
-
- it('creates an address as expected from WIF, testnet', function() {
- var privkey = new PrivateKey('92VYMmwFLXRwXn5688edGxYYgMFsc3fUXYhGp17WocQhU6zG1kd');
- privkey.publicKey.toAddress().toString().should.equal('moiAvLUw16qgrwhFGo1eDnXHC2wPMYiv7Y');
- });
-
-});
diff --git a/test/publickey.js b/test/publickey.js
deleted file mode 100644
index d0a52a6..0000000
--- a/test/publickey.js
+++ /dev/null
@@ -1,430 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-
-var bitcore = require('..');
-var Point = bitcore.crypto.Point;
-var BN = bitcore.crypto.BN;
-var PublicKey = bitcore.PublicKey;
-var PrivateKey = bitcore.PrivateKey;
-var Address = bitcore.Address;
-var Networks = bitcore.Networks;
-
-/* jshint maxlen: 200 */
-
-describe('PublicKey', function() {
- /* jshint maxstatements: 30 */
-
- var invalidPoint = '0400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000';
-
- describe('validating errors on creation', function() {
- it('errors if data is missing', function() {
- (function() {
- return new PublicKey();
- }).should.throw('First argument is required, please include public key data.');
- });
-
- it('errors if an invalid point is provided', function() {
- (function() {
- return new PublicKey(invalidPoint);
- }).should.throw('Point does not lie on the curve');
- });
-
- it('errors if a point not on the secp256k1 curve is provided', function() {
- (function() {
- return new PublicKey(new Point(1000, 1000));
- }).should.throw('Point does not lie on the curve');
- });
-
- it('errors if the argument is of an unrecognized type', function() {
- (function() {
- return new PublicKey(new Error());
- }).should.throw('First argument is an unrecognized data format.');
- });
- });
-
- describe('instantiation', function() {
-
- it('from a private key', function() {
- var privhex = '906977a061af29276e40bf377042ffbde414e496ae2260bbf1fa9d085637bfff';
- var pubhex = '02a1633cafcc01ebfb6d78e39f687a1f0995c62fc95f51ead10a02ee0be551b5dc';
- var privkey = new PrivateKey(new BN(new Buffer(privhex, 'hex')));
- var pk = new PublicKey(privkey);
- pk.toString().should.equal(pubhex);
- });
-
- it('problematic secp256k1 public keys', function() {
-
- var knownKeys = [
- {
- wif: 'KzsjKq2FVqVuQv2ueHVFuB65A9uEZ6S1L6F8NuokCrE3V3kE3Ack',
- priv: '6d1229a6b24c2e775c062870ad26bc261051e0198c67203167273c7c62538846',
- pub: '03d6106302d2698d6a41e9c9a114269e7be7c6a0081317de444bb2980bf9265a01',
- pubx: 'd6106302d2698d6a41e9c9a114269e7be7c6a0081317de444bb2980bf9265a01',
- puby: 'e05fb262e64b108991a29979809fcef9d3e70cafceb3248c922c17d83d66bc9d'
- },
- {
- wif: 'L5MgSwNB2R76xBGorofRSTuQFd1bm3hQMFVf3u2CneFom8u1Yt7G',
- priv: 'f2cc9d2b008927db94b89e04e2f6e70c180e547b3e5e564b06b8215d1c264b53',
- pub: '03e275faa35bd1e88f5df6e8f9f6edb93bdf1d65f4915efc79fd7a726ec0c21700',
- pubx: 'e275faa35bd1e88f5df6e8f9f6edb93bdf1d65f4915efc79fd7a726ec0c21700',
- puby: '367216cb35b086e6686d69dddd822a8f4d52eb82ac5d9de18fdcd9bf44fa7df7'
- }
- ];
-
- for(var i = 0; i < knownKeys.length; i++) {
- var privkey = new PrivateKey(knownKeys[i].wif);
- var pubkey = privkey.toPublicKey();
- pubkey.toString().should.equal(knownKeys[i].pub);
- pubkey.point.x.toString('hex').should.equal(knownKeys[i].pubx);
- pubkey.point.y.toString('hex').should.equal(knownKeys[i].puby);
- }
-
- });
-
- it('from a compressed public key', function() {
- var publicKeyHex = '031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a';
- var publicKey = new PublicKey(publicKeyHex);
- publicKey.toString().should.equal(publicKeyHex);
- });
-
- it('from another publicKey', function() {
- var publicKeyHex = '031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a';
- var publicKey = new PublicKey(publicKeyHex);
- var publicKey2 = new PublicKey(publicKey);
- publicKey.should.equal(publicKey2);
- });
-
- it('sets the network to defaultNetwork if none provided', function() {
- var publicKeyHex = '031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a';
- var publicKey = new PublicKey(publicKeyHex);
- publicKey.network.should.equal(Networks.defaultNetwork);
- });
-
- it('from a hex encoded DER string', function() {
- var pk = new PublicKey('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- should.exist(pk.point);
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- });
-
- it('from a hex encoded DER buffer', function() {
- var pk = new PublicKey(new Buffer('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341', 'hex'));
- should.exist(pk.point);
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- });
-
- it('from a point', function() {
- var p = new Point('86a80a5a2bfc48dddde2b0bd88bd56b0b6ddc4e6811445b175b90268924d7d48',
- '3b402dfc89712cfe50963e670a0598e6b152b3cd94735001cdac6794975d3afd');
- var a = new PublicKey(p);
- should.exist(a.point);
- a.point.toString().should.equal(p.toString());
- var c = new PublicKey(p);
- should.exist(c.point);
- c.point.toString().should.equal(p.toString());
- });
- });
-
-
- describe('#getValidationError', function(){
-
- it('should recieve an invalid point error', function() {
- var error = PublicKey.getValidationError(invalidPoint);
- should.exist(error);
- error.message.should.equal('Point does not lie on the curve');
- });
-
- it('should recieve a boolean as false', function() {
- var valid = PublicKey.isValid(invalidPoint);
- valid.should.equal(false);
- });
-
- it('should recieve a boolean as true for uncompressed', function() {
- var valid = PublicKey.isValid('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- valid.should.equal(true);
- });
-
- it('should recieve a boolean as true for compressed', function() {
- var valid = PublicKey.isValid('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- valid.should.equal(true);
- });
-
- });
-
- describe('#fromPoint', function() {
-
- it('should instantiate from a point', function() {
- var p = new Point('86a80a5a2bfc48dddde2b0bd88bd56b0b6ddc4e6811445b175b90268924d7d48',
- '3b402dfc89712cfe50963e670a0598e6b152b3cd94735001cdac6794975d3afd');
- var b = PublicKey.fromPoint(p);
- should.exist(b.point);
- b.point.toString().should.equal(p.toString());
- });
-
- it('should error because paramater is not a point', function() {
- (function() {
- PublicKey.fromPoint(new Error());
- }).should.throw('First argument must be an instance of Point.');
- });
- });
-
- describe('#json/object', function() {
-
- it('should input/ouput json', function() {
- var json = JSON.stringify({
- x: '1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a',
- y: '7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341',
- compressed: false
- });
- var pubkey = new PublicKey(JSON.parse(json));
- JSON.stringify(pubkey).should.deep.equal(json);
- });
-
- it('fails if "y" is not provided', function() {
- expect(function() {
- return new PublicKey({
- x: '1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a'
- });
- }).to.throw();
- });
-
- it('fails if invalid JSON is provided', function() {
- expect(function() {
- return PublicKey._transformJSON('¹');
- }).to.throw();
- });
-
- it('works for X starting with 0x00', function() {
- var a = new PublicKey('030589ee559348bd6a7325994f9c8eff12bd5d73cc683142bd0dd1a17abc99b0dc');
- var b = new PublicKey('03'+a.toObject().x);
- b.toString().should.equal(a.toString());
- });
-
- });
-
- describe('#fromPrivateKey', function() {
-
- it('should make a public key from a privkey', function() {
- should.exist(PublicKey.fromPrivateKey(PrivateKey.fromRandom()));
- });
-
- it('should error because not an instance of privkey', function() {
- (function() {
- PublicKey.fromPrivateKey(new Error());
- }).should.throw('Must be an instance of PrivateKey');
- });
-
- });
-
- describe('#fromBuffer', function() {
-
- it('should parse this uncompressed public key', function() {
- var pk = PublicKey.fromBuffer(new Buffer('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341', 'hex'));
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
- it('should parse this compressed public key', function() {
- var pk = PublicKey.fromBuffer(new Buffer('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
- it('should throw an error on this invalid public key', function() {
- (function() {
- PublicKey.fromBuffer(new Buffer('091ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- }).should.throw();
- });
-
- it('should throw error because not a buffer', function() {
- (function() {
- PublicKey.fromBuffer('091ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- }).should.throw('Must be a hex buffer of DER encoded public key');
- });
-
- it('should throw error because buffer is the incorrect length', function() {
- (function() {
- PublicKey.fromBuffer(new Buffer('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a34112', 'hex'));
- }).should.throw('Length of x and y must be 32 bytes');
- });
-
- });
-
- describe('#fromDER', function() {
-
- it('should parse this uncompressed public key', function() {
- var pk = PublicKey.fromDER(new Buffer('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341', 'hex'));
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
- it('should parse this compressed public key', function() {
- var pk = PublicKey.fromDER(new Buffer('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
- it('should throw an error on this invalid public key', function() {
- (function() {
- PublicKey.fromDER(new Buffer('091ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- }).should.throw();
- });
-
- });
-
- describe('#fromString', function() {
-
- it('should parse this known valid public key', function() {
- var pk = PublicKey.fromString('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
- });
-
- describe('#fromX', function() {
-
- it('should create this known public key', function() {
- var x = BN.fromBuffer(new Buffer('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- var pk = PublicKey.fromX(true, x);
- pk.point.getX().toString(16).should.equal('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pk.point.getY().toString(16).should.equal('7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
-
-
- it('should error because odd was not included as a param', function() {
- var x = BN.fromBuffer(new Buffer('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- (function() {
- return PublicKey.fromX(null, x);
- }).should.throw('Must specify whether y is odd or not (true or false)');
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should return this compressed DER format', function() {
- var x = BN.fromBuffer(new Buffer('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- var pk = PublicKey.fromX(true, x);
- pk.toBuffer().toString('hex').should.equal('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- });
-
- it('should return this uncompressed DER format', function() {
- var x = BN.fromBuffer(new Buffer('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- var pk = PublicKey.fromX(true, x);
- pk.toBuffer().toString('hex').should.equal('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- });
-
- });
-
- describe('#toDER', function() {
-
- it('should return this compressed DER format', function() {
- var x = BN.fromBuffer(new Buffer('1ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a', 'hex'));
- var pk = PublicKey.fromX(true, x);
- pk.toDER().toString('hex').should.equal('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- });
-
- it('should return this uncompressed DER format', function() {
- var pk = PublicKey.fromString('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- pk.toDER().toString('hex').should.equal('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- });
- });
-
- describe('#toAddress', function() {
-
- it('should output this known mainnet address correctly', function() {
- var pk = new PublicKey('03c87bd0e162f26969da8509cafcb7b8c8d202af30b928c582e263dd13ee9a9781');
- var address = pk.toAddress('livenet');
- address.toString().should.equal('1A6ut1tWnUq1SEQLMr4ttDh24wcbJ5o9TT');
- });
-
- it('should output this known testnet address correctly', function() {
- var pk = new PublicKey('0293126ccc927c111b88a0fe09baa0eca719e2a3e087e8a5d1059163f5c566feef');
- var address = pk.toAddress('testnet');
- address.toString().should.equal('mtX8nPZZdJ8d3QNLRJ1oJTiEi26Sj6LQXS');
- });
-
- });
-
- describe('hashes', function() {
-
- // wif private key, address
- // see: https://github.com/bitcoin/bitcoin/blob/master/src/test/key_tests.cpp#L20
- var data = [
- ['5HxWvvfubhXpYYpS3tJkw6fq9jE9j18THftkZjHHfmFiWtmAbrj', '1QFqqMUD55ZV3PJEJZtaKCsQmjLT6JkjvJ'],
- ['5KC4ejrDjv152FGwP386VD1i2NYc5KkfSMyv1nGy1VGDxGHqVY3', '1F5y5E5FMc5YzdJtB9hLaUe43GDxEKXENJ'],
- ['Kwr371tjA9u2rFSMZjTNun2PXXP3WPZu2afRHTcta6KxEUdm1vEw', '1NoJrossxPBKfCHuJXT4HadJrXRE9Fxiqs'],
- ['L3Hq7a8FEQwJkW1M2GNKDW28546Vp5miewcCzSqUD9kCAXrJdS3g', '1CRj2HyM1CXWzHAXLQtiGLyggNT9WQqsDs']
- ];
-
- data.forEach(function(d){
- var publicKey = PrivateKey.fromWIF(d[0]).toPublicKey();
- var address = Address.fromString(d[1]);
- address.hashBuffer.should.deep.equal(publicKey._getID());
- });
-
- });
-
- describe('#toString', function() {
-
- it('should print this known public key', function() {
- var hex = '031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a';
- var pk = PublicKey.fromString(hex);
- pk.toString().should.equal(hex);
- });
-
- });
-
- describe('#inspect', function() {
- it('should output known uncompressed pubkey for console', function() {
- var pubkey = PublicKey.fromString('041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a7baad41d04514751e6851f5304fd243751703bed21b914f6be218c0fa354a341');
- pubkey.inspect().should.equal('');
- });
-
- it('should output known compressed pubkey for console', function() {
- var pubkey = PublicKey.fromString('031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a');
- pubkey.inspect().should.equal('');
- });
-
- it('should output known compressed pubkey with network for console', function() {
- var privkey = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
- var pubkey = new PublicKey(privkey);
- pubkey.inspect().should.equal('');
- });
-
- });
-
- describe('#validate', function() {
-
- it('should not have an error if pubkey is valid', function() {
- var hex = '031ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a';
- expect(function() {
- return PublicKey.fromString(hex);
- }).to.not.throw();
- });
-
- it('should throw an error if pubkey is invalid', function() {
- var hex = '041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a0000000000000000000000000000000000000000000000000000000000000000';
- (function() {
- return PublicKey.fromString(hex);
- }).should.throw('Invalid y value for curve.');
- });
-
- it('should throw an error if pubkey is invalid', function() {
- var hex = '041ff0fe0f7b15ffaa85ff9f4744d539139c252a49710fb053bb9f2b933173ff9a00000000000000000000000000000000000000000000000000000000000000FF';
- (function() {
- return PublicKey.fromString(hex);
- }).should.throw('Invalid y value for curve.');
- });
-
- it('should throw an error if pubkey is infinity', function() {
- (function() {
- return new PublicKey(Point.getG().mul(Point.getN()));
- }).should.throw('Point cannot be equal to Infinity');
- });
-
- });
-
-});
diff --git a/test/script/interpreter.js b/test/script/interpreter.js
deleted file mode 100644
index 70b9519..0000000
--- a/test/script/interpreter.js
+++ /dev/null
@@ -1,417 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var sinon = require('sinon');
-var bitcore = require('../..');
-var Interpreter = bitcore.Script.Interpreter;
-var Transaction = bitcore.Transaction;
-var PrivateKey = bitcore.PrivateKey;
-var Script = bitcore.Script;
-var BN = bitcore.crypto.BN;
-var BufferWriter = bitcore.encoding.BufferWriter;
-var Opcode = bitcore.Opcode;
-var _ = require('lodash');
-
-var script_valid = require('../data/bitcoind/script_valid');
-var script_invalid = require('../data/bitcoind/script_invalid');
-var tx_valid = require('../data/bitcoind/tx_valid');
-var tx_invalid = require('../data/bitcoind/tx_invalid');
-
-//the script string format used in bitcoind data tests
-Script.fromBitcoindString = function(str) {
- var bw = new BufferWriter();
- var tokens = str.split(' ');
- for (var i = 0; i < tokens.length; i++) {
- var token = tokens[i];
- if (token === '') {
- continue;
- }
-
- var opstr;
- var opcodenum;
- var tbuf;
- if (token[0] === '0' && token[1] === 'x') {
- var hex = token.slice(2);
- bw.write(new Buffer(hex, 'hex'));
- } else if (token[0] === '\'') {
- var tstr = token.slice(1, token.length - 1);
- var cbuf = new Buffer(tstr);
- tbuf = Script().add(cbuf).toBuffer();
- bw.write(tbuf);
- } else if (typeof Opcode['OP_' + token] !== 'undefined') {
- opstr = 'OP_' + token;
- opcodenum = Opcode[opstr];
- bw.writeUInt8(opcodenum);
- } else if (typeof Opcode[token] === 'number') {
- opstr = token;
- opcodenum = Opcode[opstr];
- bw.writeUInt8(opcodenum);
- } else if (!isNaN(parseInt(token))) {
- var script = Script().add(new BN(token).toScriptNumBuffer());
- tbuf = script.toBuffer();
- bw.write(tbuf);
- } else {
- throw new Error('Could not determine type of script value');
- }
- }
- var buf = bw.concat();
- return this.fromBuffer(buf);
-};
-
-
-
-describe('Interpreter', function() {
-
- it('should make a new interp', function() {
- var interp = new Interpreter();
- (interp instanceof Interpreter).should.equal(true);
- interp.stack.length.should.equal(0);
- interp.altstack.length.should.equal(0);
- interp.pc.should.equal(0);
- interp.pbegincodehash.should.equal(0);
- interp.nOpCount.should.equal(0);
- interp.vfExec.length.should.equal(0);
- interp.errstr.should.equal('');
- interp.flags.should.equal(0);
- });
-
- describe('@castToBool', function() {
-
- it('should cast these bufs to bool correctly', function() {
- Interpreter.castToBool(new BN(0).toSM({
- endian: 'little'
- })).should.equal(false);
- Interpreter.castToBool(new Buffer('0080', 'hex')).should.equal(false); //negative 0
- Interpreter.castToBool(new BN(1).toSM({
- endian: 'little'
- })).should.equal(true);
- Interpreter.castToBool(new BN(-1).toSM({
- endian: 'little'
- })).should.equal(true);
-
- var buf = new Buffer('00', 'hex');
- var bool = BN.fromSM(buf, {
- endian: 'little'
- }).cmp(BN.Zero) !== 0;
- Interpreter.castToBool(buf).should.equal(bool);
- });
-
- });
-
- describe('#verifyWitnessProgram', function() {
- it('will return true if witness program greater than 0', function() {
- var si = Interpreter();
- var version = 1;
- var program = new Buffer('bcbd1db07ce89d1f4050645c26c90ce78b67eff78460002a4d5c10410958e064', 'hex');
- var witness = [new Buffer('bda0eeeb166c8bfeaee88dedc8efa82d3bea35aac5be253902f59d52908bfe25', 'hex')];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(true);
- });
- it('will return false with error if witness length is 0', function() {
- var si = Interpreter();
- var version = 0;
- var program = new Buffer('bcbd1db07ce89d1f4050645c26c90ce78b67eff78460002a4d5c10410958e064', 'hex');
- var witness = [];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY');
- });
- it('will return false if program hash mismatch (version 0, 32 byte program)', function() {
- var si = Interpreter();
- var version = 0;
- var program = new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH');
- });
- it('will return false if witness stack doesn\'t have two items (version 0, 20 byte program)', function() {
- var si = Interpreter();
- var version = 0;
- var program = new Buffer('b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH');
- });
- it('will return false if program wrong length for version 0', function() {
- var si = Interpreter();
- var version = 0;
- var program = new Buffer('b8bcb07f6344b42ab04250c86a6e8b75d3', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH');
- });
- it('will return false with discourage upgradable witness program', function() {
- var si = Interpreter();
- var version = 1;
- var program = new Buffer('b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = Interpreter.SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM');
- });
- it('will return false with error if stack doesn\'t have exactly one item', function() {
- var si = Interpreter();
- si.evaluate = sinon.stub().returns(true);
- var version = 0;
- var program = new Buffer('b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_EVAL_FALSE');
- });
- it('will return false if last item in stack casts to false', function() {
- var si = Interpreter();
- si.evaluate = function() {
- si.stack = [new Buffer('00', 'hex')];
- return true;
- };
- var version = 0;
- var program = new Buffer('b8bcb07f6344b42ab04250c86a6e8b75d3fdbbc6', 'hex');
- var witness = [
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex'),
- new Buffer('0000000000000000000000000000000000000000000000000000000000000000', 'hex')
- ];
- var satoshis = 1;
- var flags = 0;
- si.verifyWitnessProgram(version, program, witness, satoshis, flags).should.equal(false);
- si.errstr.should.equal('SCRIPT_ERR_EVAL_FALSE_IN_STACK');
- });
- });
-
- describe('#verify', function() {
-
- it('should verify these trivial scripts', function() {
- var verified;
- var si = Interpreter();
- verified = si.verify(Script('OP_1'), Script('OP_1'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('OP_1'), Script('OP_0'));
- verified.should.equal(false);
- verified = Interpreter().verify(Script('OP_0'), Script('OP_1'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('OP_CODESEPARATOR'), Script('OP_1'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script(''), Script('OP_DEPTH OP_0 OP_EQUAL'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('OP_1 OP_2'), Script('OP_2 OP_EQUALVERIFY OP_1 OP_EQUAL'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('9 0x000000000000000010'), Script(''));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('OP_1'), Script('OP_15 OP_ADD OP_16 OP_EQUAL'));
- verified.should.equal(true);
- verified = Interpreter().verify(Script('OP_0'), Script('OP_IF OP_VER OP_ELSE OP_1 OP_ENDIF'));
- verified.should.equal(true);
- });
-
- it('should verify these simple transaction', function() {
- // first we create a transaction
- var privateKey = new PrivateKey('cSBnVM4xvxarwGQuAfQFwqDg9k5tErHUHzgWsEfD4zdwUasvqRVY');
- var publicKey = privateKey.publicKey;
- var fromAddress = publicKey.toAddress();
- var toAddress = 'mrU9pEmAx26HcbKVrABvgL7AwA5fjNFoDc';
- var scriptPubkey = Script.buildPublicKeyHashOut(fromAddress);
- var utxo = {
- address: fromAddress,
- txId: 'a477af6b2667c29670467e4e0728b685ee07b240235771862318e29ddbe58458',
- outputIndex: 0,
- script: scriptPubkey,
- satoshis: 100000
- };
- var tx = new Transaction()
- .from(utxo)
- .to(toAddress, 100000)
- .sign(privateKey);
-
- // we then extract the signature from the first input
- var inputIndex = 0;
- var signature = tx.getSignatures(privateKey)[inputIndex].signature;
-
- var scriptSig = Script.buildPublicKeyHashIn(publicKey, signature);
- var flags = Interpreter.SCRIPT_VERIFY_P2SH | Interpreter.SCRIPT_VERIFY_STRICTENC;
- var verified = Interpreter().verify(scriptSig, scriptPubkey, tx, inputIndex, flags);
- verified.should.equal(true);
- });
- });
-
-
- var getFlags = function getFlags(flagstr) {
- var flags = 0;
- if (flagstr.indexOf('NONE') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_NONE;
- }
- if (flagstr.indexOf('P2SH') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_P2SH;
- }
- if (flagstr.indexOf('STRICTENC') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_STRICTENC;
- }
- if (flagstr.indexOf('DERSIG') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_DERSIG;
- }
- if (flagstr.indexOf('LOW_S') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_LOW_S;
- }
- if (flagstr.indexOf('NULLDUMMY') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_NULLDUMMY;
- }
- if (flagstr.indexOf('SIGPUSHONLY') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_SIGPUSHONLY;
- }
- if (flagstr.indexOf('MINIMALDATA') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_MINIMALDATA;
- }
- if (flagstr.indexOf('DISCOURAGE_UPGRADABLE_NOPS') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS;
- }
- if (flagstr.indexOf('CHECKLOCKTIMEVERIFY') !== -1) {
- flags = flags | Interpreter.SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY;
- }
- return flags;
- };
-
-
- var testToFromString = function(script) {
- var s = script.toString();
- Script.fromString(s).toString().should.equal(s);
- };
-
- var testFixture = function(vector, expected) {
- var scriptSig = Script.fromBitcoindString(vector[0]);
- var scriptPubkey = Script.fromBitcoindString(vector[1]);
- var flags = getFlags(vector[2]);
-
- var hashbuf = new Buffer(32);
- hashbuf.fill(0);
- var credtx = new Transaction();
- credtx.uncheckedAddInput(new Transaction.Input({
- prevTxId: '0000000000000000000000000000000000000000000000000000000000000000',
- outputIndex: 0xffffffff,
- sequenceNumber: 0xffffffff,
- script: Script('OP_0 OP_0')
- }));
- credtx.addOutput(new Transaction.Output({
- script: scriptPubkey,
- satoshis: 0
- }));
- var idbuf = credtx.id;
-
- var spendtx = new Transaction();
- spendtx.uncheckedAddInput(new Transaction.Input({
- prevTxId: idbuf.toString('hex'),
- outputIndex: 0,
- sequenceNumber: 0xffffffff,
- script: scriptSig
- }));
- spendtx.addOutput(new Transaction.Output({
- script: new Script(),
- satoshis: 0
- }));
-
- var interp = new Interpreter();
- var verified = interp.verify(scriptSig, scriptPubkey, spendtx, 0, flags);
- verified.should.equal(expected);
- };
- describe('bitcoind script evaluation fixtures', function() {
- var testAllFixtures = function(set, expected) {
- var c = 0;
- set.forEach(function(vector) {
- if (vector.length === 1) {
- return;
- }
- c++;
- var descstr = vector[3];
- var fullScriptString = vector[0] + ' ' + vector[1];
- var comment = descstr ? (' (' + descstr + ')') : '';
- it('should pass script_' + (expected ? '' : 'in') + 'valid ' +
- 'vector #' + c + ': ' + fullScriptString + comment,
- function() {
- testFixture(vector, expected);
- });
- });
- };
- testAllFixtures(script_valid, true);
- testAllFixtures(script_invalid, false);
-
- });
- describe('bitcoind transaction evaluation fixtures', function() {
- var test_txs = function(set, expected) {
- var c = 0;
- set.forEach(function(vector) {
- if (vector.length === 1) {
- return;
- }
- c++;
- var cc = c; //copy to local
- it('should pass tx_' + (expected ? '' : 'in') + 'valid vector ' + cc, function() {
- var inputs = vector[0];
- var txhex = vector[1];
- var flags = getFlags(vector[2]);
-
- var map = {};
- inputs.forEach(function(input) {
- var txid = input[0];
- var txoutnum = input[1];
- var scriptPubKeyStr = input[2];
- if (txoutnum === -1) {
- txoutnum = 0xffffffff; //bitcoind casts -1 to an unsigned int
- }
- map[txid + ':' + txoutnum] = Script.fromBitcoindString(scriptPubKeyStr);
- });
-
- var tx = new Transaction(txhex);
- var allInputsVerified = true;
- tx.inputs.forEach(function(txin, j) {
- if (txin.isNull()) {
- return;
- }
- var scriptSig = txin.script;
- var txidhex = txin.prevTxId.toString('hex');
- var txoutnum = txin.outputIndex;
- var scriptPubkey = map[txidhex + ':' + txoutnum];
- should.exist(scriptPubkey);
- (scriptSig !== undefined).should.equal(true);
- var interp = new Interpreter();
- var verified = interp.verify(scriptSig, scriptPubkey, tx, j, flags);
- if (!verified) {
- allInputsVerified = false;
- }
- });
- var txVerified = tx.verify();
- txVerified = (txVerified === true) ? true : false;
- allInputsVerified = allInputsVerified && txVerified;
- allInputsVerified.should.equal(expected);
-
- });
- });
- };
- test_txs(tx_valid, true);
- test_txs(tx_invalid, false);
-
- });
-
-});
diff --git a/test/script/script.js b/test/script/script.js
deleted file mode 100644
index e1ff03f..0000000
--- a/test/script/script.js
+++ /dev/null
@@ -1,1079 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-var bitcore = require('../..');
-
-var BufferUtil = bitcore.util.buffer;
-var Script = bitcore.Script;
-var Networks = bitcore.Networks;
-var Opcode = bitcore.Opcode;
-var PublicKey = bitcore.PublicKey;
-var Address = bitcore.Address;
-
-describe('Script', function() {
-
- it('should make a new script', function() {
- var script = new Script();
- expect(script).to.be.instanceof(Script);
- expect(script.chunks).to.deep.equal([]);
- });
-
- it('should make a new script when from is null', function() {
- var script = new Script(null);
- expect(script).to.be.instanceof(Script);
- expect(script.chunks).to.deep.equal([]);
- });
-
- describe('#set', function() {
- var script = new Script();
-
- it('should be object', function() {
- expect(function() {
- script.set(null);
- }).to.throw(/^Invalid Argument$/)
- });
-
- it('chunks should be array', function() {
- expect(function() {
- script.set({chunks: 1});
- }).to.throw(/^Invalid Argument$/);
- });
-
- it('set chunks', function() {
- script.set({chunks: [1]});
- expect(script.chunks).to.deep.equal([1]);
- });
- });
-
- describe('#fromBuffer', function() {
-
- it('should parse this buffer containing an OP code', function() {
- var buf = new Buffer(1);
- buf[0] = Opcode.OP_0;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- });
-
- it('should parse this buffer containing another OP code', function() {
- var buf = new Buffer(1);
- buf[0] = Opcode.OP_CHECKMULTISIG;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- });
-
- it('should parse this buffer containing three bytes of data', function() {
- var buf = new Buffer([3, 1, 2, 3]);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- });
-
- it('should parse this buffer containing OP_PUSHDATA1 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA1;
- buf.writeUInt8(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- });
-
- it('should parse this buffer containing OP_PUSHDATA2 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA2;
- buf.writeUInt16LE(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- });
-
- it('should parse this buffer containing OP_PUSHDATA4 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 0, 0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA4;
- buf.writeUInt16LE(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- });
-
- it('should parse this buffer an OP code, data, and another OP code', function() {
- var buf = new Buffer([0, 0, 0, 0, 0, 0, 1, 2, 3, 0]);
- buf[0] = Opcode.OP_0;
- buf[1] = Opcode.OP_PUSHDATA4;
- buf.writeUInt16LE(3, 2);
- buf[buf.length - 1] = Opcode.OP_0;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(3);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- script.chunks[1].buf.toString('hex').should.equal('010203');
- script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
- });
-
- });
-
- describe('#toBuffer', function() {
-
- it('should output this buffer containing an OP code', function() {
- var buf = new Buffer(1);
- buf[0] = Opcode.OP_0;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer containing another OP code', function() {
- var buf = new Buffer(1);
- buf[0] = Opcode.OP_CHECKMULTISIG;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer containing three bytes of data', function() {
- var buf = new Buffer([3, 1, 2, 3]);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer containing OP_PUSHDATA1 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA1;
- buf.writeUInt8(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer containing OP_PUSHDATA2 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA2;
- buf.writeUInt16LE(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer containing OP_PUSHDATA4 and three bytes of data', function() {
- var buf = new Buffer([0, 0, 0, 0, 0, 1, 2, 3]);
- buf[0] = Opcode.OP_PUSHDATA4;
- buf.writeUInt16LE(3, 1);
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(1);
- script.chunks[0].buf.toString('hex').should.equal('010203');
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- it('should output this buffer an OP code, data, and another OP code', function() {
- var buf = new Buffer([0, 0, 0, 0, 0, 0, 1, 2, 3, 0]);
- buf[0] = Opcode.OP_0;
- buf[1] = Opcode.OP_PUSHDATA4;
- buf.writeUInt16LE(3, 2);
- buf[buf.length - 1] = Opcode.OP_0;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(3);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- script.chunks[1].buf.toString('hex').should.equal('010203');
- script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
- script.toBuffer().toString('hex').should.equal(buf.toString('hex'));
- });
-
- });
-
- describe('#fromASM', function() {
- it('should parse this known script in ASM', function() {
- var asm = 'OP_DUP OP_HASH160 f4c03610e60ad15100929cc23da2f3a799af1725 OP_EQUALVERIFY OP_CHECKSIG';
- var script = Script.fromASM(asm);
- script.chunks[0].opcodenum.should.equal(Opcode.OP_DUP);
- script.chunks[1].opcodenum.should.equal(Opcode.OP_HASH160);
- script.chunks[2].opcodenum.should.equal(20);
- script.chunks[2].buf.toString('hex').should.equal('f4c03610e60ad15100929cc23da2f3a799af1725');
- script.chunks[3].opcodenum.should.equal(Opcode.OP_EQUALVERIFY);
- script.chunks[4].opcodenum.should.equal(Opcode.OP_CHECKSIG);
- });
- });
-
- describe('#fromString', function() {
-
- it('should parse these known scripts', function() {
- Script.fromString('OP_0 OP_PUSHDATA4 3 0x010203 OP_0').toString().should.equal('OP_0 OP_PUSHDATA4 3 0x010203 OP_0');
- Script.fromString('OP_0 OP_PUSHDATA2 3 0x010203 OP_0').toString().should.equal('OP_0 OP_PUSHDATA2 3 0x010203 OP_0');
- Script.fromString('OP_0 OP_PUSHDATA1 3 0x010203 OP_0').toString().should.equal('OP_0 OP_PUSHDATA1 3 0x010203 OP_0');
- Script.fromString('OP_0 3 0x010203 OP_0').toString().should.equal('OP_0 3 0x010203 OP_0');
- });
-
- });
-
- describe('#toString', function() {
-
- it('should work with an empty script', function() {
- var script = new Script();
- script.toString().should.equal('');
- });
-
- it('should output this buffer an OP code, data, and another OP code', function() {
- var buf = new Buffer([0, 0, 0, 0, 0, 0, 1, 2, 3, 0]);
- buf[0] = Opcode.OP_0;
- buf[1] = Opcode.OP_PUSHDATA4;
- buf.writeUInt16LE(3, 2);
- buf[buf.length - 1] = Opcode.OP_0;
- var script = Script.fromBuffer(buf);
- script.chunks.length.should.equal(3);
- script.chunks[0].opcodenum.should.equal(buf[0]);
- script.chunks[1].buf.toString('hex').should.equal('010203');
- script.chunks[2].opcodenum.should.equal(buf[buf.length - 1]);
- script.toString().toString('hex').should.equal('OP_0 OP_PUSHDATA4 3 0x010203 OP_0');
- });
-
- it('should output this known script as ASM', function() {
- var script = Script.fromHex('76a914f4c03610e60ad15100929cc23da2f3a799af172588ac');
- script.toASM().should.equal('OP_DUP OP_HASH160 f4c03610e60ad15100929cc23da2f3a799af1725 OP_EQUALVERIFY OP_CHECKSIG');
- });
-
- it('should output this known script with pushdata1 opcode as ASM', function() {
- // network: livenet
- // txid: dd6fabd2d879be7b8394ad170ff908e9a36b5d5d0b394508df0cca36d2931589
- var script = Script.fromHex('00483045022100beb1d83771c04faaeb40bded4f031ed0e0730aaab77cf70102ecd05734a1762002206f168fb00f3b9d7c04b8c78e1fc11e81b9caa49885a904bf22780a7e14a8373101483045022100a319839e37828bf164ff45de34a3fe22d542ebc8297c5d87dbc56fc3068ff9d5022077081a877b6e7f104d8a2fe0985bf2eb7de2e08edbac9499fc3710a353f65461014c69522103a70ae7bde64333461fb88aaafe12ad6c67ca17c8213642469ae191e0aabc7251210344a62338c8ddf138771516d38187146242db50853aa588bcb10a5e49c86421a52102b52a1aed304c4d6cedcf82911f90ca6e1ffed0a5b8f7f19c68213d6fcbde677e53ae');
- script.toASM().should.equal('0 3045022100beb1d83771c04faaeb40bded4f031ed0e0730aaab77cf70102ecd05734a1762002206f168fb00f3b9d7c04b8c78e1fc11e81b9caa49885a904bf22780a7e14a8373101 3045022100a319839e37828bf164ff45de34a3fe22d542ebc8297c5d87dbc56fc3068ff9d5022077081a877b6e7f104d8a2fe0985bf2eb7de2e08edbac9499fc3710a353f6546101 522103a70ae7bde64333461fb88aaafe12ad6c67ca17c8213642469ae191e0aabc7251210344a62338c8ddf138771516d38187146242db50853aa588bcb10a5e49c86421a52102b52a1aed304c4d6cedcf82911f90ca6e1ffed0a5b8f7f19c68213d6fcbde677e53ae');
- });
-
- it('should OP_1NEGATE opcode as -1 with ASM', function() {
- var script = Script.fromString('OP_1NEGATE');
- script.toASM().should.equal('-1');
- });
-
- });
-
- describe('toHex', function() {
- it('should return an hexa string "03010203" as expected from [3, 1, 2, 3]', function() {
- var buf = new Buffer([3, 1, 2, 3]);
- var script = Script.fromBuffer(buf);
- script.toHex().should.equal('03010203');
- });
- });
-
- describe('#isDataOut', function() {
-
- it('should know this is a (blank) OP_RETURN script', function() {
- Script('OP_RETURN').isDataOut().should.equal(true);
- });
-
- it('validates that this 40-byte OP_RETURN is standard', function() {
- var buf = new Buffer(40);
- buf.fill(0);
- Script('OP_RETURN 40 0x' + buf.toString('hex')).isDataOut().should.equal(true);
- });
- it('validates that this 80-byte OP_RETURN is standard', function() {
- var buf = new Buffer(80);
- buf.fill(0);
- Script('OP_RETURN OP_PUSHDATA1 80 0x' + buf.toString('hex')).isDataOut().should.equal(true);
- });
-
- it('validates that this 40-byte long OP_CHECKMULTISIG is not standard op_return', function() {
- var buf = new Buffer(40);
- buf.fill(0);
- Script('OP_CHECKMULTISIG 40 0x' + buf.toString('hex')).isDataOut().should.equal(false);
- });
-
- it('validates that this 81-byte OP_RETURN is not a valid standard OP_RETURN', function() {
- var buf = new Buffer(81);
- buf.fill(0);
- Script('OP_RETURN OP_PUSHDATA1 81 0x' + buf.toString('hex')).isDataOut().should.equal(false);
- });
- });
-
- describe('#isPublicKeyIn', function() {
- it('correctly identify scriptSig as a public key in', function() {
- // from txid: 5c85ed63469aa9971b5d01063dbb8bcdafd412b2f51a3d24abf2e310c028bbf8
- // and input index: 5
- var scriptBuffer = new Buffer('483045022050eb59c79435c051f45003d9f82865c8e4df5699d7722e77113ef8cadbd92109022100d4ab233e070070eb8e0e62e3d2d2eb9474a5bf135c9eda32755acb0875a6c20601', 'hex');
- var script = bitcore.Script.fromBuffer(scriptBuffer);
- script.isPublicKeyIn().should.equal(true);
- });
- });
-
- describe('#isPublicKeyHashIn', function() {
-
- it('should identify this known pubkeyhashin (uncompressed pubkey version)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known pubkeyhashin (hybrid pubkey version w/06)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x06e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known pubkeyhashin (hybrid pubkey version w/07)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x07e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known pubkeyhashin (compressed pubkey w/ 0x02)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x02aec6b86621e7fef63747fbfd6a6e7d54c8e1052044ef2dd2c5e46656ef1194d4').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known pubkeyhashin (compressed pubkey w/ 0x03)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 21 0x03e724d93c4fda5f1236c525de7ffac6c5f1f72b0f5cdd1fc4b4f5642b6d055fcc').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known non-pubkeyhashin (bad ops length)', function() {
- Script('73 0x3046022100bb3c194a30e460d81d34be0a230179c043a656f67e3c5c8bf47eceae7c4042ee0221008bf54ca11b2985285be0fd7a212873d243e6e73f5fad57e8eb14c4f39728b8c601 65 0x04e365859b3c78a8b7c202412b949ebca58e147dba297be29eee53cd3e1d300a6419bc780cc9aec0dc94ed194e91c8f6433f1b781ee00eac0ead2aae1e8e0712c6 OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
- });
-
- it('should identify this known pubkey', function() {
- Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x0370b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(true);
- });
-
- it('should identify this known non-pubkeyhashin (bad version)', function() {
- Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x1270b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(false);
- });
-
- it('should identify this known non-pubkeyhashin (bad signature version)', function() {
- Script('70 0x4043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 33 0x0370b2e1dcaa8f51cb0ead1221dd8cb31721502b3b5b7d4b374d263dfec63a4369').isPublicKeyHashIn().should.equal(false);
- });
-
- it('should identify this known non-pubkeyhashin (no public key)', function() {
- Script('70 0x3043021f336721e4343f67c835cbfd465477db09073dc38a936f9c445d573c1c8a7fdf022064b0e3cb6892a9ecf870030e3066bc259e1f24841c9471d97f9be08b73f6530701 OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
- });
-
- it('should identify this known non-pubkeyhashin (no signature)', function() {
- Script('OP_DROP OP_CHECKSIG').isPublicKeyHashIn().should.equal(false);
- });
-
- });
-
- describe('#isPublicKeyHashOut', function() {
-
- it('should identify this known pubkeyhashout as pubkeyhashout', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG').isPublicKeyHashOut().should.equal(true);
- });
-
- it('should identify this known non-pubkeyhashout as not pubkeyhashout 1', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000').isPublicKeyHashOut().should.equal(false);
- });
-
- it('should identify this known non-pubkeyhashout as not pubkeyhashout 2', function() {
- Script('OP_DUP OP_HASH160 2 0x0000 OP_EQUALVERIFY OP_CHECKSIG').isPublicKeyHashOut().should.equal(false);
- });
-
- });
-
- describe('#isMultisigOut', function() {
- it('should identify known multisig out 1', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
- });
- it('should identify known multisig out 2', function() {
- Script('OP_1 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
- });
- it('should identify known multisig out 3', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x03363d90d447b00c9c99ceac05b6262ee053441c7e55552ffe526bad8f83ff4640 OP_3 OP_CHECKMULTISIG').isMultisigOut().should.equal(true);
- });
-
- it('should identify non-multisig out 1', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG OP_EQUAL').isMultisigOut().should.equal(false);
- });
- it('should identify non-multisig out 2', function() {
- Script('OP_2').isMultisigOut().should.equal(false);
- });
- });
-
- describe('#isMultisigIn', function() {
- it('should identify multisig in 1', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01').isMultisigIn().should.equal(true);
- });
- it('should identify multisig in 2', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01 0x48 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501').isMultisigIn().should.equal(true);
- });
- it('should identify non-multisig in 1', function() {
- Script('0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01').isMultisigIn().should.equal(false);
- });
- it('should identify non-multisig in 2', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01 OP_0').isMultisigIn().should.equal(false);
- });
- });
-
- describe('#isScriptHashIn', function() {
- it('should identify this known scripthashin', function() {
- var sstr = 'OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae';
- var s = Script(sstr);
- s.toString().should.equal(sstr);
- s.isScriptHashIn().should.equal(true);
- });
-
- it('should identify this known non-scripthashin', function() {
- Script('20 0000000000000000000000000000000000000000 OP_CHECKSIG').isScriptHashIn().should.equal(false);
- });
-
- it('should identify this problematic non-scripthashin scripts', function() {
- var s = new Script('71 0x3044022017053dad84aa06213749df50a03330cfd24d6' +
- 'b8e7ddbb6de66c03697b78a752a022053bc0faca8b4049fb3944a05fcf7c93b2861' +
- '734d39a89b73108f605f70f5ed3401 33 0x0225386e988b84248dc9c30f784b06e' +
- '02fdec57bbdbd443768eb5744a75ce44a4c');
- var s2 = new Script('OP_RETURN 32 0x19fdb20634911b6459e6086658b3a6ad2dc6576bd6826c73ee86a5f9aec14ed9');
- s.isScriptHashIn().should.equal(false);
- s2.isScriptHashIn().should.equal(false);
- });
- it('identifies this other problematic non-p2sh in', function() {
- var s = Script.fromString('73 0x3046022100dc7a0a812de14acc479d98ae209402cc9b5e0692bc74b9fe0a2f083e2f9964b002210087caf04a711bebe5339fd7554c4f7940dc37be216a3ae082424a5e164faf549401');
- s.isScriptHashIn().should.equal(false);
- });
- });
-
- describe('#isScripthashOut', function() {
-
- it('should identify this known p2shout as p2shout', function() {
- Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(true);
- });
-
- it('should identify result of .isScriptHashOut() as p2sh', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG')
- .toScriptHashOut().isScriptHashOut().should.equal(true);
- });
-
- it('should identify these known non-p2shout as not p2shout', function() {
- Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL OP_EQUAL').isScriptHashOut().should.equal(false);
- Script('OP_HASH160 21 0x000000000000000000000000000000000000000000 OP_EQUAL').isScriptHashOut().should.equal(false);
- });
-
- });
-
- describe('#isWitnessScriptHashOut', function() {
- it('should recognize this script as p2wsh', function() {
- Script('OP_0 32 0xa99d08fbec6958f4d4a3776c3728ec448934d25fe1142054b8b68bac866dfc3a')
- .isWitnessScriptHashOut().should.equal(true);
- Script('0020a99d08fbec6958f4d4a3776c3728ec448934d25fe1142054b8b68bac866dfc3a')
- .isWitnessScriptHashOut().should.equal(true);
- });
- it('should NOT identify as p2wsh', function() {
- Script('OP_0 20 0x799d283e7f92af1dd242bf4eea513c6efd117de2')
- .isWitnessScriptHashOut().should.equal(false);
- });
- });
-
- describe('#isWitnessPublicKeyHashOut', function() {
- it('should identify as p2wpkh', function() {
- Script('OP_0 20 0x799d283e7f92af1dd242bf4eea513c6efd117de2')
- .isWitnessPublicKeyHashOut().should.equal(true);
- Script('0014799d283e7f92af1dd242bf4eea513c6efd117de2').isWitnessPublicKeyHashOut().should.equal(true);
- });
- it('should NOT identify as p2wpkh', function() {
- Script('OP_0 32 0xa99d08fbec6958f4d4a3776c3728ec448934d25fe1142054b8b68bac866dfc3a')
- .isWitnessPublicKeyHashOut().should.equal(false);
- });
- });
-
- describe('#isWitnessProgram', function() {
- it('will default values to empty object', function() {
- Script('OP_0 20 0x799d283e7f92af1dd242bf4eea513c6efd117de2')
- .isWitnessProgram().should.equal(true);
- });
- it('will return false if script is data push longer than 40 bytes', function() {
- Script('OP_0 42 0xd06863c385592423903682926825c495b6cf88fd7cd6159ffd72f778ca475d3046e7b87835d3b457cd')
- .isWitnessProgram().should.equal(false);
- });
- it('will return false if first byte op_code is greater than OP_16', function() {
- Script('OP_NOP 20 0x799d283e7f92af1dd242bf4eea513c6efd117de2')
- .isWitnessProgram().should.equal(false);
- });
- it('will return true with datapush of 20', function() {
- var values = {};
- Script('OP_0 20 0x799d283e7f92af1dd242bf4eea513c6efd117de2')
- .isWitnessProgram(values).should.equal(true);
- values.version.should.equal(0);
- values.program.toString('hex').should.equal('799d283e7f92af1dd242bf4eea513c6efd117de2');
- });
- it('will return true with datapush of 32', function() {
- var values = {};
- Script('OP_0 32 0xc756f6d660d4aaad55534cac599a0d9bf5c7e8f70363d22926291811a168c620')
- .isWitnessProgram(values).should.equal(true);
- values.version.should.equal(0);
- values.program.toString('hex').should.equal('c756f6d660d4aaad55534cac599a0d9bf5c7e8f70363d22926291811a168c620');
- });
- });
-
- describe('#isPushOnly', function() {
- it('should know these scripts are or aren\'t push only', function() {
- Script('OP_NOP 1 0x01').isPushOnly().should.equal(false);
- Script('OP_0').isPushOnly().should.equal(true);
- Script('OP_0 OP_RETURN').isPushOnly().should.equal(false);
- Script('OP_PUSHDATA1 5 0x1010101010').isPushOnly().should.equal(true);
- // like bitcoind, we regard OP_RESERVED as being "push only"
- Script('OP_RESERVED').isPushOnly().should.equal(true);
- });
- });
-
- describe('#classifyInput', function() {
- it('shouldn\'t classify public key hash out', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify public key hash in', function() {
- Script('47 0x3044022077a8d81e656c4a1c1721e68ce35fa0b27f13c342998e75854858c12396a15ffa02206378a8c6959283c008c87a14a9c0ada5cf3934ac5ee29f1fef9cac6969783e9801 21 0x03993c230da7dabb956292851ae755f971c50532efc095a16bee07f83ab9d262df').classifyInput().should.equal(Script.types.PUBKEYHASH_IN);
- });
- it('shouldn\'t classify script hash out', function() {
- Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify script hash in', function() {
- Script('OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae').classifyInput().should.equal(Script.types.SCRIPTHASH_IN);
- });
- it('shouldn\'t classify MULTISIG out', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify MULTISIG in', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01').classifyInput().should.equal(Script.types.MULTISIG_IN);
- });
- it('shouldn\'t classify OP_RETURN data out', function() {
- Script('OP_RETURN 1 0x01').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('shouldn\'t classify public key out', function() {
- Script('41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_CHECKSIG').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify public key in', function() {
- Script('47 0x3044022007415aa37ce7eaa6146001ac8bdefca0ddcba0e37c5dc08c4ac99392124ebac802207d382307fd53f65778b07b9c63b6e196edeadf0be719130c5db21ff1e700d67501').classifyInput().should.equal(Script.types.PUBKEY_IN);
- });
- it('should classify unknown', function() {
- Script('OP_TRUE OP_FALSE').classifyInput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify scriptHashIn, eventhough it\'s opreturn', function() {
- Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba').classifyInput().should.equal(Script.types.SCRIPTHASH_IN);
- });
- });
-
- describe('#classifyOutput', function() {
- it('should classify public key hash out', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG').classifyOutput().should.equal(Script.types.PUBKEYHASH_OUT);
- });
- it('shouldn\'t classify public key hash in', function() {
- Script('47 0x3044022077a8d81e656c4a1c1721e68ce35fa0b27f13c342998e75854858c12396a15ffa02206378a8c6959283c008c87a14a9c0ada5cf3934ac5ee29f1fef9cac6969783e9801 21 0x03993c230da7dabb956292851ae755f971c50532efc095a16bee07f83ab9d262df').classifyOutput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify script hash out', function() {
- Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').classifyOutput().should.equal(Script.types.SCRIPTHASH_OUT);
- });
- it('shouldn\'t classify script hash in', function() {
- Script('OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae').classifyOutput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify MULTISIG out', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').classifyOutput().should.equal(Script.types.MULTISIG_OUT);
- });
- it('shouldn\'t classify MULTISIG in', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01').classifyOutput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify OP_RETURN data out', function() {
- Script('OP_RETURN 1 0x01').classifyOutput().should.equal(Script.types.DATA_OUT);
- });
- it('should classify public key out', function() {
- Script('41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_CHECKSIG').classifyOutput().should.equal(Script.types.PUBKEY_OUT);
- });
- it('shouldn\'t classify public key in', function() {
- Script('47 0x3044022007415aa37ce7eaa6146001ac8bdefca0ddcba0e37c5dc08c4ac99392124ebac802207d382307fd53f65778b07b9c63b6e196edeadf0be719130c5db21ff1e700d67501').classifyOutput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify unknown', function() {
- Script('OP_TRUE OP_FALSE').classifyOutput().should.equal(Script.types.UNKNOWN);
- });
- it('should classify opreturn eventhough it also looks like a scriptHashIn', function() {
- Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba').classifyOutput().should.equal(Script.types.DATA_OUT);
- });
- });
-
- describe('#classify', function() {
- it('should classify public key hash out', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG').classify().should.equal(Script.types.PUBKEYHASH_OUT);
- });
- it('should classify public key hash in', function() {
- Script('47 0x3044022077a8d81e656c4a1c1721e68ce35fa0b27f13c342998e75854858c12396a15ffa02206378a8c6959283c008c87a14a9c0ada5cf3934ac5ee29f1fef9cac6969783e9801 21 0x03993c230da7dabb956292851ae755f971c50532efc095a16bee07f83ab9d262df').classify().should.equal(Script.types.PUBKEYHASH_IN);
- });
- it('should classify script hash out', function() {
- Script('OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUAL').classify().should.equal(Script.types.SCRIPTHASH_OUT);
- });
- it('should classify script hash in', function() {
- Script('OP_0 73 0x30460221008ca148504190c10eea7f5f9c283c719a37be58c3ad617928011a1bb9570901d2022100ced371a23e86af6f55ff4ce705c57d2721a09c4d192ca39d82c4239825f75a9801 72 0x30450220357011fd3b3ad2b8f2f2d01e05dc6108b51d2a245b4ef40c112d6004596f0475022100a8208c93a39e0c366b983f9a80bfaf89237fcd64ca543568badd2d18ee2e1d7501 OP_PUSHDATA1 105 0x5221024c02dff2f0b8263a562a69ec875b2c95ffad860f428acf2f9e8c6492bd067d362103546324a1351a6b601c623b463e33b6103ca444707d5b278ece1692f1aa7724a42103b1ad3b328429450069cc3f9fa80d537ee66ba1120e93f3f185a5bf686fb51e0a53ae').classify().should.equal(Script.types.SCRIPTHASH_IN);
- });
- it('should classify MULTISIG out', function() {
- Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG').classify().should.equal(Script.types.MULTISIG_OUT);
- });
- it('should classify MULTISIG in', function() {
- Script('OP_0 0x47 0x3044022002a27769ee33db258bdf7a3792e7da4143ec4001b551f73e6a190b8d1bde449d02206742c56ccd94a7a2e16ca52fc1ae4a0aa122b0014a867a80de104f9cb18e472c01').classify().should.equal(Script.types.MULTISIG_IN);
- });
- it('should classify OP_RETURN data out', function() {
- Script('OP_RETURN 1 0x01').classify().should.equal(Script.types.DATA_OUT);
- });
- it('should classify public key out', function() {
- Script('41 0x0479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8 OP_CHECKSIG').classify().should.equal(Script.types.PUBKEY_OUT);
- });
- it('should classify public key in', function() {
- Script('47 0x3044022007415aa37ce7eaa6146001ac8bdefca0ddcba0e37c5dc08c4ac99392124ebac802207d382307fd53f65778b07b9c63b6e196edeadf0be719130c5db21ff1e700d67501').classify().should.equal(Script.types.PUBKEY_IN);
- });
- it('should classify unknown', function() {
- Script('OP_TRUE OP_FALSE').classify().should.equal(Script.types.UNKNOWN);
- });
- it('should classify opreturn eventhough it also looks like a scriptHashIn', function() {
- Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba').classifyInput().should.equal(Script.types.SCRIPTHASH_IN);
- Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba').classify().should.equal(Script.types.DATA_OUT);
- });
- it('should classify scriptHashIn eventhough it is opreturn when script is marked is input', function() {
- Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba').classify().should.equal(Script.types.DATA_OUT);
- var s = Script('6a1c3630fd3792f7e847ae5e27985dfb127542ef37ac2a5147c3b9cec7ba');
- s._isInput = true; // this is normally set by when Script is initiated as part if Input or Output objects
- s.classify().should.equal(Script.types.SCRIPTHASH_IN);
- });
- it('should classify unknown eventhough it is public key hash when marked as input', function() {
- Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG').classify().should.equal(Script.types.PUBKEYHASH_OUT);
- var s = Script('OP_DUP OP_HASH160 20 0x0000000000000000000000000000000000000000 OP_EQUALVERIFY OP_CHECKSIG');
- s._isInput = true; // this is normally set by when Script is initiated as part if Input or Output objects
- s.classify().should.equal(Script.types.UNKNOWN);
- });
- it('should classify unknown eventhough it is public key hash in when marked as output', function() {
- var s = Script('47 0x3044022077a8d81e656c4a1c1721e68ce35fa0b27f13c342998e75854858c12396a15ffa02206378a8c6959283c008c87a14a9c0ada5cf3934ac5ee29f1fef9cac6969783e9801 21 0x03993c230da7dabb956292851ae755f971c50532efc095a16bee07f83ab9d262df');
- s.classify().should.equal(Script.types.PUBKEYHASH_IN);
- s._isOutput = true; // this is normally set by when Script is initiated as part if Input or Output objects
- s.classify().should.equal(Script.types.UNKNOWN);
- });
- });
-
- describe('#add and #prepend', function() {
-
- it('should add these ops', function() {
- Script().add(1).add(10).add(186).toString().should.equal('0x01 0x0a 0xba');
- Script().add(1000).toString().should.equal('0x03e8');
- Script().add('OP_CHECKMULTISIG').toString().should.equal('OP_CHECKMULTISIG');
- Script().add('OP_1').add('OP_2').toString().should.equal('OP_1 OP_2');
- Script().add(Opcode.OP_CHECKMULTISIG).toString().should.equal('OP_CHECKMULTISIG');
- Script().add(Opcode.map.OP_CHECKMULTISIG).toString().should.equal('OP_CHECKMULTISIG');
- });
-
- it('should prepend these ops', function() {
- Script().prepend('OP_CHECKMULTISIG').toString().should.equal('OP_CHECKMULTISIG');
- Script().prepend('OP_1').prepend('OP_2').toString().should.equal('OP_2 OP_1');
- });
-
- it('should add and prepend correctly', function() {
- Script().add('OP_1').prepend('OP_2').add('OP_3').prepend('OP_4').toString()
- .should.equal('OP_4 OP_2 OP_1 OP_3');
- });
-
- it('should add these push data', function() {
- var buf = new Buffer(1);
- buf.fill(0);
- Script().add(buf).toString().should.equal('1 0x00');
- buf = new Buffer(255);
- buf.fill(0);
- Script().add(buf).toString().should.equal('OP_PUSHDATA1 255 0x' + buf.toString('hex'));
- buf = new Buffer(256);
- buf.fill(0);
- Script().add(buf).toString().should.equal('OP_PUSHDATA2 256 0x' + buf.toString('hex'));
- buf = new Buffer(Math.pow(2, 16));
- buf.fill(0);
- Script().add(buf).toString().should.equal('OP_PUSHDATA4 ' + Math.pow(2, 16) + ' 0x' + buf.toString('hex'));
- });
-
- it('should add both pushdata and non-pushdata chunks', function() {
- Script().add('OP_CHECKMULTISIG').toString().should.equal('OP_CHECKMULTISIG');
- Script().add(Opcode.map.OP_CHECKMULTISIG).toString().should.equal('OP_CHECKMULTISIG');
- var buf = new Buffer(1);
- buf.fill(0);
- Script().add(buf).toString().should.equal('1 0x00');
- });
-
- it('should work for no data OP_RETURN', function() {
- Script().add(Opcode.OP_RETURN).add(new Buffer('')).toString().should.equal('OP_RETURN');
- });
- it('works with objects', function() {
- Script().add({
- opcodenum: 106
- }).toString().should.equal('OP_RETURN');
- });
- it('works with another script', function() {
- var someScript = Script('OP_2 21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 ' +
- '21 0x038282263212c609d9ea2a6e3e172de238d8c39cabd5ac1ca10646e23fd5f51508 OP_2 OP_CHECKMULTISIG');
- var s = new Script().add(someScript);
- s.toString()
- .should.equal(someScript.toString());
- });
- it('fails with wrong type', function() {
- var fails = function() {
- return new Script().add(true);
- };
- fails.should.throw('Invalid script chunk');
- });
- });
-
- describe('#isStandard', function() {
- it('should classify correctly standard script', function() {
- Script('OP_RETURN 1 0x00').isStandard().should.equal(true);
- });
- it('should classify correctly non standard script', function() {
- Script('OP_TRUE OP_FALSE').isStandard().should.equal(false);
- });
- });
-
- describe('#buildMultisigOut', function() {
- var pubKeyHexes = [
- '022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da',
- '03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9',
- '021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18',
- '02bf97f572a02a8900246d72c2e8fa3d3798a6e59c4e17de2d131d9c60d0d9b574',
- '036a98a36aa7665874b1ba9130bc6d318e52fd3bdb5969532d7fc09bf2476ff842',
- '033aafcbead78c08b0e0aacc1b0cdb40702a7c709b660bebd286e973242127e15b',
- ];
- var sortkeys = pubKeyHexes.slice(0, 3).map(PublicKey);
- it('should create sorted script by default', function() {
- var s = Script.buildMultisigOut(sortkeys, 2);
- s.toString().should.equal('OP_2 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9 OP_3 OP_CHECKMULTISIG');
- s.isMultisigOut().should.equal(true);
- });
- it('should fail when number of required signatures is greater than number of pubkeys', function() {
- expect(sortkeys.length).to.equal(3);
- expect(function() {
- return Script.buildMultisigOut(sortkeys, 4);
- }).to.throw('Number of required signatures must be less than or equal to the number of public keys');
- });
- it('should create unsorted script if specified', function() {
- var s = Script.buildMultisigOut(sortkeys, 2);
- var u = Script.buildMultisigOut(sortkeys, 2, {
- noSorting: true
- });
- s.toString().should.not.equal(u.toString());
- u.toString().should.equal('OP_2 33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da 33 0x03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9 33 0x021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18 OP_3 OP_CHECKMULTISIG');
- s.isMultisigOut().should.equal(true);
- });
- var test_mn = function(m, n) {
- var pubkeys = pubKeyHexes.slice(0, n).map(PublicKey);
- var s = Script.buildMultisigOut(pubkeys, m);
- s.isMultisigOut().should.equal(true);
- };
- for (var n = 1; n < 6; n++) {
- for (var m = 1; m <= n; m++) {
- it('should create ' + m + '-of-' + n, test_mn.bind(null, m, n));
- }
- }
- });
-
- describe('#buildWitnessMultisigOutFromScript', function() {
- it('it will build nested witness scriptSig', function() {
- var redeemScript = bitcore.Script();
- var redeemHash = bitcore.crypto.Hash.sha256(redeemScript.toBuffer());
- var s = Script.buildWitnessMultisigOutFromScript(redeemScript);
- var buf = s.toBuffer();
- buf[0].should.equal(0);
- buf.slice(2, 34).toString('hex').should.equal(redeemHash.toString('hex'));
- });
- });
-
- describe('#buildPublicKeyHashOut', function() {
- it('should create script from livenet address', function() {
- var address = Address.fromString('1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14');
- var s = Script.buildPublicKeyHashOut(address);
- should.exist(s);
- s.toString().should.equal('OP_DUP OP_HASH160 20 0xecae7d092947b7ee4998e254aa48900d26d2ce1d OP_EQUALVERIFY OP_CHECKSIG');
- s.isPublicKeyHashOut().should.equal(true);
- s.toAddress().toString().should.equal('1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14');
- });
- it('should create script from testnet address', function() {
- var address = Address.fromString('mxRN6AQJaDi5R6KmvMaEmZGe3n5ScV9u33');
- var s = Script.buildPublicKeyHashOut(address);
- should.exist(s);
- s.toString().should.equal('OP_DUP OP_HASH160 20 0xb96b816f378babb1fe585b7be7a2cd16eb99b3e4 OP_EQUALVERIFY OP_CHECKSIG');
- s.isPublicKeyHashOut().should.equal(true);
- s.toAddress().toString().should.equal('mxRN6AQJaDi5R6KmvMaEmZGe3n5ScV9u33');
- });
- it('should create script from public key', function() {
- var pubkey = new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da');
- var s = Script.buildPublicKeyHashOut(pubkey);
- should.exist(s);
- s.toString().should.equal('OP_DUP OP_HASH160 20 0x9674af7395592ec5d91573aa8d6557de55f60147 OP_EQUALVERIFY OP_CHECKSIG');
- s.isPublicKeyHashOut().should.equal(true);
- should.exist(s._network);
- s._network.should.equal(pubkey.network);
- });
- });
- describe('#buildPublicKeyOut', function() {
- it('should create script from public key', function() {
- var pubkey = new PublicKey('022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da');
- var s = Script.buildPublicKeyOut(pubkey);
- should.exist(s);
- s.toString().should.equal('33 0x022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da OP_CHECKSIG');
- s.isPublicKeyOut().should.equal(true);
- });
- });
- describe('#buildDataOut', function() {
- it('should create script from no data', function() {
- var s = Script.buildDataOut();
- should.exist(s);
- s.toString().should.equal('OP_RETURN');
- s.isDataOut().should.equal(true);
- });
- it('should create script from empty data', function() {
- var data = new Buffer('');
- var s = Script.buildDataOut(data);
- should.exist(s);
- s.toString().should.equal('OP_RETURN');
- s.isDataOut().should.equal(true);
- });
- it('should create script from some data', function() {
- var data = new Buffer('bacacafe0102030405', 'hex');
- var s = Script.buildDataOut(data);
- should.exist(s);
- s.toString().should.equal('OP_RETURN 9 0xbacacafe0102030405');
- s.isDataOut().should.equal(true);
- });
- it('should create script from string', function() {
- var data = 'hello world!!!';
- var s = Script.buildDataOut(data);
- should.exist(s);
- s.toString().should.equal('OP_RETURN 14 0x68656c6c6f20776f726c64212121');
- s.isDataOut().should.equal(true);
- });
- it('should create script from a hex string', function() {
- var hexString = 'abcdef0123456789';
- var s = Script.buildDataOut(hexString, 'hex');
- should.exist(s);
- s.toString().should.equal('OP_RETURN 8 0xabcdef0123456789');
- s.isDataOut().should.equal(true);
- });
- });
- describe('#buildScriptHashOut', function() {
- it('should create script from another script', function() {
- var inner = new Script('OP_DUP OP_HASH160 20 0x06c06f6d931d7bfba2b5bd5ad0d19a8f257af3e3 OP_EQUALVERIFY OP_CHECKSIG');
- var s = Script.buildScriptHashOut(inner);
- should.exist(s);
- s.toString().should.equal('OP_HASH160 20 0x45ea3f9133e7b1cef30ba606f8433f993e41e159 OP_EQUAL');
- s.isScriptHashOut().should.equal(true);
- });
-
- it('inherits network property from other script', function() {
- var s1 = new Script.fromAddress(new Address('1FSMWkjVPAxzUNjbxT52p3mVKC971rfW3S'));
- var s2 = Script.buildScriptHashOut(s1);
- should.exist(s1._network);
- s1._network.should.equal(s2._network);
- });
-
- it('inherits network property form an address', function() {
- var address = new Address('34Nn91aTGaULqWsZiunrBPHzFBDrZ3B8XS');
- var script = Script.buildScriptHashOut(address);
- should.exist(script._network);
- script._network.should.equal(address.network);
- });
- });
- describe('#toScriptHashOut', function() {
- it('should create script from another script', function() {
- var s = new Script('OP_DUP OP_HASH160 20 0x06c06f6d931d7bfba2b5bd5ad0d19a8f257af3e3 OP_EQUALVERIFY OP_CHECKSIG');
- var sho = s.toScriptHashOut();
- sho.toString().should.equal('OP_HASH160 20 0x45ea3f9133e7b1cef30ba606f8433f993e41e159 OP_EQUAL');
- sho.isScriptHashOut().should.equal(true);
- });
- });
-
- describe('#removeCodeseparators', function() {
- it('should remove any OP_CODESEPARATORs', function() {
- Script('OP_CODESEPARATOR OP_0 OP_CODESEPARATOR').removeCodeseparators().toString().should.equal('OP_0');
- });
- });
-
-
- describe('#findAndDelete', function() {
- it('should find and delete this buffer', function() {
- Script('OP_RETURN 2 0xf0f0')
- .findAndDelete(Script('2 0xf0f0'))
- .toString()
- .should.equal('OP_RETURN');
- });
- it('should do nothing', function() {
- Script('OP_RETURN 2 0xf0f0')
- .findAndDelete(Script('2 0xffff'))
- .toString()
- .should.equal('OP_RETURN 2 0xf0f0');
- });
- });
-
-
- describe('#checkMinimalPush', function() {
-
- it('should check these minimal pushes', function() {
- Script().add(1).checkMinimalPush(0).should.equal(true);
- Script().add(0).checkMinimalPush(0).should.equal(true);
- Script().add(-1).checkMinimalPush(0).should.equal(true);
- Script().add(1000).checkMinimalPush(0).should.equal(true);
- Script().add(0xffffffff).checkMinimalPush(0).should.equal(true);
- Script().add(0xffffffffffffffff).checkMinimalPush(0).should.equal(true);
- Script().add(new Buffer([0])).checkMinimalPush(0).should.equal(true);
-
- var buf = new Buffer(75);
- buf.fill(1);
- Script().add(buf).checkMinimalPush(0).should.equal(true);
-
- buf = new Buffer(76);
- buf.fill(1);
- Script().add(buf).checkMinimalPush(0).should.equal(true);
-
- buf = new Buffer(256);
- buf.fill(1);
- Script().add(buf).checkMinimalPush(0).should.equal(true);
- });
-
- });
-
- describe('getData returns associated data', function() {
- it('works with this testnet transaction', function() {
- // testnet block: 00000000a36400fc06440512354515964bc36ecb0020bd0b0fd48ae201965f54
- // txhash: e362e21ff1d2ef78379d401d89b42ce3e0ce3e245f74b1f4cb624a8baa5d53ad (output 0);
- var script = Script.fromBuffer(new Buffer('6a', 'hex'));
- var dataout = script.isDataOut();
- dataout.should.equal(true);
- var data = script.getData();
- data.should.deep.equal(new Buffer(0));
- });
- it('for a P2PKH address', function() {
- var address = Address.fromString('1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14');
- var script = Script.buildPublicKeyHashOut(address);
- expect(BufferUtil.equal(script.getData(), address.hashBuffer)).to.be.true();
- });
- it('for a P2SH address', function() {
- var address = Address.fromString('3GhtMmAbWrUf6Y8vDxn9ETB14R6V7Br3mt');
- var script = new Script(address);
- expect(BufferUtil.equal(script.getData(), address.hashBuffer)).to.be.true();
- });
- it('for a standard opreturn output', function() {
- expect(BufferUtil.equal(Script('OP_RETURN 1 0xFF').getData(), new Buffer([255]))).to.be.true();
- });
- it('fails if content is not recognized', function() {
- expect(function() {
- return Script('1 0xFF').getData();
- }).to.throw();
- });
- });
-
- describe('toAddress', function() {
- var pubkey = new PublicKey('027ffeb8c7795d529ee9cd96512d472cefe398a0597623438ac5d066a64af50072');
- var liveAddress = pubkey.toAddress(Networks.livenet);
- var testAddress = pubkey.toAddress(Networks.testnet);
-
- it('priorize the network argument', function() {
- var script = new Script(liveAddress);
- script.toAddress(Networks.testnet).toString().should.equal(testAddress.toString());
- script.toAddress(Networks.testnet).network.should.equal(Networks.testnet);
- });
- it('use the inherited network', function() {
- var script = new Script(liveAddress);
- script.toAddress().toString().should.equal(liveAddress.toString());
- script = new Script(testAddress);
- script.toAddress().toString().should.equal(testAddress.toString());
- });
- it('uses default network', function() {
- var script = new Script('OP_DUP OP_HASH160 20 ' +
- '0x06c06f6d931d7bfba2b5bd5ad0d19a8f257af3e3 OP_EQUALVERIFY OP_CHECKSIG');
- script.toAddress().network.should.equal(Networks.defaultNetwork);
- });
- it('for a P2PKH address', function() {
- var stringAddress = '1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14';
- var address = new Address(stringAddress);
- var script = new Script(address);
- script.toAddress().toString().should.equal(stringAddress);
- });
- it('for a P2SH address', function() {
- var stringAddress = '3GhtMmAbWrUf6Y8vDxn9ETB14R6V7Br3mt';
- var address = new Address(stringAddress);
- var script = new Script(address);
- script.toAddress().toString().should.equal(stringAddress);
- });
- it('fails if content is not recognized', function() {
- Script().toAddress(Networks.livenet).should.equal(false);
- });
-
- it('works for p2pkh output', function() {
- // taken from tx 7e519caca256423320b92e3e17be5701f87afecbdb3f53af598032bfd8d164f5
- var script = new Script('OP_DUP OP_HASH160 20 ' +
- '0xc8e11b0eb0d2ad5362d894f048908341fa61b6e1 OP_EQUALVERIFY OP_CHECKSIG');
- script.toAddress().toString().should.equal('1KK9oz4bFH8c1t6LmighHaoSEGx3P3FEmc');
- });
- it('works for p2pkh input', function() {
- // taken from tx 7e519caca256423320b92e3e17be5701f87afecbdb3f53af598032bfd8d164f5
- var script = new Script('72 0x3045022100eff96230ca0f55b1e8c7a63e014f48611ff1af40875ecd33dee9062d7a6f5e2002206320405b5f6992c756e03e66b21a05a812b60996464ac6af815c2638b930dd7a01 65 0x04150defa035a2c7d826d7d5fc8ab2154bd1bb832f1a5c8ecb338f436362ad232e428b57db44677c5a8bd42c5ed9e2d7e04e742c59bee1b40080cfd57dec64b23a');
- script.toAddress().toString().should.equal('1KK9oz4bFH8c1t6LmighHaoSEGx3P3FEmc');
- // taken from tx 7f8f95752a59d715dae9e0008a42e7968d2736741591bbfc6685f6e1649c21ed
- var s2 = new Script('71 0x3044022017053dad84aa06213749df50a03330cfd24d6b8e7ddbb6de66c03697b78a752a022053bc0faca8b4049fb3944a05fcf7c93b2861734d39a89b73108f605f70f5ed3401 33 0x0225386e988b84248dc9c30f784b06e02fdec57bbdbd443768eb5744a75ce44a4c');
- s2.toAddress().toString().should.equal('17VArX6GRE6i6MVscBUZoXwi6NhnHa68B7');
- });
-
- it('works for p2sh output', function() {
- // taken from tx fe1f764299dc7f3b5a8fae912050df2b633bf99554c68bf1c456edb9c2b63585
- var script = new Script('OP_HASH160 20 0x99d29051af0c29adcb9040034752bba7dde33e35 OP_EQUAL');
- script.toAddress().toString().should.equal('3FiMZ7stbfH2WG5JQ7CiuzrFo7CEnGUcAP');
- });
- it('works for p2sh input', function() {
- // taken from tx fe1f764299dc7f3b5a8fae912050df2b633bf99554c68bf1c456edb9c2b63585
- var script = new Script('OP_FALSE 72 0x3045022100e824fbe979fac5834d0062dd5a4e82a898e00ac454bd254cd708ad28530816f202206251ff0fa4dd70c0524c690d4e4deb2bd167297e7bbdf6743b4a8050d681555001 37 0x512102ff3ae0aaa4679ea156d5581dbe6695cc0c311df0aa42af76670d0debbd8f672951ae');
- script.toAddress().toString().should.equal('3GYicPxCvsKvbJmZNBBeWkC3cLuGFhtrQi');
- });
-
- // no address scripts
- it('works for OP_RETURN script', function() {
- var script = new Script('OP_RETURN 20 0x99d29051af0c29adcb9040034752bba7dde33e35');
- script.toAddress().should.equal(false);
- });
-
- });
- describe('equals', function() {
- it('returns true for same script', function() {
- Script('OP_TRUE').equals(Script('OP_TRUE')).should.equal(true);
- });
- it('returns false for different chunks sizes', function() {
- Script('OP_TRUE').equals(Script('OP_TRUE OP_TRUE')).should.equal(false);
- });
- it('returns false for different opcodes', function() {
- Script('OP_TRUE OP_TRUE').equals(Script('OP_TRUE OP_FALSE')).should.equal(false);
- });
- it('returns false for different data', function() {
- Script().add(new Buffer('a')).equals(Script('OP_TRUE')).should.equal(false);
- });
- it('returns false for different data', function() {
- Script().add(new Buffer('a')).equals(Script().add(new Buffer('b'))).should.equal(false);
- });
- });
-
- describe('#getSignatureOperationsCount', function() {
- // comes from bitcoind src/test/sigopcount_tests
- // only test calls to function with boolean param, not signature ref param
- var pubKeyHexes = [
- '022df8750480ad5b26950b25c7ba79d3e37d75f640f8e5d9bcd5b150a0f85014da',
- '03e3818b65bcc73a7d64064106a859cc1a5a728c4345ff0b641209fba0d90de6e9',
- '021f2f6e1e50cb6a953935c3601284925decd3fd21bc445712576873fb8c6ebc18',
- ];
- it('should return zero for empty scripts', function() {
- Script().getSignatureOperationsCount(false).should.equal(0);
- Script().getSignatureOperationsCount(true).should.equal(0);
- });
- it('should handle multi-sig multisig scripts from string', function() {
- var s1 = 'OP_1 01 FF OP_2 OP_CHECKMULTISIG';
- Script(s1).getSignatureOperationsCount(true).should.equal(2);
- s1 += ' OP_IF OP_CHECKSIG OP_ENDIF';
- Script(s1).getSignatureOperationsCount(true).should.equal(3);
- Script(s1).getSignatureOperationsCount(false).should.equal(21);
- });
- it('should handle multi-sig-out scripts from utility function', function() {
- var sortKeys = pubKeyHexes.slice(0, 3).map(PublicKey);
- var s2 = Script.buildMultisigOut(sortKeys, 1);
- Script(s2).getSignatureOperationsCount(true).should.equal(3);
- Script(s2).getSignatureOperationsCount(false).should.equal(20);
- });
- it('should handle P2SH-multisig-in scripts from utility', function() {
- // create a well-formed signature, does not need to match pubkeys
- var signature = bitcore.crypto.Signature.fromString('30060201FF0201FF');
- var signatures = [ signature.toBuffer() ];
- var p2sh = Script.buildP2SHMultisigIn(pubKeyHexes, 1, signatures, {});
- p2sh.getSignatureOperationsCount(true).should.equal(0);
- p2sh.getSignatureOperationsCount(false).should.equal(0);
- });
- it('should default the one and only argument to true', function() {
- var s1 = 'OP_1 01 FF OP_2 OP_CHECKMULTISIG';
- var trueCount = Script(s1).getSignatureOperationsCount(true);
- var falseCount = Script(s1).getSignatureOperationsCount(false);
- var defaultCount = Script(s1).getSignatureOperationsCount();
- trueCount.should.not.equal(falseCount);
- trueCount.should.equal(defaultCount);
- });
- });
-});
diff --git a/test/test-assetcreatetx.js b/test/test-assetcreatetx.js
index 92cb96a..373e990 100644
--- a/test/test-assetcreatetx.js
+++ b/test/test-assetcreatetx.js
@@ -1,77 +1,39 @@
'use strict';
-// usage: node test-assetcreatetx.js
-
-/*
-Build a transaction for asset create
-note:
-In addition to publishing assets miners fee, we need additional deduction 550WICC
-
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when calling smart contract , >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4. assetSymbol: Asset symbols, publishing success can not be modified (asset Symbol Capital letter A-Z 1-7 digits [A_Z])
-5. ownerAddress: asset owner
-6. tokeName: asset name
-7. totalSupply: total asset circulation
-8. minTable: Whether the asset can be issued
-9、feesCoinSymbol: fee type(WICC/WUSD)
-*/
-/*
-构建发布资产交易
-
-发布资产除了矿工费,还需额外扣除550WICC
-
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:调用合约交易时的手续费, >= 1000000 sawi(0.01 wicc)
-3、同一笔交易在确认之前无法重复提交(BPS = 0.1)。 建议通过增加随机手续费来解决批量启动交易的问题。
-4、assetSymbol: 资产符号,发布成功无法再修改(1-7位大写字母)
-5、ownerAddress: 资产拥有者
-6、assetName: 资产名称
-7、totalSupply: 资产总发行量
-8、minTable: 资产是否可以增发
-9、feesCoinSymbol: 小费类型(WICC/WUSD)
-*/
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var arg = {
- network: 'testnet'
-}
-var wiccApi = new bitcore.WiccApi(arg)
-
-var assetData = {
- assetSymbol: "STOKENN", //asset Symbol Capital letter A-Z 6-7 digits [A_Z]
- ownerAddress: "0-1", //asset owner
- assetName:"SS Token", //asset token name
- totalSupply:10000000000000000,// total Supply *10^8
- minTable:false //Whether to increase the number
+var { WaykiTransaction, Wallet, BaasClient } = require("../index");
+var wallet = new Wallet("Y9nSdtBMWzWnEzx3TCgZ2iR8n4mq33AgkwbuoFT8VUWjDrcYjfgD");
+var baasClient = new BaasClient("https://baas-test.wiccdev.org/v2/api")
+
+;(async () => {
+ var heightResponse = await baasClient.getBlockCount()
+ var regIdResponse = await baasClient.getAccountInfo(wallet.address)
+
+ var assetData = {
+ assetSymbol: "STOKENN", //asset Symbol Capital letter A-Z 6-7 digits [A_Z]
+ ownerRegid: "0-1", //asset owner
+ assetName: "SS Token", //asset token name
+ totalSupply: 10000000000000000,// total Supply *10^8
+ modifiAble: false //whether to allow modify
}
-
-//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
-var assetCreateInfo = {
- nTxType: bitcore.WiccApi.ASSET_ISUUE,
- nVersion: 1,
- nValidHeight: 8720, // create height
- srcRegId: "8267-2", // sender's regId
- assetData: assetData,
- feesCoinSymbol:WriterHelper.prototype.CoinType.WICC,
- fees: 10000000, // fees pay for miner min 0.01 wicc +550wicc
-};
-
-var wiccPrivateKey = 'Y9wDyMys64KVhqwAVxbAB4aYDNVQ4HpRhQ7FLWFC3MhNNXz4JHot'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.ASSET_ISUUE, assetCreateInfo)
-console.log("asset create tx raw: ")
-console.log(rawtx)
+ //note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
+ var assetCreateInfo = {
+ nTxType: 9,
+ nValidHeight: heightResponse.data, // create height
+ srcRegId: regIdResponse.data.regid, // sender's regId
+ asset: assetData,
+ feeSymbol: "WICC",
+ fees: 55001000000, // fees pay for miner min 0.01 wicc +550wicc
+ };
+
+ var transaction = new WaykiTransaction(assetCreateInfo, wallet)
+ var rawtx = transaction.genRawTx()
+ console.log("asset create tx raw: ")
+ console.log(rawtx)
+ console.log(" Broadcast transaction signature data to blockchain => ")
+ baasClient.sendRawTx(rawtx).then(res => {
+ console.log(res)
+ }).catch(err => {
+ console.log(err)
+ })
+})()
\ No newline at end of file
diff --git a/test/test-assetupdatetx.js b/test/test-assetupdatetx.js
deleted file mode 100644
index 28ad82b..0000000
--- a/test/test-assetupdatetx.js
+++ /dev/null
@@ -1,84 +0,0 @@
-'use strict';
-
-// usage: node test-assetupdatetx.js
-
-/*
-Build a transaction for asset update
-
-In addition to updating assets miners fee, we need additional deduction 110WICC
-
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when calling smart contract , >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4. assetSymbol: Asset symbols, publishing success can not be modified
-5、feesCoinSymbol: fee type(WICC/WUSD)
-6、 updateType: update type 1: asset owner 2: asset name 3. number of assets
-*/
-/*
-构建发布资产交易
-
-更新资产除了矿工费,还需额外扣除110WICC
-
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:调用合约交易时的手续费, >= 1000000 sawi(0.01 wicc)
-3、同一笔交易在确认之前无法重复提交(BPS = 0.1)。 建议通过增加随机手续费来解决批量启动交易的问题。
-4、assetSymbol: 资产符号,发布成功无法再修改
-5、feesCoinSymbol: 小费类型(WICC/WUSD)
-6、updateType:更新类型 1:资产拥有者 2:资产名称 3.资产数量
-*/
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var arg = {
- network: 'testnet'
-}
-var wiccApi = new bitcore.WiccApi(arg)
-
-//update asset owner regid
-var assetUpdateData = {
- updateType:WriterHelper.prototype.UpdateAssetType.OWNER_UID,
- updateValue:"0-1", //owner address
- }
-
-//update asset name
-// var assetUpdateData = {
-// updateType:WriterHelper.prototype.UpdateAssetType.NAME,
-// updateValue:"TokenName", //asset name
-// }
-
-//update asset token number
-// var assetUpdateData = {
-// updateType: WriterHelper.prototype.UpdateAssetType.MINT_AMOUNT,
-// updateValue: 11000000000000000, //Increase the number of asset
-// }
-
-
-//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
-var assetUpdateInfo = {
- nTxType: bitcore.WiccApi.ASSET_UPDATE,
- nVersion: 1,
- nValidHeight: 28128, // create height
- srcRegId: "0-1", // sender's regId
- assetUpdateData: assetUpdateData,
- feesCoinSymbol: WriterHelper.prototype.CoinType.WICC,
- publicKey: "03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- assetSymbol: "LOLLLL", //Symbol Capital letter A-Z 6-7 digits [A_Z]
- fees: 11000000000, // fees pay for miner min 0.01 wicc +110wicc
-};
-
-var wiccPrivateKey = 'YCnMXzTmEbvjMHA8zLHA8ratHH5noPdFEENKfYPa2uVLcmL3wb6H'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.ASSET_UPDATE, assetUpdateInfo)
-console.log("asset update tx raw: ")
-console.log(rawtx)
diff --git a/test/test-callcontracttx.js b/test/test-callcontracttx.js
deleted file mode 100644
index a6cfc8a..0000000
--- a/test/test-callcontracttx.js
+++ /dev/null
@@ -1,49 +0,0 @@
-'use strict';
-
-// usage: node test-contracttx.js
-
-var bitcore = require('..');
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-/*
-Build a transaction for calling smart contract
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when calling smart contract , >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建调用合约的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:调用合约交易时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var regAppInfo = {
- nTxType: bitcore.WiccApi.CONTRACT_TX,
- nVersion: 1,
- nValidHeight: 34400, // create height
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- srcRegId: '', // sender's regId
- destRegId: "24555-1", // app regId
- fees: 1000000, // fees pay for miner
- value: 8, // amount of WICC to be sent to the app account
- vContract: "f018" // contract method, hex format string
-};
-
-var wiccPrivateKey = 'Y9f6JFRnYkHMPuEhymC15wHD9FbYBmeV2S6VfDicb4ghNhtXhgAJ'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.CONTRACT_TX, regAppInfo)
-console.log("contract tx raw: ")
-console.log(rawtx)
diff --git a/test/test-cancelordertx.js b/test/test-cancelordertx.js
deleted file mode 100644
index 29e4190..0000000
--- a/test/test-cancelordertx.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict'
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-/*
-Build a transaction for cancel order transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000 sawi (0.001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, orderId:pending trading hash
-5, fee_symbol: fee type (WICC/WUSD)
-*/
-/*
-构建取消交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 10000 sawi(0.0001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、orderId:挂单的交易hash
-5, fee_symbol: 小费类型(WICC/WUSD)
-*/
-var dexCancelTxinfo = {
- nTxType: bitcore.WiccApi.DEX_CANCEL_ORDER_TX,
- nVersion: 1,
- nValidHeight: 5360,
- fees: 10000,
- feeSymbol: WriterHelper.prototype.CoinType.WICC,
- srcRegId: '',
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- orderId: '009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144',
- network: 'testnet'
- };
-
- var dexCancelOrderTx = new bitcore.Transaction.DexCancelOrderTx(dexCancelTxinfo);
-
- var hex = dexCancelOrderTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-cdpliquidatetx.js b/test/test-cdpliquidatetx.js
deleted file mode 100644
index d5f007d..0000000
--- a/test/test-cdpliquidatetx.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for cdp liquidate transaction
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4. cdpOwnerRegId: reg of the cdp creator
-5. cdpTxId: the transaction hash created by the cdp
-6. scoinsToLiquidate: the number of liquidation
-7, fee_symbol: fee type (WICC/WUSD)
-8、assetSymbol:get stake coin symbol
-*/
-/*
-构建cdp清算交易
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 10000 sawi(0.0001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、cdpOwnerRegId:cdp创建者的regid
-5、cdpTxId:该cdp的创建的交易hash
-6、scoinsToLiquidate:清算的数量
-7、fee_symbol:小费类型(WICC/WUSD)
-8、assetSymbol:赎回币种类型
-*/
-var cdpliquidateTxinfo = {
- nTxType: bitcore.WiccApi.CDP_LIQUIDATE_TX,
- nVersion: 1,
- nValidHeight: 501,
- txUid:"",
- fees: 100000,
- fee_symbol:WriterHelper.prototype.CoinType.WICC,
- cdpTxId: "009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144",
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- scoinsToLiquidate: 2000000000000,
- assetSymbol:WriterHelper.prototype.CoinType.WICC,
- network: 'testnet'
- };
-
-
- var cdpliquidateTx = new bitcore.Transaction.CdpLiquiDateTx(cdpliquidateTxinfo);
- console.log(cdpliquidateTx.bcoinsToStake)
-
- var hex = cdpliquidateTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-cdpredeemtx.js b/test/test-cdpredeemtx.js
deleted file mode 100644
index a44e85c..0000000
--- a/test/test-cdpredeemtx.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for cdp redeem
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, cdpTxId: cdp transaction hash
-5, assetAmount: stake coin amount
-6, assetSymbol: stake asset symbol
-7, fee_symbol: fee type (WICC/WUSD)
-*/
-/*
-构建cdp赎回的交易
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、cdpTxId:cdp交易hash
-5、scoins_to_repay:销毁的wusd数量
-6、assetAmount:赎回的数量
-7、assetSymbol: 赎回币种类型
-8、fee_symbol:小费类型(WICC/WUSD)
-*/
-var assetSymbol=WriterHelper.prototype.CoinType.WICC
-var assetAmount=100000000
-var map=new Map([[assetSymbol,assetAmount]])
-var cdpRedeemTxinfo = {
- nTxType: bitcore.WiccApi.CDP_REDEEMP_TX,
- nVersion: 1,
- nValidHeight: 78,
- txUid:"",
- fees: 100000,
- cdpTxId: "009c0e665acdd9e8ae754f9a51337b85bb8996980a93d6175b61edccd3cdc144",
- publicKey:"03af0341d7470d6e02687bec8920dbfba83544571a71f1cd6ef487c7fd88768c01",
- fee_symbol:WriterHelper.prototype.CoinType.WICC,
- scoins_to_repay: 0,
- assetMap: map,
- network: 'testnet'
- };
-
-
- var cdpRedeemTx = new bitcore.Transaction.CdpRedeemTx(cdpRedeemTxinfo);
-
- var hex = cdpRedeemTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-cdpstaketx.js b/test/test-cdpstaketx.js
deleted file mode 100644
index 6b41ebc..0000000
--- a/test/test-cdpstaketx.js
+++ /dev/null
@@ -1,62 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-// 验证地址
-var ret = wiccApi.validateAddress('wPcHigM3Gbtbooxyd3YyBXiMintZnfD7cE')
-console.log(ret)
-
-/*
-Build a transaction for cdp stake transaction
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-5、assetAmount:stake coin amount
-6、scoinsToMint:get coin amount
-7、fee_symbol:fee symbol(WICC/WUSD)
-8、assetAmount:stake coin symbol
-9、coin_symbol:get coind symbol
-*/
-/*
-构建cdp抵押交易
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、cdpTxId:cdp创建生成的交易hash
-5、assetAmount:抵押的数量(最低1WICC)
-6、scoinsToMint:获得的wusd
-7、fee_symbol:小费类型(WICC/WUSD)
-8、assetAmount:抵押币种
-9、coin_symbol:获得币种
-*/
-var assetSymbol=WriterHelper.prototype.CoinType.WICC
-var assetAmount=100000000
-var map=new Map([[assetSymbol,assetAmount]])
-var cdpStakeTxinfo = {
- nTxType: bitcore.WiccApi.CDP_STAKE_TX,
- nVersion: 1,
- nValidHeight: 25,
- txUid:"0-1",
- fees: 100000,
- fee_symbol:WriterHelper.prototype.CoinType.WICC,
- cdpTxId: "0b9734e5db3cfa38e76bb273dba4f65a210cc76ca2cf739f3c131d0b24ff89c1",
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- assetMap:map,
- scoin_symbol:WriterHelper.prototype.CoinType.WUSD,
- scoinsToMint: 0,
- network: 'testnet'
- };
-
-
- var cdpStakeTx = new bitcore.Transaction.CdpStakeTx(cdpStakeTxinfo);
-
- var hex = cdpStakeTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-commontx.js b/test/test-commontx.js
deleted file mode 100644
index b232b39..0000000
--- a/test/test-commontx.js
+++ /dev/null
@@ -1,58 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-// 验证地址
-var ret = wiccApi.validateAddress('wPcHigM3Gbtbooxyd3YyBXiMintZnfD7cE')
-console.log(ret)
-
-/*
-Build a transaction for common transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000000 sawi (0.1 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建普通转账交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 10000 sawi(0.0001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var commonTxinfo = {
- nTxType: 3,
- nVersion: 1,
- nValidHeight: 34550,
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- fees: 10000,
- srcRegId: '0-1',
- destAddr: 'wWTStcDL4gma6kPziyHhFGAP6xUzKpA5if',
- value:1100000000000,
- memo:"test transfer",
- network: 'testnet'
- };
-
- var value = 10000000000
- var tmp = (value >>> 7)
-
-
- var commonTx = new bitcore.Transaction.CommonTx(commonTxinfo);
- console.log(commonTx.destAddr)
-
- /*
- var ret = commonTx._SignatureHash()
- var ret = commonTx._SignatureHash()
- console.log(ret.toString('hex'))
-
- commonTx._Signtx(privateKey);
- */
-
- var hex = commonTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-delegatetx.js b/test/test-delegatetx.js
deleted file mode 100644
index db5eff8..0000000
--- a/test/test-delegatetx.js
+++ /dev/null
@@ -1,52 +0,0 @@
-'use strict';
-
-// usage: node test-contracttx.js
-
-var bitcore = require('..');
-
-var arg = {
- network: 'testnet'
-}
-var wiccApi = new bitcore.WiccApi(arg)
-
-/*
-publicKey can get from "getaccountinfo" cmd if the account have registered
-*/
-var delegateData = [ // array, item is object data of delegate
- {
- // address: 'waFdYrQfDSsh1jVsDzPiutAPUKCHZJ4Wyp'
- // publicKey: Buffer.from("02e5ee9bd73c561fc9844fc3065c87d297f6ba52f64f409346a4bb5035f2de25ab", 'hex'),
- publicKey: "0369e834a7e5708d4c94b098447fbead8213c679cf4a37b953bfed28af104239d3",
- votes: 201
- },{
- // address: 'wQsRcb6VcSr9DnpaLiWwrSA6YPuaUMbbYw'
- publicKey: "02dc40112e2e12106c749c5bee34b4037b2dff4cd300ee5a57948961a6c9441e27",
- votes: 202
- }
-]
-
-//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
-var delegateInfo = {
- nTxType: bitcore.WiccApi.DELEGATE_TX,
- nVersion: 1,
- nValidHeight: 28128, // create height
- srcRegId: "", // sender's regId
- delegateData: delegateData,
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- fees: 1001, // fees pay for miner
-};
-
-var wiccPrivateKey = 'YCnMXzTmEbvjMHA8zLHA8ratHH5noPdFEENKfYPa2uVLcmL3wb6H'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.DELEGATE_TX, delegateInfo)
-console.log("contract tx raw: ")
-console.log(rawtx)
diff --git a/test/test-dexbuylimitordertx.js b/test/test-dexbuylimitordertx.js
deleted file mode 100644
index b21ffad..0000000
--- a/test/test-dexbuylimitordertx.js
+++ /dev/null
@@ -1,48 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for dex buy limit transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000 sawi (0.001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, coinType: currency type
-5, assetType: asset type
-6, assetAmount: the amount of assets
-7, bidPrice: price
-*/
-/*
-构建普通限价买交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、coinType:币种类型
-5、assetType:资产类型
-6、assetAmount:资产金额
-7、bidPrice:价格
-*/
-var dexBuyLimitTxinfo = {
- nTxType: bitcore.WiccApi.DEX_BUY_LIMIT_ORDER_TX,
- nVersion: 1,
- nValidHeight: 5360,
- fees: 10000,
- srcRegId: '0-1',
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- feeSymbol: WriterHelper.prototype.CoinType.WICC,
- coinSymbol: WriterHelper.prototype.CoinType.WUSD,
- assetSymbol:WriterHelper.prototype.CoinType.WICC,
- assetAmount:10,
- bidPrice:200,
- network: 'testnet'
- };
-
- var dexBuyLimitOrderTx = new bitcore.Transaction.DexBuyLimitOrderTx(dexBuyLimitTxinfo);
-
- var hex = dexBuyLimitOrderTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-dexbuymarketordertx.js b/test/test-dexbuymarketordertx.js
deleted file mode 100644
index ebf6b9d..0000000
--- a/test/test-dexbuymarketordertx.js
+++ /dev/null
@@ -1,45 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for market buy transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000 sawi (0.001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, coinType: currency type
-5, assetType: asset type
-6, coinAmount: the amount of assets
-*/
-/*
-构建市价买单交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、coinType:币种类型
-5、assetType:资产类型
-6、coinAmount:资产金额
-*/
-var dexBuyMarketTxinfo = {
- nTxType: bitcore.WiccApi.DEX_BUY_MARKET_ORDER_TX,
- nVersion: 1,
- nValidHeight: 5360,
- fees: 10000,
- srcRegId: '',
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- feeSymbol: WriterHelper.prototype.CoinType.WICC,
- coinSymbol: WriterHelper.prototype.CoinType.WUSD,
- assetSymbol:WriterHelper.prototype.CoinType.WICC,
- coinAmount:200,
- network: 'testnet'
- };
-
- var dexBuyMarketOrderTx = new bitcore.Transaction.DexBuyMarketOrderTx(dexBuyMarketTxinfo);
-
- var hex = dexBuyMarketOrderTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-dexselllimitordertx.js b/test/test-dexselllimitordertx.js
deleted file mode 100644
index 29bb7c0..0000000
--- a/test/test-dexselllimitordertx.js
+++ /dev/null
@@ -1,40 +0,0 @@
-'use strict'
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for sell limit transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000 sawi (0.001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建限价卖单交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var dexSellLimitTxinfo = {
- nTxType: bitcore.WiccApi.DEX_SELL_LIMIT_ORDER_TX,
- nVersion: 1,
- nValidHeight: 602371,
- fees: 10000,
- srcRegId: '0-1',
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- feeSymbol: WriterHelper.prototype.CoinType.WICC,
- coinSymbol: WriterHelper.prototype.CoinType.WUSD,
- assetSymbol:WriterHelper.prototype.CoinType.WICC,
- assetAmount:30000000000,
- askPrice:200000000,
- network: 'testnet'
- };
-
-
- var dexSellLimitOrderTx = new bitcore.Transaction.DexSellLimitOrderTx(dexSellLimitTxinfo);
-
- var hex = dexSellLimitOrderTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-dexsellmarketordertx.js b/test/test-dexsellmarketordertx.js
deleted file mode 100644
index 3ff7e26..0000000
--- a/test/test-dexsellmarketordertx.js
+++ /dev/null
@@ -1,39 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-/*
-Build a transaction for sell limit transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 100000 sawi (0.001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建限价卖单交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 100000 sawi(0.001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var dexSellMarketTxinfo = {
- nTxType: bitcore.WiccApi.DEX_SELL_MARKET_ORDER_TX,
- nVersion: 1,
- nValidHeight: 602371,
- fees: 10000,
- srcRegId: '0-1',
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- feeSymbol: WriterHelper.prototype.CoinType.WICC,
- coinSymbol: WriterHelper.prototype.CoinType.WUSD,
- assetSymbol:WriterHelper.prototype.CoinType.WICC,
- assetAmount:30000000000,
- network: 'testnet'
- };
-
- var dexSellMarketOrderTx = new bitcore.Transaction.DexSellMarketOrderTx(dexSellMarketTxinfo);
-
- var hex = dexSellMarketOrderTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-fcoinstake.js b/test/test-fcoinstake.js
deleted file mode 100644
index 78cbaca..0000000
--- a/test/test-fcoinstake.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict'
-
-// const express = require("express");
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var privateKey = bitcore.PrivateKey.fromWIF('Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13')
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-// 验证地址
-var ret = wiccApi.validateAddress('wPcHigM3Gbtbooxyd3YyBXiMintZnfD7cE')
-console.log(ret)
-
-/*
-Build a transaction for fcoin stake transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 10000 sawi (0.0001 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, txUid: operator's regid
-5, fcoinsToStake: the number of coins stake
-*/
-/*
-构建权益币质押交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 10000 sawi(0.0001 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、txUid:操作者的regid
-5、fcoinsToStake:质押数量
-*/
-var fcoinStakeTxinfo = {
- nTxType: bitcore.WiccApi.FCOIN_STAKE_TX,
- nVersion: 1,
- nValidHeight: 23594,
- txUid:"",
- fees: 100000,
- feeSymbol:WriterHelper.prototype.CoinType.WICC,
- stakeType:WriterHelper.prototype.BalanceOpType.ADD_FREE,
- publicKey:"03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- fcoinsToStake: 2000000000000,
- network: 'testnet'
- };
-
-
- var cfcoinStakeTx = new bitcore.Transaction.CFcoinStakeTx(fcoinStakeTxinfo);
- console.log(cfcoinStakeTx.bcoinsToStake)
-
- var hex = cfcoinStakeTx.SerializeTx(privateKey)
- console.log(hex)
diff --git a/test/test-feedpricetx.js b/test/test-feedpricetx.js
deleted file mode 100644
index 7511a70..0000000
--- a/test/test-feedpricetx.js
+++ /dev/null
@@ -1,43 +0,0 @@
-'use strict';
-
-// usage: node test-contracttx.js
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-var feedPriceData = [
- {
- coinPriceType: {
- coinType:WriterHelper.prototype.CoinType.WICC,
- priceType:WriterHelper.prototype.PriceType.KWH
- },
- price: 200000
- }
-]
-
-//note: change "nValidHeight" to current valid height, so that you can execute “submittx” ok after get the result
-var regAppInfo = {
- nTxType: bitcore.WiccApi.PRICE_FEED_TX,
- nVersion: 1,
- nValidHeight: 28128, // create height
- srcRegId: "28121-3", // sender's regId
- feedPriceData: feedPriceData,
-};
-
-var wiccPrivateKey = 'YCnMXzTmEbvjMHA8zLHA8ratHH5noPdFEENKfYPa2uVLcmL3wb6H'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.PRICE_FEED_TX, regAppInfo)
-console.log("contract tx raw: ")
-console.log(rawtx)
diff --git a/test/test-messagevertify.js b/test/test-messagevertify.js
deleted file mode 100644
index b241088..0000000
--- a/test/test-messagevertify.js
+++ /dev/null
@@ -1,19 +0,0 @@
-'use strict';
-var bitcore = require('..');
-var Hash = require('../lib/crypto/hash');
-var crypto = require('crypto');
-var ECDSA = require('../lib/crypto/ecdsa');
-
-var privateKey = bitcore.PrivateKey.fromWIF("Y9wDyMys64KVhqwAVxbAB4aYDNVQ4HpRhQ7FLWFC3MhNNXz4JHot")
-var msg = "WaykiChain"
-var msgBuff = Buffer.from(msg)
-
-var msgBuffHash = Hash.sha256(Hash.sha256ripemd160(msgBuff));
-var signMsg = ECDSA.sign(msgBuffHash, privateKey, 'endian')
- console.log("签名消息"+signMsg)
- //验证消息
-var pubKey=privateKey.toPublicKey();
-console.log("公钥:"+pubKey)
-var vertifySuccess=ECDSA.verify(msgBuffHash, signMsg, pubKey, 'endian')
-
-console.log("验证成功?"+vertifySuccess)
diff --git a/test/test-registercontracttx.js b/test/test-registercontracttx.js
deleted file mode 100644
index 2897d46..0000000
--- a/test/test-registercontracttx.js
+++ /dev/null
@@ -1,59 +0,0 @@
-'use strict';
-
-// usage:
-// node test-registerapptx.js
-
-var _ = require('lodash');
-var bitcore = require('..');
-var fs = require("fs")
-
-var arg = {network: 'testnet'}
-var wiccApi = new bitcore.WiccApi(arg)
-
-var script = fs.readFileSync(__dirname + '/data/contract-hello.lua');
-//console.log("load script file:")
-//console.log(script);
-
-console.log(_.isString(script))
-console.log(_.isArray(script))
-console.log(_.isArrayBuffer(script))
-console.log(_.isBuffer(script))
-
-/*
-Build a transaction for deploy smart contract
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 110000000 sawi (1.1 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建发布合约的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 110000000 sawi(1.1 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var regAppInfo = {
- nTxType: bitcore.WiccApi.REG_APP_TX,
- nVersion: 1,
- nValidHeight: 110482, // create height
- regAcctId: "0-1", // sender's regId
- script: script, // contract scrypt content, string or buf
- scriptDesc: "test contract", // contract scrypt description, string or buf
- fees: 4200000000, // fees pay for miner
- };
-
-var wiccPrivateKey = 'Y6J4aK6Wcs4A3Ex4HXdfjJ6ZsHpNZfjaS4B9w7xqEnmFEYMqQd13'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.REG_APP_TX, regAppInfo)
-console.log("reg app tx raw: ")
-console.log(rawtx)
\ No newline at end of file
diff --git a/test/test-ucointransfertx.js b/test/test-ucointransfertx.js
deleted file mode 100644
index 21006a8..0000000
--- a/test/test-ucointransfertx.js
+++ /dev/null
@@ -1,57 +0,0 @@
-'use strict'
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-
-var privateKey = bitcore.PrivateKey.fromWIF('Y8JhshTg5j2jeTrwk3qBJDYGi5MVsAvfBJRgFfAp14T91UY9AHgZ')
-
-/*
-Build a transaction for common transfer
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when deploying a smart contract, >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-4, srcRegId: the regid of the transferor
-5, value: transfer amount
-6, coinType: currency type
-7, feesCoinType: fees type
-*/
-/*
-构建转账交易的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:发布合约时的手续费, >= 1000000 sawi(0.01 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-4、srcRegId:转账者的regid
-5、value:转账金额
-6、coinType:币种类型
-7、feesCoinType:小费类型
-*/
-
-var coinType = WriterHelper.prototype.CoinType.WUSD
-var destAddr = 'wh82HNEDZkZP2eVAS5t7dDxmJWqyx9gr65'
-var value = 32432
-var destArr = [{
- "coinType":coinType,
- "destAddr":destAddr,
- "value":value
- }
-]
-var cointransferTxinfo = {
- nTxType: bitcore.WiccApi.UCOIN_TRANSFER_TX,
- nVersion: 1,
- nValidHeight: 602371,
- fees: 10000,
- srcRegId: '',
- destArr:destArr,
- publicKey: "03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- memo: "test transfer",
- feesCoinType: WriterHelper.prototype.CoinType.WICC,
- network: 'testnet'
-};
-
-var cointransferTx = new bitcore.Transaction.UCoinTransferTx(cointransferTxinfo);
-console.log(cointransferTx.destAddr)
-
-var hex = cointransferTx.SerializeTx(privateKey)
-console.log(hex)
diff --git a/test/test-ucontractinvoketx.js b/test/test-ucontractinvoketx.js
deleted file mode 100644
index bae7c55..0000000
--- a/test/test-ucontractinvoketx.js
+++ /dev/null
@@ -1,51 +0,0 @@
-'use strict';
-
-// usage: node test-contracttx.js
-
-var bitcore = require('..');
-var WriterHelper = require('../lib/util/writerhelper')
-var arg = { network: 'testnet' }
-var wiccApi = new bitcore.WiccApi(arg)
-
-/*
-Build a transaction for calling smart contract
-note:
-1, nValidHeight: the height of the block when creating the signature, and the height difference when submitting the broadcast transaction must be <=250
-2, fees: handling fee when calling smart contract , >= 1000000 sawi (0.01 wicc)
-3. The same transaction cannot be submitted repeatedly before it is confirmed(BPS=0.1). It is recommended to solve the problem of batch initiated transaction by adding random handling fee.
-*/
-/*
-构建调用合约的交易单
-注意:
-1、nValidHeight:创建签名时的区块高度,与提交广播交易时的高度差必须 <=250
-2、fees:调用合约交易时的手续费, >= 1000000 sawi(0.01 wicc)
-3、相同的交易在未被确认前不能重复提交(BPS=0.1),建议采用添加随机手续费方式解决批量发起交易问题
-*/
-var invokeAppInfo = {
- nTxType: bitcore.WiccApi.UCOIN_CONTRACT_INVOKE_TX,
- nVersion: 1,
- nValidHeight: 34400, // create height
- publicKey: "03e93e7d870ce6f1c9997076c56fc24e6381c612662cd9a5a59294fac9ba7d21d7",
- srcRegId: '0-1', // sender's regId
- destRegId: "24555-1", // app regId
- feesCoinType: WriterHelper.prototype.CoinType.WICC,
- coinType: WriterHelper.prototype.CoinType.WUSD,
- fees: 1000000, // fees pay for miner
- value: 8, // amount of WICC to be sent to the app account
- vContract: "f018" // contract method, hex format string
-};
-
-var wiccPrivateKey = 'Y9f6JFRnYkHMPuEhymC15wHD9FbYBmeV2S6VfDicb4ghNhtXhgAJ'
-console.log("wicc private key:")
-console.log(wiccPrivateKey)
-
-var privateKey = bitcore.PrivateKey.fromWIF(wiccPrivateKey)
-//console.log("get private key:")
-//console.log(privateKey)
-var address = privateKey.toAddress();
-console.log("get address:")
-console.log(address.toString())
-
-var rawtx = wiccApi.createSignTransaction(privateKey, bitcore.WiccApi.UCOIN_CONTRACT_INVOKE_TX, invokeAppInfo)
-console.log("contract tx raw: ")
-console.log(rawtx)
diff --git a/test/transaction/deserialize.js b/test/transaction/deserialize.js
deleted file mode 100644
index e9f43b8..0000000
--- a/test/transaction/deserialize.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict';
-
-var Transaction = require('../../lib/transaction');
-
-var vectors_valid = require('../data/bitcoind/tx_valid.json');
-var vectors_invalid = require('../data/bitcoind/tx_invalid.json');
-
-describe('Transaction deserialization', function() {
-
- describe('valid transaction test case', function() {
- var index = 0;
- vectors_valid.forEach(function(vector) {
- it('vector #' + index, function() {
- if (vector.length > 1) {
- var hexa = vector[1];
- Transaction(hexa).serialize(true).should.equal(hexa);
- index++;
- }
- });
- });
- });
- describe('invalid transaction test case', function() {
- var index = 0;
- vectors_invalid.forEach(function(vector) {
- it('invalid vector #' + index, function() {
- if (vector.length > 1) {
- var hexa = vector[1];
- Transaction(hexa).serialize(true).should.equal(hexa);
- index++;
- }
- });
- });
- });
-});
diff --git a/test/transaction/input/input.js b/test/transaction/input/input.js
deleted file mode 100644
index ff2e8fb..0000000
--- a/test/transaction/input/input.js
+++ /dev/null
@@ -1,99 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-var _ = require('lodash');
-
-var bitcore = require('../../..');
-var errors = bitcore.errors;
-var PrivateKey = bitcore.PrivateKey;
-var Address = bitcore.Address;
-var Script = bitcore.Script;
-var Networks = bitcore.Networks;
-var Input = bitcore.Transaction.Input;
-
-describe('Transaction.Input', function() {
-
- var privateKey = new PrivateKey('KwF9LjRraetZuEjR8VqEq539z137LW5anYDUnVK11vM3mNMHTWb4');
- var publicKey = privateKey.publicKey;
- var address = new Address(publicKey, Networks.livenet);
- var output = {
- address: '33zbk2aSZYdNbRsMPPt6jgy6Kq1kQreqeb',
- prevTxId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script(address),
- satoshis: 1000000
- };
- var coinbase = {
- prevTxId: '0000000000000000000000000000000000000000000000000000000000000000',
- outputIndex: 0xFFFFFFFF,
- script: new Script(),
- satoshis: 1000000
- };
-
- var coinbaseJSON = JSON.stringify({
- prevTxId: '0000000000000000000000000000000000000000000000000000000000000000',
- outputIndex: 4294967295,
- script:''
- });
-
- var otherJSON = JSON.stringify({
- txidbuf: 'a477af6b2667c29670467e4e0728b685ee07b240235771862318e29ddbe58458',
- txoutnum: 0,
- seqnum:4294967295,
- script: '71 0x3044022006553276ec5b885ddf5cc1d79e1e3dadbb404b60ad4cc00318e21565' +
- '4f13242102200757c17b36e3d0492fb9cf597032e5afbea67a59274e64af5a05d12e5ea2303901 ' +
- '33 0x0223078d2942df62c45621d209fab84ea9a7a23346201b7727b9b45a29c4e76f5e',
- output: {
- 'satoshis':100000,
- 'script':'OP_DUP OP_HASH160 20 0x88d9931ea73d60eaf7e5671efc0552b912911f2a ' +
- 'OP_EQUALVERIFY OP_CHECKSIG'
- }
- });
-
- it('has abstract methods: "getSignatures", "isFullySigned", "addSignature", "clearSignatures"', function() {
- var input = new Input(output);
- _.each(['getSignatures', 'isFullySigned', 'addSignature', 'clearSignatures'], function(method) {
- expect(function() {
- return input[method]();
- }).to.throw(errors.AbstractMethodInvoked);
- });
- });
- it('detects coinbase transactions', function() {
- new Input(output).isNull().should.equal(false);
- var ci = new Input(coinbase);
- ci.isNull().should.equal(true);
- });
-
- describe('instantiation', function() {
- it('works without new', function() {
- var input = Input();
- should.exist(input);
- });
- it('fails with no script info', function() {
- expect(function() {
- var input = new Input({});
- input.toString();
- }).to.throw('Need a script to create an input');
- });
- it('fromObject should work', function() {
- var jsonData = JSON.parse(coinbaseJSON);
- var input = Input.fromObject(jsonData);
- should.exist(input);
- input.prevTxId.toString('hex').should.equal(jsonData.prevTxId);
- input.outputIndex.should.equal(jsonData.outputIndex);
- });
- it('fromObject should work', function() {
- var input = Input.fromObject(JSON.parse(coinbaseJSON));
- var obj = input.toObject();
- Input.fromObject(obj).should.deep.equal(input);
- obj.script = 42;
- Input.fromObject.bind(null, obj).should.throw('Invalid argument type: script');
- });
- });
-
- it('_estimateSize returns correct size', function() {
- var input = new Input(output);
- input._estimateSize().should.equal(66);
- });
-});
diff --git a/test/transaction/input/multisig.js b/test/transaction/input/multisig.js
deleted file mode 100644
index 16a63b0..0000000
--- a/test/transaction/input/multisig.js
+++ /dev/null
@@ -1,177 +0,0 @@
-'use strict';
-/* jshint unused: false */
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-var _ = require('lodash');
-
-var bitcore = require('../../..');
-var Transaction = bitcore.Transaction;
-var PrivateKey = bitcore.PrivateKey;
-var Address = bitcore.Address;
-var Script = bitcore.Script;
-var Signature = bitcore.crypto.Signature;
-var MultiSigInput = bitcore.Transaction.Input.MultiSig;
-
-describe('MultiSigInput', function() {
-
- var privateKey1 = new PrivateKey('KwF9LjRraetZuEjR8VqEq539z137LW5anYDUnVK11vM3mNMHTWb4');
- var privateKey2 = new PrivateKey('L4PqnaPTCkYhAqH3YQmefjxQP6zRcF4EJbdGqR8v6adtG9XSsadY');
- var privateKey3 = new PrivateKey('L4CTX79zFeksZTyyoFuPQAySfmP7fL3R41gWKTuepuN7hxuNuJwV');
- var public1 = privateKey1.publicKey;
- var public2 = privateKey2.publicKey;
- var public3 = privateKey3.publicKey;
- var address = new Address('33zbk2aSZYdNbRsMPPt6jgy6Kq1kQreqeb');
-
- var output = {
- txId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script("5221025c95ec627038e85b5688a9b3d84d28c5ebe66e8c8d697d498e20fe96e3b1ab1d2102cdddfc974d41a62f1f80081deee70592feb7d6e6cf6739d6592edbe7946720e72103c95924e02c240b5545089c69c6432447412b58be43fd671918bd184a5009834353ae"),
- satoshis: 1000000
- };
- it('can count missing signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- input.countSignatures().should.equal(0);
-
- transaction.sign(privateKey1);
- input.countSignatures().should.equal(1);
- input.countMissingSignatures().should.equal(1);
- input.isFullySigned().should.equal(false);
-
- transaction.sign(privateKey2);
- input.countSignatures().should.equal(2);
- input.countMissingSignatures().should.equal(0);
- input.isFullySigned().should.equal(true);
- });
- it('can count missing signatures, signed with key 3 and 1', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- input.countSignatures().should.equal(0);
-
- transaction.sign(privateKey3);
- input.countSignatures().should.equal(1);
- input.countMissingSignatures().should.equal(1);
- input.isFullySigned().should.equal(false);
-
- transaction.sign(privateKey1);
- input.countSignatures().should.equal(2);
- input.countMissingSignatures().should.equal(0);
- input.isFullySigned().should.equal(true);
- });
- it('returns a list of public keys with missing signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- _.every(input.publicKeysWithoutSignature(), function(publicKeyMissing) {
- var serialized = publicKeyMissing.toString();
- return serialized === public1.toString() ||
- serialized === public2.toString() ||
- serialized === public3.toString();
- }).should.equal(true);
- transaction.sign(privateKey1);
- _.every(input.publicKeysWithoutSignature(), function(publicKeyMissing) {
- var serialized = publicKeyMissing.toString();
- return serialized === public2.toString() ||
- serialized === public3.toString();
- }).should.equal(true);
- });
- it('can clear all signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000)
- .sign(privateKey1)
- .sign(privateKey2);
-
- var input = transaction.inputs[0];
- input.isFullySigned().should.equal(true);
- input.clearSignatures();
- input.isFullySigned().should.equal(false);
- });
- it('can estimate how heavy is the output going to be', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- input._estimateSize().should.equal(147);
- });
- it('uses SIGHASH_ALL by default', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var sigs = input.getSignatures(transaction, privateKey1, 0);
- sigs[0].sigtype.should.equal(Signature.SIGHASH_ALL);
- });
- it('roundtrips to/from object', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000)
- .sign(privateKey1);
- var input = transaction.inputs[0];
- var roundtrip = new MultiSigInput(input.toObject());
- roundtrip.toObject().should.deep.equal(input.toObject());
- });
- it('roundtrips to/from object when not signed', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var roundtrip = new MultiSigInput(input.toObject());
- roundtrip.toObject().should.deep.equal(input.toObject());
- });
- it('can parse list of signature buffers, from TX signed with key 1 and 2', function() {
- var transaction = new Transaction("010000000140c1ae9d6933e4a08594f814ba73a4e94d19c8a83f45784b1684b3a3f84ee666000000009200473044022012bd2f15e56ab1b63d5ee23e194ed995ad4b81a21bcb8e0d913e5e791c07f7280220278bdb6b54cdc608193c869affe28dc2f700902218122770faff25c56142102b01483045022100e74e9955e042aca36f4f3ad907a0926c5b85e5d9608b0678a78a9cbc0259c7a2022053ff761e5f9a80558db7023e45c4979ac3c19a423f0184fb0596d3da308cc4b501ffffffff0140420f000000000017a91419438da7d16709643be5abd8df62ca4034a489a78700000000");
-
- var inputObj = transaction.inputs[0].toObject();
- inputObj.output = output;
- transaction.inputs[0] = new Transaction.Input(inputObj);
-
- inputObj.signatures = MultiSigInput.normalizeSignatures(
- transaction,
- transaction.inputs[0],
- 0,
- transaction.inputs[0].script.chunks.slice(1).map(function(s) { return s.buf; }),
- [public1, public2, public3]
- );
-
- transaction.inputs[0] = new MultiSigInput(inputObj, [public1, public2, public3], 2);
-
- transaction.inputs[0].signatures[0].publicKey.should.deep.equal(public1);
- transaction.inputs[0].signatures[1].publicKey.should.deep.equal(public2);
- should.equal(transaction.inputs[0].signatures[2], undefined);
- transaction.inputs[0].isValidSignature(transaction, transaction.inputs[0].signatures[0]).should.be.true;
- transaction.inputs[0].isValidSignature(transaction, transaction.inputs[0].signatures[1]).should.be.true;
- });
- it('can parse list of signature buffers, from TX signed with key 3 and 1', function() {
- var transaction = new Transaction("010000000140c1ae9d6933e4a08594f814ba73a4e94d19c8a83f45784b1684b3a3f84ee666000000009300483045022100fc39ce4f51b2766ec8e978296e0594ea4578a3eb2543722fd4053e92bf16e6b1022030f739868397a881b019508b9c725a5c69a3652cb8928027748e93e67dfaef5501483045022100e74e9955e042aca36f4f3ad907a0926c5b85e5d9608b0678a78a9cbc0259c7a2022053ff761e5f9a80558db7023e45c4979ac3c19a423f0184fb0596d3da308cc4b501ffffffff0140420f000000000017a91419438da7d16709643be5abd8df62ca4034a489a78700000000");
-
- var inputObj = transaction.inputs[0].toObject();
- inputObj.output = output;
- transaction.inputs[0] = new Transaction.Input(inputObj);
-
- inputObj.signatures = MultiSigInput.normalizeSignatures(
- transaction,
- transaction.inputs[0],
- 0,
- transaction.inputs[0].script.chunks.slice(1).map(function(s) { return s.buf; }),
- [public1, public2, public3]
- );
-
- transaction.inputs[0] = new MultiSigInput(inputObj, [public1, public2, public3], 2);
-
- transaction.inputs[0].signatures[0].publicKey.should.deep.equal(public1);
- should.equal(transaction.inputs[0].signatures[1], undefined);
- transaction.inputs[0].signatures[2].publicKey.should.deep.equal(public3);
- transaction.inputs[0].isValidSignature(transaction, transaction.inputs[0].signatures[0]).should.be.true;
- transaction.inputs[0].isValidSignature(transaction, transaction.inputs[0].signatures[2]).should.be.true;
- });
-});
diff --git a/test/transaction/input/multisigscripthash.js b/test/transaction/input/multisigscripthash.js
deleted file mode 100644
index b3bcd83..0000000
--- a/test/transaction/input/multisigscripthash.js
+++ /dev/null
@@ -1,147 +0,0 @@
-'use strict';
-/* jshint unused: false */
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-var _ = require('lodash');
-
-var bitcore = require('../../..');
-var Transaction = bitcore.Transaction;
-var PrivateKey = bitcore.PrivateKey;
-var Address = bitcore.Address;
-var Script = bitcore.Script;
-var Signature = bitcore.crypto.Signature;
-var MultiSigScriptHashInput = bitcore.Transaction.Input.MultiSigScriptHash;
-
-describe('MultiSigScriptHashInput', function() {
-
- var privateKey1 = new PrivateKey('KwF9LjRraetZuEjR8VqEq539z137LW5anYDUnVK11vM3mNMHTWb4');
- var privateKey2 = new PrivateKey('L4PqnaPTCkYhAqH3YQmefjxQP6zRcF4EJbdGqR8v6adtG9XSsadY');
- var privateKey3 = new PrivateKey('L4CTX79zFeksZTyyoFuPQAySfmP7fL3R41gWKTuepuN7hxuNuJwV');
- var public1 = privateKey1.publicKey;
- var public2 = privateKey2.publicKey;
- var public3 = privateKey3.publicKey;
- var address = new Address('33zbk2aSZYdNbRsMPPt6jgy6Kq1kQreqeb');
-
- var output = {
- address: '33zbk2aSZYdNbRsMPPt6jgy6Kq1kQreqeb',
- txId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script(address),
- satoshis: 1000000
- };
- it('can count missing signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- input.countSignatures().should.equal(0);
-
- transaction.sign(privateKey1);
- input.countSignatures().should.equal(1);
- input.countMissingSignatures().should.equal(1);
- input.isFullySigned().should.equal(false);
-
- transaction.sign(privateKey2);
- input.countSignatures().should.equal(2);
- input.countMissingSignatures().should.equal(0);
- input.isFullySigned().should.equal(true);
- });
- it('returns a list of public keys with missing signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- _.every(input.publicKeysWithoutSignature(), function(publicKeyMissing) {
- var serialized = publicKeyMissing.toString();
- return serialized === public1.toString() ||
- serialized === public2.toString() ||
- serialized === public3.toString();
- }).should.equal(true);
- transaction.sign(privateKey1);
- _.every(input.publicKeysWithoutSignature(), function(publicKeyMissing) {
- var serialized = publicKeyMissing.toString();
- return serialized === public2.toString() ||
- serialized === public3.toString();
- }).should.equal(true);
- });
- it('can clear all signatures', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000)
- .sign(privateKey1)
- .sign(privateKey2);
-
- var input = transaction.inputs[0];
- input.isFullySigned().should.equal(true);
- input.clearSignatures();
- input.isFullySigned().should.equal(false);
- });
- it('can estimate how heavy is the output going to be', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- input._estimateSize().should.equal(257);
- });
- it('uses SIGHASH_ALL by default', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var sigs = input.getSignatures(transaction, privateKey1, 0);
- sigs[0].sigtype.should.equal(Signature.SIGHASH_ALL);
- });
- it('roundtrips to/from object', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000)
- .sign(privateKey1);
- var input = transaction.inputs[0];
- var roundtrip = new MultiSigScriptHashInput(input.toObject());
- roundtrip.toObject().should.deep.equal(input.toObject());
- });
- it('roundtrips to/from object when not signed', function() {
- var transaction = new Transaction()
- .from(output, [public1, public2, public3], 2)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var roundtrip = new MultiSigScriptHashInput(input.toObject());
- roundtrip.toObject().should.deep.equal(input.toObject());
- });
- it('will get the scriptCode for nested witness', function() {
- var address = Address.createMultisig([public1, public2, public3], 2, 'testnet', true);
- var utxo = {
- address: address.toString(),
- txId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script(address),
- satoshis: 1000000
- };
- var transaction = new Transaction()
- .from(utxo, [public1, public2, public3], 2, true)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var scriptCode = input.getScriptCode();
- scriptCode.toString('hex').should.equal('695221025c95ec627038e85b5688a9b3d84d28c5ebe66e8c8d697d498e20fe96e3b1ab1d2102cdddfc974d41a62f1f80081deee70592feb7d6e6cf6739d6592edbe7946720e72103c95924e02c240b5545089c69c6432447412b58be43fd671918bd184a5009834353ae');
- });
- it('will get the satoshis buffer for nested witness', function() {
- var address = Address.createMultisig([public1, public2, public3], 2, 'testnet', true);
- var utxo = {
- address: address.toString(),
- txId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script(address),
- satoshis: 1000000
- };
- var transaction = new Transaction()
- .from(utxo, [public1, public2, public3], 2, true)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var satoshisBuffer = input.getSatoshisBuffer();
- satoshisBuffer.toString('hex').should.equal('40420f0000000000');
- });
-
-});
diff --git a/test/transaction/input/publickey.js b/test/transaction/input/publickey.js
deleted file mode 100644
index 5d6b366..0000000
--- a/test/transaction/input/publickey.js
+++ /dev/null
@@ -1,71 +0,0 @@
-'use strict';
-
-var should = require('chai').should();
-var bitcore = require('../../..');
-var Transaction = bitcore.Transaction;
-var PrivateKey = bitcore.PrivateKey;
-
-describe('PublicKeyInput', function() {
-
- var utxo = {
- txid: '7f3b688cb224ed83e12d9454145c26ac913687086a0a62f2ae0bc10934a4030f',
- vout: 0,
- address: 'n4McBrSkw42eYGX5YMACGpkGUJKL3jVSbo',
- scriptPubKey: '2103c9594cb2ebfebcb0cfd29eacd40ba012606a197beef76f0269ed8c101e56ceddac',
- amount: 50,
- confirmations: 104,
- spendable: true
- };
- var privateKey = PrivateKey.fromWIF('cQ7tSSQDEwaxg9usnnP1Aztqvm9nCQVfNWz9kU2rdocDjknF2vd6');
- var address = privateKey.toAddress();
- utxo.address.should.equal(address.toString());
-
- var destKey = new PrivateKey();
-
- it('will correctly sign a publickey out transaction', function() {
- var tx = new Transaction();
- tx.from(utxo);
- tx.to(destKey.toAddress(), 10000);
- tx.sign(privateKey);
- tx.inputs[0].script.toBuffer().length.should.be.above(0);
- });
-
- it('count can count missing signatures', function() {
- var tx = new Transaction();
- tx.from(utxo);
- tx.to(destKey.toAddress(), 10000);
- var input = tx.inputs[0];
- input.isFullySigned().should.equal(false);
- tx.sign(privateKey);
- input.isFullySigned().should.equal(true);
- });
-
- it('it\'s size can be estimated', function() {
- var tx = new Transaction();
- tx.from(utxo);
- tx.to(destKey.toAddress(), 10000);
- var input = tx.inputs[0];
- input._estimateSize().should.equal(73);
- });
-
- it('it\'s signature can be removed', function() {
- var tx = new Transaction();
- tx.from(utxo);
- tx.to(destKey.toAddress(), 10000);
- var input = tx.inputs[0];
- tx.sign(privateKey);
- input.isFullySigned().should.equal(true);
- input.clearSignatures();
- input.isFullySigned().should.equal(false);
- });
-
- it('returns an empty array if private key mismatches', function() {
- var tx = new Transaction();
- tx.from(utxo);
- tx.to(destKey.toAddress(), 10000);
- var input = tx.inputs[0];
- var signatures = input.getSignatures(tx, new PrivateKey(), 0);
- signatures.length.should.equal(0);
- });
-
-});
diff --git a/test/transaction/input/publickeyhash.js b/test/transaction/input/publickeyhash.js
deleted file mode 100644
index d0ae623..0000000
--- a/test/transaction/input/publickeyhash.js
+++ /dev/null
@@ -1,64 +0,0 @@
-'use strict';
-/* jshint unused: false */
-
-var should = require('chai').should();
-var expect = require('chai').expect;
-var _ = require('lodash');
-
-var bitcore = require('../../..');
-var Transaction = bitcore.Transaction;
-var PrivateKey = bitcore.PrivateKey;
-var Address = bitcore.Address;
-var Script = bitcore.Script;
-var Networks = bitcore.Networks;
-var Signature = bitcore.crypto.Signature;
-
-describe('PublicKeyHashInput', function() {
-
- var privateKey = new PrivateKey('KwF9LjRraetZuEjR8VqEq539z137LW5anYDUnVK11vM3mNMHTWb4');
- var publicKey = privateKey.publicKey;
- var address = new Address(publicKey, Networks.livenet);
-
- var output = {
- address: '33zbk2aSZYdNbRsMPPt6jgy6Kq1kQreqeb',
- txId: '66e64ef8a3b384164b78453fa8c8194de9a473ba14f89485a0e433699daec140',
- outputIndex: 0,
- script: new Script(address),
- satoshis: 1000000
- };
- it('can count missing signatures', function() {
- var transaction = new Transaction()
- .from(output)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- input.isFullySigned().should.equal(false);
- transaction.sign(privateKey);
- input.isFullySigned().should.equal(true);
- });
- it('it\'s size can be estimated', function() {
- var transaction = new Transaction()
- .from(output)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- input._estimateSize().should.equal(107);
- });
- it('it\'s signature can be removed', function() {
- var transaction = new Transaction()
- .from(output)
- .to(address, 1000000);
- var input = transaction.inputs[0];
-
- transaction.sign(privateKey);
- input.clearSignatures();
- input.isFullySigned().should.equal(false);
- });
- it('returns an empty array if private key mismatches', function() {
- var transaction = new Transaction()
- .from(output)
- .to(address, 1000000);
- var input = transaction.inputs[0];
- var signatures = input.getSignatures(transaction, new PrivateKey(), 0);
- signatures.length.should.equal(0);
- });
-});
diff --git a/test/transaction/output.js b/test/transaction/output.js
deleted file mode 100644
index de5d920..0000000
--- a/test/transaction/output.js
+++ /dev/null
@@ -1,191 +0,0 @@
-"use strict";
-
-/* jshint unused: false */
-/* jshint latedef: false */
-var should = require("chai").should();
-var expect = require("chai").expect;
-var _ = require("lodash");
-
-var bitcore = require("../..");
-var BN = bitcore.crypto.BN;
-var BufferWriter = bitcore.encoding.BufferWriter;
-var BufferReader = bitcore.encoding.BufferReader;
-var Output = bitcore.Transaction.Output;
-var Script = bitcore.Script;
-
-var errors = bitcore.errors;
-
-describe("Output", function() {
- var output = new Output({
- satoshis: 0,
- script: Script.empty()
- });
-
- it("throws error with unrecognized argument", function() {
- (function() {
- var out = new Output(12345);
- }.should.throw(TypeError));
- });
-
- it("can be assigned a satoshi amount in big number", function() {
- var newOutput = new Output({
- satoshis: new BN(100),
- script: Script.empty()
- });
- newOutput.satoshis.should.equal(100);
- });
-
- it("can be assigned a satoshi amount with a string", function() {
- var newOutput = new Output({
- satoshis: "100",
- script: Script.empty()
- });
- newOutput.satoshis.should.equal(100);
- });
-
- describe("will error if output is not a positive integer", function() {
- it("-100", function() {
- (function() {
- var newOutput = new Output({
- satoshis: -100,
- script: Script.empty()
- });
- }.should.throw("Output satoshis is not a natural number"));
- });
-
- it("1.1", function() {
- (function() {
- var newOutput = new Output({
- satoshis: 1.1,
- script: Script.empty()
- });
- }.should.throw("Output satoshis is not a natural number"));
- });
-
- it("NaN", function() {
- (function() {
- var newOutput = new Output({
- satoshis: NaN,
- script: Script.empty()
- });
- }.should.throw("Output satoshis is not a natural number"));
- });
-
- it("Infinity", function() {
- (function() {
- var newOutput = new Output({
- satoshis: Infinity,
- script: Script.empty()
- });
- }.should.throw("Output satoshis is not a natural number"));
- });
- });
-
- var expectEqualOutputs = function(a, b) {
- a.satoshis.should.equal(b.satoshis);
- a.script.toString().should.equal(b.script.toString());
- };
-
- it("deserializes correctly a simple output", function() {
- var writer = new BufferWriter();
- output.toBufferWriter(writer);
- var deserialized = Output.fromBufferReader(
- new BufferReader(writer.toBuffer())
- );
- expectEqualOutputs(output, deserialized);
- });
-
- it("can instantiate from an object", function() {
- var out = new Output(output.toObject());
- should.exist(out);
- });
-
- it("can set a script from a buffer", function() {
- var newOutput = new Output(output.toObject());
- newOutput.setScript(Script().add(0).toBuffer());
- newOutput.inspect().should.equal("