tedious 20.3.2 → 20.3.4

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.
Files changed (37) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +11 -21
  3. package/lib/connection.js +8 -1
  4. package/lib/connection.js.map +1 -1
  5. package/lib/data-types/plp-stream.d.ts +1 -1
  6. package/lib/data-types/plp-stream.js +12 -9
  7. package/lib/data-types/plp-stream.js.map +1 -1
  8. package/lib/data-types/varchar.js +9 -14
  9. package/lib/data-types/varchar.js.map +1 -1
  10. package/lib/metadata-parser.d.ts +1 -3
  11. package/lib/metadata-parser.js +1 -22
  12. package/lib/metadata-parser.js.map +1 -1
  13. package/lib/request.d.ts +4 -5
  14. package/lib/request.js +5 -6
  15. package/lib/request.js.map +1 -1
  16. package/lib/token/colmetadata-token-parser.d.ts +11 -3
  17. package/lib/token/colmetadata-token-parser.js +29 -42
  18. package/lib/token/colmetadata-token-parser.js.map +1 -1
  19. package/lib/token/nbcrow-token-parser.d.ts +11 -3
  20. package/lib/token/nbcrow-token-parser.js +22 -89
  21. package/lib/token/nbcrow-token-parser.js.map +1 -1
  22. package/lib/token/returnvalue-token-parser.d.ts +19 -3
  23. package/lib/token/returnvalue-token-parser.js +67 -73
  24. package/lib/token/returnvalue-token-parser.js.map +1 -1
  25. package/lib/token/row-token-parser.d.ts +33 -3
  26. package/lib/token/row-token-parser.js +62 -60
  27. package/lib/token/row-token-parser.js.map +1 -1
  28. package/lib/token/stream-parser.d.ts +59 -27
  29. package/lib/token/stream-parser.js +157 -325
  30. package/lib/token/stream-parser.js.map +1 -1
  31. package/lib/token/token-stream-parser.d.ts +12 -5
  32. package/lib/token/token-stream-parser.js +46 -17
  33. package/lib/token/token-stream-parser.js.map +1 -1
  34. package/lib/value-parser.d.ts +19 -2
  35. package/lib/value-parser.js +73 -30
  36. package/lib/value-parser.js.map +1 -1
  37. package/package.json +1 -1
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _token = require("./token");
8
8
  var _colinfoTokenParser = _interopRequireDefault(require("./colinfo-token-parser"));
9
- var _colmetadataTokenParser = _interopRequireDefault(require("./colmetadata-token-parser"));
9
+ var _colmetadataTokenParser = require("./colmetadata-token-parser");
10
10
  var _doneTokenParser = require("./done-token-parser");
11
11
  var _envChangeTokenParser = _interopRequireDefault(require("./env-change-token-parser"));
12
12
  var _infoerrorTokenParser = require("./infoerror-token-parser");
@@ -15,367 +15,199 @@ var _featureExtAckParser = _interopRequireDefault(require("./feature-ext-ack-par
15
15
  var _loginackTokenParser = _interopRequireDefault(require("./loginack-token-parser"));
16
16
  var _orderTokenParser = _interopRequireDefault(require("./order-token-parser"));
17
17
  var _returnstatusTokenParser = _interopRequireDefault(require("./returnstatus-token-parser"));
18
- var _returnvalueTokenParser = _interopRequireDefault(require("./returnvalue-token-parser"));
19
- var _rowTokenParser = _interopRequireDefault(require("./row-token-parser"));
20
- var _nbcrowTokenParser = _interopRequireDefault(require("./nbcrow-token-parser"));
18
+ var _returnvalueTokenParser = require("./returnvalue-token-parser");
19
+ var _rowTokenParser = require("./row-token-parser");
20
+ var _nbcrowTokenParser = require("./nbcrow-token-parser");
21
21
  var _sspiTokenParser = _interopRequireDefault(require("./sspi-token-parser"));
22
22
  var _tabnameTokenParser = _interopRequireDefault(require("./tabname-token-parser"));
23
23
  var _helpers = require("./helpers");
24
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
+ /**
26
+ * Parses a token that is short enough to simply be parsed again from its
27
+ * start if it is not fully available yet.
28
+ */
29
+
30
+ /**
31
+ * Parses a token that can grow arbitrarily large, and thus needs to be parsed
32
+ * incrementally.
33
+ *
34
+ * The reader starts parsing right after the token's type byte and keeps its
35
+ * progress across calls: if `read` throws a `NotEnoughDataError`, it is
36
+ * called again once more data has arrived.
37
+ */
38
+
39
+ /**
40
+ * A push-based parser for the tokens contained in a TDS token stream.
41
+ *
42
+ * Data is pushed into the parser as it arrives via `write`, and parsed tokens
43
+ * are pulled out via `read`. Tokens are parsed lazily, one at a time, so any
44
+ * effects of handling a token (e.g. the TDS version negotiated via the
45
+ * `LOGINACK` token) apply to the parsing of all tokens that follow it.
46
+ */
25
47
  class Parser {
26
- debug;
27
- colMetadata;
28
- options;
29
- iterator;
30
- buffer;
31
- position;
32
- static async *parseTokens(iterable, debug, options, colMetadata = []) {
33
- const parser = new Parser(iterable, debug, options);
34
- parser.colMetadata = colMetadata;
48
+ // The data that is currently being parsed, and the position of the first
49
+ // byte in it that has not been consumed yet.
50
+
51
+ // Chunks that were written, but not yet appended to `buffer`.
52
+
53
+ // The number of unconsumed bytes required for parsing to make progress.
54
+ //
55
+ // Incomplete data is not appended to `buffer` until at least this many
56
+ // bytes are available, so that a large token arriving across many chunks is
57
+ // not parsed again (and copied again) for every chunk.
58
+
59
+ // The reader of an incrementally parsed token that is not complete yet.
60
+
61
+ constructor(options, colMetadata = []) {
62
+ this.options = options;
63
+ this.colMetadata = colMetadata;
64
+ this.buffer = Buffer.alloc(0);
65
+ this.position = 0;
66
+ this.pending = [];
67
+ this.pendingLength = 0;
68
+ this.bytesNeeded = 1;
69
+ this.tokenReader = undefined;
70
+ }
71
+
72
+ /**
73
+ * Parse all tokens from the given chunks of data.
74
+ */
75
+ static async *parseTokens(iterable, options, colMetadata) {
76
+ const parser = new Parser(options, colMetadata);
77
+ for await (const chunk of iterable) {
78
+ parser.write(chunk);
79
+ let token;
80
+ while ((token = parser.read()) !== undefined) {
81
+ yield token;
82
+ }
83
+ }
84
+ parser.end();
85
+ }
86
+
87
+ /**
88
+ * Add a chunk of data to be parsed.
89
+ */
90
+ write(chunk) {
91
+ this.pending.push(chunk);
92
+ this.pendingLength += chunk.length;
93
+ }
94
+
95
+ /**
96
+ * Parse the next token, or return `undefined` if more data needs to be
97
+ * written first.
98
+ */
99
+ read() {
35
100
  while (true) {
101
+ if (this.buffer.length - this.position < this.bytesNeeded && !this.appendPending()) {
102
+ return undefined;
103
+ }
104
+ let token;
36
105
  try {
37
- await parser.waitForChunk();
106
+ token = this.tokenReader !== undefined ? this.tokenReader.read(this) : this.readToken();
38
107
  } catch (err) {
39
- if (parser.position === parser.buffer.length) {
40
- return;
108
+ if (err instanceof _helpers.NotEnoughDataError) {
109
+ // Always wait for at least one more byte, so parsing never retries
110
+ // without new data.
111
+ this.bytesNeeded = Math.max(err.byteCount, this.buffer.length + 1) - this.position;
112
+ continue;
41
113
  }
42
114
  throw err;
43
115
  }
44
- while (parser.buffer.length >= parser.position + 1) {
45
- const type = parser.buffer.readUInt8(parser.position);
46
- parser.position += 1;
47
- const token = parser.readToken(type);
48
- if (token !== undefined) {
49
- yield token;
50
- }
116
+ this.tokenReader = undefined;
117
+ this.bytesNeeded = 1;
118
+
119
+ // Some tokens (e.g. unknown `ENVCHANGE` types) are skipped.
120
+ if (token !== undefined) {
121
+ return token;
51
122
  }
52
123
  }
53
124
  }
54
- readToken(type) {
125
+
126
+ /**
127
+ * Signal that all data was written.
128
+ *
129
+ * Throws if the data ended in the middle of a token.
130
+ */
131
+ end() {
132
+ if (this.tokenReader !== undefined || this.position < this.buffer.length || this.pendingLength > 0) {
133
+ throw new Error('unexpected end of data');
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Append the pending chunks to the unconsumed data, if that makes enough
139
+ * data available for parsing to make progress.
140
+ */
141
+ appendPending() {
142
+ const remaining = this.buffer.length - this.position;
143
+ if (remaining + this.pendingLength < this.bytesNeeded) {
144
+ return false;
145
+ }
146
+ if (remaining === 0 && this.pending.length === 1) {
147
+ this.buffer = this.pending[0];
148
+ } else {
149
+ this.pending.unshift(this.buffer.subarray(this.position));
150
+ this.buffer = Buffer.concat(this.pending, remaining + this.pendingLength);
151
+ }
152
+ this.position = 0;
153
+ this.pending = [];
154
+ this.pendingLength = 0;
155
+ return true;
156
+ }
157
+ readToken() {
158
+ const type = this.buffer[this.position];
55
159
  switch (type) {
56
160
  case _token.TYPE.DONE:
57
- {
58
- return this.readDoneToken();
59
- }
161
+ return this.parseToken(_doneTokenParser.doneParser);
60
162
  case _token.TYPE.DONEPROC:
61
- {
62
- return this.readDoneProcToken();
63
- }
163
+ return this.parseToken(_doneTokenParser.doneProcParser);
64
164
  case _token.TYPE.DONEINPROC:
65
- {
66
- return this.readDoneInProcToken();
67
- }
165
+ return this.parseToken(_doneTokenParser.doneInProcParser);
68
166
  case _token.TYPE.ERROR:
69
- {
70
- return this.readErrorToken();
71
- }
167
+ return this.parseToken(_infoerrorTokenParser.errorParser);
72
168
  case _token.TYPE.INFO:
73
- {
74
- return this.readInfoToken();
75
- }
169
+ return this.parseToken(_infoerrorTokenParser.infoParser);
76
170
  case _token.TYPE.ENVCHANGE:
77
- {
78
- return this.readEnvChangeToken();
79
- }
171
+ return this.parseToken(_envChangeTokenParser.default);
80
172
  case _token.TYPE.LOGINACK:
81
- {
82
- return this.readLoginAckToken();
83
- }
173
+ return this.parseToken(_loginackTokenParser.default);
84
174
  case _token.TYPE.RETURNSTATUS:
85
- {
86
- return this.readReturnStatusToken();
87
- }
175
+ return this.parseToken(_returnstatusTokenParser.default);
88
176
  case _token.TYPE.ORDER:
89
- {
90
- return this.readOrderToken();
91
- }
177
+ return this.parseToken(_orderTokenParser.default);
92
178
  case _token.TYPE.FEDAUTHINFO:
93
- {
94
- return this.readFedAuthInfoToken();
95
- }
179
+ return this.parseToken(_fedauthInfoParser.default);
96
180
  case _token.TYPE.SSPI:
97
- {
98
- return this.readSSPIToken();
99
- }
181
+ return this.parseToken(_sspiTokenParser.default);
182
+ case _token.TYPE.FEATUREEXTACK:
183
+ return this.parseToken(_featureExtAckParser.default);
184
+ case _token.TYPE.TABNAME:
185
+ return this.parseToken(_tabnameTokenParser.default);
186
+ case _token.TYPE.COLINFO:
187
+ return this.parseToken(_colinfoTokenParser.default);
100
188
  case _token.TYPE.COLMETADATA:
101
- {
102
- return this.readColMetadataToken();
103
- }
189
+ return this.startTokenReader(new _colmetadataTokenParser.ColMetadataTokenReader());
104
190
  case _token.TYPE.RETURNVALUE:
105
- {
106
- return this.readReturnValueToken();
107
- }
191
+ return this.startTokenReader(new _returnvalueTokenParser.ReturnValueTokenReader());
108
192
  case _token.TYPE.ROW:
109
- {
110
- return this.readRowToken();
111
- }
193
+ return this.startTokenReader(new _rowTokenParser.RowTokenReader());
112
194
  case _token.TYPE.NBCROW:
113
- {
114
- return this.readNbcRowToken();
115
- }
116
- case _token.TYPE.FEATUREEXTACK:
117
- {
118
- return this.readFeatureExtAckToken();
119
- }
120
- case _token.TYPE.TABNAME:
121
- {
122
- return this.readTabNameToken();
123
- }
124
- case _token.TYPE.COLINFO:
125
- {
126
- return this.readColInfoToken();
127
- }
195
+ return this.startTokenReader(new _nbcrowTokenParser.NBCRowTokenReader());
128
196
  default:
129
- {
130
- throw new Error('Unknown type: ' + type);
131
- }
132
- }
133
- }
134
- readFeatureExtAckToken() {
135
- let result;
136
- try {
137
- result = (0, _featureExtAckParser.default)(this.buffer, this.position, this.options);
138
- } catch (err) {
139
- if (err instanceof _helpers.NotEnoughDataError) {
140
- return this.waitForChunk().then(() => {
141
- return this.readFeatureExtAckToken();
142
- });
143
- }
144
- throw err;
145
- }
146
- this.position = result.offset;
147
- return result.value;
148
- }
149
- readTabNameToken() {
150
- let result;
151
- try {
152
- result = (0, _tabnameTokenParser.default)(this.buffer, this.position, this.options);
153
- } catch (err) {
154
- if (err instanceof _helpers.NotEnoughDataError) {
155
- return this.waitForChunk().then(() => {
156
- return this.readTabNameToken();
157
- });
158
- }
159
- throw err;
160
- }
161
- this.position = result.offset;
162
- return result.value;
163
- }
164
- readColInfoToken() {
165
- let result;
166
- try {
167
- result = (0, _colinfoTokenParser.default)(this.buffer, this.position, this.options);
168
- } catch (err) {
169
- if (err instanceof _helpers.NotEnoughDataError) {
170
- return this.waitForChunk().then(() => {
171
- return this.readColInfoToken();
172
- });
173
- }
174
- throw err;
197
+ throw new Error('Unknown type: ' + type);
175
198
  }
176
- this.position = result.offset;
177
- return result.value;
178
- }
179
- async readNbcRowToken() {
180
- return await (0, _nbcrowTokenParser.default)(this);
181
- }
182
- async readReturnValueToken() {
183
- return await (0, _returnvalueTokenParser.default)(this);
184
- }
185
- async readColMetadataToken() {
186
- const token = await (0, _colmetadataTokenParser.default)(this);
187
- this.colMetadata = token.columns;
188
- return token;
189
- }
190
- readSSPIToken() {
191
- let result;
192
- try {
193
- result = (0, _sspiTokenParser.default)(this.buffer, this.position, this.options);
194
- } catch (err) {
195
- if (err instanceof _helpers.NotEnoughDataError) {
196
- return this.waitForChunk().then(() => {
197
- return this.readSSPIToken();
198
- });
199
- }
200
- throw err;
201
- }
202
- this.position = result.offset;
203
- return result.value;
204
- }
205
- readFedAuthInfoToken() {
206
- let result;
207
- try {
208
- result = (0, _fedauthInfoParser.default)(this.buffer, this.position, this.options);
209
- } catch (err) {
210
- if (err instanceof _helpers.NotEnoughDataError) {
211
- return this.waitForChunk().then(() => {
212
- return this.readFedAuthInfoToken();
213
- });
214
- }
215
- throw err;
216
- }
217
- this.position = result.offset;
218
- return result.value;
219
- }
220
- readOrderToken() {
221
- let result;
222
- try {
223
- result = (0, _orderTokenParser.default)(this.buffer, this.position, this.options);
224
- } catch (err) {
225
- if (err instanceof _helpers.NotEnoughDataError) {
226
- return this.waitForChunk().then(() => {
227
- return this.readOrderToken();
228
- });
229
- }
230
- throw err;
231
- }
232
- this.position = result.offset;
233
- return result.value;
234
199
  }
235
- readReturnStatusToken() {
236
- let result;
237
- try {
238
- result = (0, _returnstatusTokenParser.default)(this.buffer, this.position, this.options);
239
- } catch (err) {
240
- if (err instanceof _helpers.NotEnoughDataError) {
241
- return this.waitForChunk().then(() => {
242
- return this.readReturnStatusToken();
243
- });
244
- }
245
- throw err;
246
- }
200
+ parseToken(parser) {
201
+ const result = parser(this.buffer, this.position + 1, this.options);
247
202
  this.position = result.offset;
248
203
  return result.value;
249
204
  }
250
- readLoginAckToken() {
251
- let result;
252
- try {
253
- result = (0, _loginackTokenParser.default)(this.buffer, this.position, this.options);
254
- } catch (err) {
255
- if (err instanceof _helpers.NotEnoughDataError) {
256
- return this.waitForChunk().then(() => {
257
- return this.readLoginAckToken();
258
- });
259
- }
260
- throw err;
261
- }
262
- this.position = result.offset;
263
- return result.value;
264
- }
265
- readEnvChangeToken() {
266
- let result;
267
- try {
268
- result = (0, _envChangeTokenParser.default)(this.buffer, this.position, this.options);
269
- } catch (err) {
270
- if (err instanceof _helpers.NotEnoughDataError) {
271
- return this.waitForChunk().then(() => {
272
- return this.readEnvChangeToken();
273
- });
274
- }
275
- throw err;
276
- }
277
- this.position = result.offset;
278
- return result.value;
279
- }
280
- readRowToken() {
281
- return (0, _rowTokenParser.default)(this);
282
- }
283
- readInfoToken() {
284
- let result;
285
- try {
286
- result = (0, _infoerrorTokenParser.infoParser)(this.buffer, this.position, this.options);
287
- } catch (err) {
288
- if (err instanceof _helpers.NotEnoughDataError) {
289
- return this.waitForChunk().then(() => {
290
- return this.readInfoToken();
291
- });
292
- }
293
- throw err;
294
- }
295
- this.position = result.offset;
296
- return result.value;
297
- }
298
- readErrorToken() {
299
- let result;
300
- try {
301
- result = (0, _infoerrorTokenParser.errorParser)(this.buffer, this.position, this.options);
302
- } catch (err) {
303
- if (err instanceof _helpers.NotEnoughDataError) {
304
- return this.waitForChunk().then(() => {
305
- return this.readErrorToken();
306
- });
307
- }
308
- throw err;
309
- }
310
- this.position = result.offset;
311
- return result.value;
312
- }
313
- readDoneInProcToken() {
314
- let result;
315
- try {
316
- result = (0, _doneTokenParser.doneInProcParser)(this.buffer, this.position, this.options);
317
- } catch (err) {
318
- if (err instanceof _helpers.NotEnoughDataError) {
319
- return this.waitForChunk().then(() => {
320
- return this.readDoneInProcToken();
321
- });
322
- }
323
- throw err;
324
- }
325
- this.position = result.offset;
326
- return result.value;
327
- }
328
- readDoneProcToken() {
329
- let result;
330
- try {
331
- result = (0, _doneTokenParser.doneProcParser)(this.buffer, this.position, this.options);
332
- } catch (err) {
333
- if (err instanceof _helpers.NotEnoughDataError) {
334
- return this.waitForChunk().then(() => {
335
- return this.readDoneProcToken();
336
- });
337
- }
338
- throw err;
339
- }
340
- this.position = result.offset;
341
- return result.value;
342
- }
343
- readDoneToken() {
344
- let result;
345
- try {
346
- result = (0, _doneTokenParser.doneParser)(this.buffer, this.position, this.options);
347
- } catch (err) {
348
- if (err instanceof _helpers.NotEnoughDataError) {
349
- return this.waitForChunk().then(() => {
350
- return this.readDoneToken();
351
- });
352
- }
353
- throw err;
354
- }
355
- this.position = result.offset;
356
- return result.value;
357
- }
358
- constructor(iterable, debug, options) {
359
- this.debug = debug;
360
- this.colMetadata = [];
361
- this.options = options;
362
- this.iterator = (iterable[Symbol.asyncIterator] || iterable[Symbol.iterator]).call(iterable);
363
- this.buffer = Buffer.alloc(0);
364
- this.position = 0;
365
- }
366
- async waitForChunk() {
367
- const result = await this.iterator.next();
368
- if (result.done) {
369
- throw new Error('unexpected end of data');
370
- }
371
- if (this.position === this.buffer.length) {
372
- this.buffer = result.value;
373
- } else {
374
- this.buffer = Buffer.concat([this.buffer.slice(this.position), result.value]);
375
- }
376
- this.position = 0;
205
+ startTokenReader(reader) {
206
+ this.position += 1;
207
+ this.tokenReader = reader;
208
+ return reader.read(this);
377
209
  }
378
210
  }
379
211
  var _default = exports.default = Parser;
380
212
  module.exports = Parser;
381
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbGluZm9Ub2tlblBhcnNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29sbWV0YWRhdGFUb2tlblBhcnNlciIsIl9kb25lVG9rZW5QYXJzZXIiLCJfZW52Q2hhbmdlVG9rZW5QYXJzZXIiLCJfaW5mb2Vycm9yVG9rZW5QYXJzZXIiLCJfZmVkYXV0aEluZm9QYXJzZXIiLCJfZmVhdHVyZUV4dEFja1BhcnNlciIsIl9sb2dpbmFja1Rva2VuUGFyc2VyIiwiX29yZGVyVG9rZW5QYXJzZXIiLCJfcmV0dXJuc3RhdHVzVG9rZW5QYXJzZXIiLCJfcmV0dXJudmFsdWVUb2tlblBhcnNlciIsIl9yb3dUb2tlblBhcnNlciIsIl9uYmNyb3dUb2tlblBhcnNlciIsIl9zc3BpVG9rZW5QYXJzZXIiLCJfdGFibmFtZVRva2VuUGFyc2VyIiwiX2hlbHBlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZXIiLCJkZWJ1ZyIsImNvbE1ldGFkYXRhIiwib3B0aW9ucyIsIml0ZXJhdG9yIiwiYnVmZmVyIiwicG9zaXRpb24iLCJwYXJzZVRva2VucyIsIml0ZXJhYmxlIiwicGFyc2VyIiwid2FpdEZvckNodW5rIiwiZXJyIiwibGVuZ3RoIiwidHlwZSIsInJlYWRVSW50OCIsInRva2VuIiwicmVhZFRva2VuIiwidW5kZWZpbmVkIiwiVFlQRSIsIkRPTkUiLCJyZWFkRG9uZVRva2VuIiwiRE9ORVBST0MiLCJyZWFkRG9uZVByb2NUb2tlbiIsIkRPTkVJTlBST0MiLCJyZWFkRG9uZUluUHJvY1Rva2VuIiwiRVJST1IiLCJyZWFkRXJyb3JUb2tlbiIsIklORk8iLCJyZWFkSW5mb1Rva2VuIiwiRU5WQ0hBTkdFIiwicmVhZEVudkNoYW5nZVRva2VuIiwiTE9HSU5BQ0siLCJyZWFkTG9naW5BY2tUb2tlbiIsIlJFVFVSTlNUQVRVUyIsInJlYWRSZXR1cm5TdGF0dXNUb2tlbiIsIk9SREVSIiwicmVhZE9yZGVyVG9rZW4iLCJGRURBVVRISU5GTyIsInJlYWRGZWRBdXRoSW5mb1Rva2VuIiwiU1NQSSIsInJlYWRTU1BJVG9rZW4iLCJDT0xNRVRBREFUQSIsInJlYWRDb2xNZXRhZGF0YVRva2VuIiwiUkVUVVJOVkFMVUUiLCJyZWFkUmV0dXJuVmFsdWVUb2tlbiIsIlJPVyIsInJlYWRSb3dUb2tlbiIsIk5CQ1JPVyIsInJlYWROYmNSb3dUb2tlbiIsIkZFQVRVUkVFWFRBQ0siLCJyZWFkRmVhdHVyZUV4dEFja1Rva2VuIiwiVEFCTkFNRSIsInJlYWRUYWJOYW1lVG9rZW4iLCJDT0xJTkZPIiwicmVhZENvbEluZm9Ub2tlbiIsIkVycm9yIiwicmVzdWx0IiwiZmVhdHVyZUV4dEFja1BhcnNlciIsIk5vdEVub3VnaERhdGFFcnJvciIsInRoZW4iLCJvZmZzZXQiLCJ2YWx1ZSIsInRhYk5hbWVQYXJzZXIiLCJjb2xJbmZvUGFyc2VyIiwibmJjUm93UGFyc2VyIiwicmV0dXJuVmFsdWVQYXJzZXIiLCJjb2xNZXRhZGF0YVBhcnNlciIsImNvbHVtbnMiLCJzc3BpUGFyc2VyIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJvcmRlclBhcnNlciIsInJldHVyblN0YXR1c1BhcnNlciIsImxvZ2luQWNrUGFyc2VyIiwiZW52Q2hhbmdlUGFyc2VyIiwicm93UGFyc2VyIiwiaW5mb1BhcnNlciIsImVycm9yUGFyc2VyIiwiZG9uZUluUHJvY1BhcnNlciIsImRvbmVQcm9jUGFyc2VyIiwiZG9uZVBhcnNlciIsImNvbnN0cnVjdG9yIiwiU3ltYm9sIiwiYXN5bmNJdGVyYXRvciIsImNhbGwiLCJCdWZmZXIiLCJhbGxvYyIsIm5leHQiLCJkb25lIiwiY29uY2F0Iiwic2xpY2UiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGVidWcgZnJvbSAnLi4vZGVidWcnO1xuaW1wb3J0IHsgdHlwZSBJbnRlcm5hbENvbm5lY3Rpb25PcHRpb25zIH0gZnJvbSAnLi4vY29ubmVjdGlvbic7XG5cbmltcG9ydCB7IFRZUEUsIENvbEluZm9Ub2tlbiwgQ29sTWV0YWRhdGFUb2tlbiwgRG9uZVByb2NUb2tlbiwgRG9uZVRva2VuLCBEb25lSW5Qcm9jVG9rZW4sIEVycm9yTWVzc2FnZVRva2VuLCBJbmZvTWVzc2FnZVRva2VuLCBSb3dUb2tlbiwgdHlwZSBFbnZDaGFuZ2VUb2tlbiwgTG9naW5BY2tUb2tlbiwgUmV0dXJuU3RhdHVzVG9rZW4sIE9yZGVyVG9rZW4sIEZlZEF1dGhJbmZvVG9rZW4sIFNTUElUb2tlbiwgUmV0dXJuVmFsdWVUb2tlbiwgTkJDUm93VG9rZW4sIEZlYXR1cmVFeHRBY2tUb2tlbiwgVGFiTmFtZVRva2VuLCBUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgY29sSW5mb1BhcnNlciBmcm9tICcuL2NvbGluZm8tdG9rZW4tcGFyc2VyJztcbmltcG9ydCBjb2xNZXRhZGF0YVBhcnNlciwgeyB0eXBlIENvbHVtbk1ldGFkYXRhIH0gZnJvbSAnLi9jb2xtZXRhZGF0YS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgZG9uZVBhcnNlciwgZG9uZUluUHJvY1BhcnNlciwgZG9uZVByb2NQYXJzZXIgfSBmcm9tICcuL2RvbmUtdG9rZW4tcGFyc2VyJztcbmltcG9ydCBlbnZDaGFuZ2VQYXJzZXIgZnJvbSAnLi9lbnYtY2hhbmdlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBlcnJvclBhcnNlciwgaW5mb1BhcnNlciB9IGZyb20gJy4vaW5mb2Vycm9yLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgZmVkQXV0aEluZm9QYXJzZXIgZnJvbSAnLi9mZWRhdXRoLWluZm8tcGFyc2VyJztcbmltcG9ydCBmZWF0dXJlRXh0QWNrUGFyc2VyIGZyb20gJy4vZmVhdHVyZS1leHQtYWNrLXBhcnNlcic7XG5pbXBvcnQgbG9naW5BY2tQYXJzZXIgZnJvbSAnLi9sb2dpbmFjay10b2tlbi1wYXJzZXInO1xuaW1wb3J0IG9yZGVyUGFyc2VyIGZyb20gJy4vb3JkZXItdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5TdGF0dXNQYXJzZXIgZnJvbSAnLi9yZXR1cm5zdGF0dXMtdG9rZW4tcGFyc2VyJztcbmltcG9ydCByZXR1cm5WYWx1ZVBhcnNlciBmcm9tICcuL3JldHVybnZhbHVlLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgcm93UGFyc2VyIGZyb20gJy4vcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgbmJjUm93UGFyc2VyIGZyb20gJy4vbmJjcm93LXRva2VuLXBhcnNlcic7XG5pbXBvcnQgc3NwaVBhcnNlciBmcm9tICcuL3NzcGktdG9rZW4tcGFyc2VyJztcbmltcG9ydCB0YWJOYW1lUGFyc2VyIGZyb20gJy4vdGFibmFtZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgTm90RW5vdWdoRGF0YUVycm9yIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuY2xhc3MgUGFyc2VyIHtcbiAgZGVidWc6IERlYnVnO1xuICBjb2xNZXRhZGF0YTogQ29sdW1uTWV0YWRhdGFbXTtcbiAgb3B0aW9uczogUGFyc2VyT3B0aW9ucztcblxuICBpdGVyYXRvcjogQXN5bmNJdGVyYXRvcjxCdWZmZXIsIGFueSwgdW5kZWZpbmVkPiB8IEl0ZXJhdG9yPEJ1ZmZlciwgYW55LCB1bmRlZmluZWQ+O1xuICBidWZmZXI6IEJ1ZmZlcjtcbiAgcG9zaXRpb246IG51bWJlcjtcblxuICBzdGF0aWMgYXN5bmMgKnBhcnNlVG9rZW5zKGl0ZXJhYmxlOiBBc3luY0l0ZXJhYmxlPEJ1ZmZlcj4gfCBJdGVyYWJsZTxCdWZmZXI+LCBkZWJ1ZzogRGVidWcsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMsIGNvbE1ldGFkYXRhOiBDb2x1bW5NZXRhZGF0YVtdID0gW10pIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgUGFyc2VyKGl0ZXJhYmxlLCBkZWJ1Zywgb3B0aW9ucyk7XG4gICAgcGFyc2VyLmNvbE1ldGFkYXRhID0gY29sTWV0YWRhdGE7XG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgcGFyc2VyLndhaXRGb3JDaHVuaygpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGlmIChwYXJzZXIucG9zaXRpb24gPT09IHBhcnNlci5idWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuXG4gICAgICB3aGlsZSAocGFyc2VyLmJ1ZmZlci5sZW5ndGggPj0gcGFyc2VyLnBvc2l0aW9uICsgMSkge1xuICAgICAgICBjb25zdCB0eXBlID0gcGFyc2VyLmJ1ZmZlci5yZWFkVUludDgocGFyc2VyLnBvc2l0aW9uKTtcbiAgICAgICAgcGFyc2VyLnBvc2l0aW9uICs9IDE7XG5cbiAgICAgICAgY29uc3QgdG9rZW4gPSBwYXJzZXIucmVhZFRva2VuKHR5cGUpO1xuICAgICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHlpZWxkIHRva2VuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVhZFRva2VuKHR5cGU6IG51bWJlcik6IFRva2VuIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUWVBFLkRPTkU6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRE9ORVBST0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVQcm9jVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkRPTkVJTlBST0M6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVJblByb2NUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRVJST1I6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEVycm9yVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLklORk86IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEluZm9Ub2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuRU5WQ0hBTkdFOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRFbnZDaGFuZ2VUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuTE9HSU5BQ0s6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZExvZ2luQWNrVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlJFVFVSTlNUQVRVUzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkUmV0dXJuU3RhdHVzVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLk9SREVSOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRPcmRlclRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5GRURBVVRISU5GTzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmVkQXV0aEluZm9Ub2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuU1NQSToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkU1NQSVRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xNRVRBREFUQToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkQ29sTWV0YWRhdGFUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuUkVUVVJOVkFMVUU6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZFJldHVyblZhbHVlVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLlJPVzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkUm93VG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLk5CQ1JPVzoge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkTmJjUm93VG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBUWVBFLkZFQVRVUkVFWFRBQ0s6IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFeHRBY2tUb2tlbigpO1xuICAgICAgfVxuXG4gICAgICBjYXNlIFRZUEUuVEFCTkFNRToge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkVGFiTmFtZVRva2VuKCk7XG4gICAgICB9XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xJTkZPOiB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlYWRDb2xJbmZvVG9rZW4oKTtcbiAgICAgIH1cblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlYWRGZWF0dXJlRXh0QWNrVG9rZW4oKTogRmVhdHVyZUV4dEFja1Rva2VuIHwgUHJvbWlzZTxGZWF0dXJlRXh0QWNrVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZlYXR1cmVFeHRBY2tQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEZlYXR1cmVFeHRBY2tUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkVGFiTmFtZVRva2VuKCk6IFRhYk5hbWVUb2tlbiB8IFByb21pc2U8VGFiTmFtZVRva2VuPiB7XG4gICAgbGV0IHJlc3VsdDtcblxuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSB0YWJOYW1lUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRUYWJOYW1lVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZENvbEluZm9Ub2tlbigpOiBDb2xJbmZvVG9rZW4gfCBQcm9taXNlPENvbEluZm9Ub2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gY29sSW5mb1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkQ29sSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIHJlYWROYmNSb3dUb2tlbigpOiBQcm9taXNlPE5CQ1Jvd1Rva2VuPiB7XG4gICAgcmV0dXJuIGF3YWl0IG5iY1Jvd1BhcnNlcih0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRSZXR1cm5WYWx1ZVRva2VuKCk6IFByb21pc2U8UmV0dXJuVmFsdWVUb2tlbj4ge1xuICAgIHJldHVybiBhd2FpdCByZXR1cm5WYWx1ZVBhcnNlcih0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIHJlYWRDb2xNZXRhZGF0YVRva2VuKCk6IFByb21pc2U8Q29sTWV0YWRhdGFUb2tlbj4ge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgY29sTWV0YWRhdGFQYXJzZXIodGhpcyk7XG4gICAgdGhpcy5jb2xNZXRhZGF0YSA9IHRva2VuLmNvbHVtbnM7XG4gICAgcmV0dXJuIHRva2VuO1xuICB9XG5cbiAgcmVhZFNTUElUb2tlbigpOiBTU1BJVG9rZW4gfCBQcm9taXNlPFNTUElUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gc3NwaVBhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkU1NQSVRva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRGZWRBdXRoSW5mb1Rva2VuKCk6IEZlZEF1dGhJbmZvVG9rZW4gfCBQcm9taXNlPEZlZEF1dGhJbmZvVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGZlZEF1dGhJbmZvUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRGZWRBdXRoSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRPcmRlclRva2VuKCk6IE9yZGVyVG9rZW4gfCBQcm9taXNlPE9yZGVyVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IG9yZGVyUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRPcmRlclRva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRSZXR1cm5TdGF0dXNUb2tlbigpOiBSZXR1cm5TdGF0dXNUb2tlbiB8IFByb21pc2U8UmV0dXJuU3RhdHVzVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHJldHVyblN0YXR1c1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkUmV0dXJuU3RhdHVzVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZExvZ2luQWNrVG9rZW4oKTogTG9naW5BY2tUb2tlbiB8IFByb21pc2U8TG9naW5BY2tUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gbG9naW5BY2tQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZExvZ2luQWNrVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZEVudkNoYW5nZVRva2VuKCk6IEVudkNoYW5nZVRva2VuIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxFbnZDaGFuZ2VUb2tlbiB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZW52Q2hhbmdlUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWRFbnZDaGFuZ2VUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICByZWFkUm93VG9rZW4oKTogUm93VG9rZW4gfCBQcm9taXNlPFJvd1Rva2VuPiB7XG4gICAgcmV0dXJuIHJvd1BhcnNlcih0aGlzKTtcbiAgfVxuXG4gIHJlYWRJbmZvVG9rZW4oKTogSW5mb01lc3NhZ2VUb2tlbiB8IFByb21pc2U8SW5mb01lc3NhZ2VUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gaW5mb1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkSW5mb1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWRFcnJvclRva2VuKCk6IEVycm9yTWVzc2FnZVRva2VuIHwgUHJvbWlzZTxFcnJvck1lc3NhZ2VUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZXJyb3JQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZEVycm9yVG9rZW4oKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IGVycjtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gcmVzdWx0Lm9mZnNldDtcbiAgICByZXR1cm4gcmVzdWx0LnZhbHVlO1xuICB9XG5cbiAgcmVhZERvbmVJblByb2NUb2tlbigpOiBEb25lSW5Qcm9jVG9rZW4gfCBQcm9taXNlPERvbmVJblByb2NUb2tlbj4ge1xuICAgIGxldCByZXN1bHQ7XG5cbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZG9uZUluUHJvY1BhcnNlcih0aGlzLmJ1ZmZlciwgdGhpcy5wb3NpdGlvbiwgdGhpcy5vcHRpb25zKTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICByZXR1cm4gdGhpcy53YWl0Rm9yQ2h1bmsoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5yZWFkRG9uZUluUHJvY1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWREb25lUHJvY1Rva2VuKCk6IERvbmVQcm9jVG9rZW4gfCBQcm9taXNlPERvbmVQcm9jVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGRvbmVQcm9jUGFyc2VyKHRoaXMuYnVmZmVyLCB0aGlzLnBvc2l0aW9uLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgTm90RW5vdWdoRGF0YUVycm9yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhaXRGb3JDaHVuaygpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHJldHVybiB0aGlzLnJlYWREb25lUHJvY1Rva2VuKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IHJlc3VsdC5vZmZzZXQ7XG4gICAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbiAgfVxuXG4gIHJlYWREb25lVG9rZW4oKTogRG9uZVRva2VuIHwgUHJvbWlzZTxEb25lVG9rZW4+IHtcbiAgICBsZXQgcmVzdWx0O1xuXG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGRvbmVQYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24sIHRoaXMub3B0aW9ucyk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBOb3RFbm91Z2hEYXRhRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2FpdEZvckNodW5rKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMucmVhZERvbmVUb2tlbigpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cblxuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgZGVidWc6IERlYnVnLCBvcHRpb25zOiBQYXJzZXJPcHRpb25zKSB7XG4gICAgdGhpcy5kZWJ1ZyA9IGRlYnVnO1xuICAgIHRoaXMuY29sTWV0YWRhdGEgPSBbXTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgdGhpcy5pdGVyYXRvciA9ICgoaXRlcmFibGUgYXMgQXN5bmNJdGVyYWJsZTxCdWZmZXI+KVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gfHwgKGl0ZXJhYmxlIGFzIEl0ZXJhYmxlPEJ1ZmZlcj4pW1N5bWJvbC5pdGVyYXRvcl0pLmNhbGwoaXRlcmFibGUpO1xuXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cblxuICBhc3luYyB3YWl0Rm9yQ2h1bmsoKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGRhdGEnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gdGhpcy5idWZmZXIubGVuZ3RoKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHJlc3VsdC52YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvc2l0aW9uKSwgcmVzdWx0LnZhbHVlXSk7XG4gICAgfVxuXG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGFyc2VyO1xubW9kdWxlLmV4cG9ydHMgPSBQYXJzZXI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUdBLElBQUFBLE1BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLG1CQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyx1QkFBQSxHQUFBRCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLHFCQUFBLEdBQUFILHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTSxxQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sa0JBQUEsR0FBQUwsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFRLG9CQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxvQkFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsaUJBQUEsR0FBQVIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFXLHdCQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBWSx1QkFBQSxHQUFBVixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWEsZUFBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWMsa0JBQUEsR0FBQVosc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFlLGdCQUFBLEdBQUFiLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBZ0IsbUJBQUEsR0FBQWQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFpQixRQUFBLEdBQUFqQixPQUFBO0FBQStDLFNBQUFFLHVCQUFBZ0IsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FB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
213
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfdG9rZW4iLCJyZXF1aXJlIiwiX2NvbGluZm9Ub2tlblBhcnNlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29sbWV0YWRhdGFUb2tlblBhcnNlciIsIl9kb25lVG9rZW5QYXJzZXIiLCJfZW52Q2hhbmdlVG9rZW5QYXJzZXIiLCJfaW5mb2Vycm9yVG9rZW5QYXJzZXIiLCJfZmVkYXV0aEluZm9QYXJzZXIiLCJfZmVhdHVyZUV4dEFja1BhcnNlciIsIl9sb2dpbmFja1Rva2VuUGFyc2VyIiwiX29yZGVyVG9rZW5QYXJzZXIiLCJfcmV0dXJuc3RhdHVzVG9rZW5QYXJzZXIiLCJfcmV0dXJudmFsdWVUb2tlblBhcnNlciIsIl9yb3dUb2tlblBhcnNlciIsIl9uYmNyb3dUb2tlblBhcnNlciIsIl9zc3BpVG9rZW5QYXJzZXIiLCJfdGFibmFtZVRva2VuUGFyc2VyIiwiX2hlbHBlcnMiLCJlIiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJQYXJzZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb2xNZXRhZGF0YSIsImJ1ZmZlciIsIkJ1ZmZlciIsImFsbG9jIiwicG9zaXRpb24iLCJwZW5kaW5nIiwicGVuZGluZ0xlbmd0aCIsImJ5dGVzTmVlZGVkIiwidG9rZW5SZWFkZXIiLCJ1bmRlZmluZWQiLCJwYXJzZVRva2VucyIsIml0ZXJhYmxlIiwicGFyc2VyIiwiY2h1bmsiLCJ3cml0ZSIsInRva2VuIiwicmVhZCIsImVuZCIsInB1c2giLCJsZW5ndGgiLCJhcHBlbmRQZW5kaW5nIiwicmVhZFRva2VuIiwiZXJyIiwiTm90RW5vdWdoRGF0YUVycm9yIiwiTWF0aCIsIm1heCIsImJ5dGVDb3VudCIsIkVycm9yIiwicmVtYWluaW5nIiwidW5zaGlmdCIsInN1YmFycmF5IiwiY29uY2F0IiwidHlwZSIsIlRZUEUiLCJET05FIiwicGFyc2VUb2tlbiIsImRvbmVQYXJzZXIiLCJET05FUFJPQyIsImRvbmVQcm9jUGFyc2VyIiwiRE9ORUlOUFJPQyIsImRvbmVJblByb2NQYXJzZXIiLCJFUlJPUiIsImVycm9yUGFyc2VyIiwiSU5GTyIsImluZm9QYXJzZXIiLCJFTlZDSEFOR0UiLCJlbnZDaGFuZ2VQYXJzZXIiLCJMT0dJTkFDSyIsImxvZ2luQWNrUGFyc2VyIiwiUkVUVVJOU1RBVFVTIiwicmV0dXJuU3RhdHVzUGFyc2VyIiwiT1JERVIiLCJvcmRlclBhcnNlciIsIkZFREFVVEhJTkZPIiwiZmVkQXV0aEluZm9QYXJzZXIiLCJTU1BJIiwic3NwaVBhcnNlciIsIkZFQVRVUkVFWFRBQ0siLCJmZWF0dXJlRXh0QWNrUGFyc2VyIiwiVEFCTkFNRSIsInRhYk5hbWVQYXJzZXIiLCJDT0xJTkZPIiwiY29sSW5mb1BhcnNlciIsIkNPTE1FVEFEQVRBIiwic3RhcnRUb2tlblJlYWRlciIsIkNvbE1ldGFkYXRhVG9rZW5SZWFkZXIiLCJSRVRVUk5WQUxVRSIsIlJldHVyblZhbHVlVG9rZW5SZWFkZXIiLCJST1ciLCJSb3dUb2tlblJlYWRlciIsIk5CQ1JPVyIsIk5CQ1Jvd1Rva2VuUmVhZGVyIiwicmVzdWx0Iiwib2Zmc2V0IiwidmFsdWUiLCJyZWFkZXIiLCJfZGVmYXVsdCIsImV4cG9ydHMiLCJtb2R1bGUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdG9rZW4vc3RyZWFtLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEludGVybmFsQ29ubmVjdGlvbk9wdGlvbnMgfSBmcm9tICcuLi9jb25uZWN0aW9uJztcblxuaW1wb3J0IHsgVFlQRSwgdHlwZSBUb2tlbiB9IGZyb20gJy4vdG9rZW4nO1xuXG5pbXBvcnQgY29sSW5mb1BhcnNlciBmcm9tICcuL2NvbGluZm8tdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IENvbE1ldGFkYXRhVG9rZW5SZWFkZXIsIHR5cGUgQ29sdW1uTWV0YWRhdGEgfSBmcm9tICcuL2NvbG1ldGFkYXRhLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBkb25lUGFyc2VyLCBkb25lSW5Qcm9jUGFyc2VyLCBkb25lUHJvY1BhcnNlciB9IGZyb20gJy4vZG9uZS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IGVudkNoYW5nZVBhcnNlciBmcm9tICcuL2Vudi1jaGFuZ2UtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IGVycm9yUGFyc2VyLCBpbmZvUGFyc2VyIH0gZnJvbSAnLi9pbmZvZXJyb3ItdG9rZW4tcGFyc2VyJztcbmltcG9ydCBmZWRBdXRoSW5mb1BhcnNlciBmcm9tICcuL2ZlZGF1dGgtaW5mby1wYXJzZXInO1xuaW1wb3J0IGZlYXR1cmVFeHRBY2tQYXJzZXIgZnJvbSAnLi9mZWF0dXJlLWV4dC1hY2stcGFyc2VyJztcbmltcG9ydCBsb2dpbkFja1BhcnNlciBmcm9tICcuL2xvZ2luYWNrLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgb3JkZXJQYXJzZXIgZnJvbSAnLi9vcmRlci10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHJldHVyblN0YXR1c1BhcnNlciBmcm9tICcuL3JldHVybnN0YXR1cy10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHsgUmV0dXJuVmFsdWVUb2tlblJlYWRlciB9IGZyb20gJy4vcmV0dXJudmFsdWUtdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IFJvd1Rva2VuUmVhZGVyIH0gZnJvbSAnLi9yb3ctdG9rZW4tcGFyc2VyJztcbmltcG9ydCB7IE5CQ1Jvd1Rva2VuUmVhZGVyIH0gZnJvbSAnLi9uYmNyb3ctdG9rZW4tcGFyc2VyJztcbmltcG9ydCBzc3BpUGFyc2VyIGZyb20gJy4vc3NwaS10b2tlbi1wYXJzZXInO1xuaW1wb3J0IHRhYk5hbWVQYXJzZXIgZnJvbSAnLi90YWJuYW1lLXRva2VuLXBhcnNlcic7XG5pbXBvcnQgeyBOb3RFbm91Z2hEYXRhRXJyb3IsIHR5cGUgUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IHR5cGUgUGFyc2VyT3B0aW9ucyA9IFBpY2s8SW50ZXJuYWxDb25uZWN0aW9uT3B0aW9ucywgJ3VzZVVUQycgfCAnbG93ZXJDYXNlR3VpZHMnIHwgJ3Rkc1ZlcnNpb24nIHwgJ3VzZUNvbHVtbk5hbWVzJyB8ICdjb2x1bW5OYW1lUmVwbGFjZXInIHwgJ2NhbWVsQ2FzZUNvbHVtbnMnPjtcblxuLyoqXG4gKiBQYXJzZXMgYSB0b2tlbiB0aGF0IGlzIHNob3J0IGVub3VnaCB0byBzaW1wbHkgYmUgcGFyc2VkIGFnYWluIGZyb20gaXRzXG4gKiBzdGFydCBpZiBpdCBpcyBub3QgZnVsbHkgYXZhaWxhYmxlIHlldC5cbiAqL1xudHlwZSBUb2tlblBhcnNlciA9IChidWY6IEJ1ZmZlciwgb2Zmc2V0OiBudW1iZXIsIG9wdGlvbnM6IFBhcnNlck9wdGlvbnMpID0+IFJlc3VsdDxUb2tlbiB8IHVuZGVmaW5lZD47XG5cbi8qKlxuICogUGFyc2VzIGEgdG9rZW4gdGhhdCBjYW4gZ3JvdyBhcmJpdHJhcmlseSBsYXJnZSwgYW5kIHRodXMgbmVlZHMgdG8gYmUgcGFyc2VkXG4gKiBpbmNyZW1lbnRhbGx5LlxuICpcbiAqIFRoZSByZWFkZXIgc3RhcnRzIHBhcnNpbmcgcmlnaHQgYWZ0ZXIgdGhlIHRva2VuJ3MgdHlwZSBieXRlIGFuZCBrZWVwcyBpdHNcbiAqIHByb2dyZXNzIGFjcm9zcyBjYWxsczogaWYgYHJlYWRgIHRocm93cyBhIGBOb3RFbm91Z2hEYXRhRXJyb3JgLCBpdCBpc1xuICogY2FsbGVkIGFnYWluIG9uY2UgbW9yZSBkYXRhIGhhcyBhcnJpdmVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRva2VuUmVhZGVyIHtcbiAgcmVhZChwYXJzZXI6IFBhcnNlcik6IFRva2VuO1xufVxuXG4vKipcbiAqIEEgcHVzaC1iYXNlZCBwYXJzZXIgZm9yIHRoZSB0b2tlbnMgY29udGFpbmVkIGluIGEgVERTIHRva2VuIHN0cmVhbS5cbiAqXG4gKiBEYXRhIGlzIHB1c2hlZCBpbnRvIHRoZSBwYXJzZXIgYXMgaXQgYXJyaXZlcyB2aWEgYHdyaXRlYCwgYW5kIHBhcnNlZCB0b2tlbnNcbiAqIGFyZSBwdWxsZWQgb3V0IHZpYSBgcmVhZGAuIFRva2VucyBhcmUgcGFyc2VkIGxhemlseSwgb25lIGF0IGEgdGltZSwgc28gYW55XG4gKiBlZmZlY3RzIG9mIGhhbmRsaW5nIGEgdG9rZW4gKGUuZy4gdGhlIFREUyB2ZXJzaW9uIG5lZ290aWF0ZWQgdmlhIHRoZVxuICogYExPR0lOQUNLYCB0b2tlbikgYXBwbHkgdG8gdGhlIHBhcnNpbmcgb2YgYWxsIHRva2VucyB0aGF0IGZvbGxvdyBpdC5cbiAqL1xuY2xhc3MgUGFyc2VyIHtcbiAgZGVjbGFyZSBvcHRpb25zOiBQYXJzZXJPcHRpb25zO1xuICBkZWNsYXJlIGNvbE1ldGFkYXRhOiBDb2x1bW5NZXRhZGF0YVtdO1xuXG4gIC8vIFRoZSBkYXRhIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIHBhcnNlZCwgYW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3RcbiAgLy8gYnl0ZSBpbiBpdCB0aGF0IGhhcyBub3QgYmVlbiBjb25zdW1lZCB5ZXQuXG4gIGRlY2xhcmUgYnVmZmVyOiBCdWZmZXI7XG4gIGRlY2xhcmUgcG9zaXRpb246IG51bWJlcjtcblxuICAvLyBDaHVua3MgdGhhdCB3ZXJlIHdyaXR0ZW4sIGJ1dCBub3QgeWV0IGFwcGVuZGVkIHRvIGBidWZmZXJgLlxuICBkZWNsYXJlIHBlbmRpbmc6IEJ1ZmZlcltdO1xuICBkZWNsYXJlIHBlbmRpbmdMZW5ndGg6IG51bWJlcjtcblxuICAvLyBUaGUgbnVtYmVyIG9mIHVuY29uc3VtZWQgYnl0ZXMgcmVxdWlyZWQgZm9yIHBhcnNpbmcgdG8gbWFrZSBwcm9ncmVzcy5cbiAgLy9cbiAgLy8gSW5jb21wbGV0ZSBkYXRhIGlzIG5vdCBhcHBlbmRlZCB0byBgYnVmZmVyYCB1bnRpbCBhdCBsZWFzdCB0aGlzIG1hbnlcbiAgLy8gYnl0ZXMgYXJlIGF2YWlsYWJsZSwgc28gdGhhdCBhIGxhcmdlIHRva2VuIGFycml2aW5nIGFjcm9zcyBtYW55IGNodW5rcyBpc1xuICAvLyBub3QgcGFyc2VkIGFnYWluIChhbmQgY29waWVkIGFnYWluKSBmb3IgZXZlcnkgY2h1bmsuXG4gIGRlY2xhcmUgYnl0ZXNOZWVkZWQ6IG51bWJlcjtcblxuICAvLyBUaGUgcmVhZGVyIG9mIGFuIGluY3JlbWVudGFsbHkgcGFyc2VkIHRva2VuIHRoYXQgaXMgbm90IGNvbXBsZXRlIHlldC5cbiAgZGVjbGFyZSB0b2tlblJlYWRlcjogVG9rZW5SZWFkZXIgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogUGFyc2VyT3B0aW9ucywgY29sTWV0YWRhdGE6IENvbHVtbk1ldGFkYXRhW10gPSBbXSkge1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgdGhpcy5jb2xNZXRhZGF0YSA9IGNvbE1ldGFkYXRhO1xuXG4gICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5wb3NpdGlvbiA9IDA7XG5cbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggPSAwO1xuXG4gICAgdGhpcy5ieXRlc05lZWRlZCA9IDE7XG4gICAgdGhpcy50b2tlblJlYWRlciA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBhbGwgdG9rZW5zIGZyb20gdGhlIGdpdmVuIGNodW5rcyBvZiBkYXRhLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jICpwYXJzZVRva2VucyhpdGVyYWJsZTogQXN5bmNJdGVyYWJsZTxCdWZmZXI+IHwgSXRlcmFibGU8QnVmZmVyPiwgb3B0aW9uczogUGFyc2VyT3B0aW9ucywgY29sTWV0YWRhdGE/OiBDb2x1bW5NZXRhZGF0YVtdKTogQXN5bmNHZW5lcmF0b3I8VG9rZW4sIHZvaWQsIHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcnNlciA9IG5ldyBQYXJzZXIob3B0aW9ucywgY29sTWV0YWRhdGEpO1xuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjaHVuayBvZiBpdGVyYWJsZSkge1xuICAgICAgcGFyc2VyLndyaXRlKGNodW5rKTtcblxuICAgICAgbGV0IHRva2VuO1xuICAgICAgd2hpbGUgKCh0b2tlbiA9IHBhcnNlci5yZWFkKCkpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgeWllbGQgdG9rZW47XG4gICAgICB9XG4gICAgfVxuXG4gICAgcGFyc2VyLmVuZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNodW5rIG9mIGRhdGEgdG8gYmUgcGFyc2VkLlxuICAgKi9cbiAgd3JpdGUoY2h1bms6IEJ1ZmZlcikge1xuICAgIHRoaXMucGVuZGluZy5wdXNoKGNodW5rKTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggKz0gY2h1bmsubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlIHRoZSBuZXh0IHRva2VuLCBvciByZXR1cm4gYHVuZGVmaW5lZGAgaWYgbW9yZSBkYXRhIG5lZWRzIHRvIGJlXG4gICAqIHdyaXR0ZW4gZmlyc3QuXG4gICAqL1xuICByZWFkKCk6IFRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCAtIHRoaXMucG9zaXRpb24gPCB0aGlzLmJ5dGVzTmVlZGVkICYmICF0aGlzLmFwcGVuZFBlbmRpbmcoKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBsZXQgdG9rZW47XG4gICAgICB0cnkge1xuICAgICAgICB0b2tlbiA9IHRoaXMudG9rZW5SZWFkZXIgIT09IHVuZGVmaW5lZCA/IHRoaXMudG9rZW5SZWFkZXIucmVhZCh0aGlzKSA6IHRoaXMucmVhZFRva2VuKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIE5vdEVub3VnaERhdGFFcnJvcikge1xuICAgICAgICAgIC8vIEFsd2F5cyB3YWl0IGZvciBhdCBsZWFzdCBvbmUgbW9yZSBieXRlLCBzbyBwYXJzaW5nIG5ldmVyIHJldHJpZXNcbiAgICAgICAgICAvLyB3aXRob3V0IG5ldyBkYXRhLlxuICAgICAgICAgIHRoaXMuYnl0ZXNOZWVkZWQgPSBNYXRoLm1heChlcnIuYnl0ZUNvdW50LCB0aGlzLmJ1ZmZlci5sZW5ndGggKyAxKSAtIHRoaXMucG9zaXRpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudG9rZW5SZWFkZXIgPSB1bmRlZmluZWQ7XG4gICAgICB0aGlzLmJ5dGVzTmVlZGVkID0gMTtcblxuICAgICAgLy8gU29tZSB0b2tlbnMgKGUuZy4gdW5rbm93biBgRU5WQ0hBTkdFYCB0eXBlcykgYXJlIHNraXBwZWQuXG4gICAgICBpZiAodG9rZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNpZ25hbCB0aGF0IGFsbCBkYXRhIHdhcyB3cml0dGVuLlxuICAgKlxuICAgKiBUaHJvd3MgaWYgdGhlIGRhdGEgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHRva2VuLlxuICAgKi9cbiAgZW5kKCkge1xuICAgIGlmICh0aGlzLnRva2VuUmVhZGVyICE9PSB1bmRlZmluZWQgfHwgdGhpcy5wb3NpdGlvbiA8IHRoaXMuYnVmZmVyLmxlbmd0aCB8fCB0aGlzLnBlbmRpbmdMZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuZXhwZWN0ZWQgZW5kIG9mIGRhdGEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kIHRoZSBwZW5kaW5nIGNodW5rcyB0byB0aGUgdW5jb25zdW1lZCBkYXRhLCBpZiB0aGF0IG1ha2VzIGVub3VnaFxuICAgKiBkYXRhIGF2YWlsYWJsZSBmb3IgcGFyc2luZyB0byBtYWtlIHByb2dyZXNzLlxuICAgKi9cbiAgYXBwZW5kUGVuZGluZygpOiBib29sZWFuIHtcbiAgICBjb25zdCByZW1haW5pbmcgPSB0aGlzLmJ1ZmZlci5sZW5ndGggLSB0aGlzLnBvc2l0aW9uO1xuICAgIGlmIChyZW1haW5pbmcgKyB0aGlzLnBlbmRpbmdMZW5ndGggPCB0aGlzLmJ5dGVzTmVlZGVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHJlbWFpbmluZyA9PT0gMCAmJiB0aGlzLnBlbmRpbmcubGVuZ3RoID09PSAxKSB7XG4gICAgICB0aGlzLmJ1ZmZlciA9IHRoaXMucGVuZGluZ1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wZW5kaW5nLnVuc2hpZnQodGhpcy5idWZmZXIuc3ViYXJyYXkodGhpcy5wb3NpdGlvbikpO1xuICAgICAgdGhpcy5idWZmZXIgPSBCdWZmZXIuY29uY2F0KHRoaXMucGVuZGluZywgcmVtYWluaW5nICsgdGhpcy5wZW5kaW5nTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gMDtcbiAgICB0aGlzLnBlbmRpbmcgPSBbXTtcbiAgICB0aGlzLnBlbmRpbmdMZW5ndGggPSAwO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZWFkVG9rZW4oKTogVG9rZW4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmJ1ZmZlclt0aGlzLnBvc2l0aW9uXTtcblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBUWVBFLkRPTkU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4oZG9uZVBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5ET05FUFJPQzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihkb25lUHJvY1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5ET05FSU5QUk9DOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKGRvbmVJblByb2NQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuRVJST1I6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4oZXJyb3JQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuSU5GTzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihpbmZvUGFyc2VyKTtcblxuICAgICAgY2FzZSBUWVBFLkVOVkNIQU5HRTpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihlbnZDaGFuZ2VQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuTE9HSU5BQ0s6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4obG9naW5BY2tQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuUkVUVVJOU1RBVFVTOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKHJldHVyblN0YXR1c1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5PUkRFUjpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihvcmRlclBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5GRURBVVRISU5GTzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihmZWRBdXRoSW5mb1BhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5TU1BJOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKHNzcGlQYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuRkVBVFVSRUVYVEFDSzpcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VUb2tlbihmZWF0dXJlRXh0QWNrUGFyc2VyKTtcblxuICAgICAgY2FzZSBUWVBFLlRBQk5BTUU6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlVG9rZW4odGFiTmFtZVBhcnNlcik7XG5cbiAgICAgIGNhc2UgVFlQRS5DT0xJTkZPOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZVRva2VuKGNvbEluZm9QYXJzZXIpO1xuXG4gICAgICBjYXNlIFRZUEUuQ09MTUVUQURBVEE6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9rZW5SZWFkZXIobmV3IENvbE1ldGFkYXRhVG9rZW5SZWFkZXIoKSk7XG5cbiAgICAgIGNhc2UgVFlQRS5SRVRVUk5WQUxVRTpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb2tlblJlYWRlcihuZXcgUmV0dXJuVmFsdWVUb2tlblJlYWRlcigpKTtcblxuICAgICAgY2FzZSBUWVBFLlJPVzpcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnRUb2tlblJlYWRlcihuZXcgUm93VG9rZW5SZWFkZXIoKSk7XG5cbiAgICAgIGNhc2UgVFlQRS5OQkNST1c6XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXJ0VG9rZW5SZWFkZXIobmV3IE5CQ1Jvd1Rva2VuUmVhZGVyKCkpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gdHlwZTogJyArIHR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlVG9rZW4ocGFyc2VyOiBUb2tlblBhcnNlcik6IFRva2VuIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZXN1bHQgPSBwYXJzZXIodGhpcy5idWZmZXIsIHRoaXMucG9zaXRpb24gKyAxLCB0aGlzLm9wdGlvbnMpO1xuICAgIHRoaXMucG9zaXRpb24gPSByZXN1bHQub2Zmc2V0O1xuICAgIHJldHVybiByZXN1bHQudmFsdWU7XG4gIH1cblxuICBzdGFydFRva2VuUmVhZGVyKHJlYWRlcjogVG9rZW5SZWFkZXIpOiBUb2tlbiB7XG4gICAgdGhpcy5wb3NpdGlvbiArPSAxO1xuICAgIHRoaXMudG9rZW5SZWFkZXIgPSByZWFkZXI7XG4gICAgcmV0dXJuIHJlYWRlci5yZWFkKHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnNlcjtcbm1vZHVsZS5leHBvcnRzID0gUGFyc2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFFQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxtQkFBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsdUJBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxxQkFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0scUJBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGtCQUFBLEdBQUFMLHNC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