@rljson/io 0.0.44 → 0.0.47
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/dist/conformance-tests/goldens/rawTableCfgs.json +168 -0
- package/dist/conformance-tests/io-conformance.setup.ts +41 -6
- package/dist/conformance-tests/io-conformance.spec.ts +66 -5
- package/dist/io-peer.d.ts +91 -0
- package/dist/io-server.d.ts +33 -0
- package/dist/io-tools.d.ts +1 -0
- package/dist/io.js +1 -1
- package/dist/peer-server-socket-mock.d.ts +18 -0
- package/dist/peer-socket-mock.d.ts +35 -0
- package/dist/socket.d.ts +8 -0
- package/package.json +8 -8
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"key": "revisions",
|
|
4
|
+
"type": "revisions",
|
|
5
|
+
"isHead": true,
|
|
6
|
+
"isRoot": true,
|
|
7
|
+
"isShared": false,
|
|
8
|
+
"columns": [
|
|
9
|
+
{
|
|
10
|
+
"key": "_hash",
|
|
11
|
+
"type": "string",
|
|
12
|
+
"_hash": "df4oYftB-71Njv9FprRCeg"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"key": "table",
|
|
16
|
+
"type": "string",
|
|
17
|
+
"_hash": "FmsYjsit04XJi02Sihdwl-"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"key": "predecessor",
|
|
21
|
+
"type": "string",
|
|
22
|
+
"_hash": "RlAk7Lj-lZf2KDlUk5fekZ"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"key": "successor",
|
|
26
|
+
"type": "string",
|
|
27
|
+
"_hash": "MJlFtQVty5oUJKVzzj5hyB"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"key": "timestamp",
|
|
31
|
+
"type": "number",
|
|
32
|
+
"_hash": "XpKYGh23thW6vONgQuoMHf"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"key": "id",
|
|
36
|
+
"type": "string",
|
|
37
|
+
"_hash": "eq2P3RIaSgy81i7PomNUvn"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"_hash": "2ztQLyMtsFFIs0z_rvT6UL"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"key": "table0",
|
|
44
|
+
"type": "components",
|
|
45
|
+
"isHead": false,
|
|
46
|
+
"isRoot": false,
|
|
47
|
+
"isShared": true,
|
|
48
|
+
"columns": [
|
|
49
|
+
{
|
|
50
|
+
"key": "_hash",
|
|
51
|
+
"type": "string",
|
|
52
|
+
"_hash": "df4oYftB-71Njv9FprRCeg"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"key": "col0",
|
|
56
|
+
"type": "string",
|
|
57
|
+
"_hash": "LyqWPAOnRnSAofi4I1aMIv"
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"_hash": "SkSdXUd0JvYYu_AtvQ2sOZ"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"_hash": "er5aXXmEqihTA7Y1glILb4",
|
|
64
|
+
"key": "tableCfgs",
|
|
65
|
+
"type": "tableCfgs",
|
|
66
|
+
"isHead": false,
|
|
67
|
+
"isRoot": false,
|
|
68
|
+
"isShared": true,
|
|
69
|
+
"previous": "",
|
|
70
|
+
"columns": [
|
|
71
|
+
{
|
|
72
|
+
"key": "_hash",
|
|
73
|
+
"type": "string",
|
|
74
|
+
"_hash": "df4oYftB-71Njv9FprRCeg"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"key": "key",
|
|
78
|
+
"type": "string",
|
|
79
|
+
"_hash": "tapEY-QdaJwWhz1PPZoG35"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"key": "type",
|
|
83
|
+
"type": "string",
|
|
84
|
+
"_hash": "zE7ALsNzu5JPgDD4AxeRCh"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"key": "isHead",
|
|
88
|
+
"type": "boolean",
|
|
89
|
+
"_hash": "ar8Hajt2UZDn-F21QLMyC_"
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"key": "isRoot",
|
|
93
|
+
"type": "boolean",
|
|
94
|
+
"_hash": "hedsCm_HtiiTuzJyTeMqhm"
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"key": "isShared",
|
|
98
|
+
"type": "boolean",
|
|
99
|
+
"_hash": "pxXOf3-3qCo9Z3FzC9JXSH"
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"key": "previous",
|
|
103
|
+
"type": "string",
|
|
104
|
+
"_hash": "e0TEeDmSvJcLEMtrVxc0oW"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"key": "columns",
|
|
108
|
+
"type": "jsonArray",
|
|
109
|
+
"_hash": "aPmGTcNng9E1RvlEj1LtxB"
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"key": "table0",
|
|
115
|
+
"type": "components",
|
|
116
|
+
"isHead": false,
|
|
117
|
+
"isRoot": false,
|
|
118
|
+
"isShared": true,
|
|
119
|
+
"columns": [
|
|
120
|
+
{
|
|
121
|
+
"key": "_hash",
|
|
122
|
+
"type": "string",
|
|
123
|
+
"_hash": "df4oYftB-71Njv9FprRCeg"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"key": "col0",
|
|
127
|
+
"type": "string",
|
|
128
|
+
"_hash": "LyqWPAOnRnSAofi4I1aMIv"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"key": "col1",
|
|
132
|
+
"type": "string",
|
|
133
|
+
"_hash": "aD2OJziZ76JeLyPuV4ioKe"
|
|
134
|
+
}
|
|
135
|
+
],
|
|
136
|
+
"_hash": "vP2jpAaUyT_Xo3bvmTgfpo"
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"key": "table0",
|
|
140
|
+
"type": "components",
|
|
141
|
+
"isHead": false,
|
|
142
|
+
"isRoot": false,
|
|
143
|
+
"isShared": true,
|
|
144
|
+
"columns": [
|
|
145
|
+
{
|
|
146
|
+
"key": "_hash",
|
|
147
|
+
"type": "string",
|
|
148
|
+
"_hash": "df4oYftB-71Njv9FprRCeg"
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
"key": "col0",
|
|
152
|
+
"type": "string",
|
|
153
|
+
"_hash": "LyqWPAOnRnSAofi4I1aMIv"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"key": "col1",
|
|
157
|
+
"type": "string",
|
|
158
|
+
"_hash": "aD2OJziZ76JeLyPuV4ioKe"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"key": "col2",
|
|
162
|
+
"type": "string",
|
|
163
|
+
"_hash": "yd4AdprM2Z0vqKieWOibX5"
|
|
164
|
+
}
|
|
165
|
+
],
|
|
166
|
+
"_hash": "wfRMrOPA2C9ogANQmzsI7K"
|
|
167
|
+
}
|
|
168
|
+
]
|
|
@@ -5,16 +5,17 @@
|
|
|
5
5
|
// found in the LICENSE file in the root of this package.
|
|
6
6
|
|
|
7
7
|
import { Io, IoMem, IoTestSetup } from '@rljson/io';
|
|
8
|
+
import { IoPeer } from '../src/io-peer';
|
|
9
|
+
import { IoServer } from '../src/io-server';
|
|
10
|
+
import { PeerServerSocketMock } from '../src/peer-server-socket-mock';
|
|
8
11
|
|
|
9
12
|
// ..............................................................................
|
|
10
|
-
class
|
|
13
|
+
abstract class GenericIoTestSetup implements IoTestSetup {
|
|
11
14
|
async beforeAll(): Promise<void> {
|
|
12
15
|
// This method can be used for any additional setup required before init.
|
|
13
16
|
// Currently, it does nothing.
|
|
14
17
|
}
|
|
15
|
-
async beforeEach(): Promise<void> {
|
|
16
|
-
this._io = await IoMem.example();
|
|
17
|
-
}
|
|
18
|
+
async beforeEach(): Promise<void> {}
|
|
18
19
|
|
|
19
20
|
async afterEach(): Promise<void> {
|
|
20
21
|
await this.io.close();
|
|
@@ -31,8 +32,42 @@ class MyIoTestSetup implements IoTestSetup {
|
|
|
31
32
|
return this._io;
|
|
32
33
|
}
|
|
33
34
|
|
|
34
|
-
|
|
35
|
+
protected _io: Io | null = null;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
class IoMemTestSetup extends GenericIoTestSetup {
|
|
39
|
+
async beforeEach(): Promise<void> {
|
|
40
|
+
this._io = await IoMem.example();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
class IoPeerTestSetup extends GenericIoTestSetup {
|
|
45
|
+
async beforeEach(): Promise<void> {
|
|
46
|
+
this._io = await IoPeer.example();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
class IoPeerServerTestSetup extends GenericIoTestSetup {
|
|
51
|
+
async beforeEach(): Promise<void> {
|
|
52
|
+
//Io of Server --> IoMem
|
|
53
|
+
const ioMemServer = await IoMem.example();
|
|
54
|
+
|
|
55
|
+
//Socket between Server and Peer
|
|
56
|
+
const socket = new PeerServerSocketMock();
|
|
57
|
+
|
|
58
|
+
//IoPeer of Peer --> Socket
|
|
59
|
+
const ioServer = new IoServer(ioMemServer);
|
|
60
|
+
ioServer.addSocket(socket);
|
|
61
|
+
|
|
62
|
+
//IoPeer of Peer --> Socket
|
|
63
|
+
const io = new IoPeer(socket);
|
|
64
|
+
await io.init();
|
|
65
|
+
|
|
66
|
+
this._io = io;
|
|
67
|
+
}
|
|
35
68
|
}
|
|
36
69
|
|
|
37
70
|
// .............................................................................
|
|
38
|
-
export const
|
|
71
|
+
export const testMemSetup = () => new IoMemTestSetup();
|
|
72
|
+
export const testPeerSetup = () => new IoPeerTestSetup();
|
|
73
|
+
export const testPeerServerSetup = () => new IoPeerServerTestSetup();
|
|
@@ -22,7 +22,7 @@ import { afterAll, afterEach, beforeAll, beforeEach, describe, expect, it } from
|
|
|
22
22
|
|
|
23
23
|
import { Io, IoTestSetup, IoTools } from '@rljson/io';
|
|
24
24
|
|
|
25
|
-
import {
|
|
25
|
+
import { testMemSetup, testPeerServerSetup, testPeerSetup } from './io-conformance.setup.ts';
|
|
26
26
|
import { expectGolden, ExpectGoldenOptions } from './setup/goldens.ts';
|
|
27
27
|
|
|
28
28
|
|
|
@@ -30,14 +30,23 @@ const ego: ExpectGoldenOptions = {
|
|
|
30
30
|
npmUpdateGoldensEnabled: false,
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
const setups: Record<string, IoTestSetup> = {
|
|
34
|
+
IoMem: testMemSetup(),
|
|
35
|
+
IoPeer: testPeerSetup(),
|
|
36
|
+
IoPeerServer: testPeerServerSetup(),
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const runIoConformanceTests = (
|
|
40
|
+
setupName: string,
|
|
41
|
+
ioTestSetup: IoTestSetup,
|
|
42
|
+
) => {
|
|
43
|
+
return describe('Io Conformance - ' + setupName, async () => {
|
|
35
44
|
let io: Io;
|
|
36
45
|
let ioTools: IoTools;
|
|
37
46
|
let setup: IoTestSetup;
|
|
38
47
|
|
|
39
48
|
beforeAll(async () => {
|
|
40
|
-
setup =
|
|
49
|
+
setup = ioTestSetup;
|
|
41
50
|
await setup.beforeAll();
|
|
42
51
|
});
|
|
43
52
|
|
|
@@ -126,11 +135,54 @@ export const runIoConformanceTests = () => {
|
|
|
126
135
|
});
|
|
127
136
|
});
|
|
128
137
|
|
|
138
|
+
describe('rawTableCfgs()', () => {
|
|
139
|
+
it('returns an array of all table configurations', async () => {
|
|
140
|
+
//create four tables with two versions each
|
|
141
|
+
const tableV0: TableCfg = {
|
|
142
|
+
key: 'table0',
|
|
143
|
+
type: 'components',
|
|
144
|
+
isHead: false,
|
|
145
|
+
isRoot: false,
|
|
146
|
+
isShared: true,
|
|
147
|
+
columns: [
|
|
148
|
+
{ key: '_hash', type: 'string' },
|
|
149
|
+
{ key: 'col0', type: 'string' },
|
|
150
|
+
],
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
const tableV1 = addColumnsToTableCfg(tableV0, [
|
|
154
|
+
{ key: 'col1', type: 'string' },
|
|
155
|
+
]);
|
|
156
|
+
|
|
157
|
+
const tableV2 = addColumnsToTableCfg(tableV1, [
|
|
158
|
+
{ key: 'col2', type: 'string' },
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
await io.createOrExtendTable({ tableCfg: tableV0 });
|
|
162
|
+
await io.createOrExtendTable({ tableCfg: tableV1 });
|
|
163
|
+
await io.createOrExtendTable({ tableCfg: tableV2 });
|
|
164
|
+
|
|
165
|
+
// Check the tableCfgs
|
|
166
|
+
const actualTableCfgs = await io.rawTableCfgs();
|
|
167
|
+
await expectGolden('io-conformance/rawTableCfgs.json', ego).toBe(
|
|
168
|
+
actualTableCfgs,
|
|
169
|
+
);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
172
|
+
|
|
129
173
|
describe('throws an error', async () => {
|
|
130
174
|
it('if the hashes in the tableCfg are wrong', async () => {
|
|
131
175
|
const tableCfg: TableCfg = hip(exampleTableCfg({ key: 'table1' }));
|
|
132
176
|
tableCfg._hash = 'wrongHash';
|
|
133
177
|
let message: string = '';
|
|
178
|
+
|
|
179
|
+
await expect(
|
|
180
|
+
io.createOrExtendTable({ tableCfg: tableCfg }),
|
|
181
|
+
).rejects.toThrow(
|
|
182
|
+
'Hash "wrongHash" does not match the newly calculated one "uX24nHRtwkXRsq8l46cNRZ". ' +
|
|
183
|
+
'Please make sure that all systems are producing the same hashes.',
|
|
184
|
+
);
|
|
185
|
+
|
|
134
186
|
try {
|
|
135
187
|
await io.createOrExtendTable({ tableCfg: tableCfg });
|
|
136
188
|
} catch (err: any) {
|
|
@@ -951,8 +1003,17 @@ export const runIoConformanceTests = () => {
|
|
|
951
1003
|
const contentType = await io.contentType({ table: 'table1' });
|
|
952
1004
|
expect(contentType).toBe('components');
|
|
953
1005
|
});
|
|
1006
|
+
|
|
1007
|
+
it('returns error if table is not existing', async () => {
|
|
1008
|
+
await expect(io.contentType({ table: 'unknown' })).rejects.toThrow(
|
|
1009
|
+
'Table "unknown" not found',
|
|
1010
|
+
);
|
|
1011
|
+
});
|
|
954
1012
|
});
|
|
955
1013
|
});
|
|
956
1014
|
};
|
|
957
1015
|
|
|
958
|
-
|
|
1016
|
+
// Run the tests for all setups
|
|
1017
|
+
for (const [setupName, setup] of Object.entries(setups)) {
|
|
1018
|
+
runIoConformanceTests(setupName, setup);
|
|
1019
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { JsonValue } from '@rljson/json';
|
|
2
|
+
import { ContentType, Rljson, TableCfg, TableKey } from '@rljson/rljson';
|
|
3
|
+
import { Io } from './io.ts';
|
|
4
|
+
import { Socket } from './socket.ts';
|
|
5
|
+
export declare class IoPeer implements Io {
|
|
6
|
+
private _socket;
|
|
7
|
+
isOpen: boolean;
|
|
8
|
+
constructor(_socket: Socket);
|
|
9
|
+
/**
|
|
10
|
+
*
|
|
11
|
+
* Initializes the Peer connection.
|
|
12
|
+
* @returns
|
|
13
|
+
*/
|
|
14
|
+
init(): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Closes the Peer connection.
|
|
17
|
+
* @returns
|
|
18
|
+
*/
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Returns a promise that resolves once the Peer connection is ready.
|
|
22
|
+
* @returns
|
|
23
|
+
*/
|
|
24
|
+
isReady(): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Dumps the entire database content.
|
|
27
|
+
* @returns A promise that resolves to the dumped database content.
|
|
28
|
+
*/
|
|
29
|
+
dump(): Promise<Rljson>;
|
|
30
|
+
/**
|
|
31
|
+
* Dumps a specific table from the database.
|
|
32
|
+
* @param request An object containing the table name to dump.
|
|
33
|
+
* @returns A promise that resolves to the dumped table data.
|
|
34
|
+
*/
|
|
35
|
+
dumpTable(request: {
|
|
36
|
+
table: string;
|
|
37
|
+
}): Promise<Rljson>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the content type of a specific table.
|
|
40
|
+
* @param request An object containing the table name to get the content type for.
|
|
41
|
+
* @returns A promise that resolves to the content type of the specified table.
|
|
42
|
+
*/
|
|
43
|
+
contentType(request: {
|
|
44
|
+
table: string;
|
|
45
|
+
}): Promise<ContentType>;
|
|
46
|
+
/**
|
|
47
|
+
* Checks if a specific table exists in the database.
|
|
48
|
+
* @param tableKey The key of the table to check for existence.
|
|
49
|
+
* @returns A promise that resolves to true if the table exists, false otherwise.
|
|
50
|
+
*/
|
|
51
|
+
tableExists(tableKey: TableKey): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Creates or extends a table with the given configuration.
|
|
54
|
+
* @param request An object containing the table configuration.
|
|
55
|
+
* @returns A promise that resolves once the table is created or extended.
|
|
56
|
+
*/
|
|
57
|
+
createOrExtendTable(request: {
|
|
58
|
+
tableCfg: TableCfg;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Retrieves the raw table configurations from the database.
|
|
62
|
+
* @returns A promise that resolves to an array of table configurations.
|
|
63
|
+
*/
|
|
64
|
+
rawTableCfgs(): Promise<TableCfg[]>;
|
|
65
|
+
/**
|
|
66
|
+
* Writes data to the database.
|
|
67
|
+
* @param request An object containing the data to write.
|
|
68
|
+
* @returns A promise that resolves once the data is written.
|
|
69
|
+
*/
|
|
70
|
+
write(request: {
|
|
71
|
+
data: Rljson;
|
|
72
|
+
}): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Reads rows from a specific table that match the given criteria.
|
|
75
|
+
* @param request An object containing the table name and the criteria for selecting rows.
|
|
76
|
+
* @returns A promise that resolves to the selected rows.
|
|
77
|
+
*/
|
|
78
|
+
readRows(request: {
|
|
79
|
+
table: string;
|
|
80
|
+
where: {
|
|
81
|
+
[column: string]: JsonValue | null;
|
|
82
|
+
};
|
|
83
|
+
}): Promise<Rljson>;
|
|
84
|
+
/**
|
|
85
|
+
* Retrieves the number of rows in a specific table.
|
|
86
|
+
* @param table The name of the table to count rows in.
|
|
87
|
+
* @returns A promise that resolves to the number of rows in the specified table.
|
|
88
|
+
*/
|
|
89
|
+
rowCount(table: string): Promise<number>;
|
|
90
|
+
static example: () => Promise<IoPeer>;
|
|
91
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Io } from './io.ts';
|
|
2
|
+
import { Socket } from './socket.ts';
|
|
3
|
+
export declare class IoServer {
|
|
4
|
+
private readonly _io;
|
|
5
|
+
private _sockets;
|
|
6
|
+
constructor(_io: Io);
|
|
7
|
+
/**
|
|
8
|
+
* Adds a socket to the IoServer instance.
|
|
9
|
+
* @param socket - The socket to add.
|
|
10
|
+
*/
|
|
11
|
+
addSocket(socket: Socket): Promise<void>;
|
|
12
|
+
/**
|
|
13
|
+
* Removes a transport layer from the given socket.
|
|
14
|
+
* @param socket - The socket to remove the transport layer from.
|
|
15
|
+
*/
|
|
16
|
+
removeSocket(socket: Socket): void;
|
|
17
|
+
/**
|
|
18
|
+
* Adds a transport layer to the given socket.
|
|
19
|
+
* @param socket - The socket to add the transport layer to.
|
|
20
|
+
*/
|
|
21
|
+
private _addTransportLayer;
|
|
22
|
+
/**
|
|
23
|
+
* Creates or extends a table with the given configuration.
|
|
24
|
+
* @param request - An object containing the table configuration.
|
|
25
|
+
*/
|
|
26
|
+
private createOrExtendTable;
|
|
27
|
+
/**
|
|
28
|
+
* Generates a transport layer object for the given Io instance.
|
|
29
|
+
* @param io - The Io instance to generate the transport layer for.
|
|
30
|
+
* @returns An object containing methods that correspond to the Io interface.
|
|
31
|
+
*/
|
|
32
|
+
private _generateTransportLayerCRUD;
|
|
33
|
+
}
|
package/dist/io-tools.d.ts
CHANGED
package/dist/io.js
CHANGED
|
@@ -612,4 +612,4 @@ export {
|
|
|
612
612
|
exampleIo,
|
|
613
613
|
exampleTestSetup
|
|
614
614
|
};
|
|
615
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsXG4gIFJsanNvbixcbiAgVGFibGVDZmcsXG4gIFRhYmxlS2V5LFxuICBUYWJsZVR5cGUsXG4gIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnLFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvTWVtIH0gZnJvbSAnLi9pby1tZW0udHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuLyoqXG4gKiBQcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgdGhlIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvVG9vbHMge1xuICAvKipcbiAgICogQ29uc3RydWN0b3JcbiAgICogQHBhcmFtIGlvIFRoZSBJbyBpbnRlcmZhY2UgdG8gdXNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgaW86IElvKSB7fVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uIG9mIHRoZSB0YWJsZUNmZ3MgdGFibGUuXG4gICAqL1xuICBzdGF0aWMgZ2V0IHRhYmxlQ2Znc1RhYmxlQ2ZnKCkge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gaGlwPFRhYmxlQ2ZnPih7XG4gICAgICBfaGFzaDogJycsXG4gICAgICBrZXk6ICd0YWJsZUNmZ3MnLFxuICAgICAgdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBpc0hlYWQ6IGZhbHNlLFxuICAgICAgaXNSb290OiBmYWxzZSxcbiAgICAgIGlzU2hhcmVkOiB0cnVlLFxuICAgICAgcHJldmlvdXM6ICcnLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ2tleScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndHlwZScsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnaXNIZWFkJywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNSb290JywgdHlwZTogJ2Jvb2xlYW4nIH0sXG4gICAgICAgIHsga2V5OiAnaXNTaGFyZWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdwcmV2aW91cycsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnY29sdW1ucycsIHR5cGU6ICdqc29uQXJyYXknIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRhYmxlQ2ZnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSByZXZpc2lvbnMgdGFibGUuXG4gICAqL1xuICBpbml0UmV2aXNpb25zVGFibGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmc6IFRhYmxlQ2ZnID0ge1xuICAgICAga2V5OiAncmV2aXNpb25zJyxcbiAgICAgIHR5cGU6ICdyZXZpc2lvbnMnLFxuICAgICAgaXNIZWFkOiB0cnVlLFxuICAgICAgaXNSb290OiB0cnVlLFxuICAgICAgaXNTaGFyZWQ6IGZhbHNlLFxuXG4gICAgICBjb2x1bW5zOiBbXG4gICAgICAgIHsga2V5OiAnX2hhc2gnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RhYmxlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdwcmVkZWNlc3NvcicsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAnc3VjY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0aW1lc3RhbXAnLCB0eXBlOiAnbnVtYmVyJyB9LFxuICAgICAgICB7IGtleTogJ2lkJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMuaW8uY3JlYXRlT3JFeHRlbmRUYWJsZSh7IHRhYmxlQ2ZnIH0pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBFeGFtcGxlIG9iamVjdCBmb3IgdGVzdCBwdXJwb3Nlc1xuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBpbyB0b29sc1xuICAgKi9cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBhd2FpdCBJb01lbS5leGFtcGxlKCk7XG4gICAgYXdhaXQgaW8uaW5pdCgpO1xuICAgIGF3YWl0IGlvLmlzUmVhZHkoKTtcbiAgICByZXR1cm4gbmV3IElvVG9vbHMoaW8pO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0XG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBleGlzdHMgPSBhd2FpdCB0aGlzLmlvLnRhYmxlRXhpc3RzKHRhYmxlKTtcbiAgICBpZiAoIWV4aXN0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiBhbnkgb2YgdGhlIHRhYmxlcyBpbiBybGpzb24gZG8gbm90IGV4aXN0XG4gICAqIEBwYXJhbSBybGpzb24gLSBUaGUgUmxqc29uIG9iamVjdCB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChybGpzb246IFJsanNvbik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBpdGVyYXRlVGFibGVzKHJsanNvbiwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGVLZXkpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlS2V5fVwiIG5vdCBmb3VuZGApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zdCBtaXNzaW5nVGFibGVzID0gKGUgYXMgQXJyYXk8YW55PikubWFwKChlKSA9PiBlLnRhYmxlS2V5KTtcblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyB0YWJsZXMgZG8gbm90IGV4aXN0OiAke21pc3NpbmdUYWJsZXMuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB0YWJsZSBjZmdzIG9mIGFsbCB0YWJsZXNcbiAgICogQHJldHVybnMgVGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIHRhYmxlc1xuICAgKi9cbiAgYXN5bmMgdGFibGVDZmdzKCk6IFByb21pc2U8VGFibGVDZmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlcyA9IGF3YWl0IHRoaXMuaW8ucmF3VGFibGVDZmdzKCk7XG5cbiAgICAvLyBUYWtlIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIHR5cGUga2V5XG4gICAgY29uc3QgbmV3ZXN0VmVyc2lvbjogUmVjb3JkPFRhYmxlS2V5LCBUYWJsZUNmZz4gPSB7fTtcbiAgICBmb3IgKGxldCBpID0gdGFibGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCB0YWJsZSA9IHRhYmxlc1tpXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldO1xuICAgICAgLyogdjggaWdub3JlIHN0YXJ0ICovXG4gICAgICBpZiAoIWV4aXN0aW5nIHx8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoIDwgdGFibGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgbmV3ZXN0VmVyc2lvblt0YWJsZS5rZXldID0gdGFibGU7XG4gICAgICB9XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfVxuXG4gICAgLy8gU29ydCB0aGUgdGFibGVzIGJ5IGtleVxuICAgIGNvbnN0IHJlc3VsdERhdGEgPSBPYmplY3QudmFsdWVzKG5ld2VzdFZlcnNpb24pLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGlmIChhLmtleSA8IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChhLmtleSA+IGIua2V5KSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdERhdGE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgd2l0aCBhbGwgdGFibGUgbmFtZXNcbiAgICovXG4gIGFzeW5jIGFsbFRhYmxlS2V5cygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gKGF3YWl0IHRoaXMudGFibGVDZmdzKCkpLm1hcCgoZSkgPT4gZS5rZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnT3JOdWxsKHRhYmxlKTtcbiAgICBpZiAoIXRhYmxlQ2ZnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGVDZmchO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBnaXZlbiB0YWJsZSBvciBudWxsIGlmIGl0IGRvZXMgbm90IGV4aXN0LlxuXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ09yTnVsbCh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPFRhYmxlQ2ZnIHwgbnVsbD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZncyA9IGF3YWl0IHRoaXMudGFibGVDZmdzKCk7XG4gICAgY29uc3QgdGFibGVDZmcgPSB0YWJsZUNmZ3MuZmluZCgoZSkgPT4gZS5rZXkgPT09IHRhYmxlKTtcbiAgICByZXR1cm4gdGFibGVDZmcgPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgY29sdW1uIG5hbWVzIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIGFsbENvbHVtbktleXModGFibGU6IFRhYmxlS2V5KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3Mgd2hlbiBhIGNvbHVtbiBkb2VzIG5vdCBleGlzdCBpbiBhIGdpdmVuIHRhYmxlXG4gICAqIEBwYXJhbSB0YWJsZSAtIFRoZSB0YWJsZSB0byBjaGVja1xuICAgKiBAcGFyYW0gY29sdW1ucyAtIFRoZSBjb2x1bW4gdG8gY2hlY2tcbiAgICovXG4gIGFzeW5jIHRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICB0YWJsZTogVGFibGVLZXksXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZSk7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IHRhYmxlQ2ZnLmNvbHVtbnMubWFwKChjb2x1bW4pID0+IGNvbHVtbi5rZXkpO1xuICAgIGNvbnN0IG1pc3NpbmdDb2x1bW5zID0gY29sdW1ucy5maWx0ZXIoXG4gICAgICAoY29sdW1uKSA9PiAhY29sdW1uS2V5cy5pbmNsdWRlcyhjb2x1bW4pLFxuICAgICk7XG4gICAgaWYgKG1pc3NpbmdDb2x1bW5zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBmb2xsb3dpbmcgY29sdW1ucyBkbyBub3QgZXhpc3QgaW4gdGFibGUgXCIke3RhYmxlfVwiOiAke21pc3NpbmdDb2x1bW5zLmpvaW4oXG4gICAgICAgICAgJywgJyxcbiAgICAgICAgKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgdGFibGUgdXBkYXRlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdGFibGVcbiAgICogY29uZmlndXJhdGlvbi5cbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlSXNOb3RDb21wYXRpYmxlKHVwZGF0ZTogVGFibGVDZmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmVmaXggPSBgSW52YWxpZCB1cGRhdGUgb2YgdGFibGUgYWJsZSBcIiR7dXBkYXRlLmtleX1cImA7XG5cbiAgICB0aHJvd09uSW52YWxpZFRhYmxlQ2ZnKHVwZGF0ZSk7XG5cbiAgICAvLyBDaGVjayBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodXBkYXRlLmtleSk7XG4gICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAvLyBIYXZlIGNvbHVtbnMgYmVlbiBkZWxldGVkP1xuICAgICAgaWYgKGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoID4gdXBkYXRlLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5LZXlzID0gZXhpc3RpbmcuY29sdW1uc1xuICAgICAgICAgIC5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSlcbiAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4gIXVwZGF0ZS5jb2x1bW5zLnNvbWUoKGNvbHVtbikgPT4gY29sdW1uLmtleSA9PT0ga2V5KSxcbiAgICAgICAgICApO1xuICAgICAgICBpZiAoZGVsZXRlZENvbHVtbktleXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRlbGV0ZWRDb2x1bW5zID0gZGVsZXRlZENvbHVtbktleXMuam9pbignLCAnKTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBDb2x1bW5zIG11c3Qgbm90IGJlIGRlbGV0ZWQuIGAgK1xuICAgICAgICAgICAgICBgRGVsZXRlZCBjb2x1bW5zOiAke2RlbGV0ZWRDb2x1bW5zfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4ga2V5cyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBrZXlzIG11c3Qgbm90IGNoYW5nZSEgYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gXCIke2JlZm9yZX1cIiB3YXMgcmVuYW1lZCBpbnRvIFwiJHthZnRlcn1cIi5gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGF2ZSBjb2x1bW4gdHlwZXMgY2hhbmdlZD9cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBjb2x1bW4gPSBleGlzdGluZy5jb2x1bW5zW2ldLmtleTtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS50eXBlO1xuICAgICAgICBjb25zdCBhZnRlciA9IHVwZGF0ZS5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGlmIChiZWZvcmUgIT09IGFmdGVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYCR7cHJlZml4fTogYCArXG4gICAgICAgICAgICAgIGBDb2x1bW4gdHlwZXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYFR5cGUgb2YgY29sdW1uIFwiJHtjb2x1bW59XCIgd2FzIGNoYW5nZWQgZnJvbSBcIiR7YmVmb3JlfVwiIHRvICR7YWZ0ZXJ9LmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgaW4gdGhlIHRhYmxlIGRvIG5vdCBtYXRjaCB0aGUgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKGRhdGE6IFJsanNvbikge1xuICAgIGNvbnN0IGVycm9yczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMoZGF0YSwgYXN5bmMgKHRhYmxlS2V5KSA9PiB7XG4gICAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmcodGFibGVLZXkpO1xuICAgICAgY29uc3QgdGFibGUgPSBkYXRhW3RhYmxlS2V5XTtcblxuICAgICAgLy8gSWdub3JlIHRhYmxlQ2ZncyB0YWJsZVxuICAgICAgaWYgKHRhYmxlLl90eXBlID09PSAndGFibGVDZmdzJykgcmV0dXJuO1xuXG4gICAgICBlcnJvcnMucHVzaCguLi52YWxpZGF0ZVJsanNvbkFnYWluc3RUYWJsZUNmZyh0YWJsZS5fZGF0YSwgdGFibGVDZmcpKTtcbiAgICB9KTtcblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGFibGUgZGF0YSBkb2VzIG5vdCBtYXRjaCB0aGUgY29uZmlndXJhdGlvbi5cXG5cXG5FcnJvcnM6XFxuJHtlcnJvcnNcbiAgICAgICAgICAubWFwKChlKSA9PiBgLSAke2V9YClcbiAgICAgICAgICAuam9pbignXFxuJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNvcnRzIHRoZSBkYXRhIG9mIGEgdGFibGUgYnkgdGhlIGhhc2ggYW5kIHVwZGF0ZXMgdGhlIHRhYmxlIGhhc2ggaW4gcGxhY2VcbiAgICovXG4gIHNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRhYmxlOiBUYWJsZVR5cGUpOiB2b2lkIHtcbiAgICB0YWJsZS5fZGF0YS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBoYXNoQSA9IGEuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgY29uc3QgaGFzaEIgPSBiLl9oYXNoIGFzIHN0cmluZztcbiAgICAgIGlmIChoYXNoQSA8IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNoQSA+IGhhc2hCKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIDA7XG4gICAgICAvKiB2OCBpZ25vcmUgZW5kICovXG4gICAgfSk7XG5cbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwge1xuICAgICAgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlLFxuICAgICAgdGhyb3dPbldyb25nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IGhpcCwgaHNoIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7IElzUmVhZHkgfSBmcm9tICdAcmxqc29uL2lzLXJlYWR5JztcbmltcG9ydCB7IGNvcHksIGVxdWFscywgSnNvblZhbHVlIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIENvbnRlbnRUeXBlLCBpdGVyYXRlVGFibGVzU3luYywgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXksIFRhYmxlVHlwZVxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbmltcG9ydCB7IElvVG9vbHMgfSBmcm9tICcuL2lvLXRvb2xzLnRzJztcbmltcG9ydCB7IElvIH0gZnJvbSAnLi9pby50cyc7XG5cblxuLyoqXG4gKiBJbi1NZW1vcnkgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJsanNvbiBJbyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBJb01lbSBpbXBsZW1lbnRzIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIENvbnN0cnVjdG9yICYgZXhhbXBsZVxuXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5faW5pdCgpO1xuICB9XG5cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgZ2V0IGlzT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICB9XG5cbiAgc3RhdGljIGV4YW1wbGUgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaW8gPSBuZXcgSW9NZW0oKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgcmV0dXJuIGlvO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmFsXG4gIGlzUmVhZHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2lzUmVhZHkucHJvbWlzZTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgZHVtcCgpOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wKCk7XG4gIH1cblxuICBhc3luYyBkdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIHJldHVybiB0aGlzLl9kdW1wVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG5cbiAgYXN5bmMgY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRlbnRUeXBlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJvd3NcblxuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRSb3dzKHJlcXVlc3QpO1xuICB9XG5cbiAgYXN5bmMgcm93Q291bnQodGFibGU6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgdGFibGVEYXRhID0gdGhpcy5fbWVtW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG4gICAgaWYgKCF0YWJsZURhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRhYmxlRGF0YS5fZGF0YS5sZW5ndGgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFdyaXRlXG5cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93cml0ZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBUYWJsZSBtYW5hZ2VtZW50XG4gIGFzeW5jIHRhYmxlRXhpc3RzKHRhYmxlS2V5OiBUYWJsZUtleSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgcmV0dXJuIHRhYmxlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YSBhcyBUYWJsZUNmZ1tdO1xuICAgIHJldHVybiB0YWJsZXM7XG4gIH1cblxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4gIC8vIFByaXZhdGVcbiAgLy8gIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuXG4gIHByaXZhdGUgX2lvVG9vbHMhOiBJb1Rvb2xzO1xuXG4gIHByaXZhdGUgX2lzUmVhZHkgPSBuZXcgSXNSZWFkeSgpO1xuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9tZW06IFJsanNvbiA9IGhpcCh7fSBhcyBSbGpzb24pO1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9pbml0KCkge1xuICAgIHRoaXMuX2lvVG9vbHMgPSBuZXcgSW9Ub29scyh0aGlzKTtcbiAgICB0aGlzLl9pbml0VGFibGVDZmdzKCk7XG4gICAgdGhpcy5fdXBkYXRlR2xvYmFsSGFzaCgpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMuaW5pdFJldmlzaW9uc1RhYmxlKCk7XG4gICAgaHNoKHRoaXMuX21lbSk7XG5cbiAgICB0aGlzLl9pc1JlYWR5LnJlc29sdmUoKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9pbml0VGFibGVDZmdzID0gKCkgPT4ge1xuICAgIGNvbnN0IHRhYmxlQ2ZnID0gSW9Ub29scy50YWJsZUNmZ3NUYWJsZUNmZztcblxuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MgPSBoaXAoe1xuICAgICAgX3R5cGU6ICd0YWJsZUNmZ3MnLFxuICAgICAgX2RhdGE6IFt0YWJsZUNmZ10sXG4gICAgICBfdGFibGVDZmc6IHRhYmxlQ2ZnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlR2xvYmFsSGFzaCgpIHtcbiAgICAodGhpcy5fbWVtIGFzIGFueSkuX2hhc2ggPSAnJztcbiAgICBoaXAodGhpcy5fbWVtLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3RhYmxlS2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX2hhc2ggPSAnJztcbiAgICBoaXAodGFibGUsIHsgdXBkYXRlRXhpc3RpbmdIYXNoZXM6IGZhbHNlIH0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NyZWF0ZU9yRXh0ZW5kVGFibGUocmVxdWVzdDoge1xuICAgIHRhYmxlQ2ZnOiBUYWJsZUNmZztcbiAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0YWJsZSBjb25maWcgaXMgY29tcGF0aWJsZVxuICAgIC8vIHdpdGggYW4gcG90ZW50aWFsIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGVDZmcgPSByZXF1ZXN0LnRhYmxlQ2ZnO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodGFibGVDZmcpO1xuXG4gICAgY29uc3QgeyBrZXkgfSA9IHRhYmxlQ2ZnO1xuXG4gICAgLy8gUmVjcmVhdGUgaGFzaGVzIGluIHRoZSBjYXNlIHRoZSBleGlzdGluZyBoYXNoZXMgYXJlIHdyb25nXG4gICAgY29uc3QgbmV3Q29uZmlnID0gaHNoKHRhYmxlQ2ZnKTtcblxuICAgIC8vIEZpbmQgYW4gZXhpc3RpbmcgdGFibGUgY29uZmlnIHdpdGggdGhlIHNhbWUgaGFzaFxuICAgIGNvbnN0IGV4aXN0aW5nQ29uZmlnID0gYXdhaXQgdGhpcy5faW9Ub29scy50YWJsZUNmZ09yTnVsbChrZXkpO1xuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBpZiAoIWV4aXN0aW5nQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jcmVhdGVUYWJsZShuZXdDb25maWcsIGtleSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2V4dGVuZFRhYmxlKGV4aXN0aW5nQ29uZmlnLCBuZXdDb25maWcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9jcmVhdGVUYWJsZShuZXdDb25maWc6IFRhYmxlQ2ZnLCB0YWJsZUtleTogVGFibGVLZXkpIHtcbiAgICAvLyBXcml0ZSB0aGUgdGFibGUgY29uZmlnIGludG8gdGhlIGRhdGFiYXNlXG4gICAgbmV3Q29uZmlnID0gaHNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5fbWVtLnRhYmxlQ2Zncy5fZGF0YS5wdXNoKG5ld0NvbmZpZyk7XG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0aGlzLl9tZW0udGFibGVDZmdzKTtcblxuICAgIC8vIENyZWF0ZSBhIHRhYmxlIGFuZCB3cml0ZSBpdCBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGNvbnN0IHRhYmxlOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfdHlwZTogbmV3Q29uZmlnLnR5cGUsXG4gICAgICBfZGF0YTogW10sXG4gICAgICBfdGFibGVDZmc6IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmcsXG4gICAgfTtcblxuICAgIHRoaXMuX21lbVt0YWJsZUtleV0gPz89IGhpcCh0YWJsZSk7XG5cbiAgICAvLyBVcGRhdGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKHRhYmxlS2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBfZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWc6IFRhYmxlQ2ZnLCBuZXdDb25maWc6IFRhYmxlQ2ZnKSB7XG4gICAgLy8gTm8gY29sdW1ucyBhZGRlZD8gUmV0dXJuLlxuICAgIGlmIChleGlzdGluZ0NvbmZpZy5jb2x1bW5zLmxlbmd0aCA9PT0gbmV3Q29uZmlnLmNvbHVtbnMubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gV3JpdGUgdGhlIG5ldyB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBjb25maWcgb2YgdGhlIGV4aXN0aW5nIHRhYmxlXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bbmV3Q29uZmlnLmtleV0gYXMgVGFibGVUeXBlO1xuICAgIHRhYmxlLl90YWJsZUNmZyA9IG5ld0NvbmZpZy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZVRhYmxlSGFzaChuZXdDb25maWcua2V5KTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cblxuICBwcml2YXRlIGFzeW5jIF9kdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIGNvcHkodGhpcy5fbWVtKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9kdW1wVGFibGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICByZXR1cm4ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiBjb3B5KHRhYmxlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2NvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG5cbiAgICByZXR1cm4gKHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGUpLl90eXBlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX3dyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhZGRlZERhdGEgPSBoc2gocmVxdWVzdC5kYXRhKTtcbiAgICB0aGlzLl9yZW1vdmVOdWxsVmFsdWVzKGFkZGVkRGF0YSk7XG4gICAgY29uc3QgdGFibGVzID0gT2JqZWN0LmtleXMoYWRkZWREYXRhKTtcbiAgICBoc2goYWRkZWREYXRhKTtcblxuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVzRG9Ob3RFeGlzdChyZXF1ZXN0LmRhdGEpO1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEYXRhRG9lc05vdE1hdGNoQ2ZnKHJlcXVlc3QuZGF0YSk7XG5cbiAgICBmb3IgKGNvbnN0IHRhYmxlIG9mIHRhYmxlcykge1xuICAgICAgaWYgKHRhYmxlLnN0YXJ0c1dpdGgoJ18nKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2xkVGFibGUgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICAgIGNvbnN0IG5ld1RhYmxlID0gYWRkZWREYXRhW3RhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAgIC8vIFRhYmxlIGV4aXN0cy4gTWVyZ2UgZGF0YVxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG5ld1RhYmxlLl9kYXRhKSB7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBpdGVtLl9oYXNoO1xuICAgICAgICBjb25zdCBleGlzdHMgPSBvbGRUYWJsZS5fZGF0YS5maW5kKChpKSA9PiBpLl9oYXNoID09PSBoYXNoKTtcbiAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICBvbGRUYWJsZS5fZGF0YS5wdXNoKGl0ZW0gYXMgYW55KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKG9sZFRhYmxlKTtcbiAgICB9XG5cbiAgICAvLyBSZWNhbGMgbWFpbiBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfcmVhZFJvd3MocmVxdWVzdDoge1xuICAgIHRhYmxlOiBzdHJpbmc7XG4gICAgd2hlcmU6IHsgW2NvbHVtbjogc3RyaW5nXTogSnNvblZhbHVlIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj4ge1xuICAgIGF3YWl0IHRoaXMuX2lvVG9vbHMudGhyb3dXaGVuVGFibGVEb2VzTm90RXhpc3QocmVxdWVzdC50YWJsZSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5Db2x1bW5Eb2VzTm90RXhpc3QoXG4gICAgICByZXF1ZXN0LnRhYmxlLFxuICAgICAgT2JqZWN0LmtleXMocmVxdWVzdC53aGVyZSksXG4gICAgKTtcblxuICAgIC8vIFJlYWQgdGFibGUgZnJvbSBkYXRhXG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bcmVxdWVzdC50YWJsZV0gYXMgVGFibGVUeXBlO1xuXG4gICAgLy8gRmlsdGVyIHRhYmxlIGRhdGFcbiAgICBjb25zdCB0YWJsZURhdGFGaWx0ZXJlZCA9IHRhYmxlLl9kYXRhLmZpbHRlcigocm93KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBpbiByZXF1ZXN0LndoZXJlKSB7XG4gICAgICAgIGNvbnN0IGEgPSByb3dbY29sdW1uXTtcbiAgICAgICAgY29uc3QgYiA9IHJlcXVlc3Qud2hlcmVbY29sdW1uXTtcbiAgICAgICAgaWYgKGIgPT09IG51bGwgJiYgYSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVxdWFscyhhLCBiKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgYW4gdGFibGVcbiAgICBjb25zdCB0YWJsZUZpbHRlcmVkOiBUYWJsZVR5cGUgPSB7XG4gICAgICBfdHlwZTogdGFibGUuX3R5cGUsXG4gICAgICBfZGF0YTogdGFibGVEYXRhRmlsdGVyZWQsXG4gICAgfTtcblxuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGVGaWx0ZXJlZCk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFJsanNvbiA9IHtcbiAgICAgIFtyZXF1ZXN0LnRhYmxlXTogdGFibGVGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIF9yZW1vdmVOdWxsVmFsdWVzKHJsanNvbjogUmxqc29uKSB7XG4gICAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAodGFibGUpID0+IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBybGpzb25bdGFibGVdLl9kYXRhO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHJvdykge1xuICAgICAgICAgIGlmIChyb3dba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgZGVsZXRlIHJvd1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSW8sIElvTWVtIH0gZnJvbSAnLi9pbmRleC50cyc7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIElvIGltcGxlbWVudGF0aW9uIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGJlIHVzZWQgaW5cbiAqIGNvbmZvcm1hbmNlIHRlc3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvVGVzdFNldHVwIHtcbiAgLyoqIHNldHVwIGJlZm9yZSB0aGUgc2luZ2xlIHNldHVwcyAqL1xuICBiZWZvcmVBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYmVmb3JlRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGVhcnMgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqIEByZXR1cm5zIFRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICovXG4gIGFmdGVyRWFjaDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKiogY2xlYW51cCBhZnRlciBhbGwgdGVzdHMgKi9cbiAgYWZ0ZXJBbGw6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRoZSBpbyBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIGluIHRoZSBjb25mb3JtYW5jZSB0ZXN0cy5cbiAgICovXG4gIGlvOiBJbztcbn1cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8vIEV4YW1wbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIElvVGVzdFNldHVwIGludGVyZmFjZVxuZXhwb3J0IGNvbnN0IGV4YW1wbGVUZXN0U2V0dXAgPSAoKTogSW9UZXN0U2V0dXAgPT4ge1xuICByZXR1cm4ge1xuICAgIGlvOiBuZXcgSW9NZW0oKSxcbiAgICBiZWZvcmVBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBiZWZvcmUgaW5pdC5cbiAgICAgIC8vIEN1cnJlbnRseSwgaXQgZG9lcyBub3RoaW5nLlxuICAgIH0sXG5cbiAgICBiZWZvcmVFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBpbyBpbXBsZW1lbnRhdGlvblxuICAgIH0sXG4gICAgYWZ0ZXJFYWNoOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUZWFyIGRvd24gdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcblxuICAgIGFmdGVyQWxsOiBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3IgYW55IGFkZGl0aW9uYWwgY2xlYW51cCBhZnRlciB0ZWFyRG93bi5cbiAgICB9LFxuICB9O1xufTtcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5IH0gZnJvbSAnQHJsanNvbi9ybGpzb24nO1xuXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgaW50ZXJmYWNlIElvIHtcbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcblxuICAvKiogU3RhcnRzIHRoZSBpbml0aWFsaXphdGlvbiAqL1xuICBpbml0KCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqIENsb3NlcyB0aGUgaW8gKi9cbiAgY2xvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogUmV0dXJucyB0cnVlIGlmIGlvIGlzIG9wZW5lZCAqL1xuICBpc09wZW46IGJvb2xlYW47XG5cbiAgLyoqIEEgcHJvbWlzZSByZXNvbHZpbmcgb25jZSB0aGUgSW8gaW50ZXJmYWNlIGlzIHJlYWR5XG4gICAqXG4gICAqIPCfkqEgVXNlIEBybGpzb24vaXMtcmVhZHlcbiAgICovXG4gIGlzUmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gRHVtcFxuXG4gIC8qKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSBkYiBjb250ZW50IGFzIFJsanNvbiAqL1xuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgZHVtcCBvZiBhIGNvbXBsZXRlIHRhYmxlICovXG4gIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gTWV0YSBEYXRhXG4gIGNvbnRlbnRUeXBlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxDb250ZW50VHlwZT47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlc1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRhYmxlIGV4aXN0c1xuICAgKi9cbiAgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHRhYmxlIHdpdGggYSBnaXZlbiBjb25maWcuXG4gICAqIElmIHRoZSB0YWJsZSBhbHJlYWR5IGV4aXN0cywgbmV3IGNvbHVtbnMgYXJlIGFkZGVkIHRvIHRoZSBleGlzdGluZyB0YWJsZS5cbiAgICogSWYgdGhlIHRhYmxlIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGV4aXN0cyBhbmQgY29sdW1ucyBhcmUgcmVtb3ZlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCB0aGUgY29sdW1uIHR5cGUgaXMgY2hhbmdlZCwgYW4gZXJyb3IgaXMgdGhyb3duLlxuICAgKi9cbiAgY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7IHRhYmxlQ2ZnOiBUYWJsZUNmZyB9KTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUmV0dXJucyBhIGpzb24gc3RydWN0dXJlIHJldHVybmluZyBjdXJyZW50IHRhYmxlIGNvbmZpZ3VyYXRpb25zXG4gICAqL1xuICByYXdUYWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICAvKiogV3JpdGVzIFJsanNvbiBkYXRhIGludG8gdGhlIGRhdGFiYXNlICovXG4gIHdyaXRlKHJlcXVlc3Q6IHsgZGF0YTogUmxqc29uIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBSZWFkIHJvd3NcblxuICAvKiogUXVlcmllcyBhIGxpc3Qgb2Ygcm93cyAqL1xuICByZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfCBudWxsIH07XG4gIH0pOiBQcm9taXNlPFJsanNvbj47XG5cbiAgLyoqIFJldHVybnMgdGhlIG51bWJlciBvZiByb3dzIGluIHRoZSBnaXZlbiB0YWJsZSAqL1xuICByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuZXhwb3J0IGNvbnN0IGV4YW1wbGVJbyA9XG4gICdDaGVja291dCBAcmxqc29uL2lvLW1lbSBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbic7XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgSnNvbiB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQge1xuICBCdWZmZXQsXG4gIENha2UsXG4gIGl0ZXJhdGVUYWJsZXNTeW5jLFxuICBMYXllcixcbiAgUmVmLFxuICBSbGpzb24sXG4gIFRhYmxlS2V5LFxufSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyBhIHJvdyB0aGF0IHJlZmVyZW5jZXMgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJlbnRSZWYge1xuICAvKipcbiAgICogVGhlIHBhcmVudCB0YWJsZSB0aGF0IHJlZmVyZW5jZXMgdGhlIGNoaWxkIHRhYmxlXG4gICAqL1xuICBbcGFyZW50VGFibGU6IFRhYmxlS2V5XToge1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJlbnQgcm93IHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgcm93XG4gICAgICovXG4gICAgW3BhcmVudFJvdzogUmVmXToge1xuICAgICAgLyoqXG4gICAgICAgKiBEZXRhaWxzIGFib3V0IHRoZSByZWZlcmVuY2UsIGUuZy4gYW4gYXJyYXkgaW5kZXggZXRjLlxuICAgICAgICovXG4gICAgICBkZXRhaWxzPzogSnNvbjtcbiAgICB9O1xuICB9O1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHBhcmVudCB0YWJsZSByb3dzIHJlZmVyZW5jaW5nIGEgY2hpbGQgdGFibGUgcm93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV2ZXJzZVJlZnMge1xuICAvKipcbiAgICogVGhlIGNoaWxkIHRhYmxlIHdlIG5lZWQgdGhlIHJlZmVyZW5jaW5nIHJvd3MgZm9yXG4gICAqL1xuICBbY2hpbGRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBoYXNod2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICAgKi9cbiAgICBbY2hpbGRSb3c6IFJlZl06IFBhcmVudFJlZjtcbiAgfTtcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0ICovXG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIHJldmVyc2UgcmVmZXJlbmNlcyBmb3IgYSBnaXZlbiBybGpzb24gb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCBjYWxjUmV2ZXJzZVJlZnMgPSAocmxqc29uOiBSbGpzb24pOiBSZXZlcnNlUmVmcyA9PiB7XG4gIGNvbnN0IHJlc3VsdDogUmV2ZXJzZVJlZnMgPSB7fTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFByZXBhcmUgZGF0YSBzdHJ1Y3R1cmVcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAoY2hpbGRUYWJsZUtleSwgdGFibGUpID0+IHtcbiAgICBjb25zdCBjaGlsZFRhYmxlOiB7IFtjaGlsZFJvd0hhc2g6IHN0cmluZ106IFBhcmVudFJlZiB9ID0ge307XG4gICAgcmVzdWx0W2NoaWxkVGFibGVLZXldID0gY2hpbGRUYWJsZTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkUm93IG9mIHRhYmxlLl9kYXRhKSB7XG4gICAgICBjaGlsZFRhYmxlW2NoaWxkUm93Ll9oYXNoXSA9IHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBHZW5lcmF0ZSByZXZlcnNlIHJlZmVyZW5jZXNcbiAgaXRlcmF0ZVRhYmxlc1N5bmMocmxqc29uLCAocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlKSA9PiB7XG4gICAgLy8gSXRlcmF0ZSBhbGwgcm93cyBvZiBlYWNoIHRhYmxlXG4gICAgZm9yIChjb25zdCBwYXJlbnRUYWJsZVJvdyBvZiBwYXJlbnRUYWJsZS5fZGF0YSkge1xuICAgICAgLy8gRmluZCBvdXQgd2hlIG90aGVyIHRhYmxlcyAmIHJvd3MgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyByb3dcbiAgICAgIC8vIFdyaXRlIHRoZXNlIGluZm9ybWF0aW9uIGludHRvIHJlc3VsdFxuICAgICAgc3dpdGNoIChwYXJlbnRUYWJsZS5fdHlwZSkge1xuICAgICAgICBjYXNlICdjb21wb25lbnRzJzpcbiAgICAgICAgICBfd3JpdGVDb21wb25lbnRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdsYXllcnMnOiB7XG4gICAgICAgICAgX3dyaXRlTGF5ZXJSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3NsaWNlSWRzJzoge1xuICAgICAgICAgIC8vIFNsaWNlIGlkcyBkbyBub3QgcmVmZXJlbmNlIG90aGVyIHRhYmxlc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnY2FrZXMnOiB7XG4gICAgICAgICAgX3dyaXRlQ2FrZVJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnYnVmZmV0cyc6IHtcbiAgICAgICAgICBfd3JpdGVCdWZmZXRSZWZzKHBhcmVudFRhYmxlS2V5LCBwYXJlbnRUYWJsZVJvdywgcmVzdWx0KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qIHY4IGlnbm9yZSBlbmQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNvbXBvbmVudFJlZnMgPSAoXG4gIHBhcmVudFRhYmxlTmFtZTogVGFibGVLZXksXG4gIHBhcmVudFJvdzogSnNvbixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IHBhcmVudENvbHVtbk5hbWUgaW4gcGFyZW50Um93KSB7XG4gICAgaWYgKHBhcmVudENvbHVtbk5hbWUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudENvbHVtbk5hbWUuZW5kc1dpdGgoJ1JlZicpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudENvbHVtbk5hbWUuc2xpY2UoMCwgLTMpO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IHBhcmVudFJvd1twYXJlbnRDb2x1bW5OYW1lXSBhcyBzdHJpbmc7XG5cbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUxheWVyUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBMYXllcixcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBjaGlsZFRhYmxlTmFtZSA9IHBhcmVudFJvdy5jb21wb25lbnRzVGFibGU7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3Qgc2xpY2VJZCBpbiBwYXJlbnRSb3cuYWRkKSB7XG4gICAgaWYgKHNsaWNlSWQuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBzbGljZUhhc2ggPSBwYXJlbnRSb3cuYWRkW3NsaWNlSWRdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShyZXN1bHQsIGNoaWxkVGFibGVOYW1lLCBzbGljZUhhc2gsIHBhcmVudFRhYmxlTmFtZSwgcGFyZW50Um93SGFzaCk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVDYWtlUmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBDYWtlLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgbGF5ZXIgaW4gcGFyZW50Um93LmxheWVycykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gbGF5ZXI7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93LmxheWVyc1tsYXllcl0gYXMgc3RyaW5nO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQnVmZmV0UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBCdWZmZXQsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudFJvdy5pdGVtcykge1xuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gaXRlbS50YWJsZTtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBpdGVtLnJlZjtcbiAgICBfd3JpdGUoXG4gICAgICByZXN1bHQsXG4gICAgICBjaGlsZFRhYmxlTmFtZSxcbiAgICAgIGNoaWxkUm93SGFzaCxcbiAgICAgIHBhcmVudFRhYmxlTmFtZSxcbiAgICAgIHBhcmVudFJvd0hhc2gsXG4gICAgKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZSA9IChcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbiAgY2hpbGRUYWJsZU5hbWU6IHN0cmluZyxcbiAgY2hpbGRSb3dIYXNoOiBzdHJpbmcsXG4gIHBhcmVudFRhYmxlTmFtZTogc3RyaW5nLFxuICBwYXJlbnRSb3dIYXNoOiBzdHJpbmcsXG4pID0+IHtcbiAgY29uc3QgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGUgPSAocmVzdWx0W2NoaWxkVGFibGVOYW1lXSA/Pz0ge30pO1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvdyA9IChyZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVtjaGlsZFJvd0hhc2hdID8/PVxuICAgIHt9KTtcblxuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdID8/PSB7fTtcbiAgcmVmZXJlbmNlc0ZvckNoaWxkVGFibGVSb3dbcGFyZW50VGFibGVOYW1lXVtwYXJlbnRSb3dIYXNoXSA/Pz0ge307XG59O1xuIl0sIm5hbWVzIjpbImUiXSwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQXVCTyxNQUFNLFFBQVE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS25CLFlBQTRCLElBQVE7QUFBUixTQUFBLEtBQUE7QUFBQSxFQUFTO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLckMsV0FBVyxvQkFBb0I7QUFDN0IsVUFBTSxXQUFXLElBQWM7QUFBQSxNQUM3QixPQUFPO0FBQUEsTUFDUCxLQUFLO0FBQUEsTUFDTCxNQUFNO0FBQUEsTUFDTixRQUFRO0FBQUEsTUFDUixRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixVQUFVO0FBQUEsTUFFVixTQUFTO0FBQUEsUUFDUCxFQUFFLEtBQUssU0FBUyxNQUFNLFNBQUE7QUFBQSxRQUN0QixFQUFFLEtBQUssT0FBTyxNQUFNLFNBQUE7QUFBQSxRQUNwQixF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
|
|
615
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VzIjpbIi4uL3NyYy9pby10b29scy50cyIsIi4uL3NyYy9pby1tZW0udHMiLCIuLi9zcmMvaW8tdGVzdC1zZXR1cC50cyIsIi4uL3NyYy9pby50cyIsIi4uL3NyYy9yZXZlcnNlLXJlZi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwIH0gZnJvbSAnQHJsanNvbi9oYXNoJztcbmltcG9ydCB7XG4gIGl0ZXJhdGVUYWJsZXMsIFJsanNvbiwgVGFibGVDZmcsIFRhYmxlS2V5LCBUYWJsZVR5cGUsIHRocm93T25JbnZhbGlkVGFibGVDZmcsXG4gIHZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9NZW0gfSBmcm9tICcuL2lvLW1lbS50cyc7XG5pbXBvcnQgeyBJbyB9IGZyb20gJy4vaW8udHMnO1xuXG5cbmV4cG9ydCB0eXBlIElvT2JzZXJ2ZXIgPSAoZGF0YTogUmxqc29uKSA9PiB2b2lkO1xuXG4vKipcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB0aGUgSW8gaW50ZXJmYWNlLlxuICovXG5leHBvcnQgY2xhc3MgSW9Ub29scyB7XG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvclxuICAgKiBAcGFyYW0gaW8gVGhlIElvIGludGVyZmFjZSB0byB1c2VcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBpbzogSW8pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHRhYmxlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHRhYmxlQ2ZncyB0YWJsZS5cbiAgICovXG4gIHN0YXRpYyBnZXQgdGFibGVDZmdzVGFibGVDZmcoKSB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBoaXA8VGFibGVDZmc+KHtcbiAgICAgIF9oYXNoOiAnJyxcbiAgICAgIGtleTogJ3RhYmxlQ2ZncycsXG4gICAgICB0eXBlOiAndGFibGVDZmdzJyxcbiAgICAgIGlzSGVhZDogZmFsc2UsXG4gICAgICBpc1Jvb3Q6IGZhbHNlLFxuICAgICAgaXNTaGFyZWQ6IHRydWUsXG4gICAgICBwcmV2aW91czogJycsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAna2V5JywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICd0eXBlJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdpc0hlYWQnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1Jvb3QnLCB0eXBlOiAnYm9vbGVhbicgfSxcbiAgICAgICAgeyBrZXk6ICdpc1NoYXJlZCcsIHR5cGU6ICdib29sZWFuJyB9LFxuICAgICAgICB7IGtleTogJ3ByZXZpb3VzJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdjb2x1bW5zJywgdHlwZTogJ2pzb25BcnJheScgfSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGFibGVDZmc7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIHJldmlzaW9ucyB0YWJsZS5cbiAgICovXG4gIGluaXRSZXZpc2lvbnNUYWJsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB0YWJsZUNmZzogVGFibGVDZmcgPSB7XG4gICAgICBrZXk6ICdyZXZpc2lvbnMnLFxuICAgICAgdHlwZTogJ3JldmlzaW9ucycsXG4gICAgICBpc0hlYWQ6IHRydWUsXG4gICAgICBpc1Jvb3Q6IHRydWUsXG4gICAgICBpc1NoYXJlZDogZmFsc2UsXG5cbiAgICAgIGNvbHVtbnM6IFtcbiAgICAgICAgeyBrZXk6ICdfaGFzaCcsIHR5cGU6ICdzdHJpbmcnIH0sXG4gICAgICAgIHsga2V5OiAndGFibGUnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3ByZWRlY2Vzc29yJywgdHlwZTogJ3N0cmluZycgfSxcbiAgICAgICAgeyBrZXk6ICdzdWNjZXNzb3InLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgICB7IGtleTogJ3RpbWVzdGFtcCcsIHR5cGU6ICdudW1iZXInIH0sXG4gICAgICAgIHsga2V5OiAnaWQnLCB0eXBlOiAnc3RyaW5nJyB9LFxuICAgICAgXSxcbiAgICB9O1xuXG4gICAgYXdhaXQgdGhpcy5pby5jcmVhdGVPckV4dGVuZFRhYmxlKHsgdGFibGVDZmcgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIEV4YW1wbGUgb2JqZWN0IGZvciB0ZXN0IHB1cnBvc2VzXG4gICAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGlvIHRvb2xzXG4gICAqL1xuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IGF3YWl0IElvTWVtLmV4YW1wbGUoKTtcbiAgICBhd2FpdCBpby5pbml0KCk7XG4gICAgYXdhaXQgaW8uaXNSZWFkeSgpO1xuICAgIHJldHVybiBuZXcgSW9Ub29scyhpbyk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3RcbiAgICovXG4gIGFzeW5jIHRocm93V2hlblRhYmxlRG9lc05vdEV4aXN0KHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4aXN0cyA9IGF3YWl0IHRoaXMuaW8udGFibGVFeGlzdHModGFibGUpO1xuICAgIGlmICghZXhpc3RzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRhYmxlIFwiJHt0YWJsZX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGlmIGFueSBvZiB0aGUgdGFibGVzIGluIHJsanNvbiBkbyBub3QgZXhpc3RcbiAgICogQHBhcmFtIHJsanNvbiAtIFRoZSBSbGpzb24gb2JqZWN0IHRvIGNoZWNrXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJsanNvbjogUmxqc29uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGl0ZXJhdGVUYWJsZXMocmxqc29uLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZXhpc3RzID0gYXdhaXQgdGhpcy5pby50YWJsZUV4aXN0cyh0YWJsZUtleSk7XG4gICAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGVLZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnN0IG1pc3NpbmdUYWJsZXMgPSAoZSBhcyBBcnJheTxhbnk+KS5tYXAoKGUpID0+IGUudGFibGVLZXkpO1xuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgZm9sbG93aW5nIHRhYmxlcyBkbyBub3QgZXhpc3Q6ICR7bWlzc2luZ1RhYmxlcy5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHRhYmxlIGNmZ3Mgb2YgYWxsIHRhYmxlc1xuICAgKiBAcmV0dXJucyBUaGUgdGFibGUgY29uZmlndXJhdGlvbiBvZiBhbGwgdGFibGVzXG4gICAqL1xuICBhc3luYyB0YWJsZUNmZ3MoKTogUHJvbWlzZTxUYWJsZUNmZ1tdPiB7XG4gICAgY29uc3QgdGFibGVzID0gYXdhaXQgdGhpcy5pby5yYXdUYWJsZUNmZ3MoKTtcblxuICAgIC8vIFRha2UgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggdHlwZSBrZXlcbiAgICBjb25zdCBuZXdlc3RWZXJzaW9uOiBSZWNvcmQ8VGFibGVLZXksIFRhYmxlQ2ZnPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSB0YWJsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IHRhYmxlID0gdGFibGVzW2ldO1xuICAgICAgY29uc3QgZXhpc3RpbmcgPSBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV07XG4gICAgICAvKiB2OCBpZ25vcmUgc3RhcnQgKi9cbiAgICAgIGlmICghZXhpc3RpbmcgfHwgZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPCB0YWJsZS5jb2x1bW5zLmxlbmd0aCkge1xuICAgICAgICBuZXdlc3RWZXJzaW9uW3RhYmxlLmtleV0gPSB0YWJsZTtcbiAgICAgIH1cbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9XG5cbiAgICAvLyBTb3J0IHRoZSB0YWJsZXMgYnkga2V5XG4gICAgY29uc3QgcmVzdWx0RGF0YSA9IE9iamVjdC52YWx1ZXMobmV3ZXN0VmVyc2lvbikuc29ydCgoYSwgYikgPT4ge1xuICAgICAgaWYgKGEua2V5IDwgYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGEua2V5ID4gYi5rZXkpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzdWx0RGF0YTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbGlzdCB3aXRoIGFsbCB0YWJsZSBuYW1lc1xuICAgKi9cbiAgYXN5bmMgYWxsVGFibGVLZXlzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgdGhpcy50YWJsZUNmZ3MoKSkubWFwKChlKSA9PiBlLmtleSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIG9mIGEgZ2l2ZW4gdGFibGVcbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmc+IHtcbiAgICBjb25zdCB0YWJsZUNmZyA9IGF3YWl0IHRoaXMudGFibGVDZmdPck51bGwodGFibGUpO1xuICAgIGlmICghdGFibGVDZmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGFibGUgXCIke3RhYmxlfVwiIG5vdCBmb3VuZGApO1xuICAgIH1cblxuICAgIHJldHVybiB0YWJsZUNmZyE7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGdpdmVuIHRhYmxlIG9yIG51bGwgaWYgaXQgZG9lcyBub3QgZXhpc3QuXG5cbiAgICovXG4gIGFzeW5jIHRhYmxlQ2ZnT3JOdWxsKHRhYmxlOiBUYWJsZUtleSk6IFByb21pc2U8VGFibGVDZmcgfCBudWxsPiB7XG4gICAgY29uc3QgdGFibGVDZmdzID0gYXdhaXQgdGhpcy50YWJsZUNmZ3MoKTtcbiAgICBjb25zdCB0YWJsZUNmZyA9IHRhYmxlQ2Zncy5maW5kKChlKSA9PiBlLmtleSA9PT0gdGFibGUpO1xuICAgIHJldHVybiB0YWJsZUNmZyA/PyBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBjb2x1bW4gbmFtZXMgb2YgYSBnaXZlbiB0YWJsZVxuICAgKi9cbiAgYXN5bmMgYWxsQ29sdW1uS2V5cyh0YWJsZTogVGFibGVLZXkpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCByZXN1bHQgPSB0YWJsZUNmZy5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyB3aGVuIGEgY29sdW1uIGRvZXMgbm90IGV4aXN0IGluIGEgZ2l2ZW4gdGFibGVcbiAgICogQHBhcmFtIHRhYmxlIC0gVGhlIHRhYmxlIHRvIGNoZWNrXG4gICAqIEBwYXJhbSBjb2x1bW5zIC0gVGhlIGNvbHVtbiB0byBjaGVja1xuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuQ29sdW1uRG9lc05vdEV4aXN0KFxuICAgIHRhYmxlOiBUYWJsZUtleSxcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBhd2FpdCB0aGlzLnRhYmxlQ2ZnKHRhYmxlKTtcbiAgICBjb25zdCBjb2x1bW5LZXlzID0gdGFibGVDZmcuY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmtleSk7XG4gICAgY29uc3QgbWlzc2luZ0NvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChjb2x1bW4pID0+ICFjb2x1bW5LZXlzLmluY2x1ZGVzKGNvbHVtbiksXG4gICAgKTtcbiAgICBpZiAobWlzc2luZ0NvbHVtbnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGZvbGxvd2luZyBjb2x1bW5zIGRvIG5vdCBleGlzdCBpbiB0YWJsZSBcIiR7dGFibGV9XCI6ICR7bWlzc2luZ0NvbHVtbnMuam9pbihcbiAgICAgICAgICAnLCAnLFxuICAgICAgICApfS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIHdoZW4gYSB0YWJsZSB1cGRhdGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCB0YWJsZVxuICAgKiBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgYXN5bmMgdGhyb3dXaGVuVGFibGVJc05vdENvbXBhdGlibGUodXBkYXRlOiBUYWJsZUNmZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGBJbnZhbGlkIHVwZGF0ZSBvZiB0YWJsZSBhYmxlIFwiJHt1cGRhdGUua2V5fVwiYDtcblxuICAgIHRocm93T25JbnZhbGlkVGFibGVDZmcodXBkYXRlKTtcblxuICAgIC8vIENoZWNrIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0YWJsZVxuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy50YWJsZUNmZ09yTnVsbCh1cGRhdGUua2V5KTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIC8vIEhhdmUgY29sdW1ucyBiZWVuIGRlbGV0ZWQ/XG4gICAgICBpZiAoZXhpc3RpbmcuY29sdW1ucy5sZW5ndGggPiB1cGRhdGUuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbktleXMgPSBleGlzdGluZy5jb2x1bW5zXG4gICAgICAgICAgLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ua2V5KVxuICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiAhdXBkYXRlLmNvbHVtbnMuc29tZSgoY29sdW1uKSA9PiBjb2x1bW4ua2V5ID09PSBrZXkpLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChkZWxldGVkQ29sdW1uS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29uc3QgZGVsZXRlZENvbHVtbnMgPSBkZWxldGVkQ29sdW1uS2V5cy5qb2luKCcsICcpO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IENvbHVtbnMgbXVzdCBub3QgYmUgZGVsZXRlZC4gYCArXG4gICAgICAgICAgICAgIGBEZWxldGVkIGNvbHVtbnM6ICR7ZGVsZXRlZENvbHVtbnN9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiBrZXlzIGNoYW5nZWQ/XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4aXN0aW5nLmNvbHVtbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYmVmb3JlID0gZXhpc3RpbmcuY29sdW1uc1tpXS5rZXk7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBpZiAoYmVmb3JlICE9PSBhZnRlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGAke3ByZWZpeH06IGAgK1xuICAgICAgICAgICAgICBgQ29sdW1uIGtleXMgbXVzdCBub3QgY2hhbmdlISBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiBcIiR7YmVmb3JlfVwiIHdhcyByZW5hbWVkIGludG8gXCIke2FmdGVyfVwiLmAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYXZlIGNvbHVtbiB0eXBlcyBjaGFuZ2VkP1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleGlzdGluZy5jb2x1bW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGV4aXN0aW5nLmNvbHVtbnNbaV0ua2V5O1xuICAgICAgICBjb25zdCBiZWZvcmUgPSBleGlzdGluZy5jb2x1bW5zW2ldLnR5cGU7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gdXBkYXRlLmNvbHVtbnNbaV0udHlwZTtcbiAgICAgICAgaWYgKGJlZm9yZSAhPT0gYWZ0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgJHtwcmVmaXh9OiBgICtcbiAgICAgICAgICAgICAgYENvbHVtbiB0eXBlcyBtdXN0IG5vdCBjaGFuZ2UhIGAgK1xuICAgICAgICAgICAgICBgVHlwZSBvZiBjb2x1bW4gXCIke2NvbHVtbn1cIiB3YXMgY2hhbmdlZCBmcm9tIFwiJHtiZWZvcmV9XCIgdG8gJHthZnRlcn0uYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBpZiB0aGUgZGF0YSBpbiB0aGUgdGFibGUgZG8gbm90IG1hdGNoIHRoZSB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBhc3luYyB0aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcoZGF0YTogUmxqc29uKSB7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgYXdhaXQgaXRlcmF0ZVRhYmxlcyhkYXRhLCBhc3luYyAodGFibGVLZXkpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlQ2ZnID0gYXdhaXQgdGhpcy50YWJsZUNmZyh0YWJsZUtleSk7XG4gICAgICBjb25zdCB0YWJsZSA9IGRhdGFbdGFibGVLZXldO1xuXG4gICAgICAvLyBJZ25vcmUgdGFibGVDZmdzIHRhYmxlXG4gICAgICBpZiAodGFibGUuX3R5cGUgPT09ICd0YWJsZUNmZ3MnKSByZXR1cm47XG5cbiAgICAgIGVycm9ycy5wdXNoKC4uLnZhbGlkYXRlUmxqc29uQWdhaW5zdFRhYmxlQ2ZnKHRhYmxlLl9kYXRhLCB0YWJsZUNmZykpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYWJsZSBkYXRhIGRvZXMgbm90IG1hdGNoIHRoZSBjb25maWd1cmF0aW9uLlxcblxcbkVycm9yczpcXG4ke2Vycm9yc1xuICAgICAgICAgIC5tYXAoKGUpID0+IGAtICR7ZX1gKVxuICAgICAgICAgIC5qb2luKCdcXG4nKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU29ydHMgdGhlIGRhdGEgb2YgYSB0YWJsZSBieSB0aGUgaGFzaCBhbmQgdXBkYXRlcyB0aGUgdGFibGUgaGFzaCBpbiBwbGFjZVxuICAgKi9cbiAgc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGFibGU6IFRhYmxlVHlwZSk6IHZvaWQge1xuICAgIHRhYmxlLl9kYXRhLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hBID0gYS5faGFzaCBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBoYXNoQiA9IGIuX2hhc2ggYXMgc3RyaW5nO1xuICAgICAgaWYgKGhhc2hBIDwgaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgfVxuICAgICAgaWYgKGhhc2hBID4gaGFzaEIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIC8qIHY4IGlnbm9yZSBzdGFydCAqL1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gMDtcbiAgICAgIC8qIHY4IGlnbm9yZSBlbmQgKi9cbiAgICB9KTtcblxuICAgIHRhYmxlLl9oYXNoID0gJyc7XG4gICAgaGlwKHRhYmxlLCB7XG4gICAgICB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UsXG4gICAgICB0aHJvd09uV3JvbmdIYXNoZXM6IGZhbHNlLFxuICAgIH0pO1xuICB9XG59XG4iLCIvLyBAbGljZW5zZVxuLy8gQ29weXJpZ2h0IChjKSAyMDI1IFJsanNvblxuLy9cbi8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IHRlcm1zIHRoYXQgY2FuIGJlXG4vLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluIHRoZSByb290IG9mIHRoaXMgcGFja2FnZS5cblxuaW1wb3J0IHsgaGlwLCBoc2ggfSBmcm9tICdAcmxqc29uL2hhc2gnO1xuaW1wb3J0IHsgSXNSZWFkeSB9IGZyb20gJ0BybGpzb24vaXMtcmVhZHknO1xuaW1wb3J0IHsgY29weSwgZXF1YWxzLCBKc29uVmFsdWUgfSBmcm9tICdAcmxqc29uL2pzb24nO1xuaW1wb3J0IHtcbiAgQ29udGVudFR5cGUsIGl0ZXJhdGVUYWJsZXNTeW5jLCBSbGpzb24sIFRhYmxlQ2ZnLCBUYWJsZUtleSwgVGFibGVUeXBlXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuaW1wb3J0IHsgSW9Ub29scyB9IGZyb20gJy4vaW8tdG9vbHMudHMnO1xuaW1wb3J0IHsgSW8gfSBmcm9tICcuL2lvLnRzJztcblxuXG4vKipcbiAqIEluLU1lbW9yeSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmxqc29uIElvIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIElvTWVtIGltcGxlbWVudHMgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gQ29uc3RydWN0b3IgJiBleGFtcGxlXG5cbiAgaW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgIHJldHVybiB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLl9pc09wZW4gPSBmYWxzZTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc09wZW47XG4gIH1cblxuICBzdGF0aWMgZXhhbXBsZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBpbyA9IG5ldyBJb01lbSgpO1xuICAgIGF3YWl0IGlvLmluaXQoKTtcbiAgICByZXR1cm4gaW87XG4gIH07XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYWxcbiAgaXNSZWFkeSgpIHtcbiAgICByZXR1cm4gdGhpcy5faXNSZWFkeS5wcm9taXNlO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIER1bXBcblxuICBkdW1wKCk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXAoKTtcbiAgfVxuXG4gIGFzeW5jIGR1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgcmV0dXJuIHRoaXMuX2R1bXBUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcblxuICBhc3luYyBjb250ZW50VHlwZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Q29udGVudFR5cGU+IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGVudFR5cGUocmVxdWVzdCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUm93c1xuXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuICB9KTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZFJvd3MocmVxdWVzdCk7XG4gIH1cblxuICBhc3luYyByb3dDb3VudCh0YWJsZTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB0YWJsZURhdGEgPSB0aGlzLl9tZW1bdGFibGVdIGFzIFRhYmxlVHlwZTtcbiAgICBpZiAoIXRhYmxlRGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUYWJsZSBcIiR7dGFibGV9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGFibGVEYXRhLl9kYXRhLmxlbmd0aCk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gV3JpdGVcblxuICB3cml0ZShyZXF1ZXN0OiB7IGRhdGE6IFJsanNvbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dyaXRlKHJlcXVlc3QpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFRhYmxlIG1hbmFnZW1lbnRcbiAgYXN5bmMgdGFibGVFeGlzdHModGFibGVLZXk6IFRhYmxlS2V5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICByZXR1cm4gdGFibGUgPyB0cnVlIDogZmFsc2U7XG4gIH1cblxuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0KTtcbiAgfVxuXG4gIGFzeW5jIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+IHtcbiAgICBjb25zdCB0YWJsZXMgPSB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhIGFzIFRhYmxlQ2ZnW107XG4gICAgcmV0dXJuIHRhYmxlcztcbiAgfVxuXG4gIC8vICMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiAgLy8gUHJpdmF0ZVxuICAvLyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG5cbiAgcHJpdmF0ZSBfaW9Ub29scyE6IElvVG9vbHM7XG5cbiAgcHJpdmF0ZSBfaXNSZWFkeSA9IG5ldyBJc1JlYWR5KCk7XG4gIHByaXZhdGUgX2lzT3BlbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX21lbTogUmxqc29uID0gaGlwKHt9IGFzIFJsanNvbik7XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2luaXQoKSB7XG4gICAgdGhpcy5faW9Ub29scyA9IG5ldyBJb1Rvb2xzKHRoaXMpO1xuICAgIHRoaXMuX2luaXRUYWJsZUNmZ3MoKTtcbiAgICB0aGlzLl91cGRhdGVHbG9iYWxIYXNoKCk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy5pbml0UmV2aXNpb25zVGFibGUoKTtcbiAgICBoc2godGhpcy5fbWVtKTtcblxuICAgIHRoaXMuX2lzUmVhZHkucmVzb2x2ZSgpO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2luaXRUYWJsZUNmZ3MgPSAoKSA9PiB7XG4gICAgY29uc3QgdGFibGVDZmcgPSBJb1Rvb2xzLnRhYmxlQ2Znc1RhYmxlQ2ZnO1xuXG4gICAgdGhpcy5fbWVtLnRhYmxlQ2ZncyA9IGhpcCh7XG4gICAgICBfdHlwZTogJ3RhYmxlQ2ZncycsXG4gICAgICBfZGF0YTogW3RhYmxlQ2ZnXSxcbiAgICAgIF90YWJsZUNmZzogdGFibGVDZmcuX2hhc2ggYXMgc3RyaW5nLFxuICAgIH0pO1xuICB9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVHbG9iYWxIYXNoKCkge1xuICAgICh0aGlzLl9tZW0gYXMgYW55KS5faGFzaCA9ICcnO1xuICAgIGhpcCh0aGlzLl9tZW0sIHtcbiAgICAgIHVwZGF0ZUV4aXN0aW5nSGFzaGVzOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF91cGRhdGVUYWJsZUhhc2godGFibGVLZXk6IFRhYmxlS2V5KSB7XG4gICAgY29uc3QgdGFibGUgPSB0aGlzLl9tZW1bdGFibGVLZXldIGFzIFRhYmxlVHlwZTtcbiAgICB0YWJsZS5faGFzaCA9ICcnO1xuICAgIGhpcCh0YWJsZSwgeyB1cGRhdGVFeGlzdGluZ0hhc2hlczogZmFsc2UgfSk7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY3JlYXRlT3JFeHRlbmRUYWJsZShyZXF1ZXN0OiB7XG4gICAgdGFibGVDZmc6IFRhYmxlQ2ZnO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRhYmxlIGNvbmZpZyBpcyBjb21wYXRpYmxlXG4gICAgLy8gd2l0aCBhbiBwb3RlbnRpYWwgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZUNmZyA9IHJlcXVlc3QudGFibGVDZmc7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZUlzTm90Q29tcGF0aWJsZSh0YWJsZUNmZyk7XG5cbiAgICBjb25zdCB7IGtleSB9ID0gdGFibGVDZmc7XG5cbiAgICAvLyBSZWNyZWF0ZSBoYXNoZXMgaW4gdGhlIGNhc2UgdGhlIGV4aXN0aW5nIGhhc2hlcyBhcmUgd3JvbmdcbiAgICBjb25zdCBuZXdDb25maWcgPSBoc2godGFibGVDZmcpO1xuXG4gICAgLy8gRmluZCBhbiBleGlzdGluZyB0YWJsZSBjb25maWcgd2l0aCB0aGUgc2FtZSBoYXNoXG4gICAgY29uc3QgZXhpc3RpbmdDb25maWcgPSBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRhYmxlQ2ZnT3JOdWxsKGtleSk7XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIGlmICghZXhpc3RpbmdDb25maWcpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZywga2V5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXh0ZW5kVGFibGUoZXhpc3RpbmdDb25maWcsIG5ld0NvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgX2NyZWF0ZVRhYmxlKG5ld0NvbmZpZzogVGFibGVDZmcsIHRhYmxlS2V5OiBUYWJsZUtleSkge1xuICAgIC8vIFdyaXRlIHRoZSB0YWJsZSBjb25maWcgaW50byB0aGUgZGF0YWJhc2VcbiAgICBuZXdDb25maWcgPSBoc2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9tZW0udGFibGVDZmdzLl9kYXRhLnB1c2gobmV3Q29uZmlnKTtcbiAgICB0aGlzLl9pb1Rvb2xzLnNvcnRUYWJsZURhdGFBbmRVcGRhdGVIYXNoKHRoaXMuX21lbS50YWJsZUNmZ3MpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdGFibGUgYW5kIHdyaXRlIGl0IGludG8gdGhlIGRhdGFiYXNlXG4gICAgY29uc3QgdGFibGU6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiBuZXdDb25maWcudHlwZSxcbiAgICAgIF9kYXRhOiBbXSxcbiAgICAgIF90YWJsZUNmZzogbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZyxcbiAgICB9O1xuXG4gICAgdGhpcy5fbWVtW3RhYmxlS2V5XSA/Pz0gaGlwKHRhYmxlKTtcblxuICAgIC8vIFVwZGF0ZSBoYXNoZXNcbiAgICB0aGlzLl91cGRhdGVUYWJsZUhhc2godGFibGVLZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIF9leHRlbmRUYWJsZShleGlzdGluZ0NvbmZpZzogVGFibGVDZmcsIG5ld0NvbmZpZzogVGFibGVDZmcpIHtcbiAgICAvLyBObyBjb2x1bW5zIGFkZGVkPyBSZXR1cm4uXG4gICAgaWYgKGV4aXN0aW5nQ29uZmlnLmNvbHVtbnMubGVuZ3RoID09PSBuZXdDb25maWcuY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBXcml0ZSB0aGUgbmV3IHRhYmxlIGNvbmZpZyBpbnRvIHRoZSBkYXRhYmFzZVxuICAgIG5ld0NvbmZpZyA9IGhzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX21lbS50YWJsZUNmZ3MuX2RhdGEucHVzaChuZXdDb25maWcpO1xuICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2godGhpcy5fbWVtLnRhYmxlQ2Zncyk7XG5cbiAgICAvLyBVcGRhdGUgdGhlIGNvbmZpZyBvZiB0aGUgZXhpc3RpbmcgdGFibGVcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtuZXdDb25maWcua2V5XSBhcyBUYWJsZVR5cGU7XG4gICAgdGFibGUuX3RhYmxlQ2ZnID0gbmV3Q29uZmlnLl9oYXNoIGFzIHN0cmluZztcblxuICAgIC8vIFVwZGF0ZSB0aGUgaGFzaGVzXG4gICAgdGhpcy5fdXBkYXRlVGFibGVIYXNoKG5ld0NvbmZpZy5rZXkpO1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuXG4gIHByaXZhdGUgYXN5bmMgX2R1bXAoKTogUHJvbWlzZTxSbGpzb24+IHtcbiAgICByZXR1cm4gY29weSh0aGlzLl9tZW0pO1xuICB9XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIHByaXZhdGUgYXN5bmMgX2R1bXBUYWJsZShyZXF1ZXN0OiB7IHRhYmxlOiBzdHJpbmcgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgIHJldHVybiB7XG4gICAgICBbcmVxdWVzdC50YWJsZV06IGNvcHkodGFibGUpLFxuICAgIH07XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcblxuICAgIHJldHVybiAodGhpcy5fbWVtW3JlcXVlc3QudGFibGVdIGFzIFRhYmxlVHlwZSkuX3R5cGU7XG4gIH1cblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgcHJpdmF0ZSBhc3luYyBfd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFkZGVkRGF0YSA9IGhzaChyZXF1ZXN0LmRhdGEpO1xuICAgIHRoaXMuX3JlbW92ZU51bGxWYWx1ZXMoYWRkZWREYXRhKTtcbiAgICBjb25zdCB0YWJsZXMgPSBPYmplY3Qua2V5cyhhZGRlZERhdGEpO1xuICAgIGhzaChhZGRlZERhdGEpO1xuXG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZXNEb05vdEV4aXN0KHJlcXVlc3QuZGF0YSk7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURhdGFEb2VzTm90TWF0Y2hDZmcocmVxdWVzdC5kYXRhKTtcblxuICAgIGZvciAoY29uc3QgdGFibGUgb2YgdGFibGVzKSB7XG4gICAgICBpZiAodGFibGUuc3RhcnRzV2l0aCgnXycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvbGRUYWJsZSA9IHRoaXMuX21lbVt0YWJsZV0gYXMgVGFibGVUeXBlO1xuICAgICAgY29uc3QgbmV3VGFibGUgPSBhZGRlZERhdGFbdGFibGVdIGFzIFRhYmxlVHlwZTtcblxuICAgICAgLy8gVGFibGUgZXhpc3RzLiBNZXJnZSBkYXRhXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbmV3VGFibGUuX2RhdGEpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IGl0ZW0uX2hhc2g7XG4gICAgICAgIGNvbnN0IGV4aXN0cyA9IG9sZFRhYmxlLl9kYXRhLmZpbmQoKGkpID0+IGkuX2hhc2ggPT09IGhhc2gpO1xuICAgICAgICBpZiAoIWV4aXN0cykge1xuICAgICAgICAgIG9sZFRhYmxlLl9kYXRhLnB1c2goaXRlbSBhcyBhbnkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lvVG9vbHMuc29ydFRhYmxlRGF0YUFuZFVwZGF0ZUhhc2gob2xkVGFibGUpO1xuICAgIH1cblxuICAgIC8vIFJlY2FsYyBtYWluIGhhc2hlc1xuICAgIHRoaXMuX3VwZGF0ZUdsb2JhbEhhc2goKTtcbiAgfVxuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICBwcml2YXRlIGFzeW5jIF9yZWFkUm93cyhyZXF1ZXN0OiB7XG4gICAgdGFibGU6IHN0cmluZztcbiAgICB3aGVyZTogeyBbY29sdW1uOiBzdHJpbmddOiBKc29uVmFsdWUgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPiB7XG4gICAgYXdhaXQgdGhpcy5faW9Ub29scy50aHJvd1doZW5UYWJsZURvZXNOb3RFeGlzdChyZXF1ZXN0LnRhYmxlKTtcbiAgICBhd2FpdCB0aGlzLl9pb1Rvb2xzLnRocm93V2hlbkNvbHVtbkRvZXNOb3RFeGlzdChcbiAgICAgIHJlcXVlc3QudGFibGUsXG4gICAgICBPYmplY3Qua2V5cyhyZXF1ZXN0LndoZXJlKSxcbiAgICApO1xuXG4gICAgLy8gUmVhZCB0YWJsZSBmcm9tIGRhdGFcbiAgICBjb25zdCB0YWJsZSA9IHRoaXMuX21lbVtyZXF1ZXN0LnRhYmxlXSBhcyBUYWJsZVR5cGU7XG5cbiAgICAvLyBGaWx0ZXIgdGFibGUgZGF0YVxuICAgIGNvbnN0IHRhYmxlRGF0YUZpbHRlcmVkID0gdGFibGUuX2RhdGEuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIGluIHJlcXVlc3Qud2hlcmUpIHtcbiAgICAgICAgY29uc3QgYSA9IHJvd1tjb2x1bW5dO1xuICAgICAgICBjb25zdCBiID0gcmVxdWVzdC53aGVyZVtjb2x1bW5dO1xuICAgICAgICBpZiAoYiA9PT0gbnVsbCAmJiBhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZXF1YWxzKGEsIGIpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcblxuICAgIC8vIENyZWF0ZSBhbiB0YWJsZVxuICAgIGNvbnN0IHRhYmxlRmlsdGVyZWQ6IFRhYmxlVHlwZSA9IHtcbiAgICAgIF90eXBlOiB0YWJsZS5fdHlwZSxcbiAgICAgIF9kYXRhOiB0YWJsZURhdGFGaWx0ZXJlZCxcbiAgICB9O1xuXG4gICAgdGhpcy5faW9Ub29scy5zb3J0VGFibGVEYXRhQW5kVXBkYXRlSGFzaCh0YWJsZUZpbHRlcmVkKTtcblxuICAgIGNvbnN0IHJlc3VsdDogUmxqc29uID0ge1xuICAgICAgW3JlcXVlc3QudGFibGVdOiB0YWJsZUZpbHRlcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgX3JlbW92ZU51bGxWYWx1ZXMocmxqc29uOiBSbGpzb24pIHtcbiAgICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sICh0YWJsZSkgPT4ge1xuICAgICAgY29uc3QgZGF0YSA9IHJsanNvblt0YWJsZV0uX2RhdGE7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7XG4gICAgICAgICAgaWYgKHJvd1trZXldID09PSBudWxsKSB7XG4gICAgICAgICAgICBkZWxldGUgcm93W2tleV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBJbywgSW9NZW0gfSBmcm9tICcuL2luZGV4LnRzJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogSW8gaW1wbGVtZW50YXRpb24gbmVlZCB0byBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gYmUgdXNlZCBpblxuICogY29uZm9ybWFuY2UgdGVzdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9UZXN0U2V0dXAge1xuICAvKiogc2V0dXAgYmVmb3JlIHRoZSBzaW5nbGUgc2V0dXBzICovXG4gIGJlZm9yZUFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgdGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKiBAcmV0dXJucyBUaGUgaW8gaW1wbGVtZW50YXRpb24uXG4gICAqL1xuICBiZWZvcmVFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUZWFycyBkb3duIHRoZSBpbyBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHJldHVybnMgVGhlIGlvIGltcGxlbWVudGF0aW9uLlxuICAgKi9cbiAgYWZ0ZXJFYWNoOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBjbGVhbnVwIGFmdGVyIGFsbCB0ZXN0cyAqL1xuICBhZnRlckFsbDogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGlvIGltcGxlbWVudGF0aW9uIHRvIGJlIHVzZWQgaW4gdGhlIGNvbmZvcm1hbmNlIHRlc3RzLlxuICAgKi9cbiAgaW86IElvO1xufVxuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuLy8gRXhhbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW9UZXN0U2V0dXAgaW50ZXJmYWNlXG5leHBvcnQgY29uc3QgZXhhbXBsZVRlc3RTZXR1cCA9ICgpOiBJb1Rlc3RTZXR1cCA9PiB7XG4gIHJldHVybiB7XG4gICAgaW86IG5ldyBJb01lbSgpLFxuICAgIGJlZm9yZUFsbDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGFueSBhZGRpdGlvbmFsIHNldHVwIHJlcXVpcmVkIGJlZm9yZSBpbml0LlxuICAgICAgLy8gQ3VycmVudGx5LCBpdCBkb2VzIG5vdGhpbmcuXG4gICAgfSxcblxuICAgIGJlZm9yZUVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGlvIGltcGxlbWVudGF0aW9uXG4gICAgfSxcbiAgICBhZnRlckVhY2g6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRlYXIgZG93biB0aGUgaW8gaW1wbGVtZW50YXRpb25cbiAgICB9LFxuXG4gICAgYWZ0ZXJBbGw6IGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGZvciBhbnkgYWRkaXRpb25hbCBjbGVhbnVwIGFmdGVyIHRlYXJEb3duLlxuICAgIH0sXG4gIH07XG59O1xuIiwiLy8gQGxpY2Vuc2Vcbi8vIENvcHlyaWdodCAoYykgMjAyNSBSbGpzb25cbi8vXG4vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSB0ZXJtcyB0aGF0IGNhbiBiZVxuLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGlzIHBhY2thZ2UuXG5cbmltcG9ydCB7IEpzb25WYWx1ZSB9IGZyb20gJ0BybGpzb24vanNvbic7XG5pbXBvcnQgeyBDb250ZW50VHlwZSwgUmxqc29uLCBUYWJsZUNmZywgVGFibGVLZXkgfSBmcm9tICdAcmxqc29uL3JsanNvbic7XG5cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmV4cG9ydCBpbnRlcmZhY2UgSW8ge1xuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gR2VuZXJhbFxuXG4gIC8qKiBTdGFydHMgdGhlIGluaXRpYWxpemF0aW9uICovXG4gIGluaXQoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKiogQ2xvc2VzIHRoZSBpbyAqL1xuICBjbG9zZSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgaW8gaXMgb3BlbmVkICovXG4gIGlzT3BlbjogYm9vbGVhbjtcblxuICAvKiogQSBwcm9taXNlIHJlc29sdmluZyBvbmNlIHRoZSBJbyBpbnRlcmZhY2UgaXMgcmVhZHlcbiAgICpcbiAgICog8J+SoSBVc2UgQHJsanNvbi9pcy1yZWFkeVxuICAgKi9cbiAgaXNSZWFkeSgpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBEdW1wXG5cbiAgLyoqIFJldHVybnMgdGhlIGNvbXBsZXRlIGRiIGNvbnRlbnQgYXMgUmxqc29uICovXG4gIGR1bXAoKTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8qKiBSZXR1cm5zIHRoZSBkdW1wIG9mIGEgY29tcGxldGUgdGFibGUgKi9cbiAgZHVtcFRhYmxlKHJlcXVlc3Q6IHsgdGFibGU6IHN0cmluZyB9KTogUHJvbWlzZTxSbGpzb24+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBNZXRhIERhdGFcbiAgY29udGVudFR5cGUocmVxdWVzdDogeyB0YWJsZTogc3RyaW5nIH0pOiBQcm9taXNlPENvbnRlbnRUeXBlPjtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gVGFibGVzXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFibGUgZXhpc3RzXG4gICAqL1xuICB0YWJsZUV4aXN0cyh0YWJsZUtleTogVGFibGVLZXkpOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdGFibGUgd2l0aCBhIGdpdmVuIGNvbmZpZy5cbiAgICogSWYgdGhlIHRhYmxlIGFscmVhZHkgZXhpc3RzLCBuZXcgY29sdW1ucyBhcmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIHRhYmxlLlxuICAgKiBJZiB0aGUgdGFibGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gY29uZmlnLlxuICAgKiBJZiB0aGUgdGFibGUgZXhpc3RzIGFuZCBjb2x1bW5zIGFyZSByZW1vdmVkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqIElmIHRoZSB0YWJsZSBleGlzdHMgYW5kIHRoZSBjb2x1bW4gdHlwZSBpcyBjaGFuZ2VkLCBhbiBlcnJvciBpcyB0aHJvd24uXG4gICAqL1xuICBjcmVhdGVPckV4dGVuZFRhYmxlKHJlcXVlc3Q6IHsgdGFibGVDZmc6IFRhYmxlQ2ZnIH0pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEganNvbiBzdHJ1Y3R1cmUgcmV0dXJuaW5nIGN1cnJlbnQgdGFibGUgY29uZmlndXJhdGlvbnNcbiAgICovXG4gIHJhd1RhYmxlQ2ZncygpOiBQcm9taXNlPFRhYmxlQ2ZnW10+O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuICAvLyBXcml0ZVxuXG4gIC8qKiBXcml0ZXMgUmxqc29uIGRhdGEgaW50byB0aGUgZGF0YWJhc2UgKi9cbiAgd3JpdGUocmVxdWVzdDogeyBkYXRhOiBSbGpzb24gfSk6IFByb21pc2U8dm9pZD47XG5cbiAgLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIFJlYWQgcm93c1xuXG4gIC8qKiBRdWVyaWVzIGEgbGlzdCBvZiByb3dzICovXG4gIHJlYWRSb3dzKHJlcXVlc3Q6IHtcbiAgICB0YWJsZTogc3RyaW5nO1xuICAgIHdoZXJlOiB7IFtjb2x1bW46IHN0cmluZ106IEpzb25WYWx1ZSB8IG51bGwgfTtcbiAgfSk6IFByb21pc2U8Umxqc29uPjtcblxuICAvKiogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhlIGdpdmVuIHRhYmxlICovXG4gIHJvd0NvdW50KHRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj47XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5leHBvcnQgY29uc3QgZXhhbXBsZUlvID1cbiAgJ0NoZWNrb3V0IEBybGpzb24vaW8tbWVtIGZvciBhbiBleGFtcGxlIGltcGxlbWVudGF0aW9uJztcbiIsIi8vIEBsaWNlbnNlXG4vLyBDb3B5cmlnaHQgKGMpIDIwMjUgUmxqc29uXG4vL1xuLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgdGVybXMgdGhhdCBjYW4gYmVcbi8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhpcyBwYWNrYWdlLlxuXG5pbXBvcnQgeyBKc29uIH0gZnJvbSAnQHJsanNvbi9qc29uJztcbmltcG9ydCB7XG4gIEJ1ZmZldCxcbiAgQ2FrZSxcbiAgaXRlcmF0ZVRhYmxlc1N5bmMsXG4gIExheWVyLFxuICBSZWYsXG4gIFJsanNvbixcbiAgVGFibGVLZXksXG59IGZyb20gJ0BybGpzb24vcmxqc29uJztcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogRGVzY3JpYmVzIGEgcm93IHRoYXQgcmVmZXJlbmNlcyBhIGNoaWxkIHRhYmxlIHJvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcmVudFJlZiB7XG4gIC8qKlxuICAgKiBUaGUgcGFyZW50IHRhYmxlIHRoYXQgcmVmZXJlbmNlcyB0aGUgY2hpbGQgdGFibGVcbiAgICovXG4gIFtwYXJlbnRUYWJsZTogVGFibGVLZXldOiB7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcmVudCByb3cgdGhhdCByZWZlcmVuY2VzIHRoZSBjaGlsZCByb3dcbiAgICAgKi9cbiAgICBbcGFyZW50Um93OiBSZWZdOiB7XG4gICAgICAvKipcbiAgICAgICAqIERldGFpbHMgYWJvdXQgdGhlIHJlZmVyZW5jZSwgZS5nLiBhbiBhcnJheSBpbmRleCBldGMuXG4gICAgICAgKi9cbiAgICAgIGRldGFpbHM/OiBKc29uO1xuICAgIH07XG4gIH07XG59XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcGFyZW50IHRhYmxlIHJvd3MgcmVmZXJlbmNpbmcgYSBjaGlsZCB0YWJsZSByb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlUmVmcyB7XG4gIC8qKlxuICAgKiBUaGUgY2hpbGQgdGFibGUgd2UgbmVlZCB0aGUgcmVmZXJlbmNpbmcgcm93cyBmb3JcbiAgICovXG4gIFtjaGlsZFRhYmxlOiBUYWJsZUtleV06IHtcbiAgICAvKipcbiAgICAgKiBUaGUgcm93IGhhc2h3ZSBuZWVkIHRoZSByZWZlcmVuY2luZyByb3dzIGZvclxuICAgICAqL1xuICAgIFtjaGlsZFJvdzogUmVmXTogUGFyZW50UmVmO1xuICB9O1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgKi9cblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgcmV2ZXJzZSByZWZlcmVuY2VzIGZvciBhIGdpdmVuIHJsanNvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGNvbnN0IGNhbGNSZXZlcnNlUmVmcyA9IChybGpzb246IFJsanNvbik6IFJldmVyc2VSZWZzID0+IHtcbiAgY29uc3QgcmVzdWx0OiBSZXZlcnNlUmVmcyA9IHt9O1xuXG4gIC8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbiAgLy8gUHJlcGFyZSBkYXRhIHN0cnVjdHVyZVxuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChjaGlsZFRhYmxlS2V5LCB0YWJsZSkgPT4ge1xuICAgIGNvbnN0IGNoaWxkVGFibGU6IHsgW2NoaWxkUm93SGFzaDogc3RyaW5nXTogUGFyZW50UmVmIH0gPSB7fTtcbiAgICByZXN1bHRbY2hpbGRUYWJsZUtleV0gPSBjaGlsZFRhYmxlO1xuICAgIGZvciAoY29uc3QgY2hpbGRSb3cgb2YgdGFibGUuX2RhdGEpIHtcbiAgICAgIGNoaWxkVGFibGVbY2hpbGRSb3cuX2hhc2hdID0ge307XG4gICAgfVxuICB9KTtcblxuICAvLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG4gIC8vIEdlbmVyYXRlIHJldmVyc2UgcmVmZXJlbmNlc1xuICBpdGVyYXRlVGFibGVzU3luYyhybGpzb24sIChwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGUpID0+IHtcbiAgICAvLyBJdGVyYXRlIGFsbCByb3dzIG9mIGVhY2ggdGFibGVcbiAgICBmb3IgKGNvbnN0IHBhcmVudFRhYmxlUm93IG9mIHBhcmVudFRhYmxlLl9kYXRhKSB7XG4gICAgICAvLyBGaW5kIG91dCB3aGUgb3RoZXIgdGFibGVzICYgcm93cyBhcmUgcmVmZXJlbmNlZCBieSB0aGlzIHJvd1xuICAgICAgLy8gV3JpdGUgdGhlc2UgaW5mb3JtYXRpb24gaW50dG8gcmVzdWx0XG4gICAgICBzd2l0Y2ggKHBhcmVudFRhYmxlLl90eXBlKSB7XG4gICAgICAgIGNhc2UgJ2NvbXBvbmVudHMnOlxuICAgICAgICAgIF93cml0ZUNvbXBvbmVudFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xheWVycyc6IHtcbiAgICAgICAgICBfd3JpdGVMYXllclJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xpY2VJZHMnOiB7XG4gICAgICAgICAgLy8gU2xpY2UgaWRzIGRvIG5vdCByZWZlcmVuY2Ugb3RoZXIgdGFibGVzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdjYWtlcyc6IHtcbiAgICAgICAgICBfd3JpdGVDYWtlUmVmcyhwYXJlbnRUYWJsZUtleSwgcGFyZW50VGFibGVSb3csIHJlc3VsdCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdidWZmZXRzJzoge1xuICAgICAgICAgIF93cml0ZUJ1ZmZldFJlZnMocGFyZW50VGFibGVLZXksIHBhcmVudFRhYmxlUm93LCByZXN1bHQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyogdjggaWdub3JlIGVuZCAqL1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlQ29tcG9uZW50UmVmcyA9IChcbiAgcGFyZW50VGFibGVOYW1lOiBUYWJsZUtleSxcbiAgcGFyZW50Um93OiBKc29uLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IHBhcmVudFJvd0hhc2ggPSBwYXJlbnRSb3cuX2hhc2ggYXMgc3RyaW5nO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Q29sdW1uTmFtZSBpbiBwYXJlbnRSb3cpIHtcbiAgICBpZiAocGFyZW50Q29sdW1uTmFtZS5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50Q29sdW1uTmFtZS5lbmRzV2l0aCgnUmVmJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Q29sdW1uTmFtZS5zbGljZSgwLCAtMyk7XG4gICAgY29uc3QgY2hpbGRSb3dIYXNoID0gcGFyZW50Um93W3BhcmVudENvbHVtbk5hbWVdIGFzIHN0cmluZztcblxuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlTGF5ZXJSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IExheWVyLFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuKSA9PiB7XG4gIGNvbnN0IGNoaWxkVGFibGVOYW1lID0gcGFyZW50Um93LmNvbXBvbmVudHNUYWJsZTtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBzbGljZUlkIGluIHBhcmVudFJvdy5hZGQpIHtcbiAgICBpZiAoc2xpY2VJZC5zdGFydHNXaXRoKCdfJykpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNsaWNlSGFzaCA9IHBhcmVudFJvdy5hZGRbc2xpY2VJZF0gYXMgc3RyaW5nO1xuXG4gICAgX3dyaXRlKHJlc3VsdCwgY2hpbGRUYWJsZU5hbWUsIHNsaWNlSGFzaCwgcGFyZW50VGFibGVOYW1lLCBwYXJlbnRSb3dIYXNoKTtcbiAgfVxufTtcblxuLy8gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5cbmNvbnN0IF93cml0ZUNha2VSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IENha2UsXG4gIHJlc3VsdDogUmV2ZXJzZVJlZnMsXG4pID0+IHtcbiAgY29uc3QgcGFyZW50Um93SGFzaCA9IHBhcmVudFJvdy5faGFzaCBhcyBzdHJpbmc7XG5cbiAgZm9yIChjb25zdCBsYXllciBpbiBwYXJlbnRSb3cubGF5ZXJzKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBsYXllcjtcbiAgICBjb25zdCBjaGlsZFJvd0hhc2ggPSBwYXJlbnRSb3cubGF5ZXJzW2xheWVyXSBhcyBzdHJpbmc7XG4gICAgX3dyaXRlKFxuICAgICAgcmVzdWx0LFxuICAgICAgY2hpbGRUYWJsZU5hbWUsXG4gICAgICBjaGlsZFJvd0hhc2gsXG4gICAgICBwYXJlbnRUYWJsZU5hbWUsXG4gICAgICBwYXJlbnRSb3dIYXNoLFxuICAgICk7XG4gIH1cbn07XG5cbi8vIC4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uXG5jb25zdCBfd3JpdGVCdWZmZXRSZWZzID0gKFxuICBwYXJlbnRUYWJsZU5hbWU6IFRhYmxlS2V5LFxuICBwYXJlbnRSb3c6IEJ1ZmZldCxcbiAgcmVzdWx0OiBSZXZlcnNlUmVmcyxcbikgPT4ge1xuICBjb25zdCBwYXJlbnRSb3dIYXNoID0gcGFyZW50Um93Ll9oYXNoIGFzIHN0cmluZztcblxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50Um93Lml0ZW1zKSB7XG4gICAgY29uc3QgY2hpbGRUYWJsZU5hbWUgPSBpdGVtLnRhYmxlO1xuICAgIGNvbnN0IGNoaWxkUm93SGFzaCA9IGl0ZW0ucmVmO1xuICAgIF93cml0ZShcbiAgICAgIHJlc3VsdCxcbiAgICAgIGNoaWxkVGFibGVOYW1lLFxuICAgICAgY2hpbGRSb3dIYXNoLFxuICAgICAgcGFyZW50VGFibGVOYW1lLFxuICAgICAgcGFyZW50Um93SGFzaCxcbiAgICApO1xuICB9XG59O1xuXG4vLyAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlxuY29uc3QgX3dyaXRlID0gKFxuICByZXN1bHQ6IFJldmVyc2VSZWZzLFxuICBjaGlsZFRhYmxlTmFtZTogc3RyaW5nLFxuICBjaGlsZFJvd0hhc2g6IHN0cmluZyxcbiAgcGFyZW50VGFibGVOYW1lOiBzdHJpbmcsXG4gIHBhcmVudFJvd0hhc2g6IHN0cmluZyxcbikgPT4ge1xuICBjb25zdCByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZSA9IChyZXN1bHRbY2hpbGRUYWJsZU5hbWVdID8/PSB7fSk7XG4gIGNvbnN0IHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93ID0gKHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlW2NoaWxkUm93SGFzaF0gPz89XG4gICAge30pO1xuXG4gIHJlZmVyZW5jZXNGb3JDaGlsZFRhYmxlUm93W3BhcmVudFRhYmxlTmFtZV0gPz89IHt9O1xuICByZWZlcmVuY2VzRm9yQ2hpbGRUYWJsZVJvd1twYXJlbnRUYWJsZU5hbWVdW3BhcmVudFJvd0hhc2hdID8/PSB7fTtcbn07XG4iXSwibmFtZXMiOlsiZSJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBcUJPLE1BQU0sUUFBUTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLbkIsWUFBNEIsSUFBUTtBQUFSLFNBQUEsS0FBQTtBQUFBLEVBQVM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtyQyxXQUFXLG9CQUFvQjtBQUM3QixVQUFNLFdBQVcsSUFBYztBQUFBLE1BQzdCLE9BQU87QUFBQSxNQUNQLEtBQUs7QUFBQSxNQUNMLE1BQU07QUFBQSxNQUNOLFFBQVE7QUFBQSxNQUNSLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFVBQVU7QUFBQSxNQUVWLFNBQVM7QUFBQSxRQUNQLEVBQUUsS0FBSyxTQUFTLE1BQU0sU0FBQTtBQUFBLFFBQ3RC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
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { default as EventEmitter } from 'node:events';
|
|
2
|
+
export declare class PeerServerSocketMock extends EventEmitter {
|
|
3
|
+
connected: boolean;
|
|
4
|
+
disconnected: boolean;
|
|
5
|
+
constructor();
|
|
6
|
+
/**
|
|
7
|
+
* Simulates a connection event.
|
|
8
|
+
*
|
|
9
|
+
* Emits the 'connect' event to all registered listeners.
|
|
10
|
+
*/
|
|
11
|
+
connect(): void;
|
|
12
|
+
/**
|
|
13
|
+
* Simulates a disconnection event.
|
|
14
|
+
*
|
|
15
|
+
* Emits the 'disconnect' event to all registered listeners.
|
|
16
|
+
*/
|
|
17
|
+
disconnect(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Io } from './io.ts';
|
|
2
|
+
import { Socket } from './socket.ts';
|
|
3
|
+
export declare class PeerSocketMock implements Socket {
|
|
4
|
+
private _io;
|
|
5
|
+
private _listenersMap;
|
|
6
|
+
connected: boolean;
|
|
7
|
+
disconnected: boolean;
|
|
8
|
+
constructor(_io: Io);
|
|
9
|
+
/**
|
|
10
|
+
* Registers an event listener for the specified event.
|
|
11
|
+
* @param eventName - The name of the event to listen for.
|
|
12
|
+
* @param listener - The callback function to invoke when the event is emitted.
|
|
13
|
+
* @returns The PeerSocketMock instance for chaining.
|
|
14
|
+
*/
|
|
15
|
+
on(eventName: string | symbol, listener: (...args: any[]) => void): this;
|
|
16
|
+
/**
|
|
17
|
+
* Simulates a connection event.
|
|
18
|
+
*
|
|
19
|
+
* Emits the 'connect' event to all registered listeners.
|
|
20
|
+
*/
|
|
21
|
+
connect(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Simulates a disconnection event.
|
|
24
|
+
*
|
|
25
|
+
* Emits the 'disconnect' event to all registered listeners.
|
|
26
|
+
*/
|
|
27
|
+
disconnect(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Emits an event, invoking the corresponding method on the Io instance.
|
|
30
|
+
* @param eventName - The name of the event to emit.
|
|
31
|
+
* @param args - The arguments to pass to the event listener.
|
|
32
|
+
* @returns
|
|
33
|
+
*/
|
|
34
|
+
emit(eventName: string | symbol, ...args: any[]): boolean;
|
|
35
|
+
}
|
package/dist/socket.d.ts
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rljson/io",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.47",
|
|
4
4
|
"description": "Low level interface for reading and writing RLJSON data",
|
|
5
5
|
"homepage": "https://github.com/rljson/io",
|
|
6
6
|
"bugs": "https://github.com/rljson/io/issues",
|
|
@@ -20,20 +20,20 @@
|
|
|
20
20
|
],
|
|
21
21
|
"type": "module",
|
|
22
22
|
"devDependencies": {
|
|
23
|
-
"@types/node": "^24.
|
|
24
|
-
"@typescript-eslint/eslint-plugin": "^8.46.
|
|
25
|
-
"@typescript-eslint/parser": "^8.46.
|
|
23
|
+
"@types/node": "^24.9.1",
|
|
24
|
+
"@typescript-eslint/eslint-plugin": "^8.46.2",
|
|
25
|
+
"@typescript-eslint/parser": "^8.46.2",
|
|
26
26
|
"@vitest/coverage-v8": "^3.2.4",
|
|
27
27
|
"cross-env": "^10.1.0",
|
|
28
|
-
"eslint": "^9.
|
|
29
|
-
"eslint-plugin-jsdoc": "^61.1.
|
|
28
|
+
"eslint": "^9.38.0",
|
|
29
|
+
"eslint-plugin-jsdoc": "^61.1.5",
|
|
30
30
|
"eslint-plugin-tsdoc": "^0.4.0",
|
|
31
31
|
"globals": "^16.4.0",
|
|
32
32
|
"jsdoc": "^4.0.5",
|
|
33
33
|
"read-pkg": "^9.0.1",
|
|
34
34
|
"typescript": "~5.9.3",
|
|
35
|
-
"typescript-eslint": "^8.46.
|
|
36
|
-
"vite": "^7.1.
|
|
35
|
+
"typescript-eslint": "^8.46.2",
|
|
36
|
+
"vite": "^7.1.11",
|
|
37
37
|
"vite-node": "^3.2.4",
|
|
38
38
|
"vite-plugin-dts": "^4.5.4",
|
|
39
39
|
"vite-tsconfig-paths": "^5.1.4",
|