@rosen-bridge/address-codec 0.1.0 → 0.2.1-6770eb
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/const.d.ts +1 -0
- package/dist/const.d.ts.map +1 -1
- package/dist/const.js +2 -1
- package/dist/decoder.d.ts.map +1 -1
- package/dist/decoder.js +7 -2
- package/dist/encoder.d.ts.map +1 -1
- package/dist/encoder.js +8 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/lib/const.d.ts +5 -0
- package/dist/lib/const.d.ts.map +1 -0
- package/dist/lib/const.js +5 -0
- package/dist/lib/decoder.d.ts +8 -0
- package/dist/lib/decoder.d.ts.map +1 -0
- package/dist/lib/decoder.js +31 -0
- package/dist/lib/encoder.d.ts +8 -0
- package/dist/lib/encoder.d.ts.map +1 -0
- package/dist/lib/encoder.js +37 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/types.d.ts +7 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +11 -0
- package/dist/lib/validator.d.ts +7 -0
- package/dist/lib/validator.d.ts.map +1 -0
- package/dist/lib/validator.js +33 -0
- package/dist/tests/decoder.spec.d.ts +2 -0
- package/dist/tests/decoder.spec.d.ts.map +1 -0
- package/dist/tests/decoder.spec.js +84 -0
- package/dist/tests/encoder.spec.d.ts +2 -0
- package/dist/tests/encoder.spec.d.ts.map +1 -0
- package/dist/tests/encoder.spec.js +98 -0
- package/dist/tests/testData.d.ts +17 -0
- package/dist/tests/testData.d.ts.map +1 -0
- package/dist/tests/testData.js +17 -0
- package/dist/tests/validator.spec.d.ts +2 -0
- package/dist/tests/validator.spec.d.ts.map +1 -0
- package/dist/tests/validator.spec.js +145 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/validator.d.ts +7 -0
- package/dist/validator.d.ts.map +1 -0
- package/dist/validator.js +33 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +18 -0
- package/lib/const.ts +1 -0
- package/lib/decoder.ts +11 -1
- package/lib/encoder.ts +12 -1
- package/lib/index.ts +1 -0
- package/lib/validator.ts +38 -0
- package/package.json +3 -2
- package/tests/decoder.spec.ts +20 -1
- package/tests/encoder.spec.ts +35 -1
- package/tests/testData.ts +16 -0
- package/tests/validator.spec.ts +164 -0
- package/tsconfig.build.tsbuildinfo +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export const ergoAddress = '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVd';
|
|
2
|
+
export const encodedErgoAddress = '03f999da8e6e42660e4464d17d29e63bc006734a6710a24eb489b466323d3a9339';
|
|
3
|
+
export const invalidErgoAddress = '9iMjQx8PzwBKXRvsFUJFJAPoy31znfEeBUGz8DRkcnJX4rJYjVD';
|
|
4
|
+
export const cardanoAddress = 'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqet';
|
|
5
|
+
export const encodedCardanoAddress = '018dd8d9339deaf201790f6891adebb3abd78c90f3231aa95f12ce8f9ab18016dab2d790baeecb323f792babc1a769511b4a3262e6703f24c1';
|
|
6
|
+
export const invalidCardanoAddress = 'addr1qxxa3kfnnh40yqtepa5frt0tkw4a0rys7v33422lzt8glx43sqtd4vkhjzawajej8aujh27p5a54zx62xf3wvuplynqs3fsqee';
|
|
7
|
+
export const bitcoinAddress = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6h';
|
|
8
|
+
export const invalidBitcoinAddressLength = 'bc1qkgp89fjerymm5ltg0hygnumr0m2qa7n22gyw6';
|
|
9
|
+
export const tapRootBitcoinAddress = 'bc1pxhtmm7mjrafdkw46wc7lmjn3gyrmdm4q0dnmw8j225gxtwtq7mwqd7e24v';
|
|
10
|
+
export const encodedBitcoinAddress = '0014b20272a6591937ba7d687dc889f3637ed40efa6a';
|
|
11
|
+
export const longErgoAddress = 'nB3L2PD3LBtiNhDYK7XhZ8nVt6uekBXN7RcPUKgdKLXFcrJiSPxmQsUKuUkTRQ1hbvDrxEQAKYurGFbaGD1RPxU7XqQimD78j23HHMQKL1boUGsnNhCxaVNAYMcFbQNo355Af8cWkhAN6';
|
|
12
|
+
export const longEncodedAddress = '100304000e20a6ac381e6fa99929fd1477b3ba9499790a775e91d4c14c5aa86e9a118dfac8530400d801d601b2db6501fe730000ea02d1aedb63087201d901024d0e938c720201730198b2e4c672010510730200ade4c67201041ad901020ecdee7202';
|
|
13
|
+
export const ethereumAddress = '0xb416c8a6d7ec94706a9ae2c26c11d320519482b1';
|
|
14
|
+
export const encodedEthereumAddress = 'b416c8a6d7ec94706a9ae2c26c11d320519482b1';
|
|
15
|
+
export const invalidEthereumAddressLength = '0xb416c8a7ec94706a9ae2c26c11d320519482b1';
|
|
16
|
+
export const invalidEthereumIcapAddress = 'XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36';
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdERhdGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy90ZXN0RGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQ3RCLHFEQUFxRCxDQUFDO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUM3QixvRUFBb0UsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FDN0IscURBQXFELENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUN6Qix5R0FBeUcsQ0FBQztBQUM1RyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FDaEMsb0hBQW9ILENBQUM7QUFDdkgsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLHlHQUF5RyxDQUFDO0FBRTVHLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyw0Q0FBNEMsQ0FBQztBQUMzRSxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FDdEMsMkNBQTJDLENBQUM7QUFDOUMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQ2hDLGdFQUFnRSxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUNoQyw4Q0FBOEMsQ0FBQztBQUVqRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQzFCLCtJQUErSSxDQUFDO0FBQ2xKLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUM3Qix3TUFBd00sQ0FBQztBQUUzTSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsNENBQTRDLENBQUM7QUFDNUUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQ2pDLDBDQUEwQyxDQUFDO0FBRTdDLE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUN2QywwQ0FBMEMsQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBlcmdvQWRkcmVzcyA9XG4gICc5aU1qUXg4UHp3QktYUnZzRlVKRkpBUG95MzF6bmZFZUJVR3o4RFJrY25KWDRySllqVmQnO1xuZXhwb3J0IGNvbnN0IGVuY29kZWRFcmdvQWRkcmVzcyA9XG4gICcwM2Y5OTlkYThlNmU0MjY2MGU0NDY0ZDE3ZDI5ZTYzYmMwMDY3MzRhNjcxMGEyNGViNDg5YjQ2NjMyM2QzYTkzMzknO1xuZXhwb3J0IGNvbnN0IGludmFsaWRFcmdvQWRkcmVzcyA9XG4gICc5aU1qUXg4UHp3QktYUnZzRlVKRkpBUG95MzF6bmZFZUJVR3o4RFJrY25KWDRySllqVkQnO1xuXG5leHBvcnQgY29uc3QgY2FyZGFub0FkZHJlc3MgPVxuICAnYWRkcjFxeHhhM2tmbm5oNDB5cXRlcGE1ZnJ0MHRrdzRhMHJ5czd2MzM0MjJsenQ4Z2x4NDNzcXRkNHZraGp6YXdhamVqOGF1amgyN3A1YTU0eng2MnhmM3d2dXBseW5xczNmc3FldCc7XG5leHBvcnQgY29uc3QgZW5jb2RlZENhcmRhbm9BZGRyZXNzID1cbiAgJzAxOGRkOGQ5MzM5ZGVhZjIwMTc5MGY2ODkxYWRlYmIzYWJkNzhjOTBmMzIzMWFhOTVmMTJjZThmOWFiMTgwMTZkYWIyZDc5MGJhZWVjYjMyM2Y3OTJiYWJjMWE3Njk1MTFiNGEzMjYyZTY3MDNmMjRjMSc7XG5leHBvcnQgY29uc3QgaW52YWxpZENhcmRhbm9BZGRyZXNzID1cbiAgJ2FkZHIxcXh4YTNrZm5uaDQweXF0ZXBhNWZydDB0a3c0YTByeXM3djMzNDIybHp0OGdseDQzc3F0ZDR2a2hqemF3YWplajhhdWpoMjdwNWE1NHp4NjJ4ZjN3dnVwbHlucXMzZnNxZWUnO1xuXG5leHBvcnQgY29uc3QgYml0Y29pbkFkZHJlc3MgPSAnYmMxcWtncDg5ZmplcnltbTVsdGcwaHlnbnVtcjBtMnFhN24yMmd5dzZoJztcbmV4cG9ydCBjb25zdCBpbnZhbGlkQml0Y29pbkFkZHJlc3NMZW5ndGggPVxuICAnYmMxcWtncDg5ZmplcnltbTVsdGcwaHlnbnVtcjBtMnFhN24yMmd5dzYnO1xuZXhwb3J0IGNvbnN0IHRhcFJvb3RCaXRjb2luQWRkcmVzcyA9XG4gICdiYzFweGh0bW03bWpyYWZka3c0NndjN2xtam4zZ3lybWRtNHEwZG5tdzhqMjI1Z3h0d3RxN213cWQ3ZTI0dic7XG5leHBvcnQgY29uc3QgZW5jb2RlZEJpdGNvaW5BZGRyZXNzID1cbiAgJzAwMTRiMjAyNzJhNjU5MTkzN2JhN2Q2ODdkYzg4OWYzNjM3ZWQ0MGVmYTZhJztcblxuZXhwb3J0IGNvbnN0IGxvbmdFcmdvQWRkcmVzcyA9XG4gICduQjNMMlBEM0xCdGlOaERZSzdYaFo4blZ0NnVla0JYTjdSY1BVS2dkS0xYRmNySmlTUHhtUXNVS3VVa1RSUTFoYnZEcnhFUUFLWXVyR0ZiYUdEMVJQeFU3WHFRaW1ENzhqMjNISE1RS0wxYm9VR3NuTmhDeGFWTkFZTWNGYlFObzM1NUFmOGNXa2hBTjYnO1xuZXhwb3J0IGNvbnN0IGxvbmdFbmNvZGVkQWRkcmVzcyA9XG4gICcxMDAzMDQwMDBlMjBhNmFjMzgxZTZmYTk5OTI5ZmQxNDc3YjNiYTk0OTk3OTBhNzc1ZTkxZDRjMTRjNWFhODZlOWExMThkZmFjODUzMDQwMGQ4MDFkNjAxYjJkYjY1MDFmZTczMDAwMGVhMDJkMWFlZGI2MzA4NzIwMWQ5MDEwMjRkMGU5MzhjNzIwMjAxNzMwMTk4YjJlNGM2NzIwMTA1MTA3MzAyMDBhZGU0YzY3MjAxMDQxYWQ5MDEwMjBlY2RlZTcyMDInO1xuXG5leHBvcnQgY29uc3QgZXRoZXJldW1BZGRyZXNzID0gJzB4YjQxNmM4YTZkN2VjOTQ3MDZhOWFlMmMyNmMxMWQzMjA1MTk0ODJiMSc7XG5leHBvcnQgY29uc3QgZW5jb2RlZEV0aGVyZXVtQWRkcmVzcyA9XG4gICdiNDE2YzhhNmQ3ZWM5NDcwNmE5YWUyYzI2YzExZDMyMDUxOTQ4MmIxJztcblxuZXhwb3J0IGNvbnN0IGludmFsaWRFdGhlcmV1bUFkZHJlc3NMZW5ndGggPVxuICAnMHhiNDE2YzhhN2VjOTQ3MDZhOWFlMmMyNmMxMWQzMjA1MTk0ODJiMSc7XG5leHBvcnQgY29uc3QgaW52YWxpZEV0aGVyZXVtSWNhcEFkZHJlc3MgPSAnWEU2NUdCNkxETlhZT0ZUWDBOU1YzRlVXS09XSVhBTUpLMzYnO1xuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.spec.d.ts","sourceRoot":"","sources":["../../tests/validator.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import * as testData from './testData';
|
|
2
|
+
import { UnsupportedAddressError, UnsupportedChainError, validateAddress, } from '../lib';
|
|
3
|
+
import { BITCOIN_CHAIN, CARDANO_CHAIN, ERGO_CHAIN, ETHEREUM_CHAIN, } from '../lib/const';
|
|
4
|
+
describe('validateAddress', () => {
|
|
5
|
+
/**
|
|
6
|
+
* @target `validateAddress` should validate Ergo address successfully
|
|
7
|
+
* @dependencies
|
|
8
|
+
* @scenario
|
|
9
|
+
* - run test
|
|
10
|
+
* @expected
|
|
11
|
+
* - to validate correct Ergo address
|
|
12
|
+
*/
|
|
13
|
+
it('should validate Ergo address successfully', () => {
|
|
14
|
+
const res = validateAddress(ERGO_CHAIN, testData.ergoAddress);
|
|
15
|
+
expect(res).toEqual(true);
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* @target `validateAddress` should not validate wrong Ergo address
|
|
19
|
+
* @dependencies
|
|
20
|
+
* @scenario
|
|
21
|
+
* - run test
|
|
22
|
+
* @expected
|
|
23
|
+
* - not to validate wrong Ergo address
|
|
24
|
+
*/
|
|
25
|
+
it('should not validate wrong Ergo address', () => {
|
|
26
|
+
expect(() => {
|
|
27
|
+
validateAddress(ERGO_CHAIN, testData.invalidErgoAddress);
|
|
28
|
+
}).toThrow();
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* @target `validateAddress` should validate Cardano address successfully
|
|
32
|
+
* @dependencies
|
|
33
|
+
* @scenario
|
|
34
|
+
* - run test
|
|
35
|
+
* @expected
|
|
36
|
+
* - to validate correct Cardano address
|
|
37
|
+
*/
|
|
38
|
+
it('should validate Cardano address successfully', () => {
|
|
39
|
+
const res = validateAddress(CARDANO_CHAIN, testData.cardanoAddress);
|
|
40
|
+
expect(res).toEqual(true);
|
|
41
|
+
});
|
|
42
|
+
/**
|
|
43
|
+
* @target `validateAddress` should not validate wrong Cardano address
|
|
44
|
+
* @dependencies
|
|
45
|
+
* @scenario
|
|
46
|
+
* - run test
|
|
47
|
+
* @expected
|
|
48
|
+
* - not to validate wrong Cardano address
|
|
49
|
+
*/
|
|
50
|
+
it('should not validate wrong Cardano address', () => {
|
|
51
|
+
expect(() => {
|
|
52
|
+
validateAddress(CARDANO_CHAIN, testData.invalidCardanoAddress);
|
|
53
|
+
}).toThrow();
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* @target `validateAddress` should validate Bitcoin address successfully
|
|
57
|
+
* @dependencies
|
|
58
|
+
* @scenario
|
|
59
|
+
* - run test
|
|
60
|
+
* @expected
|
|
61
|
+
* - to validate correct Bitcoin address
|
|
62
|
+
*/
|
|
63
|
+
it('should validate Bitcoin address successfully', () => {
|
|
64
|
+
const res = validateAddress(BITCOIN_CHAIN, testData.bitcoinAddress);
|
|
65
|
+
expect(res).toEqual(true);
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* @target `validateAddress` should not validate Bitcoin taproot address
|
|
69
|
+
* @dependencies
|
|
70
|
+
* @scenario
|
|
71
|
+
* - run test
|
|
72
|
+
* @expected
|
|
73
|
+
* - not to validate Bitcoin taproot address
|
|
74
|
+
*/
|
|
75
|
+
it('should not validate Bitcoin taproot address', () => {
|
|
76
|
+
expect(() => {
|
|
77
|
+
validateAddress(BITCOIN_CHAIN, testData.tapRootBitcoinAddress);
|
|
78
|
+
}).toThrow(UnsupportedAddressError);
|
|
79
|
+
});
|
|
80
|
+
/**
|
|
81
|
+
* @target `validateAddress` should not validate wrong Bitcoin address
|
|
82
|
+
* @dependencies
|
|
83
|
+
* @scenario
|
|
84
|
+
* - run test
|
|
85
|
+
* @expected
|
|
86
|
+
* - not to validate wrong Bitcoin address
|
|
87
|
+
*/
|
|
88
|
+
it('should not validate wrong Bitcoin address', () => {
|
|
89
|
+
expect(() => {
|
|
90
|
+
validateAddress(BITCOIN_CHAIN, testData.invalidBitcoinAddressLength);
|
|
91
|
+
}).toThrowError();
|
|
92
|
+
});
|
|
93
|
+
/**
|
|
94
|
+
* @target `validateAddress` should validate Ethereum address successfully
|
|
95
|
+
* @dependencies
|
|
96
|
+
* @scenario
|
|
97
|
+
* - run test
|
|
98
|
+
* @expected
|
|
99
|
+
* - to validate correct Ethereum address
|
|
100
|
+
*/
|
|
101
|
+
it('should validate Ethereum address successfully', () => {
|
|
102
|
+
const res = validateAddress(ETHEREUM_CHAIN, testData.ethereumAddress);
|
|
103
|
+
expect(res).toEqual(true);
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* @target `validateAddress` should not validate ICAP Ethereum address
|
|
107
|
+
* @dependencies
|
|
108
|
+
* @scenario
|
|
109
|
+
* - run test
|
|
110
|
+
* @expected
|
|
111
|
+
* - not to validate ICAP Ethereum address
|
|
112
|
+
*/
|
|
113
|
+
it('should not validate ICAP Ethereum address', () => {
|
|
114
|
+
expect(() => {
|
|
115
|
+
validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumIcapAddress);
|
|
116
|
+
}).toThrow(UnsupportedAddressError);
|
|
117
|
+
});
|
|
118
|
+
/**
|
|
119
|
+
* @target `validateAddress` should not validate wrong Ethereum address
|
|
120
|
+
* @dependencies
|
|
121
|
+
* @scenario
|
|
122
|
+
* - run test
|
|
123
|
+
* @expected
|
|
124
|
+
* - not to validate wrong Ethereum address
|
|
125
|
+
*/
|
|
126
|
+
it('should not validate wrong Ethereum address', () => {
|
|
127
|
+
expect(() => {
|
|
128
|
+
validateAddress(ETHEREUM_CHAIN, testData.invalidEthereumAddressLength);
|
|
129
|
+
}).toThrow(UnsupportedAddressError);
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* @target `validateAddress` should throw error when chain is not supported
|
|
133
|
+
* @dependencies
|
|
134
|
+
* @scenario
|
|
135
|
+
* - run test
|
|
136
|
+
* @expected
|
|
137
|
+
* - it should throw UnsupportedChain error
|
|
138
|
+
*/
|
|
139
|
+
it('should throw error when chain is not supported', () => {
|
|
140
|
+
expect(() => {
|
|
141
|
+
validateAddress('unsupported-chain', '0011223344');
|
|
142
|
+
}).toThrow(UnsupportedChainError);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90ZXN0cy92YWxpZGF0b3Iuc3BlYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssUUFBUSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQixlQUFlLEdBQ2hCLE1BQU0sUUFBUSxDQUFDO0FBQ2hCLE9BQU8sRUFDTCxhQUFhLEVBQ2IsYUFBYSxFQUNiLFVBQVUsRUFDVixjQUFjLEdBQ2YsTUFBTSxjQUFjLENBQUM7QUFFdEIsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtJQUMvQjs7Ozs7OztPQU9HO0lBQ0gsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7Ozs7T0FPRztJQUNILEVBQUUsQ0FBQyx3Q0FBd0MsRUFBRSxHQUFHLEVBQUU7UUFDaEQsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLGVBQWUsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztJQUVIOzs7Ozs7O09BT0c7SUFDSCxFQUFFLENBQUMsOENBQThDLEVBQUUsR0FBRyxFQUFFO1FBQ3RELE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFFSDs7Ozs7OztPQU9HO0lBQ0gsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLEdBQUcsRUFBRTtRQUNuRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsZUFBZSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNqRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7Ozs7T0FPRztJQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7UUFDdEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUMsQ0FBQztJQUVIOzs7Ozs7O09BT0c7SUFDSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixlQUFlLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RDLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7Ozs7T0FPRztJQUNILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLGVBQWUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSDs7Ozs7OztPQU9HO0lBQ0gsRUFBRSxDQUFDLCtDQUErQyxFQUFFLEdBQUcsRUFBRTtRQUN2RCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsY0FBYyxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN0RSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxDQUFDO0lBRUg7Ozs7Ozs7T0FPRztJQUNILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxHQUFHLEVBQUU7UUFDbkQsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNWLGVBQWUsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7SUFFSDs7Ozs7OztPQU9HO0lBQ0gsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLENBQUMsR0FBRyxFQUFFO1lBQ1YsZUFBZSxDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN0QyxDQUFDLENBQUMsQ0FBQztJQUVIOzs7Ozs7O09BT0c7SUFDSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1FBQ3hELE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixlQUFlLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4vdGVzdERhdGEnO1xuaW1wb3J0IHtcbiAgVW5zdXBwb3J0ZWRBZGRyZXNzRXJyb3IsXG4gIFVuc3VwcG9ydGVkQ2hhaW5FcnJvcixcbiAgdmFsaWRhdGVBZGRyZXNzLFxufSBmcm9tICcuLi9saWInO1xuaW1wb3J0IHtcbiAgQklUQ09JTl9DSEFJTixcbiAgQ0FSREFOT19DSEFJTixcbiAgRVJHT19DSEFJTixcbiAgRVRIRVJFVU1fQ0hBSU4sXG59IGZyb20gJy4uL2xpYi9jb25zdCc7XG5cbmRlc2NyaWJlKCd2YWxpZGF0ZUFkZHJlc3MnLCAoKSA9PiB7XG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCB2YWxpZGF0ZSBFcmdvIGFkZHJlc3Mgc3VjY2Vzc2Z1bGx5XG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gdG8gdmFsaWRhdGUgY29ycmVjdCBFcmdvIGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgRXJnbyBhZGRyZXNzIHN1Y2Nlc3NmdWxseScsICgpID0+IHtcbiAgICBjb25zdCByZXMgPSB2YWxpZGF0ZUFkZHJlc3MoRVJHT19DSEFJTiwgdGVzdERhdGEuZXJnb0FkZHJlc3MpO1xuICAgIGV4cGVjdChyZXMpLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCBub3QgdmFsaWRhdGUgd3JvbmcgRXJnbyBhZGRyZXNzXG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gbm90IHRvIHZhbGlkYXRlIHdyb25nIEVyZ28gYWRkcmVzc1xuICAgKi9cbiAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgd3JvbmcgRXJnbyBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoRVJHT19DSEFJTiwgdGVzdERhdGEuaW52YWxpZEVyZ29BZGRyZXNzKTtcbiAgICB9KS50b1Rocm93KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCB2YWxpZGF0ZSBDYXJkYW5vIGFkZHJlc3Mgc3VjY2Vzc2Z1bGx5XG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gdG8gdmFsaWRhdGUgY29ycmVjdCBDYXJkYW5vIGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQ2FyZGFubyBhZGRyZXNzIHN1Y2Nlc3NmdWxseScsICgpID0+IHtcbiAgICBjb25zdCByZXMgPSB2YWxpZGF0ZUFkZHJlc3MoQ0FSREFOT19DSEFJTiwgdGVzdERhdGEuY2FyZGFub0FkZHJlc3MpO1xuICAgIGV4cGVjdChyZXMpLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCBub3QgdmFsaWRhdGUgd3JvbmcgQ2FyZGFubyBhZGRyZXNzXG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gbm90IHRvIHZhbGlkYXRlIHdyb25nIENhcmRhbm8gYWRkcmVzc1xuICAgKi9cbiAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgd3JvbmcgQ2FyZGFubyBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoQ0FSREFOT19DSEFJTiwgdGVzdERhdGEuaW52YWxpZENhcmRhbm9BZGRyZXNzKTtcbiAgICB9KS50b1Rocm93KCk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCB2YWxpZGF0ZSBCaXRjb2luIGFkZHJlc3Mgc3VjY2Vzc2Z1bGx5XG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gdG8gdmFsaWRhdGUgY29ycmVjdCBCaXRjb2luIGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgQml0Y29pbiBhZGRyZXNzIHN1Y2Nlc3NmdWxseScsICgpID0+IHtcbiAgICBjb25zdCByZXMgPSB2YWxpZGF0ZUFkZHJlc3MoQklUQ09JTl9DSEFJTiwgdGVzdERhdGEuYml0Y29pbkFkZHJlc3MpO1xuICAgIGV4cGVjdChyZXMpLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCBub3QgdmFsaWRhdGUgQml0Y29pbiB0YXByb290IGFkZHJlc3NcbiAgICogQGRlcGVuZGVuY2llc1xuICAgKiBAc2NlbmFyaW9cbiAgICogLSBydW4gdGVzdFxuICAgKiBAZXhwZWN0ZWRcbiAgICogLSBub3QgdG8gdmFsaWRhdGUgQml0Y29pbiB0YXByb290IGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIEJpdGNvaW4gdGFwcm9vdCBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoQklUQ09JTl9DSEFJTiwgdGVzdERhdGEudGFwUm9vdEJpdGNvaW5BZGRyZXNzKTtcbiAgICB9KS50b1Rocm93KFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEB0YXJnZXQgYHZhbGlkYXRlQWRkcmVzc2Agc2hvdWxkIG5vdCB2YWxpZGF0ZSB3cm9uZyBCaXRjb2luIGFkZHJlc3NcbiAgICogQGRlcGVuZGVuY2llc1xuICAgKiBAc2NlbmFyaW9cbiAgICogLSBydW4gdGVzdFxuICAgKiBAZXhwZWN0ZWRcbiAgICogLSBub3QgdG8gdmFsaWRhdGUgd3JvbmcgQml0Y29pbiBhZGRyZXNzXG4gICAqL1xuICBpdCgnc2hvdWxkIG5vdCB2YWxpZGF0ZSB3cm9uZyBCaXRjb2luIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcyhCSVRDT0lOX0NIQUlOLCB0ZXN0RGF0YS5pbnZhbGlkQml0Y29pbkFkZHJlc3NMZW5ndGgpO1xuICAgIH0pLnRvVGhyb3dFcnJvcigpO1xuICB9KTtcblxuICAvKipcbiAgICogQHRhcmdldCBgdmFsaWRhdGVBZGRyZXNzYCBzaG91bGQgdmFsaWRhdGUgRXRoZXJldW0gYWRkcmVzcyBzdWNjZXNzZnVsbHlcbiAgICogQGRlcGVuZGVuY2llc1xuICAgKiBAc2NlbmFyaW9cbiAgICogLSBydW4gdGVzdFxuICAgKiBAZXhwZWN0ZWRcbiAgICogLSB0byB2YWxpZGF0ZSBjb3JyZWN0IEV0aGVyZXVtIGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgdmFsaWRhdGUgRXRoZXJldW0gYWRkcmVzcyBzdWNjZXNzZnVsbHknLCAoKSA9PiB7XG4gICAgY29uc3QgcmVzID0gdmFsaWRhdGVBZGRyZXNzKEVUSEVSRVVNX0NIQUlOLCB0ZXN0RGF0YS5ldGhlcmV1bUFkZHJlc3MpO1xuICAgIGV4cGVjdChyZXMpLnRvRXF1YWwodHJ1ZSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCBub3QgdmFsaWRhdGUgSUNBUCBFdGhlcmV1bSBhZGRyZXNzXG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gbm90IHRvIHZhbGlkYXRlIElDQVAgRXRoZXJldW0gYWRkcmVzc1xuICAgKi9cbiAgaXQoJ3Nob3VsZCBub3QgdmFsaWRhdGUgSUNBUCBFdGhlcmV1bSBhZGRyZXNzJywgKCkgPT4ge1xuICAgIGV4cGVjdCgoKSA9PiB7XG4gICAgICB2YWxpZGF0ZUFkZHJlc3MoRVRIRVJFVU1fQ0hBSU4sIHRlc3REYXRhLmludmFsaWRFdGhlcmV1bUljYXBBZGRyZXNzKTtcbiAgICB9KS50b1Rocm93KFVuc3VwcG9ydGVkQWRkcmVzc0Vycm9yKTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEB0YXJnZXQgYHZhbGlkYXRlQWRkcmVzc2Agc2hvdWxkIG5vdCB2YWxpZGF0ZSB3cm9uZyBFdGhlcmV1bSBhZGRyZXNzXG4gICAqIEBkZXBlbmRlbmNpZXNcbiAgICogQHNjZW5hcmlvXG4gICAqIC0gcnVuIHRlc3RcbiAgICogQGV4cGVjdGVkXG4gICAqIC0gbm90IHRvIHZhbGlkYXRlIHdyb25nIEV0aGVyZXVtIGFkZHJlc3NcbiAgICovXG4gIGl0KCdzaG91bGQgbm90IHZhbGlkYXRlIHdyb25nIEV0aGVyZXVtIGFkZHJlc3MnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcyhFVEhFUkVVTV9DSEFJTiwgdGVzdERhdGEuaW52YWxpZEV0aGVyZXVtQWRkcmVzc0xlbmd0aCk7XG4gICAgfSkudG9UaHJvdyhVbnN1cHBvcnRlZEFkZHJlc3NFcnJvcik7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBAdGFyZ2V0IGB2YWxpZGF0ZUFkZHJlc3NgIHNob3VsZCB0aHJvdyBlcnJvciB3aGVuIGNoYWluIGlzIG5vdCBzdXBwb3J0ZWRcbiAgICogQGRlcGVuZGVuY2llc1xuICAgKiBAc2NlbmFyaW9cbiAgICogLSBydW4gdGVzdFxuICAgKiBAZXhwZWN0ZWRcbiAgICogLSBpdCBzaG91bGQgdGhyb3cgVW5zdXBwb3J0ZWRDaGFpbiBlcnJvclxuICAgKi9cbiAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIGNoYWluIGlzIG5vdCBzdXBwb3J0ZWQnLCAoKSA9PiB7XG4gICAgZXhwZWN0KCgpID0+IHtcbiAgICAgIHZhbGlkYXRlQWRkcmVzcygndW5zdXBwb3J0ZWQtY2hhaW4nLCAnMDAxMTIyMzM0NCcpO1xuICAgIH0pLnRvVGhyb3coVW5zdXBwb3J0ZWRDaGFpbkVycm9yKTtcbiAgfSk7XG59KTtcbiJdfQ==
|