tedious 16.2.0 → 16.4.0
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/lib/all-headers.js +1 -2
- package/lib/all-headers.js.map +1 -0
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js +9 -31
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-algorithm.js.map +1 -0
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js +9 -24
- package/lib/always-encrypted/aead-aes-256-cbc-hmac-encryption-key.js.map +1 -0
- package/lib/always-encrypted/cek-entry.js +8 -12
- package/lib/always-encrypted/cek-entry.js.map +1 -0
- package/lib/always-encrypted/get-parameter-encryption-metadata.js +2 -24
- package/lib/always-encrypted/get-parameter-encryption-metadata.js.map +1 -0
- package/lib/always-encrypted/key-crypto.js +5 -30
- package/lib/always-encrypted/key-crypto.js.map +1 -0
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js +11 -72
- package/lib/always-encrypted/keystore-provider-azure-key-vault.js.map +1 -0
- package/lib/always-encrypted/symmetric-key-cache.js +2 -13
- package/lib/always-encrypted/symmetric-key-cache.js.map +1 -0
- package/lib/always-encrypted/symmetric-key.js +3 -8
- package/lib/always-encrypted/symmetric-key.js.map +1 -0
- package/lib/always-encrypted/types.js +19 -27
- package/lib/always-encrypted/types.js.map +1 -0
- package/lib/always-encrypted/utils.js +2 -6
- package/lib/always-encrypted/utils.js.map +1 -0
- package/lib/bulk-load-payload.js +7 -15
- package/lib/bulk-load-payload.js.map +1 -0
- package/lib/bulk-load.js +58 -131
- package/lib/bulk-load.js.map +1 -0
- package/lib/collation.js +7 -15
- package/lib/collation.js.map +1 -0
- package/lib/connection.js +307 -534
- package/lib/connection.js.map +1 -0
- package/lib/connector.js +6 -37
- package/lib/connector.js.map +1 -0
- package/lib/data-type.js +2 -43
- package/lib/data-type.js.map +1 -0
- package/lib/data-types/bigint.js +1 -15
- package/lib/data-types/bigint.js.map +1 -0
- package/lib/data-types/binary.js +1 -12
- package/lib/data-types/binary.js.map +1 -0
- package/lib/data-types/bit.js +1 -11
- package/lib/data-types/bit.js.map +1 -0
- package/lib/data-types/bitn.js +1 -7
- package/lib/data-types/bitn.js.map +1 -0
- package/lib/data-types/char.js +1 -20
- package/lib/data-types/char.js.map +1 -0
- package/lib/data-types/date.js +1 -15
- package/lib/data-types/date.js.map +1 -0
- package/lib/data-types/datetime.js +3 -20
- package/lib/data-types/datetime.js.map +1 -0
- package/lib/data-types/datetime2.js +1 -26
- package/lib/data-types/datetime2.js.map +1 -0
- package/lib/data-types/datetimen.js +1 -7
- package/lib/data-types/datetimen.js.map +1 -0
- package/lib/data-types/datetimeoffset.js +1 -23
- package/lib/data-types/datetimeoffset.js.map +1 -0
- package/lib/data-types/decimal.js +1 -18
- package/lib/data-types/decimal.js.map +1 -0
- package/lib/data-types/decimaln.js +1 -7
- package/lib/data-types/decimaln.js.map +1 -0
- package/lib/data-types/float.js +1 -13
- package/lib/data-types/float.js.map +1 -0
- package/lib/data-types/floatn.js +1 -7
- package/lib/data-types/floatn.js.map +1 -0
- package/lib/data-types/image.js +1 -10
- package/lib/data-types/image.js.map +1 -0
- package/lib/data-types/int.js +1 -14
- package/lib/data-types/int.js.map +1 -0
- package/lib/data-types/intn.js +1 -7
- package/lib/data-types/intn.js.map +1 -0
- package/lib/data-types/money.js +1 -12
- package/lib/data-types/money.js.map +1 -0
- package/lib/data-types/moneyn.js +1 -7
- package/lib/data-types/moneyn.js.map +1 -0
- package/lib/data-types/nchar.js +1 -14
- package/lib/data-types/nchar.js.map +1 -0
- package/lib/data-types/ntext.js +1 -10
- package/lib/data-types/ntext.js.map +1 -0
- package/lib/data-types/null.js +1 -7
- package/lib/data-types/null.js.map +1 -0
- package/lib/data-types/numeric.js +1 -18
- package/lib/data-types/numeric.js.map +1 -0
- package/lib/data-types/numericn.js +1 -7
- package/lib/data-types/numericn.js.map +1 -0
- package/lib/data-types/nvarchar.js +1 -22
- package/lib/data-types/nvarchar.js.map +1 -0
- package/lib/data-types/real.js +1 -13
- package/lib/data-types/real.js.map +1 -0
- package/lib/data-types/smalldatetime.js +1 -14
- package/lib/data-types/smalldatetime.js.map +1 -0
- package/lib/data-types/smallint.js +1 -14
- package/lib/data-types/smallint.js.map +1 -0
- package/lib/data-types/smallmoney.js +1 -13
- package/lib/data-types/smallmoney.js.map +1 -0
- package/lib/data-types/sql-variant.js +1 -6
- package/lib/data-types/sql-variant.js.map +1 -0
- package/lib/data-types/text.js +1 -18
- package/lib/data-types/text.js.map +1 -0
- package/lib/data-types/time.js +1 -22
- package/lib/data-types/time.js.map +1 -0
- package/lib/data-types/tinyint.js +1 -14
- package/lib/data-types/tinyint.js.map +1 -0
- package/lib/data-types/tvp.js +11 -27
- package/lib/data-types/tvp.js.map +1 -0
- package/lib/data-types/udt.js +1 -7
- package/lib/data-types/udt.js.map +1 -0
- package/lib/data-types/uniqueidentifier.js +1 -11
- package/lib/data-types/uniqueidentifier.js.map +1 -0
- package/lib/data-types/varbinary.js +1 -22
- package/lib/data-types/varbinary.js.map +1 -0
- package/lib/data-types/varchar.js +1 -23
- package/lib/data-types/varchar.js.map +1 -0
- package/lib/data-types/xml.js +1 -7
- package/lib/data-types/xml.js.map +1 -0
- package/lib/debug.js +4 -16
- package/lib/debug.js.map +1 -0
- package/lib/errors/abort-error.js +2 -5
- package/lib/errors/abort-error.js.map +1 -0
- package/lib/errors/timeout-error.js +2 -5
- package/lib/errors/timeout-error.js.map +1 -0
- package/lib/errors.js +10 -16
- package/lib/errors.js.map +1 -0
- package/lib/guid-parser.js +1 -7
- package/lib/guid-parser.js.map +1 -0
- package/lib/incoming-message-stream.js +9 -29
- package/lib/incoming-message-stream.js.map +1 -0
- package/lib/instance-lookup.js +3 -34
- package/lib/instance-lookup.js.map +1 -0
- package/lib/library.js +1 -1
- package/lib/library.js.map +1 -0
- package/lib/login7-payload.js +99 -100
- package/lib/login7-payload.js.map +1 -0
- package/lib/message-io.js +17 -45
- package/lib/message-io.js.map +1 -0
- package/lib/message.js +4 -8
- package/lib/message.js.map +1 -0
- package/lib/metadata-parser.js +1 -22
- package/lib/metadata-parser.js.map +1 -0
- package/lib/ntlm-payload.js +2 -22
- package/lib/ntlm-payload.js.map +1 -0
- package/lib/ntlm.js +1 -4
- package/lib/ntlm.js.map +1 -0
- package/lib/outgoing-message-stream.js +12 -21
- package/lib/outgoing-message-stream.js.map +1 -0
- package/lib/packet.js +2 -47
- package/lib/packet.js.map +1 -0
- package/lib/prelogin-payload.js +11 -54
- package/lib/prelogin-payload.js.map +1 -0
- package/lib/request.js +88 -66
- package/lib/request.js.map +1 -0
- package/lib/rpcrequest-payload.js +8 -35
- package/lib/rpcrequest-payload.js.map +1 -0
- package/lib/sender.js +1 -24
- package/lib/sender.js.map +1 -0
- package/lib/special-stored-procedure.js +1 -1
- package/lib/special-stored-procedure.js.map +1 -0
- package/lib/sqlbatch-payload.js +5 -18
- package/lib/sqlbatch-payload.js.map +1 -0
- package/lib/tds-versions.js +3 -3
- package/lib/tds-versions.js.map +1 -0
- package/lib/tedious.js +1 -12
- package/lib/tedious.js.map +1 -0
- package/lib/token/colmetadata-token-parser.js +1 -17
- package/lib/token/colmetadata-token-parser.js.map +1 -0
- package/lib/token/done-token-parser.js +2 -8
- package/lib/token/done-token-parser.js.map +1 -0
- package/lib/token/env-change-token-parser.js +7 -28
- package/lib/token/env-change-token-parser.js.map +1 -0
- package/lib/token/feature-ext-ack-parser.js +1 -10
- package/lib/token/feature-ext-ack-parser.js.map +1 -0
- package/lib/token/fedauth-info-parser.js +2 -10
- package/lib/token/fedauth-info-parser.js.map +1 -0
- package/lib/token/handler.js +39 -149
- package/lib/token/handler.js.map +1 -0
- package/lib/token/infoerror-token-parser.js +1 -5
- package/lib/token/infoerror-token-parser.js.map +1 -0
- package/lib/token/loginack-token-parser.js +1 -6
- package/lib/token/loginack-token-parser.js.map +1 -0
- package/lib/token/nbcrow-token-parser.js +2 -15
- package/lib/token/nbcrow-token-parser.js.map +1 -0
- package/lib/token/order-token-parser.js +2 -7
- package/lib/token/order-token-parser.js.map +1 -0
- package/lib/token/returnstatus-token-parser.js +2 -4
- package/lib/token/returnstatus-token-parser.js.map +1 -0
- package/lib/token/returnvalue-token-parser.js +4 -9
- package/lib/token/returnvalue-token-parser.js.map +1 -0
- package/lib/token/row-token-parser.js +2 -11
- package/lib/token/row-token-parser.js.map +1 -0
- package/lib/token/sspi-token-parser.js +1 -5
- package/lib/token/sspi-token-parser.js.map +1 -0
- package/lib/token/stream-parser.js +24 -86
- package/lib/token/stream-parser.js.map +1 -0
- package/lib/token/token-stream-parser.js +4 -13
- package/lib/token/token-stream-parser.js.map +1 -0
- package/lib/token/token.js +88 -168
- package/lib/token/token.js.map +1 -0
- package/lib/tracking-buffer/writable-tracking-buffer.js +20 -60
- package/lib/tracking-buffer/writable-tracking-buffer.js.map +1 -0
- package/lib/transaction.js +9 -33
- package/lib/transaction.js.map +1 -0
- package/lib/transient-error-lookup.js +1 -4
- package/lib/transient-error-lookup.js.map +1 -0
- package/lib/utils/with-timeout.js +1 -9
- package/lib/utils/with-timeout.js.map +1 -0
- package/lib/value-parser.js +1 -143
- package/lib/value-parser.js.map +1 -0
- package/package.json +27 -71
package/lib/connection.js
CHANGED
|
@@ -4,78 +4,47 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
var _crypto = _interopRequireDefault(require("crypto"));
|
|
9
|
-
|
|
10
8
|
var _os = _interopRequireDefault(require("os"));
|
|
11
|
-
|
|
9
|
+
var tls = _interopRequireWildcard(require("tls"));
|
|
10
|
+
var net = _interopRequireWildcard(require("net"));
|
|
12
11
|
var _dns = _interopRequireDefault(require("dns"));
|
|
13
|
-
|
|
14
12
|
var _constants = _interopRequireDefault(require("constants"));
|
|
15
|
-
|
|
16
13
|
var _stream = require("stream");
|
|
17
|
-
|
|
18
14
|
var _identity = require("@azure/identity");
|
|
19
|
-
|
|
20
15
|
var _bulkLoad = _interopRequireDefault(require("./bulk-load"));
|
|
21
|
-
|
|
22
16
|
var _debug = _interopRequireDefault(require("./debug"));
|
|
23
|
-
|
|
24
17
|
var _events = require("events");
|
|
25
|
-
|
|
26
18
|
var _instanceLookup = require("./instance-lookup");
|
|
27
|
-
|
|
28
19
|
var _transientErrorLookup = require("./transient-error-lookup");
|
|
29
|
-
|
|
30
20
|
var _packet = require("./packet");
|
|
31
|
-
|
|
32
21
|
var _preloginPayload = _interopRequireDefault(require("./prelogin-payload"));
|
|
33
|
-
|
|
34
22
|
var _login7Payload = _interopRequireDefault(require("./login7-payload"));
|
|
35
|
-
|
|
36
23
|
var _ntlmPayload = _interopRequireDefault(require("./ntlm-payload"));
|
|
37
|
-
|
|
38
24
|
var _request = _interopRequireDefault(require("./request"));
|
|
39
|
-
|
|
40
25
|
var _rpcrequestPayload = _interopRequireDefault(require("./rpcrequest-payload"));
|
|
41
|
-
|
|
42
26
|
var _sqlbatchPayload = _interopRequireDefault(require("./sqlbatch-payload"));
|
|
43
|
-
|
|
44
27
|
var _messageIo = _interopRequireDefault(require("./message-io"));
|
|
45
|
-
|
|
46
28
|
var _tokenStreamParser = require("./token/token-stream-parser");
|
|
47
|
-
|
|
48
29
|
var _transaction = require("./transaction");
|
|
49
|
-
|
|
50
30
|
var _errors = require("./errors");
|
|
51
|
-
|
|
52
31
|
var _connector = require("./connector");
|
|
53
|
-
|
|
54
32
|
var _library = require("./library");
|
|
55
|
-
|
|
56
33
|
var _tdsVersions = require("./tds-versions");
|
|
57
|
-
|
|
58
34
|
var _message = _interopRequireDefault(require("./message"));
|
|
59
|
-
|
|
60
35
|
var _ntlm = require("./ntlm");
|
|
61
|
-
|
|
62
36
|
var _nodeAbortController = require("node-abort-controller");
|
|
63
|
-
|
|
64
37
|
var _dataType = require("./data-type");
|
|
65
|
-
|
|
66
38
|
var _bulkLoadPayload = require("./bulk-load-payload");
|
|
67
|
-
|
|
68
39
|
var _specialStoredProcedure = _interopRequireDefault(require("./special-stored-procedure"));
|
|
69
|
-
|
|
70
40
|
var _esAggregateError = _interopRequireDefault(require("es-aggregate-error"));
|
|
71
|
-
|
|
72
41
|
var _package = require("../package.json");
|
|
73
|
-
|
|
74
42
|
var _url = require("url");
|
|
75
|
-
|
|
76
43
|
var _handler = require("./token/handler");
|
|
77
|
-
|
|
44
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
45
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
78
46
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
47
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
79
48
|
|
|
80
49
|
/**
|
|
81
50
|
* @private
|
|
@@ -84,59 +53,52 @@ const KEEP_ALIVE_INITIAL_DELAY = 30 * 1000;
|
|
|
84
53
|
/**
|
|
85
54
|
* @private
|
|
86
55
|
*/
|
|
87
|
-
|
|
88
56
|
const DEFAULT_CONNECT_TIMEOUT = 15 * 1000;
|
|
89
57
|
/**
|
|
90
58
|
* @private
|
|
91
59
|
*/
|
|
92
|
-
|
|
93
60
|
const DEFAULT_CLIENT_REQUEST_TIMEOUT = 15 * 1000;
|
|
94
61
|
/**
|
|
95
62
|
* @private
|
|
96
63
|
*/
|
|
97
|
-
|
|
98
64
|
const DEFAULT_CANCEL_TIMEOUT = 5 * 1000;
|
|
99
65
|
/**
|
|
100
66
|
* @private
|
|
101
67
|
*/
|
|
102
|
-
|
|
103
68
|
const DEFAULT_CONNECT_RETRY_INTERVAL = 500;
|
|
104
69
|
/**
|
|
105
70
|
* @private
|
|
106
71
|
*/
|
|
107
|
-
|
|
108
72
|
const DEFAULT_PACKET_SIZE = 4 * 1024;
|
|
109
73
|
/**
|
|
110
74
|
* @private
|
|
111
75
|
*/
|
|
112
|
-
|
|
113
76
|
const DEFAULT_TEXTSIZE = 2147483647;
|
|
114
77
|
/**
|
|
115
78
|
* @private
|
|
116
79
|
*/
|
|
117
|
-
|
|
118
80
|
const DEFAULT_DATEFIRST = 7;
|
|
119
81
|
/**
|
|
120
82
|
* @private
|
|
121
83
|
*/
|
|
122
|
-
|
|
123
84
|
const DEFAULT_PORT = 1433;
|
|
124
85
|
/**
|
|
125
86
|
* @private
|
|
126
87
|
*/
|
|
127
|
-
|
|
128
88
|
const DEFAULT_TDS_VERSION = '7_4';
|
|
129
89
|
/**
|
|
130
90
|
* @private
|
|
131
91
|
*/
|
|
132
|
-
|
|
133
92
|
const DEFAULT_LANGUAGE = 'us_english';
|
|
134
93
|
/**
|
|
135
94
|
* @private
|
|
136
95
|
*/
|
|
137
|
-
|
|
138
96
|
const DEFAULT_DATEFORMAT = 'mdy';
|
|
139
97
|
|
|
98
|
+
/**
|
|
99
|
+
* @private
|
|
100
|
+
*/
|
|
101
|
+
|
|
140
102
|
/**
|
|
141
103
|
* @private
|
|
142
104
|
*/
|
|
@@ -145,7 +107,6 @@ const CLEANUP_TYPE = {
|
|
|
145
107
|
REDIRECT: 1,
|
|
146
108
|
RETRY: 2
|
|
147
109
|
};
|
|
148
|
-
|
|
149
110
|
/**
|
|
150
111
|
* A [[Connection]] instance represents a single connection to a database server.
|
|
151
112
|
*
|
|
@@ -170,58 +131,59 @@ class Connection extends _events.EventEmitter {
|
|
|
170
131
|
/**
|
|
171
132
|
* @private
|
|
172
133
|
*/
|
|
173
|
-
|
|
134
|
+
fedAuthRequired;
|
|
174
135
|
/**
|
|
175
136
|
* @private
|
|
176
137
|
*/
|
|
177
|
-
|
|
138
|
+
config;
|
|
178
139
|
/**
|
|
179
140
|
* @private
|
|
180
141
|
*/
|
|
181
|
-
|
|
142
|
+
secureContextOptions;
|
|
182
143
|
/**
|
|
183
144
|
* @private
|
|
184
145
|
*/
|
|
185
|
-
|
|
146
|
+
inTransaction;
|
|
186
147
|
/**
|
|
187
148
|
* @private
|
|
188
149
|
*/
|
|
189
|
-
|
|
150
|
+
transactionDescriptors;
|
|
190
151
|
/**
|
|
191
152
|
* @private
|
|
192
153
|
*/
|
|
193
|
-
|
|
154
|
+
transactionDepth;
|
|
194
155
|
/**
|
|
195
156
|
* @private
|
|
196
157
|
*/
|
|
197
|
-
|
|
158
|
+
isSqlBatch;
|
|
198
159
|
/**
|
|
199
160
|
* @private
|
|
200
161
|
*/
|
|
201
|
-
|
|
162
|
+
curTransientRetryCount;
|
|
202
163
|
/**
|
|
203
164
|
* @private
|
|
204
165
|
*/
|
|
205
|
-
|
|
166
|
+
transientErrorLookup;
|
|
206
167
|
/**
|
|
207
168
|
* @private
|
|
208
169
|
*/
|
|
209
|
-
|
|
170
|
+
closed;
|
|
210
171
|
/**
|
|
211
172
|
* @private
|
|
212
173
|
*/
|
|
213
|
-
|
|
174
|
+
loginError;
|
|
214
175
|
/**
|
|
215
176
|
* @private
|
|
216
177
|
*/
|
|
217
|
-
|
|
178
|
+
debug;
|
|
218
179
|
/**
|
|
219
180
|
* @private
|
|
220
181
|
*/
|
|
221
|
-
|
|
182
|
+
ntlmpacket;
|
|
222
183
|
/**
|
|
223
184
|
* @private
|
|
224
185
|
*/
|
|
186
|
+
ntlmpacketBuffer;
|
|
225
187
|
|
|
226
188
|
/**
|
|
227
189
|
* @private
|
|
@@ -230,54 +192,64 @@ class Connection extends _events.EventEmitter {
|
|
|
230
192
|
/**
|
|
231
193
|
* @private
|
|
232
194
|
*/
|
|
195
|
+
routingData;
|
|
233
196
|
|
|
234
197
|
/**
|
|
235
198
|
* @private
|
|
236
199
|
*/
|
|
237
|
-
|
|
200
|
+
messageIo;
|
|
238
201
|
/**
|
|
239
202
|
* @private
|
|
240
203
|
*/
|
|
241
|
-
|
|
204
|
+
state;
|
|
242
205
|
/**
|
|
243
206
|
* @private
|
|
244
207
|
*/
|
|
208
|
+
resetConnectionOnNextRequest;
|
|
245
209
|
|
|
246
210
|
/**
|
|
247
211
|
* @private
|
|
248
212
|
*/
|
|
249
|
-
|
|
213
|
+
request;
|
|
250
214
|
/**
|
|
251
215
|
* @private
|
|
252
216
|
*/
|
|
253
|
-
|
|
217
|
+
procReturnStatusValue;
|
|
254
218
|
/**
|
|
255
219
|
* @private
|
|
256
220
|
*/
|
|
257
|
-
|
|
221
|
+
socket;
|
|
258
222
|
/**
|
|
259
223
|
* @private
|
|
260
224
|
*/
|
|
225
|
+
messageBuffer;
|
|
261
226
|
|
|
262
227
|
/**
|
|
263
228
|
* @private
|
|
264
229
|
*/
|
|
265
|
-
|
|
230
|
+
connectTimer;
|
|
266
231
|
/**
|
|
267
232
|
* @private
|
|
268
233
|
*/
|
|
269
|
-
|
|
234
|
+
cancelTimer;
|
|
270
235
|
/**
|
|
271
236
|
* @private
|
|
272
237
|
*/
|
|
238
|
+
requestTimer;
|
|
239
|
+
/**
|
|
240
|
+
* @private
|
|
241
|
+
*/
|
|
242
|
+
retryTimer;
|
|
273
243
|
|
|
274
244
|
/**
|
|
275
245
|
* @private
|
|
276
246
|
*/
|
|
247
|
+
_cancelAfterRequestSent;
|
|
277
248
|
|
|
278
249
|
/**
|
|
279
250
|
* @private
|
|
280
251
|
*/
|
|
252
|
+
databaseCollation;
|
|
281
253
|
|
|
282
254
|
/**
|
|
283
255
|
* Note: be aware of the different options field:
|
|
@@ -302,79 +274,39 @@ class Connection extends _events.EventEmitter {
|
|
|
302
274
|
*/
|
|
303
275
|
constructor(config) {
|
|
304
276
|
super();
|
|
305
|
-
this.fedAuthRequired = void 0;
|
|
306
|
-
this.config = void 0;
|
|
307
|
-
this.secureContextOptions = void 0;
|
|
308
|
-
this.inTransaction = void 0;
|
|
309
|
-
this.transactionDescriptors = void 0;
|
|
310
|
-
this.transactionDepth = void 0;
|
|
311
|
-
this.isSqlBatch = void 0;
|
|
312
|
-
this.curTransientRetryCount = void 0;
|
|
313
|
-
this.transientErrorLookup = void 0;
|
|
314
|
-
this.closed = void 0;
|
|
315
|
-
this.loginError = void 0;
|
|
316
|
-
this.debug = void 0;
|
|
317
|
-
this.ntlmpacket = void 0;
|
|
318
|
-
this.ntlmpacketBuffer = void 0;
|
|
319
|
-
this.routingData = void 0;
|
|
320
|
-
this.messageIo = void 0;
|
|
321
|
-
this.state = void 0;
|
|
322
|
-
this.resetConnectionOnNextRequest = void 0;
|
|
323
|
-
this.request = void 0;
|
|
324
|
-
this.procReturnStatusValue = void 0;
|
|
325
|
-
this.socket = void 0;
|
|
326
|
-
this.messageBuffer = void 0;
|
|
327
|
-
this.connectTimer = void 0;
|
|
328
|
-
this.cancelTimer = void 0;
|
|
329
|
-
this.requestTimer = void 0;
|
|
330
|
-
this.retryTimer = void 0;
|
|
331
|
-
this._cancelAfterRequestSent = void 0;
|
|
332
|
-
this.databaseCollation = void 0;
|
|
333
|
-
|
|
334
277
|
if (typeof config !== 'object' || config === null) {
|
|
335
278
|
throw new TypeError('The "config" argument is required and must be of type Object.');
|
|
336
279
|
}
|
|
337
|
-
|
|
338
280
|
if (typeof config.server !== 'string') {
|
|
339
281
|
throw new TypeError('The "config.server" property is required and must be of type string.');
|
|
340
282
|
}
|
|
341
|
-
|
|
342
283
|
this.fedAuthRequired = false;
|
|
343
284
|
let authentication;
|
|
344
|
-
|
|
345
285
|
if (config.authentication !== undefined) {
|
|
346
286
|
if (typeof config.authentication !== 'object' || config.authentication === null) {
|
|
347
287
|
throw new TypeError('The "config.authentication" property must be of type Object.');
|
|
348
288
|
}
|
|
349
|
-
|
|
350
289
|
const type = config.authentication.type;
|
|
351
290
|
const options = config.authentication.options === undefined ? {} : config.authentication.options;
|
|
352
|
-
|
|
353
291
|
if (typeof type !== 'string') {
|
|
354
292
|
throw new TypeError('The "config.authentication.type" property must be of type string.');
|
|
355
293
|
}
|
|
356
|
-
|
|
357
294
|
if (type !== 'default' && type !== 'ntlm' && type !== 'azure-active-directory-password' && type !== 'azure-active-directory-access-token' && type !== 'azure-active-directory-msi-vm' && type !== 'azure-active-directory-msi-app-service' && type !== 'azure-active-directory-service-principal-secret' && type !== 'azure-active-directory-default') {
|
|
358
295
|
throw new TypeError('The "type" property must one of "default", "ntlm", "azure-active-directory-password", "azure-active-directory-access-token", "azure-active-directory-default", "azure-active-directory-msi-vm" or "azure-active-directory-msi-app-service" or "azure-active-directory-service-principal-secret".');
|
|
359
296
|
}
|
|
360
|
-
|
|
361
297
|
if (typeof options !== 'object' || options === null) {
|
|
362
298
|
throw new TypeError('The "config.authentication.options" property must be of type object.');
|
|
363
299
|
}
|
|
364
|
-
|
|
365
300
|
if (type === 'ntlm') {
|
|
366
301
|
if (typeof options.domain !== 'string') {
|
|
367
302
|
throw new TypeError('The "config.authentication.options.domain" property must be of type string.');
|
|
368
303
|
}
|
|
369
|
-
|
|
370
304
|
if (options.userName !== undefined && typeof options.userName !== 'string') {
|
|
371
305
|
throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
|
|
372
306
|
}
|
|
373
|
-
|
|
374
307
|
if (options.password !== undefined && typeof options.password !== 'string') {
|
|
375
308
|
throw new TypeError('The "config.authentication.options.password" property must be of type string.');
|
|
376
309
|
}
|
|
377
|
-
|
|
378
310
|
authentication = {
|
|
379
311
|
type: 'ntlm',
|
|
380
312
|
options: {
|
|
@@ -387,19 +319,15 @@ class Connection extends _events.EventEmitter {
|
|
|
387
319
|
if (typeof options.clientId !== 'string') {
|
|
388
320
|
throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
|
|
389
321
|
}
|
|
390
|
-
|
|
391
322
|
if (options.userName !== undefined && typeof options.userName !== 'string') {
|
|
392
323
|
throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
|
|
393
324
|
}
|
|
394
|
-
|
|
395
325
|
if (options.password !== undefined && typeof options.password !== 'string') {
|
|
396
326
|
throw new TypeError('The "config.authentication.options.password" property must be of type string.');
|
|
397
327
|
}
|
|
398
|
-
|
|
399
328
|
if (options.tenantId !== undefined && typeof options.tenantId !== 'string') {
|
|
400
329
|
throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.');
|
|
401
330
|
}
|
|
402
|
-
|
|
403
331
|
authentication = {
|
|
404
332
|
type: 'azure-active-directory-password',
|
|
405
333
|
options: {
|
|
@@ -413,7 +341,6 @@ class Connection extends _events.EventEmitter {
|
|
|
413
341
|
if (typeof options.token !== 'string') {
|
|
414
342
|
throw new TypeError('The "config.authentication.options.token" property must be of type string.');
|
|
415
343
|
}
|
|
416
|
-
|
|
417
344
|
authentication = {
|
|
418
345
|
type: 'azure-active-directory-access-token',
|
|
419
346
|
options: {
|
|
@@ -424,7 +351,6 @@ class Connection extends _events.EventEmitter {
|
|
|
424
351
|
if (options.clientId !== undefined && typeof options.clientId !== 'string') {
|
|
425
352
|
throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
|
|
426
353
|
}
|
|
427
|
-
|
|
428
354
|
authentication = {
|
|
429
355
|
type: 'azure-active-directory-msi-vm',
|
|
430
356
|
options: {
|
|
@@ -435,7 +361,6 @@ class Connection extends _events.EventEmitter {
|
|
|
435
361
|
if (options.clientId !== undefined && typeof options.clientId !== 'string') {
|
|
436
362
|
throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
|
|
437
363
|
}
|
|
438
|
-
|
|
439
364
|
authentication = {
|
|
440
365
|
type: 'azure-active-directory-default',
|
|
441
366
|
options: {
|
|
@@ -446,7 +371,6 @@ class Connection extends _events.EventEmitter {
|
|
|
446
371
|
if (options.clientId !== undefined && typeof options.clientId !== 'string') {
|
|
447
372
|
throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
|
|
448
373
|
}
|
|
449
|
-
|
|
450
374
|
authentication = {
|
|
451
375
|
type: 'azure-active-directory-msi-app-service',
|
|
452
376
|
options: {
|
|
@@ -457,15 +381,12 @@ class Connection extends _events.EventEmitter {
|
|
|
457
381
|
if (typeof options.clientId !== 'string') {
|
|
458
382
|
throw new TypeError('The "config.authentication.options.clientId" property must be of type string.');
|
|
459
383
|
}
|
|
460
|
-
|
|
461
384
|
if (typeof options.clientSecret !== 'string') {
|
|
462
385
|
throw new TypeError('The "config.authentication.options.clientSecret" property must be of type string.');
|
|
463
386
|
}
|
|
464
|
-
|
|
465
387
|
if (typeof options.tenantId !== 'string') {
|
|
466
388
|
throw new TypeError('The "config.authentication.options.tenantId" property must be of type string.');
|
|
467
389
|
}
|
|
468
|
-
|
|
469
390
|
authentication = {
|
|
470
391
|
type: 'azure-active-directory-service-principal-secret',
|
|
471
392
|
options: {
|
|
@@ -478,11 +399,9 @@ class Connection extends _events.EventEmitter {
|
|
|
478
399
|
if (options.userName !== undefined && typeof options.userName !== 'string') {
|
|
479
400
|
throw new TypeError('The "config.authentication.options.userName" property must be of type string.');
|
|
480
401
|
}
|
|
481
|
-
|
|
482
402
|
if (options.password !== undefined && typeof options.password !== 'string') {
|
|
483
403
|
throw new TypeError('The "config.authentication.options.password" property must be of type string.');
|
|
484
404
|
}
|
|
485
|
-
|
|
486
405
|
authentication = {
|
|
487
406
|
type: 'default',
|
|
488
407
|
options: {
|
|
@@ -500,7 +419,6 @@ class Connection extends _events.EventEmitter {
|
|
|
500
419
|
}
|
|
501
420
|
};
|
|
502
421
|
}
|
|
503
|
-
|
|
504
422
|
this.config = {
|
|
505
423
|
server: config.server,
|
|
506
424
|
authentication: authentication,
|
|
@@ -564,419 +482,325 @@ class Connection extends _events.EventEmitter {
|
|
|
564
482
|
lowerCaseGuids: false
|
|
565
483
|
}
|
|
566
484
|
};
|
|
567
|
-
|
|
568
485
|
if (config.options) {
|
|
569
486
|
if (config.options.port && config.options.instanceName) {
|
|
570
487
|
throw new Error('Port and instanceName are mutually exclusive, but ' + config.options.port + ' and ' + config.options.instanceName + ' provided');
|
|
571
488
|
}
|
|
572
|
-
|
|
573
489
|
if (config.options.abortTransactionOnError !== undefined) {
|
|
574
490
|
if (typeof config.options.abortTransactionOnError !== 'boolean' && config.options.abortTransactionOnError !== null) {
|
|
575
491
|
throw new TypeError('The "config.options.abortTransactionOnError" property must be of type string or null.');
|
|
576
492
|
}
|
|
577
|
-
|
|
578
493
|
this.config.options.abortTransactionOnError = config.options.abortTransactionOnError;
|
|
579
494
|
}
|
|
580
|
-
|
|
581
495
|
if (config.options.appName !== undefined) {
|
|
582
496
|
if (typeof config.options.appName !== 'string') {
|
|
583
497
|
throw new TypeError('The "config.options.appName" property must be of type string.');
|
|
584
498
|
}
|
|
585
|
-
|
|
586
499
|
this.config.options.appName = config.options.appName;
|
|
587
500
|
}
|
|
588
|
-
|
|
589
501
|
if (config.options.camelCaseColumns !== undefined) {
|
|
590
502
|
if (typeof config.options.camelCaseColumns !== 'boolean') {
|
|
591
503
|
throw new TypeError('The "config.options.camelCaseColumns" property must be of type boolean.');
|
|
592
504
|
}
|
|
593
|
-
|
|
594
505
|
this.config.options.camelCaseColumns = config.options.camelCaseColumns;
|
|
595
506
|
}
|
|
596
|
-
|
|
597
507
|
if (config.options.cancelTimeout !== undefined) {
|
|
598
508
|
if (typeof config.options.cancelTimeout !== 'number') {
|
|
599
509
|
throw new TypeError('The "config.options.cancelTimeout" property must be of type number.');
|
|
600
510
|
}
|
|
601
|
-
|
|
602
511
|
this.config.options.cancelTimeout = config.options.cancelTimeout;
|
|
603
512
|
}
|
|
604
|
-
|
|
605
513
|
if (config.options.columnNameReplacer) {
|
|
606
514
|
if (typeof config.options.columnNameReplacer !== 'function') {
|
|
607
515
|
throw new TypeError('The "config.options.cancelTimeout" property must be of type function.');
|
|
608
516
|
}
|
|
609
|
-
|
|
610
517
|
this.config.options.columnNameReplacer = config.options.columnNameReplacer;
|
|
611
518
|
}
|
|
612
|
-
|
|
613
519
|
if (config.options.connectionIsolationLevel !== undefined) {
|
|
614
520
|
(0, _transaction.assertValidIsolationLevel)(config.options.connectionIsolationLevel, 'config.options.connectionIsolationLevel');
|
|
615
521
|
this.config.options.connectionIsolationLevel = config.options.connectionIsolationLevel;
|
|
616
522
|
}
|
|
617
|
-
|
|
618
523
|
if (config.options.connectTimeout !== undefined) {
|
|
619
524
|
if (typeof config.options.connectTimeout !== 'number') {
|
|
620
525
|
throw new TypeError('The "config.options.connectTimeout" property must be of type number.');
|
|
621
526
|
}
|
|
622
|
-
|
|
623
527
|
this.config.options.connectTimeout = config.options.connectTimeout;
|
|
624
528
|
}
|
|
625
|
-
|
|
626
529
|
if (config.options.connector !== undefined) {
|
|
627
530
|
if (typeof config.options.connector !== 'function') {
|
|
628
531
|
throw new TypeError('The "config.options.connector" property must be a function.');
|
|
629
532
|
}
|
|
630
|
-
|
|
631
533
|
this.config.options.connector = config.options.connector;
|
|
632
534
|
}
|
|
633
|
-
|
|
634
535
|
if (config.options.cryptoCredentialsDetails !== undefined) {
|
|
635
536
|
if (typeof config.options.cryptoCredentialsDetails !== 'object' || config.options.cryptoCredentialsDetails === null) {
|
|
636
537
|
throw new TypeError('The "config.options.cryptoCredentialsDetails" property must be of type Object.');
|
|
637
538
|
}
|
|
638
|
-
|
|
639
539
|
this.config.options.cryptoCredentialsDetails = config.options.cryptoCredentialsDetails;
|
|
640
540
|
}
|
|
641
|
-
|
|
642
541
|
if (config.options.database !== undefined) {
|
|
643
542
|
if (typeof config.options.database !== 'string') {
|
|
644
543
|
throw new TypeError('The "config.options.database" property must be of type string.');
|
|
645
544
|
}
|
|
646
|
-
|
|
647
545
|
this.config.options.database = config.options.database;
|
|
648
546
|
}
|
|
649
|
-
|
|
650
547
|
if (config.options.datefirst !== undefined) {
|
|
651
548
|
if (typeof config.options.datefirst !== 'number' && config.options.datefirst !== null) {
|
|
652
549
|
throw new TypeError('The "config.options.datefirst" property must be of type number.');
|
|
653
550
|
}
|
|
654
|
-
|
|
655
551
|
if (config.options.datefirst !== null && (config.options.datefirst < 1 || config.options.datefirst > 7)) {
|
|
656
552
|
throw new RangeError('The "config.options.datefirst" property must be >= 1 and <= 7');
|
|
657
553
|
}
|
|
658
|
-
|
|
659
554
|
this.config.options.datefirst = config.options.datefirst;
|
|
660
555
|
}
|
|
661
|
-
|
|
662
556
|
if (config.options.dateFormat !== undefined) {
|
|
663
557
|
if (typeof config.options.dateFormat !== 'string' && config.options.dateFormat !== null) {
|
|
664
558
|
throw new TypeError('The "config.options.dateFormat" property must be of type string or null.');
|
|
665
559
|
}
|
|
666
|
-
|
|
667
560
|
this.config.options.dateFormat = config.options.dateFormat;
|
|
668
561
|
}
|
|
669
|
-
|
|
670
562
|
if (config.options.debug) {
|
|
671
563
|
if (config.options.debug.data !== undefined) {
|
|
672
564
|
if (typeof config.options.debug.data !== 'boolean') {
|
|
673
565
|
throw new TypeError('The "config.options.debug.data" property must be of type boolean.');
|
|
674
566
|
}
|
|
675
|
-
|
|
676
567
|
this.config.options.debug.data = config.options.debug.data;
|
|
677
568
|
}
|
|
678
|
-
|
|
679
569
|
if (config.options.debug.packet !== undefined) {
|
|
680
570
|
if (typeof config.options.debug.packet !== 'boolean') {
|
|
681
571
|
throw new TypeError('The "config.options.debug.packet" property must be of type boolean.');
|
|
682
572
|
}
|
|
683
|
-
|
|
684
573
|
this.config.options.debug.packet = config.options.debug.packet;
|
|
685
574
|
}
|
|
686
|
-
|
|
687
575
|
if (config.options.debug.payload !== undefined) {
|
|
688
576
|
if (typeof config.options.debug.payload !== 'boolean') {
|
|
689
577
|
throw new TypeError('The "config.options.debug.payload" property must be of type boolean.');
|
|
690
578
|
}
|
|
691
|
-
|
|
692
579
|
this.config.options.debug.payload = config.options.debug.payload;
|
|
693
580
|
}
|
|
694
|
-
|
|
695
581
|
if (config.options.debug.token !== undefined) {
|
|
696
582
|
if (typeof config.options.debug.token !== 'boolean') {
|
|
697
583
|
throw new TypeError('The "config.options.debug.token" property must be of type boolean.');
|
|
698
584
|
}
|
|
699
|
-
|
|
700
585
|
this.config.options.debug.token = config.options.debug.token;
|
|
701
586
|
}
|
|
702
587
|
}
|
|
703
|
-
|
|
704
588
|
if (config.options.enableAnsiNull !== undefined) {
|
|
705
589
|
if (typeof config.options.enableAnsiNull !== 'boolean' && config.options.enableAnsiNull !== null) {
|
|
706
590
|
throw new TypeError('The "config.options.enableAnsiNull" property must be of type boolean or null.');
|
|
707
591
|
}
|
|
708
|
-
|
|
709
592
|
this.config.options.enableAnsiNull = config.options.enableAnsiNull;
|
|
710
593
|
}
|
|
711
|
-
|
|
712
594
|
if (config.options.enableAnsiNullDefault !== undefined) {
|
|
713
595
|
if (typeof config.options.enableAnsiNullDefault !== 'boolean' && config.options.enableAnsiNullDefault !== null) {
|
|
714
596
|
throw new TypeError('The "config.options.enableAnsiNullDefault" property must be of type boolean or null.');
|
|
715
597
|
}
|
|
716
|
-
|
|
717
598
|
this.config.options.enableAnsiNullDefault = config.options.enableAnsiNullDefault;
|
|
718
599
|
}
|
|
719
|
-
|
|
720
600
|
if (config.options.enableAnsiPadding !== undefined) {
|
|
721
601
|
if (typeof config.options.enableAnsiPadding !== 'boolean' && config.options.enableAnsiPadding !== null) {
|
|
722
602
|
throw new TypeError('The "config.options.enableAnsiPadding" property must be of type boolean or null.');
|
|
723
603
|
}
|
|
724
|
-
|
|
725
604
|
this.config.options.enableAnsiPadding = config.options.enableAnsiPadding;
|
|
726
605
|
}
|
|
727
|
-
|
|
728
606
|
if (config.options.enableAnsiWarnings !== undefined) {
|
|
729
607
|
if (typeof config.options.enableAnsiWarnings !== 'boolean' && config.options.enableAnsiWarnings !== null) {
|
|
730
608
|
throw new TypeError('The "config.options.enableAnsiWarnings" property must be of type boolean or null.');
|
|
731
609
|
}
|
|
732
|
-
|
|
733
610
|
this.config.options.enableAnsiWarnings = config.options.enableAnsiWarnings;
|
|
734
611
|
}
|
|
735
|
-
|
|
736
612
|
if (config.options.enableArithAbort !== undefined) {
|
|
737
613
|
if (typeof config.options.enableArithAbort !== 'boolean' && config.options.enableArithAbort !== null) {
|
|
738
614
|
throw new TypeError('The "config.options.enableArithAbort" property must be of type boolean or null.');
|
|
739
615
|
}
|
|
740
|
-
|
|
741
616
|
this.config.options.enableArithAbort = config.options.enableArithAbort;
|
|
742
617
|
}
|
|
743
|
-
|
|
744
618
|
if (config.options.enableConcatNullYieldsNull !== undefined) {
|
|
745
619
|
if (typeof config.options.enableConcatNullYieldsNull !== 'boolean' && config.options.enableConcatNullYieldsNull !== null) {
|
|
746
620
|
throw new TypeError('The "config.options.enableConcatNullYieldsNull" property must be of type boolean or null.');
|
|
747
621
|
}
|
|
748
|
-
|
|
749
622
|
this.config.options.enableConcatNullYieldsNull = config.options.enableConcatNullYieldsNull;
|
|
750
623
|
}
|
|
751
|
-
|
|
752
624
|
if (config.options.enableCursorCloseOnCommit !== undefined) {
|
|
753
625
|
if (typeof config.options.enableCursorCloseOnCommit !== 'boolean' && config.options.enableCursorCloseOnCommit !== null) {
|
|
754
626
|
throw new TypeError('The "config.options.enableCursorCloseOnCommit" property must be of type boolean or null.');
|
|
755
627
|
}
|
|
756
|
-
|
|
757
628
|
this.config.options.enableCursorCloseOnCommit = config.options.enableCursorCloseOnCommit;
|
|
758
629
|
}
|
|
759
|
-
|
|
760
630
|
if (config.options.enableImplicitTransactions !== undefined) {
|
|
761
631
|
if (typeof config.options.enableImplicitTransactions !== 'boolean' && config.options.enableImplicitTransactions !== null) {
|
|
762
632
|
throw new TypeError('The "config.options.enableImplicitTransactions" property must be of type boolean or null.');
|
|
763
633
|
}
|
|
764
|
-
|
|
765
634
|
this.config.options.enableImplicitTransactions = config.options.enableImplicitTransactions;
|
|
766
635
|
}
|
|
767
|
-
|
|
768
636
|
if (config.options.enableNumericRoundabort !== undefined) {
|
|
769
637
|
if (typeof config.options.enableNumericRoundabort !== 'boolean' && config.options.enableNumericRoundabort !== null) {
|
|
770
638
|
throw new TypeError('The "config.options.enableNumericRoundabort" property must be of type boolean or null.');
|
|
771
639
|
}
|
|
772
|
-
|
|
773
640
|
this.config.options.enableNumericRoundabort = config.options.enableNumericRoundabort;
|
|
774
641
|
}
|
|
775
|
-
|
|
776
642
|
if (config.options.enableQuotedIdentifier !== undefined) {
|
|
777
643
|
if (typeof config.options.enableQuotedIdentifier !== 'boolean' && config.options.enableQuotedIdentifier !== null) {
|
|
778
644
|
throw new TypeError('The "config.options.enableQuotedIdentifier" property must be of type boolean or null.');
|
|
779
645
|
}
|
|
780
|
-
|
|
781
646
|
this.config.options.enableQuotedIdentifier = config.options.enableQuotedIdentifier;
|
|
782
647
|
}
|
|
783
|
-
|
|
784
648
|
if (config.options.encrypt !== undefined) {
|
|
785
649
|
if (typeof config.options.encrypt !== 'boolean') {
|
|
786
|
-
|
|
650
|
+
if (config.options.encrypt !== 'strict') {
|
|
651
|
+
throw new TypeError('The "encrypt" property must be set to "strict", or of type boolean.');
|
|
652
|
+
}
|
|
787
653
|
}
|
|
788
|
-
|
|
789
654
|
this.config.options.encrypt = config.options.encrypt;
|
|
790
655
|
}
|
|
791
|
-
|
|
792
656
|
if (config.options.fallbackToDefaultDb !== undefined) {
|
|
793
657
|
if (typeof config.options.fallbackToDefaultDb !== 'boolean') {
|
|
794
658
|
throw new TypeError('The "config.options.fallbackToDefaultDb" property must be of type boolean.');
|
|
795
659
|
}
|
|
796
|
-
|
|
797
660
|
this.config.options.fallbackToDefaultDb = config.options.fallbackToDefaultDb;
|
|
798
661
|
}
|
|
799
|
-
|
|
800
662
|
if (config.options.instanceName !== undefined) {
|
|
801
663
|
if (typeof config.options.instanceName !== 'string') {
|
|
802
664
|
throw new TypeError('The "config.options.instanceName" property must be of type string.');
|
|
803
665
|
}
|
|
804
|
-
|
|
805
666
|
this.config.options.instanceName = config.options.instanceName;
|
|
806
667
|
this.config.options.port = undefined;
|
|
807
668
|
}
|
|
808
|
-
|
|
809
669
|
if (config.options.isolationLevel !== undefined) {
|
|
810
670
|
(0, _transaction.assertValidIsolationLevel)(config.options.isolationLevel, 'config.options.isolationLevel');
|
|
811
671
|
this.config.options.isolationLevel = config.options.isolationLevel;
|
|
812
672
|
}
|
|
813
|
-
|
|
814
673
|
if (config.options.language !== undefined) {
|
|
815
674
|
if (typeof config.options.language !== 'string' && config.options.language !== null) {
|
|
816
675
|
throw new TypeError('The "config.options.language" property must be of type string or null.');
|
|
817
676
|
}
|
|
818
|
-
|
|
819
677
|
this.config.options.language = config.options.language;
|
|
820
678
|
}
|
|
821
|
-
|
|
822
679
|
if (config.options.localAddress !== undefined) {
|
|
823
680
|
if (typeof config.options.localAddress !== 'string') {
|
|
824
681
|
throw new TypeError('The "config.options.localAddress" property must be of type string.');
|
|
825
682
|
}
|
|
826
|
-
|
|
827
683
|
this.config.options.localAddress = config.options.localAddress;
|
|
828
684
|
}
|
|
829
|
-
|
|
830
685
|
if (config.options.multiSubnetFailover !== undefined) {
|
|
831
686
|
if (typeof config.options.multiSubnetFailover !== 'boolean') {
|
|
832
687
|
throw new TypeError('The "config.options.multiSubnetFailover" property must be of type boolean.');
|
|
833
688
|
}
|
|
834
|
-
|
|
835
689
|
this.config.options.multiSubnetFailover = config.options.multiSubnetFailover;
|
|
836
690
|
}
|
|
837
|
-
|
|
838
691
|
if (config.options.packetSize !== undefined) {
|
|
839
692
|
if (typeof config.options.packetSize !== 'number') {
|
|
840
693
|
throw new TypeError('The "config.options.packetSize" property must be of type number.');
|
|
841
694
|
}
|
|
842
|
-
|
|
843
695
|
this.config.options.packetSize = config.options.packetSize;
|
|
844
696
|
}
|
|
845
|
-
|
|
846
697
|
if (config.options.port !== undefined) {
|
|
847
698
|
if (typeof config.options.port !== 'number') {
|
|
848
699
|
throw new TypeError('The "config.options.port" property must be of type number.');
|
|
849
700
|
}
|
|
850
|
-
|
|
851
701
|
if (config.options.port <= 0 || config.options.port >= 65536) {
|
|
852
702
|
throw new RangeError('The "config.options.port" property must be > 0 and < 65536');
|
|
853
703
|
}
|
|
854
|
-
|
|
855
704
|
this.config.options.port = config.options.port;
|
|
856
705
|
this.config.options.instanceName = undefined;
|
|
857
706
|
}
|
|
858
|
-
|
|
859
707
|
if (config.options.readOnlyIntent !== undefined) {
|
|
860
708
|
if (typeof config.options.readOnlyIntent !== 'boolean') {
|
|
861
709
|
throw new TypeError('The "config.options.readOnlyIntent" property must be of type boolean.');
|
|
862
710
|
}
|
|
863
|
-
|
|
864
711
|
this.config.options.readOnlyIntent = config.options.readOnlyIntent;
|
|
865
712
|
}
|
|
866
|
-
|
|
867
713
|
if (config.options.requestTimeout !== undefined) {
|
|
868
714
|
if (typeof config.options.requestTimeout !== 'number') {
|
|
869
715
|
throw new TypeError('The "config.options.requestTimeout" property must be of type number.');
|
|
870
716
|
}
|
|
871
|
-
|
|
872
717
|
this.config.options.requestTimeout = config.options.requestTimeout;
|
|
873
718
|
}
|
|
874
|
-
|
|
875
719
|
if (config.options.maxRetriesOnTransientErrors !== undefined) {
|
|
876
720
|
if (typeof config.options.maxRetriesOnTransientErrors !== 'number') {
|
|
877
721
|
throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be of type number.');
|
|
878
722
|
}
|
|
879
|
-
|
|
880
723
|
if (config.options.maxRetriesOnTransientErrors < 0) {
|
|
881
724
|
throw new TypeError('The "config.options.maxRetriesOnTransientErrors" property must be equal or greater than 0.');
|
|
882
725
|
}
|
|
883
|
-
|
|
884
726
|
this.config.options.maxRetriesOnTransientErrors = config.options.maxRetriesOnTransientErrors;
|
|
885
727
|
}
|
|
886
|
-
|
|
887
728
|
if (config.options.connectionRetryInterval !== undefined) {
|
|
888
729
|
if (typeof config.options.connectionRetryInterval !== 'number') {
|
|
889
730
|
throw new TypeError('The "config.options.connectionRetryInterval" property must be of type number.');
|
|
890
731
|
}
|
|
891
|
-
|
|
892
732
|
if (config.options.connectionRetryInterval <= 0) {
|
|
893
733
|
throw new TypeError('The "config.options.connectionRetryInterval" property must be greater than 0.');
|
|
894
734
|
}
|
|
895
|
-
|
|
896
735
|
this.config.options.connectionRetryInterval = config.options.connectionRetryInterval;
|
|
897
736
|
}
|
|
898
|
-
|
|
899
737
|
if (config.options.rowCollectionOnDone !== undefined) {
|
|
900
738
|
if (typeof config.options.rowCollectionOnDone !== 'boolean') {
|
|
901
739
|
throw new TypeError('The "config.options.rowCollectionOnDone" property must be of type boolean.');
|
|
902
740
|
}
|
|
903
|
-
|
|
904
741
|
this.config.options.rowCollectionOnDone = config.options.rowCollectionOnDone;
|
|
905
742
|
}
|
|
906
|
-
|
|
907
743
|
if (config.options.rowCollectionOnRequestCompletion !== undefined) {
|
|
908
744
|
if (typeof config.options.rowCollectionOnRequestCompletion !== 'boolean') {
|
|
909
745
|
throw new TypeError('The "config.options.rowCollectionOnRequestCompletion" property must be of type boolean.');
|
|
910
746
|
}
|
|
911
|
-
|
|
912
747
|
this.config.options.rowCollectionOnRequestCompletion = config.options.rowCollectionOnRequestCompletion;
|
|
913
748
|
}
|
|
914
|
-
|
|
915
749
|
if (config.options.tdsVersion !== undefined) {
|
|
916
750
|
if (typeof config.options.tdsVersion !== 'string') {
|
|
917
751
|
throw new TypeError('The "config.options.tdsVersion" property must be of type string.');
|
|
918
752
|
}
|
|
919
|
-
|
|
920
753
|
this.config.options.tdsVersion = config.options.tdsVersion;
|
|
921
754
|
}
|
|
922
|
-
|
|
923
755
|
if (config.options.textsize !== undefined) {
|
|
924
756
|
if (typeof config.options.textsize !== 'number' && config.options.textsize !== null) {
|
|
925
757
|
throw new TypeError('The "config.options.textsize" property must be of type number or null.');
|
|
926
758
|
}
|
|
927
|
-
|
|
928
759
|
if (config.options.textsize > 2147483647) {
|
|
929
760
|
throw new TypeError('The "config.options.textsize" can\'t be greater than 2147483647.');
|
|
930
761
|
} else if (config.options.textsize < -1) {
|
|
931
762
|
throw new TypeError('The "config.options.textsize" can\'t be smaller than -1.');
|
|
932
763
|
}
|
|
933
|
-
|
|
934
764
|
this.config.options.textsize = config.options.textsize | 0;
|
|
935
765
|
}
|
|
936
|
-
|
|
937
766
|
if (config.options.trustServerCertificate !== undefined) {
|
|
938
767
|
if (typeof config.options.trustServerCertificate !== 'boolean') {
|
|
939
768
|
throw new TypeError('The "config.options.trustServerCertificate" property must be of type boolean.');
|
|
940
769
|
}
|
|
941
|
-
|
|
942
770
|
this.config.options.trustServerCertificate = config.options.trustServerCertificate;
|
|
943
771
|
}
|
|
944
|
-
|
|
772
|
+
if (config.options.serverName !== undefined) {
|
|
773
|
+
if (typeof config.options.serverName !== 'string') {
|
|
774
|
+
throw new TypeError('The "config.options.serverName" property must be of type string.');
|
|
775
|
+
}
|
|
776
|
+
this.config.options.serverName = config.options.serverName;
|
|
777
|
+
}
|
|
945
778
|
if (config.options.useColumnNames !== undefined) {
|
|
946
779
|
if (typeof config.options.useColumnNames !== 'boolean') {
|
|
947
780
|
throw new TypeError('The "config.options.useColumnNames" property must be of type boolean.');
|
|
948
781
|
}
|
|
949
|
-
|
|
950
782
|
this.config.options.useColumnNames = config.options.useColumnNames;
|
|
951
783
|
}
|
|
952
|
-
|
|
953
784
|
if (config.options.useUTC !== undefined) {
|
|
954
785
|
if (typeof config.options.useUTC !== 'boolean') {
|
|
955
786
|
throw new TypeError('The "config.options.useUTC" property must be of type boolean.');
|
|
956
787
|
}
|
|
957
|
-
|
|
958
788
|
this.config.options.useUTC = config.options.useUTC;
|
|
959
789
|
}
|
|
960
|
-
|
|
961
790
|
if (config.options.workstationId !== undefined) {
|
|
962
791
|
if (typeof config.options.workstationId !== 'string') {
|
|
963
792
|
throw new TypeError('The "config.options.workstationId" property must be of type string.');
|
|
964
793
|
}
|
|
965
|
-
|
|
966
794
|
this.config.options.workstationId = config.options.workstationId;
|
|
967
795
|
}
|
|
968
|
-
|
|
969
796
|
if (config.options.lowerCaseGuids !== undefined) {
|
|
970
797
|
if (typeof config.options.lowerCaseGuids !== 'boolean') {
|
|
971
798
|
throw new TypeError('The "config.options.lowerCaseGuids" property must be of type boolean.');
|
|
972
799
|
}
|
|
973
|
-
|
|
974
800
|
this.config.options.lowerCaseGuids = config.options.lowerCaseGuids;
|
|
975
801
|
}
|
|
976
802
|
}
|
|
977
|
-
|
|
978
803
|
this.secureContextOptions = this.config.options.cryptoCredentialsDetails;
|
|
979
|
-
|
|
980
804
|
if (this.secureContextOptions.secureOptions === undefined) {
|
|
981
805
|
// If the caller has not specified their own `secureOptions`,
|
|
982
806
|
// we set `SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS` here.
|
|
@@ -989,15 +813,15 @@ class Connection extends _events.EventEmitter {
|
|
|
989
813
|
}
|
|
990
814
|
});
|
|
991
815
|
}
|
|
992
|
-
|
|
993
816
|
this.debug = this.createDebug();
|
|
994
817
|
this.inTransaction = false;
|
|
995
|
-
this.transactionDescriptors = [Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])];
|
|
818
|
+
this.transactionDescriptors = [Buffer.from([0, 0, 0, 0, 0, 0, 0, 0])];
|
|
819
|
+
|
|
820
|
+
// 'beginTransaction', 'commitTransaction' and 'rollbackTransaction'
|
|
996
821
|
// events are utilized to maintain inTransaction property state which in
|
|
997
822
|
// turn is used in managing transactions. These events are only fired for
|
|
998
823
|
// TDS version 7.2 and beyond. The properties below are used to emulate
|
|
999
824
|
// equivalent behavior for TDS versions before 7.2.
|
|
1000
|
-
|
|
1001
825
|
this.transactionDepth = 0;
|
|
1002
826
|
this.isSqlBatch = false;
|
|
1003
827
|
this.closed = false;
|
|
@@ -1005,69 +829,156 @@ class Connection extends _events.EventEmitter {
|
|
|
1005
829
|
this.curTransientRetryCount = 0;
|
|
1006
830
|
this.transientErrorLookup = new _transientErrorLookup.TransientErrorLookup();
|
|
1007
831
|
this.state = this.STATE.INITIALIZED;
|
|
1008
|
-
|
|
1009
832
|
this._cancelAfterRequestSent = () => {
|
|
1010
833
|
this.messageIo.sendMessage(_packet.TYPE.ATTENTION);
|
|
1011
834
|
this.createCancelTimer();
|
|
1012
835
|
};
|
|
1013
836
|
}
|
|
1014
|
-
|
|
1015
837
|
connect(connectListener) {
|
|
1016
838
|
if (this.state !== this.STATE.INITIALIZED) {
|
|
1017
839
|
throw new _errors.ConnectionError('`.connect` can not be called on a Connection in `' + this.state.name + '` state.');
|
|
1018
840
|
}
|
|
1019
|
-
|
|
1020
841
|
if (connectListener) {
|
|
1021
842
|
const onConnect = err => {
|
|
1022
843
|
this.removeListener('error', onError);
|
|
1023
844
|
connectListener(err);
|
|
1024
845
|
};
|
|
1025
|
-
|
|
1026
846
|
const onError = err => {
|
|
1027
847
|
this.removeListener('connect', onConnect);
|
|
1028
848
|
connectListener(err);
|
|
1029
849
|
};
|
|
1030
|
-
|
|
1031
850
|
this.once('connect', onConnect);
|
|
1032
851
|
this.once('error', onError);
|
|
1033
852
|
}
|
|
1034
|
-
|
|
1035
853
|
this.transitionTo(this.STATE.CONNECTING);
|
|
1036
854
|
}
|
|
855
|
+
|
|
1037
856
|
/**
|
|
1038
857
|
* The server has reported that the charset has changed.
|
|
1039
858
|
*/
|
|
1040
859
|
|
|
860
|
+
/**
|
|
861
|
+
* The attempt to connect and validate has completed.
|
|
862
|
+
*/
|
|
863
|
+
|
|
864
|
+
/**
|
|
865
|
+
* The server has reported that the active database has changed.
|
|
866
|
+
* This may be as a result of a successful login, or a `use` statement.
|
|
867
|
+
*/
|
|
868
|
+
|
|
869
|
+
/**
|
|
870
|
+
* A debug message is available. It may be logged or ignored.
|
|
871
|
+
*/
|
|
872
|
+
|
|
873
|
+
/**
|
|
874
|
+
* Internal error occurs.
|
|
875
|
+
*/
|
|
876
|
+
|
|
877
|
+
/**
|
|
878
|
+
* The server has issued an error message.
|
|
879
|
+
*/
|
|
880
|
+
|
|
881
|
+
/**
|
|
882
|
+
* The connection has ended.
|
|
883
|
+
*
|
|
884
|
+
* This may be as a result of the client calling [[close]], the server
|
|
885
|
+
* closing the connection, or a network error.
|
|
886
|
+
*/
|
|
887
|
+
|
|
888
|
+
/**
|
|
889
|
+
* The server has issued an information message.
|
|
890
|
+
*/
|
|
891
|
+
|
|
892
|
+
/**
|
|
893
|
+
* The server has reported that the language has changed.
|
|
894
|
+
*/
|
|
895
|
+
|
|
896
|
+
/**
|
|
897
|
+
* The connection was reset.
|
|
898
|
+
*/
|
|
899
|
+
|
|
900
|
+
/**
|
|
901
|
+
* A secure connection has been established.
|
|
902
|
+
*/
|
|
1041
903
|
|
|
1042
904
|
on(event, listener) {
|
|
1043
905
|
return super.on(event, listener);
|
|
1044
906
|
}
|
|
907
|
+
|
|
908
|
+
/**
|
|
909
|
+
* @private
|
|
910
|
+
*/
|
|
911
|
+
|
|
912
|
+
/**
|
|
913
|
+
* @private
|
|
914
|
+
*/
|
|
915
|
+
|
|
916
|
+
/**
|
|
917
|
+
* @private
|
|
918
|
+
*/
|
|
919
|
+
|
|
1045
920
|
/**
|
|
1046
921
|
* @private
|
|
1047
922
|
*/
|
|
1048
923
|
|
|
924
|
+
/**
|
|
925
|
+
* @private
|
|
926
|
+
*/
|
|
927
|
+
|
|
928
|
+
/**
|
|
929
|
+
* @private
|
|
930
|
+
*/
|
|
931
|
+
|
|
932
|
+
/**
|
|
933
|
+
* @private
|
|
934
|
+
*/
|
|
935
|
+
|
|
936
|
+
/**
|
|
937
|
+
* @private
|
|
938
|
+
*/
|
|
939
|
+
|
|
940
|
+
/**
|
|
941
|
+
* @private
|
|
942
|
+
*/
|
|
943
|
+
|
|
944
|
+
/**
|
|
945
|
+
* @private
|
|
946
|
+
*/
|
|
947
|
+
|
|
948
|
+
/**
|
|
949
|
+
* @private
|
|
950
|
+
*/
|
|
951
|
+
|
|
952
|
+
/**
|
|
953
|
+
* @private
|
|
954
|
+
*/
|
|
955
|
+
|
|
956
|
+
/**
|
|
957
|
+
* @private
|
|
958
|
+
*/
|
|
959
|
+
|
|
960
|
+
/**
|
|
961
|
+
* @private
|
|
962
|
+
*/
|
|
1049
963
|
|
|
1050
964
|
emit(event, ...args) {
|
|
1051
965
|
return super.emit(event, ...args);
|
|
1052
966
|
}
|
|
967
|
+
|
|
1053
968
|
/**
|
|
1054
969
|
* Closes the connection to the database.
|
|
1055
970
|
*
|
|
1056
971
|
* The [[Event_end]] will be emitted once the connection has been closed.
|
|
1057
972
|
*/
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
973
|
close() {
|
|
1061
974
|
this.transitionTo(this.STATE.FINAL);
|
|
1062
975
|
}
|
|
976
|
+
|
|
1063
977
|
/**
|
|
1064
978
|
* @private
|
|
1065
979
|
*/
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
980
|
initialiseConnection() {
|
|
1069
981
|
const signal = this.createConnectTimer();
|
|
1070
|
-
|
|
1071
982
|
if (this.config.options.port) {
|
|
1072
983
|
return this.connectOnPort(this.config.options.port, this.config.options.multiSubnetFailover, signal, this.config.options.connector);
|
|
1073
984
|
} else {
|
|
@@ -1082,30 +993,26 @@ class Connection extends _events.EventEmitter {
|
|
|
1082
993
|
});
|
|
1083
994
|
}, err => {
|
|
1084
995
|
this.clearConnectTimer();
|
|
1085
|
-
|
|
1086
996
|
if (err.name === 'AbortError') {
|
|
1087
997
|
// Ignore the AbortError for now, this is still handled by the connectTimer firing
|
|
1088
998
|
return;
|
|
1089
999
|
}
|
|
1090
|
-
|
|
1091
1000
|
process.nextTick(() => {
|
|
1092
1001
|
this.emit('connect', new _errors.ConnectionError(err.message, 'EINSTLOOKUP'));
|
|
1093
1002
|
});
|
|
1094
1003
|
});
|
|
1095
1004
|
}
|
|
1096
1005
|
}
|
|
1006
|
+
|
|
1097
1007
|
/**
|
|
1098
1008
|
* @private
|
|
1099
1009
|
*/
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
1010
|
cleanupConnection(cleanupType) {
|
|
1103
1011
|
if (!this.closed) {
|
|
1104
1012
|
this.clearConnectTimer();
|
|
1105
1013
|
this.clearRequestTimer();
|
|
1106
1014
|
this.clearRetryTimer();
|
|
1107
1015
|
this.closeConnection();
|
|
1108
|
-
|
|
1109
1016
|
if (cleanupType === CLEANUP_TYPE.REDIRECT) {
|
|
1110
1017
|
this.emit('rerouting');
|
|
1111
1018
|
} else if (cleanupType !== CLEANUP_TYPE.RETRY) {
|
|
@@ -1113,24 +1020,20 @@ class Connection extends _events.EventEmitter {
|
|
|
1113
1020
|
this.emit('end');
|
|
1114
1021
|
});
|
|
1115
1022
|
}
|
|
1116
|
-
|
|
1117
1023
|
const request = this.request;
|
|
1118
|
-
|
|
1119
1024
|
if (request) {
|
|
1120
1025
|
const err = new _errors.RequestError('Connection closed before request completed.', 'ECLOSE');
|
|
1121
1026
|
request.callback(err);
|
|
1122
1027
|
this.request = undefined;
|
|
1123
1028
|
}
|
|
1124
|
-
|
|
1125
1029
|
this.closed = true;
|
|
1126
1030
|
this.loginError = undefined;
|
|
1127
1031
|
}
|
|
1128
1032
|
}
|
|
1033
|
+
|
|
1129
1034
|
/**
|
|
1130
1035
|
* @private
|
|
1131
1036
|
*/
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
1037
|
createDebug() {
|
|
1135
1038
|
const debug = new _debug.default(this.config.options.debug);
|
|
1136
1039
|
debug.on('debug', message => {
|
|
@@ -1138,15 +1041,55 @@ class Connection extends _events.EventEmitter {
|
|
|
1138
1041
|
});
|
|
1139
1042
|
return debug;
|
|
1140
1043
|
}
|
|
1044
|
+
|
|
1141
1045
|
/**
|
|
1142
1046
|
* @private
|
|
1143
1047
|
*/
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
1048
|
createTokenStreamParser(message, handler) {
|
|
1147
1049
|
return new _tokenStreamParser.Parser(message, this.debug, handler, this.config.options);
|
|
1148
1050
|
}
|
|
1149
|
-
|
|
1051
|
+
socketHandlingForSendPreLogin(socket) {
|
|
1052
|
+
socket.on('error', error => {
|
|
1053
|
+
this.socketError(error);
|
|
1054
|
+
});
|
|
1055
|
+
socket.on('close', () => {
|
|
1056
|
+
this.socketClose();
|
|
1057
|
+
});
|
|
1058
|
+
socket.on('end', () => {
|
|
1059
|
+
this.socketEnd();
|
|
1060
|
+
});
|
|
1061
|
+
socket.setKeepAlive(true, KEEP_ALIVE_INITIAL_DELAY);
|
|
1062
|
+
this.messageIo = new _messageIo.default(socket, this.config.options.packetSize, this.debug);
|
|
1063
|
+
this.messageIo.on('secure', cleartext => {
|
|
1064
|
+
this.emit('secure', cleartext);
|
|
1065
|
+
});
|
|
1066
|
+
this.socket = socket;
|
|
1067
|
+
this.closed = false;
|
|
1068
|
+
this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
|
|
1069
|
+
this.sendPreLogin();
|
|
1070
|
+
this.transitionTo(this.STATE.SENT_PRELOGIN);
|
|
1071
|
+
}
|
|
1072
|
+
wrapWithTls(socket) {
|
|
1073
|
+
return new Promise((resolve, reject) => {
|
|
1074
|
+
const secureContext = tls.createSecureContext(this.secureContextOptions);
|
|
1075
|
+
// If connect to an ip address directly,
|
|
1076
|
+
// need to set the servername to an empty string
|
|
1077
|
+
// if the user has not given a servername explicitly
|
|
1078
|
+
const serverName = !net.isIP(this.config.server) ? this.config.server : '';
|
|
1079
|
+
const encryptOptions = {
|
|
1080
|
+
host: this.config.server,
|
|
1081
|
+
socket: socket,
|
|
1082
|
+
ALPNProtocols: ['tds/8.0'],
|
|
1083
|
+
secureContext: secureContext,
|
|
1084
|
+
servername: this.config.options.serverName ? this.config.options.serverName : serverName
|
|
1085
|
+
};
|
|
1086
|
+
const encryptsocket = tls.connect(encryptOptions, () => {
|
|
1087
|
+
encryptsocket.removeListener('error', reject);
|
|
1088
|
+
resolve(encryptsocket);
|
|
1089
|
+
});
|
|
1090
|
+
encryptsocket.once('error', reject);
|
|
1091
|
+
});
|
|
1092
|
+
}
|
|
1150
1093
|
connectOnPort(port, multiSubnetFailover, signal, customConnector) {
|
|
1151
1094
|
const connectOpts = {
|
|
1152
1095
|
host: this.routingData ? this.routingData.server : this.config.server,
|
|
@@ -1154,55 +1097,41 @@ class Connection extends _events.EventEmitter {
|
|
|
1154
1097
|
localAddress: this.config.options.localAddress
|
|
1155
1098
|
};
|
|
1156
1099
|
const connect = customConnector || (multiSubnetFailover ? _connector.connectInParallel : _connector.connectInSequence);
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
this.messageIo.on('secure', cleartext => {
|
|
1171
|
-
this.emit('secure', cleartext);
|
|
1172
|
-
});
|
|
1173
|
-
this.socket = socket;
|
|
1174
|
-
this.closed = false;
|
|
1175
|
-
this.debug.log('connected to ' + this.config.server + ':' + this.config.options.port);
|
|
1176
|
-
this.sendPreLogin();
|
|
1177
|
-
this.transitionTo(this.STATE.SENT_PRELOGIN);
|
|
1178
|
-
});
|
|
1179
|
-
}, err => {
|
|
1100
|
+
(async () => {
|
|
1101
|
+
let socket = await connect(connectOpts, _dns.default.lookup, signal);
|
|
1102
|
+
if (this.config.options.encrypt === 'strict') {
|
|
1103
|
+
try {
|
|
1104
|
+
// Wrap the socket with TLS for TDS 8.0
|
|
1105
|
+
socket = await this.wrapWithTls(socket);
|
|
1106
|
+
} catch (err) {
|
|
1107
|
+
socket.end();
|
|
1108
|
+
throw err;
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
this.socketHandlingForSendPreLogin(socket);
|
|
1112
|
+
})().catch(err => {
|
|
1180
1113
|
this.clearConnectTimer();
|
|
1181
|
-
|
|
1182
1114
|
if (err.name === 'AbortError') {
|
|
1183
1115
|
return;
|
|
1184
1116
|
}
|
|
1185
|
-
|
|
1186
1117
|
process.nextTick(() => {
|
|
1187
1118
|
this.socketError(err);
|
|
1188
1119
|
});
|
|
1189
1120
|
});
|
|
1190
1121
|
}
|
|
1122
|
+
|
|
1191
1123
|
/**
|
|
1192
1124
|
* @private
|
|
1193
1125
|
*/
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
1126
|
closeConnection() {
|
|
1197
1127
|
if (this.socket) {
|
|
1198
1128
|
this.socket.destroy();
|
|
1199
1129
|
}
|
|
1200
1130
|
}
|
|
1131
|
+
|
|
1201
1132
|
/**
|
|
1202
1133
|
* @private
|
|
1203
1134
|
*/
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
1135
|
createConnectTimer() {
|
|
1207
1136
|
const controller = new _nodeAbortController.AbortController();
|
|
1208
1137
|
this.connectTimer = setTimeout(() => {
|
|
@@ -1211,76 +1140,74 @@ class Connection extends _events.EventEmitter {
|
|
|
1211
1140
|
}, this.config.options.connectTimeout);
|
|
1212
1141
|
return controller.signal;
|
|
1213
1142
|
}
|
|
1143
|
+
|
|
1214
1144
|
/**
|
|
1215
1145
|
* @private
|
|
1216
1146
|
*/
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
1147
|
createCancelTimer() {
|
|
1220
1148
|
this.clearCancelTimer();
|
|
1221
1149
|
const timeout = this.config.options.cancelTimeout;
|
|
1222
|
-
|
|
1223
1150
|
if (timeout > 0) {
|
|
1224
1151
|
this.cancelTimer = setTimeout(() => {
|
|
1225
1152
|
this.cancelTimeout();
|
|
1226
1153
|
}, timeout);
|
|
1227
1154
|
}
|
|
1228
1155
|
}
|
|
1156
|
+
|
|
1229
1157
|
/**
|
|
1230
1158
|
* @private
|
|
1231
1159
|
*/
|
|
1232
|
-
|
|
1233
|
-
|
|
1234
1160
|
createRequestTimer() {
|
|
1235
1161
|
this.clearRequestTimer(); // release old timer, just to be safe
|
|
1236
|
-
|
|
1237
1162
|
const request = this.request;
|
|
1238
1163
|
const timeout = request.timeout !== undefined ? request.timeout : this.config.options.requestTimeout;
|
|
1239
|
-
|
|
1240
1164
|
if (timeout) {
|
|
1241
1165
|
this.requestTimer = setTimeout(() => {
|
|
1242
1166
|
this.requestTimeout();
|
|
1243
1167
|
}, timeout);
|
|
1244
1168
|
}
|
|
1245
1169
|
}
|
|
1170
|
+
|
|
1246
1171
|
/**
|
|
1247
1172
|
* @private
|
|
1248
1173
|
*/
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
1174
|
createRetryTimer() {
|
|
1252
1175
|
this.clearRetryTimer();
|
|
1253
1176
|
this.retryTimer = setTimeout(() => {
|
|
1254
1177
|
this.retryTimeout();
|
|
1255
1178
|
}, this.config.options.connectionRetryInterval);
|
|
1256
1179
|
}
|
|
1180
|
+
|
|
1257
1181
|
/**
|
|
1258
1182
|
* @private
|
|
1259
1183
|
*/
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
1184
|
connectTimeout() {
|
|
1263
|
-
const
|
|
1185
|
+
const hostPostfix = this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`;
|
|
1186
|
+
// If we have routing data stored, this connection has been redirected
|
|
1187
|
+
const server = this.routingData ? this.routingData.server : this.config.server;
|
|
1188
|
+
const port = this.routingData ? `:${this.routingData.port}` : hostPostfix;
|
|
1189
|
+
// Grab the target host from the connection configration, and from a redirect message
|
|
1190
|
+
// otherwise, leave the message empty.
|
|
1191
|
+
const routingMessage = this.routingData ? ` (redirected from ${this.config.server}${hostPostfix})` : '';
|
|
1192
|
+
const message = `Failed to connect to ${server}${port}${routingMessage} in ${this.config.options.connectTimeout}ms`;
|
|
1264
1193
|
this.debug.log(message);
|
|
1265
1194
|
this.emit('connect', new _errors.ConnectionError(message, 'ETIMEOUT'));
|
|
1266
1195
|
this.connectTimer = undefined;
|
|
1267
1196
|
this.dispatchEvent('connectTimeout');
|
|
1268
1197
|
}
|
|
1198
|
+
|
|
1269
1199
|
/**
|
|
1270
1200
|
* @private
|
|
1271
1201
|
*/
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
1202
|
cancelTimeout() {
|
|
1275
1203
|
const message = `Failed to cancel request in ${this.config.options.cancelTimeout}ms`;
|
|
1276
1204
|
this.debug.log(message);
|
|
1277
1205
|
this.dispatchEvent('socketError', new _errors.ConnectionError(message, 'ETIMEOUT'));
|
|
1278
1206
|
}
|
|
1207
|
+
|
|
1279
1208
|
/**
|
|
1280
1209
|
* @private
|
|
1281
1210
|
*/
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
1211
|
requestTimeout() {
|
|
1285
1212
|
this.requestTimer = undefined;
|
|
1286
1213
|
const request = this.request;
|
|
@@ -1289,104 +1216,90 @@ class Connection extends _events.EventEmitter {
|
|
|
1289
1216
|
const message = 'Timeout: Request failed to complete in ' + timeout + 'ms';
|
|
1290
1217
|
request.error = new _errors.RequestError(message, 'ETIMEOUT');
|
|
1291
1218
|
}
|
|
1219
|
+
|
|
1292
1220
|
/**
|
|
1293
1221
|
* @private
|
|
1294
1222
|
*/
|
|
1295
|
-
|
|
1296
|
-
|
|
1297
1223
|
retryTimeout() {
|
|
1298
1224
|
this.retryTimer = undefined;
|
|
1299
1225
|
this.emit('retry');
|
|
1300
1226
|
this.transitionTo(this.STATE.CONNECTING);
|
|
1301
1227
|
}
|
|
1228
|
+
|
|
1302
1229
|
/**
|
|
1303
1230
|
* @private
|
|
1304
|
-
*/
|
|
1305
|
-
|
|
1306
|
-
|
|
1231
|
+
*/
|
|
1307
1232
|
clearConnectTimer() {
|
|
1308
1233
|
if (this.connectTimer) {
|
|
1309
1234
|
clearTimeout(this.connectTimer);
|
|
1310
1235
|
this.connectTimer = undefined;
|
|
1311
1236
|
}
|
|
1312
1237
|
}
|
|
1238
|
+
|
|
1313
1239
|
/**
|
|
1314
1240
|
* @private
|
|
1315
1241
|
*/
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
1242
|
clearCancelTimer() {
|
|
1319
1243
|
if (this.cancelTimer) {
|
|
1320
1244
|
clearTimeout(this.cancelTimer);
|
|
1321
1245
|
this.cancelTimer = undefined;
|
|
1322
1246
|
}
|
|
1323
1247
|
}
|
|
1248
|
+
|
|
1324
1249
|
/**
|
|
1325
1250
|
* @private
|
|
1326
1251
|
*/
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
1252
|
clearRequestTimer() {
|
|
1330
1253
|
if (this.requestTimer) {
|
|
1331
1254
|
clearTimeout(this.requestTimer);
|
|
1332
1255
|
this.requestTimer = undefined;
|
|
1333
1256
|
}
|
|
1334
1257
|
}
|
|
1258
|
+
|
|
1335
1259
|
/**
|
|
1336
1260
|
* @private
|
|
1337
1261
|
*/
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
1262
|
clearRetryTimer() {
|
|
1341
1263
|
if (this.retryTimer) {
|
|
1342
1264
|
clearTimeout(this.retryTimer);
|
|
1343
1265
|
this.retryTimer = undefined;
|
|
1344
1266
|
}
|
|
1345
1267
|
}
|
|
1268
|
+
|
|
1346
1269
|
/**
|
|
1347
1270
|
* @private
|
|
1348
1271
|
*/
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
1272
|
transitionTo(newState) {
|
|
1352
1273
|
if (this.state === newState) {
|
|
1353
1274
|
this.debug.log('State is already ' + newState.name);
|
|
1354
1275
|
return;
|
|
1355
1276
|
}
|
|
1356
|
-
|
|
1357
1277
|
if (this.state && this.state.exit) {
|
|
1358
1278
|
this.state.exit.call(this, newState);
|
|
1359
1279
|
}
|
|
1360
|
-
|
|
1361
1280
|
this.debug.log('State change: ' + (this.state ? this.state.name : 'undefined') + ' -> ' + newState.name);
|
|
1362
1281
|
this.state = newState;
|
|
1363
|
-
|
|
1364
1282
|
if (this.state.enter) {
|
|
1365
1283
|
this.state.enter.apply(this);
|
|
1366
1284
|
}
|
|
1367
1285
|
}
|
|
1286
|
+
|
|
1368
1287
|
/**
|
|
1369
1288
|
* @private
|
|
1370
1289
|
*/
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
1290
|
getEventHandler(eventName) {
|
|
1374
1291
|
const handler = this.state.events[eventName];
|
|
1375
|
-
|
|
1376
1292
|
if (!handler) {
|
|
1377
1293
|
throw new Error(`No event '${eventName}' in state '${this.state.name}'`);
|
|
1378
1294
|
}
|
|
1379
|
-
|
|
1380
1295
|
return handler;
|
|
1381
1296
|
}
|
|
1297
|
+
|
|
1382
1298
|
/**
|
|
1383
1299
|
* @private
|
|
1384
1300
|
*/
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
1301
|
dispatchEvent(eventName, ...args) {
|
|
1388
1302
|
const handler = this.state.events[eventName];
|
|
1389
|
-
|
|
1390
1303
|
if (handler) {
|
|
1391
1304
|
handler.apply(this, args);
|
|
1392
1305
|
} else {
|
|
@@ -1394,14 +1307,20 @@ class Connection extends _events.EventEmitter {
|
|
|
1394
1307
|
this.close();
|
|
1395
1308
|
}
|
|
1396
1309
|
}
|
|
1310
|
+
|
|
1397
1311
|
/**
|
|
1398
1312
|
* @private
|
|
1399
1313
|
*/
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
1314
|
socketError(error) {
|
|
1403
1315
|
if (this.state === this.STATE.CONNECTING || this.state === this.STATE.SENT_TLSSSLNEGOTIATION) {
|
|
1404
|
-
const
|
|
1316
|
+
const hostPostfix = this.config.options.port ? `:${this.config.options.port}` : `\\${this.config.options.instanceName}`;
|
|
1317
|
+
// If we have routing data stored, this connection has been redirected
|
|
1318
|
+
const server = this.routingData ? this.routingData.server : this.config.server;
|
|
1319
|
+
const port = this.routingData ? `:${this.routingData.port}` : hostPostfix;
|
|
1320
|
+
// Grab the target host from the connection configration, and from a redirect message
|
|
1321
|
+
// otherwise, leave the message empty.
|
|
1322
|
+
const routingMessage = this.routingData ? ` (redirected from ${this.config.server}${hostPostfix})` : '';
|
|
1323
|
+
const message = `Failed to connect to ${server}${port}${routingMessage} - ${error.message}`;
|
|
1405
1324
|
this.debug.log(message);
|
|
1406
1325
|
this.emit('connect', new _errors.ConnectionError(message, 'ESOCKET'));
|
|
1407
1326
|
} else {
|
|
@@ -1409,31 +1328,26 @@ class Connection extends _events.EventEmitter {
|
|
|
1409
1328
|
this.debug.log(message);
|
|
1410
1329
|
this.emit('error', new _errors.ConnectionError(message, 'ESOCKET'));
|
|
1411
1330
|
}
|
|
1412
|
-
|
|
1413
1331
|
this.dispatchEvent('socketError', error);
|
|
1414
1332
|
}
|
|
1333
|
+
|
|
1415
1334
|
/**
|
|
1416
1335
|
* @private
|
|
1417
1336
|
*/
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
1337
|
socketEnd() {
|
|
1421
1338
|
this.debug.log('socket ended');
|
|
1422
|
-
|
|
1423
1339
|
if (this.state !== this.STATE.FINAL) {
|
|
1424
1340
|
const error = new Error('socket hang up');
|
|
1425
1341
|
error.code = 'ECONNRESET';
|
|
1426
1342
|
this.socketError(error);
|
|
1427
1343
|
}
|
|
1428
1344
|
}
|
|
1345
|
+
|
|
1429
1346
|
/**
|
|
1430
1347
|
* @private
|
|
1431
1348
|
*/
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
1349
|
socketClose() {
|
|
1435
1350
|
this.debug.log('connection to ' + this.config.server + ':' + this.config.options.port + ' closed');
|
|
1436
|
-
|
|
1437
1351
|
if (this.state === this.STATE.REROUTING) {
|
|
1438
1352
|
this.debug.log('Rerouting to ' + this.routingData.server + ':' + this.routingData.port);
|
|
1439
1353
|
this.dispatchEvent('reconnect');
|
|
@@ -1446,15 +1360,17 @@ class Connection extends _events.EventEmitter {
|
|
|
1446
1360
|
this.transitionTo(this.STATE.FINAL);
|
|
1447
1361
|
}
|
|
1448
1362
|
}
|
|
1363
|
+
|
|
1449
1364
|
/**
|
|
1450
1365
|
* @private
|
|
1451
1366
|
*/
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
1367
|
sendPreLogin() {
|
|
1455
1368
|
const [, major, minor, build] = /^(\d+)\.(\d+)\.(\d+)/.exec(_package.version) ?? ['0.0.0', '0', '0', '0'];
|
|
1456
1369
|
const payload = new _preloginPayload.default({
|
|
1457
|
-
encrypt
|
|
1370
|
+
// If encrypt setting is set to 'strict', then we should have already done the encryption before calling
|
|
1371
|
+
// this function. Therefore, the encrypt will be set to false here.
|
|
1372
|
+
// Otherwise, we will set encrypt here based on the encrypt Boolean value from the configuration.
|
|
1373
|
+
encrypt: typeof this.config.options.encrypt === 'boolean' && this.config.options.encrypt,
|
|
1458
1374
|
version: {
|
|
1459
1375
|
major: Number(major),
|
|
1460
1376
|
minor: Number(minor),
|
|
@@ -1467,11 +1383,10 @@ class Connection extends _events.EventEmitter {
|
|
|
1467
1383
|
return payload.toString(' ');
|
|
1468
1384
|
});
|
|
1469
1385
|
}
|
|
1386
|
+
|
|
1470
1387
|
/**
|
|
1471
1388
|
* @private
|
|
1472
1389
|
*/
|
|
1473
|
-
|
|
1474
|
-
|
|
1475
1390
|
sendLogin7Packet() {
|
|
1476
1391
|
const payload = new _login7Payload.default({
|
|
1477
1392
|
tdsVersion: _tdsVersions.versions[this.config.options.tdsVersion],
|
|
@@ -1485,7 +1400,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1485
1400
|
const {
|
|
1486
1401
|
authentication
|
|
1487
1402
|
} = this.config;
|
|
1488
|
-
|
|
1489
1403
|
switch (authentication.type) {
|
|
1490
1404
|
case 'azure-active-directory-password':
|
|
1491
1405
|
payload.fedAuth = {
|
|
@@ -1494,7 +1408,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1494
1408
|
workflow: 'default'
|
|
1495
1409
|
};
|
|
1496
1410
|
break;
|
|
1497
|
-
|
|
1498
1411
|
case 'azure-active-directory-access-token':
|
|
1499
1412
|
payload.fedAuth = {
|
|
1500
1413
|
type: 'SECURITYTOKEN',
|
|
@@ -1502,7 +1415,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1502
1415
|
fedAuthToken: authentication.options.token
|
|
1503
1416
|
};
|
|
1504
1417
|
break;
|
|
1505
|
-
|
|
1506
1418
|
case 'azure-active-directory-msi-vm':
|
|
1507
1419
|
case 'azure-active-directory-default':
|
|
1508
1420
|
case 'azure-active-directory-msi-app-service':
|
|
@@ -1513,18 +1425,15 @@ class Connection extends _events.EventEmitter {
|
|
|
1513
1425
|
workflow: 'integrated'
|
|
1514
1426
|
};
|
|
1515
1427
|
break;
|
|
1516
|
-
|
|
1517
1428
|
case 'ntlm':
|
|
1518
1429
|
payload.sspi = (0, _ntlm.createNTLMRequest)({
|
|
1519
1430
|
domain: authentication.options.domain
|
|
1520
1431
|
});
|
|
1521
1432
|
break;
|
|
1522
|
-
|
|
1523
1433
|
default:
|
|
1524
1434
|
payload.userName = authentication.options.userName;
|
|
1525
1435
|
payload.password = authentication.options.password;
|
|
1526
1436
|
}
|
|
1527
|
-
|
|
1528
1437
|
payload.hostname = this.config.options.workstationId || _os.default.hostname();
|
|
1529
1438
|
payload.serverName = this.routingData ? this.routingData.server : this.config.server;
|
|
1530
1439
|
payload.appName = this.config.options.appName || 'Tedious';
|
|
@@ -1540,11 +1449,10 @@ class Connection extends _events.EventEmitter {
|
|
|
1540
1449
|
return payload.toString(' ');
|
|
1541
1450
|
});
|
|
1542
1451
|
}
|
|
1452
|
+
|
|
1543
1453
|
/**
|
|
1544
1454
|
* @private
|
|
1545
1455
|
*/
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
1456
|
sendFedAuthTokenMessage(token) {
|
|
1549
1457
|
const accessTokenLen = Buffer.byteLength(token, 'ucs2');
|
|
1550
1458
|
const data = Buffer.alloc(8 + accessTokenLen);
|
|
@@ -1552,129 +1460,109 @@ class Connection extends _events.EventEmitter {
|
|
|
1552
1460
|
offset = data.writeUInt32LE(accessTokenLen + 4, offset);
|
|
1553
1461
|
offset = data.writeUInt32LE(accessTokenLen, offset);
|
|
1554
1462
|
data.write(token, offset, 'ucs2');
|
|
1555
|
-
this.messageIo.sendMessage(_packet.TYPE.FEDAUTH_TOKEN, data);
|
|
1556
|
-
|
|
1463
|
+
this.messageIo.sendMessage(_packet.TYPE.FEDAUTH_TOKEN, data);
|
|
1464
|
+
// sent the fedAuth token message, the rest is similar to standard login 7
|
|
1557
1465
|
this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN);
|
|
1558
1466
|
}
|
|
1467
|
+
|
|
1559
1468
|
/**
|
|
1560
1469
|
* @private
|
|
1561
1470
|
*/
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
1471
|
sendInitialSql() {
|
|
1565
1472
|
const payload = new _sqlbatchPayload.default(this.getInitialSql(), this.currentTransactionDescriptor(), this.config.options);
|
|
1566
1473
|
const message = new _message.default({
|
|
1567
1474
|
type: _packet.TYPE.SQL_BATCH
|
|
1568
1475
|
});
|
|
1569
1476
|
this.messageIo.outgoingMessageStream.write(message);
|
|
1570
|
-
|
|
1571
1477
|
_stream.Readable.from(payload).pipe(message);
|
|
1572
1478
|
}
|
|
1479
|
+
|
|
1573
1480
|
/**
|
|
1574
1481
|
* @private
|
|
1575
1482
|
*/
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
1483
|
getInitialSql() {
|
|
1579
1484
|
const options = [];
|
|
1580
|
-
|
|
1581
1485
|
if (this.config.options.enableAnsiNull === true) {
|
|
1582
1486
|
options.push('set ansi_nulls on');
|
|
1583
1487
|
} else if (this.config.options.enableAnsiNull === false) {
|
|
1584
1488
|
options.push('set ansi_nulls off');
|
|
1585
1489
|
}
|
|
1586
|
-
|
|
1587
1490
|
if (this.config.options.enableAnsiNullDefault === true) {
|
|
1588
1491
|
options.push('set ansi_null_dflt_on on');
|
|
1589
1492
|
} else if (this.config.options.enableAnsiNullDefault === false) {
|
|
1590
1493
|
options.push('set ansi_null_dflt_on off');
|
|
1591
1494
|
}
|
|
1592
|
-
|
|
1593
1495
|
if (this.config.options.enableAnsiPadding === true) {
|
|
1594
1496
|
options.push('set ansi_padding on');
|
|
1595
1497
|
} else if (this.config.options.enableAnsiPadding === false) {
|
|
1596
1498
|
options.push('set ansi_padding off');
|
|
1597
1499
|
}
|
|
1598
|
-
|
|
1599
1500
|
if (this.config.options.enableAnsiWarnings === true) {
|
|
1600
1501
|
options.push('set ansi_warnings on');
|
|
1601
1502
|
} else if (this.config.options.enableAnsiWarnings === false) {
|
|
1602
1503
|
options.push('set ansi_warnings off');
|
|
1603
1504
|
}
|
|
1604
|
-
|
|
1605
1505
|
if (this.config.options.enableArithAbort === true) {
|
|
1606
1506
|
options.push('set arithabort on');
|
|
1607
1507
|
} else if (this.config.options.enableArithAbort === false) {
|
|
1608
1508
|
options.push('set arithabort off');
|
|
1609
1509
|
}
|
|
1610
|
-
|
|
1611
1510
|
if (this.config.options.enableConcatNullYieldsNull === true) {
|
|
1612
1511
|
options.push('set concat_null_yields_null on');
|
|
1613
1512
|
} else if (this.config.options.enableConcatNullYieldsNull === false) {
|
|
1614
1513
|
options.push('set concat_null_yields_null off');
|
|
1615
1514
|
}
|
|
1616
|
-
|
|
1617
1515
|
if (this.config.options.enableCursorCloseOnCommit === true) {
|
|
1618
1516
|
options.push('set cursor_close_on_commit on');
|
|
1619
1517
|
} else if (this.config.options.enableCursorCloseOnCommit === false) {
|
|
1620
1518
|
options.push('set cursor_close_on_commit off');
|
|
1621
1519
|
}
|
|
1622
|
-
|
|
1623
1520
|
if (this.config.options.datefirst !== null) {
|
|
1624
1521
|
options.push(`set datefirst ${this.config.options.datefirst}`);
|
|
1625
1522
|
}
|
|
1626
|
-
|
|
1627
1523
|
if (this.config.options.dateFormat !== null) {
|
|
1628
1524
|
options.push(`set dateformat ${this.config.options.dateFormat}`);
|
|
1629
1525
|
}
|
|
1630
|
-
|
|
1631
1526
|
if (this.config.options.enableImplicitTransactions === true) {
|
|
1632
1527
|
options.push('set implicit_transactions on');
|
|
1633
1528
|
} else if (this.config.options.enableImplicitTransactions === false) {
|
|
1634
1529
|
options.push('set implicit_transactions off');
|
|
1635
1530
|
}
|
|
1636
|
-
|
|
1637
1531
|
if (this.config.options.language !== null) {
|
|
1638
1532
|
options.push(`set language ${this.config.options.language}`);
|
|
1639
1533
|
}
|
|
1640
|
-
|
|
1641
1534
|
if (this.config.options.enableNumericRoundabort === true) {
|
|
1642
1535
|
options.push('set numeric_roundabort on');
|
|
1643
1536
|
} else if (this.config.options.enableNumericRoundabort === false) {
|
|
1644
1537
|
options.push('set numeric_roundabort off');
|
|
1645
1538
|
}
|
|
1646
|
-
|
|
1647
1539
|
if (this.config.options.enableQuotedIdentifier === true) {
|
|
1648
1540
|
options.push('set quoted_identifier on');
|
|
1649
1541
|
} else if (this.config.options.enableQuotedIdentifier === false) {
|
|
1650
1542
|
options.push('set quoted_identifier off');
|
|
1651
1543
|
}
|
|
1652
|
-
|
|
1653
1544
|
if (this.config.options.textsize !== null) {
|
|
1654
1545
|
options.push(`set textsize ${this.config.options.textsize}`);
|
|
1655
1546
|
}
|
|
1656
|
-
|
|
1657
1547
|
if (this.config.options.connectionIsolationLevel !== null) {
|
|
1658
1548
|
options.push(`set transaction isolation level ${this.getIsolationLevelText(this.config.options.connectionIsolationLevel)}`);
|
|
1659
1549
|
}
|
|
1660
|
-
|
|
1661
1550
|
if (this.config.options.abortTransactionOnError === true) {
|
|
1662
1551
|
options.push('set xact_abort on');
|
|
1663
1552
|
} else if (this.config.options.abortTransactionOnError === false) {
|
|
1664
1553
|
options.push('set xact_abort off');
|
|
1665
1554
|
}
|
|
1666
|
-
|
|
1667
1555
|
return options.join('\n');
|
|
1668
1556
|
}
|
|
1557
|
+
|
|
1669
1558
|
/**
|
|
1670
1559
|
* @private
|
|
1671
1560
|
*/
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
1561
|
processedInitialSql() {
|
|
1675
1562
|
this.clearConnectTimer();
|
|
1676
1563
|
this.emit('connect');
|
|
1677
1564
|
}
|
|
1565
|
+
|
|
1678
1566
|
/**
|
|
1679
1567
|
* Execute the SQL batch represented by [[Request]].
|
|
1680
1568
|
* There is no param support, and unlike [[Request.execSql]],
|
|
@@ -1684,11 +1572,10 @@ class Connection extends _events.EventEmitter {
|
|
|
1684
1572
|
*
|
|
1685
1573
|
* @param request A [[Request]] object representing the request.
|
|
1686
1574
|
*/
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
1575
|
execSqlBatch(request) {
|
|
1690
1576
|
this.makeRequest(request, _packet.TYPE.SQL_BATCH, new _sqlbatchPayload.default(request.sqlTextOrProcedure, this.currentTransactionDescriptor(), this.config.options));
|
|
1691
1577
|
}
|
|
1578
|
+
|
|
1692
1579
|
/**
|
|
1693
1580
|
* Execute the SQL represented by [[Request]].
|
|
1694
1581
|
*
|
|
@@ -1704,8 +1591,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1704
1591
|
*
|
|
1705
1592
|
* @param request A [[Request]] object representing the request.
|
|
1706
1593
|
*/
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
1594
|
execSql(request) {
|
|
1710
1595
|
try {
|
|
1711
1596
|
request.validateParameters(this.databaseCollation);
|
|
@@ -1717,7 +1602,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1717
1602
|
});
|
|
1718
1603
|
return;
|
|
1719
1604
|
}
|
|
1720
|
-
|
|
1721
1605
|
const parameters = [];
|
|
1722
1606
|
parameters.push({
|
|
1723
1607
|
type: _dataType.TYPES.NVarChar,
|
|
@@ -1728,7 +1612,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1728
1612
|
precision: undefined,
|
|
1729
1613
|
scale: undefined
|
|
1730
1614
|
});
|
|
1731
|
-
|
|
1732
1615
|
if (request.parameters.length) {
|
|
1733
1616
|
parameters.push({
|
|
1734
1617
|
type: _dataType.TYPES.NVarChar,
|
|
@@ -1741,9 +1624,9 @@ class Connection extends _events.EventEmitter {
|
|
|
1741
1624
|
});
|
|
1742
1625
|
parameters.push(...request.parameters);
|
|
1743
1626
|
}
|
|
1744
|
-
|
|
1745
1627
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_ExecuteSql, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
1746
1628
|
}
|
|
1629
|
+
|
|
1747
1630
|
/**
|
|
1748
1631
|
* Creates a new BulkLoad instance.
|
|
1749
1632
|
*
|
|
@@ -1751,23 +1634,20 @@ class Connection extends _events.EventEmitter {
|
|
|
1751
1634
|
* @param options A set of bulk load options.
|
|
1752
1635
|
*/
|
|
1753
1636
|
|
|
1754
|
-
|
|
1755
1637
|
newBulkLoad(table, callbackOrOptions, callback) {
|
|
1756
1638
|
let options;
|
|
1757
|
-
|
|
1758
1639
|
if (callback === undefined) {
|
|
1759
1640
|
callback = callbackOrOptions;
|
|
1760
1641
|
options = {};
|
|
1761
1642
|
} else {
|
|
1762
1643
|
options = callbackOrOptions;
|
|
1763
1644
|
}
|
|
1764
|
-
|
|
1765
1645
|
if (typeof options !== 'object') {
|
|
1766
1646
|
throw new TypeError('"options" argument must be an object');
|
|
1767
1647
|
}
|
|
1768
|
-
|
|
1769
1648
|
return new _bulkLoad.default(table, this.databaseCollation, this.config.options, options, callback);
|
|
1770
1649
|
}
|
|
1650
|
+
|
|
1771
1651
|
/**
|
|
1772
1652
|
* Execute a [[BulkLoad]].
|
|
1773
1653
|
*
|
|
@@ -1802,28 +1682,25 @@ class Connection extends _events.EventEmitter {
|
|
|
1802
1682
|
* @param rows A [[Iterable]] or [[AsyncIterable]] that contains the rows that should be bulk loaded.
|
|
1803
1683
|
*/
|
|
1804
1684
|
|
|
1805
|
-
|
|
1806
1685
|
execBulkLoad(bulkLoad, rows) {
|
|
1807
1686
|
bulkLoad.executionStarted = true;
|
|
1808
|
-
|
|
1809
1687
|
if (rows) {
|
|
1810
1688
|
if (bulkLoad.streamingMode) {
|
|
1811
1689
|
throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that was put in streaming mode.");
|
|
1812
1690
|
}
|
|
1813
|
-
|
|
1814
1691
|
if (bulkLoad.firstRowWritten) {
|
|
1815
1692
|
throw new Error("Connection.execBulkLoad can't be called with a BulkLoad that already has rows written to it.");
|
|
1816
1693
|
}
|
|
1694
|
+
const rowStream = _stream.Readable.from(rows);
|
|
1817
1695
|
|
|
1818
|
-
|
|
1696
|
+
// Destroy the packet transform if an error happens in the row stream,
|
|
1819
1697
|
// e.g. if an error is thrown from within a generator or stream.
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
1698
|
rowStream.on('error', err => {
|
|
1823
1699
|
bulkLoad.rowToPacketTransform.destroy(err);
|
|
1824
|
-
});
|
|
1825
|
-
// e.g. if the bulk load is cancelled.
|
|
1700
|
+
});
|
|
1826
1701
|
|
|
1702
|
+
// Destroy the row stream if an error happens in the packet transform,
|
|
1703
|
+
// e.g. if the bulk load is cancelled.
|
|
1827
1704
|
bulkLoad.rowToPacketTransform.on('error', err => {
|
|
1828
1705
|
rowStream.destroy(err);
|
|
1829
1706
|
});
|
|
@@ -1836,30 +1713,26 @@ class Connection extends _events.EventEmitter {
|
|
|
1836
1713
|
// to end the stream.
|
|
1837
1714
|
bulkLoad.rowToPacketTransform.end();
|
|
1838
1715
|
}
|
|
1839
|
-
|
|
1840
1716
|
const onCancel = () => {
|
|
1841
1717
|
request.cancel();
|
|
1842
1718
|
};
|
|
1843
|
-
|
|
1844
1719
|
const payload = new _bulkLoadPayload.BulkLoadPayload(bulkLoad);
|
|
1845
1720
|
const request = new _request.default(bulkLoad.getBulkInsertSql(), error => {
|
|
1846
1721
|
bulkLoad.removeListener('cancel', onCancel);
|
|
1847
|
-
|
|
1848
1722
|
if (error) {
|
|
1849
1723
|
if (error.code === 'UNKNOWN') {
|
|
1850
1724
|
error.message += ' This is likely because the schema of the BulkLoad does not match the schema of the table you are attempting to insert into.';
|
|
1851
1725
|
}
|
|
1852
|
-
|
|
1853
1726
|
bulkLoad.error = error;
|
|
1854
1727
|
bulkLoad.callback(error);
|
|
1855
1728
|
return;
|
|
1856
1729
|
}
|
|
1857
|
-
|
|
1858
1730
|
this.makeRequest(bulkLoad, _packet.TYPE.BULK_LOAD, payload);
|
|
1859
1731
|
});
|
|
1860
1732
|
bulkLoad.once('cancel', onCancel);
|
|
1861
1733
|
this.execSqlBatch(request);
|
|
1862
1734
|
}
|
|
1735
|
+
|
|
1863
1736
|
/**
|
|
1864
1737
|
* Prepare the SQL represented by the request.
|
|
1865
1738
|
*
|
|
@@ -1869,8 +1742,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1869
1742
|
* @param request A [[Request]] object representing the request.
|
|
1870
1743
|
* Parameters only require a name and type. Parameter values are ignored.
|
|
1871
1744
|
*/
|
|
1872
|
-
|
|
1873
|
-
|
|
1874
1745
|
prepare(request) {
|
|
1875
1746
|
const parameters = [];
|
|
1876
1747
|
parameters.push({
|
|
@@ -1900,8 +1771,9 @@ class Connection extends _events.EventEmitter {
|
|
|
1900
1771
|
precision: undefined,
|
|
1901
1772
|
scale: undefined
|
|
1902
1773
|
});
|
|
1903
|
-
request.preparing = true;
|
|
1774
|
+
request.preparing = true;
|
|
1904
1775
|
|
|
1776
|
+
// TODO: We need to clean up this event handler, otherwise this leaks memory
|
|
1905
1777
|
request.on('returnValue', (name, value) => {
|
|
1906
1778
|
if (name === 'handle') {
|
|
1907
1779
|
request.handle = value;
|
|
@@ -1911,6 +1783,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1911
1783
|
});
|
|
1912
1784
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Prepare, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
1913
1785
|
}
|
|
1786
|
+
|
|
1914
1787
|
/**
|
|
1915
1788
|
* Release the SQL Server resources associated with a previously prepared request.
|
|
1916
1789
|
*
|
|
@@ -1918,8 +1791,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1918
1791
|
* Parameters only require a name and type.
|
|
1919
1792
|
* Parameter values are ignored.
|
|
1920
1793
|
*/
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
1794
|
unprepare(request) {
|
|
1924
1795
|
const parameters = [];
|
|
1925
1796
|
parameters.push({
|
|
@@ -1934,6 +1805,7 @@ class Connection extends _events.EventEmitter {
|
|
|
1934
1805
|
});
|
|
1935
1806
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Unprepare, parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
1936
1807
|
}
|
|
1808
|
+
|
|
1937
1809
|
/**
|
|
1938
1810
|
* Execute previously prepared SQL, using the supplied parameters.
|
|
1939
1811
|
*
|
|
@@ -1943,8 +1815,6 @@ class Connection extends _events.EventEmitter {
|
|
|
1943
1815
|
* The object's values are passed as the parameters' values when the
|
|
1944
1816
|
* request is executed.
|
|
1945
1817
|
*/
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
1818
|
execute(request, parameters) {
|
|
1949
1819
|
const executeParameters = [];
|
|
1950
1820
|
executeParameters.push({
|
|
@@ -1957,11 +1827,11 @@ class Connection extends _events.EventEmitter {
|
|
|
1957
1827
|
precision: undefined,
|
|
1958
1828
|
scale: undefined
|
|
1959
1829
|
});
|
|
1960
|
-
|
|
1961
1830
|
try {
|
|
1962
1831
|
for (let i = 0, len = request.parameters.length; i < len; i++) {
|
|
1963
1832
|
const parameter = request.parameters[i];
|
|
1964
|
-
executeParameters.push({
|
|
1833
|
+
executeParameters.push({
|
|
1834
|
+
...parameter,
|
|
1965
1835
|
value: parameter.type.validate(parameters ? parameters[parameter.name] : null, this.databaseCollation)
|
|
1966
1836
|
});
|
|
1967
1837
|
}
|
|
@@ -1973,16 +1843,14 @@ class Connection extends _events.EventEmitter {
|
|
|
1973
1843
|
});
|
|
1974
1844
|
return;
|
|
1975
1845
|
}
|
|
1976
|
-
|
|
1977
1846
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(_specialStoredProcedure.default.Sp_Execute, executeParameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
1978
1847
|
}
|
|
1848
|
+
|
|
1979
1849
|
/**
|
|
1980
1850
|
* Call a stored procedure represented by [[Request]].
|
|
1981
1851
|
*
|
|
1982
1852
|
* @param request A [[Request]] object representing the request.
|
|
1983
1853
|
*/
|
|
1984
|
-
|
|
1985
|
-
|
|
1986
1854
|
callProcedure(request) {
|
|
1987
1855
|
try {
|
|
1988
1856
|
request.validateParameters(this.databaseCollation);
|
|
@@ -1994,9 +1862,9 @@ class Connection extends _events.EventEmitter {
|
|
|
1994
1862
|
});
|
|
1995
1863
|
return;
|
|
1996
1864
|
}
|
|
1997
|
-
|
|
1998
1865
|
this.makeRequest(request, _packet.TYPE.RPC_REQUEST, new _rpcrequestPayload.default(request.sqlTextOrProcedure, request.parameters, this.currentTransactionDescriptor(), this.config.options, this.databaseCollation));
|
|
1999
1866
|
}
|
|
1867
|
+
|
|
2000
1868
|
/**
|
|
2001
1869
|
* Start a transaction.
|
|
2002
1870
|
*
|
|
@@ -2015,29 +1883,24 @@ class Connection extends _events.EventEmitter {
|
|
|
2015
1883
|
*
|
|
2016
1884
|
* Optional, and defaults to the Connection's isolation level.
|
|
2017
1885
|
*/
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
1886
|
beginTransaction(callback, name = '', isolationLevel = this.config.options.isolationLevel) {
|
|
2021
1887
|
(0, _transaction.assertValidIsolationLevel)(isolationLevel, 'isolationLevel');
|
|
2022
1888
|
const transaction = new _transaction.Transaction(name, isolationLevel);
|
|
2023
|
-
|
|
2024
1889
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2025
1890
|
return this.execSqlBatch(new _request.default('SET TRANSACTION ISOLATION LEVEL ' + transaction.isolationLevelToTSQL() + ';BEGIN TRAN ' + transaction.name, err => {
|
|
2026
1891
|
this.transactionDepth++;
|
|
2027
|
-
|
|
2028
1892
|
if (this.transactionDepth === 1) {
|
|
2029
1893
|
this.inTransaction = true;
|
|
2030
1894
|
}
|
|
2031
|
-
|
|
2032
1895
|
callback(err);
|
|
2033
1896
|
}));
|
|
2034
1897
|
}
|
|
2035
|
-
|
|
2036
1898
|
const request = new _request.default(undefined, err => {
|
|
2037
1899
|
return callback(err, this.currentTransactionDescriptor());
|
|
2038
1900
|
});
|
|
2039
1901
|
return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.beginPayload(this.currentTransactionDescriptor()));
|
|
2040
1902
|
}
|
|
1903
|
+
|
|
2041
1904
|
/**
|
|
2042
1905
|
* Commit a transaction.
|
|
2043
1906
|
*
|
|
@@ -2048,26 +1911,21 @@ class Connection extends _events.EventEmitter {
|
|
|
2048
1911
|
* @param name A string representing a name to associate with the transaction.
|
|
2049
1912
|
* Optional, and defaults to an empty string. Required when `isolationLevel`is present.
|
|
2050
1913
|
*/
|
|
2051
|
-
|
|
2052
|
-
|
|
2053
1914
|
commitTransaction(callback, name = '') {
|
|
2054
1915
|
const transaction = new _transaction.Transaction(name);
|
|
2055
|
-
|
|
2056
1916
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2057
1917
|
return this.execSqlBatch(new _request.default('COMMIT TRAN ' + transaction.name, err => {
|
|
2058
1918
|
this.transactionDepth--;
|
|
2059
|
-
|
|
2060
1919
|
if (this.transactionDepth === 0) {
|
|
2061
1920
|
this.inTransaction = false;
|
|
2062
1921
|
}
|
|
2063
|
-
|
|
2064
1922
|
callback(err);
|
|
2065
1923
|
}));
|
|
2066
1924
|
}
|
|
2067
|
-
|
|
2068
1925
|
const request = new _request.default(undefined, callback);
|
|
2069
1926
|
return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.commitPayload(this.currentTransactionDescriptor()));
|
|
2070
1927
|
}
|
|
1928
|
+
|
|
2071
1929
|
/**
|
|
2072
1930
|
* Rollback a transaction.
|
|
2073
1931
|
*
|
|
@@ -2079,26 +1937,21 @@ class Connection extends _events.EventEmitter {
|
|
|
2079
1937
|
* Optional, and defaults to an empty string.
|
|
2080
1938
|
* Required when `isolationLevel` is present.
|
|
2081
1939
|
*/
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
1940
|
rollbackTransaction(callback, name = '') {
|
|
2085
1941
|
const transaction = new _transaction.Transaction(name);
|
|
2086
|
-
|
|
2087
1942
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2088
1943
|
return this.execSqlBatch(new _request.default('ROLLBACK TRAN ' + transaction.name, err => {
|
|
2089
1944
|
this.transactionDepth--;
|
|
2090
|
-
|
|
2091
1945
|
if (this.transactionDepth === 0) {
|
|
2092
1946
|
this.inTransaction = false;
|
|
2093
1947
|
}
|
|
2094
|
-
|
|
2095
1948
|
callback(err);
|
|
2096
1949
|
}));
|
|
2097
1950
|
}
|
|
2098
|
-
|
|
2099
1951
|
const request = new _request.default(undefined, callback);
|
|
2100
1952
|
return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.rollbackPayload(this.currentTransactionDescriptor()));
|
|
2101
1953
|
}
|
|
1954
|
+
|
|
2102
1955
|
/**
|
|
2103
1956
|
* Set a savepoint within a transaction.
|
|
2104
1957
|
*
|
|
@@ -2110,21 +1963,18 @@ class Connection extends _events.EventEmitter {
|
|
|
2110
1963
|
* Optional, and defaults to an empty string.
|
|
2111
1964
|
* Required when `isolationLevel` is present.
|
|
2112
1965
|
*/
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
1966
|
saveTransaction(callback, name) {
|
|
2116
1967
|
const transaction = new _transaction.Transaction(name);
|
|
2117
|
-
|
|
2118
1968
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2119
1969
|
return this.execSqlBatch(new _request.default('SAVE TRAN ' + transaction.name, err => {
|
|
2120
1970
|
this.transactionDepth++;
|
|
2121
1971
|
callback(err);
|
|
2122
1972
|
}));
|
|
2123
1973
|
}
|
|
2124
|
-
|
|
2125
1974
|
const request = new _request.default(undefined, callback);
|
|
2126
1975
|
return this.makeRequest(request, _packet.TYPE.TRANSACTION_MANAGER, transaction.savePayload(this.currentTransactionDescriptor()));
|
|
2127
1976
|
}
|
|
1977
|
+
|
|
2128
1978
|
/**
|
|
2129
1979
|
* Run the given callback after starting a transaction, and commit or
|
|
2130
1980
|
* rollback the transaction afterwards.
|
|
@@ -2146,17 +1996,12 @@ class Connection extends _events.EventEmitter {
|
|
|
2146
1996
|
*
|
|
2147
1997
|
* Optional, and defaults to the Connection's isolation level.
|
|
2148
1998
|
*/
|
|
2149
|
-
|
|
2150
|
-
|
|
2151
1999
|
transaction(cb, isolationLevel) {
|
|
2152
2000
|
if (typeof cb !== 'function') {
|
|
2153
2001
|
throw new TypeError('`cb` must be a function');
|
|
2154
2002
|
}
|
|
2155
|
-
|
|
2156
2003
|
const useSavepoint = this.inTransaction;
|
|
2157
|
-
|
|
2158
2004
|
const name = '_tedious_' + _crypto.default.randomBytes(10).toString('hex');
|
|
2159
|
-
|
|
2160
2005
|
const txDone = (err, done, ...args) => {
|
|
2161
2006
|
if (err) {
|
|
2162
2007
|
if (this.inTransaction && this.state === this.STATE.LOGGED_IN) {
|
|
@@ -2170,7 +2015,6 @@ class Connection extends _events.EventEmitter {
|
|
|
2170
2015
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2171
2016
|
this.transactionDepth--;
|
|
2172
2017
|
}
|
|
2173
|
-
|
|
2174
2018
|
done(null, ...args);
|
|
2175
2019
|
} else {
|
|
2176
2020
|
this.commitTransaction(txErr => {
|
|
@@ -2178,13 +2022,11 @@ class Connection extends _events.EventEmitter {
|
|
|
2178
2022
|
}, name);
|
|
2179
2023
|
}
|
|
2180
2024
|
};
|
|
2181
|
-
|
|
2182
2025
|
if (useSavepoint) {
|
|
2183
2026
|
return this.saveTransaction(err => {
|
|
2184
2027
|
if (err) {
|
|
2185
2028
|
return cb(err);
|
|
2186
2029
|
}
|
|
2187
|
-
|
|
2188
2030
|
if (isolationLevel) {
|
|
2189
2031
|
return this.execSqlBatch(new _request.default('SET transaction isolation level ' + this.getIsolationLevelText(isolationLevel), err => {
|
|
2190
2032
|
return cb(err, txDone);
|
|
@@ -2198,16 +2040,14 @@ class Connection extends _events.EventEmitter {
|
|
|
2198
2040
|
if (err) {
|
|
2199
2041
|
return cb(err);
|
|
2200
2042
|
}
|
|
2201
|
-
|
|
2202
2043
|
return cb(null, txDone);
|
|
2203
2044
|
}, name, isolationLevel);
|
|
2204
2045
|
}
|
|
2205
2046
|
}
|
|
2047
|
+
|
|
2206
2048
|
/**
|
|
2207
2049
|
* @private
|
|
2208
2050
|
*/
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
2051
|
makeRequest(request, packetType, payload) {
|
|
2212
2052
|
if (this.state !== this.STATE.LOGGED_IN) {
|
|
2213
2053
|
const message = 'Requests can only be made in the ' + this.STATE.LOGGED_IN.name + ' state, not the ' + this.state.name + ' state';
|
|
@@ -2223,26 +2063,23 @@ class Connection extends _events.EventEmitter {
|
|
|
2223
2063
|
} else {
|
|
2224
2064
|
this.isSqlBatch = false;
|
|
2225
2065
|
}
|
|
2226
|
-
|
|
2227
2066
|
this.request = request;
|
|
2228
2067
|
request.connection = this;
|
|
2229
2068
|
request.rowCount = 0;
|
|
2230
2069
|
request.rows = [];
|
|
2231
2070
|
request.rst = [];
|
|
2232
|
-
|
|
2233
2071
|
const onCancel = () => {
|
|
2234
2072
|
payloadStream.unpipe(message);
|
|
2235
|
-
payloadStream.destroy(new _errors.RequestError('Canceled.', 'ECANCEL'));
|
|
2073
|
+
payloadStream.destroy(new _errors.RequestError('Canceled.', 'ECANCEL'));
|
|
2236
2074
|
|
|
2075
|
+
// set the ignore bit and end the message.
|
|
2237
2076
|
message.ignore = true;
|
|
2238
2077
|
message.end();
|
|
2239
|
-
|
|
2240
2078
|
if (request instanceof _request.default && request.paused) {
|
|
2241
2079
|
// resume the request if it was paused so we can read the remaining tokens
|
|
2242
2080
|
request.resume();
|
|
2243
2081
|
}
|
|
2244
2082
|
};
|
|
2245
|
-
|
|
2246
2083
|
request.once('cancel', onCancel);
|
|
2247
2084
|
this.createRequestTimer();
|
|
2248
2085
|
const message = new _message.default({
|
|
@@ -2259,12 +2096,11 @@ class Connection extends _events.EventEmitter {
|
|
|
2259
2096
|
return payload.toString(' ');
|
|
2260
2097
|
});
|
|
2261
2098
|
});
|
|
2262
|
-
|
|
2263
2099
|
const payloadStream = _stream.Readable.from(payload);
|
|
2264
|
-
|
|
2265
2100
|
payloadStream.once('error', error => {
|
|
2266
|
-
payloadStream.unpipe(message);
|
|
2101
|
+
payloadStream.unpipe(message);
|
|
2267
2102
|
|
|
2103
|
+
// Only set a request error if no error was set yet.
|
|
2268
2104
|
request.error ??= error;
|
|
2269
2105
|
message.ignore = true;
|
|
2270
2106
|
message.end();
|
|
@@ -2272,84 +2108,69 @@ class Connection extends _events.EventEmitter {
|
|
|
2272
2108
|
payloadStream.pipe(message);
|
|
2273
2109
|
}
|
|
2274
2110
|
}
|
|
2111
|
+
|
|
2275
2112
|
/**
|
|
2276
2113
|
* Cancel currently executed request.
|
|
2277
2114
|
*/
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
2115
|
cancel() {
|
|
2281
2116
|
if (!this.request) {
|
|
2282
2117
|
return false;
|
|
2283
2118
|
}
|
|
2284
|
-
|
|
2285
2119
|
if (this.request.canceled) {
|
|
2286
2120
|
return false;
|
|
2287
2121
|
}
|
|
2288
|
-
|
|
2289
2122
|
this.request.cancel();
|
|
2290
2123
|
return true;
|
|
2291
2124
|
}
|
|
2125
|
+
|
|
2292
2126
|
/**
|
|
2293
2127
|
* Reset the connection to its initial state.
|
|
2294
2128
|
* Can be useful for connection pool implementations.
|
|
2295
2129
|
*
|
|
2296
2130
|
* @param callback
|
|
2297
2131
|
*/
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
2132
|
reset(callback) {
|
|
2301
2133
|
const request = new _request.default(this.getInitialSql(), err => {
|
|
2302
2134
|
if (this.config.options.tdsVersion < '7_2') {
|
|
2303
2135
|
this.inTransaction = false;
|
|
2304
2136
|
}
|
|
2305
|
-
|
|
2306
2137
|
callback(err);
|
|
2307
2138
|
});
|
|
2308
2139
|
this.resetConnectionOnNextRequest = true;
|
|
2309
2140
|
this.execSqlBatch(request);
|
|
2310
2141
|
}
|
|
2142
|
+
|
|
2311
2143
|
/**
|
|
2312
2144
|
* @private
|
|
2313
2145
|
*/
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
2146
|
currentTransactionDescriptor() {
|
|
2317
2147
|
return this.transactionDescriptors[this.transactionDescriptors.length - 1];
|
|
2318
2148
|
}
|
|
2149
|
+
|
|
2319
2150
|
/**
|
|
2320
2151
|
* @private
|
|
2321
2152
|
*/
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
2153
|
getIsolationLevelText(isolationLevel) {
|
|
2325
2154
|
switch (isolationLevel) {
|
|
2326
2155
|
case _transaction.ISOLATION_LEVEL.READ_UNCOMMITTED:
|
|
2327
2156
|
return 'read uncommitted';
|
|
2328
|
-
|
|
2329
2157
|
case _transaction.ISOLATION_LEVEL.REPEATABLE_READ:
|
|
2330
2158
|
return 'repeatable read';
|
|
2331
|
-
|
|
2332
2159
|
case _transaction.ISOLATION_LEVEL.SERIALIZABLE:
|
|
2333
2160
|
return 'serializable';
|
|
2334
|
-
|
|
2335
2161
|
case _transaction.ISOLATION_LEVEL.SNAPSHOT:
|
|
2336
2162
|
return 'snapshot';
|
|
2337
|
-
|
|
2338
2163
|
default:
|
|
2339
2164
|
return 'read committed';
|
|
2340
2165
|
}
|
|
2341
2166
|
}
|
|
2342
|
-
|
|
2343
2167
|
}
|
|
2344
|
-
|
|
2345
2168
|
function isTransientError(error) {
|
|
2346
2169
|
if (error instanceof _esAggregateError.default) {
|
|
2347
2170
|
error = error.errors[0];
|
|
2348
2171
|
}
|
|
2349
|
-
|
|
2350
2172
|
return error instanceof _errors.ConnectionError && !!error.isTransient;
|
|
2351
2173
|
}
|
|
2352
|
-
|
|
2353
2174
|
var _default = Connection;
|
|
2354
2175
|
exports.default = _default;
|
|
2355
2176
|
module.exports = Connection;
|
|
@@ -2378,47 +2199,38 @@ Connection.prototype.STATE = {
|
|
|
2378
2199
|
(async () => {
|
|
2379
2200
|
let messageBuffer = Buffer.alloc(0);
|
|
2380
2201
|
let message;
|
|
2381
|
-
|
|
2382
2202
|
try {
|
|
2383
2203
|
message = await this.messageIo.readMessage();
|
|
2384
2204
|
} catch (err) {
|
|
2385
2205
|
return this.socketError(err);
|
|
2386
2206
|
}
|
|
2387
|
-
|
|
2388
2207
|
for await (const data of message) {
|
|
2389
2208
|
messageBuffer = Buffer.concat([messageBuffer, data]);
|
|
2390
2209
|
}
|
|
2391
|
-
|
|
2392
2210
|
const preloginPayload = new _preloginPayload.default(messageBuffer);
|
|
2393
2211
|
this.debug.payload(function () {
|
|
2394
2212
|
return preloginPayload.toString(' ');
|
|
2395
2213
|
});
|
|
2396
|
-
|
|
2397
2214
|
if (preloginPayload.fedAuthRequired === 1) {
|
|
2398
2215
|
this.fedAuthRequired = true;
|
|
2399
2216
|
}
|
|
2400
|
-
|
|
2401
|
-
if (preloginPayload.encryptionString === 'ON' || preloginPayload.encryptionString === 'REQ') {
|
|
2217
|
+
if ('strict' !== this.config.options.encrypt && (preloginPayload.encryptionString === 'ON' || preloginPayload.encryptionString === 'REQ')) {
|
|
2402
2218
|
if (!this.config.options.encrypt) {
|
|
2403
2219
|
this.emit('connect', new _errors.ConnectionError("Server requires encryption, set 'encrypt' config option to true.", 'EENCRYPT'));
|
|
2404
2220
|
return this.close();
|
|
2405
2221
|
}
|
|
2406
|
-
|
|
2407
2222
|
try {
|
|
2408
2223
|
var _this$routingData;
|
|
2409
|
-
|
|
2410
2224
|
this.transitionTo(this.STATE.SENT_TLSSSLNEGOTIATION);
|
|
2411
|
-
await this.messageIo.startTls(this.secureContextOptions, ((_this$routingData = this.routingData) === null || _this$routingData === void 0 ? void 0 : _this$routingData.server) ?? this.config.server, this.config.options.trustServerCertificate);
|
|
2225
|
+
await this.messageIo.startTls(this.secureContextOptions, this.config.options.serverName ? this.config.options.serverName : ((_this$routingData = this.routingData) === null || _this$routingData === void 0 ? void 0 : _this$routingData.server) ?? this.config.server, this.config.options.trustServerCertificate);
|
|
2412
2226
|
} catch (err) {
|
|
2413
2227
|
return this.socketError(err);
|
|
2414
2228
|
}
|
|
2415
2229
|
}
|
|
2416
|
-
|
|
2417
2230
|
this.sendLogin7Packet();
|
|
2418
2231
|
const {
|
|
2419
2232
|
authentication
|
|
2420
2233
|
} = this.config;
|
|
2421
|
-
|
|
2422
2234
|
switch (authentication.type) {
|
|
2423
2235
|
case 'azure-active-directory-password':
|
|
2424
2236
|
case 'azure-active-directory-msi-vm':
|
|
@@ -2427,11 +2239,9 @@ Connection.prototype.STATE = {
|
|
|
2427
2239
|
case 'azure-active-directory-default':
|
|
2428
2240
|
this.transitionTo(this.STATE.SENT_LOGIN7_WITH_FEDAUTH);
|
|
2429
2241
|
break;
|
|
2430
|
-
|
|
2431
2242
|
case 'ntlm':
|
|
2432
2243
|
this.transitionTo(this.STATE.SENT_LOGIN7_WITH_NTLM);
|
|
2433
2244
|
break;
|
|
2434
|
-
|
|
2435
2245
|
default:
|
|
2436
2246
|
this.transitionTo(this.STATE.SENT_LOGIN7_WITH_STANDARD_LOGIN);
|
|
2437
2247
|
break;
|
|
@@ -2504,17 +2314,14 @@ Connection.prototype.STATE = {
|
|
|
2504
2314
|
enter: function () {
|
|
2505
2315
|
(async () => {
|
|
2506
2316
|
let message;
|
|
2507
|
-
|
|
2508
2317
|
try {
|
|
2509
2318
|
message = await this.messageIo.readMessage();
|
|
2510
2319
|
} catch (err) {
|
|
2511
2320
|
return this.socketError(err);
|
|
2512
2321
|
}
|
|
2513
|
-
|
|
2514
2322
|
const handler = new _handler.Login7TokenHandler(this);
|
|
2515
2323
|
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2516
2324
|
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2517
|
-
|
|
2518
2325
|
if (handler.loginAckReceived) {
|
|
2519
2326
|
if (handler.routingData) {
|
|
2520
2327
|
this.routingData = handler.routingData;
|
|
@@ -2555,17 +2362,14 @@ Connection.prototype.STATE = {
|
|
|
2555
2362
|
(async () => {
|
|
2556
2363
|
while (true) {
|
|
2557
2364
|
let message;
|
|
2558
|
-
|
|
2559
2365
|
try {
|
|
2560
2366
|
message = await this.messageIo.readMessage();
|
|
2561
2367
|
} catch (err) {
|
|
2562
2368
|
return this.socketError(err);
|
|
2563
2369
|
}
|
|
2564
|
-
|
|
2565
2370
|
const handler = new _handler.Login7TokenHandler(this);
|
|
2566
2371
|
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2567
2372
|
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2568
|
-
|
|
2569
2373
|
if (handler.loginAckReceived) {
|
|
2570
2374
|
if (handler.routingData) {
|
|
2571
2375
|
this.routingData = handler.routingData;
|
|
@@ -2619,17 +2423,14 @@ Connection.prototype.STATE = {
|
|
|
2619
2423
|
enter: function () {
|
|
2620
2424
|
(async () => {
|
|
2621
2425
|
let message;
|
|
2622
|
-
|
|
2623
2426
|
try {
|
|
2624
2427
|
message = await this.messageIo.readMessage();
|
|
2625
2428
|
} catch (err) {
|
|
2626
2429
|
return this.socketError(err);
|
|
2627
2430
|
}
|
|
2628
|
-
|
|
2629
2431
|
const handler = new _handler.Login7TokenHandler(this);
|
|
2630
2432
|
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2631
2433
|
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2632
|
-
|
|
2633
2434
|
if (handler.loginAckReceived) {
|
|
2634
2435
|
if (handler.routingData) {
|
|
2635
2436
|
this.routingData = handler.routingData;
|
|
@@ -2637,42 +2438,33 @@ Connection.prototype.STATE = {
|
|
|
2637
2438
|
} else {
|
|
2638
2439
|
this.transitionTo(this.STATE.LOGGED_IN_SENDING_INITIAL_SQL);
|
|
2639
2440
|
}
|
|
2640
|
-
|
|
2641
2441
|
return;
|
|
2642
2442
|
}
|
|
2643
|
-
|
|
2644
2443
|
const fedAuthInfoToken = handler.fedAuthInfoToken;
|
|
2645
|
-
|
|
2646
2444
|
if (fedAuthInfoToken && fedAuthInfoToken.stsurl && fedAuthInfoToken.spn) {
|
|
2647
2445
|
const authentication = this.config.authentication;
|
|
2648
2446
|
const tokenScope = new _url.URL('/.default', fedAuthInfoToken.spn).toString();
|
|
2649
2447
|
let credentials;
|
|
2650
|
-
|
|
2651
2448
|
switch (authentication.type) {
|
|
2652
2449
|
case 'azure-active-directory-password':
|
|
2653
2450
|
credentials = new _identity.UsernamePasswordCredential(authentication.options.tenantId ?? 'common', authentication.options.clientId, authentication.options.userName, authentication.options.password);
|
|
2654
2451
|
break;
|
|
2655
|
-
|
|
2656
2452
|
case 'azure-active-directory-msi-vm':
|
|
2657
2453
|
case 'azure-active-directory-msi-app-service':
|
|
2658
2454
|
const msiArgs = authentication.options.clientId ? [authentication.options.clientId, {}] : [{}];
|
|
2659
2455
|
credentials = new _identity.ManagedIdentityCredential(...msiArgs);
|
|
2660
2456
|
break;
|
|
2661
|
-
|
|
2662
2457
|
case 'azure-active-directory-default':
|
|
2663
2458
|
const args = authentication.options.clientId ? {
|
|
2664
2459
|
managedIdentityClientId: authentication.options.clientId
|
|
2665
2460
|
} : {};
|
|
2666
2461
|
credentials = new _identity.DefaultAzureCredential(args);
|
|
2667
2462
|
break;
|
|
2668
|
-
|
|
2669
2463
|
case 'azure-active-directory-service-principal-secret':
|
|
2670
2464
|
credentials = new _identity.ClientSecretCredential(authentication.options.tenantId, authentication.options.clientId, authentication.options.clientSecret);
|
|
2671
2465
|
break;
|
|
2672
2466
|
}
|
|
2673
|
-
|
|
2674
2467
|
let tokenResponse;
|
|
2675
|
-
|
|
2676
2468
|
try {
|
|
2677
2469
|
tokenResponse = await credentials.getToken(tokenScope);
|
|
2678
2470
|
} catch (err) {
|
|
@@ -2681,7 +2473,6 @@ Connection.prototype.STATE = {
|
|
|
2681
2473
|
this.transitionTo(this.STATE.FINAL);
|
|
2682
2474
|
return;
|
|
2683
2475
|
}
|
|
2684
|
-
|
|
2685
2476
|
const token = tokenResponse.token;
|
|
2686
2477
|
this.sendFedAuthTokenMessage(token);
|
|
2687
2478
|
} else if (this.loginError) {
|
|
@@ -2717,13 +2508,11 @@ Connection.prototype.STATE = {
|
|
|
2717
2508
|
(async () => {
|
|
2718
2509
|
this.sendInitialSql();
|
|
2719
2510
|
let message;
|
|
2720
|
-
|
|
2721
2511
|
try {
|
|
2722
2512
|
message = await this.messageIo.readMessage();
|
|
2723
2513
|
} catch (err) {
|
|
2724
2514
|
return this.socketError(err);
|
|
2725
2515
|
}
|
|
2726
|
-
|
|
2727
2516
|
const tokenStreamParser = this.createTokenStreamParser(message, new _handler.InitialSqlTokenHandler(this));
|
|
2728
2517
|
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2729
2518
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
@@ -2754,20 +2543,18 @@ Connection.prototype.STATE = {
|
|
|
2754
2543
|
SENT_CLIENT_REQUEST: {
|
|
2755
2544
|
name: 'SentClientRequest',
|
|
2756
2545
|
enter: function () {
|
|
2757
|
-
(async () => {
|
|
2758
|
-
var _this$request, _this$request3, _this$request10;
|
|
2759
|
-
|
|
2546
|
+
(async (_this$request, _this$request3, _this$request10) => {
|
|
2760
2547
|
let message;
|
|
2761
|
-
|
|
2762
2548
|
try {
|
|
2763
2549
|
message = await this.messageIo.readMessage();
|
|
2764
2550
|
} catch (err) {
|
|
2765
2551
|
return this.socketError(err);
|
|
2766
|
-
}
|
|
2767
|
-
|
|
2768
|
-
|
|
2552
|
+
}
|
|
2553
|
+
// request timer is stopped on first data package
|
|
2769
2554
|
this.clearRequestTimer();
|
|
2770
|
-
const tokenStreamParser = this.createTokenStreamParser(message, new _handler.RequestTokenHandler(this, this.request));
|
|
2555
|
+
const tokenStreamParser = this.createTokenStreamParser(message, new _handler.RequestTokenHandler(this, this.request));
|
|
2556
|
+
|
|
2557
|
+
// If the request was canceled and we have a `cancelTimer`
|
|
2771
2558
|
// defined, we send a attention message after the
|
|
2772
2559
|
// request message was fully sent off.
|
|
2773
2560
|
//
|
|
@@ -2775,50 +2562,39 @@ Connection.prototype.STATE = {
|
|
|
2775
2562
|
// (but all the token handlers should be no-ops), and
|
|
2776
2563
|
// need to ensure the next message is handled by the
|
|
2777
2564
|
// `SENT_ATTENTION` state.
|
|
2778
|
-
|
|
2779
2565
|
if ((_this$request = this.request) !== null && _this$request !== void 0 && _this$request.canceled && this.cancelTimer) {
|
|
2780
2566
|
return this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
2781
2567
|
}
|
|
2782
|
-
|
|
2783
2568
|
const onResume = () => {
|
|
2784
2569
|
tokenStreamParser.resume();
|
|
2785
2570
|
};
|
|
2786
|
-
|
|
2787
2571
|
const onPause = () => {
|
|
2788
2572
|
var _this$request2;
|
|
2789
|
-
|
|
2790
2573
|
tokenStreamParser.pause();
|
|
2791
2574
|
(_this$request2 = this.request) === null || _this$request2 === void 0 ? void 0 : _this$request2.once('resume', onResume);
|
|
2792
2575
|
};
|
|
2793
|
-
|
|
2794
2576
|
(_this$request3 = this.request) === null || _this$request3 === void 0 ? void 0 : _this$request3.on('pause', onPause);
|
|
2795
|
-
|
|
2796
2577
|
if (this.request instanceof _request.default && this.request.paused) {
|
|
2797
2578
|
onPause();
|
|
2798
2579
|
}
|
|
2799
|
-
|
|
2800
2580
|
const onCancel = () => {
|
|
2801
2581
|
var _this$request4, _this$request5;
|
|
2802
|
-
|
|
2803
2582
|
tokenStreamParser.removeListener('end', onEndOfMessage);
|
|
2804
|
-
|
|
2805
2583
|
if (this.request instanceof _request.default && this.request.paused) {
|
|
2806
2584
|
// resume the request if it was paused so we can read the remaining tokens
|
|
2807
2585
|
this.request.resume();
|
|
2808
2586
|
}
|
|
2809
|
-
|
|
2810
2587
|
(_this$request4 = this.request) === null || _this$request4 === void 0 ? void 0 : _this$request4.removeListener('pause', onPause);
|
|
2811
|
-
(_this$request5 = this.request) === null || _this$request5 === void 0 ? void 0 : _this$request5.removeListener('resume', onResume);
|
|
2588
|
+
(_this$request5 = this.request) === null || _this$request5 === void 0 ? void 0 : _this$request5.removeListener('resume', onResume);
|
|
2589
|
+
|
|
2590
|
+
// The `_cancelAfterRequestSent` callback will have sent a
|
|
2812
2591
|
// attention message, so now we need to also switch to
|
|
2813
2592
|
// the `SENT_ATTENTION` state to make sure the attention ack
|
|
2814
2593
|
// message is processed correctly.
|
|
2815
|
-
|
|
2816
2594
|
this.transitionTo(this.STATE.SENT_ATTENTION);
|
|
2817
2595
|
};
|
|
2818
|
-
|
|
2819
2596
|
const onEndOfMessage = () => {
|
|
2820
2597
|
var _this$request6, _this$request7, _this$request8, _this$request9;
|
|
2821
|
-
|
|
2822
2598
|
(_this$request6 = this.request) === null || _this$request6 === void 0 ? void 0 : _this$request6.removeListener('cancel', this._cancelAfterRequestSent);
|
|
2823
2599
|
(_this$request7 = this.request) === null || _this$request7 === void 0 ? void 0 : _this$request7.removeListener('cancel', onCancel);
|
|
2824
2600
|
(_this$request8 = this.request) === null || _this$request8 === void 0 ? void 0 : _this$request8.removeListener('pause', onPause);
|
|
@@ -2826,14 +2602,11 @@ Connection.prototype.STATE = {
|
|
|
2826
2602
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
2827
2603
|
const sqlRequest = this.request;
|
|
2828
2604
|
this.request = undefined;
|
|
2829
|
-
|
|
2830
2605
|
if (this.config.options.tdsVersion < '7_2' && sqlRequest.error && this.isSqlBatch) {
|
|
2831
2606
|
this.inTransaction = false;
|
|
2832
2607
|
}
|
|
2833
|
-
|
|
2834
2608
|
sqlRequest.callback(sqlRequest.error, sqlRequest.rowCount, sqlRequest.rows);
|
|
2835
2609
|
};
|
|
2836
|
-
|
|
2837
2610
|
tokenStreamParser.once('end', onEndOfMessage);
|
|
2838
2611
|
(_this$request10 = this.request) === null || _this$request10 === void 0 ? void 0 : _this$request10.once('cancel', onCancel);
|
|
2839
2612
|
})();
|
|
@@ -2855,24 +2628,21 @@ Connection.prototype.STATE = {
|
|
|
2855
2628
|
enter: function () {
|
|
2856
2629
|
(async () => {
|
|
2857
2630
|
let message;
|
|
2858
|
-
|
|
2859
2631
|
try {
|
|
2860
2632
|
message = await this.messageIo.readMessage();
|
|
2861
2633
|
} catch (err) {
|
|
2862
2634
|
return this.socketError(err);
|
|
2863
2635
|
}
|
|
2864
|
-
|
|
2865
2636
|
const handler = new _handler.AttentionTokenHandler(this, this.request);
|
|
2866
2637
|
const tokenStreamParser = this.createTokenStreamParser(message, handler);
|
|
2867
|
-
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2638
|
+
await (0, _events.once)(tokenStreamParser, 'end');
|
|
2639
|
+
// 3.2.5.7 Sent Attention State
|
|
2868
2640
|
// Discard any data contained in the response, until we receive the attention response
|
|
2869
|
-
|
|
2870
2641
|
if (handler.attentionReceived) {
|
|
2871
2642
|
this.clearCancelTimer();
|
|
2872
2643
|
const sqlRequest = this.request;
|
|
2873
2644
|
this.request = undefined;
|
|
2874
2645
|
this.transitionTo(this.STATE.LOGGED_IN);
|
|
2875
|
-
|
|
2876
2646
|
if (sqlRequest.error && sqlRequest.error instanceof _errors.RequestError && sqlRequest.error.code === 'ETIMEOUT') {
|
|
2877
2647
|
sqlRequest.callback(sqlRequest.error);
|
|
2878
2648
|
} else {
|
|
@@ -2900,13 +2670,16 @@ Connection.prototype.STATE = {
|
|
|
2900
2670
|
this.cleanupConnection(CLEANUP_TYPE.NORMAL);
|
|
2901
2671
|
},
|
|
2902
2672
|
events: {
|
|
2903
|
-
connectTimeout: function () {
|
|
2673
|
+
connectTimeout: function () {
|
|
2674
|
+
// Do nothing, as the timer should be cleaned up.
|
|
2904
2675
|
},
|
|
2905
|
-
message: function () {
|
|
2676
|
+
message: function () {
|
|
2677
|
+
// Do nothing
|
|
2906
2678
|
},
|
|
2907
|
-
socketError: function () {
|
|
2679
|
+
socketError: function () {
|
|
2680
|
+
// Do nothing
|
|
2908
2681
|
}
|
|
2909
2682
|
}
|
|
2910
2683
|
}
|
|
2911
2684
|
};
|
|
2912
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkiLCJERUZBVUxUX0NPTk5FQ1RfVElNRU9VVCIsIkRFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCIsIkRFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQiLCJERUZBVUxUX0NPTk5FQ1RfUkVUUllfSU5URVJWQUwiLCJERUZBVUxUX1BBQ0tFVF9TSVpFIiwiREVGQVVMVF9URVhUU0laRSIsIkRFRkFVTFRfREFURUZJUlNUIiwiREVGQVVMVF9QT1JUIiwiREVGQVVMVF9URFNfVkVSU0lPTiIsIkRFRkFVTFRfTEFOR1VBR0UiLCJERUZBVUxUX0RBVEVGT1JNQVQiLCJDTEVBTlVQX1RZUEUiLCJOT1JNQUwiLCJSRURJUkVDVCIsIlJFVFJZIiwiQ29ubmVjdGlvbiIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwiY29uZmlnIiwiZmVkQXV0aFJlcXVpcmVkIiwic2VjdXJlQ29udGV4dE9wdGlvbnMiLCJpblRyYW5zYWN0aW9uIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInRyYW5zYWN0aW9uRGVwdGgiLCJpc1NxbEJhdGNoIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsInRyYW5zaWVudEVycm9yTG9va3VwIiwiY2xvc2VkIiwibG9naW5FcnJvciIsImRlYnVnIiwibnRsbXBhY2tldCIsIm50bG1wYWNrZXRCdWZmZXIiLCJyb3V0aW5nRGF0YSIsIm1lc3NhZ2VJbyIsInN0YXRlIiwicmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCIsInJlcXVlc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJzb2NrZXQiLCJtZXNzYWdlQnVmZmVyIiwiY29ubmVjdFRpbWVyIiwiY2FuY2VsVGltZXIiLCJyZXF1ZXN0VGltZXIiLCJyZXRyeVRpbWVyIiwiX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQiLCJkYXRhYmFzZUNvbGxhdGlvbiIsIlR5cGVFcnJvciIsInNlcnZlciIsImF1dGhlbnRpY2F0aW9uIiwidW5kZWZpbmVkIiwidHlwZSIsIm9wdGlvbnMiLCJkb21haW4iLCJ1c2VyTmFtZSIsInBhc3N3b3JkIiwidG9VcHBlckNhc2UiLCJjbGllbnRJZCIsInRlbmFudElkIiwidG9rZW4iLCJjbGllbnRTZWNyZXQiLCJhYm9ydFRyYW5zYWN0aW9uT25FcnJvciIsImFwcE5hbWUiLCJjYW1lbENhc2VDb2x1bW5zIiwiY2FuY2VsVGltZW91dCIsImNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTCIsImNvbHVtbkVuY3J5cHRpb25TZXR0aW5nIiwiY29sdW1uTmFtZVJlcGxhY2VyIiwiY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwiLCJjb25uZWN0VGltZW91dCIsImNvbm5lY3RvciIsImNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCIsIklTT0xBVElPTl9MRVZFTCIsIlJFQURfQ09NTUlUVEVEIiwiY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzIiwiZGF0YWJhc2UiLCJkYXRlZmlyc3QiLCJkYXRlRm9ybWF0IiwiZGF0YSIsInBhY2tldCIsInBheWxvYWQiLCJlbmFibGVBbnNpTnVsbCIsImVuYWJsZUFuc2lOdWxsRGVmYXVsdCIsImVuYWJsZUFuc2lQYWRkaW5nIiwiZW5hYmxlQW5zaVdhcm5pbmdzIiwiZW5hYmxlQXJpdGhBYm9ydCIsImVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsIiwiZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCIsImVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zIiwiZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQiLCJlbmFibGVRdW90ZWRJZGVudGlmaWVyIiwiZW5jcnlwdCIsImZhbGxiYWNrVG9EZWZhdWx0RGIiLCJlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnMiLCJpbnN0YW5jZU5hbWUiLCJpc29sYXRpb25MZXZlbCIsImxhbmd1YWdlIiwibG9jYWxBZGRyZXNzIiwibWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzIiwibXVsdGlTdWJuZXRGYWlsb3ZlciIsInBhY2tldFNpemUiLCJwb3J0IiwicmVhZE9ubHlJbnRlbnQiLCJyZXF1ZXN0VGltZW91dCIsInJvd0NvbGxlY3Rpb25PbkRvbmUiLCJyb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiIsInNlcnZlck5hbWUiLCJzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb24iLCJ0ZHNWZXJzaW9uIiwidGV4dHNpemUiLCJ0cnVzdGVkU2VydmVyTmFtZUFFIiwidHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSIsInVzZUNvbHVtbk5hbWVzIiwidXNlVVRDIiwid29ya3N0YXRpb25JZCIsImxvd2VyQ2FzZUd1aWRzIiwiRXJyb3IiLCJSYW5nZUVycm9yIiwic2VjdXJlT3B0aW9ucyIsIk9iamVjdCIsImNyZWF0ZSIsInZhbHVlIiwiY29uc3RhbnRzIiwiU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyIsImNyZWF0ZURlYnVnIiwiQnVmZmVyIiwiZnJvbSIsImFsbG9jIiwiVHJhbnNpZW50RXJyb3JMb29rdXAiLCJTVEFURSIsIklOSVRJQUxJWkVEIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiQVRURU5USU9OIiwiY3JlYXRlQ2FuY2VsVGltZXIiLCJjb25uZWN0IiwiY29ubmVjdExpc3RlbmVyIiwiQ29ubmVjdGlvbkVycm9yIiwibmFtZSIsIm9uQ29ubmVjdCIsImVyciIsInJlbW92ZUxpc3RlbmVyIiwib25FcnJvciIsIm9uY2UiLCJ0cmFuc2l0aW9uVG8iLCJDT05ORUNUSU5HIiwib24iLCJldmVudCIsImxpc3RlbmVyIiwiZW1pdCIsImFyZ3MiLCJjbG9zZSIsIkZJTkFMIiwiaW5pdGlhbGlzZUNvbm5lY3Rpb24iLCJzaWduYWwiLCJjcmVhdGVDb25uZWN0VGltZXIiLCJjb25uZWN0T25Qb3J0IiwidGltZW91dCIsInRoZW4iLCJwcm9jZXNzIiwibmV4dFRpY2siLCJjbGVhckNvbm5lY3RUaW1lciIsIm1lc3NhZ2UiLCJjbGVhbnVwQ29ubmVjdGlvbiIsImNsZWFudXBUeXBlIiwiY2xlYXJSZXF1ZXN0VGltZXIiLCJjbGVhclJldHJ5VGltZXIiLCJjbG9zZUNvbm5lY3Rpb24iLCJSZXF1ZXN0RXJyb3IiLCJjYWxsYmFjayIsIkRlYnVnIiwiY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIiLCJoYW5kbGVyIiwiVG9rZW5TdHJlYW1QYXJzZXIiLCJjdXN0b21Db25uZWN0b3IiLCJjb25uZWN0T3B0cyIsImhvc3QiLCJjb25uZWN0SW5QYXJhbGxlbCIsImNvbm5lY3RJblNlcXVlbmNlIiwiZG5zIiwibG9va3VwIiwiZXJyb3IiLCJzb2NrZXRFcnJvciIsInNvY2tldENsb3NlIiwic29ja2V0RW5kIiwic2V0S2VlcEFsaXZlIiwiTWVzc2FnZUlPIiwiY2xlYXJ0ZXh0IiwibG9nIiwic2VuZFByZUxvZ2luIiwiU0VOVF9QUkVMT0dJTiIsImRlc3Ryb3kiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiY2xlYXJDYW5jZWxUaW1lciIsImNyZWF0ZVJlcXVlc3RUaW1lciIsImNyZWF0ZVJldHJ5VGltZXIiLCJyZXRyeVRpbWVvdXQiLCJkaXNwYXRjaEV2ZW50IiwiY2FuY2VsIiwiY2xlYXJUaW1lb3V0IiwibmV3U3RhdGUiLCJleGl0IiwiY2FsbCIsImVudGVyIiwiYXBwbHkiLCJnZXRFdmVudEhhbmRsZXIiLCJldmVudE5hbWUiLCJldmVudHMiLCJTRU5UX1RMU1NTTE5FR09USUFUSU9OIiwiY29kZSIsIlJFUk9VVElORyIsIlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZXhlYyIsInZlcnNpb24iLCJQcmVsb2dpblBheWxvYWQiLCJOdW1iZXIiLCJzdWJidWlsZCIsIlBSRUxPR0lOIiwidG9TdHJpbmciLCJzZW5kTG9naW43UGFja2V0IiwiTG9naW43UGF5bG9hZCIsInZlcnNpb25zIiwiY2xpZW50UHJvZ1ZlciIsImNsaWVudFBpZCIsInBpZCIsImNvbm5lY3Rpb25JZCIsImNsaWVudFRpbWVab25lIiwiRGF0ZSIsImdldFRpbWV6b25lT2Zmc2V0IiwiY2xpZW50TGNpZCIsImZlZEF1dGgiLCJlY2hvIiwid29ya2Zsb3ciLCJmZWRBdXRoVG9rZW4iLCJzc3BpIiwiaG9zdG5hbWUiLCJvcyIsImxpYnJhcnlOYW1lIiwiaW5pdERiRmF0YWwiLCJMT0dJTjciLCJ0b0J1ZmZlciIsInNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlIiwiYWNjZXNzVG9rZW5MZW4iLCJieXRlTGVuZ3RoIiwib2Zmc2V0Iiwid3JpdGVVSW50MzJMRSIsIndyaXRlIiwiRkVEQVVUSF9UT0tFTiIsIlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4iLCJzZW5kSW5pdGlhbFNxbCIsIlNxbEJhdGNoUGF5bG9hZCIsImdldEluaXRpYWxTcWwiLCJjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yIiwiTWVzc2FnZSIsIlNRTF9CQVRDSCIsIm91dGdvaW5nTWVzc2FnZVN0cmVhbSIsIlJlYWRhYmxlIiwicGlwZSIsInB1c2giLCJnZXRJc29sYXRpb25MZXZlbFRleHQiLCJqb2luIiwicHJvY2Vzc2VkSW5pdGlhbFNxbCIsImV4ZWNTcWxCYXRjaCIsIm1ha2VSZXF1ZXN0Iiwic3FsVGV4dE9yUHJvY2VkdXJlIiwiZXhlY1NxbCIsInZhbGlkYXRlUGFyYW1ldGVycyIsInBhcmFtZXRlcnMiLCJUWVBFUyIsIk5WYXJDaGFyIiwib3V0cHV0IiwibGVuZ3RoIiwicHJlY2lzaW9uIiwic2NhbGUiLCJtYWtlUGFyYW1zUGFyYW1ldGVyIiwiUlBDX1JFUVVFU1QiLCJScGNSZXF1ZXN0UGF5bG9hZCIsIlByb2NlZHVyZXMiLCJTcF9FeGVjdXRlU3FsIiwibmV3QnVsa0xvYWQiLCJ0YWJsZSIsImNhbGxiYWNrT3JPcHRpb25zIiwiQnVsa0xvYWQiLCJleGVjQnVsa0xvYWQiLCJidWxrTG9hZCIsInJvd3MiLCJleGVjdXRpb25TdGFydGVkIiwic3RyZWFtaW5nTW9kZSIsImZpcnN0Um93V3JpdHRlbiIsInJvd1N0cmVhbSIsInJvd1RvUGFja2V0VHJhbnNmb3JtIiwiZW5kIiwib25DYW5jZWwiLCJCdWxrTG9hZFBheWxvYWQiLCJSZXF1ZXN0IiwiZ2V0QnVsa0luc2VydFNxbCIsIkJVTEtfTE9BRCIsInByZXBhcmUiLCJJbnQiLCJwcmVwYXJpbmciLCJoYW5kbGUiLCJTcF9QcmVwYXJlIiwidW5wcmVwYXJlIiwiU3BfVW5wcmVwYXJlIiwiZXhlY3V0ZSIsImV4ZWN1dGVQYXJhbWV0ZXJzIiwiaSIsImxlbiIsInBhcmFtZXRlciIsInZhbGlkYXRlIiwiU3BfRXhlY3V0ZSIsImNhbGxQcm9jZWR1cmUiLCJiZWdpblRyYW5zYWN0aW9uIiwidHJhbnNhY3Rpb24iLCJUcmFuc2FjdGlvbiIsImlzb2xhdGlvbkxldmVsVG9UU1FMIiwiVFJBTlNBQ1RJT05fTUFOQUdFUiIsImJlZ2luUGF5bG9hZCIsImNvbW1pdFRyYW5zYWN0aW9uIiwiY29tbWl0UGF5bG9hZCIsInJvbGxiYWNrVHJhbnNhY3Rpb24iLCJyb2xsYmFja1BheWxvYWQiLCJzYXZlVHJhbnNhY3Rpb24iLCJzYXZlUGF5bG9hZCIsImNiIiwidXNlU2F2ZXBvaW50IiwiY3J5cHRvIiwicmFuZG9tQnl0ZXMiLCJ0eERvbmUiLCJkb25lIiwiTE9HR0VEX0lOIiwidHhFcnIiLCJwYWNrZXRUeXBlIiwiY2FuY2VsZWQiLCJjb25uZWN0aW9uIiwicm93Q291bnQiLCJyc3QiLCJwYXlsb2FkU3RyZWFtIiwidW5waXBlIiwiaWdub3JlIiwicGF1c2VkIiwicmVzdW1lIiwicmVzZXRDb25uZWN0aW9uIiwiU0VOVF9DTElFTlRfUkVRVUVTVCIsInJlc2V0IiwiUkVBRF9VTkNPTU1JVFRFRCIsIlJFUEVBVEFCTEVfUkVBRCIsIlNFUklBTElaQUJMRSIsIlNOQVBTSE9UIiwiaXNUcmFuc2llbnRFcnJvciIsIkFnZ3JlZ2F0ZUVycm9yIiwiZXJyb3JzIiwiaXNUcmFuc2llbnQiLCJtb2R1bGUiLCJleHBvcnRzIiwicHJvdG90eXBlIiwicmVhZE1lc3NhZ2UiLCJjb25jYXQiLCJwcmVsb2dpblBheWxvYWQiLCJlbmNyeXB0aW9uU3RyaW5nIiwic3RhcnRUbHMiLCJTRU5UX0xPR0lON19XSVRIX0ZFREFVVEgiLCJTRU5UX0xPR0lON19XSVRIX05UTE0iLCJjYXRjaCIsInJlY29ubmVjdCIsInJldHJ5IiwiTG9naW43VG9rZW5IYW5kbGVyIiwidG9rZW5TdHJlYW1QYXJzZXIiLCJsb2dpbkFja1JlY2VpdmVkIiwiTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwiLCJOVExNUmVzcG9uc2VQYXlsb2FkIiwiTlRMTUFVVEhfUEtUIiwiZmVkQXV0aEluZm9Ub2tlbiIsInN0c3VybCIsInNwbiIsInRva2VuU2NvcGUiLCJVUkwiLCJjcmVkZW50aWFscyIsIlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsIiwibXNpQXJncyIsIk1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwiLCJtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZCIsIkRlZmF1bHRBenVyZUNyZWRlbnRpYWwiLCJDbGllbnRTZWNyZXRDcmVkZW50aWFsIiwidG9rZW5SZXNwb25zZSIsImdldFRva2VuIiwiSW5pdGlhbFNxbFRva2VuSGFuZGxlciIsIlJlcXVlc3RUb2tlbkhhbmRsZXIiLCJTRU5UX0FUVEVOVElPTiIsIm9uUmVzdW1lIiwib25QYXVzZSIsInBhdXNlIiwib25FbmRPZk1lc3NhZ2UiLCJzcWxSZXF1ZXN0IiwibmV4dFN0YXRlIiwiQXR0ZW50aW9uVG9rZW5IYW5kbGVyIiwiYXR0ZW50aW9uUmVjZWl2ZWQiXSwic291cmNlcyI6WyIuLi9zcmMvY29ubmVjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHsgU29ja2V0IH0gZnJvbSAnbmV0JztcbmltcG9ydCBkbnMgZnJvbSAnZG5zJztcblxuaW1wb3J0IGNvbnN0YW50cyBmcm9tICdjb25zdGFudHMnO1xuaW1wb3J0IHsgU2VjdXJlQ29udGV4dE9wdGlvbnMgfSBmcm9tICd0bHMnO1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmltcG9ydCB7XG4gIERlZmF1bHRBenVyZUNyZWRlbnRpYWwsXG4gIENsaWVudFNlY3JldENyZWRlbnRpYWwsXG4gIE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwsXG4gIFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsLFxufSBmcm9tICdAYXp1cmUvaWRlbnRpdHknO1xuXG5pbXBvcnQgQnVsa0xvYWQsIHsgT3B0aW9ucyBhcyBCdWxrTG9hZE9wdGlvbnMsIENhbGxiYWNrIGFzIEJ1bGtMb2FkQ2FsbGJhY2sgfSBmcm9tICcuL2J1bGstbG9hZCc7XG5pbXBvcnQgRGVidWcgZnJvbSAnLi9kZWJ1Zyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIG9uY2UgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgaW5zdGFuY2VMb29rdXAgfSBmcm9tICcuL2luc3RhbmNlLWxvb2t1cCc7XG5pbXBvcnQgeyBUcmFuc2llbnRFcnJvckxvb2t1cCB9IGZyb20gJy4vdHJhbnNpZW50LWVycm9yLWxvb2t1cCc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9wYWNrZXQnO1xuaW1wb3J0IFByZWxvZ2luUGF5bG9hZCBmcm9tICcuL3ByZWxvZ2luLXBheWxvYWQnO1xuaW1wb3J0IExvZ2luN1BheWxvYWQgZnJvbSAnLi9sb2dpbjctcGF5bG9hZCc7XG5pbXBvcnQgTlRMTVJlc3BvbnNlUGF5bG9hZCBmcm9tICcuL250bG0tcGF5bG9hZCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IFJwY1JlcXVlc3RQYXlsb2FkIGZyb20gJy4vcnBjcmVxdWVzdC1wYXlsb2FkJztcbmltcG9ydCBTcWxCYXRjaFBheWxvYWQgZnJvbSAnLi9zcWxiYXRjaC1wYXlsb2FkJztcbmltcG9ydCBNZXNzYWdlSU8gZnJvbSAnLi9tZXNzYWdlLWlvJztcbmltcG9ydCB7IFBhcnNlciBhcyBUb2tlblN0cmVhbVBhcnNlciB9IGZyb20gJy4vdG9rZW4vdG9rZW4tc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgSVNPTEFUSU9OX0xFVkVMLCBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBDb25uZWN0aW9uRXJyb3IsIFJlcXVlc3RFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGNvbm5lY3RJblBhcmFsbGVsLCBjb25uZWN0SW5TZXF1ZW5jZSB9IGZyb20gJy4vY29ubmVjdG9yJztcbmltcG9ydCB7IG5hbWUgYXMgbGlicmFyeU5hbWUgfSBmcm9tICcuL2xpYnJhcnknO1xuaW1wb3J0IHsgdmVyc2lvbnMgfSBmcm9tICcuL3Rkcy12ZXJzaW9ucyc7XG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhLXBhcnNlcic7XG5pbXBvcnQgeyBjcmVhdGVOVExNUmVxdWVzdCB9IGZyb20gJy4vbnRsbSc7XG5pbXBvcnQgeyBDb2x1bW5FbmNyeXB0aW9uQXp1cmVLZXlWYXVsdFByb3ZpZGVyIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdCc7XG5cbmltcG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRTaWduYWwgfSBmcm9tICdub2RlLWFib3J0LWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFyYW1ldGVyLCBUWVBFUyB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IEJ1bGtMb2FkUGF5bG9hZCB9IGZyb20gJy4vYnVsay1sb2FkLXBheWxvYWQnO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFByb2NlZHVyZXMgZnJvbSAnLi9zcGVjaWFsLXN0b3JlZC1wcm9jZWR1cmUnO1xuXG5pbXBvcnQgQWdncmVnYXRlRXJyb3IgZnJvbSAnZXMtYWdncmVnYXRlLWVycm9yJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEF0dGVudGlvblRva2VuSGFuZGxlciwgSW5pdGlhbFNxbFRva2VuSGFuZGxlciwgTG9naW43VG9rZW5IYW5kbGVyLCBSZXF1ZXN0VG9rZW5IYW5kbGVyLCBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL3Rva2VuL2hhbmRsZXInO1xuXG50eXBlIEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgQSBCdWZmZXIgdGhhdCBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHJhbnNhY3Rpb25EZXNjcmlwdG9yPzogQnVmZmVyKSA9PiB2b2lkXG5cbnR5cGUgU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHRvIHNldCBhIHNhdmVwb2ludCB3aXRoaW4gdGhlXG4gICAqIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgKiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkIHRoZW4gYGVycmAgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGhhc1xuICAgKiBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBlcnIgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJlc2V0Q2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlc2V0IGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICpcbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlclxuICAgKiByZXF1ZXN0IHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xudHlwZSBUcmFuc2FjdGlvbkNhbGxiYWNrPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbiAob3IgY3JlYXRlIGEgc2F2ZXBvaW50LCBpblxuICAgKiB0aGUgY2FzZSBvZiBhIG5lc3RlZCB0cmFuc2FjdGlvbikgaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICogSWYgbm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBjYWxsYmFjayBzaG91bGQgcGVyZm9ybSBpdHMgd29yayBhbmQgZXZlbnR1YWxseSBjYWxsXG4gICAqIGBkb25lYCB3aXRoIGFuIGVycm9yIG9yIG51bGwgKHRvIHRyaWdnZXIgYSB0cmFuc2FjdGlvbiByb2xsYmFjayBvciBhXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdCkgYW5kIGFuIGFkZGl0aW9uYWwgY29tcGxldGlvbiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RcbiAgICogdG8gcm9sbGJhY2sgb3IgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gdG8gYGRvbmVgIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gdHhEb25lIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiBUcmFuc2FjdGlvbkRvbmU8VD4pID0+IHZvaWQ7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2sgPSAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xudHlwZSBDYWxsYmFja1BhcmFtZXRlcnM8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IGFueT4gPSBUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gY29tbWl0IG9yIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnIgb2NjdXJyZWQsIGEgc3RyaW5nIHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMTUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQgPSA1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMID0gNTAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX1BBQ0tFVF9TSVpFID0gNCAqIDEwMjQ7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVEVYVFNJWkUgPSAyMTQ3NDgzNjQ3O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGSVJTVCA9IDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IDE0MzM7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVERTX1ZFUlNJT04gPSAnN180Jztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICd1c19lbmdsaXNoJztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9EQVRFRk9STUFUID0gJ21keSc7XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlciB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQXp1cmUgYXBwIHNlcnZpY2UgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzY29pYXRlIHRvIHRoZWlyIGNyZWF0ZWQgaWRuZXRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSB0b2tlbiBmcm9tIGF6dXJlIHdlYiBhcHAgc2VydmljZVxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmUgYSB0b2tlblxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmluZyBhIHRva2VuXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGB0b2tlbmAgd2hpY2ggdGhleSByZXRyaXZlZCBlbHNlIHdoZXJlXG4gICAgICogdG8gZm9ybWluZyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICB0b2tlbjogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIG5lZWQgdG8gcHJvdmlkZSBgdXNlck5hbWVgIGFzc2NvaWF0ZSB0byB0aGVpciBhY2NvdW50LlxuICAgICAqL1xuICAgIHVzZXJOYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGBwYXNzd29yZGAgYXNzY29pYXRlIHRvIHRoZWlyIGFjY291bnQuXG4gICAgICovXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgY2xpZW50IGlkIHRvIHVzZS5cbiAgICAgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcGFyYW1ldGVyIGZvciBzcGVjaWZpYyBBenVyZSB0ZW5hbnQgSURcbiAgICAgKi9cbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0IHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEFwcGxpY2F0aW9uIChgY2xpZW50YCkgSUQgZnJvbSB5b3VyIHJlZ2lzdGVyZWQgQXp1cmUgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGVkIGBjbGllbnQgc2VjcmV0YCBmb3IgdGhpcyByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGlyZWN0b3J5IChgdGVuYW50YCkgSUQgZnJvbSB5b3VyIHJlZ2lzdGVyZWQgQXp1cmUgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTnRsbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ250bG0nO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogVXNlciBuYW1lIGZyb20geW91ciB3aW5kb3dzIGFjY291bnQuXG4gICAgICovXG4gICAgdXNlck5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQYXNzd29yZCBmcm9tIHlvdXIgd2luZG93cyBhY2NvdW50LlxuICAgICAqL1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT25jZSB5b3Ugc2V0IGRvbWFpbiBmb3IgbnRsbSBhdXRoZW50aWNhdGlvbiB0eXBlLCBkcml2ZXIgd2lsbCBjb25uZWN0IHRvIFNRTCBTZXJ2ZXIgdXNpbmcgZG9tYWluIGxvZ2luLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGZvcm1pbmcgYSBjb25uZWN0aW9uIHVzaW5nIG50bG0gdHlwZVxuICAgICAqL1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2RlZmF1bHQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogVXNlciBuYW1lIHRvIHVzZSBmb3Igc3FsIHNlcnZlciBsb2dpbi5cbiAgICAgKi9cbiAgICB1c2VyTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBQYXNzd29yZCB0byB1c2UgZm9yIHNxbCBzZXJ2ZXIgbG9naW4uXG4gICAgICovXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmludGVyZmFjZSBFcnJvcldpdGhDb2RlIGV4dGVuZHMgRXJyb3Ige1xuICBjb2RlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIGF1dGhlbnRpY2F0aW9uOiBEZWZhdWx0QXV0aGVudGljYXRpb24gfCBOdGxtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuICBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMge1xuICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcjogYm9vbGVhbjtcbiAgYXBwTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBjYW1lbENhc2VDb2x1bW5zOiBib29sZWFuO1xuICBjYW5jZWxUaW1lb3V0OiBudW1iZXI7XG4gIGNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTDogbnVtYmVyO1xuICBjb2x1bW5FbmNyeXB0aW9uU2V0dGluZzogYm9vbGVhbjtcbiAgY29sdW1uTmFtZVJlcGxhY2VyOiB1bmRlZmluZWQgfCAoKGNvbE5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhKSA9PiBzdHJpbmcpO1xuICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogbnVtYmVyO1xuICBjb25uZWN0b3I6IHVuZGVmaW5lZCB8ICgoKSA9PiBQcm9taXNlPFNvY2tldD4pO1xuICBjb25uZWN0VGltZW91dDogbnVtYmVyO1xuICBjb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF07XG4gIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlsczogU2VjdXJlQ29udGV4dE9wdGlvbnM7XG4gIGRhdGFiYXNlOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGRhdGVmaXJzdDogbnVtYmVyO1xuICBkYXRlRm9ybWF0OiBzdHJpbmc7XG4gIGRlYnVnOiB7XG4gICAgZGF0YTogYm9vbGVhbjtcbiAgICBwYWNrZXQ6IGJvb2xlYW47XG4gICAgcGF5bG9hZDogYm9vbGVhbjtcbiAgICB0b2tlbjogYm9vbGVhbjtcbiAgfTtcbiAgZW5hYmxlQW5zaU51bGw6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVBbnNpTnVsbERlZmF1bHQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVBbnNpUGFkZGluZzogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFuc2lXYXJuaW5nczogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUFyaXRoQWJvcnQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVDb25jYXROdWxsWWllbGRzTnVsbDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZUN1cnNvckNsb3NlT25Db21taXQ6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9uczogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZU51bWVyaWNSb3VuZGFib3J0OiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlUXVvdGVkSWRlbnRpZmllcjogbnVsbCB8IGJvb2xlYW47XG4gIGVuY3J5cHQ6IGJvb2xlYW47XG4gIGVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVyczogS2V5U3RvcmVQcm92aWRlck1hcCB8IHVuZGVmaW5lZDtcbiAgZmFsbGJhY2tUb0RlZmF1bHREYjogYm9vbGVhbjtcbiAgaW5zdGFuY2VOYW1lOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIGlzb2xhdGlvbkxldmVsOiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMW2tleW9mIHR5cGVvZiBJU09MQVRJT05fTEVWRUxdO1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBsb2NhbEFkZHJlc3M6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgbWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzOiBudW1iZXI7XG4gIG11bHRpU3VibmV0RmFpbG92ZXI6IGJvb2xlYW47XG4gIHBhY2tldFNpemU6IG51bWJlcjtcbiAgcG9ydDogdW5kZWZpbmVkIHwgbnVtYmVyO1xuICByZWFkT25seUludGVudDogYm9vbGVhbjtcbiAgcmVxdWVzdFRpbWVvdXQ6IG51bWJlcjtcbiAgcm93Q29sbGVjdGlvbk9uRG9uZTogYm9vbGVhbjtcbiAgcm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb246IGJvb2xlYW47XG4gIHNlcnZlck5hbWU6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgc2VydmVyU3VwcG9ydHNDb2x1bW5FbmNyeXB0aW9uOiBib29sZWFuO1xuICB0ZHNWZXJzaW9uOiBzdHJpbmc7XG4gIHRleHRzaXplOiBudW1iZXI7XG4gIHRydXN0ZWRTZXJ2ZXJOYW1lQUU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogYm9vbGVhbjtcbiAgdXNlQ29sdW1uTmFtZXM6IGJvb2xlYW47XG4gIHVzZVVUQzogYm9vbGVhbjtcbiAgd29ya3N0YXRpb25JZDogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBsb3dlckNhc2VHdWlkczogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtleVN0b3JlUHJvdmlkZXJNYXAge1xuICBba2V5OiBzdHJpbmddOiBDb2x1bW5FbmNyeXB0aW9uQXp1cmVLZXlWYXVsdFByb3ZpZGVyO1xufVxuXG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmludGVyZmFjZSBTdGF0ZSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZW50ZXI/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICBleGl0Pyh0aGlzOiBDb25uZWN0aW9uLCBuZXdTdGF0ZTogU3RhdGUpOiB2b2lkO1xuICBldmVudHM6IHtcbiAgICBzb2NrZXRFcnJvcj8odGhpczogQ29ubmVjdGlvbiwgZXJyOiBFcnJvcik6IHZvaWQ7XG4gICAgY29ubmVjdFRpbWVvdXQ/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICAgIG1lc3NhZ2U/KHRoaXM6IENvbm5lY3Rpb24sIG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkO1xuICAgIHJldHJ5Pyh0aGlzOiBDb25uZWN0aW9uKTogdm9pZDtcbiAgICByZWNvbm5lY3Q/KHRoaXM6IENvbm5lY3Rpb24pOiB2b2lkO1xuICB9O1xufVxuXG50eXBlIEF1dGhlbnRpY2F0aW9uID0gRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHxcbiAgTnRsbUF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24gfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQgfFxuICBBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbjtcblxudHlwZSBBdXRoZW50aWNhdGlvblR5cGUgPSBBdXRoZW50aWNhdGlvblsndHlwZSddO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25Db25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIEhvc3RuYW1lIHRvIGNvbm5lY3QgdG8uXG4gICAqL1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgZm9ybWluZyB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIG9wdGlvbnM/OiBDb25uZWN0aW9uT3B0aW9ucztcbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIHJlYWx0ZWQgb3B0aW9ucyBmb3IgY29ubmVjdGlvbi5cbiAgICovXG4gIGF1dGhlbnRpY2F0aW9uPzogQXV0aGVudGljYXRpb25PcHRpb25zO1xufVxuXG5pbnRlcmZhY2UgRGVidWdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgZGF0YSBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZGF0YTogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgZGV0YWlsc1xuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHBhY2tldDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyBwYWNrZXQgcGF5bG9hZCBkZXRhaWxzXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgcGF5bG9hZDogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciBbW2RlYnVnXV0gZXZlbnRzIHdpbGwgYmUgZW1pdHRlZCB3aXRoIHRleHQgZGVzY3JpYmluZyB0b2tlbiBzdHJlYW0gdG9rZW5zXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgdG9rZW46IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBBdXRoZW50aWNhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogVHlwZSBvZiB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kLCB2YWxpZCB0eXBlcyBhcmUgYGRlZmF1bHRgLCBgbnRsbWAsXG4gICAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkYCwgYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtYCwgYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlYCxcbiAgICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdGBcbiAgICogb3IgYGF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0YFxuICAgKi9cbiAgdHlwZT86IEF1dGhlbnRpY2F0aW9uVHlwZTtcbiAgLyoqXG4gICAqIERpZmZlcmVudCBvcHRpb25zIGZvciBhdXRoZW50aWNhdGlvbiB0eXBlczpcbiAgICpcbiAgICogKiBgZGVmYXVsdGA6IFtbRGVmYXVsdEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBudGxtYCA6W1tOdGxtQXV0aGVudGljYXRpb25dXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbmAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1gIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0YCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0Lm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHRgIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICovXG4gIG9wdGlvbnM/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcm9sbGJhY2sgYSB0cmFuc2FjdGlvbiBhdXRvbWF0aWNhbGx5IGlmIGFueSBlcnJvciBpcyBlbmNvdW50ZXJlZFxuICAgKiBkdXJpbmcgdGhlIGdpdmVuIHRyYW5zYWN0aW9uJ3MgZXhlY3V0aW9uLiBUaGlzIHNldHMgdGhlIHZhbHVlIGZvciBgU0VUIFhBQ1RfQUJPUlRgIGR1cmluZyB0aGVcbiAgICogaW5pdGlhbCBTUUwgcGhhc2Ugb2YgYSBjb25uZWN0aW9uIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9zcWwvdC1zcWwvc3RhdGVtZW50cy9zZXQteGFjdC1hYm9ydC10cmFuc2FjdC1zcWwpLlxuICAgKi9cbiAgYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBcHBsaWNhdGlvbiBuYW1lIHVzZWQgZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gaW4gcHJvZmlsaW5nLCBsb2dnaW5nIG9yIHRyYWNpbmcgdG9vbHMgb2YgU1FMU2VydmVyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYFRlZGlvdXNgKVxuICAgKi9cbiAgYXBwTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9sbGluZyB3aGV0aGVyIHRoZSBjb2x1bW4gbmFtZXMgcmV0dXJuZWQgd2lsbCBoYXZlIHRoZSBmaXJzdCBsZXR0ZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2VcbiAgICogKGB0cnVlYCkgb3Igbm90LiBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaWYgeW91IHByb3ZpZGUgYSBbW2NvbHVtbk5hbWVSZXBsYWNlcl1dLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBjYW1lbENhc2VDb2x1bW5zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBbW1JlcXVlc3QuY2FuY2VsXV0gKGFib3J0KSBvZiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCBmYWlsZWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGA1MDAwYCkuXG4gICAqL1xuICBjYW5jZWxUaW1lb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIGZ1bmN0aW9uIHdpdGggcGFyYW1ldGVycyBgKGNvbHVtbk5hbWUsIGluZGV4LCBjb2x1bW5NZXRhRGF0YSlgIGFuZCByZXR1cm5pbmcgYSBzdHJpbmcuIElmIHByb3ZpZGVkLFxuICAgKiB0aGlzIHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyIGNvbHVtbiBwZXIgcmVzdWx0LXNldC4gVGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBTUUwtcHJvdmlkZWRcbiAgICogY29sdW1uIG5hbWUgb24gcm93IGFuZCBtZXRhIGRhdGEgb2JqZWN0cy4gVGhpcyBhbGxvd3MgeW91IHRvIGR5bmFtaWNhbGx5IGNvbnZlcnQgYmV0d2VlbiBuYW1pbmcgY29udmVudGlvbnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbnVsbGApXG4gICAqL1xuICBjb2x1bW5OYW1lUmVwbGFjZXI/OiAoY29sTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCBtZXRhZGF0YTogTWV0YWRhdGEpID0+IHN0cmluZztcblxuICAvKipcbiAgICogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgcmV0cnlpbmcgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24sIGluIGNhc2Ugb2YgdHJhbnNpZW50IGZhaWx1cmUuXG4gICAqXG4gICAqIChkZWZhdWx0OmA1MDBgKVxuICAgKi9cbiAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEN1c3RvbSBjb25uZWN0b3IgZmFjdG9yeSBtZXRob2QuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdW5kZWZpbmVkYClcbiAgICovXG4gIGNvbm5lY3Rvcj86ICgpID0+IFByb21pc2U8U29ja2V0PjtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgaXMgY29uc2lkZXJlZCBmYWlsZWRcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgY29ubmVjdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkZWZhdWx0IGlzb2xhdGlvbiBsZXZlbCBmb3IgbmV3IGNvbm5lY3Rpb25zLiBBbGwgb3V0LW9mLXRyYW5zYWN0aW9uIHF1ZXJpZXMgYXJlIGV4ZWN1dGVkIHdpdGggdGhpcyBzZXR0aW5nLlxuICAgKlxuICAgKiBUaGUgaXNvbGF0aW9uIGxldmVscyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5JU09MQVRJT05fTEVWRUxgLlxuICAgKiAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAqIGBSRUFEX0NPTU1JVFRFRGBcbiAgICogKiBgUkVQRUFUQUJMRV9SRUFEYFxuICAgKiAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICogYFNOQVBTSE9UYFxuICAgKlxuICAgKiAoZGVmYXVsdDogYFJFQURfQ09NTUlURURgKS5cbiAgICovXG4gIGNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hlbiBlbmNyeXB0aW9uIGlzIHVzZWQsIGFuIG9iamVjdCBtYXkgYmUgc3VwcGxpZWQgdGhhdCB3aWxsIGJlIHVzZWRcbiAgICogZm9yIHRoZSBmaXJzdCBhcmd1bWVudCB3aGVuIGNhbGxpbmcgW2B0bHMuY3JlYXRlU2VjdXJlUGFpcmBdKGh0dHA6Ly9ub2RlanMub3JnL2RvY3MvbGF0ZXN0L2FwaS90bHMuaHRtbCN0bHNfdGxzX2NyZWF0ZXNlY3VyZXBhaXJfY3JlZGVudGlhbHNfaXNzZXJ2ZXJfcmVxdWVzdGNlcnRfcmVqZWN0dW5hdXRob3JpemVkKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHt9YClcbiAgICovXG4gIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscz86IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBEYXRhYmFzZSB0byBjb25uZWN0IHRvIChkZWZhdWx0OiBkZXBlbmRlbnQgb24gc2VydmVyIGNvbmZpZ3VyYXRpb24pLlxuICAgKi9cbiAgZGF0YWJhc2U/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayB0byBhIG51bWJlciBmcm9tIDEgdGhyb3VnaCA3LlxuICAgKi9cbiAgZGF0ZWZpcnN0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgcG9zaXRpb24gb2YgbW9udGgsIGRheSBhbmQgeWVhciBpbiB0ZW1wb3JhbCBkYXRhdHlwZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbWR5YClcbiAgICovXG4gIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XG5cbiAgZGVidWc/OiBEZWJ1Z09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgdGhlIHdheSBudWxsIHZhbHVlcyBzaG91bGQgYmUgdXNlZCBkdXJpbmcgY29tcGFyaXNvbiBvcGVyYXRpb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGBTRVQgQU5TSV9OVUxMX0RGTFRfT04gT05gIHdpbGwgYmUgc2V0IGluIHRoZSBpbml0aWFsIHNxbC4gVGhpcyBtZWFucyBuZXcgY29sdW1ucyB3aWxsIGJlXG4gICAqIG51bGxhYmxlIGJ5IGRlZmF1bHQuIFNlZSB0aGUgW1QtU1FMIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMxODczNzUuYXNweClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICBlbmFibGVBbnNpTnVsbERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIGlmIHBhZGRpbmcgc2hvdWxkIGJlIGFwcGxpZWQgZm9yIHZhbHVlcyBzaG9ydGVyIHRoYW4gdGhlIHNpemUgb2YgZGVmaW5lZCBjb2x1bW4uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVBbnNpUGFkZGluZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIFNRTCBTZXJ2ZXIgd2lsbCBmb2xsb3cgSVNPIHN0YW5kYXJkIGJlaGF2aW9yIGR1cmluZyB2YXJpb3VzIGVycm9yIGNvbmRpdGlvbnMuIEZvciBkZXRhaWxzLFxuICAgKiBzZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hbnNpLXdhcm5pbmdzLXRyYW5zYWN0LXNxbClcbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lXYXJuaW5ncz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEVuZHMgYSBxdWVyeSB3aGVuIGFuIG92ZXJmbG93IG9yIGRpdmlkZS1ieS16ZXJvIGVycm9yIG9jY3VycyBkdXJpbmcgcXVlcnkgZXhlY3V0aW9uLlxuICAgKiBTZWUgW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1hcml0aGFib3J0LXRyYW5zYWN0LXNxbD92aWV3PXNxbC1zZXJ2ZXItMjAxNylcbiAgICogZm9yIG1vcmUgZGV0YWlscy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFyaXRoQWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGRldGVybWluZXMgaWYgY29uY2F0ZW5hdGlvbiB3aXRoIE5VTEwgc2hvdWxkIHJlc3VsdCBpbiBOVUxMIG9yIGVtcHR5IHN0cmluZyB2YWx1ZSwgbW9yZSBkZXRhaWxzIGluXG4gICAqIFtkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9zcWwvdC1zcWwvc3RhdGVtZW50cy9zZXQtY29uY2F0LW51bGwteWllbGRzLW51bGwtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xzIHdoZXRoZXIgY3Vyc29yIHNob3VsZCBiZSBjbG9zZWQsIGlmIHRoZSB0cmFuc2FjdGlvbiBvcGVuaW5nIGl0IGdldHMgY29tbWl0dGVkIG9yIHJvbGxlZFxuICAgKiBiYWNrLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdD86IGJvb2xlYW4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIHNldHMgdGhlIGNvbm5lY3Rpb24gdG8gZWl0aGVyIGltcGxpY2l0IG9yIGF1dG9jb21taXQgdHJhbnNhY3Rpb24gbW9kZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGZhbHNlLCBlcnJvciBpcyBub3QgZ2VuZXJhdGVkIGR1cmluZyBsb3NzIG9mIHByZWNlc3Npb24uXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKVxuICAgKi9cbiAgZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBjaGFyYWN0ZXJzIGVuY2xvc2VkIGluIHNpbmdsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgbGl0ZXJhbHMgYW5kIHRob3NlIGVuY2xvc2VkIGRvdWJsZSBxdW90ZXMgYXJlIHRyZWF0ZWQgYXMgaWRlbnRpZmllcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVRdW90ZWRJZGVudGlmaWVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgb3Igbm90IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgZW5jcnlwdGVkLiBTZXQgdG8gYHRydWVgIGlmIHlvdSdyZSBvbiBXaW5kb3dzIEF6dXJlLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGVuY3J5cHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgZGF0YWJhc2UgcmVxdWVzdGVkIGJ5IFtbZGF0YWJhc2VdXSBjYW5ub3QgYmUgYWNjZXNzZWQsXG4gICAqIHRoZSBjb25uZWN0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLiBIb3dldmVyLCBpZiBbW2ZhbGxiYWNrVG9EZWZhdWx0RGJdXSBpc1xuICAgKiBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSB1c2VyJ3MgZGVmYXVsdCBkYXRhYmFzZSB3aWxsIGJlIHVzZWQgaW5zdGVhZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGZhbGxiYWNrVG9EZWZhdWx0RGI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgbmFtZSB0byBjb25uZWN0IHRvLlxuICAgKiBUaGUgU1FMIFNlcnZlciBCcm93c2VyIHNlcnZpY2UgbXVzdCBiZSBydW5uaW5nIG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsXG4gICAqIGFuZCBVRFAgcG9ydCAxNDM0IG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgbXVzdCBiZSByZWFjaGFibGUuXG4gICAqXG4gICAqIChubyBkZWZhdWx0KVxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBbW3BvcnRdXS5cbiAgICovXG4gIGluc3RhbmNlTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIHRoYXQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgcnVuIHdpdGguXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgaXNvbGF0aW9uTGV2ZWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgZm9yIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBsYW5ndWFnZSBkZXRlcm1pbmVzIHRoZSBkYXRldGltZSBmb3JtYXRzIGFuZCBzeXN0ZW0gbWVzc2FnZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdXNfZW5nbGlzaGApLlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggbmV0d29yayBpbnRlcmZhY2UgKGlwIGFkZHJlc3MpIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gU1FMIFNlcnZlci5cbiAgICovXG4gIGxvY2FsQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcGFyc2UgdW5pcXVlIGlkZW50aWZpZXIgdHlwZSB3aXRoIGxvd2VyY2FzZSBjYXNlIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGxvd2VyQ2FzZUd1aWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cmllcyBmb3IgdHJhbnNpZW50IGVycm9ycy7jgIFcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAzYCkuXG4gICAqL1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIE11bHRpU3VibmV0RmFpbG92ZXIgPSBUcnVlIHBhcmFtZXRlciwgd2hpY2ggY2FuIGhlbHAgbWluaW1pemUgdGhlIGNsaWVudCByZWNvdmVyeSBsYXRlbmN5IHdoZW4gZmFpbG92ZXJzIG9jY3VyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBtdWx0aVN1Ym5ldEZhaWxvdmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgVERTIHBhY2tldHMgKHN1YmplY3QgdG8gbmVnb3RpYXRpb24gd2l0aCB0aGUgc2VydmVyKS5cbiAgICogU2hvdWxkIGJlIGEgcG93ZXIgb2YgMi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGA0MDk2YCkuXG4gICAqL1xuICBwYWNrZXRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGAxNDMzYCkuXG4gICAqXG4gICAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFtbaW5zdGFuY2VOYW1lXV1cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3aWxsIHJlcXVlc3QgcmVhZCBvbmx5IGFjY2VzcyBmcm9tIGEgU1FMIFNlcnZlciBBdmFpbGFiaWxpdHlcbiAgICogR3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW2hlcmVdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDcxMDA1NC5hc3B4IFwiTWljcm9zb2Z0OiBDb25maWd1cmUgUmVhZC1Pbmx5IFJvdXRpbmcgZm9yIGFuIEF2YWlsYWJpbGl0eSBHcm91cCAoU1FMIFNlcnZlcilcIilcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZE9ubHlJbnRlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkLCBvciBgMGAgZm9yIG5vIHRpbWVvdXQuXG4gICAqXG4gICAqIEFzIHNvb24gYXMgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHRpbWVvdXQgaXMgY2xlYXJlZC4gVGhpcyBtZWFucyB0aGF0IHF1ZXJpZXMgdGhhdCBpbW1lZGlhdGVseSByZXR1cm4gYSByZXNwb25zZSBoYXZlIGFiaWxpdHkgdG8gcnVuIGxvbmdlciB0aGFuIHRoaXMgdGltZW91dC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgdGhhdCB3aGVuIHRydWUgd2lsbCBleHBvc2UgcmVjZWl2ZWQgcm93cyBpbiBSZXF1ZXN0cyBkb25lIHJlbGF0ZWQgZXZlbnRzOlxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lSW5Qcm9jXV1cbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZVByb2NdXVxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lXV1cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25Eb25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCB0aGF0IHdoZW4gdHJ1ZSB3aWxsIGV4cG9zZSByZWNlaXZlZCByb3dzIGluIFJlcXVlc3RzJyBjb21wbGV0aW9uIGNhbGxiYWNrLlNlZSBbW1JlcXVlc3QuY29uc3RydWN0b3JdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIFREUyB0byB1c2UuIElmIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc3BlY2lmaWVkIHZlcnNpb24sIG5lZ290aWF0ZWQgdmVyc2lvbiBpcyB1c2VkIGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5URFNfVkVSU0lPTmAuXG4gICAqICogYDdfMWBcbiAgICogKiBgN18yYFxuICAgKiAqIGA3XzNfQWBcbiAgICogKiBgN18zX0JgXG4gICAqICogYDdfNGBcbiAgICpcbiAgICogKGRlZmF1bHQ6IGA3XzRgKVxuICAgKi9cbiAgdGRzVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHZhcmNoYXIobWF4KSwgbnZhcmNoYXIobWF4KSwgdmFyYmluYXJ5KG1heCksIHRleHQsIG50ZXh0LCBhbmQgaW1hZ2UgZGF0YSByZXR1cm5lZCBieSBhIFNFTEVDVCBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgMjE0NzQ4MzY0N2ApXG4gICAqL1xuICB0ZXh0c2l6ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgXCJ0cnVlXCIsIHRoZSBTUUwgU2VydmVyIFNTTCBjZXJ0aWZpY2F0ZSBpcyBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgd2hlbiB0aGUgY29tbXVuaWNhdGlvbiBsYXllciBpcyBlbmNyeXB0ZWQgdXNpbmcgU1NMLlxuICAgKlxuICAgKiBJZiBcImZhbHNlXCIsIHRoZSBTUUwgU2VydmVyIHZhbGlkYXRlcyB0aGUgc2VydmVyIFNTTCBjZXJ0aWZpY2F0ZS4gSWYgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGZhaWxzLFxuICAgKiB0aGUgZHJpdmVyIHJhaXNlcyBhbiBlcnJvciBhbmQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4gTWFrZSBzdXJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gc2VydmVyTmFtZSBleGFjdGx5XG4gICAqIG1hdGNoZXMgdGhlIENvbW1vbiBOYW1lIChDTikgb3IgRE5TIG5hbWUgaW4gdGhlIFN1YmplY3QgQWx0ZXJuYXRlIE5hbWUgaW4gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmb3IgYW4gU1NMIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIGJvb2xlYW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0byByZXR1cm4gcm93cyBhcyBhcnJheXMgb3Iga2V5LXZhbHVlIGNvbGxlY3Rpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICB1c2VDb2x1bW5OYW1lcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHBhc3MgdGltZSB2YWx1ZXMgaW4gVVRDIG9yIGxvY2FsIHRpbWUuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApLlxuICAgKi9cbiAgdXNlVVRDPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHdvcmtzdGF0aW9uIElEIChXU0lEKSBvZiB0aGUgY2xpZW50LCBkZWZhdWx0IG9zLmhvc3RuYW1lKCkuXG4gICAqIFVzZWQgZm9yIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgY2xpZW50IGluIHByb2ZpbGluZywgbG9nZ2luZyBvclxuICAgKiB0cmFjaW5nIGNsaWVudCBhY3Rpdml0eSBpbiBTUUxTZXJ2ZXIuXG4gICAqXG4gICAqIFRoZSB2YWx1ZSBpcyByZXBvcnRlZCBieSB0aGUgVFNRTCBmdW5jdGlvbiBIT1NUX05BTUUoKS5cbiAgICovXG4gIHdvcmtzdGF0aW9uSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgQ0xFQU5VUF9UWVBFID0ge1xuICBOT1JNQUw6IDAsXG4gIFJFRElSRUNUOiAxLFxuICBSRVRSWTogMlxufTtcblxuaW50ZXJmYWNlIFJvdXRpbmdEYXRhIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIHBvcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIFtbQ29ubmVjdGlvbl1dIGluc3RhbmNlIHJlcHJlc2VudHMgYSBzaW5nbGUgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIHNlcnZlci5cbiAqXG4gKiBgYGBqc1xuICogdmFyIENvbm5lY3Rpb24gPSByZXF1aXJlKCd0ZWRpb3VzJykuQ29ubmVjdGlvbjtcbiAqIHZhciBjb25maWcgPSB7XG4gKiAgXCJhdXRoZW50aWNhdGlvblwiOiB7XG4gKiAgICAuLi4sXG4gKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAqICB9LFxuICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICogfTtcbiAqIHZhciBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAqIGBgYFxuICpcbiAqIE9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24uIE9uY2UgYSBbW1JlcXVlc3RdXVxuICogaGFzIGJlZW4gaW5pdGlhdGVkICh3aXRoIFtbQ29ubmVjdGlvbi5jYWxsUHJvY2VkdXJlXV0sIFtbQ29ubmVjdGlvbi5leGVjU3FsXV0sXG4gKiBvciBbW0Nvbm5lY3Rpb24uZXhlY1NxbEJhdGNoXV0pLCBhbm90aGVyIHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoZVxuICogW1tSZXF1ZXN0XV0ncyBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqL1xuY2xhc3MgQ29ubmVjdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZmVkQXV0aFJlcXVpcmVkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbmZpZzogSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNlY3VyZUNvbnRleHRPcHRpb25zOiBTZWN1cmVDb250ZXh0T3B0aW9ucztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpblRyYW5zYWN0aW9uOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zYWN0aW9uRGVzY3JpcHRvcnM6IEJ1ZmZlcltdO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zYWN0aW9uRGVwdGg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBpc1NxbEJhdGNoOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGN1clRyYW5zaWVudFJldHJ5Q291bnQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2llbnRFcnJvckxvb2t1cDogVHJhbnNpZW50RXJyb3JMb29rdXA7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xvc2VkOiBib29sZWFuO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGxvZ2luRXJyb3I6IHVuZGVmaW5lZCB8IEFnZ3JlZ2F0ZUVycm9yIHwgQ29ubmVjdGlvbkVycm9yO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRlYnVnOiBEZWJ1ZztcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudGxtcGFja2V0OiB1bmRlZmluZWQgfCBhbnk7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbnRsbXBhY2tldEJ1ZmZlcjogdW5kZWZpbmVkIHwgQnVmZmVyO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVjbGFyZSBTVEFURToge1xuICAgIElOSVRJQUxJWkVEOiBTdGF0ZTtcbiAgICBDT05ORUNUSU5HOiBTdGF0ZTtcbiAgICBTRU5UX1BSRUxPR0lOOiBTdGF0ZTtcbiAgICBSRVJPVVRJTkc6IFN0YXRlO1xuICAgIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiBTdGF0ZTtcbiAgICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiBTdGF0ZTtcbiAgICBTRU5UX0xPR0lON19XSVRIX05UTE06IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSDogU3RhdGU7XG4gICAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IFN0YXRlO1xuICAgIExPR0dFRF9JTjogU3RhdGU7XG4gICAgU0VOVF9DTElFTlRfUkVRVUVTVDogU3RhdGU7XG4gICAgU0VOVF9BVFRFTlRJT046IFN0YXRlO1xuICAgIEZJTkFMOiBTdGF0ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm91dGluZ0RhdGE6IHVuZGVmaW5lZCB8IFJvdXRpbmdEYXRhO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWVzc2FnZUlvITogTWVzc2FnZUlPO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRlOiBTdGF0ZTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0OiB1bmRlZmluZWQgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdDogdW5kZWZpbmVkIHwgUmVxdWVzdCB8IEJ1bGtMb2FkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb2NSZXR1cm5TdGF0dXNWYWx1ZTogdW5kZWZpbmVkIHwgYW55O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldDogdW5kZWZpbmVkIHwgU29ja2V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG1lc3NhZ2VCdWZmZXI6IEJ1ZmZlcjtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJlcXVlc3RUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmV0cnlUaW1lcjogdW5kZWZpbmVkIHwgTm9kZUpTLlRpbWVvdXQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudDogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRhdGFiYXNlQ29sbGF0aW9uOiBDb2xsYXRpb24gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE5vdGU6IGJlIGF3YXJlIG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucyBmaWVsZDpcbiAgICogMS4gY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcbiAgICogMi4gY29uZmlnLm9wdGlvbnNcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgeyBDb25uZWN0aW9uIH0gPSByZXF1aXJlKCd0ZWRpb3VzJyk7XG4gICAqXG4gICAqIGNvbnN0IGNvbmZpZyA9IHtcbiAgICogIFwiYXV0aGVudGljYXRpb25cIjoge1xuICAgKiAgICAuLi4sXG4gICAqICAgIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiAgfSxcbiAgICogIFwib3B0aW9uc1wiOiB7Li4ufVxuICAgKiB9O1xuICAgKlxuICAgKiBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oY29uZmlnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWdcbiAgICovXG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogQ29ubmVjdGlvbkNvbmZpZ3VyYXRpb24pIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHR5cGVvZiBjb25maWcgIT09ICdvYmplY3QnIHx8IGNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnXCIgYXJndW1lbnQgaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBjb25maWcuc2VydmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLnNlcnZlclwiIHByb3BlcnR5IGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgIH1cblxuICAgIHRoaXMuZmVkQXV0aFJlcXVpcmVkID0gZmFsc2U7XG5cbiAgICBsZXQgYXV0aGVudGljYXRpb246IEludGVybmFsQ29ubmVjdGlvbkNvbmZpZ1snYXV0aGVudGljYXRpb24nXTtcbiAgICBpZiAoY29uZmlnLmF1dGhlbnRpY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLmF1dGhlbnRpY2F0aW9uICE9PSAnb2JqZWN0JyB8fCBjb25maWcuYXV0aGVudGljYXRpb24gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4nKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHlwZSA9IGNvbmZpZy5hdXRoZW50aWNhdGlvbi50eXBlO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zID09PSB1bmRlZmluZWQgPyB7fSA6IGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zO1xuXG4gICAgICBpZiAodHlwZW9mIHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi50eXBlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGUgIT09ICdkZWZhdWx0JyAmJiB0eXBlICE9PSAnbnRsbScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwidHlwZVwiIHByb3BlcnR5IG11c3Qgb25lIG9mIFwiZGVmYXVsdFwiLCBcIm50bG1cIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5cIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHRcIiwgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bVwiIG9yIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2VcIiBvciBcImF6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0XCIuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyAhPT0gJ29iamVjdCcgfHwgb3B0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9uc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBvYmplY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlID09PSAnbnRsbScpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmRvbWFpbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudXNlck5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy51c2VyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdudGxtJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgZG9tYWluOiBvcHRpb25zLmRvbWFpbiAmJiBvcHRpb25zLmRvbWFpbi50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy50ZW5hbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnRlbmFudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMudG9rZW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudG9rZW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB0b2tlbjogb3B0aW9ucy50b2tlblxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNsaWVudElkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0Jykge1xuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuY2xpZW50SWQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudFNlY3JldCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRTZWNyZXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRlbmFudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICBjbGllbnRTZWNyZXQ6IG9wdGlvbnMuY2xpZW50U2VjcmV0LFxuICAgICAgICAgICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0aGVudGljYXRpb24gPSB7XG4gICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIHVzZXJOYW1lOiBvcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IG9wdGlvbnMucGFzc3dvcmRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICB0eXBlOiAnZGVmYXVsdCcsXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB1c2VyTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICAgIHBhc3N3b3JkOiB1bmRlZmluZWRcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgIHNlcnZlcjogY29uZmlnLnNlcnZlcixcbiAgICAgIGF1dGhlbnRpY2F0aW9uOiBhdXRoZW50aWNhdGlvbixcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3I6IGZhbHNlLFxuICAgICAgICBhcHBOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGNhbWVsQ2FzZUNvbHVtbnM6IGZhbHNlLFxuICAgICAgICBjYW5jZWxUaW1lb3V0OiBERUZBVUxUX0NBTkNFTF9USU1FT1VULFxuICAgICAgICBjb2x1bW5FbmNyeXB0aW9uS2V5Q2FjaGVUVEw6IDIgKiA2MCAqIDYwICogMTAwMCwgIC8vIFVuaXRzOiBtaWxpc2Vjb25kc1xuICAgICAgICBjb2x1bW5FbmNyeXB0aW9uU2V0dGluZzogZmFsc2UsXG4gICAgICAgIGNvbHVtbk5hbWVSZXBsYWNlcjogdW5kZWZpbmVkLFxuICAgICAgICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMLFxuICAgICAgICBjb25uZWN0VGltZW91dDogREVGQVVMVF9DT05ORUNUX1RJTUVPVVQsXG4gICAgICAgIGNvbm5lY3RvcjogdW5kZWZpbmVkLFxuICAgICAgICBjb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWw6IElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRCxcbiAgICAgICAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzOiB7fSxcbiAgICAgICAgZGF0YWJhc2U6IHVuZGVmaW5lZCxcbiAgICAgICAgZGF0ZWZpcnN0OiBERUZBVUxUX0RBVEVGSVJTVCxcbiAgICAgICAgZGF0ZUZvcm1hdDogREVGQVVMVF9EQVRFRk9STUFULFxuICAgICAgICBkZWJ1Zzoge1xuICAgICAgICAgIGRhdGE6IGZhbHNlLFxuICAgICAgICAgIHBhY2tldDogZmFsc2UsXG4gICAgICAgICAgcGF5bG9hZDogZmFsc2UsXG4gICAgICAgICAgdG9rZW46IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIGVuYWJsZUFuc2lOdWxsOiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpTnVsbERlZmF1bHQ6IHRydWUsXG4gICAgICAgIGVuYWJsZUFuc2lQYWRkaW5nOiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpV2FybmluZ3M6IHRydWUsXG4gICAgICAgIGVuYWJsZUFyaXRoQWJvcnQ6IHRydWUsXG4gICAgICAgIGVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsOiB0cnVlLFxuICAgICAgICBlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0OiBudWxsLFxuICAgICAgICBlbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9uczogZmFsc2UsXG4gICAgICAgIGVuYWJsZU51bWVyaWNSb3VuZGFib3J0OiBmYWxzZSxcbiAgICAgICAgZW5hYmxlUXVvdGVkSWRlbnRpZmllcjogdHJ1ZSxcbiAgICAgICAgZW5jcnlwdDogdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tUb0RlZmF1bHREYjogZmFsc2UsXG4gICAgICAgIGVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVyczogdW5kZWZpbmVkLFxuICAgICAgICBpbnN0YW5jZU5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgaXNvbGF0aW9uTGV2ZWw6IElTT0xBVElPTl9MRVZFTC5SRUFEX0NPTU1JVFRFRCxcbiAgICAgICAgbGFuZ3VhZ2U6IERFRkFVTFRfTEFOR1VBR0UsXG4gICAgICAgIGxvY2FsQWRkcmVzczogdW5kZWZpbmVkLFxuICAgICAgICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM6IDMsXG4gICAgICAgIG11bHRpU3VibmV0RmFpbG92ZXI6IGZhbHNlLFxuICAgICAgICBwYWNrZXRTaXplOiBERUZBVUxUX1BBQ0tFVF9TSVpFLFxuICAgICAgICBwb3J0OiBERUZBVUxUX1BPUlQsXG4gICAgICAgIHJlYWRPbmx5SW50ZW50OiBmYWxzZSxcbiAgICAgICAgcmVxdWVzdFRpbWVvdXQ6IERFRkFVTFRfQ0xJRU5UX1JFUVVFU1RfVElNRU9VVCxcbiAgICAgICAgcm93Q29sbGVjdGlvbk9uRG9uZTogZmFsc2UsXG4gICAgICAgIHJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uOiBmYWxzZSxcbiAgICAgICAgc2VydmVyTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBzZXJ2ZXJTdXBwb3J0c0NvbHVtbkVuY3J5cHRpb246IGZhbHNlLFxuICAgICAgICB0ZHNWZXJzaW9uOiBERUZBVUxUX1REU19WRVJTSU9OLFxuICAgICAgICB0ZXh0c2l6ZTogREVGQVVMVF9URVhUU0laRSxcbiAgICAgICAgdHJ1c3RlZFNlcnZlck5hbWVBRTogdW5kZWZpbmVkLFxuICAgICAgICB0cnVzdFNlcnZlckNlcnRpZmljYXRlOiBmYWxzZSxcbiAgICAgICAgdXNlQ29sdW1uTmFtZXM6IGZhbHNlLFxuICAgICAgICB1c2VVVEM6IHRydWUsXG4gICAgICAgIHdvcmtzdGF0aW9uSWQ6IHVuZGVmaW5lZCxcbiAgICAgICAgbG93ZXJDYXNlR3VpZHM6IGZhbHNlXG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChjb25maWcub3B0aW9ucykge1xuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgJiYgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignUG9ydCBhbmQgaW5zdGFuY2VOYW1lIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIGJ1dCAnICsgY29uZmlnLm9wdGlvbnMucG9ydCArICcgYW5kICcgKyBjb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgKyAnIHByb3ZpZGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvciA9IGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuYXBwTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuYXBwTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5hcHBOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuYXBwTmFtZSA9IGNvbmZpZy5vcHRpb25zLmFwcE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbWVsQ2FzZUNvbHVtbnMgPSBjb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dCA9IGNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXIgPSBjb25maWcub3B0aW9ucy5jb2x1bW5OYW1lUmVwbGFjZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCwgJ2NvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQgPSBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3RvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yXCIgcHJvcGVydHkgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0b3IgPSBjb25maWcub3B0aW9ucy5jb25uZWN0b3I7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyAhPT0gJ29iamVjdCcgfHwgY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzID09PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzID0gY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGFiYXNlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0YWJhc2UgPSBjb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSAnbnVtYmVyJyAmJiBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRlZmlyc3RcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gbnVsbCAmJiAoY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0IDwgMSB8fCBjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgPiA3KSkge1xuICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRlZmlyc3RcIiBwcm9wZXJ0eSBtdXN0IGJlID49IDEgYW5kIDw9IDcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ID0gY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gJ3N0cmluZycgJiYgY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgPSBjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhID0gY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0ID0gY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkID0gY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW4gPSBjb25maWcub3B0aW9ucy5kZWJ1Zy50b2tlbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGwgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsRGVmYXVsdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmdcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3NcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0ID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGxcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPSBjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmNyeXB0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgPSBjb25maWcub3B0aW9ucy5lbmNyeXB0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYlwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiID0gY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSA9IGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZTtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsLCAnY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09ICdzdHJpbmcnICYmIGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlID0gY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3NcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgPSBjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgPSBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5wYWNrZXRTaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSA9IGNvbmZpZy5vcHRpb25zLnBhY2tldFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5wb3J0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgPD0gMCB8fCBjb25maWcub3B0aW9ucy5wb3J0ID49IDY1NTM2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlID4gMCBhbmQgPCA2NTUzNicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gY29uZmlnLm9wdGlvbnMucG9ydDtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ID0gY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCA9IGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzID0gY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWxcIiBwcm9wZXJ0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lID0gY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb25cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gPSBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPSBjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSAnbnVtYmVyJyAmJiBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlciBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgY2FuXFwndCBiZSBncmVhdGVyIHRoYW4gMjE0NzQ4MzY0Ny4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSA8IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBjYW5cXCd0IGJlIHNtYWxsZXIgdGhhbiAtMS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPSBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSB8IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgPSBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyA9IGNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudXNlVVRDICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy51c2VVVEMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnVzZVVUQ1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy51c2VVVEMgPSBjb25maWcub3B0aW9ucy51c2VVVEM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkID0gY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgPSBjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zID0gdGhpcy5jb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHM7XG4gICAgaWYgKHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB0aGUgY2FsbGVyIGhhcyBub3Qgc3BlY2lmaWVkIHRoZWlyIG93biBgc2VjdXJlT3B0aW9uc2AsXG4gICAgICAvLyB3ZSBzZXQgYFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFNgIGhlcmUuXG4gICAgICAvLyBPbGRlciBTUUwgU2VydmVyIGluc3RhbmNlcyBydW5uaW5nIG9uIG9sZGVyIFdpbmRvd3MgdmVyc2lvbnMgaGF2ZVxuICAgICAgLy8gdHJvdWJsZSB3aXRoIHRoZSBCRUFTVCB3b3JrYXJvdW5kIGluIE9wZW5TU0wuXG4gICAgICAvLyBBcyBCRUFTVCBpcyBhIGJyb3dzZXIgc3BlY2lmaWMgZXhwbG9pdCwgd2UgY2FuIGp1c3QgZGlzYWJsZSB0aGlzIG9wdGlvbiBoZXJlLlxuICAgICAgdGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucywge1xuICAgICAgICBzZWN1cmVPcHRpb25zOiB7XG4gICAgICAgICAgdmFsdWU6IGNvbnN0YW50cy5TU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcgPSB0aGlzLmNyZWF0ZURlYnVnKCk7XG4gICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gW0J1ZmZlci5mcm9tKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSldO1xuXG4gICAgLy8gJ2JlZ2luVHJhbnNhY3Rpb24nLCAnY29tbWl0VHJhbnNhY3Rpb24nIGFuZCAncm9sbGJhY2tUcmFuc2FjdGlvbidcbiAgICAvLyBldmVudHMgYXJlIHV0aWxpemVkIHRvIG1haW50YWluIGluVHJhbnNhY3Rpb24gcHJvcGVydHkgc3RhdGUgd2hpY2ggaW5cbiAgICAvLyB0dXJuIGlzIHVzZWQgaW4gbWFuYWdpbmcgdHJhbnNhY3Rpb25zLiBUaGVzZSBldmVudHMgYXJlIG9ubHkgZmlyZWQgZm9yXG4gICAgLy8gVERTIHZlcnNpb24gNy4yIGFuZCBiZXlvbmQuIFRoZSBwcm9wZXJ0aWVzIGJlbG93IGFyZSB1c2VkIHRvIGVtdWxhdGVcbiAgICAvLyBlcXVpdmFsZW50IGJlaGF2aW9yIGZvciBURFMgdmVyc2lvbnMgYmVmb3JlIDcuMi5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGggPSAwO1xuICAgIHRoaXMuaXNTcWxCYXRjaCA9IGZhbHNlO1xuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50ID0gMDtcbiAgICB0aGlzLnRyYW5zaWVudEVycm9yTG9va3VwID0gbmV3IFRyYW5zaWVudEVycm9yTG9va3VwKCk7XG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5TVEFURS5JTklUSUFMSVpFRDtcblxuICAgIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkFUVEVOVElPTik7XG4gICAgICB0aGlzLmNyZWF0ZUNhbmNlbFRpbWVyKCk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbm5lY3QoY29ubmVjdExpc3RlbmVyPzogKGVycj86IEVycm9yKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuU1RBVEUuSU5JVElBTElaRUQpIHtcbiAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoJ2AuY29ubmVjdGAgY2FuIG5vdCBiZSBjYWxsZWQgb24gYSBDb25uZWN0aW9uIGluIGAnICsgdGhpcy5zdGF0ZS5uYW1lICsgJ2Agc3RhdGUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3RMaXN0ZW5lcikge1xuICAgICAgY29uc3Qgb25Db25uZWN0ID0gKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIGNvbm5lY3RMaXN0ZW5lcihlcnIpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgICBjb25uZWN0TGlzdGVuZXIoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICB0aGlzLm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBjaGFyc2V0IGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdjaGFyc2V0Q2hhbmdlJywgbGlzdGVuZXI6IChjaGFyc2V0OiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgYW5kIHZhbGlkYXRlIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBvbihcbiAgICBldmVudDogJ2Nvbm5lY3QnLFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlcnIgSWYgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCwgd2lsbCBiZSBmYWxzZXkuIElmIHRoZXJlIHdhcyBhXG4gICAgICogICBwcm9ibGVtICh3aXRoIGVpdGhlciBjb25uZWN0aW5nIG9yIHZhbGlkYXRpb24pLCB3aWxsIGJlIGFuIFtbRXJyb3JdXSBvYmplY3QuXG4gICAgICovXG4gICAgbGlzdGVuZXI6IChlcnI6IEVycm9yIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgYWN0aXZlIGRhdGFiYXNlIGhhcyBjaGFuZ2VkLlxuICAgKiBUaGlzIG1heSBiZSBhcyBhIHJlc3VsdCBvZiBhIHN1Y2Nlc3NmdWwgbG9naW4sIG9yIGEgYHVzZWAgc3RhdGVtZW50LlxuICAgKi9cbiAgb24oZXZlbnQ6ICdkYXRhYmFzZUNoYW5nZScsIGxpc3RlbmVyOiAoZGF0YWJhc2VOYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEEgZGVidWcgbWVzc2FnZSBpcyBhdmFpbGFibGUuIEl0IG1heSBiZSBsb2dnZWQgb3IgaWdub3JlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnZGVidWcnLCBsaXN0ZW5lcjogKG1lc3NhZ2VUZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEludGVybmFsIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIG9uKGV2ZW50OiAnZXJyb3InLCBsaXN0ZW5lcjogKGVycjogRXJyb3IpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIGlzc3VlZCBhbiBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlcnJvck1lc3NhZ2UnLCBsaXN0ZW5lcjogKG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkVycm9yTWVzc2FnZVRva2VuKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBoYXMgZW5kZWQuXG4gICAqXG4gICAqIFRoaXMgbWF5IGJlIGFzIGEgcmVzdWx0IG9mIHRoZSBjbGllbnQgY2FsbGluZyBbW2Nsb3NlXV0sIHRoZSBzZXJ2ZXJcbiAgICogY2xvc2luZyB0aGUgY29ubmVjdGlvbiwgb3IgYSBuZXR3b3JrIGVycm9yLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlbmQnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgaXNzdWVkIGFuIGluZm9ybWF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBvbihldmVudDogJ2luZm9NZXNzYWdlJywgbGlzdGVuZXI6IChtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5JbmZvTWVzc2FnZVRva2VuKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBsYW5ndWFnZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnbGFuZ3VhZ2VDaGFuZ2UnLCBsaXN0ZW5lcjogKGxhbmd1YWdlTmFtZTogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB3YXMgcmVzZXQuXG4gICAqL1xuICBvbihldmVudDogJ3Jlc2V0Q29ubmVjdGlvbicsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyZSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdzZWN1cmUnLCBsaXN0ZW5lcjogKGNsZWFydGV4dDogaW1wb3J0KCd0bHMnKS5UTFNTb2NrZXQpID0+IHZvaWQpOiB0aGlzXG5cbiAgb24oZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHJldHVybiBzdXBlci5vbihldmVudCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnY2hhcnNldENoYW5nZScsIGNoYXJzZXQ6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnY29ubmVjdCcsIGVycm9yPzogRXJyb3IpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2RhdGFiYXNlQ2hhbmdlJywgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2RlYnVnJywgbWVzc2FnZVRleHQ6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZXJyb3InLCBlcnJvcjogRXJyb3IpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Vycm9yTWVzc2FnZScsIG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkVycm9yTWVzc2FnZVRva2VuKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlbmQnKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdpbmZvTWVzc2FnZScsIG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkluZm9NZXNzYWdlVG9rZW4pOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2xhbmd1YWdlQ2hhbmdlJywgbGFuZ3VhZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3NlY3VyZScsIGNsZWFydGV4dDogaW1wb3J0KCd0bHMnKS5UTFNTb2NrZXQpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3Jlcm91dGluZycpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3Jlc2V0Q29ubmVjdGlvbicpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3JldHJ5Jyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncm9sbGJhY2tUcmFuc2FjdGlvbicpOiBib29sZWFuXG5cbiAgZW1pdChldmVudDogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzdXBlci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBUaGUgW1tFdmVudF9lbmRdXSB3aWxsIGJlIGVtaXR0ZWQgb25jZSB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGlzZUNvbm5lY3Rpb24oKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jcmVhdGVDb25uZWN0VGltZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RPblBvcnQodGhpcy5jb25maWcub3B0aW9ucy5wb3J0LCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2VMb29rdXAoe1xuICAgICAgICBzZXJ2ZXI6IHRoaXMuY29uZmlnLnNlcnZlcixcbiAgICAgICAgaW5zdGFuY2VOYW1lOiB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSEsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIHNpZ25hbDogc2lnbmFsXG4gICAgICB9KS50aGVuKChwb3J0KSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29ubmVjdE9uUG9ydChwb3J0LCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckNvbm5lY3RUaW1lcigpO1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIC8vIElnbm9yZSB0aGUgQWJvcnRFcnJvciBmb3Igbm93LCB0aGlzIGlzIHN0aWxsIGhhbmRsZWQgYnkgdGhlIGNvbm5lY3RUaW1lciBmaXJpbmdcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKGVyci5tZXNzYWdlLCAnRUlOU1RMT09LVVAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhbnVwQ29ubmVjdGlvbihjbGVhbnVwVHlwZTogdHlwZW9mIENMRUFOVVBfVFlQRVtrZXlvZiB0eXBlb2YgQ0xFQU5VUF9UWVBFXSkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJSZXF1ZXN0VGltZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgaWYgKGNsZWFudXBUeXBlID09PSBDTEVBTlVQX1RZUEUuUkVESVJFQ1QpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXJvdXRpbmcnKTtcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW51cFR5cGUgIT09IENMRUFOVVBfVFlQRS5SRVRSWSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0RXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZXF1ZXN0IGNvbXBsZXRlZC4nLCAnRUNMT1NFJyk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVEZWJ1ZygpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IG5ldyBEZWJ1Zyh0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnKTtcbiAgICBkZWJ1Zy5vbignZGVidWcnLCAobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIG1lc3NhZ2UpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWJ1ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZTogTWVzc2FnZSwgaGFuZGxlcjogVG9rZW5IYW5kbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCB0aGlzLmRlYnVnLCBoYW5kbGVyLCB0aGlzLmNvbmZpZy5vcHRpb25zKTtcbiAgfVxuXG4gIGNvbm5lY3RPblBvcnQocG9ydDogbnVtYmVyLCBtdWx0aVN1Ym5ldEZhaWxvdmVyOiBib29sZWFuLCBzaWduYWw6IEFib3J0U2lnbmFsLCBjdXN0b21Db25uZWN0b3I/OiAoKSA9PiBQcm9taXNlPFNvY2tldD4pIHtcbiAgICBjb25zdCBjb25uZWN0T3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcixcbiAgICAgIHBvcnQ6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnBvcnQgOiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiB0aGlzLmNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzc1xuICAgIH07XG5cbiAgICBjb25zdCBjb25uZWN0ID0gY3VzdG9tQ29ubmVjdG9yIHx8IChtdWx0aVN1Ym5ldEZhaWxvdmVyID8gY29ubmVjdEluUGFyYWxsZWwgOiBjb25uZWN0SW5TZXF1ZW5jZSk7XG5cbiAgICBjb25uZWN0KGNvbm5lY3RPcHRzLCBkbnMubG9va3VwLCBzaWduYWwpLnRoZW4oKHNvY2tldCkgPT4ge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyb3IpID0+IHsgdGhpcy5zb2NrZXRFcnJvcihlcnJvcik7IH0pO1xuICAgICAgICBzb2NrZXQub24oJ2Nsb3NlJywgKCkgPT4geyB0aGlzLnNvY2tldENsb3NlKCk7IH0pO1xuICAgICAgICBzb2NrZXQub24oJ2VuZCcsICgpID0+IHsgdGhpcy5zb2NrZXRFbmQoKTsgfSk7XG4gICAgICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgS0VFUF9BTElWRV9JTklUSUFMX0RFTEFZKTtcblxuICAgICAgICB0aGlzLm1lc3NhZ2VJbyA9IG5ldyBNZXNzYWdlSU8oc29ja2V0LCB0aGlzLmNvbmZpZy5vcHRpb25zLnBhY2tldFNpemUsIHRoaXMuZGVidWcpO1xuICAgICAgICB0aGlzLm1lc3NhZ2VJby5vbignc2VjdXJlJywgKGNsZWFydGV4dCkgPT4geyB0aGlzLmVtaXQoJ3NlY3VyZScsIGNsZWFydGV4dCk7IH0pO1xuXG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVidWcubG9nKCdjb25uZWN0ZWQgdG8gJyArIHRoaXMuY29uZmlnLnNlcnZlciArICc6JyArIHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCk7XG5cbiAgICAgICAgdGhpcy5zZW5kUHJlTG9naW4oKTtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1BSRUxPR0lOKTtcbiAgICAgIH0pO1xuICAgIH0sIChlcnIpID0+IHtcbiAgICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7IHRoaXMuc29ja2V0RXJyb3IoZXJyKTsgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsb3NlQ29ubmVjdGlvbigpIHtcbiAgICBpZiAodGhpcy5zb2NrZXQpIHtcbiAgICAgIHRoaXMuc29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZUNvbm5lY3RUaW1lcigpIHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuY29ubmVjdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICB0aGlzLmNvbm5lY3RUaW1lb3V0KCk7XG4gICAgfSwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCk7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXIuc2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVDYW5jZWxUaW1lcigpIHtcbiAgICB0aGlzLmNsZWFyQ2FuY2VsVGltZXIoKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gdGhpcy5jb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0O1xuICAgIGlmICh0aW1lb3V0ID4gMCkge1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmNhbmNlbFRpbWVvdXQoKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlUmVxdWVzdFRpbWVyKCkge1xuICAgIHRoaXMuY2xlYXJSZXF1ZXN0VGltZXIoKTsgLy8gcmVsZWFzZSBvbGQgdGltZXIsIGp1c3QgdG8gYmUgc2FmZVxuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnJlcXVlc3QgYXMgUmVxdWVzdDtcbiAgICBjb25zdCB0aW1lb3V0ID0gKHJlcXVlc3QudGltZW91dCAhPT0gdW5kZWZpbmVkKSA/IHJlcXVlc3QudGltZW91dCA6IHRoaXMuY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQ7XG4gICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgIHRoaXMucmVxdWVzdFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXQoKTtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlUmV0cnlUaW1lcigpIHtcbiAgICB0aGlzLmNsZWFyUmV0cnlUaW1lcigpO1xuICAgIHRoaXMucmV0cnlUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZXRyeVRpbWVvdXQoKTtcbiAgICB9LCB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29ubmVjdFRpbWVvdXQoKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3RoaXMuY29uZmlnLnNlcnZlcn0ke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydCA/IGA6JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnR9YCA6IGBcXFxcJHt0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZX1gfSBpbiAke3RoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXR9bXNgO1xuICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJykpO1xuICAgIHRoaXMuY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnY29ubmVjdFRpbWVvdXQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2FuY2VsVGltZW91dCgpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gYEZhaWxlZCB0byBjYW5jZWwgcmVxdWVzdCBpbiAke3RoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dH1tc2A7XG4gICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzb2NrZXRFcnJvcicsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXF1ZXN0VGltZW91dCgpIHtcbiAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICByZXF1ZXN0LmNhbmNlbCgpO1xuICAgIGNvbnN0IHRpbWVvdXQgPSAocmVxdWVzdC50aW1lb3V0ICE9PSB1bmRlZmluZWQpID8gcmVxdWVzdC50aW1lb3V0IDogdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dDtcbiAgICBjb25zdCBtZXNzYWdlID0gJ1RpbWVvdXQ6IFJlcXVlc3QgZmFpbGVkIHRvIGNvbXBsZXRlIGluICcgKyB0aW1lb3V0ICsgJ21zJztcbiAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihtZXNzYWdlLCAnRVRJTUVPVVQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmV0cnlUaW1lb3V0KCkge1xuICAgIHRoaXMucmV0cnlUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmVtaXQoJ3JldHJ5Jyk7XG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJDb25uZWN0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMuY29ubmVjdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jb25uZWN0VGltZXIpO1xuICAgICAgdGhpcy5jb25uZWN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhckNhbmNlbFRpbWVyKCkge1xuICAgIGlmICh0aGlzLmNhbmNlbFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5jYW5jZWxUaW1lcik7XG4gICAgICB0aGlzLmNhbmNlbFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJSZXF1ZXN0VGltZXIoKSB7XG4gICAgaWYgKHRoaXMucmVxdWVzdFRpbWVyKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZXIpO1xuICAgICAgdGhpcy5yZXF1ZXN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhclJldHJ5VGltZXIoKSB7XG4gICAgaWYgKHRoaXMucmV0cnlUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmV0cnlUaW1lcik7XG4gICAgICB0aGlzLnJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICB0cmFuc2l0aW9uVG8obmV3U3RhdGU6IFN0YXRlKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IG5ld1N0YXRlKSB7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnU3RhdGUgaXMgYWxyZWFkeSAnICsgbmV3U3RhdGUubmFtZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5leGl0KSB7XG4gICAgICB0aGlzLnN0YXRlLmV4aXQuY2FsbCh0aGlzLCBuZXdTdGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5kZWJ1Zy5sb2coJ1N0YXRlIGNoYW5nZTogJyArICh0aGlzLnN0YXRlID8gdGhpcy5zdGF0ZS5uYW1lIDogJ3VuZGVmaW5lZCcpICsgJyAtPiAnICsgbmV3U3RhdGUubmFtZSk7XG4gICAgdGhpcy5zdGF0ZSA9IG5ld1N0YXRlO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuZW50ZXIpIHtcbiAgICAgIHRoaXMuc3RhdGUuZW50ZXIuYXBwbHkodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRFdmVudEhhbmRsZXI8VCBleHRlbmRzIGtleW9mIFN0YXRlWydldmVudHMnXT4oZXZlbnROYW1lOiBUKTogTm9uTnVsbGFibGU8U3RhdGVbJ2V2ZW50cyddW1RdPiB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuc3RhdGUuZXZlbnRzW2V2ZW50TmFtZV07XG5cbiAgICBpZiAoIWhhbmRsZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZXZlbnQgJyR7ZXZlbnROYW1lfScgaW4gc3RhdGUgJyR7dGhpcy5zdGF0ZS5uYW1lfSdgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlciE7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGRpc3BhdGNoRXZlbnQ8VCBleHRlbmRzIGtleW9mIFN0YXRlWydldmVudHMnXT4oZXZlbnROYW1lOiBULCAuLi5hcmdzOiBQYXJhbWV0ZXJzPE5vbk51bGxhYmxlPFN0YXRlWydldmVudHMnXVtUXT4+KSB7XG4gICAgY29uc3QgaGFuZGxlciA9IHRoaXMuc3RhdGUuZXZlbnRzW2V2ZW50TmFtZV0gYXMgKCh0aGlzOiBDb25uZWN0aW9uLCAuLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGhhbmRsZXIpIHtcbiAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoYE5vIGV2ZW50ICcke2V2ZW50TmFtZX0nIGluIHN0YXRlICcke3RoaXMuc3RhdGUubmFtZX0nYCkpO1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0RXJyb3IoZXJyb3I6IEVycm9yKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuQ09OTkVDVElORyB8fCB0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLlNFTlRfVExTU1NMTkVHT1RJQVRJT04pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGNvbm5lY3QgdG8gJHt0aGlzLmNvbmZpZy5zZXJ2ZXJ9OiR7dGhpcy5jb25maWcub3B0aW9ucy5wb3J0fSAtICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFU09DS0VUJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gYENvbm5lY3Rpb24gbG9zdCAtICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgdGhpcy5kZWJ1Zy5sb2cobWVzc2FnZSk7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVNPQ0tFVCcpKTtcbiAgICB9XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdzb2NrZXRFcnJvcicsIGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0RW5kKCkge1xuICAgIHRoaXMuZGVidWcubG9nKCdzb2NrZXQgZW5kZWQnKTtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5GSU5BTCkge1xuICAgICAgY29uc3QgZXJyb3I6IEVycm9yV2l0aENvZGUgPSBuZXcgRXJyb3IoJ3NvY2tldCBoYW5nIHVwJyk7XG4gICAgICBlcnJvci5jb2RlID0gJ0VDT05OUkVTRVQnO1xuICAgICAgdGhpcy5zb2NrZXRFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzb2NrZXRDbG9zZSgpIHtcbiAgICB0aGlzLmRlYnVnLmxvZygnY29ubmVjdGlvbiB0byAnICsgdGhpcy5jb25maWcuc2VydmVyICsgJzonICsgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ICsgJyBjbG9zZWQnKTtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5SRVJPVVRJTkcpIHtcbiAgICAgIHRoaXMuZGVidWcubG9nKCdSZXJvdXRpbmcgdG8gJyArIHRoaXMucm91dGluZ0RhdGEhLnNlcnZlciArICc6JyArIHRoaXMucm91dGluZ0RhdGEhLnBvcnQpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JlY29ubmVjdCcpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSkge1xuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyO1xuICAgICAgY29uc3QgcG9ydCA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnBvcnQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQ7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUmV0cnkgYWZ0ZXIgdHJhbnNpZW50IGZhaWx1cmUgY29ubmVjdGluZyB0byAnICsgc2VydmVyICsgJzonICsgcG9ydCk7XG5cbiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgncmV0cnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kUHJlTG9naW4oKSB7XG4gICAgY29uc3QgWyAsIG1ham9yLCBtaW5vciwgYnVpbGQgXSA9IC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspLy5leGVjKHZlcnNpb24pID8/IFsgJzAuMC4wJywgJzAnLCAnMCcsICcwJyBdO1xuXG4gICAgY29uc3QgcGF5bG9hZCA9IG5ldyBQcmVsb2dpblBheWxvYWQoe1xuICAgICAgZW5jcnlwdDogdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0LFxuICAgICAgdmVyc2lvbjogeyBtYWpvcjogTnVtYmVyKG1ham9yKSwgbWlub3I6IE51bWJlcihtaW5vciksIGJ1aWxkOiBOdW1iZXIoYnVpbGQpLCBzdWJidWlsZDogMCB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBwYXlsb2FkLmRhdGEpO1xuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kTG9naW43UGFja2V0KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTG9naW43UGF5bG9hZCh7XG4gICAgICB0ZHNWZXJzaW9uOiB2ZXJzaW9uc1t0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb25dLFxuICAgICAgcGFja2V0U2l6ZTogdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplLFxuICAgICAgY2xpZW50UHJvZ1ZlcjogMCxcbiAgICAgIGNsaWVudFBpZDogcHJvY2Vzcy5waWQsXG4gICAgICBjb25uZWN0aW9uSWQ6IDAsXG4gICAgICBjbGllbnRUaW1lWm9uZTogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLFxuICAgICAgY2xpZW50TGNpZDogMHgwMDAwMDQwOVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG4gICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdBREFMJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICB3b3JrZmxvdzogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic6XG4gICAgICAgIHBheWxvYWQuZmVkQXV0aCA9IHtcbiAgICAgICAgICB0eXBlOiAnU0VDVVJJVFlUT0tFTicsXG4gICAgICAgICAgZWNobzogdGhpcy5mZWRBdXRoUmVxdWlyZWQsXG4gICAgICAgICAgZmVkQXV0aFRva2VuOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnRva2VuXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bSc6XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnaW50ZWdyYXRlZCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICBwYXlsb2FkLnNzcGkgPSBjcmVhdGVOVExNUmVxdWVzdCh7IGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4gfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXlsb2FkLnVzZXJOYW1lID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZTtcbiAgICAgICAgcGF5bG9hZC5wYXNzd29yZCA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgcGF5bG9hZC5ob3N0bmFtZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCB8fCBvcy5ob3N0bmFtZSgpO1xuICAgIHBheWxvYWQuc2VydmVyTmFtZSA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBwYXlsb2FkLmFwcE5hbWUgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmFwcE5hbWUgfHwgJ1RlZGlvdXMnO1xuICAgIHBheWxvYWQubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTtcbiAgICBwYXlsb2FkLmxhbmd1YWdlID0gdGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICBwYXlsb2FkLmRhdGFiYXNlID0gdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICBwYXlsb2FkLmNsaWVudElkID0gQnVmZmVyLmZyb20oWzEsIDIsIDMsIDQsIDUsIDZdKTtcblxuICAgIHBheWxvYWQucmVhZE9ubHlJbnRlbnQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50O1xuICAgIHBheWxvYWQuaW5pdERiRmF0YWwgPSAhdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuXG4gICAgdGhpcy5yb3V0aW5nRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkxPR0lONywgcGF5bG9hZC50b0J1ZmZlcigpKTtcblxuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW5MZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aCh0b2tlbiwgJ3VjczInKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDggKyBhY2Nlc3NUb2tlbkxlbik7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgb2Zmc2V0ID0gZGF0YS53cml0ZVVJbnQzMkxFKGFjY2Vzc1Rva2VuTGVuICsgNCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgPSBkYXRhLndyaXRlVUludDMyTEUoYWNjZXNzVG9rZW5MZW4sIG9mZnNldCk7XG4gICAgZGF0YS53cml0ZSh0b2tlbiwgb2Zmc2V0LCAndWNzMicpO1xuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuRkVEQVVUSF9UT0tFTiwgZGF0YSk7XG4gICAgLy8gc2VudCB0aGUgZmVkQXV0aCB0b2tlbiBtZXNzYWdlLCB0aGUgcmVzdCBpcyBzaW1pbGFyIHRvIHN0YW5kYXJkIGxvZ2luIDdcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kSW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFNxbEJhdGNoUGF5bG9hZCh0aGlzLmdldEluaXRpYWxTcWwoKSwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogVFlQRS5TUUxfQkFUQ0ggfSk7XG4gICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgIFJlYWRhYmxlLmZyb20ocGF5bG9hZCkucGlwZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxscyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbHMgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV93YXJuaW5ncyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3dhcm5pbmdzIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGNvbmNhdF9udWxsX3lpZWxkc19udWxsIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY29uY2F0X251bGxfeWllbGRzX251bGwgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmaXJzdCAke3RoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmb3JtYXQgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgbGFuZ3VhZ2UgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHF1b3RlZF9pZGVudGlmaWVyIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0ZXh0c2l6ZSAke3RoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJHt0aGlzLmdldElzb2xhdGlvbkxldmVsVGV4dCh0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHhhY3RfYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCB4YWN0X2Fib3J0IG9mZicpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcm9jZXNzZWRJbml0aWFsU3FsKCkge1xuICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBTUUwgYmF0Y2ggcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqIFRoZXJlIGlzIG5vIHBhcmFtIHN1cHBvcnQsIGFuZCB1bmxpa2UgW1tSZXF1ZXN0LmV4ZWNTcWxdXSxcbiAgICogaXQgaXMgbm90IGxpa2VseSB0aGF0IFNRTCBTZXJ2ZXIgd2lsbCByZXVzZSB0aGUgZXhlY3V0aW9uIHBsYW4gaXQgZ2VuZXJhdGVzIGZvciB0aGUgU1FMLlxuICAgKlxuICAgKiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBbW1JlcXVlc3QuZXhlY1NxbF1dIHdpbGwgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleGVjU3FsQmF0Y2gocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5TUUxfQkFUQ0gsIG5ldyBTcWxCYXRjaFBheWxvYWQocmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqICBFeGVjdXRlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEFzIGBzcF9leGVjdXRlc3FsYCBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIFNRTCwgaWYgdGhlIHNhbWUgU1FMIGlzIGV4ZWN1dGVkIG11bHRpcGxlcyB0aW1lc1xuICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU1FMIFNlcnZlciBxdWVyeSBvcHRpbWl6ZXIgaXMgbGlrZWx5IHRvIHJldXNlIHRoZSBleGVjdXRpb24gcGxhbiBpdCBnZW5lcmF0ZXNcbiAgICogZm9yIHRoZSBmaXJzdCBleGVjdXRpb24uIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIFNRTCBzZXJ2ZXIgdHJlYXRpbmcgdGhlIHJlcXVlc3QgbGlrZSBhIHN0b3JlZCBwcm9jZWR1cmVcbiAgICogd2hpY2ggY2FuIHJlc3VsdCBpbiB0aGUgW1tFdmVudF9kb25lSW5Qcm9jXV0gb3IgW1tFdmVudF9kb25lUHJvY11dIGV2ZW50cyBiZWluZyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlXG4gICAqIFtbRXZlbnRfZG9uZV1dIGV2ZW50IHlvdSBtaWdodCBleHBlY3QuIFVzaW5nIFtbZXhlY1NxbEJhdGNoXV0gd2lsbCBwcmV2ZW50IHRoaXMgZnJvbSBvY2N1cnJpbmcgYnV0IG1heSBoYXZlIGEgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgKlxuICAgKiBCZXdhcmUgb2YgdGhlIHdheSB0aGF0IHNjb3BpbmcgcnVsZXMgYXBwbHksIGFuZCBob3cgdGhleSBtYXkgW2FmZmVjdCBsb2NhbCB0ZW1wIHRhYmxlc10oaHR0cDovL3dlYmxvZ3Muc3FsdGVhbS5jb20vbWxhZGVucC9hcmNoaXZlLzIwMDYvMTEvMDMvMTcxOTcuYXNweClcbiAgICogSWYgeW91J3JlIHJ1bm5pbmcgaW4gdG8gc2NvcGluZyBpc3N1ZXMsIHRoZW4gW1tleGVjU3FsQmF0Y2hdXSBtYXkgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKiBTZWUgYWxzbyBbaXNzdWUgIzI0XShodHRwczovL2dpdGh1Yi5jb20vcGVraW0vdGVkaW91cy9pc3N1ZXMvMjQpXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4ZWNTcWwocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuTlZhckNoYXIsXG4gICAgICBuYW1lOiAnc3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgICBuYW1lOiAncGFyYW1zJyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpLFxuICAgICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBwYXJhbWV0ZXJzLnB1c2goLi4ucmVxdWVzdC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChQcm9jZWR1cmVzLlNwX0V4ZWN1dGVTcWwsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCdWxrTG9hZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBidWxrLWluc2VydCBpbnRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBIHNldCBvZiBidWxrIGxvYWQgb3B0aW9ucy5cbiAgICovXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiBCdWxrTG9hZENhbGxiYWNrKTogQnVsa0xvYWRcbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zLCBjYWxsYmFjazogQnVsa0xvYWRDYWxsYmFjayk6IEJ1bGtMb2FkXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrT3JPcHRpb25zOiBCdWxrTG9hZE9wdGlvbnMgfCBCdWxrTG9hZENhbGxiYWNrLCBjYWxsYmFjaz86IEJ1bGtMb2FkQ2FsbGJhY2spIHtcbiAgICBsZXQgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zO1xuXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tPck9wdGlvbnMgYXMgQnVsa0xvYWRDYWxsYmFjaztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGNhbGxiYWNrT3JPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm9wdGlvbnNcIiBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJ1bGtMb2FkKHRhYmxlLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uLCB0aGlzLmNvbmZpZy5vcHRpb25zLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIFtbQnVsa0xvYWRdXS5cbiAgICpcbiAgICogYGBganNcbiAgICogLy8gV2Ugd2FudCB0byBwZXJmb3JtIGEgYnVsayBsb2FkIGludG8gYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKiAvLyBDUkVBVEUgVEFCTEUgZW1wbG95ZWVzIChmaXJzdF9uYW1lIG52YXJjaGFyKDI1NSksIGxhc3RfbmFtZSBudmFyY2hhcigyNTUpLCBkYXlfb2ZfYmlydGggZGF0ZSk7XG4gICAqXG4gICAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnZW1wbG95ZWVzJywgKGVyciwgcm93Q291bnQpID0+IHtcbiAgICogICAvLyAuLi5cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIGNvbHVtbnMgdGhhdCB3ZSB3YW50IHRvIHdyaXRlIHRvLFxuICAgKiAvLyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMuIFRoZXNlIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCB0YWJsZSxcbiAgICogLy8gb3RoZXJ3aXNlIHRoZSBidWxrIGxvYWQgd2lsbCBmYWlsLlxuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignbGFzdF9uYW1lJywgVFlQRVMuTlZhcmNoYXIsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2RhdGVfb2ZfYmlydGgnLCBUWVBFUy5EYXRlLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICpcbiAgICogLy8gRXhlY3V0ZSBhIGJ1bGsgbG9hZCB3aXRoIGEgcHJlZGVmaW5lZCBsaXN0IG9mIHJvd3MuXG4gICAqIC8vXG4gICAqIC8vIE5vdGUgdGhhdCB0aGVzZSByb3dzIGFyZSBoZWxkIGluIG1lbW9yeSB1bnRpbCB0aGVcbiAgICogLy8gYnVsayBsb2FkIHdhcyBwZXJmb3JtZWQsIHNvIGlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbGFyZ2VcbiAgICogLy8gbnVtYmVyIG9mIHJvd3MgKGUuZy4gYnkgcmVhZGluZyBmcm9tIGEgQ1NWIGZpbGUpLFxuICAgKiAvLyBwYXNzaW5nIGFuIGBBc3luY0l0ZXJhYmxlYCBpcyBhZHZpc2FibGUgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LlxuICAgKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnU3RldmUnLCAnbGFzdF9uYW1lJzogJ0pvYnMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzAyLTI0LTE5NTUnKSB9LFxuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnQmlsbCcsICdsYXN0X25hbWUnOiAnR2F0ZXMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzEwLTI4LTE5NTUnKSB9XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGJ1bGtMb2FkIEEgcHJldmlvdXNseSBjcmVhdGVkIFtbQnVsa0xvYWRdXS5cbiAgICogQHBhcmFtIHJvd3MgQSBbW0l0ZXJhYmxlXV0gb3IgW1tBc3luY0l0ZXJhYmxlXV0gdGhhdCBjb250YWlucyB0aGUgcm93cyB0aGF0IHNob3VsZCBiZSBidWxrIGxvYWRlZC5cbiAgICovXG4gIGV4ZWNCdWxrTG9hZChidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pOiB2b2lkXG5cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93cz86IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pIHtcbiAgICBidWxrTG9hZC5leGVjdXRpb25TdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmIChyb3dzKSB7XG4gICAgICBpZiAoYnVsa0xvYWQuc3RyZWFtaW5nTW9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgd2FzIHB1dCBpbiBzdHJlYW1pbmcgbW9kZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWxrTG9hZC5maXJzdFJvd1dyaXR0ZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbi5leGVjQnVsa0xvYWQgY2FuJ3QgYmUgY2FsbGVkIHdpdGggYSBCdWxrTG9hZCB0aGF0IGFscmVhZHkgaGFzIHJvd3Mgd3JpdHRlbiB0byBpdC5cIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd1N0cmVhbSA9IFJlYWRhYmxlLmZyb20ocm93cyk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHBhY2tldCB0cmFuc2Zvcm0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcm93IHN0cmVhbSxcbiAgICAgIC8vIGUuZy4gaWYgYW4gZXJyb3IgaXMgdGhyb3duIGZyb20gd2l0aGluIGEgZ2VuZXJhdG9yIG9yIHN0cmVhbS5cbiAgICAgIHJvd1N0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmRlc3Ryb3koZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZXN0cm95IHRoZSByb3cgc3RyZWFtIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gdGhlIHBhY2tldCB0cmFuc2Zvcm0sXG4gICAgICAvLyBlLmcuIGlmIHRoZSBidWxrIGxvYWQgaXMgY2FuY2VsbGVkLlxuICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByb3dTdHJlYW0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHJvd1N0cmVhbS5waXBlKGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtKTtcbiAgICB9IGVsc2UgaWYgKCFidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgYnVsa2xvYWQgd2FzIG5vdCBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSBieSB0aGUgdXNlcixcbiAgICAgIC8vIHdlIGVuZCB0aGUgcm93VG9QYWNrZXRUcmFuc2Zvcm0gaGVyZSBmb3IgdGhlbS5cbiAgICAgIC8vXG4gICAgICAvLyBJZiBpdCB3YXMgcHV0IGludG8gc3RyZWFtaW5nIG1vZGUsIGl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eVxuICAgICAgLy8gdG8gZW5kIHRoZSBzdHJlYW0uXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5lbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgQnVsa0xvYWRQYXlsb2FkKGJ1bGtMb2FkKTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChidWxrTG9hZC5nZXRCdWxrSW5zZXJ0U3FsKCksIChlcnJvcjogKEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0pIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgYnVsa0xvYWQucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnVU5LTk9XTicpIHtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICs9ICcgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB0aGUgc2NoZW1hIG9mIHRoZSBCdWxrTG9hZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2NoZW1hIG9mIHRoZSB0YWJsZSB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGludG8uJztcbiAgICAgICAgfVxuICAgICAgICBidWxrTG9hZC5lcnJvciA9IGVycm9yO1xuICAgICAgICBidWxrTG9hZC5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYWtlUmVxdWVzdChidWxrTG9hZCwgVFlQRS5CVUxLX0xPQUQsIHBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgYnVsa0xvYWQub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgdGhpcy5leGVjU3FsQmF0Y2gocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSB0aGUgU1FMIHJlcHJlc2VudGVkIGJ5IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgcmVxdWVzdCBjYW4gdGhlbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG9cbiAgICogW1tleGVjdXRlXV0gYW5kIFtbdW5wcmVwYXJlXV1cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS4gUGFyYW1ldGVyIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHByZXBhcmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgdmFsdWU6IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGggPyByZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSA6IG51bGwsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdzdG10JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5wcmVwYXJpbmcgPSB0cnVlO1xuXG4gICAgLy8gVE9ETzogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGlzIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGlzIGxlYWtzIG1lbW9yeVxuICAgIHJlcXVlc3Qub24oJ3JldHVyblZhbHVlJywgKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKG5hbWUgPT09ICdoYW5kbGUnKSB7XG4gICAgICAgIHJlcXVlc3QuaGFuZGxlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihgVGVkaW91cyA+IFVuZXhwZWN0ZWQgb3V0cHV0IHBhcmFtZXRlciAke25hbWV9IGZyb20gc3BfcHJlcGFyZWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoUHJvY2VkdXJlcy5TcF9QcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIFNRTCBTZXJ2ZXIgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXZpb3VzbHkgcHJlcGFyZWQgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS5cbiAgICogICBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgdW5wcmVwYXJlKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLkludCxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgLy8gVE9ETzogQWJvcnQgaWYgYHJlcXVlc3QuaGFuZGxlYCBpcyBub3Qgc2V0XG4gICAgICB2YWx1ZTogcmVxdWVzdC5oYW5kbGUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfVW5wcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcHJldmlvdXNseSBwcmVwYXJlZCBTUUwsIHVzaW5nIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIHByZXZpb3VzbHkgcHJlcGFyZWQgW1tSZXF1ZXN0XV0uXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzICBBbiBvYmplY3Qgd2hvc2UgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgb2ZcbiAgICogICBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgW1tSZXF1ZXN0XV0gYmVmb3JlIGl0IHdhcyBwcmVwYXJlZC5cbiAgICogICBUaGUgb2JqZWN0J3MgdmFsdWVzIGFyZSBwYXNzZWQgYXMgdGhlIHBhcmFtZXRlcnMnIHZhbHVlcyB3aGVuIHRoZVxuICAgKiAgIHJlcXVlc3QgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBleGVjdXRlKHJlcXVlc3Q6IFJlcXVlc3QsIHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGNvbnN0IGV4ZWN1dGVQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIC8vIFRPRE86IEFib3J0IGlmIGByZXF1ZXN0LmhhbmRsZWAgaXMgbm90IHNldFxuICAgICAgdmFsdWU6IHJlcXVlc3QuaGFuZGxlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnNbaV07XG5cbiAgICAgICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgICAgLi4ucGFyYW1ldGVyLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbWV0ZXIudHlwZS52YWxpZGF0ZShwYXJhbWV0ZXJzID8gcGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0gOiBudWxsLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfRXhlY3V0ZSwgZXhlY3V0ZVBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHN0b3JlZCBwcm9jZWR1cmUgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGNhbGxQcm9jZWR1cmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgcmVxdWVzdC5wYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4gUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgXG4gICAqICAgaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIGlzb2xhdGlvbkxldmVsIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIGJlZ2luVHJhbnNhY3Rpb24oY2FsbGJhY2s6IEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnLCBpc29sYXRpb25MZXZlbCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsLCAnaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUsIGlzb2xhdGlvbkxldmVsKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMICcgKyAodHJhbnNhY3Rpb24uaXNvbGF0aW9uTGV2ZWxUb1RTUUwoKSkgKyAnO0JFR0lOIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uYmVnaW5QYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYGlzIHByZXNlbnQuXG4gICAqL1xuICBjb21taXRUcmFuc2FjdGlvbihjYWxsYmFjazogQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ0NPTU1JVCBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5jb21taXRQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHJvbGxiYWNrVHJhbnNhY3Rpb24oY2FsbGJhY2s6IFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1JPTExCQUNLIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5yb2xsYmFja1BheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzYXZlcG9pbnQgd2l0aGluIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXFxcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHNhdmVUcmFuc2FjdGlvbihjYWxsYmFjazogU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTQVZFIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLnNhdmVQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBnaXZlbiBjYWxsYmFjayBhZnRlciBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCBhbmQgY29tbWl0IG9yXG4gICAqIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIHRoYXQgZW1wbG95cyBbW2JlZ2luVHJhbnNhY3Rpb25dXSwgW1tjb21taXRUcmFuc2FjdGlvbl1dLFxuICAgKiBbW3JvbGxiYWNrVHJhbnNhY3Rpb25dXSwgYW5kIFtbc2F2ZVRyYW5zYWN0aW9uXV0gdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGVcbiAgICogdXNlIG9mIGRhdGFiYXNlIHRyYW5zYWN0aW9ucyBhbmQgYXV0b21hdGljYWxseSBoYW5kbGUgdHJhbnNhY3Rpb24gbmVzdGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNiXG4gICAqIEBwYXJhbSBpc29sYXRpb25MZXZlbFxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIHRyYW5zYWN0aW9uKGNiOiAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIHR4RG9uZT86IDxUIGV4dGVuZHMgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2s+KGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBkb25lOiBULCAuLi5hcmdzOiBDYWxsYmFja1BhcmFtZXRlcnM8VD4pID0+IHZvaWQpID0+IHZvaWQsIGlzb2xhdGlvbkxldmVsPzogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BjYmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlU2F2ZXBvaW50ID0gdGhpcy5pblRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5hbWUgPSAnX3RlZGlvdXNfJyArIChjcnlwdG8ucmFuZG9tQnl0ZXMoMTApLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgdHhEb25lOiA8VCBleHRlbmRzIFRyYW5zYWN0aW9uRG9uZUNhbGxiYWNrPihlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkID0gKGVyciwgZG9uZSwgLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhpcy5pblRyYW5zYWN0aW9uICYmIHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuTE9HR0VEX0lOKSB7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCh0eEVycikgPT4ge1xuICAgICAgICAgICAgZG9uZSh0eEVyciB8fCBlcnIsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0sIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUoZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1c2VTYXZlcG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgZG9uZShudWxsLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tbWl0VHJhbnNhY3Rpb24oKHR4RXJyKSA9PiB7XG4gICAgICAgICAgZG9uZSh0eEVyciwgLi4uYXJncyk7XG4gICAgICAgIH0sIG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodXNlU2F2ZXBvaW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zYXZlVHJhbnNhY3Rpb24oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NFVCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJyArIHRoaXMuZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGVyciwgdHhEb25lKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5iZWdpblRyYW5zYWN0aW9uKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICB9LCBuYW1lLCBpc29sYXRpb25MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWtlUmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQsIHBhY2tldFR5cGU6IG51bWJlciwgcGF5bG9hZDogKEl0ZXJhYmxlPEJ1ZmZlcj4gfCBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pICYgeyB0b1N0cmluZzogKGluZGVudD86IHN0cmluZykgPT4gc3RyaW5nIH0pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5MT0dHRURfSU4pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnUmVxdWVzdHMgY2FuIG9ubHkgYmUgbWFkZSBpbiB0aGUgJyArIHRoaXMuU1RBVEUuTE9HR0VEX0lOLm5hbWUgKyAnIHN0YXRlLCBub3QgdGhlICcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnIHN0YXRlJztcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgcmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFSU5WQUxJRFNUQVRFJykpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhY2tldFR5cGUgPT09IFRZUEUuU1FMX0JBVENIKSB7XG4gICAgICAgIHRoaXMuaXNTcWxCYXRjaCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QuY29ubmVjdGlvbiEgPSB0aGlzO1xuICAgICAgcmVxdWVzdC5yb3dDb3VudCEgPSAwO1xuICAgICAgcmVxdWVzdC5yb3dzISA9IFtdO1xuICAgICAgcmVxdWVzdC5yc3QhID0gW107XG5cbiAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBwYXlsb2FkU3RyZWFtLnVucGlwZShtZXNzYWdlKTtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS5kZXN0cm95KG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaWdub3JlIGJpdCBhbmQgZW5kIHRoZSBtZXNzYWdlLlxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICByZXF1ZXN0LnJlc3VtZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgdGhpcy5jcmVhdGVSZXF1ZXN0VGltZXIoKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogcGFja2V0VHlwZSwgcmVzZXRDb25uZWN0aW9uOiB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQ0xJRU5UX1JFUVVFU1QpO1xuXG4gICAgICBtZXNzYWdlLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHBheWxvYWQhLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYXlsb2FkU3RyZWFtID0gUmVhZGFibGUuZnJvbShwYXlsb2FkKTtcbiAgICAgIHBheWxvYWRTdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gT25seSBzZXQgYSByZXF1ZXN0IGVycm9yIGlmIG5vIGVycm9yIHdhcyBzZXQgeWV0LlxuICAgICAgICByZXF1ZXN0LmVycm9yID8/PSBlcnJvcjtcblxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHBheWxvYWRTdHJlYW0ucGlwZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGN1cnJlbnRseSBleGVjdXRlZCByZXF1ZXN0LlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdC5jYW5jZWwoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29ubmVjdGlvbiB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICogQ2FuIGJlIHVzZWZ1bCBmb3IgY29ubmVjdGlvbiBwb29sIGltcGxlbWVudGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZXNldChjYWxsYmFjazogUmVzZXRDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLmdldEluaXRpYWxTcWwoKSwgKGVycikgPT4ge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhlY1NxbEJhdGNoKHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnNbdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJc29sYXRpb25MZXZlbFRleHQoaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF0pIHtcbiAgICBzd2l0Y2ggKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX1VOQ09NTUlUVEVEOlxuICAgICAgICByZXR1cm4gJ3JlYWQgdW5jb21taXR0ZWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVQRUFUQUJMRV9SRUFEOlxuICAgICAgICByZXR1cm4gJ3JlcGVhdGFibGUgcmVhZCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TRVJJQUxJWkFCTEU6XG4gICAgICAgIHJldHVybiAnc2VyaWFsaXphYmxlJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gJ3NuYXBzaG90JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncmVhZCBjb21taXR0ZWQnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RyYW5zaWVudEVycm9yKGVycm9yOiBBZ2dyZWdhdGVFcnJvciB8IENvbm5lY3Rpb25FcnJvcik6IGJvb2xlYW4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgIGVycm9yID0gZXJyb3IuZXJyb3JzWzBdO1xuICB9XG4gIHJldHVybiAoZXJyb3IgaW5zdGFuY2VvZiBDb25uZWN0aW9uRXJyb3IpICYmICEhZXJyb3IuaXNUcmFuc2llbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbm5lY3Rpb247XG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Rpb247XG5cbkNvbm5lY3Rpb24ucHJvdG90eXBlLlNUQVRFID0ge1xuICBJTklUSUFMSVpFRDoge1xuICAgIG5hbWU6ICdJbml0aWFsaXplZCcsXG4gICAgZXZlbnRzOiB7fVxuICB9LFxuICBDT05ORUNUSU5HOiB7XG4gICAgbmFtZTogJ0Nvbm5lY3RpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzZUNvbm5lY3Rpb24oKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9QUkVMT0dJTjoge1xuICAgIG5hbWU6ICdTZW50UHJlbG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgbWVzc2FnZSkge1xuICAgICAgICAgIG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFttZXNzYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVsb2dpblBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKG1lc3NhZ2VCdWZmZXIpO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWxvZ2luUGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdPTicgfHwgcHJlbG9naW5QYXlsb2FkLmVuY3J5cHRpb25TdHJpbmcgPT09ICdSRVEnKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoXCJTZXJ2ZXIgcmVxdWlyZXMgZW5jcnlwdGlvbiwgc2V0ICdlbmNyeXB0JyBjb25maWcgb3B0aW9uIHRvIHRydWUuXCIsICdFRU5DUllQVCcpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9UTFNTU0xORUdPVElBVElPTik7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1lc3NhZ2VJby5zdGFydFRscyh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zLCB0aGlzLnJvdXRpbmdEYXRhPy5zZXJ2ZXIgPz8gdGhpcy5jb25maWcuc2VydmVyLCB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc2VuZExvZ2luN1BhY2tldCgpO1xuXG4gICAgICAgIGNvbnN0IHsgYXV0aGVudGljYXRpb24gfSA9IHRoaXMuY29uZmlnO1xuXG4gICAgICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb24udHlwZSkge1xuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJzpcbiAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCc6XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfRkVEQVVUSCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdudGxtJzpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9OVExNKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFJFUk9VVElORzoge1xuICAgIG5hbWU6ICdSZVJvdXRpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuY2xlYW51cENvbm5lY3Rpb24oQ0xFQU5VUF9UWVBFLlJFRElSRUNUKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIHJlY29ubmVjdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWToge1xuICAgIG5hbWU6ICdUUkFOU0lFTlRfRkFJTFVSRV9SRVRSWScsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50Kys7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5SRVRSWSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIG1lc3NhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgfSxcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICByZXRyeTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlUmV0cnlUaW1lcigpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9UTFNTU0xORUdPVElBVElPTjoge1xuICAgIG5hbWU6ICdTZW50VExTU1NMTmVnb3RpYXRpb24nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTjoge1xuICAgIG5hbWU6ICdTZW50TG9naW43V2l0aFN0YW5kYXJkTG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IExvZ2luN1Rva2VuSGFuZGxlcih0aGlzKTtcbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIGhhbmRsZXIpO1xuXG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgaWYgKGlzVHJhbnNpZW50RXJyb3IodGhpcy5sb2dpbkVycm9yKSkge1xuICAgICAgICAgICAgdGhpcy5kZWJ1Zy5sb2coJ0luaXRpYXRpbmcgcmV0cnkgb24gdHJhbnNpZW50IGVycm9yJyk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9OVExNOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoTlRMTUxvZ2luJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gbmV3IExvZ2luN1Rva2VuSGFuZGxlcih0aGlzKTtcbiAgICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG5cbiAgICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgICBpZiAoaGFuZGxlci5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLnJvdXRpbmdEYXRhID0gaGFuZGxlci5yb3V0aW5nRGF0YTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubnRsbXBhY2tldCkge1xuICAgICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBOdGxtQXV0aGVudGljYXRpb247XG5cbiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTlRMTVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICAgICAgICAgIGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4sXG4gICAgICAgICAgICAgIHVzZXJOYW1lOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICBwYXNzd29yZDogYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgICAgbnRsbXBhY2tldDogdGhpcy5udGxtcGFja2V0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSW8uc2VuZE1lc3NhZ2UoVFlQRS5OVExNQVVUSF9QS1QsIHBheWxvYWQuZGF0YSk7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubnRsbXBhY2tldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgICAgaWYgKGlzVHJhbnNpZW50RXJyb3IodGhpcy5sb2dpbkVycm9yKSkge1xuICAgICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgdGhpcy5sb2dpbkVycm9yKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKCdMb2dpbiBmYWlsZWQuJywgJ0VMT0dJTicpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoZmVkYXV0aCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcbiAgICAgICAgaWYgKGhhbmRsZXIubG9naW5BY2tSZWNlaXZlZCkge1xuICAgICAgICAgIGlmIChoYW5kbGVyLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnJvdXRpbmdEYXRhID0gaGFuZGxlci5yb3V0aW5nRGF0YTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuUkVST1VUSU5HKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmVkQXV0aEluZm9Ub2tlbiA9IGhhbmRsZXIuZmVkQXV0aEluZm9Ub2tlbjtcblxuICAgICAgICBpZiAoZmVkQXV0aEluZm9Ub2tlbiAmJiBmZWRBdXRoSW5mb1Rva2VuLnN0c3VybCAmJiBmZWRBdXRoSW5mb1Rva2VuLnNwbikge1xuICAgICAgICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uID0gdGhpcy5jb25maWcuYXV0aGVudGljYXRpb24gYXMgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHwgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lBcHBTZXJ2aWNlQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVNlcnZpY2VQcmluY2lwYWxTZWNyZXQgfCBBenVyZUFjdGl2ZURpcmVjdG9yeURlZmF1bHRBdXRoZW50aWNhdGlvbjtcbiAgICAgICAgICBjb25zdCB0b2tlblNjb3BlID0gbmV3IFVSTCgnLy5kZWZhdWx0JywgZmVkQXV0aEluZm9Ub2tlbi5zcG4pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICBsZXQgY3JlZGVudGlhbHM7XG5cbiAgICAgICAgICBzd2l0Y2ggKGF1dGhlbnRpY2F0aW9uLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnOlxuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbChcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnRlbmFudElkID8/ICdjb21tb24nLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nOlxuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgICAgICAgICBjb25zdCBtc2lBcmdzID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCA/IFthdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkLCB7fV0gOiBbe31dO1xuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBNYW5hZ2VkSWRlbnRpdHlDcmVkZW50aWFsKC4uLm1zaUFyZ3MpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktZGVmYXVsdCc6XG4gICAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkID8geyBtYW5hZ2VkSWRlbnRpdHlDbGllbnRJZDogYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCB9IDoge307XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IERlZmF1bHRBenVyZUNyZWRlbnRpYWwoYXJncyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICAgICAgICBjcmVkZW50aWFscyA9IG5ldyBDbGllbnRTZWNyZXRDcmVkZW50aWFsKFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWQsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudFNlY3JldFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdG9rZW5SZXNwb25zZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdG9rZW5SZXNwb25zZSA9IGF3YWl0IGNyZWRlbnRpYWxzLmdldFRva2VuKHRva2VuU2NvcGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgdGhpcy5sb2dpbkVycm9yID0gbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgICAgICAgICAgICBbbmV3IENvbm5lY3Rpb25FcnJvcignU2VjdXJpdHkgdG9rZW4gY291bGQgbm90IGJlIGF1dGhlbnRpY2F0ZWQgb3IgYXV0aG9yaXplZC4nLCAnRUZFREFVVEgnKSwgZXJyXSk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG5cbiAgICAgICAgICBjb25zdCB0b2tlbiA9IHRva2VuUmVzcG9uc2UudG9rZW47XG4gICAgICAgICAgdGhpcy5zZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICB9XG5cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIExPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMOiB7XG4gICAgbmFtZTogJ0xvZ2dlZEluU2VuZGluZ0luaXRpYWxTcWwnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VuZEluaXRpYWxTcWwoKTtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgbmV3IEluaXRpYWxTcWxUb2tlbkhhbmRsZXIodGhpcykpO1xuICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG5cbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuICAgICAgICB0aGlzLnByb2Nlc3NlZEluaXRpYWxTcWwoKTtcblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uIHNvY2tldEVycm9yKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTE9HR0VEX0lOOiB7XG4gICAgbmFtZTogJ0xvZ2dlZEluJyxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0NMSUVOVF9SRVFVRVNUOiB7XG4gICAgbmFtZTogJ1NlbnRDbGllbnRSZXF1ZXN0JyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlcXVlc3QgdGltZXIgaXMgc3RvcHBlZCBvbiBmaXJzdCBkYXRhIHBhY2thZ2VcbiAgICAgICAgdGhpcy5jbGVhclJlcXVlc3RUaW1lcigpO1xuXG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBuZXcgUmVxdWVzdFRva2VuSGFuZGxlcih0aGlzLCB0aGlzLnJlcXVlc3QhKSk7XG5cbiAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkIGFuZCB3ZSBoYXZlIGEgYGNhbmNlbFRpbWVyYFxuICAgICAgICAvLyBkZWZpbmVkLCB3ZSBzZW5kIGEgYXR0ZW50aW9uIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgIC8vIHJlcXVlc3QgbWVzc2FnZSB3YXMgZnVsbHkgc2VudCBvZmYuXG4gICAgICAgIC8vXG4gICAgICAgIC8vIFdlIGFscmVhZHkgc3RhcnRlZCBjb25zdW1pbmcgdGhlIGN1cnJlbnQgbWVzc2FnZVxuICAgICAgICAvLyAoYnV0IGFsbCB0aGUgdG9rZW4gaGFuZGxlcnMgc2hvdWxkIGJlIG5vLW9wcyksIGFuZFxuICAgICAgICAvLyBuZWVkIHRvIGVuc3VyZSB0aGUgbmV4dCBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgdGhlXG4gICAgICAgIC8vIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3Q/LmNhbmNlbGVkICYmIHRoaXMuY2FuY2VsVGltZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0FUVEVOVElPTik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvblJlc3VtZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5yZXN1bWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgb25QYXVzZSA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5wYXVzZSgpO1xuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbmNlKCdyZXN1bWUnLCBvblJlc3VtZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbigncGF1c2UnLCBvblBhdXNlKTtcblxuICAgICAgICBpZiAodGhpcy5yZXF1ZXN0IGluc3RhbmNlb2YgUmVxdWVzdCAmJiB0aGlzLnJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgb25QYXVzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb25DYW5jZWwgPSAoKSA9PiB7XG4gICAgICAgICAgdG9rZW5TdHJlYW1QYXJzZXIucmVtb3ZlTGlzdGVuZXIoJ2VuZCcsIG9uRW5kT2ZNZXNzYWdlKTtcblxuICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5wYXVzZWQpIHtcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgcmVxdWVzdCBpZiBpdCB3YXMgcGF1c2VkIHNvIHdlIGNhbiByZWFkIHRoZSByZW1haW5pbmcgdG9rZW5zXG4gICAgICAgICAgICB0aGlzLnJlcXVlc3QucmVzdW1lKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncGF1c2UnLCBvblBhdXNlKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdyZXN1bWUnLCBvblJlc3VtZSk7XG5cbiAgICAgICAgICAvLyBUaGUgYF9jYW5jZWxBZnRlclJlcXVlc3RTZW50YCBjYWxsYmFjayB3aWxsIGhhdmUgc2VudCBhXG4gICAgICAgICAgLy8gYXR0ZW50aW9uIG1lc3NhZ2UsIHNvIG5vdyB3ZSBuZWVkIHRvIGFsc28gc3dpdGNoIHRvXG4gICAgICAgICAgLy8gdGhlIGBTRU5UX0FUVEVOVElPTmAgc3RhdGUgdG8gbWFrZSBzdXJlIHRoZSBhdHRlbnRpb24gYWNrXG4gICAgICAgICAgLy8gbWVzc2FnZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LlxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9BVFRFTlRJT04pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG9uRW5kT2ZNZXNzYWdlID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOKTtcbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJyAmJiBzcWxSZXF1ZXN0LmVycm9yICYmIHRoaXMuaXNTcWxCYXRjaCkge1xuICAgICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvciwgc3FsUmVxdWVzdC5yb3dDb3VudCwgc3FsUmVxdWVzdC5yb3dzKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5vbmNlKCdlbmQnLCBvbkVuZE9mTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucmVxdWVzdD8ub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgfSkoKTtcblxuICAgIH0sXG4gICAgZXhpdDogZnVuY3Rpb24obmV4dFN0YXRlKSB7XG4gICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG5cbiAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhlcnIpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9BVFRFTlRJT046IHtcbiAgICBuYW1lOiAnU2VudEF0dGVudGlvbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgQXR0ZW50aW9uVG9rZW5IYW5kbGVyKHRoaXMsIHRoaXMucmVxdWVzdCEpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuICAgICAgICAvLyAzLjIuNS43IFNlbnQgQXR0ZW50aW9uIFN0YXRlXG4gICAgICAgIC8vIERpc2NhcmQgYW55IGRhdGEgY29udGFpbmVkIGluIHRoZSByZXNwb25zZSwgdW50aWwgd2UgcmVjZWl2ZSB0aGUgYXR0ZW50aW9uIHJlc3BvbnNlXG4gICAgICAgIGlmIChoYW5kbGVyLmF0dGVudGlvblJlY2VpdmVkKSB7XG4gICAgICAgICAgdGhpcy5jbGVhckNhbmNlbFRpbWVyKCk7XG5cbiAgICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuXG4gICAgICAgICAgaWYgKHNxbFJlcXVlc3QuZXJyb3IgJiYgc3FsUmVxdWVzdC5lcnJvciBpbnN0YW5jZW9mIFJlcXVlc3RFcnJvciAmJiBzcWxSZXF1ZXN0LmVycm9yLmNvZGUgPT09ICdFVElNRU9VVCcpIHtcbiAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soc3FsUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBldmVudHM6IHtcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgY29uc3Qgc3FsUmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcblxuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcblxuICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBGSU5BTDoge1xuICAgIG5hbWU6ICdGaW5hbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuTk9STUFMKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgY29ubmVjdFRpbWVvdXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAvLyBEbyBub3RoaW5nLCBhcyB0aGUgdGltZXIgc2hvdWxkIGJlIGNsZWFuZWQgdXAuXG4gICAgICB9LFxuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmdcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFHQTs7QUFFQTs7QUFPQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQW9HQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQSx3QkFBd0IsR0FBRyxLQUFLLElBQXRDO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEtBQUssSUFBckM7QUFDQTtBQUNBO0FBQ0E7O0FBQ0EsTUFBTUMsOEJBQThCLEdBQUcsS0FBSyxJQUE1QztBQUNBO0FBQ0E7QUFDQTs7QUFDQSxNQUFNQyxzQkFBc0IsR0FBRyxJQUFJLElBQW5DO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLDhCQUE4QixHQUFHLEdBQXZDO0FBQ0E7QUFDQTtBQUNBOztBQUNBLE1BQU1DLG1CQUFtQixHQUFHLElBQUksSUFBaEM7QUFDQTtBQUNBO0FBQ0E7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
|
|
2685
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY3J5cHRvIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfb3MiLCJ0bHMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIm5ldCIsIl9kbnMiLCJfY29uc3RhbnRzIiwiX3N0cmVhbSIsIl9pZGVudGl0eSIsIl9idWxrTG9hZCIsIl9kZWJ1ZyIsIl9ldmVudHMiLCJfaW5zdGFuY2VMb29rdXAiLCJfdHJhbnNpZW50RXJyb3JMb29rdXAiLCJfcGFja2V0IiwiX3ByZWxvZ2luUGF5bG9hZCIsIl9sb2dpbjdQYXlsb2FkIiwiX250bG1QYXlsb2FkIiwiX3JlcXVlc3QiLCJfcnBjcmVxdWVzdFBheWxvYWQiLCJfc3FsYmF0Y2hQYXlsb2FkIiwiX21lc3NhZ2VJbyIsIl90b2tlblN0cmVhbVBhcnNlciIsIl90cmFuc2FjdGlvbiIsIl9lcnJvcnMiLCJfY29ubmVjdG9yIiwiX2xpYnJhcnkiLCJfdGRzVmVyc2lvbnMiLCJfbWVzc2FnZSIsIl9udGxtIiwiX25vZGVBYm9ydENvbnRyb2xsZXIiLCJfZGF0YVR5cGUiLCJfYnVsa0xvYWRQYXlsb2FkIiwiX3NwZWNpYWxTdG9yZWRQcm9jZWR1cmUiLCJfZXNBZ2dyZWdhdGVFcnJvciIsIl9wYWNrYWdlIiwiX3VybCIsIl9oYW5kbGVyIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwibm9kZUludGVyb3AiLCJXZWFrTWFwIiwiY2FjaGVCYWJlbEludGVyb3AiLCJjYWNoZU5vZGVJbnRlcm9wIiwib2JqIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJjYWNoZSIsImhhcyIsImdldCIsIm5ld09iaiIsImhhc1Byb3BlcnR5RGVzY3JpcHRvciIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiZGVzYyIsInNldCIsIktFRVBfQUxJVkVfSU5JVElBTF9ERUxBWSIsIkRFRkFVTFRfQ09OTkVDVF9USU1FT1VUIiwiREVGQVVMVF9DTElFTlRfUkVRVUVTVF9USU1FT1VUIiwiREVGQVVMVF9DQU5DRUxfVElNRU9VVCIsIkRFRkFVTFRfQ09OTkVDVF9SRVRSWV9JTlRFUlZBTCIsIkRFRkFVTFRfUEFDS0VUX1NJWkUiLCJERUZBVUxUX1RFWFRTSVpFIiwiREVGQVVMVF9EQVRFRklSU1QiLCJERUZBVUxUX1BPUlQiLCJERUZBVUxUX1REU19WRVJTSU9OIiwiREVGQVVMVF9MQU5HVUFHRSIsIkRFRkFVTFRfREFURUZPUk1BVCIsIkNMRUFOVVBfVFlQRSIsIk5PUk1BTCIsIlJFRElSRUNUIiwiUkVUUlkiLCJDb25uZWN0aW9uIiwiRXZlbnRFbWl0dGVyIiwiZmVkQXV0aFJlcXVpcmVkIiwiY29uZmlnIiwic2VjdXJlQ29udGV4dE9wdGlvbnMiLCJpblRyYW5zYWN0aW9uIiwidHJhbnNhY3Rpb25EZXNjcmlwdG9ycyIsInRyYW5zYWN0aW9uRGVwdGgiLCJpc1NxbEJhdGNoIiwiY3VyVHJhbnNpZW50UmV0cnlDb3VudCIsInRyYW5zaWVudEVycm9yTG9va3VwIiwiY2xvc2VkIiwibG9naW5FcnJvciIsImRlYnVnIiwibnRsbXBhY2tldCIsIm50bG1wYWNrZXRCdWZmZXIiLCJyb3V0aW5nRGF0YSIsIm1lc3NhZ2VJbyIsInN0YXRlIiwicmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCIsInJlcXVlc3QiLCJwcm9jUmV0dXJuU3RhdHVzVmFsdWUiLCJzb2NrZXQiLCJtZXNzYWdlQnVmZmVyIiwiY29ubmVjdFRpbWVyIiwiY2FuY2VsVGltZXIiLCJyZXF1ZXN0VGltZXIiLCJyZXRyeVRpbWVyIiwiX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQiLCJkYXRhYmFzZUNvbGxhdGlvbiIsImNvbnN0cnVjdG9yIiwiVHlwZUVycm9yIiwic2VydmVyIiwiYXV0aGVudGljYXRpb24iLCJ1bmRlZmluZWQiLCJ0eXBlIiwib3B0aW9ucyIsImRvbWFpbiIsInVzZXJOYW1lIiwicGFzc3dvcmQiLCJ0b1VwcGVyQ2FzZSIsImNsaWVudElkIiwidGVuYW50SWQiLCJ0b2tlbiIsImNsaWVudFNlY3JldCIsImFib3J0VHJhbnNhY3Rpb25PbkVycm9yIiwiYXBwTmFtZSIsImNhbWVsQ2FzZUNvbHVtbnMiLCJjYW5jZWxUaW1lb3V0IiwiY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMIiwiY29sdW1uRW5jcnlwdGlvblNldHRpbmciLCJjb2x1bW5OYW1lUmVwbGFjZXIiLCJjb25uZWN0aW9uUmV0cnlJbnRlcnZhbCIsImNvbm5lY3RUaW1lb3V0IiwiY29ubmVjdG9yIiwiY29ubmVjdGlvbklzb2xhdGlvbkxldmVsIiwiSVNPTEFUSU9OX0xFVkVMIiwiUkVBRF9DT01NSVRURUQiLCJjcnlwdG9DcmVkZW50aWFsc0RldGFpbHMiLCJkYXRhYmFzZSIsImRhdGVmaXJzdCIsImRhdGVGb3JtYXQiLCJkYXRhIiwicGFja2V0IiwicGF5bG9hZCIsImVuYWJsZUFuc2lOdWxsIiwiZW5hYmxlQW5zaU51bGxEZWZhdWx0IiwiZW5hYmxlQW5zaVBhZGRpbmciLCJlbmFibGVBbnNpV2FybmluZ3MiLCJlbmFibGVBcml0aEFib3J0IiwiZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwiLCJlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0IiwiZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMiLCJlbmFibGVOdW1lcmljUm91bmRhYm9ydCIsImVuYWJsZVF1b3RlZElkZW50aWZpZXIiLCJlbmNyeXB0IiwiZmFsbGJhY2tUb0RlZmF1bHREYiIsImVuY3J5cHRpb25LZXlTdG9yZVByb3ZpZGVycyIsImluc3RhbmNlTmFtZSIsImlzb2xhdGlvbkxldmVsIiwibGFuZ3VhZ2UiLCJsb2NhbEFkZHJlc3MiLCJtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMiLCJtdWx0aVN1Ym5ldEZhaWxvdmVyIiwicGFja2V0U2l6ZSIsInBvcnQiLCJyZWFkT25seUludGVudCIsInJlcXVlc3RUaW1lb3V0Iiwicm93Q29sbGVjdGlvbk9uRG9uZSIsInJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uIiwic2VydmVyTmFtZSIsInNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbiIsInRkc1ZlcnNpb24iLCJ0ZXh0c2l6ZSIsInRydXN0ZWRTZXJ2ZXJOYW1lQUUiLCJ0cnVzdFNlcnZlckNlcnRpZmljYXRlIiwidXNlQ29sdW1uTmFtZXMiLCJ1c2VVVEMiLCJ3b3Jrc3RhdGlvbklkIiwibG93ZXJDYXNlR3VpZHMiLCJFcnJvciIsImFzc2VydFZhbGlkSXNvbGF0aW9uTGV2ZWwiLCJSYW5nZUVycm9yIiwic2VjdXJlT3B0aW9ucyIsImNyZWF0ZSIsInZhbHVlIiwiY29uc3RhbnRzIiwiU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUyIsImNyZWF0ZURlYnVnIiwiQnVmZmVyIiwiZnJvbSIsImFsbG9jIiwiVHJhbnNpZW50RXJyb3JMb29rdXAiLCJTVEFURSIsIklOSVRJQUxJWkVEIiwic2VuZE1lc3NhZ2UiLCJUWVBFIiwiQVRURU5USU9OIiwiY3JlYXRlQ2FuY2VsVGltZXIiLCJjb25uZWN0IiwiY29ubmVjdExpc3RlbmVyIiwiQ29ubmVjdGlvbkVycm9yIiwibmFtZSIsIm9uQ29ubmVjdCIsImVyciIsInJlbW92ZUxpc3RlbmVyIiwib25FcnJvciIsIm9uY2UiLCJ0cmFuc2l0aW9uVG8iLCJDT05ORUNUSU5HIiwib24iLCJldmVudCIsImxpc3RlbmVyIiwiZW1pdCIsImFyZ3MiLCJjbG9zZSIsIkZJTkFMIiwiaW5pdGlhbGlzZUNvbm5lY3Rpb24iLCJzaWduYWwiLCJjcmVhdGVDb25uZWN0VGltZXIiLCJjb25uZWN0T25Qb3J0IiwiaW5zdGFuY2VMb29rdXAiLCJ0aW1lb3V0IiwidGhlbiIsInByb2Nlc3MiLCJuZXh0VGljayIsImNsZWFyQ29ubmVjdFRpbWVyIiwibWVzc2FnZSIsImNsZWFudXBDb25uZWN0aW9uIiwiY2xlYW51cFR5cGUiLCJjbGVhclJlcXVlc3RUaW1lciIsImNsZWFyUmV0cnlUaW1lciIsImNsb3NlQ29ubmVjdGlvbiIsIlJlcXVlc3RFcnJvciIsImNhbGxiYWNrIiwiRGVidWciLCJjcmVhdGVUb2tlblN0cmVhbVBhcnNlciIsImhhbmRsZXIiLCJUb2tlblN0cmVhbVBhcnNlciIsInNvY2tldEhhbmRsaW5nRm9yU2VuZFByZUxvZ2luIiwiZXJyb3IiLCJzb2NrZXRFcnJvciIsInNvY2tldENsb3NlIiwic29ja2V0RW5kIiwic2V0S2VlcEFsaXZlIiwiTWVzc2FnZUlPIiwiY2xlYXJ0ZXh0IiwibG9nIiwic2VuZFByZUxvZ2luIiwiU0VOVF9QUkVMT0dJTiIsIndyYXBXaXRoVGxzIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJzZWN1cmVDb250ZXh0IiwiY3JlYXRlU2VjdXJlQ29udGV4dCIsImlzSVAiLCJlbmNyeXB0T3B0aW9ucyIsImhvc3QiLCJBTFBOUHJvdG9jb2xzIiwic2VydmVybmFtZSIsImVuY3J5cHRzb2NrZXQiLCJjdXN0b21Db25uZWN0b3IiLCJjb25uZWN0T3B0cyIsImNvbm5lY3RJblBhcmFsbGVsIiwiY29ubmVjdEluU2VxdWVuY2UiLCJkbnMiLCJsb29rdXAiLCJlbmQiLCJjYXRjaCIsImRlc3Ryb3kiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwic2V0VGltZW91dCIsImFib3J0IiwiY2xlYXJDYW5jZWxUaW1lciIsImNyZWF0ZVJlcXVlc3RUaW1lciIsImNyZWF0ZVJldHJ5VGltZXIiLCJyZXRyeVRpbWVvdXQiLCJob3N0UG9zdGZpeCIsInJvdXRpbmdNZXNzYWdlIiwiZGlzcGF0Y2hFdmVudCIsImNhbmNlbCIsImNsZWFyVGltZW91dCIsIm5ld1N0YXRlIiwiZXhpdCIsImVudGVyIiwiYXBwbHkiLCJnZXRFdmVudEhhbmRsZXIiLCJldmVudE5hbWUiLCJldmVudHMiLCJTRU5UX1RMU1NTTE5FR09USUFUSU9OIiwiY29kZSIsIlJFUk9VVElORyIsIlRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZIiwibWFqb3IiLCJtaW5vciIsImJ1aWxkIiwiZXhlYyIsInZlcnNpb24iLCJQcmVsb2dpblBheWxvYWQiLCJOdW1iZXIiLCJzdWJidWlsZCIsIlBSRUxPR0lOIiwidG9TdHJpbmciLCJzZW5kTG9naW43UGFja2V0IiwiTG9naW43UGF5bG9hZCIsInZlcnNpb25zIiwiY2xpZW50UHJvZ1ZlciIsImNsaWVudFBpZCIsInBpZCIsImNvbm5lY3Rpb25JZCIsImNsaWVudFRpbWVab25lIiwiRGF0ZSIsImdldFRpbWV6b25lT2Zmc2V0IiwiY2xpZW50TGNpZCIsImZlZEF1dGgiLCJlY2hvIiwid29ya2Zsb3ciLCJmZWRBdXRoVG9rZW4iLCJzc3BpIiwiY3JlYXRlTlRMTVJlcXVlc3QiLCJob3N0bmFtZSIsIm9zIiwibGlicmFyeU5hbWUiLCJpbml0RGJGYXRhbCIsIkxPR0lONyIsInRvQnVmZmVyIiwic2VuZEZlZEF1dGhUb2tlbk1lc3NhZ2UiLCJhY2Nlc3NUb2tlbkxlbiIsImJ5dGVMZW5ndGgiLCJvZmZzZXQiLCJ3cml0ZVVJbnQzMkxFIiwid3JpdGUiLCJGRURBVVRIX1RPS0VOIiwiU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTiIsInNlbmRJbml0aWFsU3FsIiwiU3FsQmF0Y2hQYXlsb2FkIiwiZ2V0SW5pdGlhbFNxbCIsImN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IiLCJNZXNzYWdlIiwiU1FMX0JBVENIIiwib3V0Z29pbmdNZXNzYWdlU3RyZWFtIiwiUmVhZGFibGUiLCJwaXBlIiwicHVzaCIsImdldElzb2xhdGlvbkxldmVsVGV4dCIsImpvaW4iLCJwcm9jZXNzZWRJbml0aWFsU3FsIiwiZXhlY1NxbEJhdGNoIiwibWFrZVJlcXVlc3QiLCJzcWxUZXh0T3JQcm9jZWR1cmUiLCJleGVjU3FsIiwidmFsaWRhdGVQYXJhbWV0ZXJzIiwicGFyYW1ldGVycyIsIlRZUEVTIiwiTlZhckNoYXIiLCJvdXRwdXQiLCJsZW5ndGgiLCJwcmVjaXNpb24iLCJzY2FsZSIsIm1ha2VQYXJhbXNQYXJhbWV0ZXIiLCJSUENfUkVRVUVTVCIsIlJwY1JlcXVlc3RQYXlsb2FkIiwiUHJvY2VkdXJlcyIsIlNwX0V4ZWN1dGVTcWwiLCJuZXdCdWxrTG9hZCIsInRhYmxlIiwiY2FsbGJhY2tPck9wdGlvbnMiLCJCdWxrTG9hZCIsImV4ZWNCdWxrTG9hZCIsImJ1bGtMb2FkIiwicm93cyIsImV4ZWN1dGlvblN0YXJ0ZWQiLCJzdHJlYW1pbmdNb2RlIiwiZmlyc3RSb3dXcml0dGVuIiwicm93U3RyZWFtIiwicm93VG9QYWNrZXRUcmFuc2Zvcm0iLCJvbkNhbmNlbCIsIkJ1bGtMb2FkUGF5bG9hZCIsIlJlcXVlc3QiLCJnZXRCdWxrSW5zZXJ0U3FsIiwiQlVMS19MT0FEIiwicHJlcGFyZSIsIkludCIsInByZXBhcmluZyIsImhhbmRsZSIsIlNwX1ByZXBhcmUiLCJ1bnByZXBhcmUiLCJTcF9VbnByZXBhcmUiLCJleGVjdXRlIiwiZXhlY3V0ZVBhcmFtZXRlcnMiLCJpIiwibGVuIiwicGFyYW1ldGVyIiwidmFsaWRhdGUiLCJTcF9FeGVjdXRlIiwiY2FsbFByb2NlZHVyZSIsImJlZ2luVHJhbnNhY3Rpb24iLCJ0cmFuc2FjdGlvbiIsIlRyYW5zYWN0aW9uIiwiaXNvbGF0aW9uTGV2ZWxUb1RTUUwiLCJUUkFOU0FDVElPTl9NQU5BR0VSIiwiYmVnaW5QYXlsb2FkIiwiY29tbWl0VHJhbnNhY3Rpb24iLCJjb21taXRQYXlsb2FkIiwicm9sbGJhY2tUcmFuc2FjdGlvbiIsInJvbGxiYWNrUGF5bG9hZCIsInNhdmVUcmFuc2FjdGlvbiIsInNhdmVQYXlsb2FkIiwiY2IiLCJ1c2VTYXZlcG9pbnQiLCJjcnlwdG8iLCJyYW5kb21CeXRlcyIsInR4RG9uZSIsImRvbmUiLCJMT0dHRURfSU4iLCJ0eEVyciIsInBhY2tldFR5cGUiLCJjYW5jZWxlZCIsImNvbm5lY3Rpb24iLCJyb3dDb3VudCIsInJzdCIsInBheWxvYWRTdHJlYW0iLCJ1bnBpcGUiLCJpZ25vcmUiLCJwYXVzZWQiLCJyZXN1bWUiLCJyZXNldENvbm5lY3Rpb24iLCJTRU5UX0NMSUVOVF9SRVFVRVNUIiwicmVzZXQiLCJSRUFEX1VOQ09NTUlUVEVEIiwiUkVQRUFUQUJMRV9SRUFEIiwiU0VSSUFMSVpBQkxFIiwiU05BUFNIT1QiLCJpc1RyYW5zaWVudEVycm9yIiwiQWdncmVnYXRlRXJyb3IiLCJlcnJvcnMiLCJpc1RyYW5zaWVudCIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsIm1vZHVsZSIsInJlYWRNZXNzYWdlIiwiY29uY2F0IiwicHJlbG9naW5QYXlsb2FkIiwiZW5jcnlwdGlvblN0cmluZyIsIl90aGlzJHJvdXRpbmdEYXRhIiwic3RhcnRUbHMiLCJTRU5UX0xPR0lON19XSVRIX0ZFREFVVEgiLCJTRU5UX0xPR0lON19XSVRIX05UTE0iLCJyZWNvbm5lY3QiLCJyZXRyeSIsIkxvZ2luN1Rva2VuSGFuZGxlciIsInRva2VuU3RyZWFtUGFyc2VyIiwibG9naW5BY2tSZWNlaXZlZCIsIkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMIiwiTlRMTVJlc3BvbnNlUGF5bG9hZCIsIk5UTE1BVVRIX1BLVCIsImZlZEF1dGhJbmZvVG9rZW4iLCJzdHN1cmwiLCJzcG4iLCJ0b2tlblNjb3BlIiwiVVJMIiwiY3JlZGVudGlhbHMiLCJVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbCIsIm1zaUFyZ3MiLCJNYW5hZ2VkSWRlbnRpdHlDcmVkZW50aWFsIiwibWFuYWdlZElkZW50aXR5Q2xpZW50SWQiLCJEZWZhdWx0QXp1cmVDcmVkZW50aWFsIiwiQ2xpZW50U2VjcmV0Q3JlZGVudGlhbCIsInRva2VuUmVzcG9uc2UiLCJnZXRUb2tlbiIsIkluaXRpYWxTcWxUb2tlbkhhbmRsZXIiLCJfdGhpcyRyZXF1ZXN0IiwiX3RoaXMkcmVxdWVzdDMiLCJfdGhpcyRyZXF1ZXN0MTAiLCJSZXF1ZXN0VG9rZW5IYW5kbGVyIiwiU0VOVF9BVFRFTlRJT04iLCJvblJlc3VtZSIsIm9uUGF1c2UiLCJfdGhpcyRyZXF1ZXN0MiIsInBhdXNlIiwiX3RoaXMkcmVxdWVzdDQiLCJfdGhpcyRyZXF1ZXN0NSIsIm9uRW5kT2ZNZXNzYWdlIiwiX3RoaXMkcmVxdWVzdDYiLCJfdGhpcyRyZXF1ZXN0NyIsIl90aGlzJHJlcXVlc3Q4IiwiX3RoaXMkcmVxdWVzdDkiLCJzcWxSZXF1ZXN0IiwibmV4dFN0YXRlIiwiQXR0ZW50aW9uVG9rZW5IYW5kbGVyIiwiYXR0ZW50aW9uUmVjZWl2ZWQiXSwic291cmNlcyI6WyIuLi9zcmMvY29ubmVjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY3J5cHRvIGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgdGxzIGZyb20gJ3Rscyc7XG5pbXBvcnQgKiBhcyBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBkbnMgZnJvbSAnZG5zJztcblxuaW1wb3J0IGNvbnN0YW50cyBmcm9tICdjb25zdGFudHMnO1xuaW1wb3J0IHsgU2VjdXJlQ29udGV4dE9wdGlvbnMgfSBmcm9tICd0bHMnO1xuXG5pbXBvcnQgeyBSZWFkYWJsZSB9IGZyb20gJ3N0cmVhbSc7XG5cbmltcG9ydCB7XG4gIERlZmF1bHRBenVyZUNyZWRlbnRpYWwsXG4gIENsaWVudFNlY3JldENyZWRlbnRpYWwsXG4gIE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwsXG4gIFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsLFxufSBmcm9tICdAYXp1cmUvaWRlbnRpdHknO1xuXG5pbXBvcnQgQnVsa0xvYWQsIHsgT3B0aW9ucyBhcyBCdWxrTG9hZE9wdGlvbnMsIENhbGxiYWNrIGFzIEJ1bGtMb2FkQ2FsbGJhY2sgfSBmcm9tICcuL2J1bGstbG9hZCc7XG5pbXBvcnQgRGVidWcgZnJvbSAnLi9kZWJ1Zyc7XG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIsIG9uY2UgfSBmcm9tICdldmVudHMnO1xuaW1wb3J0IHsgaW5zdGFuY2VMb29rdXAgfSBmcm9tICcuL2luc3RhbmNlLWxvb2t1cCc7XG5pbXBvcnQgeyBUcmFuc2llbnRFcnJvckxvb2t1cCB9IGZyb20gJy4vdHJhbnNpZW50LWVycm9yLWxvb2t1cCc7XG5pbXBvcnQgeyBUWVBFIH0gZnJvbSAnLi9wYWNrZXQnO1xuaW1wb3J0IFByZWxvZ2luUGF5bG9hZCBmcm9tICcuL3ByZWxvZ2luLXBheWxvYWQnO1xuaW1wb3J0IExvZ2luN1BheWxvYWQgZnJvbSAnLi9sb2dpbjctcGF5bG9hZCc7XG5pbXBvcnQgTlRMTVJlc3BvbnNlUGF5bG9hZCBmcm9tICcuL250bG0tcGF5bG9hZCc7XG5pbXBvcnQgUmVxdWVzdCBmcm9tICcuL3JlcXVlc3QnO1xuaW1wb3J0IFJwY1JlcXVlc3RQYXlsb2FkIGZyb20gJy4vcnBjcmVxdWVzdC1wYXlsb2FkJztcbmltcG9ydCBTcWxCYXRjaFBheWxvYWQgZnJvbSAnLi9zcWxiYXRjaC1wYXlsb2FkJztcbmltcG9ydCBNZXNzYWdlSU8gZnJvbSAnLi9tZXNzYWdlLWlvJztcbmltcG9ydCB7IFBhcnNlciBhcyBUb2tlblN0cmVhbVBhcnNlciB9IGZyb20gJy4vdG9rZW4vdG9rZW4tc3RyZWFtLXBhcnNlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiwgSVNPTEFUSU9OX0xFVkVMLCBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBDb25uZWN0aW9uRXJyb3IsIFJlcXVlc3RFcnJvciB9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7IGNvbm5lY3RJblBhcmFsbGVsLCBjb25uZWN0SW5TZXF1ZW5jZSB9IGZyb20gJy4vY29ubmVjdG9yJztcbmltcG9ydCB7IG5hbWUgYXMgbGlicmFyeU5hbWUgfSBmcm9tICcuL2xpYnJhcnknO1xuaW1wb3J0IHsgdmVyc2lvbnMgfSBmcm9tICcuL3Rkcy12ZXJzaW9ucyc7XG5pbXBvcnQgTWVzc2FnZSBmcm9tICcuL21lc3NhZ2UnO1xuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tICcuL21ldGFkYXRhLXBhcnNlcic7XG5pbXBvcnQgeyBjcmVhdGVOVExNUmVxdWVzdCB9IGZyb20gJy4vbnRsbSc7XG5pbXBvcnQgeyBDb2x1bW5FbmNyeXB0aW9uQXp1cmVLZXlWYXVsdFByb3ZpZGVyIH0gZnJvbSAnLi9hbHdheXMtZW5jcnlwdGVkL2tleXN0b3JlLXByb3ZpZGVyLWF6dXJlLWtleS12YXVsdCc7XG5cbmltcG9ydCB7IEFib3J0Q29udHJvbGxlciwgQWJvcnRTaWduYWwgfSBmcm9tICdub2RlLWFib3J0LWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgUGFyYW1ldGVyLCBUWVBFUyB9IGZyb20gJy4vZGF0YS10eXBlJztcbmltcG9ydCB7IEJ1bGtMb2FkUGF5bG9hZCB9IGZyb20gJy4vYnVsay1sb2FkLXBheWxvYWQnO1xuaW1wb3J0IHsgQ29sbGF0aW9uIH0gZnJvbSAnLi9jb2xsYXRpb24nO1xuaW1wb3J0IFByb2NlZHVyZXMgZnJvbSAnLi9zcGVjaWFsLXN0b3JlZC1wcm9jZWR1cmUnO1xuXG5pbXBvcnQgQWdncmVnYXRlRXJyb3IgZnJvbSAnZXMtYWdncmVnYXRlLWVycm9yJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi9wYWNrYWdlLmpzb24nO1xuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IEF0dGVudGlvblRva2VuSGFuZGxlciwgSW5pdGlhbFNxbFRva2VuSGFuZGxlciwgTG9naW43VG9rZW5IYW5kbGVyLCBSZXF1ZXN0VG9rZW5IYW5kbGVyLCBUb2tlbkhhbmRsZXIgfSBmcm9tICcuL3Rva2VuL2hhbmRsZXInO1xuXG50eXBlIEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgdGhlIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbkRlc2NyaXB0b3IgQSBCdWZmZXIgdGhhdCBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgdHJhbnNhY3Rpb25EZXNjcmlwdG9yPzogQnVmZmVyKSA9PiB2b2lkXG5cbnR5cGUgU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHRvIHNldCBhIHNhdmVwb2ludCB3aXRoaW4gdGhlXG4gICAqIHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZXJyIElmIGFuIGVycm9yIG9jY3VycmVkLCBhbiBbW0Vycm9yXV0gb2JqZWN0IHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQpID0+IHZvaWQ7XG5cbnR5cGUgQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gY29tbWl0IHRoZSB0cmFuc2FjdGlvbiBoYXMgY29tcGxldGVkLFxuICAgKiBlaXRoZXIgc3VjY2Vzc2Z1bGx5IG9yIHdpdGggYW4gZXJyb3IuXG4gICAqIElmIGFuIGVycm9yIG9jY3VycmVkIHRoZW4gYGVycmAgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjayA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uIGhhc1xuICAgKiBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBlcnIgd2lsbCBkZXNjcmliZSB0aGUgZXJyb3IuXG4gICAqXG4gICAqIEFzIG9ubHkgb25lIHJlcXVlc3QgYXQgYSB0aW1lIG1heSBiZSBleGVjdXRlZCBvbiBhIGNvbm5lY3Rpb24sIGFub3RoZXIgcmVxdWVzdCBzaG91bGQgbm90XG4gICAqIGJlIGluaXRpYXRlZCB1bnRpbCB0aGlzIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkKSA9PiB2b2lkO1xuXG50eXBlIFJlc2V0Q2FsbGJhY2sgPVxuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHJlc2V0IGhhcyBjb21wbGV0ZWQsXG4gICAqIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICpcbiAgICogSWYgYW4gZXJyb3Igb2NjdXJyZWQgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlclxuICAgKiByZXF1ZXN0IHNob3VsZCBub3QgYmUgaW5pdGlhdGVkIHVudGlsIHRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkXG4gICAqXG4gICAqIEBwYXJhbSBlcnIgSWYgYW4gZXJyb3Igb2NjdXJyZWQsIGFuIFtbRXJyb3JdXSBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBlcnJvci5cbiAgICovXG4gIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xudHlwZSBUcmFuc2FjdGlvbkNhbGxiYWNrPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3QgdG8gc3RhcnQgYSB0cmFuc2FjdGlvbiAob3IgY3JlYXRlIGEgc2F2ZXBvaW50LCBpblxuICAgKiB0aGUgY2FzZSBvZiBhIG5lc3RlZCB0cmFuc2FjdGlvbikgaGFzIGNvbXBsZXRlZCwgZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGFuIGVycm9yLlxuICAgKiBJZiBhbiBlcnJvciBvY2N1cnJlZCwgdGhlbiBgZXJyYCB3aWxsIGRlc2NyaWJlIHRoZSBlcnJvci5cbiAgICogSWYgbm8gZXJyb3Igb2NjdXJyZWQsIHRoZSBjYWxsYmFjayBzaG91bGQgcGVyZm9ybSBpdHMgd29yayBhbmQgZXZlbnR1YWxseSBjYWxsXG4gICAqIGBkb25lYCB3aXRoIGFuIGVycm9yIG9yIG51bGwgKHRvIHRyaWdnZXIgYSB0cmFuc2FjdGlvbiByb2xsYmFjayBvciBhXG4gICAqIHRyYW5zYWN0aW9uIGNvbW1pdCkgYW5kIGFuIGFkZGl0aW9uYWwgY29tcGxldGlvbiBjYWxsYmFjayB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHJlcXVlc3RcbiAgICogdG8gcm9sbGJhY2sgb3IgY29tbWl0IHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhcyBjb21wbGV0ZWQsIGVpdGhlciBzdWNjZXNzZnVsbHkgb3Igd2l0aCBhbiBlcnJvci5cbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgZ2l2ZW4gdG8gYGRvbmVgIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhpcyBjYWxsYmFjay5cbiAgICpcbiAgICogQXMgb25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbiwgYW5vdGhlciByZXF1ZXN0IHNob3VsZCBub3RcbiAgICogYmUgaW5pdGlhdGVkIHVudGlsIHRoZSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnJvciBvY2N1cnJlZCwgYW4gW1tFcnJvcl1dIG9iamVjdCB3aXRoIGRldGFpbHMgb2YgdGhlIGVycm9yLlxuICAgKiBAcGFyYW0gdHhEb25lIElmIG5vIGVycm9yIG9jY3VycmVkLCBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB0byBjb21taXQgb3Igcm9sbGJhY2sgdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCB0eERvbmU/OiBUcmFuc2FjdGlvbkRvbmU8VD4pID0+IHZvaWQ7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2sgPSAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkO1xudHlwZSBDYWxsYmFja1BhcmFtZXRlcnM8VCBleHRlbmRzIChlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pID0+IGFueT4gPSBUIGV4dGVuZHMgKGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBpbmZlciBQKSA9PiBhbnkgPyBQIDogbmV2ZXI7XG5cbnR5cGUgVHJhbnNhY3Rpb25Eb25lPFQgZXh0ZW5kcyAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkPiA9XG4gIC8qKlxuICAgKiBJZiBubyBlcnJvciBvY2N1cnJlZCwgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgdG8gY29tbWl0IG9yIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGVyciBJZiBhbiBlcnIgb2NjdXJyZWQsIGEgc3RyaW5nIHdpdGggZGV0YWlscyBvZiB0aGUgZXJyb3IuXG4gICAqL1xuICAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIGRvbmU6IFQsIC4uLmFyZ3M6IENhbGxiYWNrUGFyYW1ldGVyczxUPikgPT4gdm9pZDtcblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBLRUVQX0FMSVZFX0lOSVRJQUxfREVMQVkgPSAzMCAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ09OTkVDVF9USU1FT1VUID0gMTUgKiAxMDAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQgPSAxNSAqIDEwMDA7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfQ0FOQ0VMX1RJTUVPVVQgPSA1ICogMTAwMDtcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9DT05ORUNUX1JFVFJZX0lOVEVSVkFMID0gNTAwO1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX1BBQ0tFVF9TSVpFID0gNCAqIDEwMjQ7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVEVYVFNJWkUgPSAyMTQ3NDgzNjQ3O1xuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBERUZBVUxUX0RBVEVGSVJTVCA9IDc7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfUE9SVCA9IDE0MzM7XG4vKipcbiAqIEBwcml2YXRlXG4gKi9cbmNvbnN0IERFRkFVTFRfVERTX1ZFUlNJT04gPSAnN180Jztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9MQU5HVUFHRSA9ICd1c19lbmdsaXNoJztcbi8qKlxuICogQHByaXZhdGVcbiAqL1xuY29uc3QgREVGQVVMVF9EQVRFRk9STUFUID0gJ21keSc7XG5cbmludGVyZmFjZSBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBJZiB5b3UgdXNlciB3YW50IHRvIGNvbm5lY3QgdG8gYW4gQXp1cmUgYXBwIHNlcnZpY2UgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzY29pYXRlIHRvIHRoZWlyIGNyZWF0ZWQgaWRuZXRpdHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGlzIG9wdGlvbmFsIGZvciByZXRyaWV2ZSB0b2tlbiBmcm9tIGF6dXJlIHdlYiBhcHAgc2VydmljZVxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtJztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmUgYSB0b2tlblxuICAgICAqL1xuICAgIGNsaWVudElkPzogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb24ge1xuICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIElmIHlvdSB3YW50IHRvIGNvbm5lY3QgdXNpbmcgYSBzcGVjaWZpYyBjbGllbnQgYWNjb3VudFxuICAgICAqIHRoZXkgbmVlZCB0byBwcm92aWRlIGBjbGllbnRJZGAgYXNzb2NpYXRlZCB0byB0aGVpciBjcmVhdGVkIGlkZW50aXR5LlxuICAgICAqXG4gICAgICogVGhpcyBpcyBvcHRpb25hbCBmb3IgcmV0cmlldmluZyBhIHRva2VuXG4gICAgICovXG4gICAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIH07XG59XG5cblxuaW50ZXJmYWNlIEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB7XG4gIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic7XG4gIG9wdGlvbnM6IHtcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGB0b2tlbmAgd2hpY2ggdGhleSByZXRyaXZlZCBlbHNlIHdoZXJlXG4gICAgICogdG8gZm9ybWluZyB0aGUgY29ubmVjdGlvbi5cbiAgICAgKi9cbiAgICB0b2tlbjogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlQYXNzd29yZEF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogQSB1c2VyIG5lZWQgdG8gcHJvdmlkZSBgdXNlck5hbWVgIGFzc2NvaWF0ZSB0byB0aGVpciBhY2NvdW50LlxuICAgICAqL1xuICAgIHVzZXJOYW1lOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHVzZXIgbmVlZCB0byBwcm92aWRlIGBwYXNzd29yZGAgYXNzY29pYXRlIHRvIHRoZWlyIGFjY291bnQuXG4gICAgICovXG4gICAgcGFzc3dvcmQ6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEEgY2xpZW50IGlkIHRvIHVzZS5cbiAgICAgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgcGFyYW1ldGVyIGZvciBzcGVjaWZpYyBBenVyZSB0ZW5hbnQgSURcbiAgICAgKi9cbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0IHtcbiAgdHlwZTogJ2F6dXJlLWFjdGl2ZS1kaXJlY3Rvcnktc2VydmljZS1wcmluY2lwYWwtc2VjcmV0JztcbiAgb3B0aW9uczoge1xuICAgIC8qKlxuICAgICAqIEFwcGxpY2F0aW9uIChgY2xpZW50YCkgSUQgZnJvbSB5b3VyIHJlZ2lzdGVyZWQgQXp1cmUgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRJZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGVkIGBjbGllbnQgc2VjcmV0YCBmb3IgdGhpcyByZWdpc3RlcmVkIEF6dXJlIGFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGlyZWN0b3J5IChgdGVuYW50YCkgSUQgZnJvbSB5b3VyIHJlZ2lzdGVyZWQgQXp1cmUgYXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgTnRsbUF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ250bG0nO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogVXNlciBuYW1lIGZyb20geW91ciB3aW5kb3dzIGFjY291bnQuXG4gICAgICovXG4gICAgdXNlck5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQYXNzd29yZCBmcm9tIHlvdXIgd2luZG93cyBhY2NvdW50LlxuICAgICAqL1xuICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT25jZSB5b3Ugc2V0IGRvbWFpbiBmb3IgbnRsbSBhdXRoZW50aWNhdGlvbiB0eXBlLCBkcml2ZXIgd2lsbCBjb25uZWN0IHRvIFNRTCBTZXJ2ZXIgdXNpbmcgZG9tYWluIGxvZ2luLlxuICAgICAqXG4gICAgICogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGZvcm1pbmcgYSBjb25uZWN0aW9uIHVzaW5nIG50bG0gdHlwZVxuICAgICAqL1xuICAgIGRvbWFpbjogc3RyaW5nO1xuICB9O1xufVxuXG5pbnRlcmZhY2UgRGVmYXVsdEF1dGhlbnRpY2F0aW9uIHtcbiAgdHlwZTogJ2RlZmF1bHQnO1xuICBvcHRpb25zOiB7XG4gICAgLyoqXG4gICAgICogVXNlciBuYW1lIHRvIHVzZSBmb3Igc3FsIHNlcnZlciBsb2dpbi5cbiAgICAgKi9cbiAgICB1c2VyTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAvKipcbiAgICAgKiBQYXNzd29yZCB0byB1c2UgZm9yIHNxbCBzZXJ2ZXIgbG9naW4uXG4gICAgICovXG4gICAgcGFzc3dvcmQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH07XG59XG5cbmludGVyZmFjZSBFcnJvcldpdGhDb2RlIGV4dGVuZHMgRXJyb3Ige1xuICBjb2RlPzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJuYWxDb25uZWN0aW9uQ29uZmlnIHtcbiAgc2VydmVyOiBzdHJpbmc7XG4gIGF1dGhlbnRpY2F0aW9uOiBEZWZhdWx0QXV0aGVudGljYXRpb24gfCBOdGxtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpVm1BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5QWNjZXNzVG9rZW5BdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuICBvcHRpb25zOiBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMge1xuICBhYm9ydFRyYW5zYWN0aW9uT25FcnJvcjogYm9vbGVhbjtcbiAgYXBwTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBjYW1lbENhc2VDb2x1bW5zOiBib29sZWFuO1xuICBjYW5jZWxUaW1lb3V0OiBudW1iZXI7XG4gIGNvbHVtbkVuY3J5cHRpb25LZXlDYWNoZVRUTDogbnVtYmVyO1xuICBjb2x1bW5FbmNyeXB0aW9uU2V0dGluZzogYm9vbGVhbjtcbiAgY29sdW1uTmFtZVJlcGxhY2VyOiB1bmRlZmluZWQgfCAoKGNvbE5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhKSA9PiBzdHJpbmcpO1xuICBjb25uZWN0aW9uUmV0cnlJbnRlcnZhbDogbnVtYmVyO1xuICBjb25uZWN0b3I6IHVuZGVmaW5lZCB8ICgoKSA9PiBQcm9taXNlPG5ldC5Tb2NrZXQ+KTtcbiAgY29ubmVjdFRpbWVvdXQ6IG51bWJlcjtcbiAgY29ubmVjdGlvbklzb2xhdGlvbkxldmVsOiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMW2tleW9mIHR5cGVvZiBJU09MQVRJT05fTEVWRUxdO1xuICBjcnlwdG9DcmVkZW50aWFsc0RldGFpbHM6IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuICBkYXRhYmFzZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBkYXRlZmlyc3Q6IG51bWJlcjtcbiAgZGF0ZUZvcm1hdDogc3RyaW5nO1xuICBkZWJ1Zzoge1xuICAgIGRhdGE6IGJvb2xlYW47XG4gICAgcGFja2V0OiBib29sZWFuO1xuICAgIHBheWxvYWQ6IGJvb2xlYW47XG4gICAgdG9rZW46IGJvb2xlYW47XG4gIH07XG4gIGVuYWJsZUFuc2lOdWxsOiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaU51bGxEZWZhdWx0OiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQW5zaVBhZGRpbmc6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVBbnNpV2FybmluZ3M6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVBcml0aEFib3J0OiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGw6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0OiBudWxsIHwgYm9vbGVhbjtcbiAgZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnM6IG51bGwgfCBib29sZWFuO1xuICBlbmFibGVOdW1lcmljUm91bmRhYm9ydDogbnVsbCB8IGJvb2xlYW47XG4gIGVuYWJsZVF1b3RlZElkZW50aWZpZXI6IG51bGwgfCBib29sZWFuO1xuICBlbmNyeXB0OiBzdHJpbmcgfCBib29sZWFuO1xuICBlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnM6IEtleVN0b3JlUHJvdmlkZXJNYXAgfCB1bmRlZmluZWQ7XG4gIGZhbGxiYWNrVG9EZWZhdWx0RGI6IGJvb2xlYW47XG4gIGluc3RhbmNlTmFtZTogdW5kZWZpbmVkIHwgc3RyaW5nO1xuICBpc29sYXRpb25MZXZlbDogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXTtcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgbG9jYWxBZGRyZXNzOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIG1heFJldHJpZXNPblRyYW5zaWVudEVycm9yczogbnVtYmVyO1xuICBtdWx0aVN1Ym5ldEZhaWxvdmVyOiBib29sZWFuO1xuICBwYWNrZXRTaXplOiBudW1iZXI7XG4gIHBvcnQ6IHVuZGVmaW5lZCB8IG51bWJlcjtcbiAgcmVhZE9ubHlJbnRlbnQ6IGJvb2xlYW47XG4gIHJlcXVlc3RUaW1lb3V0OiBudW1iZXI7XG4gIHJvd0NvbGxlY3Rpb25PbkRvbmU6IGJvb2xlYW47XG4gIHJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uOiBib29sZWFuO1xuICBzZXJ2ZXJOYW1lOiB1bmRlZmluZWQgfCBzdHJpbmc7XG4gIHNlcnZlclN1cHBvcnRzQ29sdW1uRW5jcnlwdGlvbjogYm9vbGVhbjtcbiAgdGRzVmVyc2lvbjogc3RyaW5nO1xuICB0ZXh0c2l6ZTogbnVtYmVyO1xuICB0cnVzdGVkU2VydmVyTmFtZUFFOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU6IGJvb2xlYW47XG4gIHVzZUNvbHVtbk5hbWVzOiBib29sZWFuO1xuICB1c2VVVEM6IGJvb2xlYW47XG4gIHdvcmtzdGF0aW9uSWQ6IHVuZGVmaW5lZCB8IHN0cmluZztcbiAgbG93ZXJDYXNlR3VpZHM6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBLZXlTdG9yZVByb3ZpZGVyTWFwIHtcbiAgW2tleTogc3RyaW5nXTogQ29sdW1uRW5jcnlwdGlvbkF6dXJlS2V5VmF1bHRQcm92aWRlcjtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5pbnRlcmZhY2UgU3RhdGUge1xuICBuYW1lOiBzdHJpbmc7XG4gIGVudGVyPyh0aGlzOiBDb25uZWN0aW9uKTogdm9pZDtcbiAgZXhpdD8odGhpczogQ29ubmVjdGlvbiwgbmV3U3RhdGU6IFN0YXRlKTogdm9pZDtcbiAgZXZlbnRzOiB7XG4gICAgc29ja2V0RXJyb3I/KHRoaXM6IENvbm5lY3Rpb24sIGVycjogRXJyb3IpOiB2b2lkO1xuICAgIGNvbm5lY3RUaW1lb3V0Pyh0aGlzOiBDb25uZWN0aW9uKTogdm9pZDtcbiAgICBtZXNzYWdlPyh0aGlzOiBDb25uZWN0aW9uLCBtZXNzYWdlOiBNZXNzYWdlKTogdm9pZDtcbiAgICByZXRyeT8odGhpczogQ29ubmVjdGlvbik6IHZvaWQ7XG4gICAgcmVjb25uZWN0Pyh0aGlzOiBDb25uZWN0aW9uKTogdm9pZDtcbiAgfTtcbn1cblxudHlwZSBBdXRoZW50aWNhdGlvbiA9IERlZmF1bHRBdXRoZW50aWNhdGlvbiB8XG4gIE50bG1BdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbiB8XG4gIEF6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlBY2Nlc3NUb2tlbkF1dGhlbnRpY2F0aW9uIHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlTZXJ2aWNlUHJpbmNpcGFsU2VjcmV0IHxcbiAgQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb247XG5cbnR5cGUgQXV0aGVudGljYXRpb25UeXBlID0gQXV0aGVudGljYXRpb25bJ3R5cGUnXTtcblxuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0aW9uQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBIb3N0bmFtZSB0byBjb25uZWN0IHRvLlxuICAgKi9cbiAgc2VydmVyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGZvcm1pbmcgdGhlIGNvbm5lY3Rpb24uXG4gICAqL1xuICBvcHRpb25zPzogQ29ubmVjdGlvbk9wdGlvbnM7XG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGlvbiByZWFsdGVkIG9wdGlvbnMgZm9yIGNvbm5lY3Rpb24uXG4gICAqL1xuICBhdXRoZW50aWNhdGlvbj86IEF1dGhlbnRpY2F0aW9uT3B0aW9ucztcbn1cblxuaW50ZXJmYWNlIERlYnVnT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgW1tkZWJ1Z11dIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgd2l0aCB0ZXh0IGRlc2NyaWJpbmcgcGFja2V0IGRhdGEgZGV0YWlsc1xuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGRhdGE6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgW1tkZWJ1Z11dIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgd2l0aCB0ZXh0IGRlc2NyaWJpbmcgcGFja2V0IGRldGFpbHNcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBwYWNrZXQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgW1tkZWJ1Z11dIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgd2l0aCB0ZXh0IGRlc2NyaWJpbmcgcGFja2V0IHBheWxvYWQgZGV0YWlsc1xuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHBheWxvYWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBIGJvb2xlYW4sIGNvbnRyb2xsaW5nIHdoZXRoZXIgW1tkZWJ1Z11dIGV2ZW50cyB3aWxsIGJlIGVtaXR0ZWQgd2l0aCB0ZXh0IGRlc2NyaWJpbmcgdG9rZW4gc3RyZWFtIHRva2Vuc1xuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIHRva2VuOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQXV0aGVudGljYXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFR5cGUgb2YgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCwgdmFsaWQgdHlwZXMgYXJlIGBkZWZhdWx0YCwgYG50bG1gLFxuICAgKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZGAsIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbmAsXG4gICAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bWAsIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZWAsXG4gICAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHRgXG4gICAqIG9yIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldGBcbiAgICovXG4gIHR5cGU/OiBBdXRoZW50aWNhdGlvblR5cGU7XG4gIC8qKlxuICAgKiBEaWZmZXJlbnQgb3B0aW9ucyBmb3IgYXV0aGVudGljYXRpb24gdHlwZXM6XG4gICAqXG4gICAqICogYGRlZmF1bHRgOiBbW0RlZmF1bHRBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgbnRsbWAgOltbTnRsbUF1dGhlbnRpY2F0aW9uXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZGAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5UGFzc3dvcmRBdXRoZW50aWNhdGlvbi5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW5gIDogW1tBenVyZUFjdGl2ZURpcmVjdG9yeUFjY2Vzc1Rva2VuQXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqICogYGF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLXZtYCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlNc2lWbUF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZWAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5TXNpQXBwU2VydmljZUF1dGhlbnRpY2F0aW9uLm9wdGlvbnNdXVxuICAgKiAqIGBhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldGAgOiBbW0F6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldC5vcHRpb25zXV1cbiAgICogKiBgYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0YCA6IFtbQXp1cmVBY3RpdmVEaXJlY3RvcnlEZWZhdWx0QXV0aGVudGljYXRpb24ub3B0aW9uc11dXG4gICAqL1xuICBvcHRpb25zPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3Rpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHJvbGxiYWNrIGEgdHJhbnNhY3Rpb24gYXV0b21hdGljYWxseSBpZiBhbnkgZXJyb3IgaXMgZW5jb3VudGVyZWRcbiAgICogZHVyaW5nIHRoZSBnaXZlbiB0cmFuc2FjdGlvbidzIGV4ZWN1dGlvbi4gVGhpcyBzZXRzIHRoZSB2YWx1ZSBmb3IgYFNFVCBYQUNUX0FCT1JUYCBkdXJpbmcgdGhlXG4gICAqIGluaXRpYWwgU1FMIHBoYXNlIG9mIGEgY29ubmVjdGlvbiBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LXhhY3QtYWJvcnQtdHJhbnNhY3Qtc3FsKS5cbiAgICovXG4gIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQXBwbGljYXRpb24gbmFtZSB1c2VkIGZvciBpZGVudGlmeWluZyBhIHNwZWNpZmljIGFwcGxpY2F0aW9uIGluIHByb2ZpbGluZywgbG9nZ2luZyBvciB0cmFjaW5nIHRvb2xzIG9mIFNRTFNlcnZlci5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBUZWRpb3VzYClcbiAgICovXG4gIGFwcE5hbWU/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbGxpbmcgd2hldGhlciB0aGUgY29sdW1uIG5hbWVzIHJldHVybmVkIHdpbGwgaGF2ZSB0aGUgZmlyc3QgbGV0dGVyIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlXG4gICAqIChgdHJ1ZWApIG9yIG5vdC4gVGhpcyB2YWx1ZSBpcyBpZ25vcmVkIGlmIHlvdSBwcm92aWRlIGEgW1tjb2x1bW5OYW1lUmVwbGFjZXJdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgY2FtZWxDYXNlQ29sdW1ucz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgW1tSZXF1ZXN0LmNhbmNlbF1dIChhYm9ydCkgb2YgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkXG4gICAqXG4gICAqIChkZWZhdWx0OiBgNTAwMGApLlxuICAgKi9cbiAgY2FuY2VsVGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB3aXRoIHBhcmFtZXRlcnMgYChjb2x1bW5OYW1lLCBpbmRleCwgY29sdW1uTWV0YURhdGEpYCBhbmQgcmV0dXJuaW5nIGEgc3RyaW5nLiBJZiBwcm92aWRlZCxcbiAgICogdGhpcyB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlciBjb2x1bW4gcGVyIHJlc3VsdC1zZXQuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgU1FMLXByb3ZpZGVkXG4gICAqIGNvbHVtbiBuYW1lIG9uIHJvdyBhbmQgbWV0YSBkYXRhIG9iamVjdHMuIFRoaXMgYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBjb252ZXJ0IGJldHdlZW4gbmFtaW5nIGNvbnZlbnRpb25zLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYG51bGxgKVxuICAgKi9cbiAgY29sdW1uTmFtZVJlcGxhY2VyPzogKGNvbE5hbWU6IHN0cmluZywgaW5kZXg6IG51bWJlciwgbWV0YWRhdGE6IE1ldGFkYXRhKSA9PiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIHJldHJ5aW5nIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uLCBpbiBjYXNlIG9mIHRyYW5zaWVudCBmYWlsdXJlLlxuICAgKlxuICAgKiAoZGVmYXVsdDpgNTAwYClcbiAgICovXG4gIGNvbm5lY3Rpb25SZXRyeUludGVydmFsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDdXN0b20gY29ubmVjdG9yIGZhY3RvcnkgbWV0aG9kLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYHVuZGVmaW5lZGApXG4gICAqL1xuICBjb25uZWN0b3I/OiAoKSA9PiBQcm9taXNlPG5ldC5Tb2NrZXQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgdGhlIGF0dGVtcHQgdG8gY29ubmVjdCBpcyBjb25zaWRlcmVkIGZhaWxlZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYDE1MDAwYCkuXG4gICAqL1xuICBjb25uZWN0VGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIGZvciBuZXcgY29ubmVjdGlvbnMuIEFsbCBvdXQtb2YtdHJhbnNhY3Rpb24gcXVlcmllcyBhcmUgZXhlY3V0ZWQgd2l0aCB0aGlzIHNldHRpbmcuXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgY29ubmVjdGlvbklzb2xhdGlvbkxldmVsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGVuIGVuY3J5cHRpb24gaXMgdXNlZCwgYW4gb2JqZWN0IG1heSBiZSBzdXBwbGllZCB0aGF0IHdpbGwgYmUgdXNlZFxuICAgKiBmb3IgdGhlIGZpcnN0IGFyZ3VtZW50IHdoZW4gY2FsbGluZyBbYHRscy5jcmVhdGVTZWN1cmVQYWlyYF0oaHR0cDovL25vZGVqcy5vcmcvZG9jcy9sYXRlc3QvYXBpL3Rscy5odG1sI3Rsc190bHNfY3JlYXRlc2VjdXJlcGFpcl9jcmVkZW50aWFsc19pc3NlcnZlcl9yZXF1ZXN0Y2VydF9yZWplY3R1bmF1dGhvcml6ZWQpXG4gICAqXG4gICAqIChkZWZhdWx0OiBge31gKVxuICAgKi9cbiAgY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzPzogU2VjdXJlQ29udGV4dE9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIERhdGFiYXNlIHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGRlcGVuZGVudCBvbiBzZXJ2ZXIgY29uZmlndXJhdGlvbikuXG4gICAqL1xuICBkYXRhYmFzZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2V0cyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIHRvIGEgbnVtYmVyIGZyb20gMSB0aHJvdWdoIDcuXG4gICAqL1xuICBkYXRlZmlyc3Q/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyBwb3NpdGlvbiBvZiBtb250aCwgZGF5IGFuZCB5ZWFyIGluIHRlbXBvcmFsIGRhdGF0eXBlcy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBtZHlgKVxuICAgKi9cbiAgZGF0ZUZvcm1hdD86IHN0cmluZztcblxuICBkZWJ1Zz86IERlYnVnT3B0aW9ucztcblxuICAvKipcbiAgICogQSBib29sZWFuLCBjb250cm9scyB0aGUgd2F5IG51bGwgdmFsdWVzIHNob3VsZCBiZSB1c2VkIGR1cmluZyBjb21wYXJpc29uIG9wZXJhdGlvbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lOdWxsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgYFNFVCBBTlNJX05VTExfREZMVF9PTiBPTmAgd2lsbCBiZSBzZXQgaW4gdGhlIGluaXRpYWwgc3FsLiBUaGlzIG1lYW5zIG5ldyBjb2x1bW5zIHdpbGwgYmVcbiAgICogbnVsbGFibGUgYnkgZGVmYXVsdC4gU2VlIHRoZSBbVC1TUUwgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczE4NzM3NS5hc3B4KVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKS5cbiAgICovXG4gIGVuYWJsZUFuc2lOdWxsRGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgaWYgcGFkZGluZyBzaG91bGQgYmUgYXBwbGllZCBmb3IgdmFsdWVzIHNob3J0ZXIgdGhhbiB0aGUgc2l6ZSBvZiBkZWZpbmVkIGNvbHVtbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZUFuc2lQYWRkaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgU1FMIFNlcnZlciB3aWxsIGZvbGxvdyBJU08gc3RhbmRhcmQgYmVoYXZpb3IgZHVyaW5nIHZhcmlvdXMgZXJyb3IgY29uZGl0aW9ucy4gRm9yIGRldGFpbHMsXG4gICAqIHNlZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LWFuc2ktd2FybmluZ3MtdHJhbnNhY3Qtc3FsKVxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQW5zaVdhcm5pbmdzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5kcyBhIHF1ZXJ5IHdoZW4gYW4gb3ZlcmZsb3cgb3IgZGl2aWRlLWJ5LXplcm8gZXJyb3Igb2NjdXJzIGR1cmluZyBxdWVyeSBleGVjdXRpb24uXG4gICAqIFNlZSBbZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9kb2NzLm1pY3Jvc29mdC5jb20vZW4tdXMvc3FsL3Qtc3FsL3N0YXRlbWVudHMvc2V0LWFyaXRoYWJvcnQtdHJhbnNhY3Qtc3FsP3ZpZXc9c3FsLXNlcnZlci0yMDE3KVxuICAgKiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYHRydWVgKVxuICAgKi9cbiAgZW5hYmxlQXJpdGhBYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5lcyBpZiBjb25jYXRlbmF0aW9uIHdpdGggTlVMTCBzaG91bGQgcmVzdWx0IGluIE5VTEwgb3IgZW1wdHkgc3RyaW5nIHZhbHVlLCBtb3JlIGRldGFpbHMgaW5cbiAgICogW2RvY3VtZW50YXRpb25dKGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3NxbC90LXNxbC9zdGF0ZW1lbnRzL3NldC1jb25jYXQtbnVsbC15aWVsZHMtbnVsbC10cmFuc2FjdC1zcWwpXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdHJ1ZWApXG4gICAqL1xuICBlbmFibGVDb25jYXROdWxsWWllbGRzTnVsbD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgY29udHJvbHMgd2hldGhlciBjdXJzb3Igc2hvdWxkIGJlIGNsb3NlZCwgaWYgdGhlIHRyYW5zYWN0aW9uIG9wZW5pbmcgaXQgZ2V0cyBjb21taXR0ZWQgb3Igcm9sbGVkXG4gICAqIGJhY2suXG4gICAqXG4gICAqIChkZWZhdWx0OiBgbnVsbGApXG4gICAqL1xuICBlbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0PzogYm9vbGVhbiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgc2V0cyB0aGUgY29ubmVjdGlvbiB0byBlaXRoZXIgaW1wbGljaXQgb3IgYXV0b2NvbW1pdCB0cmFuc2FjdGlvbiBtb2RlLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgZmFsc2UsIGVycm9yIGlzIG5vdCBnZW5lcmF0ZWQgZHVyaW5nIGxvc3Mgb2YgcHJlY2Vzc2lvbi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqL1xuICBlbmFibGVOdW1lcmljUm91bmRhYm9ydD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRydWUsIGNoYXJhY3RlcnMgZW5jbG9zZWQgaW4gc2luZ2xlIHF1b3RlcyBhcmUgdHJlYXRlZCBhcyBsaXRlcmFscyBhbmQgdGhvc2UgZW5jbG9zZWQgZG91YmxlIHF1b3RlcyBhcmUgdHJlYXRlZCBhcyBpZGVudGlmaWVycy5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuYWJsZVF1b3RlZElkZW50aWZpZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHN0cmluZyB2YWx1ZSB0aGF0IGNhbiBiZSBvbmx5IHNldCB0byAnc3RyaWN0Jywgd2hpY2ggaW5kaWNhdGVzIHRoZSB1c2FnZSBURFMgOC4wIHByb3RvY29sLiBPdGhlcndpc2UsXG4gICAqIGEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0aGUgY29ubmVjdGlvbiB3aWxsIGJlIGVuY3J5cHRlZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIGVuY3J5cHQ/OiBzdHJpbmcgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgZGF0YWJhc2UgcmVxdWVzdGVkIGJ5IFtbZGF0YWJhc2VdXSBjYW5ub3QgYmUgYWNjZXNzZWQsXG4gICAqIHRoZSBjb25uZWN0aW9uIHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLiBIb3dldmVyLCBpZiBbW2ZhbGxiYWNrVG9EZWZhdWx0RGJdXSBpc1xuICAgKiBzZXQgdG8gYHRydWVgLCB0aGVuIHRoZSB1c2VyJ3MgZGVmYXVsdCBkYXRhYmFzZSB3aWxsIGJlIHVzZWQgaW5zdGVhZFxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYClcbiAgICovXG4gIGZhbGxiYWNrVG9EZWZhdWx0RGI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2UgbmFtZSB0byBjb25uZWN0IHRvLlxuICAgKiBUaGUgU1FMIFNlcnZlciBCcm93c2VyIHNlcnZpY2UgbXVzdCBiZSBydW5uaW5nIG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIsXG4gICAqIGFuZCBVRFAgcG9ydCAxNDM0IG9uIHRoZSBkYXRhYmFzZSBzZXJ2ZXIgbXVzdCBiZSByZWFjaGFibGUuXG4gICAqXG4gICAqIChubyBkZWZhdWx0KVxuICAgKlxuICAgKiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBbW3BvcnRdXS5cbiAgICovXG4gIGluc3RhbmNlTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGRlZmF1bHQgaXNvbGF0aW9uIGxldmVsIHRoYXQgdHJhbnNhY3Rpb25zIHdpbGwgYmUgcnVuIHdpdGguXG4gICAqXG4gICAqIFRoZSBpc29sYXRpb24gbGV2ZWxzIGFyZSBhdmFpbGFibGUgZnJvbSBgcmVxdWlyZSgndGVkaW91cycpLklTT0xBVElPTl9MRVZFTGAuXG4gICAqICogYFJFQURfVU5DT01NSVRURURgXG4gICAqICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAqIGBSRVBFQVRBQkxFX1JFQURgXG4gICAqICogYFNFUklBTElaQUJMRWBcbiAgICogKiBgU05BUFNIT1RgXG4gICAqXG4gICAqIChkZWZhdWx0OiBgUkVBRF9DT01NSVRFRGApLlxuICAgKi9cbiAgaXNvbGF0aW9uTGV2ZWw/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgbGFuZ3VhZ2UgZW52aXJvbm1lbnQgZm9yIHRoZSBzZXNzaW9uLiBUaGUgc2Vzc2lvbiBsYW5ndWFnZSBkZXRlcm1pbmVzIHRoZSBkYXRldGltZSBmb3JtYXRzIGFuZCBzeXN0ZW0gbWVzc2FnZXMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgdXNfZW5nbGlzaGApLlxuICAgKi9cbiAgbGFuZ3VhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RyaW5nIGluZGljYXRpbmcgd2hpY2ggbmV0d29yayBpbnRlcmZhY2UgKGlwIGFkZHJlc3MpIHRvIHVzZSB3aGVuIGNvbm5lY3RpbmcgdG8gU1FMIFNlcnZlci5cbiAgICovXG4gIGxvY2FsQWRkcmVzcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcGFyc2UgdW5pcXVlIGlkZW50aWZpZXIgdHlwZSB3aXRoIGxvd2VyY2FzZSBjYXNlIGNoYXJhY3RlcnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIGxvd2VyQ2FzZUd1aWRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbm5lY3Rpb24gcmV0cmllcyBmb3IgdHJhbnNpZW50IGVycm9ycy7jgIFcbiAgICpcbiAgICogKGRlZmF1bHQ6IGAzYCkuXG4gICAqL1xuICBtYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIE11bHRpU3VibmV0RmFpbG92ZXIgPSBUcnVlIHBhcmFtZXRlciwgd2hpY2ggY2FuIGhlbHAgbWluaW1pemUgdGhlIGNsaWVudCByZWNvdmVyeSBsYXRlbmN5IHdoZW4gZmFpbG92ZXJzIG9jY3VyLlxuICAgKlxuICAgKiAoZGVmYXVsdDogYGZhbHNlYCkuXG4gICAqL1xuICBtdWx0aVN1Ym5ldEZhaWxvdmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHNpemUgb2YgVERTIHBhY2tldHMgKHN1YmplY3QgdG8gbmVnb3RpYXRpb24gd2l0aCB0aGUgc2VydmVyKS5cbiAgICogU2hvdWxkIGJlIGEgcG93ZXIgb2YgMi5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGA0MDk2YCkuXG4gICAqL1xuICBwYWNrZXRTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBQb3J0IHRvIGNvbm5lY3QgdG8gKGRlZmF1bHQ6IGAxNDMzYCkuXG4gICAqXG4gICAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIFtbaW5zdGFuY2VOYW1lXV1cbiAgICovXG4gIHBvcnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY29ubmVjdGlvbiB3aWxsIHJlcXVlc3QgcmVhZCBvbmx5IGFjY2VzcyBmcm9tIGEgU1FMIFNlcnZlciBBdmFpbGFiaWxpdHlcbiAgICogR3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW2hlcmVdKGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDcxMDA1NC5hc3B4IFwiTWljcm9zb2Z0OiBDb25maWd1cmUgUmVhZC1Pbmx5IFJvdXRpbmcgZm9yIGFuIEF2YWlsYWJpbGl0eSBHcm91cCAoU1FMIFNlcnZlcilcIilcbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZE9ubHlJbnRlbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYSByZXF1ZXN0IGlzIGNvbnNpZGVyZWQgZmFpbGVkLCBvciBgMGAgZm9yIG5vIHRpbWVvdXQuXG4gICAqXG4gICAqIEFzIHNvb24gYXMgYSByZXNwb25zZSBpcyByZWNlaXZlZCwgdGhlIHRpbWVvdXQgaXMgY2xlYXJlZC4gVGhpcyBtZWFucyB0aGF0IHF1ZXJpZXMgdGhhdCBpbW1lZGlhdGVseSByZXR1cm4gYSByZXNwb25zZSBoYXZlIGFiaWxpdHkgdG8gcnVuIGxvbmdlciB0aGFuIHRoaXMgdGltZW91dC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGAxNTAwMGApLlxuICAgKi9cbiAgcmVxdWVzdFRpbWVvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEEgYm9vbGVhbiwgdGhhdCB3aGVuIHRydWUgd2lsbCBleHBvc2UgcmVjZWl2ZWQgcm93cyBpbiBSZXF1ZXN0cyBkb25lIHJlbGF0ZWQgZXZlbnRzOlxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lSW5Qcm9jXV1cbiAgICogKiBbW1JlcXVlc3QuRXZlbnRfZG9uZVByb2NdXVxuICAgKiAqIFtbUmVxdWVzdC5FdmVudF9kb25lXV1cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25Eb25lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuLCB0aGF0IHdoZW4gdHJ1ZSB3aWxsIGV4cG9zZSByZWNlaXZlZCByb3dzIGluIFJlcXVlc3RzJyBjb21wbGV0aW9uIGNhbGxiYWNrLlNlZSBbW1JlcXVlc3QuY29uc3RydWN0b3JdXS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApXG4gICAqXG4gICAqIENhdXRpb246IElmIG1hbnkgcm93IGFyZSByZWNlaXZlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gY291bGQgcmVzdWx0IGluXG4gICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgdXNhZ2UuXG4gICAqL1xuICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJzaW9uIG9mIFREUyB0byB1c2UuIElmIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc3BlY2lmaWVkIHZlcnNpb24sIG5lZ290aWF0ZWQgdmVyc2lvbiBpcyB1c2VkIGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSB2ZXJzaW9ucyBhcmUgYXZhaWxhYmxlIGZyb20gYHJlcXVpcmUoJ3RlZGlvdXMnKS5URFNfVkVSU0lPTmAuXG4gICAqICogYDdfMWBcbiAgICogKiBgN18yYFxuICAgKiAqIGA3XzNfQWBcbiAgICogKiBgN18zX0JgXG4gICAqICogYDdfNGBcbiAgICpcbiAgICogKGRlZmF1bHQ6IGA3XzRgKVxuICAgKi9cbiAgdGRzVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzaXplIG9mIHZhcmNoYXIobWF4KSwgbnZhcmNoYXIobWF4KSwgdmFyYmluYXJ5KG1heCksIHRleHQsIG50ZXh0LCBhbmQgaW1hZ2UgZGF0YSByZXR1cm5lZCBieSBhIFNFTEVDVCBzdGF0ZW1lbnQuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgMjE0NzQ4MzY0N2ApXG4gICAqL1xuICB0ZXh0c2l6ZT86IHN0cmluZztcblxuICAvKipcbiAgICogSWYgXCJ0cnVlXCIsIHRoZSBTUUwgU2VydmVyIFNTTCBjZXJ0aWZpY2F0ZSBpcyBhdXRvbWF0aWNhbGx5IHRydXN0ZWQgd2hlbiB0aGUgY29tbXVuaWNhdGlvbiBsYXllciBpcyBlbmNyeXB0ZWQgdXNpbmcgU1NMLlxuICAgKlxuICAgKiBJZiBcImZhbHNlXCIsIHRoZSBTUUwgU2VydmVyIHZhbGlkYXRlcyB0aGUgc2VydmVyIFNTTCBjZXJ0aWZpY2F0ZS4gSWYgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIGZhaWxzLFxuICAgKiB0aGUgZHJpdmVyIHJhaXNlcyBhbiBlcnJvciBhbmQgdGVybWluYXRlcyB0aGUgY29ubmVjdGlvbi4gTWFrZSBzdXJlIHRoZSB2YWx1ZSBwYXNzZWQgdG8gc2VydmVyTmFtZSBleGFjdGx5XG4gICAqIG1hdGNoZXMgdGhlIENvbW1vbiBOYW1lIChDTikgb3IgRE5TIG5hbWUgaW4gdGhlIFN1YmplY3QgQWx0ZXJuYXRlIE5hbWUgaW4gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSBmb3IgYW4gU1NMIGNvbm5lY3Rpb24gdG8gc3VjY2VlZC5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYClcbiAgICovXG4gIHRydXN0U2VydmVyQ2VydGlmaWNhdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKlxuICAgKi9cbiAgc2VydmVyTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRvIHJldHVybiByb3dzIGFzIGFycmF5cyBvciBrZXktdmFsdWUgY29sbGVjdGlvbnMuXG4gICAqXG4gICAqIChkZWZhdWx0OiBgZmFsc2VgKS5cbiAgICovXG4gIHVzZUNvbHVtbk5hbWVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBib29sZWFuIGRldGVybWluaW5nIHdoZXRoZXIgdG8gcGFzcyB0aW1lIHZhbHVlcyBpbiBVVEMgb3IgbG9jYWwgdGltZS5cbiAgICpcbiAgICogKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqL1xuICB1c2VVVEM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgd29ya3N0YXRpb24gSUQgKFdTSUQpIG9mIHRoZSBjbGllbnQsIGRlZmF1bHQgb3MuaG9zdG5hbWUoKS5cbiAgICogVXNlZCBmb3IgaWRlbnRpZnlpbmcgYSBzcGVjaWZpYyBjbGllbnQgaW4gcHJvZmlsaW5nLCBsb2dnaW5nIG9yXG4gICAqIHRyYWNpbmcgY2xpZW50IGFjdGl2aXR5IGluIFNRTFNlcnZlci5cbiAgICpcbiAgICogVGhlIHZhbHVlIGlzIHJlcG9ydGVkIGJ5IHRoZSBUU1FMIGZ1bmN0aW9uIEhPU1RfTkFNRSgpLlxuICAgKi9cbiAgd29ya3N0YXRpb25JZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAcHJpdmF0ZVxuICovXG5jb25zdCBDTEVBTlVQX1RZUEUgPSB7XG4gIE5PUk1BTDogMCxcbiAgUkVESVJFQ1Q6IDEsXG4gIFJFVFJZOiAyXG59O1xuXG5pbnRlcmZhY2UgUm91dGluZ0RhdGEge1xuICBzZXJ2ZXI6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgW1tDb25uZWN0aW9uXV0gaW5zdGFuY2UgcmVwcmVzZW50cyBhIHNpbmdsZSBjb25uZWN0aW9uIHRvIGEgZGF0YWJhc2Ugc2VydmVyLlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgQ29ubmVjdGlvbiA9IHJlcXVpcmUoJ3RlZGlvdXMnKS5Db25uZWN0aW9uO1xuICogdmFyIGNvbmZpZyA9IHtcbiAqICBcImF1dGhlbnRpY2F0aW9uXCI6IHtcbiAqICAgIC4uLixcbiAqICAgIFwib3B0aW9uc1wiOiB7Li4ufVxuICogIH0sXG4gKiAgXCJvcHRpb25zXCI6IHsuLi59XG4gKiB9O1xuICogdmFyIGNvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbihjb25maWcpO1xuICogYGBgXG4gKlxuICogT25seSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUgbWF5IGJlIGV4ZWN1dGVkIG9uIGEgY29ubmVjdGlvbi4gT25jZSBhIFtbUmVxdWVzdF1dXG4gKiBoYXMgYmVlbiBpbml0aWF0ZWQgKHdpdGggW1tDb25uZWN0aW9uLmNhbGxQcm9jZWR1cmVdXSwgW1tDb25uZWN0aW9uLmV4ZWNTcWxdXSxcbiAqIG9yIFtbQ29ubmVjdGlvbi5leGVjU3FsQmF0Y2hdXSksIGFub3RoZXIgc2hvdWxkIG5vdCBiZSBpbml0aWF0ZWQgdW50aWwgdGhlXG4gKiBbW1JlcXVlc3RdXSdzIGNvbXBsZXRpb24gY2FsbGJhY2sgaXMgY2FsbGVkLlxuICovXG5jbGFzcyBDb25uZWN0aW9uIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmZWRBdXRoUmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY29uZmlnOiBJbnRlcm5hbENvbm5lY3Rpb25Db25maWc7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VjdXJlQ29udGV4dE9wdGlvbnM6IFNlY3VyZUNvbnRleHRPcHRpb25zO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGluVHJhbnNhY3Rpb246IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25EZXNjcmlwdG9yczogQnVmZmVyW107XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNhY3Rpb25EZXB0aDogbnVtYmVyO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGlzU3FsQmF0Y2g6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3VyVHJhbnNpZW50UmV0cnlDb3VudDogbnVtYmVyO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHRyYW5zaWVudEVycm9yTG9va3VwOiBUcmFuc2llbnRFcnJvckxvb2t1cDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbG9zZWQ6IGJvb2xlYW47XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbG9naW5FcnJvcjogdW5kZWZpbmVkIHwgQWdncmVnYXRlRXJyb3IgfCBDb25uZWN0aW9uRXJyb3I7XG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZGVidWc6IERlYnVnO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIG50bG1wYWNrZXQ6IHVuZGVmaW5lZCB8IGFueTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBudGxtcGFja2V0QnVmZmVyOiB1bmRlZmluZWQgfCBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkZWNsYXJlIFNUQVRFOiB7XG4gICAgSU5JVElBTElaRUQ6IFN0YXRlO1xuICAgIENPTk5FQ1RJTkc6IFN0YXRlO1xuICAgIFNFTlRfUFJFTE9HSU46IFN0YXRlO1xuICAgIFJFUk9VVElORzogU3RhdGU7XG4gICAgVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlk6IFN0YXRlO1xuICAgIFNFTlRfVExTU1NMTkVHT1RJQVRJT046IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU46IFN0YXRlO1xuICAgIFNFTlRfTE9HSU43X1dJVEhfTlRMTTogU3RhdGU7XG4gICAgU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIOiBTdGF0ZTtcbiAgICBMT0dHRURfSU5fU0VORElOR19JTklUSUFMX1NRTDogU3RhdGU7XG4gICAgTE9HR0VEX0lOOiBTdGF0ZTtcbiAgICBTRU5UX0NMSUVOVF9SRVFVRVNUOiBTdGF0ZTtcbiAgICBTRU5UX0FUVEVOVElPTjogU3RhdGU7XG4gICAgRklOQUw6IFN0YXRlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcm91dGluZ0RhdGE6IHVuZGVmaW5lZCB8IFJvdXRpbmdEYXRhO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgbWVzc2FnZUlvITogTWVzc2FnZUlPO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHN0YXRlOiBTdGF0ZTtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXNldENvbm5lY3Rpb25Pbk5leHRSZXF1ZXN0OiB1bmRlZmluZWQgfCBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdDogdW5kZWZpbmVkIHwgUmVxdWVzdCB8IEJ1bGtMb2FkO1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByb2NSZXR1cm5TdGF0dXNWYWx1ZTogdW5kZWZpbmVkIHwgYW55O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldDogdW5kZWZpbmVkIHwgbmV0LlNvY2tldDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtZXNzYWdlQnVmZmVyOiBCdWZmZXI7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjb25uZWN0VGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVyOiB1bmRlZmluZWQgfCBOb2RlSlMuVGltZW91dDtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICByZXF1ZXN0VGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJldHJ5VGltZXI6IHVuZGVmaW5lZCB8IE5vZGVKUy5UaW1lb3V0O1xuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQ6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkYXRhYmFzZUNvbGxhdGlvbjogQ29sbGF0aW9uIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBOb3RlOiBiZSBhd2FyZSBvZiB0aGUgZGlmZmVyZW50IG9wdGlvbnMgZmllbGQ6XG4gICAqIDEuIGNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zXG4gICAqIDIuIGNvbmZpZy5vcHRpb25zXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHsgQ29ubmVjdGlvbiB9ID0gcmVxdWlyZSgndGVkaW91cycpO1xuICAgKlxuICAgKiBjb25zdCBjb25maWcgPSB7XG4gICAqICBcImF1dGhlbnRpY2F0aW9uXCI6IHtcbiAgICogICAgLi4uLFxuICAgKiAgICBcIm9wdGlvbnNcIjogey4uLn1cbiAgICogIH0sXG4gICAqICBcIm9wdGlvbnNcIjogey4uLn1cbiAgICogfTtcbiAgICpcbiAgICogY29uc3QgY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKGNvbmZpZyk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IENvbm5lY3Rpb25Db25maWd1cmF0aW9uKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmICh0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0JyB8fCBjb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZ1wiIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGFuZCBtdXN0IGJlIG9mIHR5cGUgT2JqZWN0LicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY29uZmlnLnNlcnZlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5zZXJ2ZXJcIiBwcm9wZXJ0eSBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IGZhbHNlO1xuXG4gICAgbGV0IGF1dGhlbnRpY2F0aW9uOiBJbnRlcm5hbENvbm5lY3Rpb25Db25maWdbJ2F1dGhlbnRpY2F0aW9uJ107XG4gICAgaWYgKGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodHlwZW9mIGNvbmZpZy5hdXRoZW50aWNhdGlvbiAhPT0gJ29iamVjdCcgfHwgY29uZmlnLmF1dGhlbnRpY2F0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGUgPSBjb25maWcuYXV0aGVudGljYXRpb24udHlwZTtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucyA9PT0gdW5kZWZpbmVkID8ge30gOiBjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucztcblxuICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24udHlwZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlICE9PSAnZGVmYXVsdCcgJiYgdHlwZSAhPT0gJ250bG0nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1hY2Nlc3MtdG9rZW4nICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScgJiYgdHlwZSAhPT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJyAmJiB0eXBlICE9PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnICYmIHR5cGUgIT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcInR5cGVcIiBwcm9wZXJ0eSBtdXN0IG9uZSBvZiBcImRlZmF1bHRcIiwgXCJudGxtXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZFwiLCBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktYWNjZXNzLXRva2VuXCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0XCIsIFwiYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm1cIiBvciBcImF6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlXCIgb3IgXCJhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldFwiLicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnIHx8IG9wdGlvbnMgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgb2JqZWN0LicpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZSA9PT0gJ250bG0nKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5kb21haW4gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuZG9tYWluXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnVzZXJOYW1lICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMudXNlck5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWVcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5wYXNzd29yZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5wYXNzd29yZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnbnRsbScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIGRvbWFpbjogb3B0aW9ucy5kb21haW4gJiYgb3B0aW9ucy5kb21haW4udG9VcHBlckNhc2UoKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktcGFzc3dvcmQnKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy51c2VyTmFtZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnVzZXJOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnBhc3N3b3JkICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9wdGlvbnMucGFzc3dvcmQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudGVuYW50SWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy50ZW5hbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCcsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdXNlck5hbWU6IG9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICBwYXNzd29yZDogb3B0aW9ucy5wYXNzd29yZCxcbiAgICAgICAgICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnRva2VuICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnRva2VuXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbicsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgdG9rZW46IG9wdGlvbnMudG9rZW5cbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bScpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuY2xpZW50SWQgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy5jbGllbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0Jykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBjbGllbnRJZDogb3B0aW9ucy5jbGllbnRJZFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJykge1xuICAgICAgICBpZiAob3B0aW9ucy5jbGllbnRJZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZScsXG4gICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgY2xpZW50SWQ6IG9wdGlvbnMuY2xpZW50SWRcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLmNsaWVudElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5jbGllbnRTZWNyZXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLmF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50U2VjcmV0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy50ZW5hbnRJZCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgICB0eXBlOiAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGNsaWVudElkOiBvcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgY2xpZW50U2VjcmV0OiBvcHRpb25zLmNsaWVudFNlY3JldCxcbiAgICAgICAgICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKG9wdGlvbnMudXNlck5hbWUgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb3B0aW9ucy51c2VyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcuYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5wYXNzd29yZCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLnBhc3N3b3JkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5hdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF1dGhlbnRpY2F0aW9uID0ge1xuICAgICAgICAgIHR5cGU6ICdkZWZhdWx0JyxcbiAgICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICB1c2VyTmFtZTogb3B0aW9ucy51c2VyTmFtZSxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBvcHRpb25zLnBhc3N3b3JkXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhdXRoZW50aWNhdGlvbiA9IHtcbiAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdXNlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgICBwYXNzd29yZDogdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICBzZXJ2ZXI6IGNvbmZpZy5zZXJ2ZXIsXG4gICAgICBhdXRoZW50aWNhdGlvbjogYXV0aGVudGljYXRpb24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIGFib3J0VHJhbnNhY3Rpb25PbkVycm9yOiBmYWxzZSxcbiAgICAgICAgYXBwTmFtZTogdW5kZWZpbmVkLFxuICAgICAgICBjYW1lbENhc2VDb2x1bW5zOiBmYWxzZSxcbiAgICAgICAgY2FuY2VsVGltZW91dDogREVGQVVMVF9DQU5DRUxfVElNRU9VVCxcbiAgICAgICAgY29sdW1uRW5jcnlwdGlvbktleUNhY2hlVFRMOiAyICogNjAgKiA2MCAqIDEwMDAsICAvLyBVbml0czogbWlsaXNlY29uZHNcbiAgICAgICAgY29sdW1uRW5jcnlwdGlvblNldHRpbmc6IGZhbHNlLFxuICAgICAgICBjb2x1bW5OYW1lUmVwbGFjZXI6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ubmVjdGlvblJldHJ5SW50ZXJ2YWw6IERFRkFVTFRfQ09OTkVDVF9SRVRSWV9JTlRFUlZBTCxcbiAgICAgICAgY29ubmVjdFRpbWVvdXQ6IERFRkFVTFRfQ09OTkVDVF9USU1FT1VULFxuICAgICAgICBjb25uZWN0b3I6IHVuZGVmaW5lZCxcbiAgICAgICAgY29ubmVjdGlvbklzb2xhdGlvbkxldmVsOiBJU09MQVRJT05fTEVWRUwuUkVBRF9DT01NSVRURUQsXG4gICAgICAgIGNyeXB0b0NyZWRlbnRpYWxzRGV0YWlsczoge30sXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICAgIGRhdGVmaXJzdDogREVGQVVMVF9EQVRFRklSU1QsXG4gICAgICAgIGRhdGVGb3JtYXQ6IERFRkFVTFRfREFURUZPUk1BVCxcbiAgICAgICAgZGVidWc6IHtcbiAgICAgICAgICBkYXRhOiBmYWxzZSxcbiAgICAgICAgICBwYWNrZXQ6IGZhbHNlLFxuICAgICAgICAgIHBheWxvYWQ6IGZhbHNlLFxuICAgICAgICAgIHRva2VuOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBlbmFibGVBbnNpTnVsbDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaU51bGxEZWZhdWx0OiB0cnVlLFxuICAgICAgICBlbmFibGVBbnNpUGFkZGluZzogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQW5zaVdhcm5pbmdzOiB0cnVlLFxuICAgICAgICBlbmFibGVBcml0aEFib3J0OiB0cnVlLFxuICAgICAgICBlbmFibGVDb25jYXROdWxsWWllbGRzTnVsbDogdHJ1ZSxcbiAgICAgICAgZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdDogbnVsbCxcbiAgICAgICAgZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnM6IGZhbHNlLFxuICAgICAgICBlbmFibGVOdW1lcmljUm91bmRhYm9ydDogZmFsc2UsXG4gICAgICAgIGVuYWJsZVF1b3RlZElkZW50aWZpZXI6IHRydWUsXG4gICAgICAgIGVuY3J5cHQ6IHRydWUsXG4gICAgICAgIGZhbGxiYWNrVG9EZWZhdWx0RGI6IGZhbHNlLFxuICAgICAgICBlbmNyeXB0aW9uS2V5U3RvcmVQcm92aWRlcnM6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zdGFuY2VOYW1lOiB1bmRlZmluZWQsXG4gICAgICAgIGlzb2xhdGlvbkxldmVsOiBJU09MQVRJT05fTEVWRUwuUkVBRF9DT01NSVRURUQsXG4gICAgICAgIGxhbmd1YWdlOiBERUZBVUxUX0xBTkdVQUdFLFxuICAgICAgICBsb2NhbEFkZHJlc3M6IHVuZGVmaW5lZCxcbiAgICAgICAgbWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzOiAzLFxuICAgICAgICBtdWx0aVN1Ym5ldEZhaWxvdmVyOiBmYWxzZSxcbiAgICAgICAgcGFja2V0U2l6ZTogREVGQVVMVF9QQUNLRVRfU0laRSxcbiAgICAgICAgcG9ydDogREVGQVVMVF9QT1JULFxuICAgICAgICByZWFkT25seUludGVudDogZmFsc2UsXG4gICAgICAgIHJlcXVlc3RUaW1lb3V0OiBERUZBVUxUX0NMSUVOVF9SRVFVRVNUX1RJTUVPVVQsXG4gICAgICAgIHJvd0NvbGxlY3Rpb25PbkRvbmU6IGZhbHNlLFxuICAgICAgICByb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjogZmFsc2UsXG4gICAgICAgIHNlcnZlck5hbWU6IHVuZGVmaW5lZCxcbiAgICAgICAgc2VydmVyU3VwcG9ydHNDb2x1bW5FbmNyeXB0aW9uOiBmYWxzZSxcbiAgICAgICAgdGRzVmVyc2lvbjogREVGQVVMVF9URFNfVkVSU0lPTixcbiAgICAgICAgdGV4dHNpemU6IERFRkFVTFRfVEVYVFNJWkUsXG4gICAgICAgIHRydXN0ZWRTZXJ2ZXJOYW1lQUU6IHVuZGVmaW5lZCxcbiAgICAgICAgdHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZTogZmFsc2UsXG4gICAgICAgIHVzZUNvbHVtbk5hbWVzOiBmYWxzZSxcbiAgICAgICAgdXNlVVRDOiB0cnVlLFxuICAgICAgICB3b3Jrc3RhdGlvbklkOiB1bmRlZmluZWQsXG4gICAgICAgIGxvd2VyQ2FzZUd1aWRzOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLm9wdGlvbnMpIHtcbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wb3J0ICYmIGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BvcnQgYW5kIGluc3RhbmNlTmFtZSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCBidXQgJyArIGNvbmZpZy5vcHRpb25zLnBvcnQgKyAnIGFuZCAnICsgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICsgJyBwcm92aWRlZCcpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmFib3J0VHJhbnNhY3Rpb25PbkVycm9yICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvclwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcgb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPSBjb25maWcub3B0aW9ucy5hYm9ydFRyYW5zYWN0aW9uT25FcnJvcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmFwcE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmFwcE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuYXBwTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmFwcE5hbWUgPSBjb25maWcub3B0aW9ucy5hcHBOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1uc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jYW1lbENhc2VDb2x1bW5zID0gY29uZmlnLm9wdGlvbnMuY2FtZWxDYXNlQ29sdW1ucztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXQgPSBjb25maWcub3B0aW9ucy5jYW5jZWxUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyID0gY29uZmlnLm9wdGlvbnMuY29sdW1uTmFtZVJlcGxhY2VyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0VmFsaWRJc29sYXRpb25MZXZlbChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwsICdjb25maWcub3B0aW9ucy5jb25uZWN0aW9uSXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dCAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5jb25uZWN0VGltZW91dFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0ID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3RvciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3RvclwiIHByb3BlcnR5IG11c3QgYmUgYSBmdW5jdGlvbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yID0gY29uZmlnLm9wdGlvbnMuY29ubmVjdG9yO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY3J5cHRvQ3JlZGVudGlhbHNEZXRhaWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHMgIT09ICdvYmplY3QnIHx8IGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyA9PT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlsc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscyA9IGNvbmZpZy5vcHRpb25zLmNyeXB0b0NyZWRlbnRpYWxzRGV0YWlscztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGFiYXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5kYXRhYmFzZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRhYmFzZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGFiYXNlID0gY29uZmlnLm9wdGlvbnMuZGF0YWJhc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCAhPT0gJ251bWJlcicgJiYgY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwgJiYgKGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCA8IDEgfHwgY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0ID4gNykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0XCIgcHJvcGVydHkgbXVzdCBiZSA+PSAxIGFuZCA8PSA3Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdCA9IGNvbmZpZy5vcHRpb25zLmRhdGVmaXJzdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09ICdzdHJpbmcnICYmIGNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kYXRlRm9ybWF0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZyBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5kYXRlRm9ybWF0ID0gY29uZmlnLm9wdGlvbnMuZGF0ZUZvcm1hdDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGEgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcuZGF0YSA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcucGFja2V0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5kZWJ1Zy5wYWNrZXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldCA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLnBhY2tldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5kZWJ1Zy5wYXlsb2FkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZGVidWcucGF5bG9hZCA9IGNvbmZpZy5vcHRpb25zLmRlYnVnLnBheWxvYWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW4gIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW5cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnLnRva2VuID0gY29uZmlnLm9wdGlvbnMuZGVidWcudG9rZW47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lOdWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbiBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVBhZGRpbmcgPSBjb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZztcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaVdhcm5pbmdzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCAhPT0gJ2Jvb2xlYW4nICYmIGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVBcml0aEFib3J0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9IGNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPSBjb25maWcub3B0aW9ucy5lbmFibGVDb25jYXROdWxsWWllbGRzTnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdFwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUN1cnNvckNsb3NlT25Db21taXQgPSBjb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zICE9PSAnYm9vbGVhbicgJiYgY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9uc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUltcGxpY2l0VHJhbnNhY3Rpb25zID0gY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydCAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4gb3IgbnVsbC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPSBjb25maWcub3B0aW9ucy5lbmFibGVOdW1lcmljUm91bmRhYm9ydDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgIT09ICdib29sZWFuJyAmJiBjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllclwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZVF1b3RlZElkZW50aWZpZXIgPSBjb25maWcub3B0aW9ucy5lbmFibGVRdW90ZWRJZGVudGlmaWVyO1xuICAgICAgfVxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmVuY3J5cHQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIGlmIChjb25maWcub3B0aW9ucy5lbmNyeXB0ICE9PSAnc3RyaWN0Jykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiZW5jcnlwdFwiIHByb3BlcnR5IG11c3QgYmUgc2V0IHRvIFwic3RyaWN0XCIsIG9yIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgPSBjb25maWcub3B0aW9ucy5lbmNyeXB0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYlwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiID0gY29uZmlnLm9wdGlvbnMuZmFsbGJhY2tUb0RlZmF1bHREYjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSA9IGNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZTtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsLCAnY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmlzb2xhdGlvbkxldmVsID0gY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWw7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2UgIT09ICdzdHJpbmcnICYmIGNvbmZpZy5vcHRpb25zLmxhbmd1YWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2VcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nIG9yIG51bGwuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlID0gY29uZmlnLm9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzcyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3NcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3MgPSBjb25maWcub3B0aW9ucy5sb2NhbEFkZHJlc3M7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIgPSBjb25maWcub3B0aW9ucy5tdWx0aVN1Ym5ldEZhaWxvdmVyO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5wYWNrZXRTaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSA9IGNvbmZpZy5vcHRpb25zLnBhY2tldFNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5wb3J0ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnBvcnQgPD0gMCB8fCBjb25maWcub3B0aW9ucy5wb3J0ID49IDY1NTM2KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnBvcnRcIiBwcm9wZXJ0eSBtdXN0IGJlID4gMCBhbmQgPCA2NTUzNicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID0gY29uZmlnLm9wdGlvbnMucG9ydDtcbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5pbnN0YW5jZU5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZWFkT25seUludGVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50XCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50ID0gY29uZmlnLm9wdGlvbnMucmVhZE9ubHlJbnRlbnQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yZXF1ZXN0VGltZW91dCA9IGNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5tYXhSZXRyaWVzT25UcmFuc2llbnRFcnJvcnMgPCAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzXCIgcHJvcGVydHkgbXVzdCBiZSBlcXVhbCBvciBncmVhdGVyIHRoYW4gMC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzID0gY29uZmlnLm9wdGlvbnMubWF4UmV0cmllc09uVHJhbnNpZW50RXJyb3JzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlci4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA8PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvblJldHJ5SW50ZXJ2YWxcIiBwcm9wZXJ0eSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCA9IGNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25SZXRyeUludGVydmFsO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZVwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25Eb25lID0gY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uRG9uZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnJvd0NvbGxlY3Rpb25PblJlcXVlc3RDb21wbGV0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbiAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb25cIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMucm93Q29sbGVjdGlvbk9uUmVxdWVzdENvbXBsZXRpb24gPSBjb25maWcub3B0aW9ucy5yb3dDb2xsZWN0aW9uT25SZXF1ZXN0Q29tcGxldGlvbjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvblwiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPSBjb25maWcub3B0aW9ucy50ZHNWZXJzaW9uO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudGV4dHNpemUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSAnbnVtYmVyJyAmJiBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIG51bWJlciBvciBudWxsLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLnRleHRzaXplID4gMjE0NzQ4MzY0Nykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnRleHRzaXplXCIgY2FuXFwndCBiZSBncmVhdGVyIHRoYW4gMjE0NzQ4MzY0Ny4nKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcub3B0aW9ucy50ZXh0c2l6ZSA8IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMudGV4dHNpemVcIiBjYW5cXCd0IGJlIHNtYWxsZXIgdGhhbiAtMS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemUgPSBjb25maWcub3B0aW9ucy50ZXh0c2l6ZSB8IDA7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIGJvb2xlYW4uJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnRydXN0U2VydmVyQ2VydGlmaWNhdGUgPSBjb25maWcub3B0aW9ucy50cnVzdFNlcnZlckNlcnRpZmljYXRlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy5zZXJ2ZXJOYW1lXCIgcHJvcGVydHkgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbmZpZy5vcHRpb25zLnNlcnZlck5hbWUgPSBjb25maWcub3B0aW9ucy5zZXJ2ZXJOYW1lO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudXNlQ29sdW1uTmFtZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgXCJjb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lc1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy51c2VDb2x1bW5OYW1lcyA9IGNvbmZpZy5vcHRpb25zLnVzZUNvbHVtbk5hbWVzO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29uZmlnLm9wdGlvbnMudXNlVVRDICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy51c2VVVEMgIT09ICdib29sZWFuJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLnVzZVVUQ1wiIHByb3BlcnR5IG11c3QgYmUgb2YgdHlwZSBib29sZWFuLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy51c2VVVEMgPSBjb25maWcub3B0aW9ucy51c2VVVEM7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSBcImNvbmZpZy5vcHRpb25zLndvcmtzdGF0aW9uSWRcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgc3RyaW5nLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWcub3B0aW9ucy53b3Jrc3RhdGlvbklkID0gY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbmZpZy5vcHRpb25zLmxvd2VyQ2FzZUd1aWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcyAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwiY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHNcIiBwcm9wZXJ0eSBtdXN0IGJlIG9mIHR5cGUgYm9vbGVhbi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlnLm9wdGlvbnMubG93ZXJDYXNlR3VpZHMgPSBjb25maWcub3B0aW9ucy5sb3dlckNhc2VHdWlkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zID0gdGhpcy5jb25maWcub3B0aW9ucy5jcnlwdG9DcmVkZW50aWFsc0RldGFpbHM7XG4gICAgaWYgKHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMuc2VjdXJlT3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBJZiB0aGUgY2FsbGVyIGhhcyBub3Qgc3BlY2lmaWVkIHRoZWlyIG93biBgc2VjdXJlT3B0aW9uc2AsXG4gICAgICAvLyB3ZSBzZXQgYFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFNgIGhlcmUuXG4gICAgICAvLyBPbGRlciBTUUwgU2VydmVyIGluc3RhbmNlcyBydW5uaW5nIG9uIG9sZGVyIFdpbmRvd3MgdmVyc2lvbnMgaGF2ZVxuICAgICAgLy8gdHJvdWJsZSB3aXRoIHRoZSBCRUFTVCB3b3JrYXJvdW5kIGluIE9wZW5TU0wuXG4gICAgICAvLyBBcyBCRUFTVCBpcyBhIGJyb3dzZXIgc3BlY2lmaWMgZXhwbG9pdCwgd2UgY2FuIGp1c3QgZGlzYWJsZSB0aGlzIG9wdGlvbiBoZXJlLlxuICAgICAgdGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucyA9IE9iamVjdC5jcmVhdGUodGhpcy5zZWN1cmVDb250ZXh0T3B0aW9ucywge1xuICAgICAgICBzZWN1cmVPcHRpb25zOiB7XG4gICAgICAgICAgdmFsdWU6IGNvbnN0YW50cy5TU0xfT1BfRE9OVF9JTlNFUlRfRU1QVFlfRlJBR01FTlRTXG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcgPSB0aGlzLmNyZWF0ZURlYnVnKCk7XG4gICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzID0gW0J1ZmZlci5mcm9tKFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSldO1xuXG4gICAgLy8gJ2JlZ2luVHJhbnNhY3Rpb24nLCAnY29tbWl0VHJhbnNhY3Rpb24nIGFuZCAncm9sbGJhY2tUcmFuc2FjdGlvbidcbiAgICAvLyBldmVudHMgYXJlIHV0aWxpemVkIHRvIG1haW50YWluIGluVHJhbnNhY3Rpb24gcHJvcGVydHkgc3RhdGUgd2hpY2ggaW5cbiAgICAvLyB0dXJuIGlzIHVzZWQgaW4gbWFuYWdpbmcgdHJhbnNhY3Rpb25zLiBUaGVzZSBldmVudHMgYXJlIG9ubHkgZmlyZWQgZm9yXG4gICAgLy8gVERTIHZlcnNpb24gNy4yIGFuZCBiZXlvbmQuIFRoZSBwcm9wZXJ0aWVzIGJlbG93IGFyZSB1c2VkIHRvIGVtdWxhdGVcbiAgICAvLyBlcXVpdmFsZW50IGJlaGF2aW9yIGZvciBURFMgdmVyc2lvbnMgYmVmb3JlIDcuMi5cbiAgICB0aGlzLnRyYW5zYWN0aW9uRGVwdGggPSAwO1xuICAgIHRoaXMuaXNTcWxCYXRjaCA9IGZhbHNlO1xuICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7XG4gICAgdGhpcy5tZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgdGhpcy5jdXJUcmFuc2llbnRSZXRyeUNvdW50ID0gMDtcbiAgICB0aGlzLnRyYW5zaWVudEVycm9yTG9va3VwID0gbmV3IFRyYW5zaWVudEVycm9yTG9va3VwKCk7XG5cbiAgICB0aGlzLnN0YXRlID0gdGhpcy5TVEFURS5JTklUSUFMSVpFRDtcblxuICAgIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQgPSAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkFUVEVOVElPTik7XG4gICAgICB0aGlzLmNyZWF0ZUNhbmNlbFRpbWVyKCk7XG4gICAgfTtcbiAgfVxuXG4gIGNvbm5lY3QoY29ubmVjdExpc3RlbmVyPzogKGVycj86IEVycm9yKSA9PiB2b2lkKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuU1RBVEUuSU5JVElBTElaRUQpIHtcbiAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoJ2AuY29ubmVjdGAgY2FuIG5vdCBiZSBjYWxsZWQgb24gYSBDb25uZWN0aW9uIGluIGAnICsgdGhpcy5zdGF0ZS5uYW1lICsgJ2Agc3RhdGUuJyk7XG4gICAgfVxuXG4gICAgaWYgKGNvbm5lY3RMaXN0ZW5lcikge1xuICAgICAgY29uc3Qgb25Db25uZWN0ID0gKGVycj86IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIGNvbm5lY3RMaXN0ZW5lcihlcnIpO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25FcnJvciA9IChlcnI6IEVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgICBjb25uZWN0TGlzdGVuZXIoZXJyKTtcbiAgICAgIH07XG5cbiAgICAgIHRoaXMub25jZSgnY29ubmVjdCcsIG9uQ29ubmVjdCk7XG4gICAgICB0aGlzLm9uY2UoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBjaGFyc2V0IGhhcyBjaGFuZ2VkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdjaGFyc2V0Q2hhbmdlJywgbGlzdGVuZXI6IChjaGFyc2V0OiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBhdHRlbXB0IHRvIGNvbm5lY3QgYW5kIHZhbGlkYXRlIGhhcyBjb21wbGV0ZWQuXG4gICAqL1xuICBvbihcbiAgICBldmVudDogJ2Nvbm5lY3QnLFxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlcnIgSWYgc3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCwgd2lsbCBiZSBmYWxzZXkuIElmIHRoZXJlIHdhcyBhXG4gICAgICogICBwcm9ibGVtICh3aXRoIGVpdGhlciBjb25uZWN0aW5nIG9yIHZhbGlkYXRpb24pLCB3aWxsIGJlIGFuIFtbRXJyb3JdXSBvYmplY3QuXG4gICAgICovXG4gICAgbGlzdGVuZXI6IChlcnI6IEVycm9yIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgcmVwb3J0ZWQgdGhhdCB0aGUgYWN0aXZlIGRhdGFiYXNlIGhhcyBjaGFuZ2VkLlxuICAgKiBUaGlzIG1heSBiZSBhcyBhIHJlc3VsdCBvZiBhIHN1Y2Nlc3NmdWwgbG9naW4sIG9yIGEgYHVzZWAgc3RhdGVtZW50LlxuICAgKi9cbiAgb24oZXZlbnQ6ICdkYXRhYmFzZUNoYW5nZScsIGxpc3RlbmVyOiAoZGF0YWJhc2VOYW1lOiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEEgZGVidWcgbWVzc2FnZSBpcyBhdmFpbGFibGUuIEl0IG1heSBiZSBsb2dnZWQgb3IgaWdub3JlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnZGVidWcnLCBsaXN0ZW5lcjogKG1lc3NhZ2VUZXh0OiBzdHJpbmcpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIEludGVybmFsIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIG9uKGV2ZW50OiAnZXJyb3InLCBsaXN0ZW5lcjogKGVycjogRXJyb3IpID0+IHZvaWQpOiB0aGlzXG5cbiAgLyoqXG4gICAqIFRoZSBzZXJ2ZXIgaGFzIGlzc3VlZCBhbiBlcnJvciBtZXNzYWdlLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlcnJvck1lc3NhZ2UnLCBsaXN0ZW5lcjogKG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkVycm9yTWVzc2FnZVRva2VuKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiBoYXMgZW5kZWQuXG4gICAqXG4gICAqIFRoaXMgbWF5IGJlIGFzIGEgcmVzdWx0IG9mIHRoZSBjbGllbnQgY2FsbGluZyBbW2Nsb3NlXV0sIHRoZSBzZXJ2ZXJcbiAgICogY2xvc2luZyB0aGUgY29ubmVjdGlvbiwgb3IgYSBuZXR3b3JrIGVycm9yLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdlbmQnLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXNcblxuICAvKipcbiAgICogVGhlIHNlcnZlciBoYXMgaXNzdWVkIGFuIGluZm9ybWF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICBvbihldmVudDogJ2luZm9NZXNzYWdlJywgbGlzdGVuZXI6IChtZXNzYWdlOiBpbXBvcnQoJy4vdG9rZW4vdG9rZW4nKS5JbmZvTWVzc2FnZVRva2VuKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVyIGhhcyByZXBvcnRlZCB0aGF0IHRoZSBsYW5ndWFnZSBoYXMgY2hhbmdlZC5cbiAgICovXG4gIG9uKGV2ZW50OiAnbGFuZ3VhZ2VDaGFuZ2UnLCBsaXN0ZW5lcjogKGxhbmd1YWdlTmFtZTogc3RyaW5nKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBUaGUgY29ubmVjdGlvbiB3YXMgcmVzZXQuXG4gICAqL1xuICBvbihldmVudDogJ3Jlc2V0Q29ubmVjdGlvbicsIGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogdGhpc1xuXG4gIC8qKlxuICAgKiBBIHNlY3VyZSBjb25uZWN0aW9uIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKi9cbiAgb24oZXZlbnQ6ICdzZWN1cmUnLCBsaXN0ZW5lcjogKGNsZWFydGV4dDogaW1wb3J0KCd0bHMnKS5UTFNTb2NrZXQpID0+IHZvaWQpOiB0aGlzXG5cbiAgb24oZXZlbnQ6IHN0cmluZyB8IHN5bWJvbCwgbGlzdGVuZXI6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCkge1xuICAgIHJldHVybiBzdXBlci5vbihldmVudCwgbGlzdGVuZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnY2hhcnNldENoYW5nZScsIGNoYXJzZXQ6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnY29ubmVjdCcsIGVycm9yPzogRXJyb3IpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2RhdGFiYXNlQ2hhbmdlJywgZGF0YWJhc2VOYW1lOiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2RlYnVnJywgbWVzc2FnZVRleHQ6IHN0cmluZyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAnZXJyb3InLCBlcnJvcjogRXJyb3IpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2Vycm9yTWVzc2FnZScsIG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkVycm9yTWVzc2FnZVRva2VuKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdlbmQnKTogYm9vbGVhblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGVtaXQoZXZlbnQ6ICdpbmZvTWVzc2FnZScsIG1lc3NhZ2U6IGltcG9ydCgnLi90b2tlbi90b2tlbicpLkluZm9NZXNzYWdlVG9rZW4pOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ2xhbmd1YWdlQ2hhbmdlJywgbGFuZ3VhZ2VOYW1lOiBzdHJpbmcpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3NlY3VyZScsIGNsZWFydGV4dDogaW1wb3J0KCd0bHMnKS5UTFNTb2NrZXQpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3Jlcm91dGluZycpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3Jlc2V0Q29ubmVjdGlvbicpOiBib29sZWFuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZW1pdChldmVudDogJ3JldHJ5Jyk6IGJvb2xlYW5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBlbWl0KGV2ZW50OiAncm9sbGJhY2tUcmFuc2FjdGlvbicpOiBib29sZWFuXG5cbiAgZW1pdChldmVudDogc3RyaW5nIHwgc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSkge1xuICAgIHJldHVybiBzdXBlci5lbWl0KGV2ZW50LCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGRhdGFiYXNlLlxuICAgKlxuICAgKiBUaGUgW1tFdmVudF9lbmRdXSB3aWxsIGJlIGVtaXR0ZWQgb25jZSB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQuXG4gICAqL1xuICBjbG9zZSgpIHtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgaW5pdGlhbGlzZUNvbm5lY3Rpb24oKSB7XG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5jcmVhdGVDb25uZWN0VGltZXIoKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RPblBvcnQodGhpcy5jb25maWcub3B0aW9ucy5wb3J0LCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2VMb29rdXAoe1xuICAgICAgICBzZXJ2ZXI6IHRoaXMuY29uZmlnLnNlcnZlcixcbiAgICAgICAgaW5zdGFuY2VOYW1lOiB0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZSEsXG4gICAgICAgIHRpbWVvdXQ6IHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQsXG4gICAgICAgIHNpZ25hbDogc2lnbmFsXG4gICAgICB9KS50aGVuKChwb3J0KSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY29ubmVjdE9uUG9ydChwb3J0LCB0aGlzLmNvbmZpZy5vcHRpb25zLm11bHRpU3VibmV0RmFpbG92ZXIsIHNpZ25hbCwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0b3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0sIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy5jbGVhckNvbm5lY3RUaW1lcigpO1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICAgIC8vIElnbm9yZSB0aGUgQWJvcnRFcnJvciBmb3Igbm93LCB0aGlzIGlzIHN0aWxsIGhhbmRsZWQgYnkgdGhlIGNvbm5lY3RUaW1lciBmaXJpbmdcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKGVyci5tZXNzYWdlLCAnRUlOU1RMT09LVVAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbGVhbnVwQ29ubmVjdGlvbihjbGVhbnVwVHlwZTogdHlwZW9mIENMRUFOVVBfVFlQRVtrZXlvZiB0eXBlb2YgQ0xFQU5VUF9UWVBFXSkge1xuICAgIGlmICghdGhpcy5jbG9zZWQpIHtcbiAgICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJSZXF1ZXN0VGltZXIoKTtcbiAgICAgIHRoaXMuY2xlYXJSZXRyeVRpbWVyKCk7XG4gICAgICB0aGlzLmNsb3NlQ29ubmVjdGlvbigpO1xuICAgICAgaWYgKGNsZWFudXBUeXBlID09PSBDTEVBTlVQX1RZUEUuUkVESVJFQ1QpIHtcbiAgICAgICAgdGhpcy5lbWl0KCdyZXJvdXRpbmcnKTtcbiAgICAgIH0gZWxzZSBpZiAoY2xlYW51cFR5cGUgIT09IENMRUFOVVBfVFlQRS5SRVRSWSkge1xuICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ2VuZCcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdDtcbiAgICAgIGlmIChyZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IGVyciA9IG5ldyBSZXF1ZXN0RXJyb3IoJ0Nvbm5lY3Rpb24gY2xvc2VkIGJlZm9yZSByZXF1ZXN0IGNvbXBsZXRlZC4nLCAnRUNMT1NFJyk7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG4gICAgICB0aGlzLmxvZ2luRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVEZWJ1ZygpIHtcbiAgICBjb25zdCBkZWJ1ZyA9IG5ldyBEZWJ1Zyh0aGlzLmNvbmZpZy5vcHRpb25zLmRlYnVnKTtcbiAgICBkZWJ1Zy5vbignZGVidWcnLCAobWVzc2FnZSkgPT4ge1xuICAgICAgdGhpcy5lbWl0KCdkZWJ1ZycsIG1lc3NhZ2UpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZWJ1ZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZTogTWVzc2FnZSwgaGFuZGxlcjogVG9rZW5IYW5kbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCB0aGlzLmRlYnVnLCBoYW5kbGVyLCB0aGlzLmNvbmZpZy5vcHRpb25zKTtcbiAgfVxuXG4gIHNvY2tldEhhbmRsaW5nRm9yU2VuZFByZUxvZ2luKHNvY2tldDogbmV0LlNvY2tldCkge1xuICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyb3IpID0+IHsgdGhpcy5zb2NrZXRFcnJvcihlcnJvcik7IH0pO1xuICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7IHRoaXMuc29ja2V0Q2xvc2UoKTsgfSk7XG4gICAgc29ja2V0Lm9uKCdlbmQnLCAoKSA9PiB7IHRoaXMuc29ja2V0RW5kKCk7IH0pO1xuICAgIHNvY2tldC5zZXRLZWVwQWxpdmUodHJ1ZSwgS0VFUF9BTElWRV9JTklUSUFMX0RFTEFZKTtcblxuICAgIHRoaXMubWVzc2FnZUlvID0gbmV3IE1lc3NhZ2VJTyhzb2NrZXQsIHRoaXMuY29uZmlnLm9wdGlvbnMucGFja2V0U2l6ZSwgdGhpcy5kZWJ1Zyk7XG4gICAgdGhpcy5tZXNzYWdlSW8ub24oJ3NlY3VyZScsIChjbGVhcnRleHQpID0+IHsgdGhpcy5lbWl0KCdzZWN1cmUnLCBjbGVhcnRleHQpOyB9KTtcblxuICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuXG4gICAgdGhpcy5jbG9zZWQgPSBmYWxzZTtcbiAgICB0aGlzLmRlYnVnLmxvZygnY29ubmVjdGVkIHRvICcgKyB0aGlzLmNvbmZpZy5zZXJ2ZXIgKyAnOicgKyB0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnQpO1xuXG4gICAgdGhpcy5zZW5kUHJlTG9naW4oKTtcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfUFJFTE9HSU4pO1xuICB9XG5cbiAgd3JhcFdpdGhUbHMoc29ja2V0OiBuZXQuU29ja2V0KTogUHJvbWlzZTx0bHMuVExTU29ja2V0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHNlY3VyZUNvbnRleHQgPSB0bHMuY3JlYXRlU2VjdXJlQ29udGV4dCh0aGlzLnNlY3VyZUNvbnRleHRPcHRpb25zKTtcbiAgICAgIC8vIElmIGNvbm5lY3QgdG8gYW4gaXAgYWRkcmVzcyBkaXJlY3RseSxcbiAgICAgIC8vIG5lZWQgdG8gc2V0IHRoZSBzZXJ2ZXJuYW1lIHRvIGFuIGVtcHR5IHN0cmluZ1xuICAgICAgLy8gaWYgdGhlIHVzZXIgaGFzIG5vdCBnaXZlbiBhIHNlcnZlcm5hbWUgZXhwbGljaXRseVxuICAgICAgY29uc3Qgc2VydmVyTmFtZSA9ICFuZXQuaXNJUCh0aGlzLmNvbmZpZy5zZXJ2ZXIpID8gdGhpcy5jb25maWcuc2VydmVyIDogJyc7XG4gICAgICBjb25zdCBlbmNyeXB0T3B0aW9ucyA9IHtcbiAgICAgICAgaG9zdDogdGhpcy5jb25maWcuc2VydmVyLFxuICAgICAgICBzb2NrZXQ6IHNvY2tldCxcbiAgICAgICAgQUxQTlByb3RvY29sczogWyd0ZHMvOC4wJ10sXG4gICAgICAgIHNlY3VyZUNvbnRleHQ6IHNlY3VyZUNvbnRleHQsXG4gICAgICAgIHNlcnZlcm5hbWU6IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA/IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA6IHNlcnZlck5hbWUsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNyeXB0c29ja2V0ID0gdGxzLmNvbm5lY3QoZW5jcnlwdE9wdGlvbnMsICgpID0+IHtcbiAgICAgICAgZW5jcnlwdHNvY2tldC5yZW1vdmVMaXN0ZW5lcignZXJyb3InLCByZWplY3QpO1xuICAgICAgICByZXNvbHZlKGVuY3J5cHRzb2NrZXQpO1xuICAgICAgfSk7XG5cbiAgICAgIGVuY3J5cHRzb2NrZXQub25jZSgnZXJyb3InLCByZWplY3QpO1xuICAgIH0pO1xuICB9XG5cbiAgY29ubmVjdE9uUG9ydChwb3J0OiBudW1iZXIsIG11bHRpU3VibmV0RmFpbG92ZXI6IGJvb2xlYW4sIHNpZ25hbDogQWJvcnRTaWduYWwsIGN1c3RvbUNvbm5lY3Rvcj86ICgpID0+IFByb21pc2U8bmV0LlNvY2tldD4pIHtcbiAgICBjb25zdCBjb25uZWN0T3B0cyA9IHtcbiAgICAgIGhvc3Q6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcixcbiAgICAgIHBvcnQ6IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnBvcnQgOiBwb3J0LFxuICAgICAgbG9jYWxBZGRyZXNzOiB0aGlzLmNvbmZpZy5vcHRpb25zLmxvY2FsQWRkcmVzc1xuICAgIH07XG5cbiAgICBjb25zdCBjb25uZWN0ID0gY3VzdG9tQ29ubmVjdG9yIHx8IChtdWx0aVN1Ym5ldEZhaWxvdmVyID8gY29ubmVjdEluUGFyYWxsZWwgOiBjb25uZWN0SW5TZXF1ZW5jZSk7XG5cbiAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgbGV0IHNvY2tldCA9IGF3YWl0IGNvbm5lY3QoY29ubmVjdE9wdHMsIGRucy5sb29rdXAsIHNpZ25hbCk7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgPT09ICdzdHJpY3QnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gV3JhcCB0aGUgc29ja2V0IHdpdGggVExTIGZvciBURFMgOC4wXG4gICAgICAgICAgc29ja2V0ID0gYXdhaXQgdGhpcy53cmFwV2l0aFRscyhzb2NrZXQpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBzb2NrZXQuZW5kKCk7XG5cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zb2NrZXRIYW5kbGluZ0ZvclNlbmRQcmVMb2dpbihzb2NrZXQpO1xuICAgIH0pKCkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgdGhpcy5jbGVhckNvbm5lY3RUaW1lcigpO1xuXG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4geyB0aGlzLnNvY2tldEVycm9yKGVycik7IH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjbG9zZUNvbm5lY3Rpb24oKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB7XG4gICAgICB0aGlzLnNvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjcmVhdGVDb25uZWN0VGltZXIoKSB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICB0aGlzLmNvbm5lY3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgdGhpcy5jb25uZWN0VGltZW91dCgpO1xuICAgIH0sIHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdFRpbWVvdXQpO1xuICAgIHJldHVybiBjb250cm9sbGVyLnNpZ25hbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY3JlYXRlQ2FuY2VsVGltZXIoKSB7XG4gICAgdGhpcy5jbGVhckNhbmNlbFRpbWVyKCk7XG4gICAgY29uc3QgdGltZW91dCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuY2FuY2VsVGltZW91dDtcbiAgICBpZiAodGltZW91dCA+IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYW5jZWxUaW1lb3V0KCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVJlcXVlc3RUaW1lcigpIHtcbiAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7IC8vIHJlbGVhc2Ugb2xkIHRpbWVyLCBqdXN0IHRvIGJlIHNhZmVcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0IGFzIFJlcXVlc3Q7XG4gICAgY29uc3QgdGltZW91dCA9IChyZXF1ZXN0LnRpbWVvdXQgIT09IHVuZGVmaW5lZCkgPyByZXF1ZXN0LnRpbWVvdXQgOiB0aGlzLmNvbmZpZy5vcHRpb25zLnJlcXVlc3RUaW1lb3V0O1xuICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICB0aGlzLnJlcXVlc3RUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlcXVlc3RUaW1lb3V0KCk7XG4gICAgICB9LCB0aW1lb3V0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNyZWF0ZVJldHJ5VGltZXIoKSB7XG4gICAgdGhpcy5jbGVhclJldHJ5VGltZXIoKTtcbiAgICB0aGlzLnJldHJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMucmV0cnlUaW1lb3V0KCk7XG4gICAgfSwgdGhpcy5jb25maWcub3B0aW9ucy5jb25uZWN0aW9uUmV0cnlJbnRlcnZhbCk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNvbm5lY3RUaW1lb3V0KCkge1xuICAgIGNvbnN0IGhvc3RQb3N0Zml4ID0gdGhpcy5jb25maWcub3B0aW9ucy5wb3J0ID8gYDoke3RoaXMuY29uZmlnLm9wdGlvbnMucG9ydH1gIDogYFxcXFwke3RoaXMuY29uZmlnLm9wdGlvbnMuaW5zdGFuY2VOYW1lfWA7XG4gICAgLy8gSWYgd2UgaGF2ZSByb3V0aW5nIGRhdGEgc3RvcmVkLCB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVkaXJlY3RlZFxuICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCBwb3J0ID0gdGhpcy5yb3V0aW5nRGF0YSA/IGA6JHt0aGlzLnJvdXRpbmdEYXRhLnBvcnR9YCA6IGhvc3RQb3N0Zml4O1xuICAgIC8vIEdyYWIgdGhlIHRhcmdldCBob3N0IGZyb20gdGhlIGNvbm5lY3Rpb24gY29uZmlncmF0aW9uLCBhbmQgZnJvbSBhIHJlZGlyZWN0IG1lc3NhZ2VcbiAgICAvLyBvdGhlcndpc2UsIGxlYXZlIHRoZSBtZXNzYWdlIGVtcHR5LlxuICAgIGNvbnN0IHJvdXRpbmdNZXNzYWdlID0gdGhpcy5yb3V0aW5nRGF0YSA/IGAgKHJlZGlyZWN0ZWQgZnJvbSAke3RoaXMuY29uZmlnLnNlcnZlcn0ke2hvc3RQb3N0Zml4fSlgIDogJyc7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3NlcnZlcn0ke3BvcnR9JHtyb3V0aW5nTWVzc2FnZX0gaW4gJHt0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3RUaW1lb3V0fW1zYDtcbiAgICB0aGlzLmRlYnVnLmxvZyhtZXNzYWdlKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFVElNRU9VVCcpKTtcbiAgICB0aGlzLmNvbm5lY3RUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2Nvbm5lY3RUaW1lb3V0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNhbmNlbFRpbWVvdXQoKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY2FuY2VsIHJlcXVlc3QgaW4gJHt0aGlzLmNvbmZpZy5vcHRpb25zLmNhbmNlbFRpbWVvdXR9bXNgO1xuICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc29ja2V0RXJyb3InLCBuZXcgQ29ubmVjdGlvbkVycm9yKG1lc3NhZ2UsICdFVElNRU9VVCcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcmVxdWVzdFRpbWVvdXQoKSB7XG4gICAgdGhpcy5yZXF1ZXN0VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucmVxdWVzdCE7XG4gICAgcmVxdWVzdC5jYW5jZWwoKTtcbiAgICBjb25zdCB0aW1lb3V0ID0gKHJlcXVlc3QudGltZW91dCAhPT0gdW5kZWZpbmVkKSA/IHJlcXVlc3QudGltZW91dCA6IHRoaXMuY29uZmlnLm9wdGlvbnMucmVxdWVzdFRpbWVvdXQ7XG4gICAgY29uc3QgbWVzc2FnZSA9ICdUaW1lb3V0OiBSZXF1ZXN0IGZhaWxlZCB0byBjb21wbGV0ZSBpbiAnICsgdGltZW91dCArICdtcyc7XG4gICAgcmVxdWVzdC5lcnJvciA9IG5ldyBSZXF1ZXN0RXJyb3IobWVzc2FnZSwgJ0VUSU1FT1VUJyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHJldHJ5VGltZW91dCgpIHtcbiAgICB0aGlzLnJldHJ5VGltZXIgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5lbWl0KCdyZXRyeScpO1xuICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuQ09OTkVDVElORyk7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyQ29ubmVjdFRpbWVyKCkge1xuICAgIGlmICh0aGlzLmNvbm5lY3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY29ubmVjdFRpbWVyKTtcbiAgICAgIHRoaXMuY29ubmVjdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJDYW5jZWxUaW1lcigpIHtcbiAgICBpZiAodGhpcy5jYW5jZWxUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2FuY2VsVGltZXIpO1xuICAgICAgdGhpcy5jYW5jZWxUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIGNsZWFyUmVxdWVzdFRpbWVyKCkge1xuICAgIGlmICh0aGlzLnJlcXVlc3RUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVyKTtcbiAgICAgIHRoaXMucmVxdWVzdFRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgY2xlYXJSZXRyeVRpbWVyKCkge1xuICAgIGlmICh0aGlzLnJldHJ5VGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZXIpO1xuICAgICAgdGhpcy5yZXRyeVRpbWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgdHJhbnNpdGlvblRvKG5ld1N0YXRlOiBTdGF0ZSkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZXdTdGF0ZSkge1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1N0YXRlIGlzIGFscmVhZHkgJyArIG5ld1N0YXRlLm5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YXRlICYmIHRoaXMuc3RhdGUuZXhpdCkge1xuICAgICAgdGhpcy5zdGF0ZS5leGl0LmNhbGwodGhpcywgbmV3U3RhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuZGVidWcubG9nKCdTdGF0ZSBjaGFuZ2U6ICcgKyAodGhpcy5zdGF0ZSA/IHRoaXMuc3RhdGUubmFtZSA6ICd1bmRlZmluZWQnKSArICcgLT4gJyArIG5ld1N0YXRlLm5hbWUpO1xuICAgIHRoaXMuc3RhdGUgPSBuZXdTdGF0ZTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmVudGVyKSB7XG4gICAgICB0aGlzLnN0YXRlLmVudGVyLmFwcGx5KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0RXZlbnRIYW5kbGVyPFQgZXh0ZW5kcyBrZXlvZiBTdGF0ZVsnZXZlbnRzJ10+KGV2ZW50TmFtZTogVCk6IE5vbk51bGxhYmxlPFN0YXRlWydldmVudHMnXVtUXT4ge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnN0YXRlLmV2ZW50c1tldmVudE5hbWVdO1xuXG4gICAgaWYgKCFoYW5kbGVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGV2ZW50ICcke2V2ZW50TmFtZX0nIGluIHN0YXRlICcke3RoaXMuc3RhdGUubmFtZX0nYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhhbmRsZXIhO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBkaXNwYXRjaEV2ZW50PFQgZXh0ZW5kcyBrZXlvZiBTdGF0ZVsnZXZlbnRzJ10+KGV2ZW50TmFtZTogVCwgLi4uYXJnczogUGFyYW1ldGVyczxOb25OdWxsYWJsZTxTdGF0ZVsnZXZlbnRzJ11bVF0+Pikge1xuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnN0YXRlLmV2ZW50c1tldmVudE5hbWVdIGFzICgodGhpczogQ29ubmVjdGlvbiwgLi4uYXJnczogYW55W10pID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKGBObyBldmVudCAnJHtldmVudE5hbWV9JyBpbiBzdGF0ZSAnJHt0aGlzLnN0YXRlLm5hbWV9J2ApKTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldEVycm9yKGVycm9yOiBFcnJvcikge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSB0aGlzLlNUQVRFLkNPTk5FQ1RJTkcgfHwgdGhpcy5zdGF0ZSA9PT0gdGhpcy5TVEFURS5TRU5UX1RMU1NTTE5FR09USUFUSU9OKSB7XG4gICAgICBjb25zdCBob3N0UG9zdGZpeCA9IHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCA/IGA6JHt0aGlzLmNvbmZpZy5vcHRpb25zLnBvcnR9YCA6IGBcXFxcJHt0aGlzLmNvbmZpZy5vcHRpb25zLmluc3RhbmNlTmFtZX1gO1xuICAgICAgLy8gSWYgd2UgaGF2ZSByb3V0aW5nIGRhdGEgc3RvcmVkLCB0aGlzIGNvbm5lY3Rpb24gaGFzIGJlZW4gcmVkaXJlY3RlZFxuICAgICAgY29uc3Qgc2VydmVyID0gdGhpcy5yb3V0aW5nRGF0YSA/IHRoaXMucm91dGluZ0RhdGEuc2VydmVyIDogdGhpcy5jb25maWcuc2VydmVyO1xuICAgICAgY29uc3QgcG9ydCA9IHRoaXMucm91dGluZ0RhdGEgPyBgOiR7dGhpcy5yb3V0aW5nRGF0YS5wb3J0fWAgOiBob3N0UG9zdGZpeDtcbiAgICAgIC8vIEdyYWIgdGhlIHRhcmdldCBob3N0IGZyb20gdGhlIGNvbm5lY3Rpb24gY29uZmlncmF0aW9uLCBhbmQgZnJvbSBhIHJlZGlyZWN0IG1lc3NhZ2VcbiAgICAgIC8vIG90aGVyd2lzZSwgbGVhdmUgdGhlIG1lc3NhZ2UgZW1wdHkuXG4gICAgICBjb25zdCByb3V0aW5nTWVzc2FnZSA9IHRoaXMucm91dGluZ0RhdGEgPyBgIChyZWRpcmVjdGVkIGZyb20gJHt0aGlzLmNvbmZpZy5zZXJ2ZXJ9JHtob3N0UG9zdGZpeH0pYCA6ICcnO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBGYWlsZWQgdG8gY29ubmVjdCB0byAke3NlcnZlcn0ke3BvcnR9JHtyb3V0aW5nTWVzc2FnZX0gLSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCAnRVNPQ0tFVCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGBDb25uZWN0aW9uIGxvc3QgLSAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgJ0VTT0NLRVQnKSk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGF0Y2hFdmVudCgnc29ja2V0RXJyb3InLCBlcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHNvY2tldEVuZCgpIHtcbiAgICB0aGlzLmRlYnVnLmxvZygnc29ja2V0IGVuZGVkJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IHRoaXMuU1RBVEUuRklOQUwpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBFcnJvcldpdGhDb2RlID0gbmV3IEVycm9yKCdzb2NrZXQgaGFuZyB1cCcpO1xuICAgICAgZXJyb3IuY29kZSA9ICdFQ09OTlJFU0VUJztcbiAgICAgIHRoaXMuc29ja2V0RXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc29ja2V0Q2xvc2UoKSB7XG4gICAgdGhpcy5kZWJ1Zy5sb2coJ2Nvbm5lY3Rpb24gdG8gJyArIHRoaXMuY29uZmlnLnNlcnZlciArICc6JyArIHRoaXMuY29uZmlnLm9wdGlvbnMucG9ydCArICcgY2xvc2VkJyk7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuUkVST1VUSU5HKSB7XG4gICAgICB0aGlzLmRlYnVnLmxvZygnUmVyb3V0aW5nIHRvICcgKyB0aGlzLnJvdXRpbmdEYXRhIS5zZXJ2ZXIgKyAnOicgKyB0aGlzLnJvdXRpbmdEYXRhIS5wb3J0KTtcblxuICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWNvbm5lY3QnKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpIHtcbiAgICAgIGNvbnN0IHNlcnZlciA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICAgIGNvbnN0IHBvcnQgPSB0aGlzLnJvdXRpbmdEYXRhID8gdGhpcy5yb3V0aW5nRGF0YS5wb3J0IDogdGhpcy5jb25maWcub3B0aW9ucy5wb3J0O1xuICAgICAgdGhpcy5kZWJ1Zy5sb2coJ1JldHJ5IGFmdGVyIHRyYW5zaWVudCBmYWlsdXJlIGNvbm5lY3RpbmcgdG8gJyArIHNlcnZlciArICc6JyArIHBvcnQpO1xuXG4gICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoJ3JldHJ5Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgc2VuZFByZUxvZ2luKCkge1xuICAgIGNvbnN0IFssIG1ham9yLCBtaW5vciwgYnVpbGRdID0gL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykvLmV4ZWModmVyc2lvbikgPz8gWycwLjAuMCcsICcwJywgJzAnLCAnMCddO1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKHtcbiAgICAgIC8vIElmIGVuY3J5cHQgc2V0dGluZyBpcyBzZXQgdG8gJ3N0cmljdCcsIHRoZW4gd2Ugc2hvdWxkIGhhdmUgYWxyZWFkeSBkb25lIHRoZSBlbmNyeXB0aW9uIGJlZm9yZSBjYWxsaW5nXG4gICAgICAvLyB0aGlzIGZ1bmN0aW9uLiBUaGVyZWZvcmUsIHRoZSBlbmNyeXB0IHdpbGwgYmUgc2V0IHRvIGZhbHNlIGhlcmUuXG4gICAgICAvLyBPdGhlcndpc2UsIHdlIHdpbGwgc2V0IGVuY3J5cHQgaGVyZSBiYXNlZCBvbiB0aGUgZW5jcnlwdCBCb29sZWFuIHZhbHVlIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAgICBlbmNyeXB0OiB0eXBlb2YgdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0ID09PSAnYm9vbGVhbicgJiYgdGhpcy5jb25maWcub3B0aW9ucy5lbmNyeXB0LFxuICAgICAgdmVyc2lvbjogeyBtYWpvcjogTnVtYmVyKG1ham9yKSwgbWlub3I6IE51bWJlcihtaW5vciksIGJ1aWxkOiBOdW1iZXIoYnVpbGQpLCBzdWJidWlsZDogMCB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLlBSRUxPR0lOLCBwYXlsb2FkLmRhdGEpO1xuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kTG9naW43UGFja2V0KCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgTG9naW43UGF5bG9hZCh7XG4gICAgICB0ZHNWZXJzaW9uOiB2ZXJzaW9uc1t0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb25dLFxuICAgICAgcGFja2V0U2l6ZTogdGhpcy5jb25maWcub3B0aW9ucy5wYWNrZXRTaXplLFxuICAgICAgY2xpZW50UHJvZ1ZlcjogMCxcbiAgICAgIGNsaWVudFBpZDogcHJvY2Vzcy5waWQsXG4gICAgICBjb25uZWN0aW9uSWQ6IDAsXG4gICAgICBjbGllbnRUaW1lWm9uZTogbmV3IERhdGUoKS5nZXRUaW1lem9uZU9mZnNldCgpLFxuICAgICAgY2xpZW50TGNpZDogMHgwMDAwMDQwOVxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG4gICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbi50eXBlKSB7XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXBhc3N3b3JkJzpcbiAgICAgICAgcGF5bG9hZC5mZWRBdXRoID0ge1xuICAgICAgICAgIHR5cGU6ICdBREFMJyxcbiAgICAgICAgICBlY2hvOiB0aGlzLmZlZEF1dGhSZXF1aXJlZCxcbiAgICAgICAgICB3b3JrZmxvdzogJ2RlZmF1bHQnXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWFjY2Vzcy10b2tlbic6XG4gICAgICAgIHBheWxvYWQuZmVkQXV0aCA9IHtcbiAgICAgICAgICB0eXBlOiAnU0VDVVJJVFlUT0tFTicsXG4gICAgICAgICAgZWNobzogdGhpcy5mZWRBdXRoUmVxdWlyZWQsXG4gICAgICAgICAgZmVkQXV0aFRva2VuOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnRva2VuXG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bSc6XG4gICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LWRlZmF1bHQnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktYXBwLXNlcnZpY2UnOlxuICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1zZXJ2aWNlLXByaW5jaXBhbC1zZWNyZXQnOlxuICAgICAgICBwYXlsb2FkLmZlZEF1dGggPSB7XG4gICAgICAgICAgdHlwZTogJ0FEQUwnLFxuICAgICAgICAgIGVjaG86IHRoaXMuZmVkQXV0aFJlcXVpcmVkLFxuICAgICAgICAgIHdvcmtmbG93OiAnaW50ZWdyYXRlZCdcbiAgICAgICAgfTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICBwYXlsb2FkLnNzcGkgPSBjcmVhdGVOVExNUmVxdWVzdCh7IGRvbWFpbjogYXV0aGVudGljYXRpb24ub3B0aW9ucy5kb21haW4gfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBwYXlsb2FkLnVzZXJOYW1lID0gYXV0aGVudGljYXRpb24ub3B0aW9ucy51c2VyTmFtZTtcbiAgICAgICAgcGF5bG9hZC5wYXNzd29yZCA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmQ7XG4gICAgfVxuXG4gICAgcGF5bG9hZC5ob3N0bmFtZSA9IHRoaXMuY29uZmlnLm9wdGlvbnMud29ya3N0YXRpb25JZCB8fCBvcy5ob3N0bmFtZSgpO1xuICAgIHBheWxvYWQuc2VydmVyTmFtZSA9IHRoaXMucm91dGluZ0RhdGEgPyB0aGlzLnJvdXRpbmdEYXRhLnNlcnZlciA6IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBwYXlsb2FkLmFwcE5hbWUgPSB0aGlzLmNvbmZpZy5vcHRpb25zLmFwcE5hbWUgfHwgJ1RlZGlvdXMnO1xuICAgIHBheWxvYWQubGlicmFyeU5hbWUgPSBsaWJyYXJ5TmFtZTtcbiAgICBwYXlsb2FkLmxhbmd1YWdlID0gdGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZTtcbiAgICBwYXlsb2FkLmRhdGFiYXNlID0gdGhpcy5jb25maWcub3B0aW9ucy5kYXRhYmFzZTtcbiAgICBwYXlsb2FkLmNsaWVudElkID0gQnVmZmVyLmZyb20oWzEsIDIsIDMsIDQsIDUsIDZdKTtcblxuICAgIHBheWxvYWQucmVhZE9ubHlJbnRlbnQgPSB0aGlzLmNvbmZpZy5vcHRpb25zLnJlYWRPbmx5SW50ZW50O1xuICAgIHBheWxvYWQuaW5pdERiRmF0YWwgPSAhdGhpcy5jb25maWcub3B0aW9ucy5mYWxsYmFja1RvRGVmYXVsdERiO1xuXG4gICAgdGhpcy5yb3V0aW5nRGF0YSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLkxPR0lONywgcGF5bG9hZC50b0J1ZmZlcigpKTtcblxuICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBwYXlsb2FkLnRvU3RyaW5nKCcgICcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kRmVkQXV0aFRva2VuTWVzc2FnZSh0b2tlbjogc3RyaW5nKSB7XG4gICAgY29uc3QgYWNjZXNzVG9rZW5MZW4gPSBCdWZmZXIuYnl0ZUxlbmd0aCh0b2tlbiwgJ3VjczInKTtcbiAgICBjb25zdCBkYXRhID0gQnVmZmVyLmFsbG9jKDggKyBhY2Nlc3NUb2tlbkxlbik7XG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgb2Zmc2V0ID0gZGF0YS53cml0ZVVJbnQzMkxFKGFjY2Vzc1Rva2VuTGVuICsgNCwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgPSBkYXRhLndyaXRlVUludDMyTEUoYWNjZXNzVG9rZW5MZW4sIG9mZnNldCk7XG4gICAgZGF0YS53cml0ZSh0b2tlbiwgb2Zmc2V0LCAndWNzMicpO1xuICAgIHRoaXMubWVzc2FnZUlvLnNlbmRNZXNzYWdlKFRZUEUuRkVEQVVUSF9UT0tFTiwgZGF0YSk7XG4gICAgLy8gc2VudCB0aGUgZmVkQXV0aCB0b2tlbiBtZXNzYWdlLCB0aGUgcmVzdCBpcyBzaW1pbGFyIHRvIHN0YW5kYXJkIGxvZ2luIDdcbiAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfTE9HSU43X1dJVEhfU1RBTkRBUkRfTE9HSU4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBzZW5kSW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0gbmV3IFNxbEJhdGNoUGF5bG9hZCh0aGlzLmdldEluaXRpYWxTcWwoKSwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCksIHRoaXMuY29uZmlnLm9wdGlvbnMpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogVFlQRS5TUUxfQkFUQ0ggfSk7XG4gICAgdGhpcy5tZXNzYWdlSW8ub3V0Z29pbmdNZXNzYWdlU3RyZWFtLndyaXRlKG1lc3NhZ2UpO1xuICAgIFJlYWRhYmxlLmZyb20ocGF5bG9hZCkucGlwZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgZ2V0SW5pdGlhbFNxbCgpIHtcbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9udWxscyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFuc2lfbnVsbHMgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQW5zaU51bGxEZWZhdWx0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpTnVsbERlZmF1bHQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX251bGxfZGZsdF9vbiBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpUGFkZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lQYWRkaW5nID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV9wYWRkaW5nIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFuc2lXYXJuaW5ncyA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgYW5zaV93YXJuaW5ncyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVBbnNpV2FybmluZ3MgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBhbnNpX3dhcm5pbmdzIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUFyaXRoQWJvcnQgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQXJpdGhBYm9ydCA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGFyaXRoYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ29uY2F0TnVsbFlpZWxkc051bGwgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGNvbmNhdF9udWxsX3lpZWxkc19udWxsIG9uJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZUNvbmNhdE51bGxZaWVsZHNOdWxsID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY29uY2F0X251bGxfeWllbGRzX251bGwgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlQ3Vyc29yQ2xvc2VPbkNvbW1pdCA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVDdXJzb3JDbG9zZU9uQ29tbWl0ID09PSBmYWxzZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgY3Vyc29yX2Nsb3NlX29uX2NvbW1pdCBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5kYXRlZmlyc3QgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmaXJzdCAke3RoaXMuY29uZmlnLm9wdGlvbnMuZGF0ZWZpcnN0fWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXQgIT09IG51bGwpIHtcbiAgICAgIG9wdGlvbnMucHVzaChgc2V0IGRhdGVmb3JtYXQgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmRhdGVGb3JtYXR9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlSW1wbGljaXRUcmFuc2FjdGlvbnMgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvbicpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWcub3B0aW9ucy5lbmFibGVJbXBsaWNpdFRyYW5zYWN0aW9ucyA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IGltcGxpY2l0X3RyYW5zYWN0aW9ucyBvZmYnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcub3B0aW9ucy5sYW5ndWFnZSAhPT0gbnVsbCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGBzZXQgbGFuZ3VhZ2UgJHt0aGlzLmNvbmZpZy5vcHRpb25zLmxhbmd1YWdlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLmVuYWJsZU51bWVyaWNSb3VuZGFib3J0ID09PSB0cnVlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlTnVtZXJpY1JvdW5kYWJvcnQgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCBudW1lcmljX3JvdW5kYWJvcnQgb2ZmJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gdHJ1ZSkge1xuICAgICAgb3B0aW9ucy5wdXNoKCdzZXQgcXVvdGVkX2lkZW50aWZpZXIgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuZW5hYmxlUXVvdGVkSWRlbnRpZmllciA9PT0gZmFsc2UpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHF1b3RlZF9pZGVudGlmaWVyIG9mZicpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRleHRzaXplICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0ZXh0c2l6ZSAke3RoaXMuY29uZmlnLm9wdGlvbnMudGV4dHNpemV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuY29ubmVjdGlvbklzb2xhdGlvbkxldmVsICE9PSBudWxsKSB7XG4gICAgICBvcHRpb25zLnB1c2goYHNldCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJHt0aGlzLmdldElzb2xhdGlvbkxldmVsVGV4dCh0aGlzLmNvbmZpZy5vcHRpb25zLmNvbm5lY3Rpb25Jc29sYXRpb25MZXZlbCl9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IHRydWUpIHtcbiAgICAgIG9wdGlvbnMucHVzaCgnc2V0IHhhY3RfYWJvcnQgb24nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMuYWJvcnRUcmFuc2FjdGlvbk9uRXJyb3IgPT09IGZhbHNlKSB7XG4gICAgICBvcHRpb25zLnB1c2goJ3NldCB4YWN0X2Fib3J0IG9mZicpO1xuICAgIH1cblxuICAgIHJldHVybiBvcHRpb25zLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcm9jZXNzZWRJbml0aWFsU3FsKCkge1xuICAgIHRoaXMuY2xlYXJDb25uZWN0VGltZXIoKTtcbiAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBTUUwgYmF0Y2ggcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqIFRoZXJlIGlzIG5vIHBhcmFtIHN1cHBvcnQsIGFuZCB1bmxpa2UgW1tSZXF1ZXN0LmV4ZWNTcWxdXSxcbiAgICogaXQgaXMgbm90IGxpa2VseSB0aGF0IFNRTCBTZXJ2ZXIgd2lsbCByZXVzZSB0aGUgZXhlY3V0aW9uIHBsYW4gaXQgZ2VuZXJhdGVzIGZvciB0aGUgU1FMLlxuICAgKlxuICAgKiBJbiBhbG1vc3QgYWxsIGNhc2VzLCBbW1JlcXVlc3QuZXhlY1NxbF1dIHdpbGwgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIFtbUmVxdWVzdF1dIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJlcXVlc3QuXG4gICAqL1xuICBleGVjU3FsQmF0Y2gocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5TUUxfQkFUQ0gsIG5ldyBTcWxCYXRjaFBheWxvYWQocmVxdWVzdC5zcWxUZXh0T3JQcm9jZWR1cmUhLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqICBFeGVjdXRlIHRoZSBTUUwgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEFzIGBzcF9leGVjdXRlc3FsYCBpcyB1c2VkIHRvIGV4ZWN1dGUgdGhlIFNRTCwgaWYgdGhlIHNhbWUgU1FMIGlzIGV4ZWN1dGVkIG11bHRpcGxlcyB0aW1lc1xuICAgKiB1c2luZyB0aGlzIGZ1bmN0aW9uLCB0aGUgU1FMIFNlcnZlciBxdWVyeSBvcHRpbWl6ZXIgaXMgbGlrZWx5IHRvIHJldXNlIHRoZSBleGVjdXRpb24gcGxhbiBpdCBnZW5lcmF0ZXNcbiAgICogZm9yIHRoZSBmaXJzdCBleGVjdXRpb24uIFRoaXMgbWF5IGFsc28gcmVzdWx0IGluIFNRTCBzZXJ2ZXIgdHJlYXRpbmcgdGhlIHJlcXVlc3QgbGlrZSBhIHN0b3JlZCBwcm9jZWR1cmVcbiAgICogd2hpY2ggY2FuIHJlc3VsdCBpbiB0aGUgW1tFdmVudF9kb25lSW5Qcm9jXV0gb3IgW1tFdmVudF9kb25lUHJvY11dIGV2ZW50cyBiZWluZyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlXG4gICAqIFtbRXZlbnRfZG9uZV1dIGV2ZW50IHlvdSBtaWdodCBleHBlY3QuIFVzaW5nIFtbZXhlY1NxbEJhdGNoXV0gd2lsbCBwcmV2ZW50IHRoaXMgZnJvbSBvY2N1cnJpbmcgYnV0IG1heSBoYXZlIGEgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0LlxuICAgKlxuICAgKiBCZXdhcmUgb2YgdGhlIHdheSB0aGF0IHNjb3BpbmcgcnVsZXMgYXBwbHksIGFuZCBob3cgdGhleSBtYXkgW2FmZmVjdCBsb2NhbCB0ZW1wIHRhYmxlc10oaHR0cDovL3dlYmxvZ3Muc3FsdGVhbS5jb20vbWxhZGVucC9hcmNoaXZlLzIwMDYvMTEvMDMvMTcxOTcuYXNweClcbiAgICogSWYgeW91J3JlIHJ1bm5pbmcgaW4gdG8gc2NvcGluZyBpc3N1ZXMsIHRoZW4gW1tleGVjU3FsQmF0Y2hdXSBtYXkgYmUgYSBiZXR0ZXIgY2hvaWNlLlxuICAgKiBTZWUgYWxzbyBbaXNzdWUgIzI0XShodHRwczovL2dpdGh1Yi5jb20vcGVraW0vdGVkaW91cy9pc3N1ZXMvMjQpXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGV4ZWNTcWwocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuTlZhckNoYXIsXG4gICAgICBuYW1lOiAnc3RhdGVtZW50JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgaWYgKHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgIHR5cGU6IFRZUEVTLk5WYXJDaGFyLFxuICAgICAgICBuYW1lOiAncGFyYW1zJyxcbiAgICAgICAgdmFsdWU6IHJlcXVlc3QubWFrZVBhcmFtc1BhcmFtZXRlcihyZXF1ZXN0LnBhcmFtZXRlcnMpLFxuICAgICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICAgIH0pO1xuXG4gICAgICBwYXJhbWV0ZXJzLnB1c2goLi4ucmVxdWVzdC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuUlBDX1JFUVVFU1QsIG5ldyBScGNSZXF1ZXN0UGF5bG9hZChQcm9jZWR1cmVzLlNwX0V4ZWN1dGVTcWwsIHBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBCdWxrTG9hZCBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlIFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBidWxrLWluc2VydCBpbnRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyBBIHNldCBvZiBidWxrIGxvYWQgb3B0aW9ucy5cbiAgICovXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrOiBCdWxrTG9hZENhbGxiYWNrKTogQnVsa0xvYWRcbiAgbmV3QnVsa0xvYWQodGFibGU6IHN0cmluZywgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zLCBjYWxsYmFjazogQnVsa0xvYWRDYWxsYmFjayk6IEJ1bGtMb2FkXG4gIG5ld0J1bGtMb2FkKHRhYmxlOiBzdHJpbmcsIGNhbGxiYWNrT3JPcHRpb25zOiBCdWxrTG9hZE9wdGlvbnMgfCBCdWxrTG9hZENhbGxiYWNrLCBjYWxsYmFjaz86IEJ1bGtMb2FkQ2FsbGJhY2spIHtcbiAgICBsZXQgb3B0aW9uczogQnVsa0xvYWRPcHRpb25zO1xuXG4gICAgaWYgKGNhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhbGxiYWNrID0gY2FsbGJhY2tPck9wdGlvbnMgYXMgQnVsa0xvYWRDYWxsYmFjaztcbiAgICAgIG9wdGlvbnMgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3B0aW9ucyA9IGNhbGxiYWNrT3JPcHRpb25zIGFzIEJ1bGtMb2FkT3B0aW9ucztcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIm9wdGlvbnNcIiBhcmd1bWVudCBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEJ1bGtMb2FkKHRhYmxlLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uLCB0aGlzLmNvbmZpZy5vcHRpb25zLCBvcHRpb25zLCBjYWxsYmFjayk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIFtbQnVsa0xvYWRdXS5cbiAgICpcbiAgICogYGBganNcbiAgICogLy8gV2Ugd2FudCB0byBwZXJmb3JtIGEgYnVsayBsb2FkIGludG8gYSB0YWJsZSB3aXRoIHRoZSBmb2xsb3dpbmcgZm9ybWF0OlxuICAgKiAvLyBDUkVBVEUgVEFCTEUgZW1wbG95ZWVzIChmaXJzdF9uYW1lIG52YXJjaGFyKDI1NSksIGxhc3RfbmFtZSBudmFyY2hhcigyNTUpLCBkYXlfb2ZfYmlydGggZGF0ZSk7XG4gICAqXG4gICAqIGNvbnN0IGJ1bGtMb2FkID0gY29ubmVjdGlvbi5uZXdCdWxrTG9hZCgnZW1wbG95ZWVzJywgKGVyciwgcm93Q291bnQpID0+IHtcbiAgICogICAvLyAuLi5cbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIHNwZWNpZnkgdGhlIGNvbHVtbnMgdGhhdCB3ZSB3YW50IHRvIHdyaXRlIHRvLFxuICAgKiAvLyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMuIFRoZXNlIGRlZmluaXRpb25zIG11c3QgbWF0Y2ggdGhlIGFjdHVhbCB0YWJsZSxcbiAgICogLy8gb3RoZXJ3aXNlIHRoZSBidWxrIGxvYWQgd2lsbCBmYWlsLlxuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2ZpcnN0X25hbWUnLCBUWVBFUy5OVmFyY2hhciwgeyBudWxsYWJsZTogZmFsc2UgfSk7XG4gICAqIGJ1bGtMb2FkLmFkZENvbHVtbignbGFzdF9uYW1lJywgVFlQRVMuTlZhcmNoYXIsIHsgbnVsbGFibGU6IGZhbHNlIH0pO1xuICAgKiBidWxrTG9hZC5hZGRDb2x1bW4oJ2RhdGVfb2ZfYmlydGgnLCBUWVBFUy5EYXRlLCB7IG51bGxhYmxlOiBmYWxzZSB9KTtcbiAgICpcbiAgICogLy8gRXhlY3V0ZSBhIGJ1bGsgbG9hZCB3aXRoIGEgcHJlZGVmaW5lZCBsaXN0IG9mIHJvd3MuXG4gICAqIC8vXG4gICAqIC8vIE5vdGUgdGhhdCB0aGVzZSByb3dzIGFyZSBoZWxkIGluIG1lbW9yeSB1bnRpbCB0aGVcbiAgICogLy8gYnVsayBsb2FkIHdhcyBwZXJmb3JtZWQsIHNvIGlmIHlvdSBuZWVkIHRvIHdyaXRlIGEgbGFyZ2VcbiAgICogLy8gbnVtYmVyIG9mIHJvd3MgKGUuZy4gYnkgcmVhZGluZyBmcm9tIGEgQ1NWIGZpbGUpLFxuICAgKiAvLyBwYXNzaW5nIGFuIGBBc3luY0l0ZXJhYmxlYCBpcyBhZHZpc2FibGUgdG8ga2VlcCBtZW1vcnkgdXNhZ2UgbG93LlxuICAgKiBjb25uZWN0aW9uLmV4ZWNCdWxrTG9hZChidWxrTG9hZCwgW1xuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnU3RldmUnLCAnbGFzdF9uYW1lJzogJ0pvYnMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzAyLTI0LTE5NTUnKSB9LFxuICAgKiAgIHsgJ2ZpcnN0X25hbWUnOiAnQmlsbCcsICdsYXN0X25hbWUnOiAnR2F0ZXMnLCAnZGF5X29mX2JpcnRoJzogbmV3IERhdGUoJzEwLTI4LTE5NTUnKSB9XG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGJ1bGtMb2FkIEEgcHJldmlvdXNseSBjcmVhdGVkIFtbQnVsa0xvYWRdXS5cbiAgICogQHBhcmFtIHJvd3MgQSBbW0l0ZXJhYmxlXV0gb3IgW1tBc3luY0l0ZXJhYmxlXV0gdGhhdCBjb250YWlucyB0aGUgcm93cyB0aGF0IHNob3VsZCBiZSBidWxrIGxvYWRlZC5cbiAgICovXG4gIGV4ZWNCdWxrTG9hZChidWxrTG9hZDogQnVsa0xvYWQsIHJvd3M6IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pOiB2b2lkXG5cbiAgZXhlY0J1bGtMb2FkKGJ1bGtMb2FkOiBCdWxrTG9hZCwgcm93cz86IEFzeW5jSXRlcmFibGU8dW5rbm93bltdIHwgeyBbY29sdW1uTmFtZTogc3RyaW5nXTogdW5rbm93biB9PiB8IEl0ZXJhYmxlPHVua25vd25bXSB8IHsgW2NvbHVtbk5hbWU6IHN0cmluZ106IHVua25vd24gfT4pIHtcbiAgICBidWxrTG9hZC5leGVjdXRpb25TdGFydGVkID0gdHJ1ZTtcblxuICAgIGlmIChyb3dzKSB7XG4gICAgICBpZiAoYnVsa0xvYWQuc3RyZWFtaW5nTW9kZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb25uZWN0aW9uLmV4ZWNCdWxrTG9hZCBjYW4ndCBiZSBjYWxsZWQgd2l0aCBhIEJ1bGtMb2FkIHRoYXQgd2FzIHB1dCBpbiBzdHJlYW1pbmcgbW9kZS5cIik7XG4gICAgICB9XG5cbiAgICAgIGlmIChidWxrTG9hZC5maXJzdFJvd1dyaXR0ZW4pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ubmVjdGlvbi5leGVjQnVsa0xvYWQgY2FuJ3QgYmUgY2FsbGVkIHdpdGggYSBCdWxrTG9hZCB0aGF0IGFscmVhZHkgaGFzIHJvd3Mgd3JpdHRlbiB0byBpdC5cIik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJvd1N0cmVhbSA9IFJlYWRhYmxlLmZyb20ocm93cyk7XG5cbiAgICAgIC8vIERlc3Ryb3kgdGhlIHBhY2tldCB0cmFuc2Zvcm0gaWYgYW4gZXJyb3IgaGFwcGVucyBpbiB0aGUgcm93IHN0cmVhbSxcbiAgICAgIC8vIGUuZy4gaWYgYW4gZXJyb3IgaXMgdGhyb3duIGZyb20gd2l0aGluIGEgZ2VuZXJhdG9yIG9yIHN0cmVhbS5cbiAgICAgIHJvd1N0cmVhbS5vbignZXJyb3InLCAoZXJyKSA9PiB7XG4gICAgICAgIGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtLmRlc3Ryb3koZXJyKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZXN0cm95IHRoZSByb3cgc3RyZWFtIGlmIGFuIGVycm9yIGhhcHBlbnMgaW4gdGhlIHBhY2tldCB0cmFuc2Zvcm0sXG4gICAgICAvLyBlLmcuIGlmIHRoZSBidWxrIGxvYWQgaXMgY2FuY2VsbGVkLlxuICAgICAgYnVsa0xvYWQucm93VG9QYWNrZXRUcmFuc2Zvcm0ub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByb3dTdHJlYW0uZGVzdHJveShlcnIpO1xuICAgICAgfSk7XG5cbiAgICAgIHJvd1N0cmVhbS5waXBlKGJ1bGtMb2FkLnJvd1RvUGFja2V0VHJhbnNmb3JtKTtcbiAgICB9IGVsc2UgaWYgKCFidWxrTG9hZC5zdHJlYW1pbmdNb2RlKSB7XG4gICAgICAvLyBJZiB0aGUgYnVsa2xvYWQgd2FzIG5vdCBwdXQgaW50byBzdHJlYW1pbmcgbW9kZSBieSB0aGUgdXNlcixcbiAgICAgIC8vIHdlIGVuZCB0aGUgcm93VG9QYWNrZXRUcmFuc2Zvcm0gaGVyZSBmb3IgdGhlbS5cbiAgICAgIC8vXG4gICAgICAvLyBJZiBpdCB3YXMgcHV0IGludG8gc3RyZWFtaW5nIG1vZGUsIGl0J3MgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eVxuICAgICAgLy8gdG8gZW5kIHRoZSBzdHJlYW0uXG4gICAgICBidWxrTG9hZC5yb3dUb1BhY2tldFRyYW5zZm9ybS5lbmQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgIHJlcXVlc3QuY2FuY2VsKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IHBheWxvYWQgPSBuZXcgQnVsa0xvYWRQYXlsb2FkKGJ1bGtMb2FkKTtcblxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdChidWxrTG9hZC5nZXRCdWxrSW5zZXJ0U3FsKCksIChlcnJvcjogKEVycm9yICYgeyBjb2RlPzogc3RyaW5nIH0pIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgYnVsa0xvYWQucmVtb3ZlTGlzdGVuZXIoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvci5jb2RlID09PSAnVU5LTk9XTicpIHtcbiAgICAgICAgICBlcnJvci5tZXNzYWdlICs9ICcgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB0aGUgc2NoZW1hIG9mIHRoZSBCdWxrTG9hZCBkb2VzIG5vdCBtYXRjaCB0aGUgc2NoZW1hIG9mIHRoZSB0YWJsZSB5b3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zZXJ0IGludG8uJztcbiAgICAgICAgfVxuICAgICAgICBidWxrTG9hZC5lcnJvciA9IGVycm9yO1xuICAgICAgICBidWxrTG9hZC5jYWxsYmFjayhlcnJvcik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tYWtlUmVxdWVzdChidWxrTG9hZCwgVFlQRS5CVUxLX0xPQUQsIHBheWxvYWQpO1xuICAgIH0pO1xuXG4gICAgYnVsa0xvYWQub25jZSgnY2FuY2VsJywgb25DYW5jZWwpO1xuXG4gICAgdGhpcy5leGVjU3FsQmF0Y2gocmVxdWVzdCk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZSB0aGUgU1FMIHJlcHJlc2VudGVkIGJ5IHRoZSByZXF1ZXN0LlxuICAgKlxuICAgKiBUaGUgcmVxdWVzdCBjYW4gdGhlbiBiZSB1c2VkIGluIHN1YnNlcXVlbnQgY2FsbHMgdG9cbiAgICogW1tleGVjdXRlXV0gYW5kIFtbdW5wcmVwYXJlXV1cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS4gUGFyYW1ldGVyIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICovXG4gIHByZXBhcmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IFBhcmFtZXRlcltdID0gW107XG5cbiAgICBwYXJhbWV0ZXJzLnB1c2goe1xuICAgICAgdHlwZTogVFlQRVMuSW50LFxuICAgICAgbmFtZTogJ2hhbmRsZScsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkLFxuICAgICAgb3V0cHV0OiB0cnVlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdwYXJhbXMnLFxuICAgICAgdmFsdWU6IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGggPyByZXF1ZXN0Lm1ha2VQYXJhbXNQYXJhbWV0ZXIocmVxdWVzdC5wYXJhbWV0ZXJzKSA6IG51bGwsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5OVmFyQ2hhcixcbiAgICAgIG5hbWU6ICdzdG10JyxcbiAgICAgIHZhbHVlOiByZXF1ZXN0LnNxbFRleHRPclByb2NlZHVyZSxcbiAgICAgIG91dHB1dDogZmFsc2UsXG4gICAgICBsZW5ndGg6IHVuZGVmaW5lZCxcbiAgICAgIHByZWNpc2lvbjogdW5kZWZpbmVkLFxuICAgICAgc2NhbGU6IHVuZGVmaW5lZFxuICAgIH0pO1xuXG4gICAgcmVxdWVzdC5wcmVwYXJpbmcgPSB0cnVlO1xuXG4gICAgLy8gVE9ETzogV2UgbmVlZCB0byBjbGVhbiB1cCB0aGlzIGV2ZW50IGhhbmRsZXIsIG90aGVyd2lzZSB0aGlzIGxlYWtzIG1lbW9yeVxuICAgIHJlcXVlc3Qub24oJ3JldHVyblZhbHVlJywgKG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgaWYgKG5hbWUgPT09ICdoYW5kbGUnKSB7XG4gICAgICAgIHJlcXVlc3QuaGFuZGxlID0gdmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXF1ZXN0LmVycm9yID0gbmV3IFJlcXVlc3RFcnJvcihgVGVkaW91cyA+IFVuZXhwZWN0ZWQgb3V0cHV0IHBhcmFtZXRlciAke25hbWV9IGZyb20gc3BfcHJlcGFyZWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlJQQ19SRVFVRVNULCBuZXcgUnBjUmVxdWVzdFBheWxvYWQoUHJvY2VkdXJlcy5TcF9QcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2UgdGhlIFNRTCBTZXJ2ZXIgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCBhIHByZXZpb3VzbHkgcHJlcGFyZWQgcmVxdWVzdC5cbiAgICpcbiAgICogQHBhcmFtIHJlcXVlc3QgQSBbW1JlcXVlc3RdXSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByZXF1ZXN0LlxuICAgKiAgIFBhcmFtZXRlcnMgb25seSByZXF1aXJlIGEgbmFtZSBhbmQgdHlwZS5cbiAgICogICBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgKi9cbiAgdW5wcmVwYXJlKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgcGFyYW1ldGVycy5wdXNoKHtcbiAgICAgIHR5cGU6IFRZUEVTLkludCxcbiAgICAgIG5hbWU6ICdoYW5kbGUnLFxuICAgICAgLy8gVE9ETzogQWJvcnQgaWYgYHJlcXVlc3QuaGFuZGxlYCBpcyBub3Qgc2V0XG4gICAgICB2YWx1ZTogcmVxdWVzdC5oYW5kbGUsXG4gICAgICBvdXRwdXQ6IGZhbHNlLFxuICAgICAgbGVuZ3RoOiB1bmRlZmluZWQsXG4gICAgICBwcmVjaXNpb246IHVuZGVmaW5lZCxcbiAgICAgIHNjYWxlOiB1bmRlZmluZWRcbiAgICB9KTtcblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfVW5wcmVwYXJlLCBwYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgcHJldmlvdXNseSBwcmVwYXJlZCBTUUwsIHVzaW5nIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gcmVxdWVzdCBBIHByZXZpb3VzbHkgcHJlcGFyZWQgW1tSZXF1ZXN0XV0uXG4gICAqIEBwYXJhbSBwYXJhbWV0ZXJzICBBbiBvYmplY3Qgd2hvc2UgbmFtZXMgY29ycmVzcG9uZCB0byB0aGUgbmFtZXMgb2ZcbiAgICogICBwYXJhbWV0ZXJzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgW1tSZXF1ZXN0XV0gYmVmb3JlIGl0IHdhcyBwcmVwYXJlZC5cbiAgICogICBUaGUgb2JqZWN0J3MgdmFsdWVzIGFyZSBwYXNzZWQgYXMgdGhlIHBhcmFtZXRlcnMnIHZhbHVlcyB3aGVuIHRoZVxuICAgKiAgIHJlcXVlc3QgaXMgZXhlY3V0ZWQuXG4gICAqL1xuICBleGVjdXRlKHJlcXVlc3Q6IFJlcXVlc3QsIHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHVua25vd24gfSkge1xuICAgIGNvbnN0IGV4ZWN1dGVQYXJhbWV0ZXJzOiBQYXJhbWV0ZXJbXSA9IFtdO1xuXG4gICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICB0eXBlOiBUWVBFUy5JbnQsXG4gICAgICBuYW1lOiAnJyxcbiAgICAgIC8vIFRPRE86IEFib3J0IGlmIGByZXF1ZXN0LmhhbmRsZWAgaXMgbm90IHNldFxuICAgICAgdmFsdWU6IHJlcXVlc3QuaGFuZGxlLFxuICAgICAgb3V0cHV0OiBmYWxzZSxcbiAgICAgIGxlbmd0aDogdW5kZWZpbmVkLFxuICAgICAgcHJlY2lzaW9uOiB1bmRlZmluZWQsXG4gICAgICBzY2FsZTogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICB0cnkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJlcXVlc3QucGFyYW1ldGVycy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSByZXF1ZXN0LnBhcmFtZXRlcnNbaV07XG5cbiAgICAgICAgZXhlY3V0ZVBhcmFtZXRlcnMucHVzaCh7XG4gICAgICAgICAgLi4ucGFyYW1ldGVyLFxuICAgICAgICAgIHZhbHVlOiBwYXJhbWV0ZXIudHlwZS52YWxpZGF0ZShwYXJhbWV0ZXJzID8gcGFyYW1ldGVyc1twYXJhbWV0ZXIubmFtZV0gOiBudWxsLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKFByb2NlZHVyZXMuU3BfRXhlY3V0ZSwgZXhlY3V0ZVBhcmFtZXRlcnMsIHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpLCB0aGlzLmNvbmZpZy5vcHRpb25zLCB0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBhIHN0b3JlZCBwcm9jZWR1cmUgcmVwcmVzZW50ZWQgYnkgW1tSZXF1ZXN0XV0uXG4gICAqXG4gICAqIEBwYXJhbSByZXF1ZXN0IEEgW1tSZXF1ZXN0XV0gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVxdWVzdC5cbiAgICovXG4gIGNhbGxQcm9jZWR1cmUocmVxdWVzdDogUmVxdWVzdCkge1xuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0LnZhbGlkYXRlUGFyYW1ldGVycyh0aGlzLmRhdGFiYXNlQ29sbGF0aW9uKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZXF1ZXN0LmVycm9yID0gZXJyb3I7XG5cbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICB0aGlzLmRlYnVnLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgcmVxdWVzdC5jYWxsYmFjayhlcnJvcik7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5SUENfUkVRVUVTVCwgbmV3IFJwY1JlcXVlc3RQYXlsb2FkKHJlcXVlc3Quc3FsVGV4dE9yUHJvY2VkdXJlISwgcmVxdWVzdC5wYXJhbWV0ZXJzLCB0aGlzLmN1cnJlbnRUcmFuc2FjdGlvbkRlc2NyaXB0b3IoKSwgdGhpcy5jb25maWcub3B0aW9ucywgdGhpcy5kYXRhYmFzZUNvbGxhdGlvbikpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy4gUmVxdWlyZWQgd2hlbiBgaXNvbGF0aW9uTGV2ZWxgXG4gICAqICAgaXMgcHJlc2VudC5cbiAgICogQHBhcmFtIGlzb2xhdGlvbkxldmVsIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIGJlZ2luVHJhbnNhY3Rpb24oY2FsbGJhY2s6IEJlZ2luVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnLCBpc29sYXRpb25MZXZlbCA9IHRoaXMuY29uZmlnLm9wdGlvbnMuaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICBhc3NlcnRWYWxpZElzb2xhdGlvbkxldmVsKGlzb2xhdGlvbkxldmVsLCAnaXNvbGF0aW9uTGV2ZWwnKTtcblxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUsIGlzb2xhdGlvbkxldmVsKTtcblxuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTRVQgVFJBTlNBQ1RJT04gSVNPTEFUSU9OIExFVkVMICcgKyAodHJhbnNhY3Rpb24uaXNvbGF0aW9uTGV2ZWxUb1RTUUwoKSkgKyAnO0JFR0lOIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IG5ldyBSZXF1ZXN0KHVuZGVmaW5lZCwgKGVycikgPT4ge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKGVyciwgdGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpO1xuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLm1ha2VSZXF1ZXN0KHJlcXVlc3QsIFRZUEUuVFJBTlNBQ1RJT05fTUFOQUdFUiwgdHJhbnNhY3Rpb24uYmVnaW5QYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogQ29tbWl0IGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuIFJlcXVpcmVkIHdoZW4gYGlzb2xhdGlvbkxldmVsYGlzIHByZXNlbnQuXG4gICAqL1xuICBjb21taXRUcmFuc2FjdGlvbihjYWxsYmFjazogQ29tbWl0VHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ0NPTU1JVCBUUkFOICcgKyB0cmFuc2FjdGlvbi5uYW1lLCAoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25EZXB0aC0tO1xuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRlcHRoID09PSAwKSB7XG4gICAgICAgICAgdGhpcy5pblRyYW5zYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5jb21taXRQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgYSB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogVGhlcmUgc2hvdWxkIGJlIGFuIGFjdGl2ZSB0cmFuc2FjdGlvbiAtIHRoYXQgaXMsIFtbYmVnaW5UcmFuc2FjdGlvbl1dXG4gICAqIHNob3VsZCBoYXZlIGJlZW4gcHJldmlvdXNseSBjYWxsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcGFyYW0gbmFtZSBBIHN0cmluZyByZXByZXNlbnRpbmcgYSBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHJvbGxiYWNrVHJhbnNhY3Rpb24oY2FsbGJhY2s6IFJvbGxiYWNrVHJhbnNhY3Rpb25DYWxsYmFjaywgbmFtZSA9ICcnKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24obmFtZSk7XG4gICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1JPTExCQUNLIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRGVwdGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsYmFjayhlcnIpO1xuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFJlcXVlc3QodW5kZWZpbmVkLCBjYWxsYmFjayk7XG4gICAgcmV0dXJuIHRoaXMubWFrZVJlcXVlc3QocmVxdWVzdCwgVFlQRS5UUkFOU0FDVElPTl9NQU5BR0VSLCB0cmFuc2FjdGlvbi5yb2xsYmFja1BheWxvYWQodGhpcy5jdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBzYXZlcG9pbnQgd2l0aGluIGEgdHJhbnNhY3Rpb24uXG4gICAqXG4gICAqIFRoZXJlIHNob3VsZCBiZSBhbiBhY3RpdmUgdHJhbnNhY3Rpb24gLSB0aGF0IGlzLCBbW2JlZ2luVHJhbnNhY3Rpb25dXVxuICAgKiBzaG91bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgY2FsbGVkLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2tcbiAgICogQHBhcmFtIG5hbWUgQSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgbmFtZSB0byBhc3NvY2lhdGUgd2l0aCB0aGUgdHJhbnNhY3Rpb24uXFxcbiAgICogICBPcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cbiAgICogICBSZXF1aXJlZCB3aGVuIGBpc29sYXRpb25MZXZlbGAgaXMgcHJlc2VudC5cbiAgICovXG4gIHNhdmVUcmFuc2FjdGlvbihjYWxsYmFjazogU2F2ZVRyYW5zYWN0aW9uQ2FsbGJhY2ssIG5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKG5hbWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZy5vcHRpb25zLnRkc1ZlcnNpb24gPCAnN18yJykge1xuICAgICAgcmV0dXJuIHRoaXMuZXhlY1NxbEJhdGNoKG5ldyBSZXF1ZXN0KCdTQVZFIFRSQU4gJyArIHRyYW5zYWN0aW9uLm5hbWUsIChlcnIpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoKys7XG4gICAgICAgIGNhbGxiYWNrKGVycik7XG4gICAgICB9KSk7XG4gICAgfVxuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh1bmRlZmluZWQsIGNhbGxiYWNrKTtcbiAgICByZXR1cm4gdGhpcy5tYWtlUmVxdWVzdChyZXF1ZXN0LCBUWVBFLlRSQU5TQUNUSU9OX01BTkFHRVIsIHRyYW5zYWN0aW9uLnNhdmVQYXlsb2FkKHRoaXMuY3VycmVudFRyYW5zYWN0aW9uRGVzY3JpcHRvcigpKSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIHRoZSBnaXZlbiBjYWxsYmFjayBhZnRlciBzdGFydGluZyBhIHRyYW5zYWN0aW9uLCBhbmQgY29tbWl0IG9yXG4gICAqIHJvbGxiYWNrIHRoZSB0cmFuc2FjdGlvbiBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBUaGlzIGlzIGEgaGVscGVyIHRoYXQgZW1wbG95cyBbW2JlZ2luVHJhbnNhY3Rpb25dXSwgW1tjb21taXRUcmFuc2FjdGlvbl1dLFxuICAgKiBbW3JvbGxiYWNrVHJhbnNhY3Rpb25dXSwgYW5kIFtbc2F2ZVRyYW5zYWN0aW9uXV0gdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGVcbiAgICogdXNlIG9mIGRhdGFiYXNlIHRyYW5zYWN0aW9ucyBhbmQgYXV0b21hdGljYWxseSBoYW5kbGUgdHJhbnNhY3Rpb24gbmVzdGluZy5cbiAgICpcbiAgICogQHBhcmFtIGNiXG4gICAqIEBwYXJhbSBpc29sYXRpb25MZXZlbFxuICAgKiAgIFRoZSBpc29sYXRpb24gbGV2ZWwgdGhhdCB0aGUgdHJhbnNhY3Rpb24gaXMgdG8gYmUgcnVuIHdpdGguXG4gICAqXG4gICAqICAgVGhlIGlzb2xhdGlvbiBsZXZlbHMgYXJlIGF2YWlsYWJsZSBmcm9tIGByZXF1aXJlKCd0ZWRpb3VzJykuSVNPTEFUSU9OX0xFVkVMYC5cbiAgICogICAqIGBSRUFEX1VOQ09NTUlUVEVEYFxuICAgKiAgICogYFJFQURfQ09NTUlUVEVEYFxuICAgKiAgICogYFJFUEVBVEFCTEVfUkVBRGBcbiAgICogICAqIGBTRVJJQUxJWkFCTEVgXG4gICAqICAgKiBgU05BUFNIT1RgXG4gICAqXG4gICAqICAgT3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB0aGUgQ29ubmVjdGlvbidzIGlzb2xhdGlvbiBsZXZlbC5cbiAgICovXG4gIHRyYW5zYWN0aW9uKGNiOiAoZXJyOiBFcnJvciB8IG51bGwgfCB1bmRlZmluZWQsIHR4RG9uZT86IDxUIGV4dGVuZHMgVHJhbnNhY3Rpb25Eb25lQ2FsbGJhY2s+KGVycjogRXJyb3IgfCBudWxsIHwgdW5kZWZpbmVkLCBkb25lOiBULCAuLi5hcmdzOiBDYWxsYmFja1BhcmFtZXRlcnM8VD4pID0+IHZvaWQpID0+IHZvaWQsIGlzb2xhdGlvbkxldmVsPzogdHlwZW9mIElTT0xBVElPTl9MRVZFTFtrZXlvZiB0eXBlb2YgSVNPTEFUSU9OX0xFVkVMXSkge1xuICAgIGlmICh0eXBlb2YgY2IgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2BjYmAgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdXNlU2F2ZXBvaW50ID0gdGhpcy5pblRyYW5zYWN0aW9uO1xuICAgIGNvbnN0IG5hbWUgPSAnX3RlZGlvdXNfJyArIChjcnlwdG8ucmFuZG9tQnl0ZXMoMTApLnRvU3RyaW5nKCdoZXgnKSk7XG4gICAgY29uc3QgdHhEb25lOiA8VCBleHRlbmRzIFRyYW5zYWN0aW9uRG9uZUNhbGxiYWNrPihlcnI6IEVycm9yIHwgbnVsbCB8IHVuZGVmaW5lZCwgZG9uZTogVCwgLi4uYXJnczogQ2FsbGJhY2tQYXJhbWV0ZXJzPFQ+KSA9PiB2b2lkID0gKGVyciwgZG9uZSwgLi4uYXJncykgPT4ge1xuICAgICAgaWYgKGVycikge1xuICAgICAgICBpZiAodGhpcy5pblRyYW5zYWN0aW9uICYmIHRoaXMuc3RhdGUgPT09IHRoaXMuU1RBVEUuTE9HR0VEX0lOKSB7XG4gICAgICAgICAgdGhpcy5yb2xsYmFja1RyYW5zYWN0aW9uKCh0eEVycikgPT4ge1xuICAgICAgICAgICAgZG9uZSh0eEVyciB8fCBlcnIsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0sIG5hbWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRvbmUoZXJyLCAuLi5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1c2VTYXZlcG9pbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRlcHRoLS07XG4gICAgICAgIH1cbiAgICAgICAgZG9uZShudWxsLCAuLi5hcmdzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29tbWl0VHJhbnNhY3Rpb24oKHR4RXJyKSA9PiB7XG4gICAgICAgICAgZG9uZSh0eEVyciwgLi4uYXJncyk7XG4gICAgICAgIH0sIG5hbWUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAodXNlU2F2ZXBvaW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5zYXZlVHJhbnNhY3Rpb24oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgcmV0dXJuIGNiKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNvbGF0aW9uTGV2ZWwpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5leGVjU3FsQmF0Y2gobmV3IFJlcXVlc3QoJ1NFVCB0cmFuc2FjdGlvbiBpc29sYXRpb24gbGV2ZWwgJyArIHRoaXMuZ2V0SXNvbGF0aW9uTGV2ZWxUZXh0KGlzb2xhdGlvbkxldmVsKSwgKGVycikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNiKGVyciwgdHhEb25lKTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIG5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5iZWdpblRyYW5zYWN0aW9uKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJldHVybiBjYihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNiKG51bGwsIHR4RG9uZSk7XG4gICAgICB9LCBuYW1lLCBpc29sYXRpb25MZXZlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBtYWtlUmVxdWVzdChyZXF1ZXN0OiBSZXF1ZXN0IHwgQnVsa0xvYWQsIHBhY2tldFR5cGU6IG51bWJlciwgcGF5bG9hZDogKEl0ZXJhYmxlPEJ1ZmZlcj4gfCBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4pICYgeyB0b1N0cmluZzogKGluZGVudD86IHN0cmluZykgPT4gc3RyaW5nIH0pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gdGhpcy5TVEFURS5MT0dHRURfSU4pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnUmVxdWVzdHMgY2FuIG9ubHkgYmUgbWFkZSBpbiB0aGUgJyArIHRoaXMuU1RBVEUuTE9HR0VEX0lOLm5hbWUgKyAnIHN0YXRlLCBub3QgdGhlICcgKyB0aGlzLnN0YXRlLm5hbWUgKyAnIHN0YXRlJztcbiAgICAgIHRoaXMuZGVidWcubG9nKG1lc3NhZ2UpO1xuICAgICAgcmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKG1lc3NhZ2UsICdFSU5WQUxJRFNUQVRFJykpO1xuICAgIH0gZWxzZSBpZiAocmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuY2FsbGJhY2sobmV3IFJlcXVlc3RFcnJvcignQ2FuY2VsZWQuJywgJ0VDQU5DRUwnKSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhY2tldFR5cGUgPT09IFRZUEUuU1FMX0JBVENIKSB7XG4gICAgICAgIHRoaXMuaXNTcWxCYXRjaCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmlzU3FsQmF0Y2ggPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgICAgIHJlcXVlc3QuY29ubmVjdGlvbiEgPSB0aGlzO1xuICAgICAgcmVxdWVzdC5yb3dDb3VudCEgPSAwO1xuICAgICAgcmVxdWVzdC5yb3dzISA9IFtdO1xuICAgICAgcmVxdWVzdC5yc3QhID0gW107XG5cbiAgICAgIGNvbnN0IG9uQ2FuY2VsID0gKCkgPT4ge1xuICAgICAgICBwYXlsb2FkU3RyZWFtLnVucGlwZShtZXNzYWdlKTtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS5kZXN0cm95KG5ldyBSZXF1ZXN0RXJyb3IoJ0NhbmNlbGVkLicsICdFQ0FOQ0VMJykpO1xuXG4gICAgICAgIC8vIHNldCB0aGUgaWdub3JlIGJpdCBhbmQgZW5kIHRoZSBtZXNzYWdlLlxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHJlcXVlc3QucGF1c2VkKSB7XG4gICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICByZXF1ZXN0LnJlc3VtZSgpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIG9uQ2FuY2VsKTtcblxuICAgICAgdGhpcy5jcmVhdGVSZXF1ZXN0VGltZXIoKTtcblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHsgdHlwZTogcGFja2V0VHlwZSwgcmVzZXRDb25uZWN0aW9uOiB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgfSk7XG4gICAgICB0aGlzLm1lc3NhZ2VJby5vdXRnb2luZ01lc3NhZ2VTdHJlYW0ud3JpdGUobWVzc2FnZSk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQ0xJRU5UX1JFUVVFU1QpO1xuXG4gICAgICBtZXNzYWdlLm9uY2UoJ2ZpbmlzaCcsICgpID0+IHtcbiAgICAgICAgcmVxdWVzdC5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICByZXF1ZXN0Lm9uY2UoJ2NhbmNlbCcsIHRoaXMuX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnQpO1xuXG4gICAgICAgIHRoaXMucmVzZXRDb25uZWN0aW9uT25OZXh0UmVxdWVzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHBheWxvYWQhLnRvU3RyaW5nKCcgICcpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwYXlsb2FkU3RyZWFtID0gUmVhZGFibGUuZnJvbShwYXlsb2FkKTtcbiAgICAgIHBheWxvYWRTdHJlYW0ub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcGF5bG9hZFN0cmVhbS51bnBpcGUobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gT25seSBzZXQgYSByZXF1ZXN0IGVycm9yIGlmIG5vIGVycm9yIHdhcyBzZXQgeWV0LlxuICAgICAgICByZXF1ZXN0LmVycm9yID8/PSBlcnJvcjtcblxuICAgICAgICBtZXNzYWdlLmlnbm9yZSA9IHRydWU7XG4gICAgICAgIG1lc3NhZ2UuZW5kKCk7XG4gICAgICB9KTtcbiAgICAgIHBheWxvYWRTdHJlYW0ucGlwZShtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIGN1cnJlbnRseSBleGVjdXRlZCByZXF1ZXN0LlxuICAgKi9cbiAgY2FuY2VsKCkge1xuICAgIGlmICghdGhpcy5yZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVxdWVzdC5jYW5jZWxlZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRoaXMucmVxdWVzdC5jYW5jZWwoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgY29ubmVjdGlvbiB0byBpdHMgaW5pdGlhbCBzdGF0ZS5cbiAgICogQ2FuIGJlIHVzZWZ1bCBmb3IgY29ubmVjdGlvbiBwb29sIGltcGxlbWVudGF0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrXG4gICAqL1xuICByZXNldChjYWxsYmFjazogUmVzZXRDYWxsYmFjaykge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBuZXcgUmVxdWVzdCh0aGlzLmdldEluaXRpYWxTcWwoKSwgKGVycikgPT4ge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInKSB7XG4gICAgICAgIHRoaXMuaW5UcmFuc2FjdGlvbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FsbGJhY2soZXJyKTtcbiAgICB9KTtcbiAgICB0aGlzLnJlc2V0Q29ubmVjdGlvbk9uTmV4dFJlcXVlc3QgPSB0cnVlO1xuICAgIHRoaXMuZXhlY1NxbEJhdGNoKHJlcXVlc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBjdXJyZW50VHJhbnNhY3Rpb25EZXNjcmlwdG9yKCkge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uRGVzY3JpcHRvcnNbdGhpcy50cmFuc2FjdGlvbkRlc2NyaXB0b3JzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBnZXRJc29sYXRpb25MZXZlbFRleHQoaXNvbGF0aW9uTGV2ZWw6IHR5cGVvZiBJU09MQVRJT05fTEVWRUxba2V5b2YgdHlwZW9mIElTT0xBVElPTl9MRVZFTF0pIHtcbiAgICBzd2l0Y2ggKGlzb2xhdGlvbkxldmVsKSB7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5SRUFEX1VOQ09NTUlUVEVEOlxuICAgICAgICByZXR1cm4gJ3JlYWQgdW5jb21taXR0ZWQnO1xuICAgICAgY2FzZSBJU09MQVRJT05fTEVWRUwuUkVQRUFUQUJMRV9SRUFEOlxuICAgICAgICByZXR1cm4gJ3JlcGVhdGFibGUgcmVhZCc7XG4gICAgICBjYXNlIElTT0xBVElPTl9MRVZFTC5TRVJJQUxJWkFCTEU6XG4gICAgICAgIHJldHVybiAnc2VyaWFsaXphYmxlJztcbiAgICAgIGNhc2UgSVNPTEFUSU9OX0xFVkVMLlNOQVBTSE9UOlxuICAgICAgICByZXR1cm4gJ3NuYXBzaG90JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAncmVhZCBjb21taXR0ZWQnO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc1RyYW5zaWVudEVycm9yKGVycm9yOiBBZ2dyZWdhdGVFcnJvciB8IENvbm5lY3Rpb25FcnJvcik6IGJvb2xlYW4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgIGVycm9yID0gZXJyb3IuZXJyb3JzWzBdO1xuICB9XG4gIHJldHVybiAoZXJyb3IgaW5zdGFuY2VvZiBDb25uZWN0aW9uRXJyb3IpICYmICEhZXJyb3IuaXNUcmFuc2llbnQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IENvbm5lY3Rpb247XG5tb2R1bGUuZXhwb3J0cyA9IENvbm5lY3Rpb247XG5cbkNvbm5lY3Rpb24ucHJvdG90eXBlLlNUQVRFID0ge1xuICBJTklUSUFMSVpFRDoge1xuICAgIG5hbWU6ICdJbml0aWFsaXplZCcsXG4gICAgZXZlbnRzOiB7fVxuICB9LFxuICBDT05ORUNUSU5HOiB7XG4gICAgbmFtZTogJ0Nvbm5lY3RpbmcnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGlzZUNvbm5lY3Rpb24oKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgU0VOVF9QUkVMT0dJTjoge1xuICAgIG5hbWU6ICdTZW50UHJlbG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlQnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuXG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGRhdGEgb2YgbWVzc2FnZSkge1xuICAgICAgICAgIG1lc3NhZ2VCdWZmZXIgPSBCdWZmZXIuY29uY2F0KFttZXNzYWdlQnVmZmVyLCBkYXRhXSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwcmVsb2dpblBheWxvYWQgPSBuZXcgUHJlbG9naW5QYXlsb2FkKG1lc3NhZ2VCdWZmZXIpO1xuICAgICAgICB0aGlzLmRlYnVnLnBheWxvYWQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHByZWxvZ2luUGF5bG9hZC50b1N0cmluZygnICAnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHByZWxvZ2luUGF5bG9hZC5mZWRBdXRoUmVxdWlyZWQgPT09IDEpIHtcbiAgICAgICAgICB0aGlzLmZlZEF1dGhSZXF1aXJlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdzdHJpY3QnICE9PSB0aGlzLmNvbmZpZy5vcHRpb25zLmVuY3J5cHQgJiYgKHByZWxvZ2luUGF5bG9hZC5lbmNyeXB0aW9uU3RyaW5nID09PSAnT04nIHx8IHByZWxvZ2luUGF5bG9hZC5lbmNyeXB0aW9uU3RyaW5nID09PSAnUkVRJykpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLm9wdGlvbnMuZW5jcnlwdCkge1xuICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcihcIlNlcnZlciByZXF1aXJlcyBlbmNyeXB0aW9uLCBzZXQgJ2VuY3J5cHQnIGNvbmZpZyBvcHRpb24gdG8gdHJ1ZS5cIiwgJ0VFTkNSWVBUJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX1RMU1NTTE5FR09USUFUSU9OKTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWVzc2FnZUlvLnN0YXJ0VGxzKHRoaXMuc2VjdXJlQ29udGV4dE9wdGlvbnMsIHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA/IHRoaXMuY29uZmlnLm9wdGlvbnMuc2VydmVyTmFtZSA6IHRoaXMucm91dGluZ0RhdGE/LnNlcnZlciA/PyB0aGlzLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29uZmlnLm9wdGlvbnMudHJ1c3RTZXJ2ZXJDZXJ0aWZpY2F0ZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZW5kTG9naW43UGFja2V0KCk7XG5cbiAgICAgICAgY29uc3QgeyBhdXRoZW50aWNhdGlvbiB9ID0gdGhpcy5jb25maWc7XG5cbiAgICAgICAgc3dpdGNoIChhdXRoZW50aWNhdGlvbi50eXBlKSB7XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1tc2ktdm0nOlxuICAgICAgICAgIGNhc2UgJ2F6dXJlLWFjdGl2ZS1kaXJlY3RvcnktbXNpLWFwcC1zZXJ2aWNlJzpcbiAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc6XG4gICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JzpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9GRURBVVRIKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ250bG0nOlxuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0xPR0lON19XSVRIX05UTE0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuU0VOVF9MT0dJTjdfV0lUSF9TVEFOREFSRF9MT0dJTik7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgUkVST1VUSU5HOiB7XG4gICAgbmFtZTogJ1JlUm91dGluZycsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5jbGVhbnVwQ29ubmVjdGlvbihDTEVBTlVQX1RZUEUuUkVESVJFQ1QpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgIH0sXG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9LFxuICAgICAgcmVjb25uZWN0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5DT05ORUNUSU5HKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFRSQU5TSUVOVF9GQUlMVVJFX1JFVFJZOiB7XG4gICAgbmFtZTogJ1RSQU5TSUVOVF9GQUlMVVJFX1JFVFJZJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmN1clRyYW5zaWVudFJldHJ5Q291bnQrKztcbiAgICAgIHRoaXMuY2xlYW51cENvbm5lY3Rpb24oQ0xFQU5VUF9UWVBFLlJFVFJZKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgbWVzc2FnZTogZnVuY3Rpb24oKSB7XG4gICAgICB9LFxuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIHJldHJ5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVSZXRyeVRpbWVyKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX1RMU1NTTE5FR09USUFUSU9OOiB7XG4gICAgbmFtZTogJ1NlbnRUTFNTU0xOZWdvdGlhdGlvbicsXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX1NUQU5EQVJEX0xPR0lOOiB7XG4gICAgbmFtZTogJ1NlbnRMb2dpbjdXaXRoU3RhbmRhcmRMb2dpbicsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMubWVzc2FnZUlvLnJlYWRNZXNzYWdlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc29ja2V0RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICBjb25zdCB0b2tlblN0cmVhbVBhcnNlciA9IHRoaXMuY3JlYXRlVG9rZW5TdHJlYW1QYXJzZXIobWVzc2FnZSwgaGFuZGxlcik7XG5cbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuXG4gICAgICAgIGlmIChoYW5kbGVyLmxvZ2luQWNrUmVjZWl2ZWQpIHtcbiAgICAgICAgICBpZiAoaGFuZGxlci5yb3V0aW5nRGF0YSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0aW5nRGF0YSA9IGhhbmRsZXIucm91dGluZ0RhdGE7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlJFUk9VVElORyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvZ2luRXJyb3IpIHtcbiAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnLmxvZygnSW5pdGlhdGluZyByZXRyeSBvbiB0cmFuc2llbnQgZXJyb3InKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuVFJBTlNJRU5UX0ZBSUxVUkVfUkVUUlkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICB9XG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX05UTE06IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhOVExNTG9naW4nLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgbGV0IG1lc3NhZ2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgTG9naW43VG9rZW5IYW5kbGVyKHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICAgIGlmIChoYW5kbGVyLmxvZ2luQWNrUmVjZWl2ZWQpIHtcbiAgICAgICAgICAgIGlmIChoYW5kbGVyLnJvdXRpbmdEYXRhKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5udGxtcGFja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBhdXRoZW50aWNhdGlvbiA9IHRoaXMuY29uZmlnLmF1dGhlbnRpY2F0aW9uIGFzIE50bG1BdXRoZW50aWNhdGlvbjtcblxuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IG5ldyBOVExNUmVzcG9uc2VQYXlsb2FkKHtcbiAgICAgICAgICAgICAgZG9tYWluOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmRvbWFpbixcbiAgICAgICAgICAgICAgdXNlck5hbWU6IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudXNlck5hbWUsXG4gICAgICAgICAgICAgIHBhc3N3b3JkOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnBhc3N3b3JkLFxuICAgICAgICAgICAgICBudGxtcGFja2V0OiB0aGlzLm50bG1wYWNrZXRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VJby5zZW5kTWVzc2FnZShUWVBFLk5UTE1BVVRIX1BLVCwgcGF5bG9hZC5kYXRhKTtcbiAgICAgICAgICAgIHRoaXMuZGVidWcucGF5bG9hZChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQudG9TdHJpbmcoJyAgJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5udGxtcGFja2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5sb2dpbkVycm9yKSB7XG4gICAgICAgICAgICBpZiAoaXNUcmFuc2llbnRFcnJvcih0aGlzLmxvZ2luRXJyb3IpKSB7XG4gICAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3QnLCB0aGlzLmxvZ2luRXJyb3IpO1xuICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIG5ldyBDb25uZWN0aW9uRXJyb3IoJ0xvZ2luIGZhaWxlZC4nLCAnRUxPR0lOJykpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0xPR0lON19XSVRIX0ZFREFVVEg6IHtcbiAgICBuYW1lOiAnU2VudExvZ2luN1dpdGhmZWRhdXRoJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBMb2dpbjdUb2tlbkhhbmRsZXIodGhpcyk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcbiAgICAgICAgYXdhaXQgb25jZSh0b2tlblN0cmVhbVBhcnNlciwgJ2VuZCcpO1xuICAgICAgICBpZiAoaGFuZGxlci5sb2dpbkFja1JlY2VpdmVkKSB7XG4gICAgICAgICAgaWYgKGhhbmRsZXIucm91dGluZ0RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGluZ0RhdGEgPSBoYW5kbGVyLnJvdXRpbmdEYXRhO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5SRVJPVVRJTkcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTl9TRU5ESU5HX0lOSVRJQUxfU1FMKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmZWRBdXRoSW5mb1Rva2VuID0gaGFuZGxlci5mZWRBdXRoSW5mb1Rva2VuO1xuXG4gICAgICAgIGlmIChmZWRBdXRoSW5mb1Rva2VuICYmIGZlZEF1dGhJbmZvVG9rZW4uc3RzdXJsICYmIGZlZEF1dGhJbmZvVG9rZW4uc3BuKSB7XG4gICAgICAgICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLmNvbmZpZy5hdXRoZW50aWNhdGlvbiBhcyBBenVyZUFjdGl2ZURpcmVjdG9yeVBhc3N3b3JkQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaVZtQXV0aGVudGljYXRpb24gfCBBenVyZUFjdGl2ZURpcmVjdG9yeU1zaUFwcFNlcnZpY2VBdXRoZW50aWNhdGlvbiB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5U2VydmljZVByaW5jaXBhbFNlY3JldCB8IEF6dXJlQWN0aXZlRGlyZWN0b3J5RGVmYXVsdEF1dGhlbnRpY2F0aW9uO1xuICAgICAgICAgIGNvbnN0IHRva2VuU2NvcGUgPSBuZXcgVVJMKCcvLmRlZmF1bHQnLCBmZWRBdXRoSW5mb1Rva2VuLnNwbikudG9TdHJpbmcoKTtcblxuICAgICAgICAgIGxldCBjcmVkZW50aWFscztcblxuICAgICAgICAgIHN3aXRjaCAoYXV0aGVudGljYXRpb24udHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1wYXNzd29yZCc6XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsKFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMudGVuYW50SWQgPz8gJ2NvbW1vbicsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy5jbGllbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLnVzZXJOYW1lLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMucGFzc3dvcmRcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS12bSc6XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LW1zaS1hcHAtc2VydmljZSc6XG4gICAgICAgICAgICAgIGNvbnN0IG1zaUFyZ3MgPSBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkID8gW2F1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQsIHt9XSA6IFt7fV07XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IE1hbmFnZWRJZGVudGl0eUNyZWRlbnRpYWwoLi4ubXNpQXJncyk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYXp1cmUtYWN0aXZlLWRpcmVjdG9yeS1kZWZhdWx0JzpcbiAgICAgICAgICAgICAgY29uc3QgYXJncyA9IGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50SWQgPyB7IG1hbmFnZWRJZGVudGl0eUNsaWVudElkOiBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkIH0gOiB7fTtcbiAgICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBuZXcgRGVmYXVsdEF6dXJlQ3JlZGVudGlhbChhcmdzKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdhenVyZS1hY3RpdmUtZGlyZWN0b3J5LXNlcnZpY2UtcHJpbmNpcGFsLXNlY3JldCc6XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzID0gbmV3IENsaWVudFNlY3JldENyZWRlbnRpYWwoXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24ub3B0aW9ucy50ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbi5vcHRpb25zLmNsaWVudElkLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uLm9wdGlvbnMuY2xpZW50U2VjcmV0XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCB0b2tlblJlc3BvbnNlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0b2tlblJlc3BvbnNlID0gYXdhaXQgY3JlZGVudGlhbHMuZ2V0VG9rZW4odG9rZW5TY29wZSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2luRXJyb3IgPSBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgICAgICAgICAgIFtuZXcgQ29ubmVjdGlvbkVycm9yKCdTZWN1cml0eSB0b2tlbiBjb3VsZCBub3QgYmUgYXV0aGVudGljYXRlZCBvciBhdXRob3JpemVkLicsICdFRkVEQVVUSCcpLCBlcnJdKTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cblxuICAgICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5SZXNwb25zZS50b2tlbjtcbiAgICAgICAgICB0aGlzLnNlbmRGZWRBdXRoVG9rZW5NZXNzYWdlKHRva2VuKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9naW5FcnJvcikge1xuICAgICAgICAgIGlmIChpc1RyYW5zaWVudEVycm9yKHRoaXMubG9naW5FcnJvcikpIHtcbiAgICAgICAgICAgIHRoaXMuZGVidWcubG9nKCdJbml0aWF0aW5nIHJldHJ5IG9uIHRyYW5zaWVudCBlcnJvcicpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5UUkFOU0lFTlRfRkFJTFVSRV9SRVRSWSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnY29ubmVjdCcsIHRoaXMubG9naW5FcnJvcik7XG4gICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0JywgbmV3IENvbm5lY3Rpb25FcnJvcignTG9naW4gZmFpbGVkLicsICdFTE9HSU4nKSk7XG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH0sXG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgTE9HR0VEX0lOX1NFTkRJTkdfSU5JVElBTF9TUUw6IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW5TZW5kaW5nSW5pdGlhbFNxbCcsXG4gICAgZW50ZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhpcy5zZW5kSW5pdGlhbFNxbCgpO1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBuZXcgSW5pdGlhbFNxbFRva2VuSGFuZGxlcih0aGlzKSk7XG4gICAgICAgIGF3YWl0IG9uY2UodG9rZW5TdHJlYW1QYXJzZXIsICdlbmQnKTtcblxuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG4gICAgICAgIHRoaXMucHJvY2Vzc2VkSW5pdGlhbFNxbCgpO1xuXG4gICAgICB9KSgpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBzb2NrZXRFcnJvcjogZnVuY3Rpb24gc29ja2V0RXJyb3IoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuICAgICAgfSxcbiAgICAgIGNvbm5lY3RUaW1lb3V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5GSU5BTCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBMT0dHRURfSU46IHtcbiAgICBuYW1lOiAnTG9nZ2VkSW4nLFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIFNFTlRfQ0xJRU5UX1JFUVVFU1Q6IHtcbiAgICBuYW1lOiAnU2VudENsaWVudFJlcXVlc3QnLFxuICAgIGVudGVyOiBmdW5jdGlvbigpIHtcbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm1lc3NhZ2VJby5yZWFkTWVzc2FnZSgpO1xuICAgICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNvY2tldEVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVxdWVzdCB0aW1lciBpcyBzdG9wcGVkIG9uIGZpcnN0IGRhdGEgcGFja2FnZVxuICAgICAgICB0aGlzLmNsZWFyUmVxdWVzdFRpbWVyKCk7XG5cbiAgICAgICAgY29uc3QgdG9rZW5TdHJlYW1QYXJzZXIgPSB0aGlzLmNyZWF0ZVRva2VuU3RyZWFtUGFyc2VyKG1lc3NhZ2UsIG5ldyBSZXF1ZXN0VG9rZW5IYW5kbGVyKHRoaXMsIHRoaXMucmVxdWVzdCEpKTtcblxuICAgICAgICAvLyBJZiB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQgYW5kIHdlIGhhdmUgYSBgY2FuY2VsVGltZXJgXG4gICAgICAgIC8vIGRlZmluZWQsIHdlIHNlbmQgYSBhdHRlbnRpb24gbWVzc2FnZSBhZnRlciB0aGVcbiAgICAgICAgLy8gcmVxdWVzdCBtZXNzYWdlIHdhcyBmdWxseSBzZW50IG9mZi5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2UgYWxyZWFkeSBzdGFydGVkIGNvbnN1bWluZyB0aGUgY3VycmVudCBtZXNzYWdlXG4gICAgICAgIC8vIChidXQgYWxsIHRoZSB0b2tlbiBoYW5kbGVycyBzaG91bGQgYmUgbm8tb3BzKSwgYW5kXG4gICAgICAgIC8vIG5lZWQgdG8gZW5zdXJlIHRoZSBuZXh0IG1lc3NhZ2UgaXMgaGFuZGxlZCBieSB0aGVcbiAgICAgICAgLy8gYFNFTlRfQVRURU5USU9OYCBzdGF0ZS5cbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdD8uY2FuY2VsZWQgJiYgdGhpcy5jYW5jZWxUaW1lcikge1xuICAgICAgICAgIHJldHVybiB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLlNFTlRfQVRURU5USU9OKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9uUmVzdW1lID0gKCkgPT4ge1xuICAgICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLnJlc3VtZSgpO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBvblBhdXNlID0gKCkgPT4ge1xuICAgICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLnBhdXNlKCk7XG5cbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/Lm9uY2UoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLnJlcXVlc3Q/Lm9uKCdwYXVzZScsIG9uUGF1c2UpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlcXVlc3QgaW5zdGFuY2VvZiBSZXF1ZXN0ICYmIHRoaXMucmVxdWVzdC5wYXVzZWQpIHtcbiAgICAgICAgICBvblBhdXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvbkNhbmNlbCA9ICgpID0+IHtcbiAgICAgICAgICB0b2tlblN0cmVhbVBhcnNlci5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25FbmRPZk1lc3NhZ2UpO1xuXG4gICAgICAgICAgaWYgKHRoaXMucmVxdWVzdCBpbnN0YW5jZW9mIFJlcXVlc3QgJiYgdGhpcy5yZXF1ZXN0LnBhdXNlZCkge1xuICAgICAgICAgICAgLy8gcmVzdW1lIHRoZSByZXF1ZXN0IGlmIGl0IHdhcyBwYXVzZWQgc28gd2UgY2FuIHJlYWQgdGhlIHJlbWFpbmluZyB0b2tlbnNcbiAgICAgICAgICAgIHRoaXMucmVxdWVzdC5yZXN1bWUoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnJlcXVlc3Q/LnJlbW92ZUxpc3RlbmVyKCdwYXVzZScsIG9uUGF1c2UpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3Jlc3VtZScsIG9uUmVzdW1lKTtcblxuICAgICAgICAgIC8vIFRoZSBgX2NhbmNlbEFmdGVyUmVxdWVzdFNlbnRgIGNhbGxiYWNrIHdpbGwgaGF2ZSBzZW50IGFcbiAgICAgICAgICAvLyBhdHRlbnRpb24gbWVzc2FnZSwgc28gbm93IHdlIG5lZWQgdG8gYWxzbyBzd2l0Y2ggdG9cbiAgICAgICAgICAvLyB0aGUgYFNFTlRfQVRURU5USU9OYCBzdGF0ZSB0byBtYWtlIHN1cmUgdGhlIGF0dGVudGlvbiBhY2tcbiAgICAgICAgICAvLyBtZXNzYWdlIGlzIHByb2Nlc3NlZCBjb3JyZWN0bHkuXG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5TRU5UX0FUVEVOVElPTik7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgb25FbmRPZk1lc3NhZ2UgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgdGhpcy5fY2FuY2VsQWZ0ZXJSZXF1ZXN0U2VudCk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcignY2FuY2VsJywgb25DYW5jZWwpO1xuICAgICAgICAgIHRoaXMucmVxdWVzdD8ucmVtb3ZlTGlzdGVuZXIoJ3BhdXNlJywgb25QYXVzZSk7XG4gICAgICAgICAgdGhpcy5yZXF1ZXN0Py5yZW1vdmVMaXN0ZW5lcigncmVzdW1lJywgb25SZXN1bWUpO1xuXG4gICAgICAgICAgdGhpcy50cmFuc2l0aW9uVG8odGhpcy5TVEFURS5MT0dHRURfSU4pO1xuICAgICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QgYXMgUmVxdWVzdDtcbiAgICAgICAgICB0aGlzLnJlcXVlc3QgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKHRoaXMuY29uZmlnLm9wdGlvbnMudGRzVmVyc2lvbiA8ICc3XzInICYmIHNxbFJlcXVlc3QuZXJyb3IgJiYgdGhpcy5pc1NxbEJhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLmluVHJhbnNhY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhzcWxSZXF1ZXN0LmVycm9yLCBzcWxSZXF1ZXN0LnJvd0NvdW50LCBzcWxSZXF1ZXN0LnJvd3MpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHRva2VuU3RyZWFtUGFyc2VyLm9uY2UoJ2VuZCcsIG9uRW5kT2ZNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yZXF1ZXN0Py5vbmNlKCdjYW5jZWwnLCBvbkNhbmNlbCk7XG4gICAgICB9KSgpO1xuXG4gICAgfSxcbiAgICBleGl0OiBmdW5jdGlvbihuZXh0U3RhdGUpIHtcbiAgICAgIHRoaXMuY2xlYXJSZXF1ZXN0VGltZXIoKTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkZJTkFMKTtcblxuICAgICAgICBzcWxSZXF1ZXN0LmNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBTRU5UX0FUVEVOVElPTjoge1xuICAgIG5hbWU6ICdTZW50QXR0ZW50aW9uJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5tZXNzYWdlSW8ucmVhZE1lc3NhZ2UoKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zb2NrZXRFcnJvcihlcnIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBBdHRlbnRpb25Ub2tlbkhhbmRsZXIodGhpcywgdGhpcy5yZXF1ZXN0ISk7XG4gICAgICAgIGNvbnN0IHRva2VuU3RyZWFtUGFyc2VyID0gdGhpcy5jcmVhdGVUb2tlblN0cmVhbVBhcnNlcihtZXNzYWdlLCBoYW5kbGVyKTtcblxuICAgICAgICBhd2FpdCBvbmNlKHRva2VuU3RyZWFtUGFyc2VyLCAnZW5kJyk7XG4gICAgICAgIC8vIDMuMi41LjcgU2VudCBBdHRlbnRpb24gU3RhdGVcbiAgICAgICAgLy8gRGlzY2FyZCBhbnkgZGF0YSBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLCB1bnRpbCB3ZSByZWNlaXZlIHRoZSBhdHRlbnRpb24gcmVzcG9uc2VcbiAgICAgICAgaWYgKGhhbmRsZXIuYXR0ZW50aW9uUmVjZWl2ZWQpIHtcbiAgICAgICAgICB0aGlzLmNsZWFyQ2FuY2VsVGltZXIoKTtcblxuICAgICAgICAgIGNvbnN0IHNxbFJlcXVlc3QgPSB0aGlzLnJlcXVlc3QhO1xuICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLnRyYW5zaXRpb25Ubyh0aGlzLlNUQVRFLkxPR0dFRF9JTik7XG5cbiAgICAgICAgICBpZiAoc3FsUmVxdWVzdC5lcnJvciAmJiBzcWxSZXF1ZXN0LmVycm9yIGluc3RhbmNlb2YgUmVxdWVzdEVycm9yICYmIHNxbFJlcXVlc3QuZXJyb3IuY29kZSA9PT0gJ0VUSU1FT1VUJykge1xuICAgICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhzcWxSZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3FsUmVxdWVzdC5jYWxsYmFjayhuZXcgUmVxdWVzdEVycm9yKCdDYW5jZWxlZC4nLCAnRUNBTkNFTCcpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgfSkoKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGV2ZW50czoge1xuICAgICAgc29ja2V0RXJyb3I6IGZ1bmN0aW9uKGVycikge1xuICAgICAgICBjb25zdCBzcWxSZXF1ZXN0ID0gdGhpcy5yZXF1ZXN0ITtcbiAgICAgICAgdGhpcy5yZXF1ZXN0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIHRoaXMudHJhbnNpdGlvblRvKHRoaXMuU1RBVEUuRklOQUwpO1xuXG4gICAgICAgIHNxbFJlcXVlc3QuY2FsbGJhY2soZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIEZJTkFMOiB7XG4gICAgbmFtZTogJ0ZpbmFsJyxcbiAgICBlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLmNsZWFudXBDb25uZWN0aW9uKENMRUFOVVBfVFlQRS5OT1JNQUwpO1xuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjb25uZWN0VGltZW91dDogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcsIGFzIHRoZSB0aW1lciBzaG91bGQgYmUgY2xlYW5lZCB1cC5cbiAgICAgIH0sXG4gICAgICBtZXNzYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgfSxcbiAgICAgIHNvY2tldEVycm9yOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZ1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsSUFBQUEsT0FBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsR0FBQSxHQUFBRixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUUsR0FBQSxHQUFBQyx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksR0FBQSxHQUFBRCx1QkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUssSUFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU0sVUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBR0EsSUFBQU8sT0FBQSxHQUFBUCxPQUFBO0FBRUEsSUFBQVEsU0FBQSxHQUFBUixPQUFBO0FBT0EsSUFBQVMsU0FBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsTUFBQSxHQUFBWCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVcsT0FBQSxHQUFBWCxPQUFBO0FBQ0EsSUFBQVksZUFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEscUJBQUEsR0FBQWIsT0FBQTtBQUNBLElBQUFjLE9BQUEsR0FBQWQsT0FBQTtBQUNBLElBQUFlLGdCQUFBLEdBQUFoQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQWdCLGNBQUEsR0FBQWpCLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBaUIsWUFBQSxHQUFBbEIsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFrQixRQUFBLEdBQUFuQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW1CLGtCQUFBLEdBQUFwQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW9CLGdCQUFBLEdBQUFyQixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQXFCLFVBQUEsR0FBQXRCLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBc0Isa0JBQUEsR0FBQXRCLE9BQUE7QUFDQSxJQUFBdUIsWUFBQSxHQUFBdkIsT0FBQTtBQUNBLElBQUF3QixPQUFBLEdBQUF4QixPQUFBO0FBQ0EsSUFBQXlCLFVBQUEsR0FBQXpCLE9BQUE7QUFDQSxJQUFBMEIsUUFBQSxHQUFBMUIsT0FBQTtBQUNBLElBQUEyQixZQUFBLEdBQUEzQixPQUFBO0FBQ0EsSUFBQTRCLFFBQUEsR0FBQTdCLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBNkIsS0FBQSxHQUFBN0IsT0FBQTtBQUdBLElBQUE4QixvQkFBQSxHQUFBOUIsT0FBQTtBQUNBLElBQUErQixTQUFBLEdBQUEvQixPQUFBO0FBQ0EsSUFBQWdDLGdCQUFBLEdBQUFoQyxPQUFBO0FBRUEsSUFBQWlDLHVCQUFBLEdBQUFsQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQWtDLGlCQUFBLEdBQUFuQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQW1DLFFBQUEsR0FBQW5DLE9BQUE7QUFDQSxJQUFBb0MsSUFBQSxHQUFBcEMsT0FBQTtBQUNBLElBQUFxQyxRQUFBLEdBQUFyQyxPQUFBO0FBQXVJLFNBQUFzQyx5QkFBQUMsV0FBQSxlQUFBQyxPQUFBLGtDQUFBQyxpQkFBQSxPQUFBRCxPQUFBLFFBQUFFLGdCQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsV0FBQSxXQUFBQSxXQUFBLEdBQUFHLGdCQUFBLEdBQUFELGlCQUFBLEtBQUFGLFdBQUE7QUFBQSxTQUFBcEMsd0JBQUF3QyxHQUFBLEVBQUFKLFdBQUEsU0FBQUEsV0FBQSxJQUFBSSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxXQUFBRCxHQUFBLFFBQUFBLEdBQUEsb0JBQUFBLEdBQUEsd0JBQUFBLEdBQUEsNEJBQUFFLE9BQUEsRUFBQUYsR0FBQSxVQUFBRyxLQUFBLEdBQUFSLHdCQUFBLENBQUFDLFdBQUEsT0FBQU8sS0FBQSxJQUFBQSxLQUFBLENBQUFDLEdBQUEsQ0FBQUosR0FBQSxZQUFBRyxLQUFBLENBQUFFLEdBQUEsQ0FBQUwsR0FBQSxTQUFBTSxNQUFBLFdBQUFDLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLEdBQUEsSUFBQVgsR0FBQSxRQUFBVyxHQUFBLGtCQUFBSCxNQUFBLENBQUFJLFNBQUEsQ0FBQUMsY0FBQSxDQUFBQyxJQUFBLENBQUFkLEdBQUEsRUFBQVcsR0FBQSxTQUFBSSxJQUFBLEdBQUFSLHFCQUFBLEdBQUFDLE1BQUEsQ0FBQUUsd0JBQUEsQ0FBQVYsR0FBQSxFQUFBVyxHQUFBLGNBQUFJLElBQUEsS0FBQUEsSUFBQSxDQUFBVixHQUFBLElBQUFVLElBQUEsQ0FBQUMsR0FBQSxLQUFBUixNQUFBLENBQUFDLGNBQUEsQ0FBQUgsTUFBQSxFQUFBSyxHQUFBLEVBQUFJLElBQUEsWUFBQVQsTUFBQSxDQUFBSyxHQUFBLElBQUFYLEdBQUEsQ0FBQVcsR0FBQSxTQUFBTCxNQUFBLENBQUFKLE9BQUEsR0FBQUYsR0FBQSxNQUFBRyxLQUFBLElBQUFBLEtBQUEsQ0FBQWEsR0FBQSxDQUFBaEIsR0FBQSxFQUFBTSxNQUFBLFlBQUFBLE1BQUE7QUFBQSxTQUFBbEQsdUJBQUE0QyxHQUFBLFdBQUFBLEdBQUEsSUFBQUEsR0FBQSxDQUFBQyxVQUFBLEdBQUFELEdBQUEsS0FBQUUsT0FBQSxFQUFBRixHQUFBO0FBcUV2STs7QUErQkE7QUFDQTtBQUNBO0FBQ0EsTUFBTWlCLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLHVCQUF1QixHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLDhCQUE4QixHQUFHLEVBQUUsR0FBRyxJQUFJO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQUMsR0FBRyxJQUFJO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLDhCQUE4QixHQUFHLEdBQUc7QUFDMUM7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUk7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsVUFBVTtBQUNuQztBQUNBO0FBQ0E7QUFDQSxNQUFNQyxpQkFBaUIsR0FBRyxDQUFDO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLFlBQVksR0FBRyxJQUFJO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLG1CQUFtQixHQUFHLEtBQUs7QUFDakM7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsZ0JBQWdCLEdBQUcsWUFBWTtBQUNyQztBQUNBO0FBQ0E7QUFDQSxNQUFNQyxrQkFBa0IsR0FBRyxLQUFLOztBQTJNaEM7QUFDQTtBQUNBOztBQTBjQTtBQUNBO0FBQ0E7QUFDQSxNQUFNQyxZQUFZLEdBQUc7RUFDbkJDLE1BQU0sRUFBRSxDQUFDO0VBQ1RDLFFBQVEsRUFBRSxDQUFDO0VBQ1hDLEtBQUssRUFBRTtBQUNULENBQUM7QUFPRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTUMsVUFBVSxTQUFTQyxvQkFBWSxDQUFDO0VBQ3BDO0FBQ0Y7QUFDQTtFQUNFQyxlQUFlO0VBQ2Y7QUFDRjtBQUNBO0VBQ0VDLE1BQU07RUFDTjtBQUNGO0FBQ0E7RUFDRUMsb0JBQW9CO0VBQ3BCO0FBQ0Y7QUFDQTtFQUNFQyxhQUFhO0VBQ2I7QUFDRjtBQUNBO0VBQ0VDLHNCQUFzQjtFQUN0QjtBQUNGO0FBQ0E7RUFDRUMsZ0JBQWdCO0VBQ2hCO0FBQ0Y7QUFDQTtFQUNFQyxVQUFVO0VBQ1Y7QUFDRjtBQUNBO0VBQ0VDLHNCQUFzQjtFQUN0QjtBQUNGO0FBQ0E7RUFDRUMsb0JBQW9CO0VBQ3BCO0FBQ0Y7QUFDQTtFQUNFQyxNQUFNO0VBQ047QUFDRjtBQUNBO0VBQ0VDLFVBQVU7RUFDVjtBQUNGO0FBQ0E7RUFDRUMsS0FBSztFQUNMO0FBQ0Y7QUFDQTtFQUNFQyxVQUFVO0VBQ1Y7QUFDRjtBQUNBO0VBQ0VDLGdCQUFnQjs7RUFFaEI7QUFDRjtBQUNBOztFQWtCRTtBQUNGO0FBQ0E7RUFDRUMsV0FBVzs7RUFFWDtBQUNGO0FBQ0E7RUFDRUMsU0FBUztFQUNUO0FBQ0Y7QUFDQTtFQUNFQyxLQUFLO0VBQ0w7QUFDRjtBQUNBO0VBQ0VDLDRCQUE0Qjs7RUFFNUI7QUFDRjtBQUNBO0VBQ0VDLE9BQU87RUFDUDtBQUNGO0FBQ0E7RUFDRUMscUJBQXFCO0VBQ3JCO0FBQ0Y7QUFDQTtFQUNFQyxNQUFNO0VBQ047QUFDRjtBQUNBO0VBQ0VDLGFBQWE7O0VBRWI7QUFDRjtBQUNBO0VBQ0VDLFlBQVk7RUFDWjtBQUNGO0FBQ0E7RUFDRUMsV0FBVztFQUNYO0FBQ0Y7QUFDQTtFQUNFQyxZQUFZO0VBQ1o7QUFDRjtBQUNBO0VBQ0VDLFVBQVU7O0VBRVY7QUFDRjtBQUNBO0VBQ0VDLHVCQUF1Qjs7RUFFdkI7QUFDRjtBQUNBO0VBQ0VDLGlCQUFpQjs7RUFFakI7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLFdBQVdBLENBQUMzQixNQUErQixFQUFFO0lBQzNDLEtBQUssQ0FBQyxDQUFDO0lBRVAsSUFBSSxPQUFPQSxNQUFNLEtBQUssUUFBUSxJQUFJQSxNQUFNLEtBQUssSUFBSSxFQUFFO01BQ2pELE1BQU0sSUFBSTRCLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztJQUN0RjtJQUVBLElBQUksT0FBTzVCLE1BQU0sQ0FBQzZCLE1BQU0sS0FBSyxRQUFRLEVBQUU7TUFDckMsTUFBTSxJQUFJRCxTQUFTLENBQUMsc0VBQXNFLENBQUM7SUFDN0Y7SUFFQSxJQUFJLENBQUM3QixlQUFlLEdBQUcsS0FBSztJQUU1QixJQUFJK0IsY0FBMEQ7SUFDOUQsSUFBSTlCLE1BQU0sQ0FBQzhCLGNBQWMsS0FBS0MsU0FBUyxFQUFFO01BQ3ZDLElBQUksT0FBTy9CLE1BQU0sQ0FBQzhCLGNBQWMsS0FBSyxRQUFRLElBQUk5QixNQUFNLENBQUM4QixjQUFjLEtBQUssSUFBSSxFQUFFO1FBQy9FLE1BQU0sSUFBSUYsU0FBUyxDQUFDLDhEQUE4RCxDQUFDO01BQ3JGO01BRUEsTUFBTUksSUFBSSxHQUFHaEMsTUFBTSxDQUFDOEIsY0FBYyxDQUFDRSxJQUFJO01BQ3ZDLE1BQU1DLE9BQU8sR0FBR2pDLE1BQU0sQ0FBQzhCLGNBQWMsQ0FBQ0csT0FBTyxLQUFLRixTQUFTLEdBQUcsQ0FBQyxDQUFDLEdBQUcvQixNQUFNLENBQUM4QixjQUFjLENBQUNHLE9BQU87TUFFaEcsSUFBSSxPQUFPRCxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sSUFBSUosU0FBUyxDQUFDLG1FQUFtRSxDQUFDO01BQzFGO01BRUEsSUFBSUksSUFBSSxLQUFLLFNBQVMsSUFBSUEsSUFBSSxLQUFLLE1BQU0sSUFBSUEsSUFBSSxLQUFLLGlDQUFpQyxJQUFJQSxJQUFJLEtBQUsscUNBQXFDLElBQUlBLElBQUksS0FBSywrQkFBK0IsSUFBSUEsSUFBSSxLQUFLLHdDQUF3QyxJQUFJQSxJQUFJLEtBQUssaURBQWlELElBQUlBLElBQUksS0FBSyxnQ0FBZ0MsRUFBRTtRQUNyVixNQUFNLElBQUlKLFNBQVMsQ0FBQyxrU0FBa1MsQ0FBQztNQUN6VDtNQUVBLElBQUksT0FBT0ssT0FBTyxLQUFLLFFBQVEsSUFBSUEsT0FBTyxLQUFLLElBQUksRUFBRTtRQUNuRCxNQUFNLElBQUlMLFNBQVMsQ0FBQyxzRUFBc0UsQ0FBQztNQUM3RjtNQUVBLElBQUlJLElBQUksS0FBSyxNQUFNLEVBQUU7UUFDbkIsSUFBSSxPQUFPQyxPQUFPLENBQUNDLE1BQU0sS0FBSyxRQUFRLEVBQUU7VUFDdEMsTUFBTSxJQUFJTixTQUFTLENBQUMsNkVBQTZFLENBQUM7UUFDcEc7UUFFQSxJQUFJSyxPQUFPLENBQUNFLFFBQVEsS0FBS0osU0FBUyxJQUFJLE9BQU9FLE9BQU8sQ0FBQ0UsUUFBUSxLQUFLLFFBQVEsRUFBRTtVQUMxRSxNQUFNLElBQUlQLFNBQVMsQ0FBQywrRUFBK0UsQ0FBQztRQUN0RztRQUVBLElBQUlLLE9BQU8sQ0FBQ0csUUFBUSxLQUFLTCxTQUFTLElBQUksT0FBT0UsT0FBTyxDQUFDRyxRQUFRLEtBQUssUUFBUSxFQUFFO1VBQzFFLE1BQU0sSUFBSVIsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUFFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsTUFBTTtVQUNaQyxPQUFPLEVBQUU7WUFDUEUsUUFBUSxFQUFFRixPQUFPLENBQUNFLFFBQVE7WUFDMUJDLFFBQVEsRUFBRUgsT0FBTyxDQUFDRyxRQUFRO1lBQzFCRixNQUFNLEVBQUVELE9BQU8sQ0FBQ0MsTUFBTSxJQUFJRCxPQUFPLENBQUNDLE1BQU0sQ0FBQ0csV0FBVyxDQUFDO1VBQ3ZEO1FBQ0YsQ0FBQztNQUNILENBQUMsTUFBTSxJQUFJTCxJQUFJLEtBQUssaUNBQWlDLEVBQUU7UUFDckQsSUFBSSxPQUFPQyxPQUFPLENBQUNLLFFBQVEsS0FBSyxRQUFRLEVBQUU7VUFDeEMsTUFBTSxJQUFJVixTQUFTLENBQUMsK0VBQStFLENBQUM7UUFDdEc7UUFFQSxJQUFJSyxPQUFPLENBQUNFLFFBQVEsS0FBS0osU0FBUyxJQUFJLE9BQU9FLE9BQU8sQ0FBQ0UsUUFBUSxLQUFLLFFBQVEsRUFBRTtVQUMxRSxNQUFNLElBQUlQLFNBQVMsQ0FBQywrRUFBK0UsQ0FBQztRQUN0RztRQUVBLElBQUlLLE9BQU8sQ0FBQ0csUUFBUSxLQUFLTCxTQUFTLElBQUksT0FBT0UsT0FBTyxDQUFDRyxRQUFRLEtBQUssUUFBUSxFQUFFO1VBQzFFLE1BQU0sSUFBSVIsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSUssT0FBTyxDQUFDTSxRQUFRLEtBQUtSLFNBQVMsSUFBSSxPQUFPRSxPQUFPLENBQUNNLFFBQVEsS0FBSyxRQUFRLEVBQUU7VUFDMUUsTUFBTSxJQUFJWCxTQUFTLENBQUMsK0VBQStFLENBQUM7UUFDdEc7UUFFQUUsY0FBYyxHQUFHO1VBQ2ZFLElBQUksRUFBRSxpQ0FBaUM7VUFDdkNDLE9BQU8sRUFBRTtZQUNQRSxRQUFRLEVBQUVGLE9BQU8sQ0FBQ0UsUUFBUTtZQUMxQkMsUUFBUSxFQUFFSCxPQUFPLENBQUNHLFFBQVE7WUFDMUJHLFFBQVEsRUFBRU4sT0FBTyxDQUFDTSxRQUFRO1lBQzFCRCxRQUFRLEVBQUVMLE9BQU8sQ0FBQ0s7VUFDcEI7UUFDRixDQUFDO01BQ0gsQ0FBQyxNQUFNLElBQUlOLElBQUksS0FBSyxxQ0FBcUMsRUFBRTtRQUN6RCxJQUFJLE9BQU9DLE9BQU8sQ0FBQ08sS0FBSyxLQUFLLFFBQVEsRUFBRTtVQUNyQyxNQUFNLElBQUlaLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQztRQUNuRztRQUVBRSxjQUFjLEdBQUc7VUFDZkUsSUFBSSxFQUFFLHFDQUFxQztVQUMzQ0MsT0FBTyxFQUFFO1lBQ1BPLEtBQUssRUFBRVAsT0FBTyxDQUFDTztVQUNqQjtRQUNGLENBQUM7TUFDSCxDQUFDLE1BQU0sSUFBSVIsSUFBSSxLQUFLLCtCQUErQixFQUFFO1FBQ25ELElBQUlDLE9BQU8sQ0FBQ0ssUUFBUSxLQUFLUCxTQUFTLElBQUksT0FBT0UsT0FBTyxDQUFDSyxRQUFRLEtBQUssUUFBUSxFQUFFO1VBQzFFLE1BQU0sSUFBSVYsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUFFLGNBQWMsR0FBRztVQUNmRSxJQUFJLEVBQUUsK0JBQStCO1VBQ3JDQyxPQUFPLEVBQUU7WUFDUEssUUFBUSxFQUFFTCxPQUFPLENBQUNLO1VBQ3BCO1FBQ0YsQ0FBQztNQUNILENBQUMsTUFBTSxJQUFJTixJQUFJLEtBQUssZ0NBQWdDLEVBQUU7UUFDcEQsSUFBSUMsT0FBTyxDQUFDSyxRQUFRLEtBQUtQLFNBQVMsSUFBSSxPQUFPRSxPQUFPLENBQUNLLFFBQVEsS0FBSyxRQUFRLEVBQUU7VUFDMUUsTUFBTSxJQUFJVixTQUFTLENBQUMsK0VBQStFLENBQUM7UUFDdEc7UUFDQUUsY0FBYyxHQUFHO1VBQ2ZFLElBQUksRUFBRSxnQ0FBZ0M7VUFDdENDLE9BQU8sRUFBRTtZQUNQSyxRQUFRLEVBQUVMLE9BQU8sQ0FBQ0s7VUFDcEI7UUFDRixDQUFDO01BQ0gsQ0FBQyxNQUFNLElBQUlOLElBQUksS0FBSyx3Q0FBd0MsRUFBRTtRQUM1RCxJQUFJQyxPQUFPLENBQUNLLFFBQVEsS0FBS1AsU0FBUyxJQUFJLE9BQU9FLE9BQU8sQ0FBQ0ssUUFBUSxLQUFLLFFBQVEsRUFBRTtVQUMxRSxNQUFNLElBQUlWLFNBQVMsQ0FBQywrRUFBK0UsQ0FBQztRQUN0RztRQUVBRSxjQUFjLEdBQUc7VUFDZkUsSUFBSSxFQUFFLHdDQUF3QztVQUM5Q0MsT0FBTyxFQUFFO1lBQ1BLLFFBQVEsRUFBRUwsT0FBTyxDQUFDSztVQUNwQjtRQUNGLENBQUM7TUFDSCxDQUFDLE1BQU0sSUFBSU4sSUFBSSxLQUFLLGlEQUFpRCxFQUFFO1FBQ3JFLElBQUksT0FBT0MsT0FBTyxDQUFDSyxRQUFRLEtBQUssUUFBUSxFQUFFO1VBQ3hDLE1BQU0sSUFBSVYsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSSxPQUFPSyxPQUFPLENBQUNRLFlBQVksS0FBSyxRQUFRLEVBQUU7VUFDNUMsTUFBTSxJQUFJYixTQUFTLENBQUMsbUZBQW1GLENBQUM7UUFDMUc7UUFFQSxJQUFJLE9BQU9LLE9BQU8sQ0FBQ00sUUFBUSxLQUFLLFFBQVEsRUFBRTtVQUN4QyxNQUFNLElBQUlYLFNBQVMsQ0FBQywrRUFBK0UsQ0FBQztRQUN0RztRQUVBRSxjQUFjLEdBQUc7VUFDZkUsSUFBSSxFQUFFLGlEQUFpRDtVQUN2REMsT0FBTyxFQUFFO1lBQ1BLLFFBQVEsRUFBRUwsT0FBTyxDQUFDSyxRQUFRO1lBQzFCRyxZQUFZLEVBQUVSLE9BQU8sQ0FBQ1EsWUFBWTtZQUNsQ0YsUUFBUSxFQUFFTixPQUFPLENBQUNNO1VBQ3BCO1FBQ0YsQ0FBQztNQUNILENBQUMsTUFBTTtRQUNMLElBQUlOLE9BQU8sQ0FBQ0UsUUFBUSxLQUFLSixTQUFTLElBQUksT0FBT0UsT0FBTyxDQUFDRSxRQUFRLEtBQUssUUFBUSxFQUFFO1VBQzFFLE1BQU0sSUFBSVAsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSUssT0FBTyxDQUFDRyxRQUFRLEtBQUtMLFNBQVMsSUFBSSxPQUFPRSxPQUFPLENBQUNHLFFBQVEsS0FBSyxRQUFRLEVBQUU7VUFDMUUsTUFBTSxJQUFJUixTQUFTLENBQUMsK0VBQStFLENBQUM7UUFDdEc7UUFFQUUsY0FBYyxHQUFHO1VBQ2ZFLElBQUksRUFBRSxTQUFTO1VBQ2ZDLE9BQU8sRUFBRTtZQUNQRSxRQUFRLEVBQUVGLE9BQU8sQ0FBQ0UsUUFBUTtZQUMxQkMsUUFBUSxFQUFFSCxPQUFPLENBQUNHO1VBQ3BCO1FBQ0YsQ0FBQztNQUNIO0lBQ0YsQ0FBQyxNQUFNO01BQ0xOLGNBQWMsR0FBRztRQUNmRSxJQUFJLEVBQUUsU0FBUztRQUNmQyxPQUFPLEVBQUU7VUFDUEUsUUFBUSxFQUFFSixTQUFTO1VBQ25CSyxRQUFRLEVBQUVMO1FBQ1o7TUFDRixDQUFDO0lBQ0g7SUFFQSxJQUFJLENBQUMvQixNQUFNLEdBQUc7TUFDWjZCLE1BQU0sRUFBRTdCLE1BQU0sQ0FBQzZCLE1BQU07TUFDckJDLGNBQWMsRUFBRUEsY0FBYztNQUM5QkcsT0FBTyxFQUFFO1FBQ1BTLHVCQUF1QixFQUFFLEtBQUs7UUFDOUJDLE9BQU8sRUFBRVosU0FBUztRQUNsQmEsZ0JBQWdCLEVBQUUsS0FBSztRQUN2QkMsYUFBYSxFQUFFN0Qsc0JBQXNCO1FBQ3JDOEQsMkJBQTJCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSTtRQUFHO1FBQ2xEQyx1QkFBdUIsRUFBRSxLQUFLO1FBQzlCQyxrQkFBa0IsRUFBRWpCLFNBQVM7UUFDN0JrQix1QkFBdUIsRUFBRWhFLDhCQUE4QjtRQUN2RGlFLGNBQWMsRUFBRXBFLHVCQUF1QjtRQUN2Q3FFLFNBQVMsRUFBRXBCLFNBQVM7UUFDcEJxQix3QkFBd0IsRUFBRUMsNEJBQWUsQ0FBQ0MsY0FBYztRQUN4REMsd0JBQXdCLEVBQUUsQ0FBQyxDQUFDO1FBQzVCQyxRQUFRLEVBQUV6QixTQUFTO1FBQ25CMEIsU0FBUyxFQUFFckUsaUJBQWlCO1FBQzVCc0UsVUFBVSxFQUFFbEUsa0JBQWtCO1FBQzlCa0IsS0FBSyxFQUFFO1VBQ0xpRCxJQUFJLEVBQUUsS0FBSztVQUNYQyxNQUFNLEVBQUUsS0FBSztVQUNiQyxPQUFPLEVBQUUsS0FBSztVQUNkckIsS0FBSyxFQUFFO1FBQ1QsQ0FBQztRQUNEc0IsY0FBYyxFQUFFLElBQUk7UUFDcEJDLHFCQUFxQixFQUFFLElBQUk7UUFDM0JDLGlCQUFpQixFQUFFLElBQUk7UUFDdkJDLGtCQUFrQixFQUFFLElBQUk7UUFDeEJDLGdCQUFnQixFQUFFLElBQUk7UUFDdEJDLDBCQUEwQixFQUFFLElBQUk7UUFDaENDLHlCQUF5QixFQUFFLElBQUk7UUFDL0JDLDBCQUEwQixFQUFFLEtBQUs7UUFDakNDLHVCQUF1QixFQUFFLEtBQUs7UUFDOUJDLHNCQUFzQixFQUFFLElBQUk7UUFDNUJDLE9BQU8sRUFBRSxJQUFJO1FBQ2JDLG1CQUFtQixFQUFFLEtBQUs7UUFDMUJDLDJCQUEyQixFQUFFM0MsU0FBUztRQUN0QzRDLFlBQVksRUFBRTVDLFNBQVM7UUFDdkI2QyxjQUFjLEVBQUV2Qiw0QkFBZSxDQUFDQyxjQUFjO1FBQzlDdUIsUUFBUSxFQUFFdEYsZ0JBQWdCO1FBQzFCdUYsWUFBWSxFQUFFL0MsU0FBUztRQUN2QmdELDJCQUEyQixFQUFFLENBQUM7UUFDOUJDLG1CQUFtQixFQUFFLEtBQUs7UUFDMUJDLFVBQVUsRUFBRS9GLG1CQUFtQjtRQUMvQmdHLElBQUksRUFBRTdGLFlBQVk7UUFDbEI4RixjQUFjLEVBQUUsS0FBSztRQUNyQkMsY0FBYyxFQUFFckcsOEJBQThCO1FBQzlDc0csbUJBQW1CLEVBQUUsS0FBSztRQUMxQkMsZ0NBQWdDLEVBQUUsS0FBSztRQUN2Q0MsVUFBVSxFQUFFeEQsU0FBUztRQUNyQnlELDhCQUE4QixFQUFFLEtBQUs7UUFDckNDLFVBQVUsRUFBRW5HLG1CQUFtQjtRQUMvQm9HLFFBQVEsRUFBRXZHLGdCQUFnQjtRQUMxQndHLG1CQUFtQixFQUFFNUQsU0FBUztRQUM5QjZELHNCQUFzQixFQUFFLEtBQUs7UUFDN0JDLGNBQWMsRUFBRSxLQUFLO1FBQ3JCQyxNQUFNLEVBQUUsSUFBSTtRQUNaQyxhQUFhLEVBQUVoRSxTQUFTO1FBQ3hCaUUsY0FBYyxFQUFFO01BQ2xCO0lBQ0YsQ0FBQztJQUVELElBQUloRyxNQUFNLENBQUNpQyxPQUFPLEVBQUU7TUFDbEIsSUFBSWpDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lELElBQUksSUFBSWxGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQVksRUFBRTtRQUN0RCxNQUFNLElBQUlzQixLQUFLLENBQUMsb0RBQW9ELEdBQUdqRyxNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFJLEdBQUcsT0FBTyxHQUFHbEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDMEMsWUFBWSxHQUFHLFdBQVcsQ0FBQztNQUNuSjtNQUVBLElBQUkzRSxNQUFNLENBQUNpQyxPQUFPLENBQUNTLHVCQUF1QixLQUFLWCxTQUFTLEVBQUU7UUFDeEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDUyx1QkFBdUIsS0FBSyxTQUFTLElBQUkxQyxNQUFNLENBQUNpQyxPQUFPLENBQUNTLHVCQUF1QixLQUFLLElBQUksRUFBRTtVQUNsSCxNQUFNLElBQUlkLFNBQVMsQ0FBQyx1RkFBdUYsQ0FBQztRQUM5RztRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ1MsdUJBQXVCLEdBQUcxQyxNQUFNLENBQUNpQyxPQUFPLENBQUNTLHVCQUF1QjtNQUN0RjtNQUVBLElBQUkxQyxNQUFNLENBQUNpQyxPQUFPLENBQUNVLE9BQU8sS0FBS1osU0FBUyxFQUFFO1FBQ3hDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ1UsT0FBTyxLQUFLLFFBQVEsRUFBRTtVQUM5QyxNQUFNLElBQUlmLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztRQUN0RjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ1UsT0FBTyxHQUFHM0MsTUFBTSxDQUFDaUMsT0FBTyxDQUFDVSxPQUFPO01BQ3REO01BRUEsSUFBSTNDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ1csZ0JBQWdCLEtBQUtiLFNBQVMsRUFBRTtRQUNqRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNXLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtVQUN4RCxNQUFNLElBQUloQixTQUFTLENBQUMseUVBQXlFLENBQUM7UUFDaEc7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNXLGdCQUFnQixHQUFHNUMsTUFBTSxDQUFDaUMsT0FBTyxDQUFDVyxnQkFBZ0I7TUFDeEU7TUFFQSxJQUFJNUMsTUFBTSxDQUFDaUMsT0FBTyxDQUFDWSxhQUFhLEtBQUtkLFNBQVMsRUFBRTtRQUM5QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNZLGFBQWEsS0FBSyxRQUFRLEVBQUU7VUFDcEQsTUFBTSxJQUFJakIsU0FBUyxDQUFDLHFFQUFxRSxDQUFDO1FBQzVGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDWSxhQUFhLEdBQUc3QyxNQUFNLENBQUNpQyxPQUFPLENBQUNZLGFBQWE7TUFDbEU7TUFFQSxJQUFJN0MsTUFBTSxDQUFDaUMsT0FBTyxDQUFDZSxrQkFBa0IsRUFBRTtRQUNyQyxJQUFJLE9BQU9oRCxNQUFNLENBQUNpQyxPQUFPLENBQUNlLGtCQUFrQixLQUFLLFVBQVUsRUFBRTtVQUMzRCxNQUFNLElBQUlwQixTQUFTLENBQUMsdUVBQXVFLENBQUM7UUFDOUY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNlLGtCQUFrQixHQUFHaEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDZSxrQkFBa0I7TUFDNUU7TUFFQSxJQUFJaEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUIsd0JBQXdCLEtBQUtyQixTQUFTLEVBQUU7UUFDekQsSUFBQW1FLHNDQUF5QixFQUFDbEcsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUIsd0JBQXdCLEVBQUUseUNBQXlDLENBQUM7UUFFN0csSUFBSSxDQUFDcEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUIsd0JBQXdCLEdBQUdwRCxNQUFNLENBQUNpQyxPQUFPLENBQUNtQix3QkFBd0I7TUFDeEY7TUFFQSxJQUFJcEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUIsY0FBYyxLQUFLbkIsU0FBUyxFQUFFO1FBQy9DLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lCLGNBQWMsS0FBSyxRQUFRLEVBQUU7VUFDckQsTUFBTSxJQUFJdEIsU0FBUyxDQUFDLHNFQUFzRSxDQUFDO1FBQzdGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUIsY0FBYyxHQUFHbEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUIsY0FBYztNQUNwRTtNQUVBLElBQUlsRCxNQUFNLENBQUNpQyxPQUFPLENBQUNrQixTQUFTLEtBQUtwQixTQUFTLEVBQUU7UUFDMUMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDa0IsU0FBUyxLQUFLLFVBQVUsRUFBRTtVQUNsRCxNQUFNLElBQUl2QixTQUFTLENBQUMsNkRBQTZELENBQUM7UUFDcEY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNrQixTQUFTLEdBQUduRCxNQUFNLENBQUNpQyxPQUFPLENBQUNrQixTQUFTO01BQzFEO01BRUEsSUFBSW5ELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NCLHdCQUF3QixLQUFLeEIsU0FBUyxFQUFFO1FBQ3pELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NCLHdCQUF3QixLQUFLLFFBQVEsSUFBSXZELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NCLHdCQUF3QixLQUFLLElBQUksRUFBRTtVQUNuSCxNQUFNLElBQUkzQixTQUFTLENBQUMsZ0ZBQWdGLENBQUM7UUFDdkc7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNzQix3QkFBd0IsR0FBR3ZELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NCLHdCQUF3QjtNQUN4RjtNQUVBLElBQUl2RCxNQUFNLENBQUNpQyxPQUFPLENBQUN1QixRQUFRLEtBQUt6QixTQUFTLEVBQUU7UUFDekMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdUIsUUFBUSxLQUFLLFFBQVEsRUFBRTtVQUMvQyxNQUFNLElBQUk1QixTQUFTLENBQUMsZ0VBQWdFLENBQUM7UUFDdkY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUN1QixRQUFRLEdBQUd4RCxNQUFNLENBQUNpQyxPQUFPLENBQUN1QixRQUFRO01BQ3hEO01BRUEsSUFBSXhELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dCLFNBQVMsS0FBSzFCLFNBQVMsRUFBRTtRQUMxQyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUN3QixTQUFTLEtBQUssUUFBUSxJQUFJekQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0IsU0FBUyxLQUFLLElBQUksRUFBRTtVQUNyRixNQUFNLElBQUk3QixTQUFTLENBQUMsaUVBQWlFLENBQUM7UUFDeEY7UUFFQSxJQUFJNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0IsU0FBUyxLQUFLLElBQUksS0FBS3pELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dCLFNBQVMsR0FBRyxDQUFDLElBQUl6RCxNQUFNLENBQUNpQyxPQUFPLENBQUN3QixTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUU7VUFDdkcsTUFBTSxJQUFJMEMsVUFBVSxDQUFDLCtEQUErRCxDQUFDO1FBQ3ZGO1FBRUEsSUFBSSxDQUFDbkcsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0IsU0FBUyxHQUFHekQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0IsU0FBUztNQUMxRDtNQUVBLElBQUl6RCxNQUFNLENBQUNpQyxPQUFPLENBQUN5QixVQUFVLEtBQUszQixTQUFTLEVBQUU7UUFDM0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDeUIsVUFBVSxLQUFLLFFBQVEsSUFBSTFELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3lCLFVBQVUsS0FBSyxJQUFJLEVBQUU7VUFDdkYsTUFBTSxJQUFJOUIsU0FBUyxDQUFDLDBFQUEwRSxDQUFDO1FBQ2pHO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDeUIsVUFBVSxHQUFHMUQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDeUIsVUFBVTtNQUM1RDtNQUVBLElBQUkxRCxNQUFNLENBQUNpQyxPQUFPLENBQUN2QixLQUFLLEVBQUU7UUFDeEIsSUFBSVYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDaUQsSUFBSSxLQUFLNUIsU0FBUyxFQUFFO1VBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQ2lELElBQUksS0FBSyxTQUFTLEVBQUU7WUFDbEQsTUFBTSxJQUFJL0IsU0FBUyxDQUFDLG1FQUFtRSxDQUFDO1VBQzFGO1VBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDaUQsSUFBSSxHQUFHM0QsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDaUQsSUFBSTtRQUM1RDtRQUVBLElBQUkzRCxNQUFNLENBQUNpQyxPQUFPLENBQUN2QixLQUFLLENBQUNrRCxNQUFNLEtBQUs3QixTQUFTLEVBQUU7VUFDN0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDa0QsTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUNwRCxNQUFNLElBQUloQyxTQUFTLENBQUMscUVBQXFFLENBQUM7VUFDNUY7VUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUN2QixLQUFLLENBQUNrRCxNQUFNLEdBQUc1RCxNQUFNLENBQUNpQyxPQUFPLENBQUN2QixLQUFLLENBQUNrRCxNQUFNO1FBQ2hFO1FBRUEsSUFBSTVELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQ21ELE9BQU8sS0FBSzlCLFNBQVMsRUFBRTtVQUM5QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUN2QixLQUFLLENBQUNtRCxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ3JELE1BQU0sSUFBSWpDLFNBQVMsQ0FBQyxzRUFBc0UsQ0FBQztVQUM3RjtVQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQ21ELE9BQU8sR0FBRzdELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQ21ELE9BQU87UUFDbEU7UUFFQSxJQUFJN0QsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDOEIsS0FBSyxLQUFLVCxTQUFTLEVBQUU7VUFDNUMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdkIsS0FBSyxDQUFDOEIsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUNuRCxNQUFNLElBQUlaLFNBQVMsQ0FBQyxvRUFBb0UsQ0FBQztVQUMzRjtVQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQzhCLEtBQUssR0FBR3hDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQzhCLEtBQUs7UUFDOUQ7TUFDRjtNQUVBLElBQUl4QyxNQUFNLENBQUNpQyxPQUFPLENBQUM2QixjQUFjLEtBQUsvQixTQUFTLEVBQUU7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkIsY0FBYyxLQUFLLFNBQVMsSUFBSTlELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZCLGNBQWMsS0FBSyxJQUFJLEVBQUU7VUFDaEcsTUFBTSxJQUFJbEMsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkIsY0FBYyxHQUFHOUQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkIsY0FBYztNQUNwRTtNQUVBLElBQUk5RCxNQUFNLENBQUNpQyxPQUFPLENBQUM4QixxQkFBcUIsS0FBS2hDLFNBQVMsRUFBRTtRQUN0RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUM4QixxQkFBcUIsS0FBSyxTQUFTLElBQUkvRCxNQUFNLENBQUNpQyxPQUFPLENBQUM4QixxQkFBcUIsS0FBSyxJQUFJLEVBQUU7VUFDOUcsTUFBTSxJQUFJbkMsU0FBUyxDQUFDLHNGQUFzRixDQUFDO1FBQzdHO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDOEIscUJBQXFCLEdBQUcvRCxNQUFNLENBQUNpQyxPQUFPLENBQUM4QixxQkFBcUI7TUFDbEY7TUFFQSxJQUFJL0QsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0IsaUJBQWlCLEtBQUtqQyxTQUFTLEVBQUU7UUFDbEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0IsaUJBQWlCLEtBQUssU0FBUyxJQUFJaEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0IsaUJBQWlCLEtBQUssSUFBSSxFQUFFO1VBQ3RHLE1BQU0sSUFBSXBDLFNBQVMsQ0FBQyxrRkFBa0YsQ0FBQztRQUN6RztRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQytCLGlCQUFpQixHQUFHaEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0IsaUJBQWlCO01BQzFFO01BRUEsSUFBSWhFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dDLGtCQUFrQixLQUFLbEMsU0FBUyxFQUFFO1FBQ25ELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dDLGtCQUFrQixLQUFLLFNBQVMsSUFBSWpFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dDLGtCQUFrQixLQUFLLElBQUksRUFBRTtVQUN4RyxNQUFNLElBQUlyQyxTQUFTLENBQUMsbUZBQW1GLENBQUM7UUFDMUc7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNnQyxrQkFBa0IsR0FBR2pFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dDLGtCQUFrQjtNQUM1RTtNQUVBLElBQUlqRSxNQUFNLENBQUNpQyxPQUFPLENBQUNpQyxnQkFBZ0IsS0FBS25DLFNBQVMsRUFBRTtRQUNqRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNpQyxnQkFBZ0IsS0FBSyxTQUFTLElBQUlsRSxNQUFNLENBQUNpQyxPQUFPLENBQUNpQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7VUFDcEcsTUFBTSxJQUFJdEMsU0FBUyxDQUFDLGlGQUFpRixDQUFDO1FBQ3hHO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUMsZ0JBQWdCLEdBQUdsRSxNQUFNLENBQUNpQyxPQUFPLENBQUNpQyxnQkFBZ0I7TUFDeEU7TUFFQSxJQUFJbEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDa0MsMEJBQTBCLEtBQUtwQyxTQUFTLEVBQUU7UUFDM0QsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDa0MsMEJBQTBCLEtBQUssU0FBUyxJQUFJbkUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDa0MsMEJBQTBCLEtBQUssSUFBSSxFQUFFO1VBQ3hILE1BQU0sSUFBSXZDLFNBQVMsQ0FBQywyRkFBMkYsQ0FBQztRQUNsSDtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2tDLDBCQUEwQixHQUFHbkUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDa0MsMEJBQTBCO01BQzVGO01BRUEsSUFBSW5FLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21DLHlCQUF5QixLQUFLckMsU0FBUyxFQUFFO1FBQzFELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21DLHlCQUF5QixLQUFLLFNBQVMsSUFBSXBFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21DLHlCQUF5QixLQUFLLElBQUksRUFBRTtVQUN0SCxNQUFNLElBQUl4QyxTQUFTLENBQUMsMEZBQTBGLENBQUM7UUFDakg7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNtQyx5QkFBeUIsR0FBR3BFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21DLHlCQUF5QjtNQUMxRjtNQUVBLElBQUlwRSxNQUFNLENBQUNpQyxPQUFPLENBQUNvQywwQkFBMEIsS0FBS3RDLFNBQVMsRUFBRTtRQUMzRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNvQywwQkFBMEIsS0FBSyxTQUFTLElBQUlyRSxNQUFNLENBQUNpQyxPQUFPLENBQUNvQywwQkFBMEIsS0FBSyxJQUFJLEVBQUU7VUFDeEgsTUFBTSxJQUFJekMsU0FBUyxDQUFDLDJGQUEyRixDQUFDO1FBQ2xIO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDb0MsMEJBQTBCLEdBQUdyRSxNQUFNLENBQUNpQyxPQUFPLENBQUNvQywwQkFBMEI7TUFDNUY7TUFFQSxJQUFJckUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUMsdUJBQXVCLEtBQUt2QyxTQUFTLEVBQUU7UUFDeEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUMsdUJBQXVCLEtBQUssU0FBUyxJQUFJdEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFO1VBQ2xILE1BQU0sSUFBSTFDLFNBQVMsQ0FBQyx3RkFBd0YsQ0FBQztRQUMvRztRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3FDLHVCQUF1QixHQUFHdEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUMsdUJBQXVCO01BQ3RGO01BRUEsSUFBSXRFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NDLHNCQUFzQixLQUFLeEMsU0FBUyxFQUFFO1FBQ3ZELElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NDLHNCQUFzQixLQUFLLFNBQVMsSUFBSXZFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NDLHNCQUFzQixLQUFLLElBQUksRUFBRTtVQUNoSCxNQUFNLElBQUkzQyxTQUFTLENBQUMsdUZBQXVGLENBQUM7UUFDOUc7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNzQyxzQkFBc0IsR0FBR3ZFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NDLHNCQUFzQjtNQUNwRjtNQUNBLElBQUl2RSxNQUFNLENBQUNpQyxPQUFPLENBQUN1QyxPQUFPLEtBQUt6QyxTQUFTLEVBQUU7UUFDeEMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtVQUMvQyxJQUFJeEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDdUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtZQUN2QyxNQUFNLElBQUk1QyxTQUFTLENBQUMscUVBQXFFLENBQUM7VUFDNUY7UUFDRjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3VDLE9BQU8sR0FBR3hFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3VDLE9BQU87TUFDdEQ7TUFFQSxJQUFJeEUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0MsbUJBQW1CLEtBQUsxQyxTQUFTLEVBQUU7UUFDcEQsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0MsbUJBQW1CLEtBQUssU0FBUyxFQUFFO1VBQzNELE1BQU0sSUFBSTdDLFNBQVMsQ0FBQyw0RUFBNEUsQ0FBQztRQUNuRztRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dDLG1CQUFtQixHQUFHekUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0MsbUJBQW1CO01BQzlFO01BRUEsSUFBSXpFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQVksS0FBSzVDLFNBQVMsRUFBRTtRQUM3QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUMwQyxZQUFZLEtBQUssUUFBUSxFQUFFO1VBQ25ELE1BQU0sSUFBSS9DLFNBQVMsQ0FBQyxvRUFBb0UsQ0FBQztRQUMzRjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQVksR0FBRzNFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQVk7UUFDOUQsSUFBSSxDQUFDM0UsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxHQUFHbkQsU0FBUztNQUN0QztNQUVBLElBQUkvQixNQUFNLENBQUNpQyxPQUFPLENBQUMyQyxjQUFjLEtBQUs3QyxTQUFTLEVBQUU7UUFDL0MsSUFBQW1FLHNDQUF5QixFQUFDbEcsTUFBTSxDQUFDaUMsT0FBTyxDQUFDMkMsY0FBYyxFQUFFLCtCQUErQixDQUFDO1FBRXpGLElBQUksQ0FBQzVFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzJDLGNBQWMsR0FBRzVFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzJDLGNBQWM7TUFDcEU7TUFFQSxJQUFJNUUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEMsUUFBUSxLQUFLOUMsU0FBUyxFQUFFO1FBQ3pDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzRDLFFBQVEsS0FBSyxRQUFRLElBQUk3RSxNQUFNLENBQUNpQyxPQUFPLENBQUM0QyxRQUFRLEtBQUssSUFBSSxFQUFFO1VBQ25GLE1BQU0sSUFBSWpELFNBQVMsQ0FBQyx3RUFBd0UsQ0FBQztRQUMvRjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzRDLFFBQVEsR0FBRzdFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzRDLFFBQVE7TUFDeEQ7TUFFQSxJQUFJN0UsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkMsWUFBWSxLQUFLL0MsU0FBUyxFQUFFO1FBQzdDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZDLFlBQVksS0FBSyxRQUFRLEVBQUU7VUFDbkQsTUFBTSxJQUFJbEQsU0FBUyxDQUFDLG9FQUFvRSxDQUFDO1FBQzNGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkMsWUFBWSxHQUFHOUUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkMsWUFBWTtNQUNoRTtNQUVBLElBQUk5RSxNQUFNLENBQUNpQyxPQUFPLENBQUMrQyxtQkFBbUIsS0FBS2pELFNBQVMsRUFBRTtRQUNwRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUMrQyxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7VUFDM0QsTUFBTSxJQUFJcEQsU0FBUyxDQUFDLDRFQUE0RSxDQUFDO1FBQ25HO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0MsbUJBQW1CLEdBQUdoRixNQUFNLENBQUNpQyxPQUFPLENBQUMrQyxtQkFBbUI7TUFDOUU7TUFFQSxJQUFJaEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDZ0QsVUFBVSxLQUFLbEQsU0FBUyxFQUFFO1FBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dELFVBQVUsS0FBSyxRQUFRLEVBQUU7VUFDakQsTUFBTSxJQUFJckQsU0FBUyxDQUFDLGtFQUFrRSxDQUFDO1FBQ3pGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDZ0QsVUFBVSxHQUFHakYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDZ0QsVUFBVTtNQUM1RDtNQUVBLElBQUlqRixNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFJLEtBQUtuRCxTQUFTLEVBQUU7UUFDckMsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxLQUFLLFFBQVEsRUFBRTtVQUMzQyxNQUFNLElBQUl0RCxTQUFTLENBQUMsNERBQTRELENBQUM7UUFDbkY7UUFFQSxJQUFJNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxJQUFJLENBQUMsSUFBSWxGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lELElBQUksSUFBSSxLQUFLLEVBQUU7VUFDNUQsTUFBTSxJQUFJaUIsVUFBVSxDQUFDLDREQUE0RCxDQUFDO1FBQ3BGO1FBRUEsSUFBSSxDQUFDbkcsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxHQUFHbEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSTtRQUM5QyxJQUFJLENBQUNsRixNQUFNLENBQUNpQyxPQUFPLENBQUMwQyxZQUFZLEdBQUc1QyxTQUFTO01BQzlDO01BRUEsSUFBSS9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2tELGNBQWMsS0FBS3BELFNBQVMsRUFBRTtRQUMvQyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNrRCxjQUFjLEtBQUssU0FBUyxFQUFFO1VBQ3RELE1BQU0sSUFBSXZELFNBQVMsQ0FBQyx1RUFBdUUsQ0FBQztRQUM5RjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2tELGNBQWMsR0FBR25GLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2tELGNBQWM7TUFDcEU7TUFFQSxJQUFJbkYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUQsY0FBYyxLQUFLckQsU0FBUyxFQUFFO1FBQy9DLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21ELGNBQWMsS0FBSyxRQUFRLEVBQUU7VUFDckQsTUFBTSxJQUFJeEQsU0FBUyxDQUFDLHNFQUFzRSxDQUFDO1FBQzdGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUQsY0FBYyxHQUFHcEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUQsY0FBYztNQUNwRTtNQUVBLElBQUlwRixNQUFNLENBQUNpQyxPQUFPLENBQUM4QywyQkFBMkIsS0FBS2hELFNBQVMsRUFBRTtRQUM1RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUM4QywyQkFBMkIsS0FBSyxRQUFRLEVBQUU7VUFDbEUsTUFBTSxJQUFJbkQsU0FBUyxDQUFDLG1GQUFtRixDQUFDO1FBQzFHO1FBRUEsSUFBSTVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzhDLDJCQUEyQixHQUFHLENBQUMsRUFBRTtVQUNsRCxNQUFNLElBQUluRCxTQUFTLENBQUMsNEZBQTRGLENBQUM7UUFDbkg7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUM4QywyQkFBMkIsR0FBRy9FLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzhDLDJCQUEyQjtNQUM5RjtNQUVBLElBQUkvRSxNQUFNLENBQUNpQyxPQUFPLENBQUNnQix1QkFBdUIsS0FBS2xCLFNBQVMsRUFBRTtRQUN4RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNnQix1QkFBdUIsS0FBSyxRQUFRLEVBQUU7VUFDOUQsTUFBTSxJQUFJckIsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSTVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dCLHVCQUF1QixJQUFJLENBQUMsRUFBRTtVQUMvQyxNQUFNLElBQUlyQixTQUFTLENBQUMsK0VBQStFLENBQUM7UUFDdEc7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUNnQix1QkFBdUIsR0FBR2pELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dCLHVCQUF1QjtNQUN0RjtNQUVBLElBQUlqRCxNQUFNLENBQUNpQyxPQUFPLENBQUNvRCxtQkFBbUIsS0FBS3RELFNBQVMsRUFBRTtRQUNwRCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUNvRCxtQkFBbUIsS0FBSyxTQUFTLEVBQUU7VUFDM0QsTUFBTSxJQUFJekQsU0FBUyxDQUFDLDRFQUE0RSxDQUFDO1FBQ25HO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDb0QsbUJBQW1CLEdBQUdyRixNQUFNLENBQUNpQyxPQUFPLENBQUNvRCxtQkFBbUI7TUFDOUU7TUFFQSxJQUFJckYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUQsZ0NBQWdDLEtBQUt2RCxTQUFTLEVBQUU7UUFDakUsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUQsZ0NBQWdDLEtBQUssU0FBUyxFQUFFO1VBQ3hFLE1BQU0sSUFBSTFELFNBQVMsQ0FBQyx5RkFBeUYsQ0FBQztRQUNoSDtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3FELGdDQUFnQyxHQUFHdEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUQsZ0NBQWdDO01BQ3hHO01BRUEsSUFBSXRGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsS0FBSzFELFNBQVMsRUFBRTtRQUMzQyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUN3RCxVQUFVLEtBQUssUUFBUSxFQUFFO1VBQ2pELE1BQU0sSUFBSTdELFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQztRQUN6RjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsR0FBR3pGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVU7TUFDNUQ7TUFFQSxJQUFJekYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDeUQsUUFBUSxLQUFLM0QsU0FBUyxFQUFFO1FBQ3pDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3lELFFBQVEsS0FBSyxRQUFRLElBQUkxRixNQUFNLENBQUNpQyxPQUFPLENBQUN5RCxRQUFRLEtBQUssSUFBSSxFQUFFO1VBQ25GLE1BQU0sSUFBSTlELFNBQVMsQ0FBQyx3RUFBd0UsQ0FBQztRQUMvRjtRQUVBLElBQUk1QixNQUFNLENBQUNpQyxPQUFPLENBQUN5RCxRQUFRLEdBQUcsVUFBVSxFQUFFO1VBQ3hDLE1BQU0sSUFBSTlELFNBQVMsQ0FBQyxrRUFBa0UsQ0FBQztRQUN6RixDQUFDLE1BQU0sSUFBSTVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3lELFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRTtVQUN2QyxNQUFNLElBQUk5RCxTQUFTLENBQUMsMERBQTBELENBQUM7UUFDakY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUN5RCxRQUFRLEdBQUcxRixNQUFNLENBQUNpQyxPQUFPLENBQUN5RCxRQUFRLEdBQUcsQ0FBQztNQUM1RDtNQUVBLElBQUkxRixNQUFNLENBQUNpQyxPQUFPLENBQUMyRCxzQkFBc0IsS0FBSzdELFNBQVMsRUFBRTtRQUN2RCxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUMyRCxzQkFBc0IsS0FBSyxTQUFTLEVBQUU7VUFDOUQsTUFBTSxJQUFJaEUsU0FBUyxDQUFDLCtFQUErRSxDQUFDO1FBQ3RHO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDMkQsc0JBQXNCLEdBQUc1RixNQUFNLENBQUNpQyxPQUFPLENBQUMyRCxzQkFBc0I7TUFDcEY7TUFFQSxJQUFJNUYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDc0QsVUFBVSxLQUFLeEQsU0FBUyxFQUFFO1FBQzNDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NELFVBQVUsS0FBSyxRQUFRLEVBQUU7VUFDakQsTUFBTSxJQUFJM0QsU0FBUyxDQUFDLGtFQUFrRSxDQUFDO1FBQ3pGO1FBQ0EsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDc0QsVUFBVSxHQUFHdkYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDc0QsVUFBVTtNQUM1RDtNQUVBLElBQUl2RixNQUFNLENBQUNpQyxPQUFPLENBQUM0RCxjQUFjLEtBQUs5RCxTQUFTLEVBQUU7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEQsY0FBYyxLQUFLLFNBQVMsRUFBRTtVQUN0RCxNQUFNLElBQUlqRSxTQUFTLENBQUMsdUVBQXVFLENBQUM7UUFDOUY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUM0RCxjQUFjLEdBQUc3RixNQUFNLENBQUNpQyxPQUFPLENBQUM0RCxjQUFjO01BQ3BFO01BRUEsSUFBSTdGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZELE1BQU0sS0FBSy9ELFNBQVMsRUFBRTtRQUN2QyxJQUFJLE9BQU8vQixNQUFNLENBQUNpQyxPQUFPLENBQUM2RCxNQUFNLEtBQUssU0FBUyxFQUFFO1VBQzlDLE1BQU0sSUFBSWxFLFNBQVMsQ0FBQywrREFBK0QsQ0FBQztRQUN0RjtRQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZELE1BQU0sR0FBRzlGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZELE1BQU07TUFDcEQ7TUFFQSxJQUFJOUYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDOEQsYUFBYSxLQUFLaEUsU0FBUyxFQUFFO1FBQzlDLElBQUksT0FBTy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzhELGFBQWEsS0FBSyxRQUFRLEVBQUU7VUFDcEQsTUFBTSxJQUFJbkUsU0FBUyxDQUFDLHFFQUFxRSxDQUFDO1FBQzVGO1FBRUEsSUFBSSxDQUFDNUIsTUFBTSxDQUFDaUMsT0FBTyxDQUFDOEQsYUFBYSxHQUFHL0YsTUFBTSxDQUFDaUMsT0FBTyxDQUFDOEQsYUFBYTtNQUNsRTtNQUVBLElBQUkvRixNQUFNLENBQUNpQyxPQUFPLENBQUMrRCxjQUFjLEtBQUtqRSxTQUFTLEVBQUU7UUFDL0MsSUFBSSxPQUFPL0IsTUFBTSxDQUFDaUMsT0FBTyxDQUFDK0QsY0FBYyxLQUFLLFNBQVMsRUFBRTtVQUN0RCxNQUFNLElBQUlwRSxTQUFTLENBQUMsdUVBQXVFLENBQUM7UUFDOUY7UUFFQSxJQUFJLENBQUM1QixNQUFNLENBQUNpQyxPQUFPLENBQUMrRCxjQUFjLEdBQUdoRyxNQUFNLENBQUNpQyxPQUFPLENBQUMrRCxjQUFjO01BQ3BFO0lBQ0Y7SUFFQSxJQUFJLENBQUMvRixvQkFBb0IsR0FBRyxJQUFJLENBQUNELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NCLHdCQUF3QjtJQUN4RSxJQUFJLElBQUksQ0FBQ3RELG9CQUFvQixDQUFDbUcsYUFBYSxLQUFLckUsU0FBUyxFQUFFO01BQ3pEO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQSxJQUFJLENBQUM5QixvQkFBb0IsR0FBRzdCLE1BQU0sQ0FBQ2lJLE1BQU0sQ0FBQyxJQUFJLENBQUNwRyxvQkFBb0IsRUFBRTtRQUNuRW1HLGFBQWEsRUFBRTtVQUNiRSxLQUFLLEVBQUVDLGtCQUFTLENBQUNDO1FBQ25CO01BQ0YsQ0FBQyxDQUFDO0lBQ0o7SUFFQSxJQUFJLENBQUM5RixLQUFLLEdBQUcsSUFBSSxDQUFDK0YsV0FBVyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDdkcsYUFBYSxHQUFHLEtBQUs7SUFDMUIsSUFBSSxDQUFDQyxzQkFBc0IsR0FBRyxDQUFDdUcsTUFBTSxDQUFDQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFckU7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBLElBQUksQ0FBQ3ZHLGdCQUFnQixHQUFHLENBQUM7SUFDekIsSUFBSSxDQUFDQyxVQUFVLEdBQUcsS0FBSztJQUN2QixJQUFJLENBQUNHLE1BQU0sR0FBRyxLQUFLO0lBQ25CLElBQUksQ0FBQ1ksYUFBYSxHQUFHc0YsTUFBTSxDQUFDRSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRXBDLElBQUksQ0FBQ3RHLHNCQUFzQixHQUFHLENBQUM7SUFDL0IsSUFBSSxDQUFDQyxvQkFBb0IsR0FBRyxJQUFJc0csMENBQW9CLENBQUMsQ0FBQztJQUV0RCxJQUFJLENBQUM5RixLQUFLLEdBQUcsSUFBSSxDQUFDK0YsS0FBSyxDQUFDQyxXQUFXO0lBRW5DLElBQUksQ0FBQ3RGLHVCQUF1QixHQUFHLE1BQU07TUFDbkMsSUFBSSxDQUFDWCxTQUFTLENBQUNrRyxXQUFXLENBQUNDLFlBQUksQ0FBQ0MsU0FBUyxDQUFDO01BQzFDLElBQUksQ0FBQ0MsaUJBQWlCLENBQUMsQ0FBQztJQUMxQixDQUFDO0VBQ0g7RUFFQUMsT0FBT0EsQ0FBQ0MsZUFBdUMsRUFBRTtJQUMvQyxJQUFJLElBQUksQ0FBQ3RHLEtBQUssS0FBSyxJQUFJLENBQUMrRixLQUFLLENBQUNDLFdBQVcsRUFBRTtNQUN6QyxNQUFNLElBQUlPLHVCQUFlLENBQUMsbURBQW1ELEdBQUcsSUFBSSxDQUFDdkcsS0FBSyxDQUFDd0csSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUMvRztJQUVBLElBQUlGLGVBQWUsRUFBRTtNQUNuQixNQUFNRyxTQUFTLEdBQUlDLEdBQVcsSUFBSztRQUNqQyxJQUFJLENBQUNDLGNBQWMsQ0FBQyxPQUFPLEVBQUVDLE9BQU8sQ0FBQztRQUNyQ04sZUFBZSxDQUFDSSxHQUFHLENBQUM7TUFDdEIsQ0FBQztNQUVELE1BQU1FLE9BQU8sR0FBSUYsR0FBVSxJQUFLO1FBQzlCLElBQUksQ0FBQ0MsY0FBYyxDQUFDLFNBQVMsRUFBRUYsU0FBUyxDQUFDO1FBQ3pDSCxlQUFlLENBQUNJLEdBQUcsQ0FBQztNQUN0QixDQUFDO01BRUQsSUFBSSxDQUFDRyxJQUFJLENBQUMsU0FBUyxFQUFFSixTQUFTLENBQUM7TUFDL0IsSUFBSSxDQUFDSSxJQUFJLENBQUMsT0FBTyxFQUFFRCxPQUFPLENBQUM7SUFDN0I7SUFFQSxJQUFJLENBQUNFLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ2dCLFVBQVUsQ0FBQztFQUMxQzs7RUFFQTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQVVFO0FBQ0Y7QUFDQTtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBR0U7QUFDRjtBQUNBOztFQUdFO0FBQ0Y7QUFDQTs7RUFHRTtBQUNGO0FBQ0E7O0VBR0VDLEVBQUVBLENBQUNDLEtBQXNCLEVBQUVDLFFBQWtDLEVBQUU7SUFDN0QsT0FBTyxLQUFLLENBQUNGLEVBQUUsQ0FBQ0MsS0FBSyxFQUFFQyxRQUFRLENBQUM7RUFDbEM7O0VBRUE7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFFRTtBQUNGO0FBQ0E7O0VBRUU7QUFDRjtBQUNBOztFQUVFO0FBQ0Y7QUFDQTs7RUFHRUMsSUFBSUEsQ0FBQ0YsS0FBc0IsRUFBRSxHQUFHRyxJQUFXLEVBQUU7SUFDM0MsT0FBTyxLQUFLLENBQUNELElBQUksQ0FBQ0YsS0FBSyxFQUFFLEdBQUdHLElBQUksQ0FBQztFQUNuQzs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VDLEtBQUtBLENBQUEsRUFBRztJQUNOLElBQUksQ0FBQ1AsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO0VBQ3JDOztFQUVBO0FBQ0Y7QUFDQTtFQUNFQyxvQkFBb0JBLENBQUEsRUFBRztJQUNyQixNQUFNQyxNQUFNLEdBQUcsSUFBSSxDQUFDQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhDLElBQUksSUFBSSxDQUFDeEksTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxFQUFFO01BQzVCLE9BQU8sSUFBSSxDQUFDdUQsYUFBYSxDQUFDLElBQUksQ0FBQ3pJLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lELElBQUksRUFBRSxJQUFJLENBQUNsRixNQUFNLENBQUNpQyxPQUFPLENBQUMrQyxtQkFBbUIsRUFBRXVELE1BQU0sRUFBRSxJQUFJLENBQUN2SSxNQUFNLENBQUNpQyxPQUFPLENBQUNrQixTQUFTLENBQUM7SUFDckksQ0FBQyxNQUFNO01BQ0wsT0FBTyxJQUFBdUYsOEJBQWMsRUFBQztRQUNwQjdHLE1BQU0sRUFBRSxJQUFJLENBQUM3QixNQUFNLENBQUM2QixNQUFNO1FBQzFCOEMsWUFBWSxFQUFFLElBQUksQ0FBQzNFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQWE7UUFDL0NnRSxPQUFPLEVBQUUsSUFBSSxDQUFDM0ksTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUIsY0FBYztRQUMzQ3FGLE1BQU0sRUFBRUE7TUFDVixDQUFDLENBQUMsQ0FBQ0ssSUFBSSxDQUFFMUQsSUFBSSxJQUFLO1FBQ2hCMkQsT0FBTyxDQUFDQyxRQUFRLENBQUMsTUFBTTtVQUNyQixJQUFJLENBQUNMLGFBQWEsQ0FBQ3ZELElBQUksRUFBRSxJQUFJLENBQUNsRixNQUFNLENBQUNpQyxPQUFPLENBQUMrQyxtQkFBbUIsRUFBRXVELE1BQU0sRUFBRSxJQUFJLENBQUN2SSxNQUFNLENBQUNpQyxPQUFPLENBQUNrQixTQUFTLENBQUM7UUFDMUcsQ0FBQyxDQUFDO01BQ0osQ0FBQyxFQUFHc0UsR0FBRyxJQUFLO1FBQ1YsSUFBSSxDQUFDc0IsaUJBQWlCLENBQUMsQ0FBQztRQUN4QixJQUFJdEIsR0FBRyxDQUFDRixJQUFJLEtBQUssWUFBWSxFQUFFO1VBQzdCO1VBQ0E7UUFDRjtRQUVBc0IsT0FBTyxDQUFDQyxRQUFRLENBQUMsTUFBTTtVQUNyQixJQUFJLENBQUNaLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSVosdUJBQWUsQ0FBQ0csR0FBRyxDQUFDdUIsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZFLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQztJQUNKO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0VDLGlCQUFpQkEsQ0FBQ0MsV0FBMkQsRUFBRTtJQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDMUksTUFBTSxFQUFFO01BQ2hCLElBQUksQ0FBQ3VJLGlCQUFpQixDQUFDLENBQUM7TUFDeEIsSUFBSSxDQUFDSSxpQkFBaUIsQ0FBQyxDQUFDO01BQ3hCLElBQUksQ0FBQ0MsZUFBZSxDQUFDLENBQUM7TUFDdEIsSUFBSSxDQUFDQyxlQUFlLENBQUMsQ0FBQztNQUN0QixJQUFJSCxXQUFXLEtBQUt6SixZQUFZLENBQUNFLFFBQVEsRUFBRTtRQUN6QyxJQUFJLENBQUN1SSxJQUFJLENBQUMsV0FBVyxDQUFDO01BQ3hCLENBQUMsTUFBTSxJQUFJZ0IsV0FBVyxLQUFLekosWUFBWSxDQUFDRyxLQUFLLEVBQUU7UUFDN0NpSixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1VBQ3JCLElBQUksQ0FBQ1osSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNsQixDQUFDLENBQUM7TUFDSjtNQUVBLE1BQU1qSCxPQUFPLEdBQUcsSUFBSSxDQUFDQSxPQUFPO01BQzVCLElBQUlBLE9BQU8sRUFBRTtRQUNYLE1BQU13RyxHQUFHLEdBQUcsSUFBSTZCLG9CQUFZLENBQUMsNkNBQTZDLEVBQUUsUUFBUSxDQUFDO1FBQ3JGckksT0FBTyxDQUFDc0ksUUFBUSxDQUFDOUIsR0FBRyxDQUFDO1FBQ3JCLElBQUksQ0FBQ3hHLE9BQU8sR0FBR2MsU0FBUztNQUMxQjtNQUVBLElBQUksQ0FBQ3ZCLE1BQU0sR0FBRyxJQUFJO01BQ2xCLElBQUksQ0FBQ0MsVUFBVSxHQUFHc0IsU0FBUztJQUM3QjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFMEUsV0FBV0EsQ0FBQSxFQUFHO0lBQ1osTUFBTS9GLEtBQUssR0FBRyxJQUFJOEksY0FBSyxDQUFDLElBQUksQ0FBQ3hKLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3ZCLEtBQUssQ0FBQztJQUNsREEsS0FBSyxDQUFDcUgsRUFBRSxDQUFDLE9BQU8sRUFBR2lCLE9BQU8sSUFBSztNQUM3QixJQUFJLENBQUNkLElBQUksQ0FBQyxPQUFPLEVBQUVjLE9BQU8sQ0FBQztJQUM3QixDQUFDLENBQUM7SUFDRixPQUFPdEksS0FBSztFQUNkOztFQUVBO0FBQ0Y7QUFDQTtFQUNFK0ksdUJBQXVCQSxDQUFDVCxPQUFnQixFQUFFVSxPQUFxQixFQUFFO0lBQy9ELE9BQU8sSUFBSUMseUJBQWlCLENBQUNYLE9BQU8sRUFBRSxJQUFJLENBQUN0SSxLQUFLLEVBQUVnSixPQUFPLEVBQUUsSUFBSSxDQUFDMUosTUFBTSxDQUFDaUMsT0FBTyxDQUFDO0VBQ2pGO0VBRUEySCw2QkFBNkJBLENBQUN6SSxNQUFrQixFQUFFO0lBQ2hEQSxNQUFNLENBQUM0RyxFQUFFLENBQUMsT0FBTyxFQUFHOEIsS0FBSyxJQUFLO01BQUUsSUFBSSxDQUFDQyxXQUFXLENBQUNELEtBQUssQ0FBQztJQUFFLENBQUMsQ0FBQztJQUMzRDFJLE1BQU0sQ0FBQzRHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTTtNQUFFLElBQUksQ0FBQ2dDLFdBQVcsQ0FBQyxDQUFDO0lBQUUsQ0FBQyxDQUFDO0lBQ2pENUksTUFBTSxDQUFDNEcsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNO01BQUUsSUFBSSxDQUFDaUMsU0FBUyxDQUFDLENBQUM7SUFBRSxDQUFDLENBQUM7SUFDN0M3SSxNQUFNLENBQUM4SSxZQUFZLENBQUMsSUFBSSxFQUFFcEwsd0JBQXdCLENBQUM7SUFFbkQsSUFBSSxDQUFDaUMsU0FBUyxHQUFHLElBQUlvSixrQkFBUyxDQUFDL0ksTUFBTSxFQUFFLElBQUksQ0FBQ25CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dELFVBQVUsRUFBRSxJQUFJLENBQUN2RSxLQUFLLENBQUM7SUFDbEYsSUFBSSxDQUFDSSxTQUFTLENBQUNpSCxFQUFFLENBQUMsUUFBUSxFQUFHb0MsU0FBUyxJQUFLO01BQUUsSUFBSSxDQUFDakMsSUFBSSxDQUFDLFFBQVEsRUFBRWlDLFNBQVMsQ0FBQztJQUFFLENBQUMsQ0FBQztJQUUvRSxJQUFJLENBQUNoSixNQUFNLEdBQUdBLE1BQU07SUFFcEIsSUFBSSxDQUFDWCxNQUFNLEdBQUcsS0FBSztJQUNuQixJQUFJLENBQUNFLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDcEssTUFBTSxDQUFDNkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM3QixNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFJLENBQUM7SUFFckYsSUFBSSxDQUFDbUYsWUFBWSxDQUFDLENBQUM7SUFDbkIsSUFBSSxDQUFDeEMsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDd0QsYUFBYSxDQUFDO0VBQzdDO0VBRUFDLFdBQVdBLENBQUNwSixNQUFrQixFQUEwQjtJQUN0RCxPQUFPLElBQUlxSixPQUFPLENBQUMsQ0FBQ0MsT0FBTyxFQUFFQyxNQUFNLEtBQUs7TUFDdEMsTUFBTUMsYUFBYSxHQUFHeFAsR0FBRyxDQUFDeVAsbUJBQW1CLENBQUMsSUFBSSxDQUFDM0ssb0JBQW9CLENBQUM7TUFDeEU7TUFDQTtNQUNBO01BQ0EsTUFBTXNGLFVBQVUsR0FBRyxDQUFDbEssR0FBRyxDQUFDd1AsSUFBSSxDQUFDLElBQUksQ0FBQzdLLE1BQU0sQ0FBQzZCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQzdCLE1BQU0sQ0FBQzZCLE1BQU0sR0FBRyxFQUFFO01BQzFFLE1BQU1pSixjQUFjLEdBQUc7UUFDckJDLElBQUksRUFBRSxJQUFJLENBQUMvSyxNQUFNLENBQUM2QixNQUFNO1FBQ3hCVixNQUFNLEVBQUVBLE1BQU07UUFDZDZKLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQztRQUMxQkwsYUFBYSxFQUFFQSxhQUFhO1FBQzVCTSxVQUFVLEVBQUUsSUFBSSxDQUFDakwsTUFBTSxDQUFDaUMsT0FBTyxDQUFDc0QsVUFBVSxHQUFHLElBQUksQ0FBQ3ZGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NELFVBQVUsR0FBR0E7TUFDaEYsQ0FBQztNQUVELE1BQU0yRixhQUFhLEdBQUcvUCxHQUFHLENBQUNpTSxPQUFPLENBQUMwRCxjQUFjLEVBQUUsTUFBTTtRQUN0REksYUFBYSxDQUFDeEQsY0FBYyxDQUFDLE9BQU8sRUFBRWdELE1BQU0sQ0FBQztRQUM3Q0QsT0FBTyxDQUFDUyxhQUFhLENBQUM7TUFDeEIsQ0FBQyxDQUFDO01BRUZBLGFBQWEsQ0FBQ3RELElBQUksQ0FBQyxPQUFPLEVBQUU4QyxNQUFNLENBQUM7SUFDckMsQ0FBQyxDQUFDO0VBQ0o7RUFFQWpDLGFBQWFBLENBQUN2RCxJQUFZLEVBQUVGLG1CQUE0QixFQUFFdUQsTUFBbUIsRUFBRTRDLGVBQTJDLEVBQUU7SUFDMUgsTUFBTUMsV0FBVyxHQUFHO01BQ2xCTCxJQUFJLEVBQUUsSUFBSSxDQUFDbEssV0FBVyxHQUFHLElBQUksQ0FBQ0EsV0FBVyxDQUFDZ0IsTUFBTSxHQUFHLElBQUksQ0FBQzdCLE1BQU0sQ0FBQzZCLE1BQU07TUFDckVxRCxJQUFJLEVBQUUsSUFBSSxDQUFDckUsV0FBVyxHQUFHLElBQUksQ0FBQ0EsV0FBVyxDQUFDcUUsSUFBSSxHQUFHQSxJQUFJO01BQ3JESixZQUFZLEVBQUUsSUFBSSxDQUFDOUUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNkM7SUFDcEMsQ0FBQztJQUVELE1BQU1zQyxPQUFPLEdBQUcrRCxlQUFlLEtBQUtuRyxtQkFBbUIsR0FBR3FHLDRCQUFpQixHQUFHQyw0QkFBaUIsQ0FBQztJQUVoRyxDQUFDLFlBQVk7TUFDWCxJQUFJbkssTUFBTSxHQUFHLE1BQU1pRyxPQUFPLENBQUNnRSxXQUFXLEVBQUVHLFlBQUcsQ0FBQ0MsTUFBTSxFQUFFakQsTUFBTSxDQUFDO01BRTNELElBQUksSUFBSSxDQUFDdkksTUFBTSxDQUFDaUMsT0FBTyxDQUFDdUMsT0FBTyxLQUFLLFFBQVEsRUFBRTtRQUM1QyxJQUFJO1VBQ0Y7VUFDQXJELE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQ29KLFdBQVcsQ0FBQ3BKLE1BQU0sQ0FBQztRQUN6QyxDQUFDLENBQUMsT0FBT3NHLEdBQUcsRUFBRTtVQUNadEcsTUFBTSxDQUFDc0ssR0FBRyxDQUFDLENBQUM7VUFFWixNQUFNaEUsR0FBRztRQUNYO01BQ0Y7TUFFQSxJQUFJLENBQUNtQyw2QkFBNkIsQ0FBQ3pJLE1BQU0sQ0FBQztJQUM1QyxDQUFDLEVBQUUsQ0FBQyxDQUFDdUssS0FBSyxDQUFFakUsR0FBRyxJQUFLO01BQ2xCLElBQUksQ0FBQ3NCLGlCQUFpQixDQUFDLENBQUM7TUFFeEIsSUFBSXRCLEdBQUcsQ0FBQ0YsSUFBSSxLQUFLLFlBQVksRUFBRTtRQUM3QjtNQUNGO01BRUFzQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1FBQUUsSUFBSSxDQUFDZ0IsV0FBVyxDQUFDckMsR0FBRyxDQUFDO01BQUUsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQztFQUNKOztFQUVBO0FBQ0Y7QUFDQTtFQUNFNEIsZUFBZUEsQ0FBQSxFQUFHO0lBQ2hCLElBQUksSUFBSSxDQUFDbEksTUFBTSxFQUFFO01BQ2YsSUFBSSxDQUFDQSxNQUFNLENBQUN3SyxPQUFPLENBQUMsQ0FBQztJQUN2QjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFbkQsa0JBQWtCQSxDQUFBLEVBQUc7SUFDbkIsTUFBTW9ELFVBQVUsR0FBRyxJQUFJQyxvQ0FBZSxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDeEssWUFBWSxHQUFHeUssVUFBVSxDQUFDLE1BQU07TUFDbkNGLFVBQVUsQ0FBQ0csS0FBSyxDQUFDLENBQUM7TUFDbEIsSUFBSSxDQUFDN0ksY0FBYyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxFQUFFLElBQUksQ0FBQ2xELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lCLGNBQWMsQ0FBQztJQUN0QyxPQUFPMEksVUFBVSxDQUFDckQsTUFBTTtFQUMxQjs7RUFFQTtBQUNGO0FBQ0E7RUFDRXBCLGlCQUFpQkEsQ0FBQSxFQUFHO0lBQ2xCLElBQUksQ0FBQzZFLGdCQUFnQixDQUFDLENBQUM7SUFDdkIsTUFBTXJELE9BQU8sR0FBRyxJQUFJLENBQUMzSSxNQUFNLENBQUNpQyxPQUFPLENBQUNZLGFBQWE7SUFDakQsSUFBSThGLE9BQU8sR0FBRyxDQUFDLEVBQUU7TUFDZixJQUFJLENBQUNySCxXQUFXLEdBQUd3SyxVQUFVLENBQUMsTUFBTTtRQUNsQyxJQUFJLENBQUNqSixhQUFhLENBQUMsQ0FBQztNQUN0QixDQUFDLEVBQUU4RixPQUFPLENBQUM7SUFDYjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFc0Qsa0JBQWtCQSxDQUFBLEVBQUc7SUFDbkIsSUFBSSxDQUFDOUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTWxJLE9BQU8sR0FBRyxJQUFJLENBQUNBLE9BQWtCO0lBQ3ZDLE1BQU0wSCxPQUFPLEdBQUkxSCxPQUFPLENBQUMwSCxPQUFPLEtBQUs1RyxTQUFTLEdBQUlkLE9BQU8sQ0FBQzBILE9BQU8sR0FBRyxJQUFJLENBQUMzSSxNQUFNLENBQUNpQyxPQUFPLENBQUNtRCxjQUFjO0lBQ3RHLElBQUl1RCxPQUFPLEVBQUU7TUFDWCxJQUFJLENBQUNwSCxZQUFZLEdBQUd1SyxVQUFVLENBQUMsTUFBTTtRQUNuQyxJQUFJLENBQUMxRyxjQUFjLENBQUMsQ0FBQztNQUN2QixDQUFDLEVBQUV1RCxPQUFPLENBQUM7SUFDYjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFdUQsZ0JBQWdCQSxDQUFBLEVBQUc7SUFDakIsSUFBSSxDQUFDOUMsZUFBZSxDQUFDLENBQUM7SUFDdEIsSUFBSSxDQUFDNUgsVUFBVSxHQUFHc0ssVUFBVSxDQUFDLE1BQU07TUFDakMsSUFBSSxDQUFDSyxZQUFZLENBQUMsQ0FBQztJQUNyQixDQUFDLEVBQUUsSUFBSSxDQUFDbk0sTUFBTSxDQUFDaUMsT0FBTyxDQUFDZ0IsdUJBQXVCLENBQUM7RUFDakQ7O0VBRUE7QUFDRjtBQUNBO0VBQ0VDLGNBQWNBLENBQUEsRUFBRztJQUNmLE1BQU1rSixXQUFXLEdBQUcsSUFBSSxDQUFDcE0sTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSSxHQUFJLElBQUcsSUFBSSxDQUFDbEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSyxFQUFDLEdBQUksS0FBSSxJQUFJLENBQUNsRixNQUFNLENBQUNpQyxPQUFPLENBQUMwQyxZQUFhLEVBQUM7SUFDdkg7SUFDQSxNQUFNOUMsTUFBTSxHQUFHLElBQUksQ0FBQ2hCLFdBQVcsR0FBRyxJQUFJLENBQUNBLFdBQVcsQ0FBQ2dCLE1BQU0sR0FBRyxJQUFJLENBQUM3QixNQUFNLENBQUM2QixNQUFNO0lBQzlFLE1BQU1xRCxJQUFJLEdBQUcsSUFBSSxDQUFDckUsV0FBVyxHQUFJLElBQUcsSUFBSSxDQUFDQSxXQUFXLENBQUNxRSxJQUFLLEVBQUMsR0FBR2tILFdBQVc7SUFDekU7SUFDQTtJQUNBLE1BQU1DLGNBQWMsR0FBRyxJQUFJLENBQUN4TCxXQUFXLEdBQUkscUJBQW9CLElBQUksQ0FBQ2IsTUFBTSxDQUFDNkIsTUFBTyxHQUFFdUssV0FBWSxHQUFFLEdBQUcsRUFBRTtJQUN2RyxNQUFNcEQsT0FBTyxHQUFJLHdCQUF1Qm5ILE1BQU8sR0FBRXFELElBQUssR0FBRW1ILGNBQWUsT0FBTSxJQUFJLENBQUNyTSxNQUFNLENBQUNpQyxPQUFPLENBQUNpQixjQUFlLElBQUc7SUFDbkgsSUFBSSxDQUFDeEMsS0FBSyxDQUFDMEosR0FBRyxDQUFDcEIsT0FBTyxDQUFDO0lBQ3ZCLElBQUksQ0FBQ2QsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJWix1QkFBZSxDQUFDMEIsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQzNILFlBQVksR0FBR1UsU0FBUztJQUM3QixJQUFJLENBQUN1SyxhQUFhLENBQUMsZ0JBQWdCLENBQUM7RUFDdEM7O0VBRUE7QUFDRjtBQUNBO0VBQ0V6SixhQUFhQSxDQUFBLEVBQUc7SUFDZCxNQUFNbUcsT0FBTyxHQUFJLCtCQUE4QixJQUFJLENBQUNoSixNQUFNLENBQUNpQyxPQUFPLENBQUNZLGFBQWMsSUFBRztJQUNwRixJQUFJLENBQUNuQyxLQUFLLENBQUMwSixHQUFHLENBQUNwQixPQUFPLENBQUM7SUFDdkIsSUFBSSxDQUFDc0QsYUFBYSxDQUFDLGFBQWEsRUFBRSxJQUFJaEYsdUJBQWUsQ0FBQzBCLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztFQUM3RTs7RUFFQTtBQUNGO0FBQ0E7RUFDRTVELGNBQWNBLENBQUEsRUFBRztJQUNmLElBQUksQ0FBQzdELFlBQVksR0FBR1EsU0FBUztJQUM3QixNQUFNZCxPQUFPLEdBQUcsSUFBSSxDQUFDQSxPQUFRO0lBQzdCQSxPQUFPLENBQUNzTCxNQUFNLENBQUMsQ0FBQztJQUNoQixNQUFNNUQsT0FBTyxHQUFJMUgsT0FBTyxDQUFDMEgsT0FBTyxLQUFLNUcsU0FBUyxHQUFJZCxPQUFPLENBQUMwSCxPQUFPLEdBQUcsSUFBSSxDQUFDM0ksTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUQsY0FBYztJQUN0RyxNQUFNNEQsT0FBTyxHQUFHLHlDQUF5QyxHQUFHTCxPQUFPLEdBQUcsSUFBSTtJQUMxRTFILE9BQU8sQ0FBQzRJLEtBQUssR0FBRyxJQUFJUCxvQkFBWSxDQUFDTixPQUFPLEVBQUUsVUFBVSxDQUFDO0VBQ3ZEOztFQUVBO0FBQ0Y7QUFDQTtFQUNFbUQsWUFBWUEsQ0FBQSxFQUFHO0lBQ2IsSUFBSSxDQUFDM0ssVUFBVSxHQUFHTyxTQUFTO0lBQzNCLElBQUksQ0FBQ21HLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDbEIsSUFBSSxDQUFDTCxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUNnQixVQUFVLENBQUM7RUFDMUM7O0VBRUE7QUFDRjtBQUNBO0VBQ0VpQixpQkFBaUJBLENBQUEsRUFBRztJQUNsQixJQUFJLElBQUksQ0FBQzFILFlBQVksRUFBRTtNQUNyQm1MLFlBQVksQ0FBQyxJQUFJLENBQUNuTCxZQUFZLENBQUM7TUFDL0IsSUFBSSxDQUFDQSxZQUFZLEdBQUdVLFNBQVM7SUFDL0I7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7RUFDRWlLLGdCQUFnQkEsQ0FBQSxFQUFHO0lBQ2pCLElBQUksSUFBSSxDQUFDMUssV0FBVyxFQUFFO01BQ3BCa0wsWUFBWSxDQUFDLElBQUksQ0FBQ2xMLFdBQVcsQ0FBQztNQUM5QixJQUFJLENBQUNBLFdBQVcsR0FBR1MsU0FBUztJQUM5QjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFb0gsaUJBQWlCQSxDQUFBLEVBQUc7SUFDbEIsSUFBSSxJQUFJLENBQUM1SCxZQUFZLEVBQUU7TUFDckJpTCxZQUFZLENBQUMsSUFBSSxDQUFDakwsWUFBWSxDQUFDO01BQy9CLElBQUksQ0FBQ0EsWUFBWSxHQUFHUSxTQUFTO0lBQy9CO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0VxSCxlQUFlQSxDQUFBLEVBQUc7SUFDaEIsSUFBSSxJQUFJLENBQUM1SCxVQUFVLEVBQUU7TUFDbkJnTCxZQUFZLENBQUMsSUFBSSxDQUFDaEwsVUFBVSxDQUFDO01BQzdCLElBQUksQ0FBQ0EsVUFBVSxHQUFHTyxTQUFTO0lBQzdCO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0U4RixZQUFZQSxDQUFDNEUsUUFBZSxFQUFFO0lBQzVCLElBQUksSUFBSSxDQUFDMUwsS0FBSyxLQUFLMEwsUUFBUSxFQUFFO01BQzNCLElBQUksQ0FBQy9MLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQyxtQkFBbUIsR0FBR3FDLFFBQVEsQ0FBQ2xGLElBQUksQ0FBQztNQUNuRDtJQUNGO0lBRUEsSUFBSSxJQUFJLENBQUN4RyxLQUFLLElBQUksSUFBSSxDQUFDQSxLQUFLLENBQUMyTCxJQUFJLEVBQUU7TUFDakMsSUFBSSxDQUFDM0wsS0FBSyxDQUFDMkwsSUFBSSxDQUFDaE8sSUFBSSxDQUFDLElBQUksRUFBRStOLFFBQVEsQ0FBQztJQUN0QztJQUVBLElBQUksQ0FBQy9MLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLENBQUNySixLQUFLLEdBQUcsSUFBSSxDQUFDQSxLQUFLLENBQUN3RyxJQUFJLEdBQUcsV0FBVyxDQUFDLEdBQUcsTUFBTSxHQUFHa0YsUUFBUSxDQUFDbEYsSUFBSSxDQUFDO0lBQ3hHLElBQUksQ0FBQ3hHLEtBQUssR0FBRzBMLFFBQVE7SUFFckIsSUFBSSxJQUFJLENBQUMxTCxLQUFLLENBQUM0TCxLQUFLLEVBQUU7TUFDcEIsSUFBSSxDQUFDNUwsS0FBSyxDQUFDNEwsS0FBSyxDQUFDQyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQzlCO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0VDLGVBQWVBLENBQWtDQyxTQUFZLEVBQW1DO0lBQzlGLE1BQU1wRCxPQUFPLEdBQUcsSUFBSSxDQUFDM0ksS0FBSyxDQUFDZ00sTUFBTSxDQUFDRCxTQUFTLENBQUM7SUFFNUMsSUFBSSxDQUFDcEQsT0FBTyxFQUFFO01BQ1osTUFBTSxJQUFJekQsS0FBSyxDQUFFLGFBQVk2RyxTQUFVLGVBQWMsSUFBSSxDQUFDL0wsS0FBSyxDQUFDd0csSUFBSyxHQUFFLENBQUM7SUFDMUU7SUFFQSxPQUFPbUMsT0FBTztFQUNoQjs7RUFFQTtBQUNGO0FBQ0E7RUFDRTRDLGFBQWFBLENBQWtDUSxTQUFZLEVBQUUsR0FBRzNFLElBQWlELEVBQUU7SUFDakgsTUFBTXVCLE9BQU8sR0FBRyxJQUFJLENBQUMzSSxLQUFLLENBQUNnTSxNQUFNLENBQUNELFNBQVMsQ0FBNkQ7SUFDeEcsSUFBSXBELE9BQU8sRUFBRTtNQUNYQSxPQUFPLENBQUNrRCxLQUFLLENBQUMsSUFBSSxFQUFFekUsSUFBSSxDQUFDO0lBQzNCLENBQUMsTUFBTTtNQUNMLElBQUksQ0FBQ0QsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJakMsS0FBSyxDQUFFLGFBQVk2RyxTQUFVLGVBQWMsSUFBSSxDQUFDL0wsS0FBSyxDQUFDd0csSUFBSyxHQUFFLENBQUMsQ0FBQztNQUN0RixJQUFJLENBQUNhLEtBQUssQ0FBQyxDQUFDO0lBQ2Q7RUFDRjs7RUFFQTtBQUNGO0FBQ0E7RUFDRTBCLFdBQVdBLENBQUNELEtBQVksRUFBRTtJQUN4QixJQUFJLElBQUksQ0FBQzlJLEtBQUssS0FBSyxJQUFJLENBQUMrRixLQUFLLENBQUNnQixVQUFVLElBQUksSUFBSSxDQUFDL0csS0FBSyxLQUFLLElBQUksQ0FBQytGLEtBQUssQ0FBQ2tHLHNCQUFzQixFQUFFO01BQzVGLE1BQU1aLFdBQVcsR0FBRyxJQUFJLENBQUNwTSxNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFJLEdBQUksSUFBRyxJQUFJLENBQUNsRixNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFLLEVBQUMsR0FBSSxLQUFJLElBQUksQ0FBQ2xGLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzBDLFlBQWEsRUFBQztNQUN2SDtNQUNBLE1BQU05QyxNQUFNLEdBQUcsSUFBSSxDQUFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQ0EsV0FBVyxDQUFDZ0IsTUFBTSxHQUFHLElBQUksQ0FBQzdCLE1BQU0sQ0FBQzZCLE1BQU07TUFDOUUsTUFBTXFELElBQUksR0FBRyxJQUFJLENBQUNyRSxXQUFXLEdBQUksSUFBRyxJQUFJLENBQUNBLFdBQVcsQ0FBQ3FFLElBQUssRUFBQyxHQUFHa0gsV0FBVztNQUN6RTtNQUNBO01BQ0EsTUFBTUMsY0FBYyxHQUFHLElBQUksQ0FBQ3hMLFdBQVcsR0FBSSxxQkFBb0IsSUFBSSxDQUFDYixNQUFNLENBQUM2QixNQUFPLEdBQUV1SyxXQUFZLEdBQUUsR0FBRyxFQUFFO01BQ3ZHLE1BQU1wRCxPQUFPLEdBQUksd0JBQXVCbkgsTUFBTyxHQUFFcUQsSUFBSyxHQUFFbUgsY0FBZSxNQUFLeEMsS0FBSyxDQUFDYixPQUFRLEVBQUM7TUFDM0YsSUFBSSxDQUFDdEksS0FBSyxDQUFDMEosR0FBRyxDQUFDcEIsT0FBTyxDQUFDO01BQ3ZCLElBQUksQ0FBQ2QsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJWix1QkFBZSxDQUFDMEIsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsTUFBTTtNQUNMLE1BQU1BLE9BQU8sR0FBSSxxQkFBb0JhLEtBQUssQ0FBQ2IsT0FBUSxFQUFDO01BQ3BELElBQUksQ0FBQ3RJLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQ3BCLE9BQU8sQ0FBQztNQUN2QixJQUFJLENBQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSVosdUJBQWUsQ0FBQzBCLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM3RDtJQUNBLElBQUksQ0FBQ3NELGFBQWEsQ0FBQyxhQUFhLEVBQUV6QyxLQUFLLENBQUM7RUFDMUM7O0VBRUE7QUFDRjtBQUNBO0VBQ0VHLFNBQVNBLENBQUEsRUFBRztJQUNWLElBQUksQ0FBQ3RKLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQyxjQUFjLENBQUM7SUFDOUIsSUFBSSxJQUFJLENBQUNySixLQUFLLEtBQUssSUFBSSxDQUFDK0YsS0FBSyxDQUFDdUIsS0FBSyxFQUFFO01BQ25DLE1BQU13QixLQUFvQixHQUFHLElBQUk1RCxLQUFLLENBQUMsZ0JBQWdCLENBQUM7TUFDeEQ0RCxLQUFLLENBQUNvRCxJQUFJLEdBQUcsWUFBWTtNQUN6QixJQUFJLENBQUNuRCxXQUFXLENBQUNELEtBQUssQ0FBQztJQUN6QjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFRSxXQUFXQSxDQUFBLEVBQUc7SUFDWixJQUFJLENBQUNySixLQUFLLENBQUMwSixHQUFHLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDcEssTUFBTSxDQUFDNkIsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM3QixNQUFNLENBQUNpQyxPQUFPLENBQUNpRCxJQUFJLEdBQUcsU0FBUyxDQUFDO0lBQ2xHLElBQUksSUFBSSxDQUFDbkUsS0FBSyxLQUFLLElBQUksQ0FBQytGLEtBQUssQ0FBQ29HLFNBQVMsRUFBRTtNQUN2QyxJQUFJLENBQUN4TSxLQUFLLENBQUMwSixHQUFHLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQ3ZKLFdBQVcsQ0FBRWdCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDaEIsV0FBVyxDQUFFcUUsSUFBSSxDQUFDO01BRXpGLElBQUksQ0FBQ29ILGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDdkwsS0FBSyxLQUFLLElBQUksQ0FBQytGLEtBQUssQ0FBQ3FHLHVCQUF1QixFQUFFO01BQzVELE1BQU10TCxNQUFNLEdBQUcsSUFBSSxDQUFDaEIsV0FBVyxHQUFHLElBQUksQ0FBQ0EsV0FBVyxDQUFDZ0IsTUFBTSxHQUFHLElBQUksQ0FBQzdCLE1BQU0sQ0FBQzZCLE1BQU07TUFDOUUsTUFBTXFELElBQUksR0FBRyxJQUFJLENBQUNyRSxXQUFXLEdBQUcsSUFBSSxDQUFDQSxXQUFXLENBQUNxRSxJQUFJLEdBQUcsSUFBSSxDQUFDbEYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDaUQsSUFBSTtNQUNoRixJQUFJLENBQUN4RSxLQUFLLENBQUMwSixHQUFHLENBQUMsOENBQThDLEdBQUd2SSxNQUFNLEdBQUcsR0FBRyxHQUFHcUQsSUFBSSxDQUFDO01BRXBGLElBQUksQ0FBQ29ILGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQyxNQUFNO01BQ0wsSUFBSSxDQUFDekUsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO0lBQ3JDO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0VnQyxZQUFZQSxDQUFBLEVBQUc7SUFDYixNQUFNLEdBQUcrQyxLQUFLLEVBQUVDLEtBQUssRUFBRUMsS0FBSyxDQUFDLEdBQUcsc0JBQXNCLENBQUNDLElBQUksQ0FBQ0MsZ0JBQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ2hHLE1BQU0zSixPQUFPLEdBQUcsSUFBSTRKLHdCQUFlLENBQUM7TUFDbEM7TUFDQTtNQUNBO01BQ0FqSixPQUFPLEVBQUUsT0FBTyxJQUFJLENBQUN4RSxNQUFNLENBQUNpQyxPQUFPLENBQUN1QyxPQUFPLEtBQUssU0FBUyxJQUFJLElBQUksQ0FBQ3hFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3VDLE9BQU87TUFDeEZnSixPQUFPLEVBQUU7UUFBRUosS0FBSyxFQUFFTSxNQUFNLENBQUNOLEtBQUssQ0FBQztRQUFFQyxLQUFLLEVBQUVLLE1BQU0sQ0FBQ0wsS0FBSyxDQUFDO1FBQUVDLEtBQUssRUFBRUksTUFBTSxDQUFDSixLQUFLLENBQUM7UUFBRUssUUFBUSxFQUFFO01BQUU7SUFDM0YsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDN00sU0FBUyxDQUFDa0csV0FBVyxDQUFDQyxZQUFJLENBQUMyRyxRQUFRLEVBQUUvSixPQUFPLENBQUNGLElBQUksQ0FBQztJQUN2RCxJQUFJLENBQUNqRCxLQUFLLENBQUNtRCxPQUFPLENBQUMsWUFBVztNQUM1QixPQUFPQSxPQUFPLENBQUNnSyxRQUFRLENBQUMsSUFBSSxDQUFDO0lBQy9CLENBQUMsQ0FBQztFQUNKOztFQUVBO0FBQ0Y7QUFDQTtFQUNFQyxnQkFBZ0JBLENBQUEsRUFBRztJQUNqQixNQUFNakssT0FBTyxHQUFHLElBQUlrSyxzQkFBYSxDQUFDO01BQ2hDdEksVUFBVSxFQUFFdUkscUJBQVEsQ0FBQyxJQUFJLENBQUNoTyxNQUFNLENBQUNpQyxPQUFPLENBQUN3RCxVQUFVLENBQUM7TUFDcERSLFVBQVUsRUFBRSxJQUFJLENBQUNqRixNQUFNLENBQUNpQyxPQUFPLENBQUNnRCxVQUFVO01BQzFDZ0osYUFBYSxFQUFFLENBQUM7TUFDaEJDLFNBQVMsRUFBRXJGLE9BQU8sQ0FBQ3NGLEdBQUc7TUFDdEJDLFlBQVksRUFBRSxDQUFDO01BQ2ZDLGNBQWMsRUFBRSxJQUFJQyxJQUFJLENBQUMsQ0FBQyxDQUFDQyxpQkFBaUIsQ0FBQyxDQUFDO01BQzlDQyxVQUFVLEVBQUU7SUFDZCxDQUFDLENBQUM7SUFFRixNQUFNO01BQUUxTTtJQUFlLENBQUMsR0FBRyxJQUFJLENBQUM5QixNQUFNO0lBQ3RDLFFBQVE4QixjQUFjLENBQUNFLElBQUk7TUFDekIsS0FBSyxpQ0FBaUM7UUFDcEM2QixPQUFPLENBQUM0SyxPQUFPLEdBQUc7VUFDaEJ6TSxJQUFJLEVBQUUsTUFBTTtVQUNaME0sSUFBSSxFQUFFLElBQUksQ0FBQzNPLGVBQWU7VUFDMUI0TyxRQUFRLEVBQUU7UUFDWixDQUFDO1FBQ0Q7TUFFRixLQUFLLHFDQUFxQztRQUN4QzlLLE9BQU8sQ0FBQzRLLE9BQU8sR0FBRztVQUNoQnpNLElBQUksRUFBRSxlQUFlO1VBQ3JCME0sSUFBSSxFQUFFLElBQUksQ0FBQzNPLGVBQWU7VUFDMUI2TyxZQUFZLEVBQUU5TSxjQUFjLENBQUNHLE9BQU8sQ0FBQ087UUFDdkMsQ0FBQztRQUNEO01BRUYsS0FBSywrQkFBK0I7TUFDcEMsS0FBSyxnQ0FBZ0M7TUFDckMsS0FBSyx3Q0FBd0M7TUFDN0MsS0FBSyxpREFBaUQ7UUFDcERxQixPQUFPLENBQUM0SyxPQUFPLEdBQUc7VUFDaEJ6TSxJQUFJLEVBQUUsTUFBTTtVQUNaME0sSUFBSSxFQUFFLElBQUksQ0FBQzNPLGVBQWU7VUFDMUI0TyxRQUFRLEVBQUU7UUFDWixDQUFDO1FBQ0Q7TUFFRixLQUFLLE1BQU07UUFDVDlLLE9BQU8sQ0FBQ2dMLElBQUksR0FBRyxJQUFBQyx1QkFBaUIsRUFBQztVQUFFNU0sTUFBTSxFQUFFSixjQUFjLENBQUNHLE9BQU8sQ0FBQ0M7UUFBTyxDQUFDLENBQUM7UUFDM0U7TUFFRjtRQUNFMkIsT0FBTyxDQUFDMUIsUUFBUSxHQUFHTCxjQUFjLENBQUNHLE9BQU8sQ0FBQ0UsUUFBUTtRQUNsRDBCLE9BQU8sQ0FBQ3pCLFFBQVEsR0FBR04sY0FBYyxDQUFDRyxPQUFPLENBQUNHLFFBQVE7SUFDdEQ7SUFFQXlCLE9BQU8sQ0FBQ2tMLFFBQVEsR0FBRyxJQUFJLENBQUMvTyxNQUFNLENBQUNpQyxPQUFPLENBQUM4RCxhQUFhLElBQUlpSixXQUFFLENBQUNELFFBQVEsQ0FBQyxDQUFDO0lBQ3JFbEwsT0FBTyxDQUFDMEIsVUFBVSxHQUFHLElBQUksQ0FBQzFFLFdBQVcsR0FBRyxJQUFJLENBQUNBLFdBQVcsQ0FBQ2dCLE1BQU0sR0FBRyxJQUFJLENBQUM3QixNQUFNLENBQUM2QixNQUFNO0lBQ3BGZ0MsT0FBTyxDQUFDbEIsT0FBTyxHQUFHLElBQUksQ0FBQzNDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ1UsT0FBTyxJQUFJLFNBQVM7SUFDMURrQixPQUFPLENBQUNvTCxXQUFXLEdBQUdBLGFBQVc7SUFDakNwTCxPQUFPLENBQUNnQixRQUFRLEdBQUcsSUFBSSxDQUFDN0UsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEMsUUFBUTtJQUMvQ2hCLE9BQU8sQ0FBQ0wsUUFBUSxHQUFHLElBQUksQ0FBQ3hELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3VCLFFBQVE7SUFDL0NLLE9BQU8sQ0FBQ3ZCLFFBQVEsR0FBR29FLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVsRDlDLE9BQU8sQ0FBQ3NCLGNBQWMsR0FBRyxJQUFJLENBQUNuRixNQUFNLENBQUNpQyxPQUFPLENBQUNrRCxjQUFjO0lBQzNEdEIsT0FBTyxDQUFDcUwsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDbFAsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0MsbUJBQW1CO0lBRTlELElBQUksQ0FBQzVELFdBQVcsR0FBR2tCLFNBQVM7SUFDNUIsSUFBSSxDQUFDakIsU0FBUyxDQUFDa0csV0FBVyxDQUFDQyxZQUFJLENBQUNrSSxNQUFNLEVBQUV0TCxPQUFPLENBQUN1TCxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTNELElBQUksQ0FBQzFPLEtBQUssQ0FBQ21ELE9BQU8sQ0FBQyxZQUFXO01BQzVCLE9BQU9BLE9BQU8sQ0FBQ2dLLFFBQVEsQ0FBQyxJQUFJLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0VBQ0o7O0VBRUE7QUFDRjtBQUNBO0VBQ0V3Qix1QkFBdUJBLENBQUM3TSxLQUFhLEVBQUU7SUFDckMsTUFBTThNLGNBQWMsR0FBRzVJLE1BQU0sQ0FBQzZJLFVBQVUsQ0FBQy9NLEtBQUssRUFBRSxNQUFNLENBQUM7SUFDdkQsTUFBTW1CLElBQUksR0FBRytDLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLENBQUMsR0FBRzBJLGNBQWMsQ0FBQztJQUM3QyxJQUFJRSxNQUFNLEdBQUcsQ0FBQztJQUNkQSxNQUFNLEdBQUc3TCxJQUFJLENBQUM4TCxhQUFhLENBQUNILGNBQWMsR0FBRyxDQUFDLEVBQUVFLE1BQU0sQ0FBQztJQUN2REEsTUFBTSxHQUFHN0wsSUFBSSxDQUFDOEwsYUFBYSxDQUFDSCxjQUFjLEVBQUVFLE1BQU0sQ0FBQztJQUNuRDdMLElBQUksQ0FBQytMLEtBQUssQ0FBQ2xOLEtBQUssRUFBRWdOLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDakMsSUFBSSxDQUFDMU8sU0FBUyxDQUFDa0csV0FBVyxDQUFDQyxZQUFJLENBQUMwSSxhQUFhLEVBQUVoTSxJQUFJLENBQUM7SUFDcEQ7SUFDQSxJQUFJLENBQUNrRSxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUM4SSwrQkFBK0IsQ0FBQztFQUMvRDs7RUFFQTtBQUNGO0FBQ0E7RUFDRUMsY0FBY0EsQ0FBQSxFQUFHO0lBQ2YsTUFBTWhNLE9BQU8sR0FBRyxJQUFJaU0sd0JBQWUsQ0FBQyxJQUFJLENBQUNDLGFBQWEsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDQyw0QkFBNEIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDaFEsTUFBTSxDQUFDaUMsT0FBTyxDQUFDO0lBRW5ILE1BQU0rRyxPQUFPLEdBQUcsSUFBSWlILGdCQUFPLENBQUM7TUFBRWpPLElBQUksRUFBRWlGLFlBQUksQ0FBQ2lKO0lBQVUsQ0FBQyxDQUFDO0lBQ3JELElBQUksQ0FBQ3BQLFNBQVMsQ0FBQ3FQLHFCQUFxQixDQUFDVCxLQUFLLENBQUMxRyxPQUFPLENBQUM7SUFDbkRvSCxnQkFBUSxDQUFDekosSUFBSSxDQUFDOUMsT0FBTyxDQUFDLENBQUN3TSxJQUFJLENBQUNySCxPQUFPLENBQUM7RUFDdEM7O0VBRUE7QUFDRjtBQUNBO0VBQ0UrRyxhQUFhQSxDQUFBLEVBQUc7SUFDZCxNQUFNOU4sT0FBTyxHQUFHLEVBQUU7SUFFbEIsSUFBSSxJQUFJLENBQUNqQyxNQUFNLENBQUNpQyxPQUFPLENBQUM2QixjQUFjLEtBQUssSUFBSSxFQUFFO01BQy9DN0IsT0FBTyxDQUFDcU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ25DLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzZCLGNBQWMsS0FBSyxLQUFLLEVBQUU7TUFDdkQ3QixPQUFPLENBQUNxTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDcEM7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzhCLHFCQUFxQixLQUFLLElBQUksRUFBRTtNQUN0RDlCLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQywwQkFBMEIsQ0FBQztJQUMxQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUM4QixxQkFBcUIsS0FBSyxLQUFLLEVBQUU7TUFDOUQ5QixPQUFPLENBQUNxTyxJQUFJLENBQUMsMkJBQTJCLENBQUM7SUFDM0M7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQytCLGlCQUFpQixLQUFLLElBQUksRUFBRTtNQUNsRC9CLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyxxQkFBcUIsQ0FBQztJQUNyQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUMrQixpQkFBaUIsS0FBSyxLQUFLLEVBQUU7TUFDMUQvQixPQUFPLENBQUNxTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDdEM7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2dDLGtCQUFrQixLQUFLLElBQUksRUFBRTtNQUNuRGhDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztJQUN0QyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUNnQyxrQkFBa0IsS0FBSyxLQUFLLEVBQUU7TUFDM0RoQyxPQUFPLENBQUNxTyxJQUFJLENBQUMsdUJBQXVCLENBQUM7SUFDdkM7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2lDLGdCQUFnQixLQUFLLElBQUksRUFBRTtNQUNqRGpDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNuQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUNpQyxnQkFBZ0IsS0FBSyxLQUFLLEVBQUU7TUFDekRqQyxPQUFPLENBQUNxTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDcEM7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ2tDLDBCQUEwQixLQUFLLElBQUksRUFBRTtNQUMzRGxDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQztJQUNoRCxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUNrQywwQkFBMEIsS0FBSyxLQUFLLEVBQUU7TUFDbkVsQyxPQUFPLENBQUNxTyxJQUFJLENBQUMsaUNBQWlDLENBQUM7SUFDakQ7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21DLHlCQUF5QixLQUFLLElBQUksRUFBRTtNQUMxRG5DLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQywrQkFBK0IsQ0FBQztJQUMvQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUNtQyx5QkFBeUIsS0FBSyxLQUFLLEVBQUU7TUFDbEVuQyxPQUFPLENBQUNxTyxJQUFJLENBQUMsZ0NBQWdDLENBQUM7SUFDaEQ7SUFFQSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dCLFNBQVMsS0FBSyxJQUFJLEVBQUU7TUFDMUN4QixPQUFPLENBQUNxTyxJQUFJLENBQUUsaUJBQWdCLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dCLFNBQVUsRUFBQyxDQUFDO0lBQ2hFO0lBRUEsSUFBSSxJQUFJLENBQUN6RCxNQUFNLENBQUNpQyxPQUFPLENBQUN5QixVQUFVLEtBQUssSUFBSSxFQUFFO01BQzNDekIsT0FBTyxDQUFDcU8sSUFBSSxDQUFFLGtCQUFpQixJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUN5QixVQUFXLEVBQUMsQ0FBQztJQUNsRTtJQUVBLElBQUksSUFBSSxDQUFDMUQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDb0MsMEJBQTBCLEtBQUssSUFBSSxFQUFFO01BQzNEcEMsT0FBTyxDQUFDcU8sSUFBSSxDQUFDLDhCQUE4QixDQUFDO0lBQzlDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ29DLDBCQUEwQixLQUFLLEtBQUssRUFBRTtNQUNuRXBDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQywrQkFBK0IsQ0FBQztJQUMvQztJQUVBLElBQUksSUFBSSxDQUFDdFEsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEMsUUFBUSxLQUFLLElBQUksRUFBRTtNQUN6QzVDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBRSxnQkFBZSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUM0QyxRQUFTLEVBQUMsQ0FBQztJQUM5RDtJQUVBLElBQUksSUFBSSxDQUFDN0UsTUFBTSxDQUFDaUMsT0FBTyxDQUFDcUMsdUJBQXVCLEtBQUssSUFBSSxFQUFFO01BQ3hEckMsT0FBTyxDQUFDcU8sSUFBSSxDQUFDLDJCQUEyQixDQUFDO0lBQzNDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3FDLHVCQUF1QixLQUFLLEtBQUssRUFBRTtNQUNoRXJDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUM1QztJQUVBLElBQUksSUFBSSxDQUFDdFEsTUFBTSxDQUFDaUMsT0FBTyxDQUFDc0Msc0JBQXNCLEtBQUssSUFBSSxFQUFFO01BQ3ZEdEMsT0FBTyxDQUFDcU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDO0lBQzFDLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ3RRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NDLHNCQUFzQixLQUFLLEtBQUssRUFBRTtNQUMvRHRDLE9BQU8sQ0FBQ3FPLElBQUksQ0FBQywyQkFBMkIsQ0FBQztJQUMzQztJQUVBLElBQUksSUFBSSxDQUFDdFEsTUFBTSxDQUFDaUMsT0FBTyxDQUFDeUQsUUFBUSxLQUFLLElBQUksRUFBRTtNQUN6Q3pELE9BQU8sQ0FBQ3FPLElBQUksQ0FBRSxnQkFBZSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUN5RCxRQUFTLEVBQUMsQ0FBQztJQUM5RDtJQUVBLElBQUksSUFBSSxDQUFDMUYsTUFBTSxDQUFDaUMsT0FBTyxDQUFDbUIsd0JBQXdCLEtBQUssSUFBSSxFQUFFO01BQ3pEbkIsT0FBTyxDQUFDcU8sSUFBSSxDQUFFLG1DQUFrQyxJQUFJLENBQUNDLHFCQUFxQixDQUFDLElBQUksQ0FBQ3ZRLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ21CLHdCQUF3QixDQUFFLEVBQUMsQ0FBQztJQUM3SDtJQUVBLElBQUksSUFBSSxDQUFDcEQsTUFBTSxDQUFDaUMsT0FBTyxDQUFDUyx1QkFBdUIsS0FBSyxJQUFJLEVBQUU7TUFDeERULE9BQU8sQ0FBQ3FPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNuQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN0USxNQUFNLENBQUNpQyxPQUFPLENBQUNTLHVCQUF1QixLQUFLLEtBQUssRUFBRTtNQUNoRVQsT0FBTyxDQUFDcU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDO0lBQ3BDO0lBRUEsT0FBT3JPLE9BQU8sQ0FBQ3VPLElBQUksQ0FBQyxJQUFJLENBQUM7RUFDM0I7O0VBRUE7QUFDRjtBQUNBO0VBQ0VDLG1CQUFtQkEsQ0FBQSxFQUFHO0lBQ3BCLElBQUksQ0FBQzFILGlCQUFpQixDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDYixJQUFJLENBQUMsU0FBUyxDQUFDO0VBQ3RCOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFd0ksWUFBWUEsQ0FBQ3pQLE9BQWdCLEVBQUU7SUFDN0IsSUFBSSxDQUFDMFAsV0FBVyxDQUFDMVAsT0FBTyxFQUFFZ0csWUFBSSxDQUFDaUosU0FBUyxFQUFFLElBQUlKLHdCQUFlLENBQUM3TyxPQUFPLENBQUMyUCxrQkFBa0IsRUFBRyxJQUFJLENBQUNaLDRCQUE0QixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUNoUSxNQUFNLENBQUNpQyxPQUFPLENBQUMsQ0FBQztFQUN2Sjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTRPLE9BQU9BLENBQUM1UCxPQUFnQixFQUFFO0lBQ3hCLElBQUk7TUFDRkEsT0FBTyxDQUFDNlAsa0JBQWtCLENBQUMsSUFBSSxDQUFDcFAsaUJBQWlCLENBQUM7SUFDcEQsQ0FBQyxDQUFDLE9BQU9tSSxLQUFVLEVBQUU7TUFDbkI1SSxPQUFPLENBQUM0SSxLQUFLLEdBQUdBLEtBQUs7TUFFckJoQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1FBQ3JCLElBQUksQ0FBQ3BJLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQ1AsS0FBSyxDQUFDYixPQUFPLENBQUM7UUFDN0IvSCxPQUFPLENBQUNzSSxRQUFRLENBQUNNLEtBQUssQ0FBQztNQUN6QixDQUFDLENBQUM7TUFFRjtJQUNGO0lBRUEsTUFBTWtILFVBQXVCLEdBQUcsRUFBRTtJQUVsQ0EsVUFBVSxDQUFDVCxJQUFJLENBQUM7TUFDZHRPLElBQUksRUFBRWdQLGVBQUssQ0FBQ0MsUUFBUTtNQUNwQjFKLElBQUksRUFBRSxXQUFXO01BQ2pCakIsS0FBSyxFQUFFckYsT0FBTyxDQUFDMlAsa0JBQWtCO01BQ2pDTSxNQUFNLEVBQUUsS0FBSztNQUNiQyxNQUFNLEVBQUVwUCxTQUFTO01BQ2pCcVAsU0FBUyxFQUFFclAsU0FBUztNQUNwQnNQLEtBQUssRUFBRXRQO0lBQ1QsQ0FBQyxDQUFDO0lBRUYsSUFBSWQsT0FBTyxDQUFDOFAsVUFBVSxDQUFDSSxNQUFNLEVBQUU7TUFDN0JKLFVBQVUsQ0FBQ1QsSUFBSSxDQUFDO1FBQ2R0TyxJQUFJLEVBQUVnUCxlQUFLLENBQUNDLFFBQVE7UUFDcEIxSixJQUFJLEVBQUUsUUFBUTtRQUNkakIsS0FBSyxFQUFFckYsT0FBTyxDQUFDcVEsbUJBQW1CLENBQUNyUSxPQUFPLENBQUM4UCxVQUFVLENBQUM7UUFDdERHLE1BQU0sRUFBRSxLQUFLO1FBQ2JDLE1BQU0sRUFBRXBQLFNBQVM7UUFDakJxUCxTQUFTLEVBQUVyUCxTQUFTO1FBQ3BCc1AsS0FBSyxFQUFFdFA7TUFDVCxDQUFDLENBQUM7TUFFRmdQLFVBQVUsQ0FBQ1QsSUFBSSxDQUFDLEdBQUdyUCxPQUFPLENBQUM4UCxVQUFVLENBQUM7SUFDeEM7SUFFQSxJQUFJLENBQUNKLFdBQVcsQ0FBQzFQLE9BQU8sRUFBRWdHLFlBQUksQ0FBQ3NLLFdBQVcsRUFBRSxJQUFJQywwQkFBaUIsQ0FBQ0MsK0JBQVUsQ0FBQ0MsYUFBYSxFQUFFWCxVQUFVLEVBQUUsSUFBSSxDQUFDZiw0QkFBNEIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDaFEsTUFBTSxDQUFDaUMsT0FBTyxFQUFFLElBQUksQ0FBQ1AsaUJBQWlCLENBQUMsQ0FBQztFQUM1TDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBR0VpUSxXQUFXQSxDQUFDQyxLQUFhLEVBQUVDLGlCQUFxRCxFQUFFdEksUUFBMkIsRUFBRTtJQUM3RyxJQUFJdEgsT0FBd0I7SUFFNUIsSUFBSXNILFFBQVEsS0FBS3hILFNBQVMsRUFBRTtNQUMxQndILFFBQVEsR0FBR3NJLGlCQUFxQztNQUNoRDVQLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDLE1BQU07TUFDTEEsT0FBTyxHQUFHNFAsaUJBQW9DO0lBQ2hEO0lBRUEsSUFBSSxPQUFPNVAsT0FBTyxLQUFLLFFBQVEsRUFBRTtNQUMvQixNQUFNLElBQUlMLFNBQVMsQ0FBQyxzQ0FBc0MsQ0FBQztJQUM3RDtJQUNBLE9BQU8sSUFBSWtRLGlCQUFRLENBQUNGLEtBQUssRUFBRSxJQUFJLENBQUNsUSxpQkFBaUIsRUFBRSxJQUFJLENBQUMxQixNQUFNLENBQUNpQyxPQUFPLEVBQUVBLE9BQU8sRUFBRXNILFFBQVEsQ0FBQztFQUM1Rjs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0VBR0V3SSxZQUFZQSxDQUFDQyxRQUFrQixFQUFFQyxJQUE2SCxFQUFFO0lBQzlKRCxRQUFRLENBQUNFLGdCQUFnQixHQUFHLElBQUk7SUFFaEMsSUFBSUQsSUFBSSxFQUFFO01BQ1IsSUFBSUQsUUFBUSxDQUFDRyxhQUFhLEVBQUU7UUFDMUIsTUFBTSxJQUFJbE0sS0FBSyxDQUFDLHlGQUF5RixDQUFDO01BQzVHO01BRUEsSUFBSStMLFFBQVEsQ0FBQ0ksZUFBZSxFQUFFO1FBQzVCLE1BQU0sSUFBSW5NLEtBQUssQ0FBQyw4RkFBOEYsQ0FBQztNQUNqSDtNQUVBLE1BQU1vTSxTQUFTLEdBQUdqQyxnQkFBUSxDQUFDekosSUFBSSxDQUFDc0wsSUFBSSxDQUFDOztNQUVyQztNQUNBO01BQ0FJLFNBQVMsQ0FBQ3RLLEVBQUUsQ0FBQyxPQUFPLEVBQUdOLEdBQUcsSUFBSztRQUM3QnVLLFFBQVEsQ0FBQ00sb0JBQW9CLENBQUMzRyxPQUFPLENBQUNsRSxHQUFHLENBQUM7TUFDNUMsQ0FBQyxDQUFDOztNQUVGO01BQ0E7TUFDQXVLLFFBQVEsQ0FBQ00sb0JBQW9CLENBQUN2SyxFQUFFLENBQUMsT0FBTyxFQUFHTixHQUFHLElBQUs7UUFDakQ0SyxTQUFTLENBQUMxRyxPQUFPLENBQUNsRSxHQUFHLENBQUM7TUFDeEIsQ0FBQyxDQUFDO01BRUY0SyxTQUFTLENBQUNoQyxJQUFJLENBQUMyQixRQUFRLENBQUNNLG9CQUFvQixDQUFDO0lBQy9DLENBQUMsTUFBTSxJQUFJLENBQUNOLFFBQVEsQ0FBQ0csYUFBYSxFQUFFO01BQ2xDO01BQ0E7TUFDQTtNQUNBO01BQ0E7TUFDQUgsUUFBUSxDQUFDTSxvQkFBb0IsQ0FBQzdHLEdBQUcsQ0FBQyxDQUFDO0lBQ3JDO0lBRUEsTUFBTThHLFFBQVEsR0FBR0EsQ0FBQSxLQUFNO01BQ3JCdFIsT0FBTyxDQUFDc0wsTUFBTSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0xSSxPQUFPLEdBQUcsSUFBSTJPLGdDQUFlLENBQUNSLFFBQVEsQ0FBQztJQUU3QyxNQUFNL1EsT0FBTyxHQUFHLElBQUl3UixnQkFBTyxDQUFDVCxRQUFRLENBQUNVLGdCQUFnQixDQUFDLENBQUMsRUFBRzdJLEtBQXFELElBQUs7TUFDbEhtSSxRQUFRLENBQUN0SyxjQUFjLENBQUMsUUFBUSxFQUFFNkssUUFBUSxDQUFDO01BRTNDLElBQUkxSSxLQUFLLEVBQUU7UUFDVCxJQUFJQSxLQUFLLENBQUNvRCxJQUFJLEtBQUssU0FBUyxFQUFFO1VBQzVCcEQsS0FBSyxDQUFDYixPQUFPLElBQUksOEhBQThIO1FBQ2pKO1FBQ0FnSixRQUFRLENBQUNuSSxLQUFLLEdBQUdBLEtBQUs7UUFDdEJtSSxRQUFRLENBQUN6SSxRQUFRLENBQUNNLEtBQUssQ0FBQztRQUN4QjtNQUNGO01BRUEsSUFBSSxDQUFDOEcsV0FBVyxDQUFDcUIsUUFBUSxFQUFFL0ssWUFBSSxDQUFDMEwsU0FBUyxFQUFFOU8sT0FBTyxDQUFDO0lBQ3JELENBQUMsQ0FBQztJQUVGbU8sUUFBUSxDQUFDcEssSUFBSSxDQUFDLFFBQVEsRUFBRTJLLFFBQVEsQ0FBQztJQUVqQyxJQUFJLENBQUM3QixZQUFZLENBQUN6UCxPQUFPLENBQUM7RUFDNUI7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0UyUixPQUFPQSxDQUFDM1IsT0FBZ0IsRUFBRTtJQUN4QixNQUFNOFAsVUFBdUIsR0FBRyxFQUFFO0lBRWxDQSxVQUFVLENBQUNULElBQUksQ0FBQztNQUNkdE8sSUFBSSxFQUFFZ1AsZUFBSyxDQUFDNkIsR0FBRztNQUNmdEwsSUFBSSxFQUFFLFFBQVE7TUFDZGpCLEtBQUssRUFBRXZFLFNBQVM7TUFDaEJtUCxNQUFNLEVBQUUsSUFBSTtNQUNaQyxNQUFNLEVBQUVwUCxTQUFTO01BQ2pCcVAsU0FBUyxFQUFFclAsU0FBUztNQUNwQnNQLEtBQUssRUFBRXRQO0lBQ1QsQ0FBQyxDQUFDO0lBRUZnUCxVQUFVLENBQUNULElBQUksQ0FBQztNQUNkdE8sSUFBSSxFQUFFZ1AsZUFBSyxDQUFDQyxRQUFRO01BQ3BCMUosSUFBSSxFQUFFLFFBQVE7TUFDZGpCLEtBQUssRUFBRXJGLE9BQU8sQ0FBQzhQLFVBQVUsQ0FBQ0ksTUFBTSxHQUFHbFEsT0FBTyxDQUFDcVEsbUJBQW1CLENBQUNyUSxPQUFPLENBQUM4UCxVQUFVLENBQUMsR0FBRyxJQUFJO01BQ3pGRyxNQUFNLEVBQUUsS0FBSztNQUNiQyxNQUFNLEVBQUVwUCxTQUFTO01BQ2pCcVAsU0FBUyxFQUFFclAsU0FBUztNQUNwQnNQLEtBQUssRUFBRXRQO0lBQ1QsQ0FBQyxDQUFDO0lBRUZnUCxVQUFVLENBQUNULElBQUksQ0FBQztNQUNkdE8sSUFBSSxFQUFFZ1AsZUFBSyxDQUFDQyxRQUFRO01BQ3BCMUosSUFBSSxFQUFFLE1BQU07TUFDWmpCLEtBQUssRUFBRXJGLE9BQU8sQ0FBQzJQLGtCQUFrQjtNQUNqQ00sTUFBTSxFQUFFLEtBQUs7TUFDYkMsTUFBTSxFQUFFcFAsU0FBUztNQUNqQnFQLFNBQVMsRUFBRXJQLFNBQVM7TUFDcEJzUCxLQUFLLEVBQUV0UDtJQUNULENBQUMsQ0FBQztJQUVGZCxPQUFPLENBQUM2UixTQUFTLEdBQUcsSUFBSTs7SUFFeEI7SUFDQTdSLE9BQU8sQ0FBQzhHLEVBQUUsQ0FBQyxhQUFhLEVBQUUsQ0FBQ1IsSUFBWSxFQUFFakIsS0FBVSxLQUFLO01BQ3RELElBQUlpQixJQUFJLEtBQUssUUFBUSxFQUFFO1FBQ3JCdEcsT0FBTyxDQUFDOFIsTUFBTSxHQUFHek0sS0FBSztNQUN4QixDQUFDLE1BQU07UUFDTHJGLE9BQU8sQ0FBQzRJLEtBQUssR0FBRyxJQUFJUCxvQkFBWSxDQUFFLHlDQUF3Qy9CLElBQUssa0JBQWlCLENBQUM7TUFDbkc7SUFDRixDQUFDLENBQUM7SUFFRixJQUFJLENBQUNvSixXQUFXLENBQUMxUCxPQUFPLEVBQUVnRyxZQUFJLENBQUNzSyxXQUFXLEVBQUUsSUFBSUMsMEJBQWlCLENBQUNDLCtCQUFVLENBQUN1QixVQUFVLEVBQUVqQyxVQUFVLEVBQUUsSUFBSSxDQUFDZiw0QkFBNEIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDaFEsTUFBTSxDQUFDaUMsT0FBTyxFQUFFLElBQUksQ0FBQ1AsaUJBQWlCLENBQUMsQ0FBQztFQUN6TDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFdVIsU0FBU0EsQ0FBQ2hTLE9BQWdCLEVBQUU7SUFDMUIsTUFBTThQLFVBQXVCLEdBQUcsRUFBRTtJQUVsQ0EsVUFBVSxDQUFDVCxJQUFJLENBQUM7TUFDZHRPLElBQUksRUFBRWdQLGVBQUssQ0FBQzZCLEdBQUc7TUFDZnRMLElBQUksRUFBRSxRQUFRO01BQ2Q7TUFDQWpCLEtBQUssRUFBRXJGLE9BQU8sQ0FBQzhSLE1BQU07TUFDckI3QixNQUFNLEVBQUUsS0FBSztNQUNiQyxNQUFNLEVBQUVwUCxTQUFTO01BQ2pCcVAsU0FBUyxFQUFFclAsU0FBUztNQUNwQnNQLEtBQUssRUFBRXRQO0lBQ1QsQ0FBQyxDQUFDO0lBRUYsSUFBSSxDQUFDNE8sV0FBVyxDQUFDMVAsT0FBTyxFQUFFZ0csWUFBSSxDQUFDc0ssV0FBVyxFQUFFLElBQUlDLDBCQUFpQixDQUFDQywrQkFBVSxDQUFDeUIsWUFBWSxFQUFFbkMsVUFBVSxFQUFFLElBQUksQ0FBQ2YsNEJBQTRCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ2hRLE1BQU0sQ0FBQ2lDLE9BQU8sRUFBRSxJQUFJLENBQUNQLGlCQUFpQixDQUFDLENBQUM7RUFDM0w7O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0V5UixPQUFPQSxDQUFDbFMsT0FBZ0IsRUFBRThQLFVBQXVDLEVBQUU7SUFDakUsTUFBTXFDLGlCQUE4QixHQUFHLEVBQUU7SUFFekNBLGlCQUFpQixDQUFDOUMsSUFBSSxDQUFDO01BQ3JCdE8sSUFBSSxFQUFFZ1AsZUFBSyxDQUFDNkIsR0FBRztNQUNmdEwsSUFBSSxFQUFFLEVBQUU7TUFDUjtNQUNBakIsS0FBSyxFQUFFckYsT0FBTyxDQUFDOFIsTUFBTTtNQUNyQjdCLE1BQU0sRUFBRSxLQUFLO01BQ2JDLE1BQU0sRUFBRXBQLFNBQVM7TUFDakJxUCxTQUFTLEVBQUVyUCxTQUFTO01BQ3BCc1AsS0FBSyxFQUFFdFA7SUFDVCxDQUFDLENBQUM7SUFFRixJQUFJO01BQ0YsS0FBSyxJQUFJc1IsQ0FBQyxHQUFHLENBQUMsRUFBRUMsR0FBRyxHQUFHclMsT0FBTyxDQUFDOFAsVUFBVSxDQUFDSSxNQUFNLEVBQUVrQyxDQUFDLEdBQUdDLEdBQUcsRUFBRUQsQ0FBQyxFQUFFLEVBQUU7UUFDN0QsTUFBTUUsU0FBUyxHQUFHdFMsT0FBTyxDQUFDOFAsVUFBVSxDQUFDc0MsQ0FBQyxDQUFDO1FBRXZDRCxpQkFBaUIsQ0FBQzlDLElBQUksQ0FBQztVQUNyQixHQUFHaUQsU0FBUztVQUNaak4sS0FBSyxFQUFFaU4sU0FBUyxDQUFDdlIsSUFBSSxDQUFDd1IsUUFBUSxDQUFDekMsVUFBVSxHQUFHQSxVQUFVLENBQUN3QyxTQUFTLENBQUNoTSxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsSUFBSSxDQUFDN0YsaUJBQWlCO1FBQ3ZHLENBQUMsQ0FBQztNQUNKO0lBQ0YsQ0FBQyxDQUFDLE9BQU9tSSxLQUFVLEVBQUU7TUFDbkI1SSxPQUFPLENBQUM0SSxLQUFLLEdBQUdBLEtBQUs7TUFFckJoQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1FBQ3JCLElBQUksQ0FBQ3BJLEtBQUssQ0FBQzBKLEdBQUcsQ0FBQ1AsS0FBSyxDQUFDYixPQUFPLENBQUM7UUFDN0IvSCxPQUFPLENBQUNzSSxRQUFRLENBQUNNLEtBQUssQ0FBQztNQUN6QixDQUFDLENBQUM7TUFFRjtJQUNGO0lBRUEsSUFBSSxDQUFDOEcsV0FBVyxDQUFDMVAsT0FBTyxFQUFFZ0csWUFBSSxDQUFDc0ssV0FBVyxFQUFFLElBQUlDLDBCQUFpQixDQUFDQywrQkFBVSxDQUFDZ0MsVUFBVSxFQUFFTCxpQkFBaUIsRUFBRSxJQUFJLENBQUNwRCw0QkFBNEIsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDaFEsTUFBTSxDQUFDaUMsT0FBTyxFQUFFLElBQUksQ0FBQ1AsaUJBQWlCLENBQUMsQ0FBQztFQUNoTTs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0VBQ0VnUyxhQUFhQSxDQUFDelMsT0FBZ0IsRUFBRTtJQUM5QixJQUFJO01BQ0ZBLE9BQU8sQ0FBQzZQLGtCQUFrQixDQUFDLElBQUksQ0FBQ3BQLGlCQUFpQixDQUFDO0lBQ3BELENBQUMsQ0FBQyxPQUFPbUksS0FBVSxFQUFFO01BQ25CNUksT0FBTyxDQUFDNEksS0FBSyxHQUFHQSxLQUFLO01BRXJCaEIsT0FBTyxDQUFDQyxRQUFRLENBQUMsTUFBTTtRQUNyQixJQUFJLENBQUNwSSxLQUFLLENBQUMwSixHQUFHLENBQUNQLEtBQUssQ0FBQ2IsT0FBTyxDQUFDO1FBQzdCL0gsT0FBTyxDQUFDc0ksUUFBUSxDQUFDTSxLQUFLLENBQUM7TUFDekIsQ0FBQyxDQUFDO01BRUY7SUFDRjtJQUVBLElBQUksQ0FBQzhHLFdBQVcsQ0FBQzFQLE9BQU8sRUFBRWdHLFlBQUksQ0FBQ3NLLFdBQVcsRUFBRSxJQUFJQywwQkFBaUIsQ0FBQ3ZRLE9BQU8sQ0FBQzJQLGtCQUFrQixFQUFHM1AsT0FBTyxDQUFDOFAsVUFBVSxFQUFFLElBQUksQ0FBQ2YsNEJBQTRCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ2hRLE1BQU0sQ0FBQ2lDLE9BQU8sRUFBRSxJQUFJLENBQUNQLGlCQUFpQixDQUFDLENBQUM7RUFDdk07O0VBRUE7QUFDRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0VpUyxnQkFBZ0JBLENBQUNwSyxRQUFrQyxFQUFFaEMsSUFBSSxHQUFHLEVBQUUsRUFBRTNDLGNBQWMsR0FBRyxJQUFJLENBQUM1RSxNQUFNLENBQUNpQyxPQUFPLENBQUMyQyxjQUFjLEVBQUU7SUFDbkgsSUFBQXNCLHNDQUF5QixFQUFDdEIsY0FBYyxFQUFFLGdCQUFnQixDQUFDO0lBRTNELE1BQU1nUCxXQUFXLEdBQUcsSUFBSUMsd0JBQVcsQ0FBQ3RNLElBQUksRUFBRTNDLGNBQWMsQ0FBQztJQUV6RCxJQUFJLElBQUksQ0FBQzVFLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsR0FBRyxLQUFLLEVBQUU7TUFDMUMsT0FBTyxJQUFJLENBQUNpTCxZQUFZLENBQUMsSUFBSStCLGdCQUFPLENBQUMsa0NBQWtDLEdBQUltQixXQUFXLENBQUNFLG9CQUFvQixDQUFDLENBQUUsR0FBRyxjQUFjLEdBQUdGLFdBQVcsQ0FBQ3JNLElBQUksRUFBR0UsR0FBRyxJQUFLO1FBQzNKLElBQUksQ0FBQ3JILGdCQUFnQixFQUFFO1FBQ3ZCLElBQUksSUFBSSxDQUFDQSxnQkFBZ0IsS0FBSyxDQUFDLEVBQUU7VUFDL0IsSUFBSSxDQUFDRixhQUFhLEdBQUcsSUFBSTtRQUMzQjtRQUNBcUosUUFBUSxDQUFDOUIsR0FBRyxDQUFDO01BQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTDtJQUVBLE1BQU14RyxPQUFPLEdBQUcsSUFBSXdSLGdCQUFPLENBQUMxUSxTQUFTLEVBQUcwRixHQUFHLElBQUs7TUFDOUMsT0FBTzhCLFFBQVEsQ0FBQzlCLEdBQUcsRUFBRSxJQUFJLENBQUN1SSw0QkFBNEIsQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxJQUFJLENBQUNXLFdBQVcsQ0FBQzFQLE9BQU8sRUFBRWdHLFlBQUksQ0FBQzhNLG1CQUFtQixFQUFFSCxXQUFXLENBQUNJLFlBQVksQ0FBQyxJQUFJLENBQUNoRSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMzSDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFaUUsaUJBQWlCQSxDQUFDMUssUUFBbUMsRUFBRWhDLElBQUksR0FBRyxFQUFFLEVBQUU7SUFDaEUsTUFBTXFNLFdBQVcsR0FBRyxJQUFJQyx3QkFBVyxDQUFDdE0sSUFBSSxDQUFDO0lBQ3pDLElBQUksSUFBSSxDQUFDdkgsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0QsVUFBVSxHQUFHLEtBQUssRUFBRTtNQUMxQyxPQUFPLElBQUksQ0FBQ2lMLFlBQVksQ0FBQyxJQUFJK0IsZ0JBQU8sQ0FBQyxjQUFjLEdBQUdtQixXQUFXLENBQUNyTSxJQUFJLEVBQUdFLEdBQUcsSUFBSztRQUMvRSxJQUFJLENBQUNySCxnQkFBZ0IsRUFBRTtRQUN2QixJQUFJLElBQUksQ0FBQ0EsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO1VBQy9CLElBQUksQ0FBQ0YsYUFBYSxHQUFHLEtBQUs7UUFDNUI7UUFFQXFKLFFBQVEsQ0FBQzlCLEdBQUcsQ0FBQztNQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0w7SUFDQSxNQUFNeEcsT0FBTyxHQUFHLElBQUl3UixnQkFBTyxDQUFDMVEsU0FBUyxFQUFFd0gsUUFBUSxDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDb0gsV0FBVyxDQUFDMVAsT0FBTyxFQUFFZ0csWUFBSSxDQUFDOE0sbUJBQW1CLEVBQUVILFdBQVcsQ0FBQ00sYUFBYSxDQUFDLElBQUksQ0FBQ2xFLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzVIOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRW1FLG1CQUFtQkEsQ0FBQzVLLFFBQXFDLEVBQUVoQyxJQUFJLEdBQUcsRUFBRSxFQUFFO0lBQ3BFLE1BQU1xTSxXQUFXLEdBQUcsSUFBSUMsd0JBQVcsQ0FBQ3RNLElBQUksQ0FBQztJQUN6QyxJQUFJLElBQUksQ0FBQ3ZILE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsR0FBRyxLQUFLLEVBQUU7TUFDMUMsT0FBTyxJQUFJLENBQUNpTCxZQUFZLENBQUMsSUFBSStCLGdCQUFPLENBQUMsZ0JBQWdCLEdBQUdtQixXQUFXLENBQUNyTSxJQUFJLEVBQUdFLEdBQUcsSUFBSztRQUNqRixJQUFJLENBQUNySCxnQkFBZ0IsRUFBRTtRQUN2QixJQUFJLElBQUksQ0FBQ0EsZ0JBQWdCLEtBQUssQ0FBQyxFQUFFO1VBQy9CLElBQUksQ0FBQ0YsYUFBYSxHQUFHLEtBQUs7UUFDNUI7UUFDQXFKLFFBQVEsQ0FBQzlCLEdBQUcsQ0FBQztNQUNmLENBQUMsQ0FBQyxDQUFDO0lBQ0w7SUFDQSxNQUFNeEcsT0FBTyxHQUFHLElBQUl3UixnQkFBTyxDQUFDMVEsU0FBUyxFQUFFd0gsUUFBUSxDQUFDO0lBQ2hELE9BQU8sSUFBSSxDQUFDb0gsV0FBVyxDQUFDMVAsT0FBTyxFQUFFZ0csWUFBSSxDQUFDOE0sbUJBQW1CLEVBQUVILFdBQVcsQ0FBQ1EsZUFBZSxDQUFDLElBQUksQ0FBQ3BFLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQzlIOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRXFFLGVBQWVBLENBQUM5SyxRQUFpQyxFQUFFaEMsSUFBWSxFQUFFO0lBQy9ELE1BQU1xTSxXQUFXLEdBQUcsSUFBSUMsd0JBQVcsQ0FBQ3RNLElBQUksQ0FBQztJQUN6QyxJQUFJLElBQUksQ0FBQ3ZILE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsR0FBRyxLQUFLLEVBQUU7TUFDMUMsT0FBTyxJQUFJLENBQUNpTCxZQUFZLENBQUMsSUFBSStCLGdCQUFPLENBQUMsWUFBWSxHQUFHbUIsV0FBVyxDQUFDck0sSUFBSSxFQUFHRSxHQUFHLElBQUs7UUFDN0UsSUFBSSxDQUFDckgsZ0JBQWdCLEVBQUU7UUFDdkJtSixRQUFRLENBQUM5QixHQUFHLENBQUM7TUFDZixDQUFDLENBQUMsQ0FBQztJQUNMO0lBQ0EsTUFBTXhHLE9BQU8sR0FBRyxJQUFJd1IsZ0JBQU8sQ0FBQzFRLFNBQVMsRUFBRXdILFFBQVEsQ0FBQztJQUNoRCxPQUFPLElBQUksQ0FBQ29ILFdBQVcsQ0FBQzFQLE9BQU8sRUFBRWdHLFlBQUksQ0FBQzhNLG1CQUFtQixFQUFFSCxXQUFXLENBQUNVLFdBQVcsQ0FBQyxJQUFJLENBQUN0RSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBQztFQUMxSDs7RUFFQTtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDRTRELFdBQVdBLENBQUNXLEVBQXlLLEVBQUUzUCxjQUFxRSxFQUFFO0lBQzVQLElBQUksT0FBTzJQLEVBQUUsS0FBSyxVQUFVLEVBQUU7TUFDNUIsTUFBTSxJQUFJM1MsU0FBUyxDQUFDLHlCQUF5QixDQUFDO0lBQ2hEO0lBRUEsTUFBTTRTLFlBQVksR0FBRyxJQUFJLENBQUN0VSxhQUFhO0lBQ3ZDLE1BQU1xSCxJQUFJLEdBQUcsV0FBVyxHQUFJa04sZUFBTSxDQUFDQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM3RyxRQUFRLENBQUMsS0FBSyxDQUFFO0lBQ25FLE1BQU04RyxNQUEySCxHQUFHQSxDQUFDbE4sR0FBRyxFQUFFbU4sSUFBSSxFQUFFLEdBQUd6TSxJQUFJLEtBQUs7TUFDMUosSUFBSVYsR0FBRyxFQUFFO1FBQ1AsSUFBSSxJQUFJLENBQUN2SCxhQUFhLElBQUksSUFBSSxDQUFDYSxLQUFLLEtBQUssSUFBSSxDQUFDK0YsS0FBSyxDQUFDK04sU0FBUyxFQUFFO1VBQzdELElBQUksQ0FBQ1YsbUJBQW1CLENBQUVXLEtBQUssSUFBSztZQUNsQ0YsSUFBSSxDQUFDRSxLQUFLLElBQUlyTixHQUFHLEVBQUUsR0FBR1UsSUFBSSxDQUFDO1VBQzdCLENBQUMsRUFBRVosSUFBSSxDQUFDO1FBQ1YsQ0FBQyxNQUFNO1VBQ0xxTixJQUFJLENBQUNuTixHQUFHLEVBQUUsR0FBR1UsSUFBSSxDQUFDO1FBQ3BCO01BQ0YsQ0FBQyxNQUFNLElBQUlxTSxZQUFZLEVBQUU7UUFDdkIsSUFBSSxJQUFJLENBQUN4VSxNQUFNLENBQUNpQyxPQUFPLENBQUN3RCxVQUFVLEdBQUcsS0FBSyxFQUFFO1VBQzFDLElBQUksQ0FBQ3JGLGdCQUFnQixFQUFFO1FBQ3pCO1FBQ0F3VSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUd6TSxJQUFJLENBQUM7TUFDckIsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDOEwsaUJBQWlCLENBQUVhLEtBQUssSUFBSztVQUNoQ0YsSUFBSSxDQUFDRSxLQUFLLEVBQUUsR0FBRzNNLElBQUksQ0FBQztRQUN0QixDQUFDLEVBQUVaLElBQUksQ0FBQztNQUNWO0lBQ0YsQ0FBQztJQUVELElBQUlpTixZQUFZLEVBQUU7TUFDaEIsT0FBTyxJQUFJLENBQUNILGVBQWUsQ0FBRTVNLEdBQUcsSUFBSztRQUNuQyxJQUFJQSxHQUFHLEVBQUU7VUFDUCxPQUFPOE0sRUFBRSxDQUFDOU0sR0FBRyxDQUFDO1FBQ2hCO1FBRUEsSUFBSTdDLGNBQWMsRUFBRTtVQUNsQixPQUFPLElBQUksQ0FBQzhMLFlBQVksQ0FBQyxJQUFJK0IsZ0JBQU8sQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUNsQyxxQkFBcUIsQ0FBQzNMLGNBQWMsQ0FBQyxFQUFHNkMsR0FBRyxJQUFLO1lBQzdILE9BQU84TSxFQUFFLENBQUM5TSxHQUFHLEVBQUVrTixNQUFNLENBQUM7VUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLE1BQU07VUFDTCxPQUFPSixFQUFFLENBQUMsSUFBSSxFQUFFSSxNQUFNLENBQUM7UUFDekI7TUFDRixDQUFDLEVBQUVwTixJQUFJLENBQUM7SUFDVixDQUFDLE1BQU07TUFDTCxPQUFPLElBQUksQ0FBQ29NLGdCQUFnQixDQUFFbE0sR0FBRyxJQUFLO1FBQ3BDLElBQUlBLEdBQUcsRUFBRTtVQUNQLE9BQU84TSxFQUFFLENBQUM5TSxHQUFHLENBQUM7UUFDaEI7UUFFQSxPQUFPOE0sRUFBRSxDQUFDLElBQUksRUFBRUksTUFBTSxDQUFDO01BQ3pCLENBQUMsRUFBRXBOLElBQUksRUFBRTNDLGNBQWMsQ0FBQztJQUMxQjtFQUNGOztFQUVBO0FBQ0Y7QUFDQTtFQUNFK0wsV0FBV0EsQ0FBQzFQLE9BQTJCLEVBQUU4VCxVQUFrQixFQUFFbFIsT0FBK0YsRUFBRTtJQUM1SixJQUFJLElBQUksQ0FBQzlDLEtBQUssS0FBSyxJQUFJLENBQUMrRixLQUFLLENBQUMrTixTQUFTLEVBQUU7TUFDdkMsTUFBTTdMLE9BQU8sR0FBRyxtQ0FBbUMsR0FBRyxJQUFJLENBQUNsQyxLQUFLLENBQUMrTixTQUFTLENBQUN0TixJQUFJLEdBQUcsa0JBQWtCLEdBQUcsSUFBSSxDQUFDeEcsS0FBSyxDQUFDd0csSUFBSSxHQUFHLFFBQVE7TUFDakksSUFBSSxDQUFDN0csS0FBSyxDQUFDMEosR0FBRyxDQUFDcEIsT0FBTyxDQUFDO01BQ3ZCL0gsT0FBTyxDQUFDc0ksUUFBUSxDQUFDLElBQUlELG9CQUFZLENBQUNOLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM5RCxDQUFDLE1BQU0sSUFBSS9ILE9BQU8sQ0FBQytULFFBQVEsRUFBRTtNQUMzQm5NLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLE1BQU07UUFDckI3SCxPQUFPLENBQUNzSSxRQUFRLENBQUMsSUFBSUQsb0JBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7TUFDNUQsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxNQUFNO01BQ0wsSUFBSXlMLFVBQVUsS0FBSzlOLFlBQUksQ0FBQ2lKLFNBQVMsRUFBRTtRQUNqQyxJQUFJLENBQUM3UCxVQUFVLEdBQUcsSUFBSTtNQUN4QixDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNBLFVBQVUsR0FBRyxLQUFLO01BQ3pCO01BRUEsSUFBSSxDQUFDWSxPQUFPLEdBQUdBLE9BQU87TUFDdEJBLE9BQU8sQ0FBQ2dVLFVBQVUsR0FBSSxJQUFJO01BQzFCaFUsT0FBTyxDQUFDaVUsUUFBUSxHQUFJLENBQUM7TUFDckJqVSxPQUFPLENBQUNnUixJQUFJLEdBQUksRUFBRTtNQUNsQmhSLE9BQU8sQ0FBQ2tVLEdBQUcsR0FBSSxFQUFFO01BRWpCLE1BQU01QyxRQUFRLEdBQUdBLENBQUEsS0FBTTtRQUNyQjZDLGFBQWEsQ0FBQ0MsTUFBTSxDQUFDck0sT0FBTyxDQUFDO1FBQzdCb00sYUFBYSxDQUFDekosT0FBTyxDQUFDLElBQUlyQyxvQkFBWSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQzs7UUFFL0Q7UUFDQU4sT0FBTyxDQUFDc00sTUFBTSxHQUFHLElBQUk7UUFDckJ0TSxPQUFPLENBQUN5QyxHQUFHLENBQUMsQ0FBQztRQUViLElBQUl4SyxPQUFPLFlBQVl3UixnQkFBTyxJQUFJeFIsT0FBTyxDQUFDc1UsTUFBTSxFQUFFO1VBQ2hEO1VBQ0F0VSxPQUFPLENBQUN1VSxNQUFNLENBQUMsQ0FBQztRQUNsQjtNQUNGLENBQUM7TUFFRHZVLE9BQU8sQ0FBQzJHLElBQUksQ0FBQyxRQUFRLEVBQUUySyxRQUFRLENBQUM7TUFFaEMsSUFBSSxDQUFDdEcsa0JBQWtCLENBQUMsQ0FBQztNQUV6QixNQUFNakQsT0FBTyxHQUFHLElBQUlpSCxnQkFBTyxDQUFDO1FBQUVqTyxJQUFJLEVBQUUrUyxVQUFVO1FBQUVVLGVBQWUsRUFBRSxJQUFJLENBQUN6VTtNQUE2QixDQUFDLENBQUM7TUFDckcsSUFBSSxDQUFDRixTQUFTLENBQUNxUCxxQkFBcUIsQ0FBQ1QsS0FBSyxDQUFDMUcsT0FBTyxDQUFDO01BQ25ELElBQUksQ0FBQ25CLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQzRPLG1CQUFtQixDQUFDO01BRWpEMU0sT0FBTyxDQUFDcEIsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNO1FBQzNCM0csT0FBTyxDQUFDeUcsY0FBYyxDQUFDLFFBQVEsRUFBRTZLLFFBQVEsQ0FBQztRQUMxQ3RSLE9BQU8sQ0FBQzJHLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDbkcsdUJBQXVCLENBQUM7UUFFcEQsSUFBSSxDQUFDVCw0QkFBNEIsR0FBRyxLQUFLO1FBQ3pDLElBQUksQ0FBQ04sS0FBSyxDQUFDbUQsT0FBTyxDQUFDLFlBQVc7VUFDNUIsT0FBT0EsT0FBTyxDQUFFZ0ssUUFBUSxDQUFDLElBQUksQ0FBQztRQUNoQyxDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7TUFFRixNQUFNdUgsYUFBYSxHQUFHaEYsZ0JBQVEsQ0FBQ3pKLElBQUksQ0FBQzlDLE9BQU8sQ0FBQztNQUM1Q3VSLGFBQWEsQ0FBQ3hOLElBQUksQ0FBQyxPQUFPLEVBQUdpQyxLQUFLLElBQUs7UUFDckN1TCxhQUFhLENBQUNDLE1BQU0sQ0FBQ3JNLE9BQU8sQ0FBQzs7UUFFN0I7UUFDQS9ILE9BQU8sQ0FBQzRJLEtBQUssS0FBS0EsS0FBSztRQUV2QmIsT0FBTyxDQUFDc00sTUFBTSxHQUFHLElBQUk7UUFDckJ0TSxPQUFPLENBQUN5QyxHQUFHLENBQUMsQ0FBQztNQUNmLENBQUMsQ0FBQztNQUNGMkosYUFBYSxDQUFDL0UsSUFBSSxDQUFDckgsT0FBTyxDQUFDO0lBQzdCO0VBQ0Y7O0VBRUE7QUFDRjtBQUNBO0VBQ0V1RCxNQUFNQSxDQUFBLEVBQUc7SUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDdEwsT0FBTyxFQUFFO01BQ2pCLE9BQU8sS0FBSztJQUNkO0lBRUEsSUFBSSxJQUFJLENBQUNBLE9BQU8sQ0FBQytULFFBQVEsRUFBRTtNQUN6QixPQUFPLEtBQUs7SUFDZDtJQUVBLElBQUksQ0FBQy9ULE9BQU8sQ0FBQ3NMLE1BQU0sQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sSUFBSTtFQUNiOztFQUVBO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFb0osS0FBS0EsQ0FBQ3BNLFFBQXVCLEVBQUU7SUFDN0IsTUFBTXRJLE9BQU8sR0FBRyxJQUFJd1IsZ0JBQU8sQ0FBQyxJQUFJLENBQUMxQyxhQUFhLENBQUMsQ0FBQyxFQUFHdEksR0FBRyxJQUFLO01BQ3pELElBQUksSUFBSSxDQUFDekgsTUFBTSxDQUFDaUMsT0FBTyxDQUFDd0QsVUFBVSxHQUFHLEtBQUssRUFBRTtRQUMxQyxJQUFJLENBQUN2RixhQUFhLEdBQUcsS0FBSztNQUM1QjtNQUNBcUosUUFBUSxDQUFDOUIsR0FBRyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDekcsNEJBQTRCLEdBQUcsSUFBSTtJQUN4QyxJQUFJLENBQUMwUCxZQUFZLENBQUN6UCxPQUFPLENBQUM7RUFDNUI7O0VBRUE7QUFDRjtBQUNBO0VBQ0UrTyw0QkFBNEJBLENBQUEsRUFBRztJQUM3QixPQUFPLElBQUksQ0FBQzdQLHNCQUFzQixDQUFDLElBQUksQ0FBQ0Esc0JBQXNCLENBQUNnUixNQUFNLEdBQUcsQ0FBQyxDQUFDO0VBQzVFOztFQUVBO0FBQ0Y7QUFDQTtFQUNFWixxQkFBcUJBLENBQUMzTCxjQUFvRSxFQUFFO0lBQzFGLFFBQVFBLGNBQWM7TUFDcEIsS0FBS3ZCLDRCQUFlLENBQUN1UyxnQkFBZ0I7UUFDbkMsT0FBTyxrQkFBa0I7TUFDM0IsS0FBS3ZTLDRCQUFlLENBQUN3UyxlQUFlO1FBQ2xDLE9BQU8saUJBQWlCO01BQzFCLEtBQUt4Uyw0QkFBZSxDQUFDeVMsWUFBWTtRQUMvQixPQUFPLGNBQWM7TUFDdkIsS0FBS3pTLDRCQUFlLENBQUMwUyxRQUFRO1FBQzNCLE9BQU8sVUFBVTtNQUNuQjtRQUNFLE9BQU8sZ0JBQWdCO0lBQzNCO0VBQ0Y7QUFDRjtBQUVBLFNBQVNDLGdCQUFnQkEsQ0FBQ25NLEtBQXVDLEVBQVc7RUFDMUUsSUFBSUEsS0FBSyxZQUFZb00seUJBQWMsRUFBRTtJQUNuQ3BNLEtBQUssR0FBR0EsS0FBSyxDQUFDcU0sTUFBTSxDQUFDLENBQUMsQ0FBQztFQUN6QjtFQUNBLE9BQVFyTSxLQUFLLFlBQVl2Qyx1QkFBZSxJQUFLLENBQUMsQ0FBQ3VDLEtBQUssQ0FBQ3NNLFdBQVc7QUFDbEU7QUFBQyxJQUFBQyxRQUFBLEdBRWN2VyxVQUFVO0FBQUF3VyxPQUFBLENBQUF2WSxPQUFBLEdBQUFzWSxRQUFBO0FBQ3pCRSxNQUFNLENBQUNELE9BQU8sR0FBR3hXLFVBQVU7QUFFM0JBLFVBQVUsQ0FBQ3JCLFNBQVMsQ0FBQ3NJLEtBQUssR0FBRztFQUMzQkMsV0FBVyxFQUFFO0lBQ1hRLElBQUksRUFBRSxhQUFhO0lBQ25Cd0YsTUFBTSxFQUFFLENBQUM7RUFDWCxDQUFDO0VBQ0RqRixVQUFVLEVBQUU7SUFDVlAsSUFBSSxFQUFFLFlBQVk7SUFDbEJvRixLQUFLLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO01BQ2hCLElBQUksQ0FBQ3JFLG9CQUFvQixDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUNEeUUsTUFBTSxFQUFFO01BQ05qRCxXQUFXLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO1FBQ3RCLElBQUksQ0FBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQyxDQUFDO01BQ0RuRixjQUFjLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO1FBQ3pCLElBQUksQ0FBQzJFLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQztJQUNGO0VBQ0YsQ0FBQztFQUNEaUMsYUFBYSxFQUFFO0lBQ2IvQyxJQUFJLEVBQUUsY0FBYztJQUNwQm9GLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQ1gsSUFBSXZMLGFBQWEsR0FBR3NGLE1BQU0sQ0FBQ0UsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVuQyxJQUFJb0MsT0FBTztRQUNYLElBQUk7VUFDRkEsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDbEksU0FBUyxDQUFDeVYsV0FBVyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLE9BQU85TyxHQUFRLEVBQUU7VUFDakIsT0FBTyxJQUFJLENBQUNxQyxXQUFXLENBQUNyQyxHQUFHLENBQUM7UUFDOUI7UUFFQSxXQUFXLE1BQU05RCxJQUFJLElBQUlxRixPQUFPLEVBQUU7VUFDaEM1SCxhQUFhLEdBQUdzRixNQUFNLENBQUM4UCxNQUFNLENBQUMsQ0FBQ3BWLGFBQWEsRUFBRXVDLElBQUksQ0FBQyxDQUFDO1FBQ3REO1FBRUEsTUFBTThTLGVBQWUsR0FBRyxJQUFJaEosd0JBQWUsQ0FBQ3JNLGFBQWEsQ0FBQztRQUMxRCxJQUFJLENBQUNWLEtBQUssQ0FBQ21ELE9BQU8sQ0FBQyxZQUFXO1VBQzVCLE9BQU80UyxlQUFlLENBQUM1SSxRQUFRLENBQUMsSUFBSSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQztRQUVGLElBQUk0SSxlQUFlLENBQUMxVyxlQUFlLEtBQUssQ0FBQyxFQUFFO1VBQ3pDLElBQUksQ0FBQ0EsZUFBZSxHQUFHLElBQUk7UUFDN0I7UUFDQSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUNDLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3VDLE9BQU8sS0FBS2lTLGVBQWUsQ0FBQ0MsZ0JBQWdCLEtBQUssSUFBSSxJQUFJRCxlQUFlLENBQUNDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxFQUFFO1VBQ3pJLElBQUksQ0FBQyxJQUFJLENBQUMxVyxNQUFNLENBQUNpQyxPQUFPLENBQUN1QyxPQUFPLEVBQUU7WUFDaEMsSUFBSSxDQUFDMEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJWix1QkFBZSxDQUFDLGtFQUFrRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3pILE9BQU8sSUFBSSxDQUFDYyxLQUFLLENBQUMsQ0FBQztVQUNyQjtVQUVBLElBQUk7WUFBQSxJQUFBdU8saUJBQUE7WUFDRixJQUFJLENBQUM5TyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUNrRyxzQkFBc0IsQ0FBQztZQUNwRCxNQUFNLElBQUksQ0FBQ2xNLFNBQVMsQ0FBQzhWLFFBQVEsQ0FBQyxJQUFJLENBQUMzVyxvQkFBb0IsRUFBRSxJQUFJLENBQUNELE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3NELFVBQVUsR0FBRyxJQUFJLENBQUN2RixNQUFNLENBQUNpQyxPQUFPLENBQUNzRCxVQUFVLEdBQUcsRUFBQW9SLGlCQUFBLE9BQUksQ0FBQzlWLFdBQVcsY0FBQThWLGlCQUFBLHVCQUFoQkEsaUJBQUEsQ0FBa0I5VSxNQUFNLEtBQUksSUFBSSxDQUFDN0IsTUFBTSxDQUFDNkIsTUFBTSxFQUFFLElBQUksQ0FBQzdCLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQzJELHNCQUFzQixDQUFDO1VBQ3hOLENBQUMsQ0FBQyxPQUFPNkIsR0FBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDcUMsV0FBVyxDQUFDckMsR0FBRyxDQUFDO1VBQzlCO1FBQ0Y7UUFFQSxJQUFJLENBQUNxRyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXZCLE1BQU07VUFBRWhNO1FBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQzlCLE1BQU07UUFFdEMsUUFBUThCLGNBQWMsQ0FBQ0UsSUFBSTtVQUN6QixLQUFLLGlDQUFpQztVQUN0QyxLQUFLLCtCQUErQjtVQUNwQyxLQUFLLHdDQUF3QztVQUM3QyxLQUFLLGlEQUFpRDtVQUN0RCxLQUFLLGdDQUFnQztZQUNuQyxJQUFJLENBQUM2RixZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUMrUCx3QkFBd0IsQ0FBQztZQUN0RDtVQUNGLEtBQUssTUFBTTtZQUNULElBQUksQ0FBQ2hQLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ2dRLHFCQUFxQixDQUFDO1lBQ25EO1VBQ0Y7WUFDRSxJQUFJLENBQUNqUCxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUM4SSwrQkFBK0IsQ0FBQztZQUM3RDtRQUNKO01BQ0YsQ0FBQyxFQUFFLENBQUMsQ0FBQ2xFLEtBQUssQ0FBRWpFLEdBQUcsSUFBSztRQUNsQm9CLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLE1BQU07VUFDckIsTUFBTXJCLEdBQUc7UUFDWCxDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBQ0RzRixNQUFNLEVBQUU7TUFDTmpELFdBQVcsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDdEIsSUFBSSxDQUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDLENBQUM7TUFDRG5GLGNBQWMsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDekIsSUFBSSxDQUFDMkUsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDO0lBQ0Y7RUFDRixDQUFDO0VBQ0Q2RSxTQUFTLEVBQUU7SUFDVDNGLElBQUksRUFBRSxXQUFXO0lBQ2pCb0YsS0FBSyxFQUFFLFNBQUFBLENBQUEsRUFBVztNQUNoQixJQUFJLENBQUMxRCxpQkFBaUIsQ0FBQ3hKLFlBQVksQ0FBQ0UsUUFBUSxDQUFDO0lBQy9DLENBQUM7SUFDRG9OLE1BQU0sRUFBRTtNQUNOL0QsT0FBTyxFQUFFLFNBQUFBLENBQUEsRUFBVyxDQUNwQixDQUFDO01BQ0RjLFdBQVcsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDdEIsSUFBSSxDQUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDLENBQUM7TUFDRG5GLGNBQWMsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDekIsSUFBSSxDQUFDMkUsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDLENBQUM7TUFDRDBPLFNBQVMsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDcEIsSUFBSSxDQUFDbFAsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDZ0IsVUFBVSxDQUFDO01BQzFDO0lBQ0Y7RUFDRixDQUFDO0VBQ0RxRix1QkFBdUIsRUFBRTtJQUN2QjVGLElBQUksRUFBRSx5QkFBeUI7SUFDL0JvRixLQUFLLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO01BQ2hCLElBQUksQ0FBQ3JNLHNCQUFzQixFQUFFO01BQzdCLElBQUksQ0FBQzJJLGlCQUFpQixDQUFDeEosWUFBWSxDQUFDRyxLQUFLLENBQUM7SUFDNUMsQ0FBQztJQUNEbU4sTUFBTSxFQUFFO01BQ04vRCxPQUFPLEVBQUUsU0FBQUEsQ0FBQSxFQUFXLENBQ3BCLENBQUM7TUFDRGMsV0FBVyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN0QixJQUFJLENBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckMsQ0FBQztNQUNEbkYsY0FBYyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN6QixJQUFJLENBQUMyRSxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckMsQ0FBQztNQUNEMk8sS0FBSyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUNoQixJQUFJLENBQUM5SyxnQkFBZ0IsQ0FBQyxDQUFDO01BQ3pCO0lBQ0Y7RUFDRixDQUFDO0VBQ0RjLHNCQUFzQixFQUFFO0lBQ3RCekYsSUFBSSxFQUFFLHVCQUF1QjtJQUM3QndGLE1BQU0sRUFBRTtNQUNOakQsV0FBVyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN0QixJQUFJLENBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckMsQ0FBQztNQUNEbkYsY0FBYyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN6QixJQUFJLENBQUMyRSxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckM7SUFDRjtFQUNGLENBQUM7RUFDRHVILCtCQUErQixFQUFFO0lBQy9CckksSUFBSSxFQUFFLDZCQUE2QjtJQUNuQ29GLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQ1gsSUFBSTNELE9BQU87UUFDWCxJQUFJO1VBQ0ZBLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ2xJLFNBQVMsQ0FBQ3lWLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxPQUFPOU8sR0FBUSxFQUFFO1VBQ2pCLE9BQU8sSUFBSSxDQUFDcUMsV0FBVyxDQUFDckMsR0FBRyxDQUFDO1FBQzlCO1FBRUEsTUFBTWlDLE9BQU8sR0FBRyxJQUFJdU4sMkJBQWtCLENBQUMsSUFBSSxDQUFDO1FBQzVDLE1BQU1DLGlCQUFpQixHQUFHLElBQUksQ0FBQ3pOLHVCQUF1QixDQUFDVCxPQUFPLEVBQUVVLE9BQU8sQ0FBQztRQUV4RSxNQUFNLElBQUE5QixZQUFJLEVBQUNzUCxpQkFBaUIsRUFBRSxLQUFLLENBQUM7UUFFcEMsSUFBSXhOLE9BQU8sQ0FBQ3lOLGdCQUFnQixFQUFFO1VBQzVCLElBQUl6TixPQUFPLENBQUM3SSxXQUFXLEVBQUU7WUFDdkIsSUFBSSxDQUFDQSxXQUFXLEdBQUc2SSxPQUFPLENBQUM3SSxXQUFXO1lBQ3RDLElBQUksQ0FBQ2dILFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ29HLFNBQVMsQ0FBQztVQUN6QyxDQUFDLE1BQU07WUFDTCxJQUFJLENBQUNyRixZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUNzUSw2QkFBNkIsQ0FBQztVQUM3RDtRQUNGLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQzNXLFVBQVUsRUFBRTtVQUMxQixJQUFJdVYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDdlYsVUFBVSxDQUFDLEVBQUU7WUFDckMsSUFBSSxDQUFDQyxLQUFLLENBQUMwSixHQUFHLENBQUMscUNBQXFDLENBQUM7WUFDckQsSUFBSSxDQUFDdkMsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDcUcsdUJBQXVCLENBQUM7VUFDdkQsQ0FBQyxNQUFNO1lBQ0wsSUFBSSxDQUFDakYsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUN6SCxVQUFVLENBQUM7WUFDckMsSUFBSSxDQUFDb0gsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO1VBQ3JDO1FBQ0YsQ0FBQyxNQUFNO1VBQ0wsSUFBSSxDQUFDSCxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUlaLHVCQUFlLENBQUMsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1VBQ3BFLElBQUksQ0FBQ08sWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO1FBQ3JDO01BQ0YsQ0FBQyxFQUFFLENBQUMsQ0FBQ3FELEtBQUssQ0FBRWpFLEdBQUcsSUFBSztRQUNsQm9CLE9BQU8sQ0FBQ0MsUUFBUSxDQUFDLE1BQU07VUFDckIsTUFBTXJCLEdBQUc7UUFDWCxDQUFDLENBQUM7TUFDSixDQUFDLENBQUM7SUFDSixDQUFDO0lBQ0RzRixNQUFNLEVBQUU7TUFDTmpELFdBQVcsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDdEIsSUFBSSxDQUFDakMsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDLENBQUM7TUFDRG5GLGNBQWMsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDekIsSUFBSSxDQUFDMkUsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO01BQ3JDO0lBQ0Y7RUFDRixDQUFDO0VBQ0R5TyxxQkFBcUIsRUFBRTtJQUNyQnZQLElBQUksRUFBRSx5QkFBeUI7SUFDL0JvRixLQUFLLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO01BQ2hCLENBQUMsWUFBWTtRQUNYLE9BQU8sSUFBSSxFQUFFO1VBQ1gsSUFBSTNELE9BQU87VUFDWCxJQUFJO1lBQ0ZBLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ2xJLFNBQVMsQ0FBQ3lWLFdBQVcsQ0FBQyxDQUFDO1VBQzlDLENBQUMsQ0FBQyxPQUFPOU8sR0FBUSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDcUMsV0FBVyxDQUFDckMsR0FBRyxDQUFDO1VBQzlCO1VBRUEsTUFBTWlDLE9BQU8sR0FBRyxJQUFJdU4sMkJBQWtCLENBQUMsSUFBSSxDQUFDO1VBQzVDLE1BQU1DLGlCQUFpQixHQUFHLElBQUksQ0FBQ3pOLHVCQUF1QixDQUFDVCxPQUFPLEVBQUVVLE9BQU8sQ0FBQztVQUV4RSxNQUFNLElBQUE5QixZQUFJLEVBQUNzUCxpQkFBaUIsRUFBRSxLQUFLLENBQUM7VUFFcEMsSUFBSXhOLE9BQU8sQ0FBQ3lOLGdCQUFnQixFQUFFO1lBQzVCLElBQUl6TixPQUFPLENBQUM3SSxXQUFXLEVBQUU7Y0FDdkIsSUFBSSxDQUFDQSxXQUFXLEdBQUc2SSxPQUFPLENBQUM3SSxXQUFXO2NBQ3RDLE9BQU8sSUFBSSxDQUFDZ0gsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDb0csU0FBUyxDQUFDO1lBQ2hELENBQUMsTUFBTTtjQUNMLE9BQU8sSUFBSSxDQUFDckYsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDc1EsNkJBQTZCLENBQUM7WUFDcEU7VUFDRixDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUN6VyxVQUFVLEVBQUU7WUFDMUIsTUFBTW1CLGNBQWMsR0FBRyxJQUFJLENBQUM5QixNQUFNLENBQUM4QixjQUFvQztZQUV2RSxNQUFNK0IsT0FBTyxHQUFHLElBQUl3VCxvQkFBbUIsQ0FBQztjQUN0Q25WLE1BQU0sRUFBRUosY0FBYyxDQUFDRyxPQUFPLENBQUNDLE1BQU07Y0FDckNDLFFBQVEsRUFBRUwsY0FBYyxDQUFDRyxPQUFPLENBQUNFLFFBQVE7Y0FDekNDLFFBQVEsRUFBRU4sY0FBYyxDQUFDRyxPQUFPLENBQUNHLFFBQVE7Y0FDekN6QixVQUFVLEVBQUUsSUFBSSxDQUFDQTtZQUNuQixDQUFDLENBQUM7WUFFRixJQUFJLENBQUNHLFNBQVMsQ0FBQ2tHLFdBQVcsQ0FBQ0MsWUFBSSxDQUFDcVEsWUFBWSxFQUFFelQsT0FBTyxDQUFDRixJQUFJLENBQUM7WUFDM0QsSUFBSSxDQUFDakQsS0FBSyxDQUFDbUQsT0FBTyxDQUFDLFlBQVc7Y0FDNUIsT0FBT0EsT0FBTyxDQUFDZ0ssUUFBUSxDQUFDLElBQUksQ0FBQztZQUMvQixDQUFDLENBQUM7WUFFRixJQUFJLENBQUNsTixVQUFVLEdBQUdvQixTQUFTO1VBQzdCLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQ3RCLFVBQVUsRUFBRTtZQUMxQixJQUFJdVYsZ0JBQWdCLENBQUMsSUFBSSxDQUFDdlYsVUFBVSxDQUFDLEVBQUU7Y0FDckMsSUFBSSxDQUFDQyxLQUFLLENBQUMwSixHQUFHLENBQUMscUNBQXFDLENBQUM7Y0FDckQsT0FBTyxJQUFJLENBQUN2QyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUNxRyx1QkFBdUIsQ0FBQztZQUM5RCxDQUFDLE1BQU07Y0FDTCxJQUFJLENBQUNqRixJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQ3pILFVBQVUsQ0FBQztjQUNyQyxPQUFPLElBQUksQ0FBQ29ILFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztZQUM1QztVQUNGLENBQUMsTUFBTTtZQUNMLElBQUksQ0FBQ0gsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJWix1QkFBZSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNwRSxPQUFPLElBQUksQ0FBQ08sWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO1VBQzVDO1FBQ0Y7TUFFRixDQUFDLEVBQUUsQ0FBQyxDQUFDcUQsS0FBSyxDQUFFakUsR0FBRyxJQUFLO1FBQ2xCb0IsT0FBTyxDQUFDQyxRQUFRLENBQUMsTUFBTTtVQUNyQixNQUFNckIsR0FBRztRQUNYLENBQUMsQ0FBQztNQUNKLENBQUMsQ0FBQztJQUNKLENBQUM7SUFDRHNGLE1BQU0sRUFBRTtNQUNOakQsV0FBVyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN0QixJQUFJLENBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckMsQ0FBQztNQUNEbkYsY0FBYyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN6QixJQUFJLENBQUMyRSxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckM7SUFDRjtFQUNGLENBQUM7RUFDRHdPLHdCQUF3QixFQUFFO0lBQ3hCdFAsSUFBSSxFQUFFLHVCQUF1QjtJQUM3Qm9GLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQVc7TUFDaEIsQ0FBQyxZQUFZO1FBQ1gsSUFBSTNELE9BQU87UUFDWCxJQUFJO1VBQ0ZBLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQ2xJLFNBQVMsQ0FBQ3lWLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQyxPQUFPOU8sR0FBUSxFQUFFO1VBQ2pCLE9BQU8sSUFBSSxDQUFDcUMsV0FBVyxDQUFDckMsR0FBRyxDQUFDO1FBQzlCO1FBRUEsTUFBTWlDLE9BQU8sR0FBRyxJQUFJdU4sMkJBQWtCLENBQUMsSUFBSSxDQUFDO1FBQzVDLE1BQU1DLGlCQUFpQixHQUFHLElBQUksQ0FBQ3pOLHVCQUF1QixDQUFDVCxPQUFPLEVBQUVVLE9BQU8sQ0FBQztRQUN4RSxNQUFNLElBQUE5QixZQUFJLEVBQUNzUCxpQkFBaUIsRUFBRSxLQUFLLENBQUM7UUFDcEMsSUFBSXhOLE9BQU8sQ0FBQ3lOLGdCQUFnQixFQUFFO1VBQzVCLElBQUl6TixPQUFPLENBQUM3SSxXQUFXLEVBQUU7WUFDdkIsSUFBSSxDQUFDQSxXQUFXLEdBQUc2SSxPQUFPLENBQUM3SSxXQUFXO1lBQ3RDLElBQUksQ0FBQ2dILFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ29HLFNBQVMsQ0FBQztVQUN6QyxDQUFDLE1BQU07WUFDTCxJQUFJLENBQUNyRixZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUNzUSw2QkFBNkIsQ0FBQztVQUM3RDtVQUVBO1FBQ0Y7UUFFQSxNQUFNRyxnQkFBZ0IsR0FBRzdOLE9BQU8sQ0FBQzZOLGdCQUFnQjtRQUVqRCxJQUFJQSxnQkFBZ0IsSUFBSUEsZ0JBQWdCLENBQUNDLE1BQU0sSUFBSUQsZ0JBQWdCLENBQUNFLEdBQUcsRUFBRTtVQUN2RSxNQUFNM1YsY0FBYyxHQUFHLElBQUksQ0FBQzlCLE1BQU0sQ0FBQzhCLGNBQWlQO1VBQ3BSLE1BQU00VixVQUFVLEdBQUcsSUFBSUMsUUFBRyxDQUFDLFdBQVcsRUFBRUosZ0JBQWdCLENBQUNFLEdBQUcsQ0FBQyxDQUFDNUosUUFBUSxDQUFDLENBQUM7VUFFeEUsSUFBSStKLFdBQVc7VUFFZixRQUFROVYsY0FBYyxDQUFDRSxJQUFJO1lBQ3pCLEtBQUssaUNBQWlDO2NBQ3BDNFYsV0FBVyxHQUFHLElBQUlDLG9DQUEwQixDQUMxQy9WLGNBQWMsQ0FBQ0csT0FBTyxDQUFDTSxRQUFRLElBQUksUUFBUSxFQUMzQ1QsY0FBYyxDQUFDRyxPQUFPLENBQUNLLFFBQVEsRUFDL0JSLGNBQWMsQ0FBQ0csT0FBTyxDQUFDRSxRQUFRLEVBQy9CTCxjQUFjLENBQUNHLE9BQU8sQ0FBQ0csUUFDekIsQ0FBQztjQUNEO1lBQ0YsS0FBSywrQkFBK0I7WUFDcEMsS0FBSyx3Q0FBd0M7Y0FDM0MsTUFBTTBWLE9BQU8sR0FBR2hXLGNBQWMsQ0FBQ0csT0FBTyxDQUFDSyxRQUFRLEdBQUcsQ0FBQ1IsY0FBYyxDQUFDRyxPQUFPLENBQUNLLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDOUZzVixXQUFXLEdBQUcsSUFBSUcsbUNBQXlCLENBQUMsR0FBR0QsT0FBTyxDQUFDO2NBQ3ZEO1lBQ0YsS0FBSyxnQ0FBZ0M7Y0FDbkMsTUFBTTNQLElBQUksR0FBR3JHLGNBQWMsQ0FBQ0csT0FBTyxDQUFDSyxRQUFRLEdBQUc7Z0JBQUUwVix1QkFBdUIsRUFBRWxXLGNBQWMsQ0FBQ0csT0FBTyxDQUFDSztjQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7Y0FDaEhzVixXQUFXLEdBQUcsSUFBSUssZ0NBQXNCLENBQUM5UCxJQUFJLENBQUM7Y0FDOUM7WUFDRixLQUFLLGlEQUFpRDtjQUNwRHlQLFdBQVcsR0FBRyxJQUFJTSxnQ0FBc0IsQ0FDdENwVyxjQUFjLENBQUNHLE9BQU8sQ0FBQ00sUUFBUSxFQUMvQlQsY0FBYyxDQUFDRyxPQUFPLENBQUNLLFFBQVEsRUFDL0JSLGNBQWMsQ0FBQ0csT0FBTyxDQUFDUSxZQUN6QixDQUFDO2NBQ0Q7VUFDSjtVQUVBLElBQUkwVixhQUFhO1VBQ2pCLElBQUk7WUFDRkEsYUFBYSxHQUFHLE1BQU1QLFdBQVcsQ0FBQ1EsUUFBUSxDQUFDVixVQUFVLENBQUM7VUFDeEQsQ0FBQyxDQUFDLE9BQU9qUSxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUNoSCxVQUFVLEdBQUcsSUFBSXdWLHlCQUFjLENBQ2xDLENBQUMsSUFBSTNPLHVCQUFlLENBQUMsMERBQTBELEVBQUUsVUFBVSxDQUFDLEVBQUVHLEdBQUcsQ0FBQyxDQUFDO1lBQ3JHLElBQUksQ0FBQ1MsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUN6SCxVQUFVLENBQUM7WUFDckMsSUFBSSxDQUFDb0gsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO1lBQ25DO1VBQ0Y7VUFHQSxNQUFNN0YsS0FBSyxHQUFHMlYsYUFBYSxDQUFDM1YsS0FBSztVQUNqQyxJQUFJLENBQUM2TSx1QkFBdUIsQ0FBQzdNLEtBQUssQ0FBQztRQUVyQyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMvQixVQUFVLEVBQUU7VUFDMUIsSUFBSXVWLGdCQUFnQixDQUFDLElBQUksQ0FBQ3ZWLFVBQVUsQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQ0MsS0FBSyxDQUFDMEosR0FBRyxDQUFDLHFDQUFxQyxDQUFDO1lBQ3JELElBQUksQ0FBQ3ZDLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3FHLHVCQUF1QixDQUFDO1VBQ3ZELENBQUMsTUFBTTtZQUNMLElBQUksQ0FBQ2pGLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDekgsVUFBVSxDQUFDO1lBQ3JDLElBQUksQ0FBQ29ILFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztVQUNyQztRQUNGLENBQUMsTUFBTTtVQUNMLElBQUksQ0FBQ0gsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJWix1QkFBZSxDQUFDLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztVQUNwRSxJQUFJLENBQUNPLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztRQUNyQztNQUVGLENBQUMsRUFBRSxDQUFDLENBQUNxRCxLQUFLLENBQUVqRSxHQUFHLElBQUs7UUFDbEJvQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1VBQ3JCLE1BQU1yQixHQUFHO1FBQ1gsQ0FBQyxDQUFDO01BQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNEc0YsTUFBTSxFQUFFO01BQ05qRCxXQUFXLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO1FBQ3RCLElBQUksQ0FBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQyxDQUFDO01BQ0RuRixjQUFjLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO1FBQ3pCLElBQUksQ0FBQzJFLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQztJQUNGO0VBQ0YsQ0FBQztFQUNEK08sNkJBQTZCLEVBQUU7SUFDN0I3UCxJQUFJLEVBQUUsMkJBQTJCO0lBQ2pDb0YsS0FBSyxFQUFFLFNBQUFBLENBQUEsRUFBVztNQUNoQixDQUFDLFlBQVk7UUFDWCxJQUFJLENBQUNrRCxjQUFjLENBQUMsQ0FBQztRQUNyQixJQUFJN0csT0FBTztRQUNYLElBQUk7VUFDRkEsT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDbEksU0FBUyxDQUFDeVYsV0FBVyxDQUFDLENBQUM7UUFDOUMsQ0FBQyxDQUFDLE9BQU85TyxHQUFRLEVBQUU7VUFDakIsT0FBTyxJQUFJLENBQUNxQyxXQUFXLENBQUNyQyxHQUFHLENBQUM7UUFDOUI7UUFDQSxNQUFNeVAsaUJBQWlCLEdBQUcsSUFBSSxDQUFDek4sdUJBQXVCLENBQUNULE9BQU8sRUFBRSxJQUFJcVAsK0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakcsTUFBTSxJQUFBelEsWUFBSSxFQUFDc1AsaUJBQWlCLEVBQUUsS0FBSyxDQUFDO1FBRXBDLElBQUksQ0FBQ3JQLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQytOLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUNwRSxtQkFBbUIsQ0FBQyxDQUFDO01BRTVCLENBQUMsRUFBRSxDQUFDLENBQUMvRSxLQUFLLENBQUVqRSxHQUFHLElBQUs7UUFDbEJvQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1VBQ3JCLE1BQU1yQixHQUFHO1FBQ1gsQ0FBQyxDQUFDO01BQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNEc0YsTUFBTSxFQUFFO01BQ05qRCxXQUFXLEVBQUUsU0FBU0EsV0FBV0EsQ0FBQSxFQUFHO1FBQ2xDLElBQUksQ0FBQ2pDLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQyxDQUFDO01BQ0RuRixjQUFjLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO1FBQ3pCLElBQUksQ0FBQzJFLFlBQVksQ0FBQyxJQUFJLENBQUNmLEtBQUssQ0FBQ3VCLEtBQUssQ0FBQztNQUNyQztJQUNGO0VBQ0YsQ0FBQztFQUNEd00sU0FBUyxFQUFFO0lBQ1R0TixJQUFJLEVBQUUsVUFBVTtJQUNoQndGLE1BQU0sRUFBRTtNQUNOakQsV0FBVyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN0QixJQUFJLENBQUNqQyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7TUFDckM7SUFDRjtFQUNGLENBQUM7RUFDRHFOLG1CQUFtQixFQUFFO0lBQ25Cbk8sSUFBSSxFQUFFLG1CQUFtQjtJQUN6Qm9GLEtBQUssRUFBRSxTQUFBQSxDQUFBLEVBQVc7TUFDaEIsQ0FBQyxPQUFBMkwsYUFBQSxFQUFBQyxjQUFBLEVBQUFDLGVBQUEsS0FBWTtRQUNYLElBQUl4UCxPQUFPO1FBQ1gsSUFBSTtVQUNGQSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUNsSSxTQUFTLENBQUN5VixXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsT0FBTzlPLEdBQVEsRUFBRTtVQUNqQixPQUFPLElBQUksQ0FBQ3FDLFdBQVcsQ0FBQ3JDLEdBQUcsQ0FBQztRQUM5QjtRQUNBO1FBQ0EsSUFBSSxDQUFDMEIsaUJBQWlCLENBQUMsQ0FBQztRQUV4QixNQUFNK04saUJBQWlCLEdBQUcsSUFBSSxDQUFDek4sdUJBQXVCLENBQUNULE9BQU8sRUFBRSxJQUFJeVAsNEJBQW1CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQ3hYLE9BQVEsQ0FBQyxDQUFDOztRQUU3RztRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0EsSUFBSSxDQUFBcVgsYUFBQSxPQUFJLENBQUNyWCxPQUFPLGNBQUFxWCxhQUFBLGVBQVpBLGFBQUEsQ0FBY3RELFFBQVEsSUFBSSxJQUFJLENBQUMxVCxXQUFXLEVBQUU7VUFDOUMsT0FBTyxJQUFJLENBQUN1RyxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUM0UixjQUFjLENBQUM7UUFDckQ7UUFFQSxNQUFNQyxRQUFRLEdBQUdBLENBQUEsS0FBTTtVQUNyQnpCLGlCQUFpQixDQUFDMUIsTUFBTSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELE1BQU1vRCxPQUFPLEdBQUdBLENBQUEsS0FBTTtVQUFBLElBQUFDLGNBQUE7VUFDcEIzQixpQkFBaUIsQ0FBQzRCLEtBQUssQ0FBQyxDQUFDO1VBRXpCLENBQUFELGNBQUEsT0FBSSxDQUFDNVgsT0FBTyxjQUFBNFgsY0FBQSx1QkFBWkEsY0FBQSxDQUFjalIsSUFBSSxDQUFDLFFBQVEsRUFBRStRLFFBQVEsQ0FBQztRQUN4QyxDQUFDO1FBRUQsQ0FBQUosY0FBQSxPQUFJLENBQUN0WCxPQUFPLGNBQUFzWCxjQUFBLHVCQUFaQSxjQUFBLENBQWN4USxFQUFFLENBQUMsT0FBTyxFQUFFNlEsT0FBTyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDM1gsT0FBTyxZQUFZd1IsZ0JBQU8sSUFBSSxJQUFJLENBQUN4UixPQUFPLENBQUNzVSxNQUFNLEVBQUU7VUFDMURxRCxPQUFPLENBQUMsQ0FBQztRQUNYO1FBRUEsTUFBTXJHLFFBQVEsR0FBR0EsQ0FBQSxLQUFNO1VBQUEsSUFBQXdHLGNBQUEsRUFBQUMsY0FBQTtVQUNyQjlCLGlCQUFpQixDQUFDeFAsY0FBYyxDQUFDLEtBQUssRUFBRXVSLGNBQWMsQ0FBQztVQUV2RCxJQUFJLElBQUksQ0FBQ2hZLE9BQU8sWUFBWXdSLGdCQUFPLElBQUksSUFBSSxDQUFDeFIsT0FBTyxDQUFDc1UsTUFBTSxFQUFFO1lBQzFEO1lBQ0EsSUFBSSxDQUFDdFUsT0FBTyxDQUFDdVUsTUFBTSxDQUFDLENBQUM7VUFDdkI7VUFFQSxDQUFBdUQsY0FBQSxPQUFJLENBQUM5WCxPQUFPLGNBQUE4WCxjQUFBLHVCQUFaQSxjQUFBLENBQWNyUixjQUFjLENBQUMsT0FBTyxFQUFFa1IsT0FBTyxDQUFDO1VBQzlDLENBQUFJLGNBQUEsT0FBSSxDQUFDL1gsT0FBTyxjQUFBK1gsY0FBQSx1QkFBWkEsY0FBQSxDQUFjdFIsY0FBYyxDQUFDLFFBQVEsRUFBRWlSLFFBQVEsQ0FBQzs7VUFFaEQ7VUFDQTtVQUNBO1VBQ0E7VUFDQSxJQUFJLENBQUM5USxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUM0UixjQUFjLENBQUM7UUFDOUMsQ0FBQztRQUVELE1BQU1PLGNBQWMsR0FBR0EsQ0FBQSxLQUFNO1VBQUEsSUFBQUMsY0FBQSxFQUFBQyxjQUFBLEVBQUFDLGNBQUEsRUFBQUMsY0FBQTtVQUMzQixDQUFBSCxjQUFBLE9BQUksQ0FBQ2pZLE9BQU8sY0FBQWlZLGNBQUEsdUJBQVpBLGNBQUEsQ0FBY3hSLGNBQWMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDakcsdUJBQXVCLENBQUM7VUFDcEUsQ0FBQTBYLGNBQUEsT0FBSSxDQUFDbFksT0FBTyxjQUFBa1ksY0FBQSx1QkFBWkEsY0FBQSxDQUFjelIsY0FBYyxDQUFDLFFBQVEsRUFBRTZLLFFBQVEsQ0FBQztVQUNoRCxDQUFBNkcsY0FBQSxPQUFJLENBQUNuWSxPQUFPLGNBQUFtWSxjQUFBLHVCQUFaQSxjQUFBLENBQWMxUixjQUFjLENBQUMsT0FBTyxFQUFFa1IsT0FBTyxDQUFDO1VBQzlDLENBQUFTLGNBQUEsT0FBSSxDQUFDcFksT0FBTyxjQUFBb1ksY0FBQSx1QkFBWkEsY0FBQSxDQUFjM1IsY0FBYyxDQUFDLFFBQVEsRUFBRWlSLFFBQVEsQ0FBQztVQUVoRCxJQUFJLENBQUM5USxZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUMrTixTQUFTLENBQUM7VUFDdkMsTUFBTXlFLFVBQVUsR0FBRyxJQUFJLENBQUNyWSxPQUFrQjtVQUMxQyxJQUFJLENBQUNBLE9BQU8sR0FBR2MsU0FBUztVQUN4QixJQUFJLElBQUksQ0FBQy9CLE1BQU0sQ0FBQ2lDLE9BQU8sQ0FBQ3dELFVBQVUsR0FBRyxLQUFLLElBQUk2VCxVQUFVLENBQUN6UCxLQUFLLElBQUksSUFBSSxDQUFDeEosVUFBVSxFQUFFO1lBQ2pGLElBQUksQ0FBQ0gsYUFBYSxHQUFHLEtBQUs7VUFDNUI7VUFDQW9aLFVBQVUsQ0FBQy9QLFFBQVEsQ0FBQytQLFVBQVUsQ0FBQ3pQLEtBQUssRUFBRXlQLFVBQVUsQ0FBQ3BFLFFBQVEsRUFBRW9FLFVBQVUsQ0FBQ3JILElBQUksQ0FBQztRQUM3RSxDQUFDO1FBRURpRixpQkFBaUIsQ0FBQ3RQLElBQUksQ0FBQyxLQUFLLEVBQUVxUixjQUFjLENBQUM7UUFDN0MsQ0FBQVQsZUFBQSxPQUFJLENBQUN2WCxPQUFPLGNBQUF1WCxlQUFBLHVCQUFaQSxlQUFBLENBQWM1USxJQUFJLENBQUMsUUFBUSxFQUFFMkssUUFBUSxDQUFDO01BQ3hDLENBQUMsRUFBRSxDQUFDO0lBRU4sQ0FBQztJQUNEN0YsSUFBSSxFQUFFLFNBQUFBLENBQVM2TSxTQUFTLEVBQUU7TUFDeEIsSUFBSSxDQUFDcFEsaUJBQWlCLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0Q0RCxNQUFNLEVBQUU7TUFDTmpELFdBQVcsRUFBRSxTQUFBQSxDQUFTckMsR0FBRyxFQUFFO1FBQ3pCLE1BQU02UixVQUFVLEdBQUcsSUFBSSxDQUFDclksT0FBUTtRQUNoQyxJQUFJLENBQUNBLE9BQU8sR0FBR2MsU0FBUztRQUN4QixJQUFJLENBQUM4RixZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUN1QixLQUFLLENBQUM7UUFFbkNpUixVQUFVLENBQUMvUCxRQUFRLENBQUM5QixHQUFHLENBQUM7TUFDMUI7SUFDRjtFQUNGLENBQUM7RUFDRGlSLGNBQWMsRUFBRTtJQUNkblIsSUFBSSxFQUFFLGVBQWU7SUFDckJvRixLQUFLLEVBQUUsU0FBQUEsQ0FBQSxFQUFXO01BQ2hCLENBQUMsWUFBWTtRQUNYLElBQUkzRCxPQUFPO1FBQ1gsSUFBSTtVQUNGQSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUNsSSxTQUFTLENBQUN5VixXQUFXLENBQUMsQ0FBQztRQUM5QyxDQUFDLENBQUMsT0FBTzlPLEdBQVEsRUFBRTtVQUNqQixPQUFPLElBQUksQ0FBQ3FDLFdBQVcsQ0FBQ3JDLEdBQUcsQ0FBQztRQUM5QjtRQUVBLE1BQU1pQyxPQUFPLEdBQUcsSUFBSThQLDhCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUN2WSxPQUFRLENBQUM7UUFDOUQsTUFBTWlXLGlCQUFpQixHQUFHLElBQUksQ0FBQ3pOLHVCQUF1QixDQUFDVCxPQUFPLEVBQUVVLE9BQU8sQ0FBQztRQUV4RSxNQUFNLElBQUE5QixZQUFJLEVBQUNzUCxpQkFBaUIsRUFBRSxLQUFLLENBQUM7UUFDcEM7UUFDQTtRQUNBLElBQUl4TixPQUFPLENBQUMrUCxpQkFBaUIsRUFBRTtVQUM3QixJQUFJLENBQUN6TixnQkFBZ0IsQ0FBQyxDQUFDO1VBRXZCLE1BQU1zTixVQUFVLEdBQUcsSUFBSSxDQUFDclksT0FBUTtVQUNoQyxJQUFJLENBQUNBLE9BQU8sR0FBR2MsU0FBUztVQUN4QixJQUFJLENBQUM4RixZQUFZLENBQUMsSUFBSSxDQUFDZixLQUFLLENBQUMrTixTQUFTLENBQUM7VUFFdkMsSUFBSXlFLFVBQVUsQ0FBQ3pQLEtBQUssSUFBSXlQLFVBQVUsQ0FBQ3pQLEtBQUssWUFBWVAsb0JBQVksSUFBSWdRLFVBQVUsQ0FBQ3pQLEtBQUssQ0FBQ29ELElBQUksS0FBSyxVQUFVLEVBQUU7WUFDeEdxTSxVQUFVLENBQUMvUCxRQUFRLENBQUMrUCxVQUFVLENBQUN6UCxLQUFLLENBQUM7VUFDdkMsQ0FBQyxNQUFNO1lBQ0x5UCxVQUFVLENBQUMvUCxRQUFRLENBQUMsSUFBSUQsb0JBQVksQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7VUFDL0Q7UUFDRjtNQUVGLENBQUMsRUFBRSxDQUFDLENBQUNvQyxLQUFLLENBQUVqRSxHQUFHLElBQUs7UUFDbEJvQixPQUFPLENBQUNDLFFBQVEsQ0FBQyxNQUFNO1VBQ3JCLE1BQU1yQixHQUFHO1FBQ1gsQ0FBQyxDQUFDO01BQ0osQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNEc0YsTUFBTSxFQUFFO01BQ05qRCxXQUFXLEVBQUUsU0FBQUEsQ0FBU3JDLEdBQUcsRUFBRTtRQUN6QixNQUFNNlIsVUFBVSxHQUFHLElBQUksQ0FBQ3JZLE9BQVE7UUFDaEMsSUFBSSxDQUFDQSxPQUFPLEdBQUdjLFNBQVM7UUFFeEIsSUFBSSxDQUFDOEYsWUFBWSxDQUFDLElBQUksQ0FBQ2YsS0FBSyxDQUFDdUIsS0FBSyxDQUFDO1FBRW5DaVIsVUFBVSxDQUFDL1AsUUFBUSxDQUFDOUIsR0FBRyxDQUFDO01BQzFCO0lBQ0Y7RUFDRixDQUFDO0VBQ0RZLEtBQUssRUFBRTtJQUNMZCxJQUFJLEVBQUUsT0FBTztJQUNib0YsS0FBSyxFQUFFLFNBQUFBLENBQUEsRUFBVztNQUNoQixJQUFJLENBQUMxRCxpQkFBaUIsQ0FBQ3hKLFlBQVksQ0FBQ0MsTUFBTSxDQUFDO0lBQzdDLENBQUM7SUFDRHFOLE1BQU0sRUFBRTtNQUNON0osY0FBYyxFQUFFLFNBQUFBLENBQUEsRUFBVztRQUN6QjtNQUFBLENBQ0Q7TUFDRDhGLE9BQU8sRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDbEI7TUFBQSxDQUNEO01BQ0RjLFdBQVcsRUFBRSxTQUFBQSxDQUFBLEVBQVc7UUFDdEI7TUFBQTtJQUVKO0VBQ0Y7QUFDRixDQUFDIn0=
|