@nlabs/reaktor 0.2.3 → 0.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.
Files changed (52) hide show
  1. package/lib/config.js +12 -4
  2. package/lib/data/conversations.d.ts +3 -1
  3. package/lib/data/conversations.js +150 -65
  4. package/lib/data/dynamodb.d.ts +8 -8
  5. package/lib/data/dynamodb.js +65 -33
  6. package/lib/data/email.d.ts +2 -2
  7. package/lib/data/email.js +52 -24
  8. package/lib/data/files.js +71 -11
  9. package/lib/data/groups.js +37 -3
  10. package/lib/data/images.d.ts +3 -2
  11. package/lib/data/images.js +425 -273
  12. package/lib/data/index.d.ts +1 -0
  13. package/lib/data/index.js +33 -1
  14. package/lib/data/ios.d.ts +5 -5
  15. package/lib/data/ios.js +47 -21
  16. package/lib/data/locations.js +28 -4
  17. package/lib/data/messages.js +89 -73
  18. package/lib/data/notifications.d.ts +2 -2
  19. package/lib/data/notifications.js +6 -6
  20. package/lib/data/payments.d.ts +3 -4
  21. package/lib/data/payments.js +228 -257
  22. package/lib/data/posts.d.ts +1 -1
  23. package/lib/data/posts.js +88 -12
  24. package/lib/data/reactions.d.ts +1 -1
  25. package/lib/data/reactions.js +56 -14
  26. package/lib/data/s3.d.ts +6 -6
  27. package/lib/data/s3.js +10 -2
  28. package/lib/data/search.js +46 -4
  29. package/lib/data/sms.js +5 -1
  30. package/lib/data/subscription.d.ts +1 -1
  31. package/lib/data/subscription.js +46 -20
  32. package/lib/data/tags.js +60 -8
  33. package/lib/data/users.d.ts +7 -4
  34. package/lib/data/users.js +83 -32
  35. package/lib/data/websockets.d.ts +6 -0
  36. package/lib/data/websockets.js +250 -0
  37. package/lib/index.js +4 -1
  38. package/lib/types/conversations.d.ts +2 -0
  39. package/lib/types/index.js +18 -1
  40. package/lib/types/payments.d.ts +1 -0
  41. package/lib/types/posts.d.ts +2 -0
  42. package/lib/types/reactions.d.ts +2 -0
  43. package/lib/types/users.d.ts +1 -0
  44. package/lib/utils/analytics.js +28 -6
  45. package/lib/utils/arangodb.d.ts +2 -1
  46. package/lib/utils/arangodb.js +31 -10
  47. package/lib/utils/auth.js +21 -3
  48. package/lib/utils/graphql.js +3 -1
  49. package/lib/utils/index.js +7 -1
  50. package/lib/utils/objects.js +9 -1
  51. package/lib/utils/redis.js +6 -2
  52. package/package.json +33 -31
@@ -1,9 +1,49 @@
1
1
  "use strict";
2
2
 
3
+ require("core-js/modules/es.symbol");
4
+
5
+ require("core-js/modules/es.symbol.description");
6
+
7
+ require("core-js/modules/es.array.filter");
8
+
9
+ require("core-js/modules/es.array.for-each");
10
+
11
+ require("core-js/modules/es.array.iterator");
12
+
13
+ require("core-js/modules/es.array.map");
14
+
15
+ require("core-js/modules/es.array.slice");
16
+
17
+ require("core-js/modules/es.date.now");
18
+
19
+ require("core-js/modules/es.date.to-string");
20
+
21
+ require("core-js/modules/es.object.define-properties");
22
+
23
+ require("core-js/modules/es.object.define-property");
24
+
25
+ require("core-js/modules/es.object.freeze");
26
+
27
+ require("core-js/modules/es.object.get-own-property-descriptor");
28
+
29
+ require("core-js/modules/es.object.get-own-property-descriptors");
30
+
31
+ require("core-js/modules/es.object.keys");
32
+
33
+ require("core-js/modules/es.object.to-string");
34
+
35
+ require("core-js/modules/es.promise");
36
+
37
+ require("core-js/modules/es.string.iterator");
38
+
39
+ require("core-js/modules/web.dom-collections.for-each");
40
+
41
+ require("core-js/modules/web.dom-collections.iterator");
42
+
3
43
  Object.defineProperty(exports, "__esModule", {
4
44
  value: true
5
45
  });
6
- exports.createPaymentHold = exports.createPaymentTransfer = exports.deletePaymentAccountBank = exports.deleteCreditCard = exports.getCreditCards = exports.updateCreditCard = exports.addCreditCard = exports.addPaymentAccountCard = exports.addPaymentAccountBank = exports.addCustomerAccount = void 0;
46
+ exports.createPaymentHold = exports.createPaymentTransfer = exports.deleteBankAccount = exports.deleteCreditCard = exports.getCreditCards = exports.updateCreditCard = exports.addCreditCard = exports.addBankAccount = exports.addCustomerAccount = void 0;
7
47
 
8
48
  var _utils = require("@nlabs/utils");
9
49
 
@@ -13,9 +53,7 @@ var _graphqlErrors = require("graphql-errors");
13
53
 
14
54
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
15
55
 
16
- var _luxon = require("luxon");
17
-
18
- var stripe = _interopRequireWildcard(require("stripe"));
56
+ var _stripe = _interopRequireDefault(require("stripe"));
19
57
 
20
58
  var _config = require("../config");
21
59
 
@@ -25,22 +63,10 @@ var _arangodb = require("../utils/arangodb");
25
63
 
26
64
  var _users = require("./users");
27
65
 
28
- function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj["default"] = obj; return newObj; } }
29
-
30
66
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
31
67
 
32
- function _templateObject11() {
33
- var data = _taggedTemplateLiteral(["INSERT ", " IN payments RETURN NEW"]);
34
-
35
- _templateObject11 = function _templateObject11() {
36
- return data;
37
- };
38
-
39
- return data;
40
- }
41
-
42
68
  function _templateObject10() {
43
- var data = _taggedTemplateLiteral(["INSERT ", " IN transfers RETURN NEW"]);
69
+ var data = _taggedTemplateLiteral(["INSERT ", " IN payments RETURN NEW"]);
44
70
 
45
71
  _templateObject10 = function _templateObject10() {
46
72
  return data;
@@ -50,7 +76,7 @@ function _templateObject10() {
50
76
  }
51
77
 
52
78
  function _templateObject9() {
53
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
79
+ var data = _taggedTemplateLiteral(["INSERT ", " IN transfers RETURN NEW"]);
54
80
 
55
81
  _templateObject9 = function _templateObject9() {
56
82
  return data;
@@ -60,7 +86,7 @@ function _templateObject9() {
60
86
  }
61
87
 
62
88
  function _templateObject8() {
63
- var data = _taggedTemplateLiteral(["REMOVE {_key:", "} IN hasPayment"]);
89
+ var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
64
90
 
65
91
  _templateObject8 = function _templateObject8() {
66
92
  return data;
@@ -70,7 +96,7 @@ function _templateObject8() {
70
96
  }
71
97
 
72
98
  function _templateObject7() {
73
- var data = _taggedTemplateLiteral(["\n LET card = FIRST(\n FOR c IN creditCards\n FILTER c._key == ", " && c.userId == ", "\n LIMIT 1\n REMOVE c IN creditCards\n RETURN OLD\n )\n LET user = FIRST(\n FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n RETURN u\n )\n RETURN {user: user, card: card}"]);
99
+ var data = _taggedTemplateLiteral(["REMOVE {_key:", "} IN hasPayment"]);
74
100
 
75
101
  _templateObject7 = function _templateObject7() {
76
102
  return data;
@@ -80,7 +106,7 @@ function _templateObject7() {
80
106
  }
81
107
 
82
108
  function _templateObject6() {
83
- var data = _taggedTemplateLiteral(["FOR c IN creditCards\n FILTER c.userId == ", "\n RETURN c"]);
109
+ var data = _taggedTemplateLiteral(["\n LET card = FIRST(\n FOR c IN creditCards\n FILTER c._key == ", " && c.userId == ", "\n LIMIT 1\n REMOVE c IN creditCards\n RETURN OLD\n )\n LET user = FIRST(\n FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n RETURN u\n )\n RETURN {user: user, card: card}"]);
84
110
 
85
111
  _templateObject6 = function _templateObject6() {
86
112
  return data;
@@ -90,7 +116,7 @@ function _templateObject6() {
90
116
  }
91
117
 
92
118
  function _templateObject5() {
93
- var data = _taggedTemplateLiteral(["\n LET updatedCard = FIRST(\n FOR c IN creditCards\n FILTER c._key == ", " && c.userId == ", "\n UPDATE c WITH ", " IN creditCards\n LIMIT 1\n RETURN NEW\n )\n LET user = FIRST(\n FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n RETURN u\n )\n RETURN {user: user, card: updatedCard}"]);
119
+ var data = _taggedTemplateLiteral(["FOR c IN creditCards\n FILTER c.userId == ", "\n RETURN c"]);
94
120
 
95
121
  _templateObject5 = function _templateObject5() {
96
122
  return data;
@@ -100,7 +126,7 @@ function _templateObject5() {
100
126
  }
101
127
 
102
128
  function _templateObject4() {
103
- var data = _taggedTemplateLiteral(["INSERT ", " IN creditCards RETURN NEW"]);
129
+ var data = _taggedTemplateLiteral(["\n LET updatedCard = FIRST(\n FOR c IN creditCards\n FILTER c._key == ", " && c.userId == ", "\n UPDATE c WITH ", " IN creditCards\n LIMIT 1\n RETURN NEW\n )\n LET user = FIRST(\n FOR u IN users\n FILTER u._key == ", "\n LIMIT 1\n RETURN u\n )\n RETURN {user: user, card: updatedCard}"]);
104
130
 
105
131
  _templateObject4 = function _templateObject4() {
106
132
  return data;
@@ -109,14 +135,8 @@ function _templateObject4() {
109
135
  return data;
110
136
  }
111
137
 
112
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
113
-
114
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
115
-
116
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
117
-
118
138
  function _templateObject3() {
119
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
139
+ var data = _taggedTemplateLiteral(["INSERT ", " IN creditCards RETURN NEW"]);
120
140
 
121
141
  _templateObject3 = function _templateObject3() {
122
142
  return data;
@@ -125,6 +145,12 @@ function _templateObject3() {
125
145
  return data;
126
146
  }
127
147
 
148
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
149
+
150
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
151
+
152
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
153
+
128
154
  function _templateObject2() {
129
155
  var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
130
156
 
@@ -147,11 +173,8 @@ function _templateObject() {
147
173
 
148
174
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
149
175
 
150
- /**
151
- * Copyright (c) 2019-Present, Nitrogen Labs, Inc.
152
- * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
153
- */
154
176
  var eventCategory = 'payments';
177
+ var apiVersion = '2020-03-02';
155
178
 
156
179
  var addCustomerAccount = function addCustomerAccount(context) {
157
180
  var action = 'addCustomerAccount';
@@ -159,7 +182,10 @@ var addCustomerAccount = function addCustomerAccount(context) {
159
182
  sessionId = context.userId,
160
183
  username = context.username; // Stripe
161
184
 
162
- var stripeClient = stripe(_config.Config.get('stripe.token'));
185
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
186
+ apiVersion: apiVersion,
187
+ typescript: true
188
+ });
163
189
  return stripeClient.customers.create({
164
190
  metadata: {
165
191
  userId: sessionId,
@@ -192,7 +218,7 @@ var addCustomerAccount = function addCustomerAccount(context) {
192
218
 
193
219
  exports.addCustomerAccount = addCustomerAccount;
194
220
 
195
- var addPaymentAccountBank = function addPaymentAccountBank(context, bankAccount) {
221
+ var addBankAccount = function addBankAccount(context, bankAccount) {
196
222
  var action = 'addPaymentAccountBank';
197
223
  var database = context.database,
198
224
  sessionId = context.userId; // Params
@@ -219,24 +245,32 @@ var addPaymentAccountBank = function addPaymentAccountBank(context, bankAccount)
219
245
  }
220
246
 
221
247
  return (0, _users.getUser)(context, sessionId).then(function (user) {
222
- // Stripe
223
- var stripeClient = stripe(_config.Config.get('stripe.token'));
224
- return stripeClient.customers.createSource(user.stripeAccountId, {
225
- source: {
226
- account_holder_name: formatFullName,
227
- account_holder_type: 'individual',
228
- account_number: formatAccount,
229
- country: 'US',
230
- currency: 'USD',
231
- object: 'bank_account',
232
- routing_number: formatRouting
233
- }
248
+ var stripeAccountId = user.stripeAccountId; // Stripe
249
+
250
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
251
+ apiVersion: apiVersion,
252
+ typescript: true
253
+ });
254
+ var source = {
255
+ account_holder_name: formatFullName,
256
+ account_holder_type: 'individual',
257
+ account_number: formatAccount,
258
+ country: 'US',
259
+ currency: 'USD',
260
+ object: 'bank_account',
261
+ routing_number: formatRouting
262
+ };
263
+ return stripeClient.customers.createSource(stripeAccountId, {
264
+ source: source
234
265
  }).then(function (account) {
266
+ var bankId = account.id,
267
+ bankAccount = account.last4,
268
+ bankRouting = account.routing_number;
235
269
  var update = {
236
- bankAccount: account.last4,
270
+ bankAccount: bankAccount,
237
271
  bankFullName: formatFullName,
238
- bankId: account.id,
239
- bankRouting: account.routing_number,
272
+ bankId: bankId,
273
+ bankRouting: bankRouting,
240
274
  modified: Date.now()
241
275
  };
242
276
  var aqlQry = (0, _arangojs.aql)(_templateObject2(), sessionId, update);
@@ -270,218 +304,131 @@ var addPaymentAccountBank = function addPaymentAccountBank(context, bankAccount)
270
304
  });
271
305
  };
272
306
 
273
- exports.addPaymentAccountBank = addPaymentAccountBank;
307
+ exports.addBankAccount = addBankAccount;
274
308
 
275
- var addPaymentAccountCard = function addPaymentAccountCard(context, card, requestData) {
276
- var action = 'addPaymentAccountCard';
309
+ var addCreditCard = function addCreditCard(context, card) {
310
+ var action = 'addCreditCard';
277
311
  var database = context.database,
278
312
  sessionId = context.userId;
279
313
  return (0, _users.getUser)(context, sessionId).then(function (user) {
280
314
  // User
281
- var userKey = user._key,
282
- _user$country = user.country,
283
- country = _user$country === void 0 ? 'US' : _user$country,
284
- city = user.city,
285
- _user$currency = user.currency,
286
- currency = _user$currency === void 0 ? 'USD' : _user$currency,
287
- dob = user.dob,
288
- email = user.email,
289
- first = user.first,
290
- last = user.last,
291
- username = user.username; // Birthday
292
-
293
- var dobDay = +_luxon.DateTime.fromMillis(dob).toFormat('d');
294
- var dobMonth = +_luxon.DateTime.fromMillis(dob).toFormat('M');
295
- var dobYear = +_luxon.DateTime.fromMillis(dob).toFormat('y'); // Card
315
+ var stripeAccountId = user.stripeAccountId; // Card
296
316
 
297
317
  var accountNumber = card.accountNumber,
298
- acceptedTerms = card.acceptedTerms,
318
+ city = card.city,
319
+ country = card.country,
320
+ cvc = card.cvc,
299
321
  expMonth = card.expMonth,
300
322
  expYear = card.expYear,
301
- state = card.state,
323
+ fullName = card.fullName,
302
324
  street1 = card.street1,
303
- zip = card.zip; // Acceptance
304
-
305
- var accepted = acceptedTerms ? _luxon.DateTime.local().millisecond : 0; // Stripe
306
-
307
- var stripeClient = stripe(_config.Config.get('stripe.token'));
308
- return stripeClient.accounts.create({
309
- country: country,
310
- email: email,
311
- external_account: {
312
- currency: currency,
313
- exp_month: expMonth,
314
- exp_year: expYear,
315
- number: accountNumber,
316
- object: 'card'
317
- },
318
- legal_entity: {
319
- address: {
320
- city: city,
321
- line1: street1,
322
- postal_code: zip,
323
- state: state
324
- },
325
- dob: {
326
- day: dobDay,
327
- month: dobMonth,
328
- year: dobYear
329
- },
330
- first_name: first,
331
- last_name: last,
332
- // ssn_last_4: ssn.substr(-4),
333
- // personal_id_number: ssn,
334
- type: 'individual'
335
- },
336
- managed: true,
337
- metadata: {
338
- userId: userKey,
339
- username: username
340
- },
341
- tos_acceptance: {
342
- date: accepted,
343
- ip: requestData.ip,
344
- user_agent: requestData.userAgent.source
345
- }
346
- }).then(function (customer) {
347
- // Create session
348
- var now = Date.now();
349
- var update = {
350
- modified: now,
351
- stripeAccountId: customer.id
352
- };
353
- var aqlQry = (0, _arangojs.aql)(_templateObject3(), userKey, update);
354
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
355
- return cursor.next();
356
- }).then(function () {
357
- var updatedUser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
358
- return !(0, _isEmpty["default"])(updatedUser);
359
- })["catch"](function (error) {
360
- return (0, _analytics.logError)({
361
- action: action,
362
- category: eventCategory,
363
- label: 'db_error'
364
- }, error, context).then(function () {
365
- return null;
366
- });
367
- });
368
- });
369
- });
370
- };
325
+ street2 = card.street2,
326
+ state = card.state,
327
+ zip = card.zip;
328
+ var formatNumber = (0, _utils.parseNum)(accountNumber, 16);
371
329
 
372
- exports.addPaymentAccountCard = addPaymentAccountCard;
330
+ if (!formatNumber) {
331
+ throw new _graphqlErrors.UserError('required_credit_card_number');
332
+ }
373
333
 
374
- var addCreditCard = function addCreditCard(context, card) {
375
- var action = 'addCreditCard';
376
- var database = context.database,
377
- sessionId = context.userId;
378
- var accountNumber = card.accountNumber,
379
- city = card.city,
380
- country = card.country,
381
- cvc = card.cvc,
382
- expMonth = card.expMonth,
383
- expYear = card.expYear,
384
- fullName = card.fullName,
385
- street1 = card.street1,
386
- state = card.state,
387
- zip = card.zip;
388
- var formatNumber = (0, _utils.parseNum)(accountNumber, 16);
334
+ var formatExpMonth = (0, _utils.parseNum)(expMonth, 2);
389
335
 
390
- if (!formatNumber) {
391
- throw new _graphqlErrors.UserError('required_credit_card_number');
392
- }
336
+ if (!formatExpMonth) {
337
+ throw new _graphqlErrors.UserError('required_credit_card_exp_month');
338
+ }
393
339
 
394
- var formatExpMonth = (0, _utils.parseNum)(expMonth, 2);
340
+ var formatExpYear = (0, _utils.parseNum)(expYear, 2);
395
341
 
396
- if (!formatExpMonth) {
397
- throw new _graphqlErrors.UserError('required_credit_card_exp_month');
398
- }
342
+ if (!formatExpYear) {
343
+ throw new _graphqlErrors.UserError('required_credit_card_exp_year');
344
+ }
399
345
 
400
- var formatExpYear = (0, _utils.parseNum)(expYear, 2);
346
+ var formatCvc = (0, _utils.parseNum)(cvc, 3); // Address
401
347
 
402
- if (!formatExpYear) {
403
- throw new _graphqlErrors.UserError('required_credit_card_exp_year');
404
- }
348
+ var paymentCard = {};
349
+ var formatCity = (0, _utils.parseVarChar)(city, 32);
405
350
 
406
- var formatCvc = (0, _utils.parseNum)(cvc, 3);
351
+ if (formatCity) {
352
+ paymentCard.city = formatCity;
353
+ }
407
354
 
408
- if (!formatCvc) {
409
- throw new _graphqlErrors.UserError('required_credit_card_cvc');
410
- }
355
+ var formatCountry = (0, _utils.parseChar)(country, 2);
411
356
 
412
- var paymentCard = {};
413
- var formatCity = (0, _utils.parseVarChar)(city, 32);
357
+ if (formatCountry) {
358
+ paymentCard.country = formatCountry;
359
+ }
414
360
 
415
- if (formatCity) {
416
- paymentCard.city = formatCity;
417
- }
361
+ var formatFullName = (0, _utils.parseVarChar)(fullName, 32);
418
362
 
419
- var formatCountry = (0, _utils.parseVarChar)(country, 32);
363
+ if (formatFullName) {
364
+ paymentCard.fullName = formatFullName;
365
+ }
420
366
 
421
- if (formatCountry) {
422
- paymentCard.country = formatCountry;
423
- }
367
+ var formatStreet1 = (0, _utils.parseVarChar)(street1, 32);
424
368
 
425
- var formatFullName = (0, _utils.parseVarChar)(fullName, 32);
369
+ if (formatStreet1) {
370
+ paymentCard.street1 = formatStreet1;
371
+ }
426
372
 
427
- if (formatFullName) {
428
- paymentCard.fullName = formatFullName;
429
- }
373
+ var formatStreet2 = (0, _utils.parseVarChar)(street2, 32);
430
374
 
431
- var formatStreet = (0, _utils.parseVarChar)(street1, 32);
375
+ if (formatStreet2) {
376
+ paymentCard.street2 = formatStreet2;
377
+ }
432
378
 
433
- if (formatStreet) {
434
- paymentCard.street1 = formatStreet;
435
- }
379
+ var formatState = (0, _utils.parseChar)(state, 2);
436
380
 
437
- var formatState = (0, _utils.parseVarChar)(state, 32);
381
+ if (formatState) {
382
+ paymentCard.state = formatState;
383
+ }
438
384
 
439
- if (formatState) {
440
- paymentCard.state = formatState;
441
- }
385
+ var formatZip = (0, _utils.parseVarChar)(zip, 10);
442
386
 
443
- var formatZip = (0, _utils.parseVarChar)(zip, 32);
387
+ if (formatZip) {
388
+ paymentCard.zip = formatZip;
389
+ } // Stripe
444
390
 
445
- if (formatZip) {
446
- paymentCard.zip = formatZip;
447
- } // Get stripe id
448
391
 
392
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
393
+ apiVersion: apiVersion,
394
+ typescript: true
395
+ });
396
+ var source = {
397
+ address_city: formatCity,
398
+ address_country: formatCountry,
399
+ address_line1: formatStreet1,
400
+ address_line2: formatStreet2,
401
+ address_state: formatState,
402
+ address_zip: formatZip,
403
+ cvc: formatCvc,
404
+ exp_month: formatExpMonth,
405
+ exp_year: formatExpYear,
406
+ name: fullName,
407
+ number: formatNumber,
408
+ object: 'card'
409
+ };
410
+ return stripeClient.customers.createSource(stripeAccountId, {
411
+ source: source
412
+ }).then(function (newSource) {
413
+ var brand = newSource.brand,
414
+ cvcCheck = newSource.cvc_check,
415
+ last4 = newSource.last4; // Create session
449
416
 
450
- return (0, _users.getUser)(context, sessionId).then(function () {
451
- var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
452
- // Stripe
453
- var stripeClient = stripe(_config.Config.get('stripe.token'));
454
- return stripeClient.customers.createSource(user.stripeCustomerId, {
455
- source: {
456
- address_city: formatCity,
457
- address_country: formatCountry,
458
- address_line1: formatStreet,
459
- address_state: formatState,
460
- address_zip: formatZip,
461
- currency: 'usd',
462
- cvc: formatCvc,
463
- exp_month: formatExpMonth,
464
- exp_year: formatExpYear,
465
- name: formatFullName,
466
- number: formatNumber,
467
- object: 'card'
468
- }
469
- }).then(function (stripeObj) {
470
417
  var now = Date.now();
471
418
 
472
- var insert = _objectSpread({}, paymentCard, {
419
+ var insert = _objectSpread(_objectSpread({}, paymentCard), {}, {
473
420
  _key: (0, _utils.createHash)("user-payment-".concat(sessionId)),
474
- accountNumber: stripeObj.last4,
421
+ accountNumber: last4,
475
422
  added: now,
476
- brand: stripeObj.brand,
477
- cvc: stripeObj.cvc_check,
423
+ brand: brand,
424
+ cvcCheck: cvcCheck,
478
425
  expMonth: expMonth,
479
426
  expYear: expYear,
480
427
  modified: now,
481
428
  userId: sessionId
482
429
  });
483
430
 
484
- var insertAqlQry = (0, _arangojs.aql)(_templateObject4(), insert);
431
+ var insertAqlQry = (0, _arangojs.aql)(_templateObject3(), insert);
485
432
  return (0, _arangodb.useDb)(database).query(insertAqlQry).then(function (cursor) {
486
433
  return cursor.next();
487
434
  }).then(function () {
@@ -491,25 +438,29 @@ var addCreditCard = function addCreditCard(context, card) {
491
438
  // Add linked edge
492
439
  var cardId = card._id,
493
440
  cardKey = card._key;
494
- var edgeCollection = (0, _arangodb.useDb)(database).edgeCollection('hasPayment');
441
+ var edgeCollection = (0, _arangodb.useDb)(database).collection('hasPayment');
495
442
  var edgeId = (0, _utils.createHash)("payment-".concat(cardKey));
496
443
  var edge = {
497
- _key: edgeId
444
+ _from: "users/".concat(sessionId),
445
+ _key: edgeId,
446
+ _to: cardId
498
447
  };
499
- return edgeCollection.save(edge, "users/".concat(sessionId), cardId).then(function () {
448
+ return edgeCollection.save(edge, {
449
+ returnNew: true
450
+ }).then(function () {
500
451
  return card;
501
452
  });
502
453
  }
503
454
 
504
455
  return newCard;
505
- });
506
- })["catch"](function (error) {
507
- return (0, _analytics.logError)({
508
- action: action,
509
- category: eventCategory,
510
- label: 'payment_error'
511
- }, error, context).then(function () {
512
- return null;
456
+ })["catch"](function (error) {
457
+ return (0, _analytics.logError)({
458
+ action: action,
459
+ category: eventCategory,
460
+ label: 'payment_error'
461
+ }, error, context).then(function () {
462
+ return null;
463
+ });
513
464
  });
514
465
  });
515
466
  });
@@ -539,10 +490,10 @@ var updateCreditCard = function updateCreditCard(context, card) {
539
490
  var formatExpMonth = (0, _utils.parseNum)(expMonth, 2);
540
491
  var formatExpYear = (0, _utils.parseNum)(expYear, 2);
541
492
  var formatCity = (0, _utils.parseVarChar)(city, 32);
542
- var formatCountry = (0, _utils.parseVarChar)(country, 2);
493
+ var formatCountry = (0, _utils.parseChar)(country, 2);
543
494
  var formatFullName = (0, _utils.parseVarChar)(fullName, 32);
544
495
  var formatStreet1 = (0, _utils.parseString)(street1, 32);
545
- var formatState = (0, _utils.parseVarChar)(state, 2);
496
+ var formatState = (0, _utils.parseChar)(state, 2);
546
497
  var formatZip = (0, _utils.parseVarChar)(zip, 10);
547
498
 
548
499
  if (formatExpMonth) {
@@ -578,7 +529,7 @@ var updateCreditCard = function updateCreditCard(context, card) {
578
529
  }
579
530
 
580
531
  var update = paymentCard;
581
- var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatId, sessionId, update, sessionId);
532
+ var aqlQry = (0, _arangojs.aql)(_templateObject4(), formatId, sessionId, update, sessionId);
582
533
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
583
534
  return cursor.next();
584
535
  }).then(function () {
@@ -591,11 +542,16 @@ var updateCreditCard = function updateCreditCard(context, card) {
591
542
 
592
543
  if ((0, _isEmpty["default"])(updatedCard)) {
593
544
  throw new _graphqlErrors.UserError('not_found');
594
- } // Stripe
545
+ }
595
546
 
547
+ var stripeCustomerId = user.stripeCustomerId;
548
+ var stripeId = card.stripeId; // Stripe
596
549
 
597
- var stripeClient = stripe(_config.Config.get('stripe.token'));
598
- return stripeClient.customers.updateCard(user.stripeCustomerId, card.stripeId, {
550
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
551
+ apiVersion: apiVersion,
552
+ typescript: true
553
+ });
554
+ var update = {
599
555
  address_city: formatCity,
600
556
  address_country: formatCountry,
601
557
  address_line1: formatStreet1,
@@ -604,7 +560,8 @@ var updateCreditCard = function updateCreditCard(context, card) {
604
560
  exp_month: formatExpMonth,
605
561
  exp_year: formatExpYear,
606
562
  name: formatFullName
607
- }).then(function () {
563
+ };
564
+ return stripeClient.customers.updateSource(stripeCustomerId, stripeId, update).then(function () {
608
565
  return card;
609
566
  })["catch"](function (error) {
610
567
  console.log('payments::updateCard::error', error);
@@ -619,7 +576,7 @@ var getCreditCards = function getCreditCards(context) {
619
576
  var action = 'getCreditCards';
620
577
  var database = context.database,
621
578
  sessionId = context.userId;
622
- var aqlQry = (0, _arangojs.aql)(_templateObject6(), sessionId);
579
+ var aqlQry = (0, _arangojs.aql)(_templateObject5(), sessionId);
623
580
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
624
581
  return cursor.all();
625
582
  }).then(function () {
@@ -642,7 +599,7 @@ var deleteCreditCard = function deleteCreditCard(context, cardId) {
642
599
  var database = context.database,
643
600
  sessionId = context.userId;
644
601
  var formatCardId = (0, _utils.parseId)(cardId);
645
- var aqlQry = (0, _arangojs.aql)(_templateObject7(), formatCardId, sessionId, sessionId);
602
+ var aqlQry = (0, _arangojs.aql)(_templateObject6(), formatCardId, sessionId, sessionId);
646
603
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
647
604
  return cursor.next();
648
605
  }).then(function () {
@@ -659,17 +616,20 @@ var deleteCreditCard = function deleteCreditCard(context, cardId) {
659
616
  user = result.user;
660
617
  var cardKey = card._key; // Remove linked edges
661
618
 
662
- var edgeCollection = (0, _arangodb.useDb)(database).edgeCollection('hasPayment');
619
+ var edgeCollection = (0, _arangodb.useDb)(database).collection('hasPayment');
663
620
  return edgeCollection.outEdges(cardKey).then(function (edges) {
664
621
  if (edges.length) {
665
622
  return Promise.all(edges.map(function (edge) {
666
623
  var edgeKey = edge._key;
667
- var removeAqlQry = (0, _arangojs.aql)(_templateObject8(), edgeKey);
624
+ var removeAqlQry = (0, _arangojs.aql)(_templateObject7(), edgeKey);
668
625
  return (0, _arangodb.useDb)(database).query(removeAqlQry);
669
626
  })).then(function () {
670
627
  // Stripe
671
- var stripeClient = stripe(_config.Config.get('stripe.token'));
672
- return stripeClient.customers.deleteCard(user.stripeCustomerId, card.stripeId).then(function () {
628
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
629
+ apiVersion: apiVersion,
630
+ typescript: true
631
+ });
632
+ return stripeClient.customers.deleteSource(user.stripeCustomerId, card.stripeId).then(function () {
673
633
  return true;
674
634
  })["catch"](function (error) {
675
635
  console.log('payments::deleteCard::error', error);
@@ -685,7 +645,7 @@ var deleteCreditCard = function deleteCreditCard(context, cardId) {
685
645
 
686
646
  exports.deleteCreditCard = deleteCreditCard;
687
647
 
688
- var deletePaymentAccountBank = function deletePaymentAccountBank(context, bankId) {
648
+ var deleteBankAccount = function deleteBankAccount(context, bankId) {
689
649
  var database = context.database,
690
650
  sessionId = context.userId; // Clean db
691
651
 
@@ -696,14 +656,18 @@ var deletePaymentAccountBank = function deletePaymentAccountBank(context, bankId
696
656
  bankRouting: '',
697
657
  modified: Date.now()
698
658
  };
699
- var aqlQry = (0, _arangojs.aql)(_templateObject9(), sessionId, update);
659
+ var aqlQry = (0, _arangojs.aql)(_templateObject8(), sessionId, update);
700
660
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
701
661
  return cursor.next();
702
662
  }).then(function () {
703
663
  var user = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
704
- // Stripe
705
- var stripeClient = stripe(_config.Config.get('stripe.token'));
706
- return stripeClient.customers.deleteSource(user.stripeAccountId, bankId).then(function () {
664
+ var stripeAccountId = user.stripeAccountId; // Stripe
665
+
666
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
667
+ apiVersion: apiVersion,
668
+ typescript: true
669
+ });
670
+ return stripeClient.customers.deleteSource(stripeAccountId, bankId).then(function () {
707
671
  var response = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
708
672
  deleted: false
709
673
  };
@@ -714,7 +678,7 @@ var deletePaymentAccountBank = function deletePaymentAccountBank(context, bankId
714
678
  });
715
679
  };
716
680
 
717
- exports.deletePaymentAccountBank = deletePaymentAccountBank;
681
+ exports.deleteBankAccount = deleteBankAccount;
718
682
 
719
683
  var createPaymentTransfer = function createPaymentTransfer(context, transfer) {
720
684
  var database = context.database,
@@ -724,12 +688,16 @@ var createPaymentTransfer = function createPaymentTransfer(context, transfer) {
724
688
  var formatAmount = (0, _utils.parseNum)(amount);
725
689
  var formatCurrency = (0, _utils.parseChar)(currency, 3, 'USD').toUpperCase();
726
690
  return (0, _users.getUser)(context, sessionId).then(function (user) {
727
- // Stripe
728
- var stripeClient = stripe(_config.Config.get('stripe.token'));
691
+ var stripeAccountId = user.stripeAccountId; // Stripe
692
+
693
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
694
+ apiVersion: apiVersion,
695
+ typescript: true
696
+ });
729
697
  return stripeClient.transfers.create({
730
698
  amount: formatAmount,
731
699
  currency: formatCurrency,
732
- destination: user.stripeAccountId
700
+ destination: stripeAccountId
733
701
  }).then(function (stripeTransfer) {
734
702
  console.log(stripeTransfer);
735
703
  var now = Date.now();
@@ -740,7 +708,7 @@ var createPaymentTransfer = function createPaymentTransfer(context, transfer) {
740
708
  modified: now,
741
709
  userId: sessionId
742
710
  };
743
- var aqlQry = (0, _arangojs.aql)(_templateObject10(), insert);
711
+ var aqlQry = (0, _arangojs.aql)(_templateObject9(), insert);
744
712
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
745
713
  return cursor.next();
746
714
  }).then(function (newTransfer) {
@@ -761,7 +729,10 @@ var createPaymentHold = function createPaymentHold(context, payment) {
761
729
  currency = payment.currency,
762
730
  description = payment.description;
763
731
  var formatCurrency = (0, _utils.parseChar)(currency, 3, 'USD').toUpperCase();
764
- var stripeClient = stripe(_config.Config.get('stripe.token'));
732
+ var stripeClient = new _stripe["default"](_config.Config.get('stripe.token'), {
733
+ apiVersion: apiVersion,
734
+ typescript: true
735
+ });
765
736
  return stripeClient.charges.create({
766
737
  amount: amount,
767
738
  capture: capture,
@@ -784,7 +755,7 @@ var createPaymentHold = function createPaymentHold(context, payment) {
784
755
  modified: now,
785
756
  userId: sessionId
786
757
  };
787
- var aqlQry = (0, _arangojs.aql)(_templateObject11(), insert);
758
+ var aqlQry = (0, _arangojs.aql)(_templateObject10(), insert);
788
759
  return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
789
760
  return cursor.next();
790
761
  }).then(function (newPayment) {
@@ -797,4 +768,4 @@ var createPaymentHold = function createPaymentHold(context, payment) {
797
768
  };
798
769
 
799
770
  exports.createPaymentHold = createPaymentHold;
800
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3BheW1lbnRzLnRzIl0sIm5hbWVzIjpbImV2ZW50Q2F0ZWdvcnkiLCJhZGRDdXN0b21lckFjY291bnQiLCJjb250ZXh0IiwiYWN0aW9uIiwiZGF0YWJhc2UiLCJzZXNzaW9uSWQiLCJ1c2VySWQiLCJ1c2VybmFtZSIsInN0cmlwZUNsaWVudCIsInN0cmlwZSIsIkNvbmZpZyIsImdldCIsImN1c3RvbWVycyIsImNyZWF0ZSIsIm1ldGFkYXRhIiwidGhlbiIsImN1c3RvbWVyIiwibm93IiwiRGF0ZSIsInVwZGF0ZSIsIm1vZGlmaWVkIiwic3RyaXBlQ3VzdG9tZXJJZCIsImlkIiwiYXFsUXJ5IiwiYXFsIiwicXVlcnkiLCJjdXJzb3IiLCJuZXh0IiwidXBkYXRlZFVzZXIiLCJlcnJvciIsImNhdGVnb3J5IiwibGFiZWwiLCJhZGRQYXltZW50QWNjb3VudEJhbmsiLCJiYW5rQWNjb3VudCIsImFjY291bnROdW1iZXIiLCJmdWxsTmFtZSIsInJvdXRpbmciLCJmb3JtYXRBY2NvdW50IiwiVXNlckVycm9yIiwiZm9ybWF0RnVsbE5hbWUiLCJmb3JtYXRSb3V0aW5nIiwidXNlciIsImNyZWF0ZVNvdXJjZSIsInN0cmlwZUFjY291bnRJZCIsInNvdXJjZSIsImFjY291bnRfaG9sZGVyX25hbWUiLCJhY2NvdW50X2hvbGRlcl90eXBlIiwiYWNjb3VudF9udW1iZXIiLCJjb3VudHJ5IiwiY3VycmVuY3kiLCJvYmplY3QiLCJyb3V0aW5nX251bWJlciIsImFjY291bnQiLCJsYXN0NCIsImJhbmtGdWxsTmFtZSIsImJhbmtJZCIsImJhbmtSb3V0aW5nIiwibXNnIiwibWVzc2FnZSIsImFkZFBheW1lbnRBY2NvdW50Q2FyZCIsImNhcmQiLCJyZXF1ZXN0RGF0YSIsInVzZXJLZXkiLCJfa2V5IiwiY2l0eSIsImRvYiIsImVtYWlsIiwiZmlyc3QiLCJsYXN0IiwiZG9iRGF5IiwiRGF0ZVRpbWUiLCJmcm9tTWlsbGlzIiwidG9Gb3JtYXQiLCJkb2JNb250aCIsImRvYlllYXIiLCJhY2NlcHRlZFRlcm1zIiwiZXhwTW9udGgiLCJleHBZZWFyIiwic3RhdGUiLCJzdHJlZXQxIiwiemlwIiwiYWNjZXB0ZWQiLCJsb2NhbCIsIm1pbGxpc2Vjb25kIiwiYWNjb3VudHMiLCJleHRlcm5hbF9hY2NvdW50IiwiZXhwX21vbnRoIiwiZXhwX3llYXIiLCJudW1iZXIiLCJsZWdhbF9lbnRpdHkiLCJhZGRyZXNzIiwibGluZTEiLCJwb3N0YWxfY29kZSIsImRheSIsIm1vbnRoIiwieWVhciIsImZpcnN0X25hbWUiLCJsYXN0X25hbWUiLCJ0eXBlIiwibWFuYWdlZCIsInRvc19hY2NlcHRhbmNlIiwiZGF0ZSIsImlwIiwidXNlcl9hZ2VudCIsInVzZXJBZ2VudCIsImFkZENyZWRpdENhcmQiLCJjdmMiLCJmb3JtYXROdW1iZXIiLCJmb3JtYXRFeHBNb250aCIsImZvcm1hdEV4cFllYXIiLCJmb3JtYXRDdmMiLCJwYXltZW50Q2FyZCIsImZvcm1hdENpdHkiLCJmb3JtYXRDb3VudHJ5IiwiZm9ybWF0U3RyZWV0IiwiZm9ybWF0U3RhdGUiLCJmb3JtYXRaaXAiLCJhZGRyZXNzX2NpdHkiLCJhZGRyZXNzX2NvdW50cnkiLCJhZGRyZXNzX2xpbmUxIiwiYWRkcmVzc19zdGF0ZSIsImFkZHJlc3NfemlwIiwibmFtZSIsInN0cmlwZU9iaiIsImluc2VydCIsImFkZGVkIiwiYnJhbmQiLCJjdmNfY2hlY2siLCJpbnNlcnRBcWxRcnkiLCJuZXdDYXJkIiwiY2FyZElkIiwiX2lkIiwiY2FyZEtleSIsImVkZ2VDb2xsZWN0aW9uIiwiZWRnZUlkIiwiZWRnZSIsInNhdmUiLCJ1cGRhdGVDcmVkaXRDYXJkIiwiZm9ybWF0SWQiLCJmb3JtYXRTdHJlZXQxIiwicmVzdWx0cyIsInVwZGF0ZWRDYXJkIiwidXBkYXRlQ2FyZCIsInN0cmlwZUlkIiwiY29uc29sZSIsImxvZyIsImdldENyZWRpdENhcmRzIiwiYWxsIiwibGlzdCIsImRlbGV0ZUNyZWRpdENhcmQiLCJmb3JtYXRDYXJkSWQiLCJyZXN1bHQiLCJvdXRFZGdlcyIsImVkZ2VzIiwibGVuZ3RoIiwiUHJvbWlzZSIsIm1hcCIsImVkZ2VLZXkiLCJyZW1vdmVBcWxRcnkiLCJkZWxldGVDYXJkIiwiZGVsZXRlUGF5bWVudEFjY291bnRCYW5rIiwiZGVsZXRlU291cmNlIiwicmVzcG9uc2UiLCJkZWxldGVkIiwicmVzb2x2ZSIsImNyZWF0ZVBheW1lbnRUcmFuc2ZlciIsInRyYW5zZmVyIiwiYW1vdW50IiwiZm9ybWF0QW1vdW50IiwiZm9ybWF0Q3VycmVuY3kiLCJ0b1VwcGVyQ2FzZSIsInRyYW5zZmVycyIsImRlc3RpbmF0aW9uIiwic3RyaXBlVHJhbnNmZXIiLCJuZXdUcmFuc2ZlciIsImNyZWF0ZVBheW1lbnRIb2xkIiwicGF5bWVudCIsImNhcHR1cmUiLCJkZXNjcmlwdGlvbiIsImNoYXJnZXMiLCJzdHJpcGVDaGFyZ2UiLCJjaGFyZ2VGYWlsQ29kZSIsImZhaWx1cmVfY29kZSIsImNoYXJnZUZhaWxNc2ciLCJmYWlsdXJlX21lc3NhZ2UiLCJjaGFyZ2VJZCIsImNoYXJnZVN0YXR1cyIsInN0YXR1cyIsIm5ld1BheW1lbnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBOzs7O0FBSUEsSUFBTUEsYUFBcUIsR0FBRyxVQUE5Qjs7QUFFTyxJQUFNQyxrQkFBa0IsR0FBRyxTQUFyQkEsa0JBQXFCLENBQUNDLE9BQUQsRUFBMkM7QUFDM0UsTUFBTUMsTUFBYyxHQUFHLG9CQUF2QjtBQUQyRSxNQUVwRUMsUUFGb0UsR0FFM0JGLE9BRjJCLENBRXBFRSxRQUZvRTtBQUFBLE1BRWxEQyxTQUZrRCxHQUUzQkgsT0FG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LEtBQWhCLENBQXNCRixNQUF0QixFQUNKUixJQURJLENBQ0MsVUFBQ1csTUFBRDtBQUFBLGFBQXlCQSxNQUFNLENBQUNDLElBQVAsRUFBekI7QUFBQSxLQURELEVBRUpaLElBRkksQ0FFQyxVQUFDNkssVUFBRDtBQUFBLGFBQStCQSxVQUEvQjtBQUFBLEtBRkQsQ0FBUDtBQUdELEdBN0JJLFdBOEJFLFVBQUMvSixLQUFELEVBQWtCO0FBQ3ZCbUgsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVksNkJBQVosRUFBMkNwSCxLQUEzQztBQUNBLFVBQU0sSUFBSVMsd0JBQUosQ0FBYyxlQUFkLENBQU47QUFDRCxHQWpDSSxDQUFQO0FBa0NELENBekNNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvYXFsLXF1ZXJ5JztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2xpYi9janMvY3Vyc29yJztcbmltcG9ydCB7VXNlckVycm9yfSBmcm9tICdncmFwaHFsLWVycm9ycyc7XG5pbXBvcnQgaXNFbXB0eSBmcm9tICdsb2Rhc2gvaXNFbXB0eSc7XG5pbXBvcnQge0RhdGVUaW1lfSBmcm9tICdsdXhvbic7XG5pbXBvcnQgKiBhcyBzdHJpcGUgZnJvbSAnc3RyaXBlJztcblxuaW1wb3J0IHtDb25maWd9IGZyb20gJy4uL2NvbmZpZyc7XG5pbXBvcnQge0FwaUNvbnRleHQsIFBheW1lbnRCYW5rQWNjb3VudCwgUGF5bWVudENhcmRUeXBlLCBQYXltZW50Q2hhcmdlLCBQYXltZW50VHJhbnNmZXIsIFVzZXJUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2xvZ0Vycm9yfSBmcm9tICcuLi91dGlscy9hbmFseXRpY3MnO1xuaW1wb3J0IHt1c2VEYn0gZnJvbSAnLi4vdXRpbHMvYXJhbmdvZGInO1xuaW1wb3J0IHtnZXRVc2VyfSBmcm9tICcuL3VzZXJzJztcblxuLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTktUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmNvbnN0IGV2ZW50Q2F0ZWdvcnk6IHN0cmluZyA9ICdwYXltZW50cyc7XG5cbmV4cG9ydCBjb25zdCBhZGRDdXN0b21lckFjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCBhY3Rpb246IHN0cmluZyA9ICdhZGRDdXN0b21lckFjY291bnQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkLCB1c2VybmFtZX0gPSBjb250ZXh0O1xuXG4gIC8vIFN0cmlwZVxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgLmNyZWF0ZSh7XG4gICAgICBtZXRhZGF0YToge1xuICAgICAgICB1c2VySWQ6IHNlc3Npb25JZCxcbiAgICAgICAgdXNlcm5hbWVcbiAgICAgIH1cbiAgICB9KVxuICAgIC50aGVuKChjdXN0b21lcikgPT4ge1xuICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHVwZGF0ZTogVXNlclR5cGUgPSB7XG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHN0cmlwZUN1c3RvbWVySWQ6IGN1c3RvbWVyLmlkXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXJUeXBlID0ge30pID0+ICFpc0VtcHR5KHVwZGF0ZWRVc2VyKSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCkpO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZFBheW1lbnRBY2NvdW50QmFuayA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBiYW5rQWNjb3VudDogUGF5bWVudEJhbmtBY2NvdW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcblxuICAvLyBQYXJhbXNcbiAgY29uc3Qge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgZnVsbE5hbWUsXG4gICAgcm91dGluZ1xuICB9ID0gYmFua0FjY291bnQ7XG5cbiAgY29uc3QgZm9ybWF0QWNjb3VudDogc3RyaW5nID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDEyOCk7XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfZnVsbF9uYW1lJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRSb3V0aW5nOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhyb3V0aW5nLCAzMik7XG5cbiAgaWYoZm9ybWF0Um91dGluZyA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9yb3V0aW5nX251bWJlcicpO1xuICB9XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuY3JlYXRlU291cmNlKHVzZXIuc3RyaXBlQWNjb3VudElkLCB7XG4gICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICBhY2NvdW50X2hvbGRlcl9uYW1lOiBmb3JtYXRGdWxsTmFtZSxcbiAgICAgICAgICAgIGFjY291bnRfaG9sZGVyX3R5cGU6ICdpbmRpdmlkdWFsJyxcbiAgICAgICAgICAgIGFjY291bnRfbnVtYmVyOiBmb3JtYXRBY2NvdW50LFxuICAgICAgICAgICAgY291bnRyeTogJ1VTJyxcbiAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICAgIG9iamVjdDogJ2JhbmtfYWNjb3VudCcsXG4gICAgICAgICAgICByb3V0aW5nX251bWJlcjogZm9ybWF0Um91dGluZ1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKGFjY291bnQpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgICAgICAgIGJhbmtBY2NvdW50OiBhY2NvdW50Lmxhc3Q0LFxuICAgICAgICAgICAgYmFua0Z1bGxOYW1lOiBmb3JtYXRGdWxsTmFtZSxcbiAgICAgICAgICAgIGJhbmtJZDogYWNjb3VudC5pZCxcbiAgICAgICAgICAgIGJhbmtSb3V0aW5nOiBhY2NvdW50LnJvdXRpbmdfbnVtYmVyLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSA9IHt9KSA9PiB1cGRhdGVkVXNlcik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyb3IubWVzc2FnZTtcblxuICAgICAgICAgIGlmKG1zZyA9PT0gJ0EgYmFuayBhY2NvdW50IHdpdGggdGhhdCByb3V0aW5nIG51bWJlciBhbmQgYWNjb3VudCBudW1iZXIgJyArXG4gICAgICAgICAgICAnYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgY3VzdG9tZXIuJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdiYW5rX2FjY291bnRfZXhpc3RzJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkUGF5bWVudEFjY291bnRDYXJkID0gKGNvbnRleHQ6IEFwaUNvbnRleHQsIGNhcmQ6IFBheW1lbnRDYXJkVHlwZSwgcmVxdWVzdERhdGEpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBheW1lbnRBY2NvdW50Q2FyZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcblxuICByZXR1cm4gZ2V0VXNlcihjb250ZXh0LCBzZXNzaW9uSWQpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlKSA9PiB7XG4gICAgICAvLyBVc2VyXG4gICAgICBjb25zdCB7XG4gICAgICAgIF9rZXk6IHVzZXJLZXksXG4gICAgICAgIGNvdW50cnkgPSAnVVMnLFxuICAgICAgICBjaXR5LFxuICAgICAgICBjdXJyZW5jeSA9ICdVU0QnLFxuICAgICAgICBkb2IsXG4gICAgICAgIGVtYWlsLFxuICAgICAgICBmaXJzdCxcbiAgICAgICAgbGFzdCxcbiAgICAgICAgdXNlcm5hbWVcbiAgICAgIH06IFVzZXJUeXBlID0gdXNlcjtcblxuICAgICAgLy8gQmlydGhkYXlcbiAgICAgIGNvbnN0IGRvYkRheTogbnVtYmVyID0gKyhEYXRlVGltZS5mcm9tTWlsbGlzKGRvYikudG9Gb3JtYXQoJ2QnKSk7XG4gICAgICBjb25zdCBkb2JNb250aDogbnVtYmVyID0gKyhEYXRlVGltZS5mcm9tTWlsbGlzKGRvYikudG9Gb3JtYXQoJ00nKSk7XG4gICAgICBjb25zdCBkb2JZZWFyOiBudW1iZXIgPSArKERhdGVUaW1lLmZyb21NaWxsaXMoZG9iKS50b0Zvcm1hdCgneScpKTtcblxuICAgICAgLy8gQ2FyZFxuICAgICAgY29uc3Qge1xuICAgICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgICBhY2NlcHRlZFRlcm1zLFxuICAgICAgICBleHBNb250aCxcbiAgICAgICAgZXhwWWVhcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHN0cmVldDEsXG4gICAgICAgIHppcFxuICAgICAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICAgICAgLy8gQWNjZXB0YW5jZVxuICAgICAgY29uc3QgYWNjZXB0ZWQ6IG51bWJlciA9IGFjY2VwdGVkVGVybXMgPyBEYXRlVGltZS5sb2NhbCgpLm1pbGxpc2Vjb25kIDogMDtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmFjY291bnRzXG4gICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgIGNvdW50cnksXG4gICAgICAgICAgZW1haWwsXG4gICAgICAgICAgZXh0ZXJuYWxfYWNjb3VudDoge1xuICAgICAgICAgICAgY3VycmVuY3ksXG4gICAgICAgICAgICBleHBfbW9udGg6IGV4cE1vbnRoLFxuICAgICAgICAgICAgZXhwX3llYXI6IGV4cFllYXIsXG4gICAgICAgICAgICBudW1iZXI6IGFjY291bnROdW1iZXIsXG4gICAgICAgICAgICBvYmplY3Q6ICdjYXJkJ1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVnYWxfZW50aXR5OiB7XG4gICAgICAgICAgICBhZGRyZXNzOiB7XG4gICAgICAgICAgICAgIGNpdHksXG4gICAgICAgICAgICAgIGxpbmUxOiBzdHJlZXQxLFxuICAgICAgICAgICAgICBwb3N0YWxfY29kZTogemlwLFxuICAgICAgICAgICAgICBzdGF0ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRvYjoge1xuICAgICAgICAgICAgICBkYXk6IGRvYkRheSxcbiAgICAgICAgICAgICAgbW9udGg6IGRvYk1vbnRoLFxuICAgICAgICAgICAgICB5ZWFyOiBkb2JZZWFyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmlyc3RfbmFtZTogZmlyc3QsXG4gICAgICAgICAgICBsYXN0X25hbWU6IGxhc3QsXG4gICAgICAgICAgICAvLyBzc25fbGFzdF80OiBzc24uc3Vic3RyKC00KSxcbiAgICAgICAgICAgIC8vIHBlcnNvbmFsX2lkX251bWJlcjogc3NuLFxuICAgICAgICAgICAgdHlwZTogJ2luZGl2aWR1YWwnXG4gICAgICAgICAgfSxcbiAgICAgICAgICBtYW5hZ2VkOiB0cnVlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgICAgICB1c2VySWQ6IHVzZXJLZXksXG4gICAgICAgICAgICB1c2VybmFtZVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdG9zX2FjY2VwdGFuY2U6IHtcbiAgICAgICAgICAgIGRhdGU6IGFjY2VwdGVkLFxuICAgICAgICAgICAgaXA6IHJlcXVlc3REYXRhLmlwLFxuICAgICAgICAgICAgdXNlcl9hZ2VudDogcmVxdWVzdERhdGEudXNlckFnZW50LnNvdXJjZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnRoZW4oKGN1c3RvbWVyKSA9PiB7XG4gICAgICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlOiBVc2VyVHlwZSA9IHtcbiAgICAgICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgICAgICBzdHJpcGVBY2NvdW50SWQ6IGN1c3RvbWVyLmlkXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgVVBEQVRFICR7dXNlcktleX0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigodXBkYXRlZFVzZXI6IFVzZXJUeXBlID0ge30pID0+ICFpc0VtcHR5KHVwZGF0ZWRVc2VyKSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZENyZWRpdENhcmQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgY2FyZDogUGF5bWVudENhcmRUeXBlKTogUHJvbWlzZTxQYXltZW50Q2FyZFR5cGU+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkQ3JlZGl0Q2FyZCc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcblxuICBjb25zdCB7XG4gICAgYWNjb3VudE51bWJlcixcbiAgICBjaXR5LFxuICAgIGNvdW50cnksXG4gICAgY3ZjLFxuICAgIGV4cE1vbnRoLFxuICAgIGV4cFllYXIsXG4gICAgZnVsbE5hbWUsXG4gICAgc3RyZWV0MSxcbiAgICBzdGF0ZSxcbiAgICB6aXBcbiAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcbiAgY29uc3QgZm9ybWF0TnVtYmVyOiBudW1iZXIgPSBwYXJzZU51bShhY2NvdW50TnVtYmVyLCAxNik7XG5cbiAgaWYoIWZvcm1hdE51bWJlcikge1xuICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX251bWJlcicpO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0RXhwTW9udGg6IG51bWJlciA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcblxuICBpZighZm9ybWF0RXhwTW9udGgpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfbW9udGgnKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEV4cFllYXI6IG51bWJlciA9IHBhcnNlTnVtKGV4cFllYXIsIDIpO1xuXG4gIGlmKCFmb3JtYXRFeHBZZWFyKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfZXhwX3llYXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEN2YzogbnVtYmVyID0gcGFyc2VOdW0oY3ZjLCAzKTtcblxuICBpZighZm9ybWF0Q3ZjKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfY3ZjJyk7XG4gIH1cblxuICBjb25zdCBwYXltZW50Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge307XG4gIGNvbnN0IGZvcm1hdENpdHk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG5cbiAgaWYoZm9ybWF0Q2l0eSkge1xuICAgIHBheW1lbnRDYXJkLmNpdHkgPSBmb3JtYXRDaXR5O1xuICB9XG5cbiAgY29uc3QgZm9ybWF0Q291bnRyeTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGNvdW50cnksIDMyKTtcblxuICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgcGF5bWVudENhcmQuY291bnRyeSA9IGZvcm1hdENvdW50cnk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRGdWxsTmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUpIHtcbiAgICBwYXltZW50Q2FyZC5mdWxsTmFtZSA9IGZvcm1hdEZ1bGxOYW1lO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0U3RyZWV0OiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoc3RyZWV0MSwgMzIpO1xuXG4gIGlmKGZvcm1hdFN0cmVldCkge1xuICAgIHBheW1lbnRDYXJkLnN0cmVldDEgPSBmb3JtYXRTdHJlZXQ7XG4gIH1cblxuICBjb25zdCBmb3JtYXRTdGF0ZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKHN0YXRlLCAzMik7XG5cbiAgaWYoZm9ybWF0U3RhdGUpIHtcbiAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICB9XG5cbiAgY29uc3QgZm9ybWF0WmlwOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoemlwLCAzMik7XG5cbiAgaWYoZm9ybWF0WmlwKSB7XG4gICAgcGF5bWVudENhcmQuemlwID0gZm9ybWF0WmlwO1xuICB9XG5cbiAgLy8gR2V0IHN0cmlwZSBpZFxuICByZXR1cm4gZ2V0VXNlcihjb250ZXh0LCBzZXNzaW9uSWQpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlID0ge30pID0+IHtcbiAgICAgIC8vIFN0cmlwZVxuICAgICAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gc3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpKTtcblxuICAgICAgcmV0dXJuIHN0cmlwZUNsaWVudC5jdXN0b21lcnNcbiAgICAgICAgLmNyZWF0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIHtcbiAgICAgICAgICBzb3VyY2U6IHtcbiAgICAgICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgICAgIGFkZHJlc3NfY291bnRyeTogZm9ybWF0Q291bnRyeSxcbiAgICAgICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldCxcbiAgICAgICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiAndXNkJyxcbiAgICAgICAgICAgIGN2YzogZm9ybWF0Q3ZjLFxuICAgICAgICAgICAgZXhwX21vbnRoOiBmb3JtYXRFeHBNb250aCxcbiAgICAgICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLFxuICAgICAgICAgICAgbmFtZTogZm9ybWF0RnVsbE5hbWUsXG4gICAgICAgICAgICBudW1iZXI6IGZvcm1hdE51bWJlcixcbiAgICAgICAgICAgIG9iamVjdDogJ2NhcmQnXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAudGhlbigoc3RyaXBlT2JqKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm93OiBudW1iZXIgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IGluc2VydCA9IHtcbiAgICAgICAgICAgIC4uLnBheW1lbnRDYXJkLFxuICAgICAgICAgICAgX2tleTogY3JlYXRlSGFzaChgdXNlci1wYXltZW50LSR7c2Vzc2lvbklkfWApLFxuICAgICAgICAgICAgYWNjb3VudE51bWJlcjogc3RyaXBlT2JqLmxhc3Q0LFxuICAgICAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgICAgIGJyYW5kOiBzdHJpcGVPYmouYnJhbmQsXG4gICAgICAgICAgICBjdmM6IHN0cmlwZU9iai5jdmNfY2hlY2ssXG4gICAgICAgICAgICBleHBNb250aCxcbiAgICAgICAgICAgIGV4cFllYXIsXG4gICAgICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGluc2VydEFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiBjcmVkaXRDYXJkcyBSRVRVUk4gTkVXYDtcblxuICAgICAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoaW5zZXJ0QXFsUXJ5KVxuICAgICAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgICAgICAudGhlbigobmV3Q2FyZDogUGF5bWVudENhcmRUeXBlID0ge30pID0+IHtcbiAgICAgICAgICAgICAgaWYoIWlzRW1wdHkobmV3Q2FyZCkpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGQgbGlua2VkIGVkZ2VcbiAgICAgICAgICAgICAgICBjb25zdCB7X2lkOiBjYXJkSWQsIF9rZXk6IGNhcmRLZXl9ID0gY2FyZDtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlKS5lZGdlQ29sbGVjdGlvbignaGFzUGF5bWVudCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2VJZCA9IGNyZWF0ZUhhc2goYHBheW1lbnQtJHtjYXJkS2V5fWApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkZ2U6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgIF9rZXk6IGVkZ2VJZFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCBgdXNlcnMvJHtzZXNzaW9uSWR9YCwgY2FyZElkKS50aGVuKCgpID0+IGNhcmQpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG5ld0NhcmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgbGFiZWw6ICdwYXltZW50X2Vycm9yJ1xuICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFBheW1lbnRDYXJkVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNpdHksXG4gICAgY291bnRyeSxcbiAgICBleHBNb250aCxcbiAgICBleHBZZWFyLFxuICAgIGZ1bGxOYW1lLFxuICAgIGlkLFxuICAgIHN0cmVldDEsXG4gICAgc3RhdGUsXG4gICAgemlwXG4gIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGg6IG51bWJlciA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcbiAgY29uc3QgZm9ybWF0RXhwWWVhcjogbnVtYmVyID0gcGFyc2VOdW0oZXhwWWVhciwgMik7XG4gIGNvbnN0IGZvcm1hdENpdHk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjb3VudHJ5LCAyKTtcbiAgY29uc3QgZm9ybWF0RnVsbE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihmdWxsTmFtZSwgMzIpO1xuICBjb25zdCBmb3JtYXRTdHJlZXQxOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoc3RhdGUsIDIpO1xuICBjb25zdCBmb3JtYXRaaXA6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICBpZihmb3JtYXRFeHBNb250aCkge1xuICAgIHBheW1lbnRDYXJkLmV4cE1vbnRoID0gZm9ybWF0RXhwTW9udGg7XG4gIH1cblxuICBpZihmb3JtYXRFeHBZZWFyKSB7XG4gICAgcGF5bWVudENhcmQuZXhwWWVhciA9IGZvcm1hdEV4cFllYXI7XG4gIH1cblxuICBpZihmb3JtYXRDaXR5KSB7XG4gICAgcGF5bWVudENhcmQuY2l0eSA9IGZvcm1hdENpdHk7XG4gIH1cblxuICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgcGF5bWVudENhcmQuY291bnRyeSA9IGZvcm1hdENvdW50cnk7XG4gIH1cblxuICBpZihmb3JtYXRGdWxsTmFtZSkge1xuICAgIHBheW1lbnRDYXJkLmZ1bGxOYW1lID0gZm9ybWF0RnVsbE5hbWU7XG4gIH1cblxuICBpZihmb3JtYXRTdHJlZXQxKSB7XG4gICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gIH1cblxuICBpZihmb3JtYXRTdGF0ZSkge1xuICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gIH1cblxuICBpZihmb3JtYXRaaXApIHtcbiAgICBwYXltZW50Q2FyZC56aXAgPSBmb3JtYXRaaXA7XG4gIH1cblxuICBjb25zdCB1cGRhdGU6IGFueSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZihpc0VtcHR5KHVwZGF0ZWRDYXJkKSkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdub3RfZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAudXBkYXRlQ2FyZCh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQsIHtcbiAgICAgICAgICBhZGRyZXNzX2NpdHk6IGZvcm1hdENpdHksXG4gICAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldDEsXG4gICAgICAgICAgYWRkcmVzc19zdGF0ZTogZm9ybWF0U3RhdGUsXG4gICAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLFxuICAgICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLFxuICAgICAgICAgIG5hbWU6IGZvcm1hdEZ1bGxOYW1lXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IGNhcmQpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjp1cGRhdGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdwYXltZW50X2Vycm9yJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENyZWRpdENhcmRzID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPFBheW1lbnRDYXJkVHlwZVtdPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2dldENyZWRpdENhcmRzJztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLnVzZXJJZCA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZDogc3RyaW5nID0gcGFyc2VJZChjYXJkSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIGNhcmQgPSBGSVJTVChcbiAgICAgICAgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgICAgRklMVEVSIGMuX2tleSA9PSAke2Zvcm1hdENhcmRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVNT1ZFIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICAgICAgUkVUVVJOIE9MRFxuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiBjYXJkfWA7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHJlc3VsdCA9IHtjYXJkOiB7fSwgdXNlcjoge319KSA9PiB7XG4gICAgICBpZihpc0VtcHR5KHJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7Y2FyZCwgdXNlcn0gPSByZXN1bHQ7XG4gICAgICBjb25zdCB7X2tleTogY2FyZEtleX0gPSBjYXJkO1xuXG4gICAgICAvLyBSZW1vdmUgbGlua2VkIGVkZ2VzXG4gICAgICBjb25zdCBlZGdlQ29sbGVjdGlvbiA9IHVzZURiKGRhdGFiYXNlKS5lZGdlQ29sbGVjdGlvbignaGFzUGF5bWVudCcpO1xuXG4gICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24ub3V0RWRnZXMoY2FyZEtleSlcbiAgICAgICAgLnRoZW4oKGVkZ2VzKSA9PiB7XG4gICAgICAgICAgaWYoZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBSRU1PVkUge19rZXk6JHtlZGdlS2V5fX0gSU4gaGFzUGF5bWVudGA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShyZW1vdmVBcWxRcnkpO1xuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IHN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZUNhcmQodXNlci5zdHJpcGVDdXN0b21lcklkLCBjYXJkLnN0cmlwZUlkKVxuICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwYXltZW50czo6ZGVsZXRlQ2FyZDo6ZXJyb3InLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVBheW1lbnRBY2NvdW50QmFuayA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBiYW5rSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2xlYW4gZGJcbiAgY29uc3QgdXBkYXRlOiBVc2VyVHlwZSA9IHtcbiAgICBiYW5rQWNjb3VudDogJycsXG4gICAgYmFua0Z1bGxOYW1lOiAnJyxcbiAgICBiYW5rSWQ6ICcnLFxuICAgIGJhbmtSb3V0aW5nOiAnJyxcbiAgICBtb2RpZmllZDogRGF0ZS5ub3coKVxuICB9O1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFVQREFURSAke3Nlc3Npb25JZH0gV0lUSCAke3VwZGF0ZX0gSU4gdXNlcnMgTElNSVQgMSBSRVRVUk4gTkVXYDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigodXNlcjogVXNlclR5cGUgPSB7fSkgPT4ge1xuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuZGVsZXRlU291cmNlKHVzZXIuc3RyaXBlQWNjb3VudElkLCBiYW5rSWQpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSA9IHtkZWxldGVkOiBmYWxzZX0pID0+IHJlc3BvbnNlLmRlbGV0ZWQpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudDogbnVtYmVyID0gcGFyc2VOdW0oYW1vdW50KTtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3k6IHN0cmluZyA9IHBhcnNlQ2hhcihjdXJyZW5jeSwgMywgJ1VTRCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LnRyYW5zZmVyc1xuICAgICAgICAuY3JlYXRlKHtcbiAgICAgICAgICBhbW91bnQ6IGZvcm1hdEFtb3VudCxcbiAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgZGVzdGluYXRpb246IHVzZXIuc3RyaXBlQWNjb3VudElkXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChzdHJpcGVUcmFuc2ZlcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHN0cmlwZVRyYW5zZmVyKTtcbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50VHJhbnNmZXIgPSB7XG4gICAgICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICAgICAgYW1vdW50OiBmb3JtYXRBbW91bnQsXG4gICAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0cmFuc2ZlcnMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld1RyYW5zZmVyOiBQYXltZW50VHJhbnNmZXIpID0+IG5ld1RyYW5zZmVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUGF5bWVudEhvbGQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcGF5bWVudDogUGF5bWVudENoYXJnZSk6IFByb21pc2U8UGF5bWVudENoYXJnZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHthbW91bnQsIGNhcHR1cmUsIGNhcmRJZCwgY3VycmVuY3ksIGRlc2NyaXB0aW9ufSA9IHBheW1lbnQ7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBzdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJykpO1xuXG4gIHJldHVybiBzdHJpcGVDbGllbnQuY2hhcmdlc1xuICAgIC5jcmVhdGUoe1xuICAgICAgYW1vdW50LFxuICAgICAgY2FwdHVyZSxcbiAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc291cmNlOiBjYXJkSWRcbiAgICB9KVxuICAgIC50aGVuKChzdHJpcGVDaGFyZ2UpID0+IHtcbiAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGluc2VydDogUGF5bWVudENoYXJnZSA9IHtcbiAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBjYXB0dXJlLFxuICAgICAgICBjYXJkSWQsXG4gICAgICAgIGNoYXJnZUZhaWxDb2RlOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9jb2RlLFxuICAgICAgICBjaGFyZ2VGYWlsTXNnOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9tZXNzYWdlLFxuICAgICAgICBjaGFyZ2VJZDogc3RyaXBlQ2hhcmdlLmlkLFxuICAgICAgICBjaGFyZ2VTdGF0dXM6IHN0cmlwZUNoYXJnZS5zdGF0dXMsXG4gICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9O1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBheW1lbnRzIFJFVFVSTiBORVdgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChuZXdQYXltZW50OiBQYXltZW50Q2hhcmdlKSA9PiBuZXdQYXltZW50KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OmNyZWF0ZUhvbGQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgIH0pO1xufTtcbiJdfQ==
771
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3BheW1lbnRzLnRzIl0sIm5hbWVzIjpbImV2ZW50Q2F0ZWdvcnkiLCJhcGlWZXJzaW9uIiwiYWRkQ3VzdG9tZXJBY2NvdW50IiwiY29udGV4dCIsImFjdGlvbiIsImRhdGFiYXNlIiwic2Vzc2lvbklkIiwidXNlcklkIiwidXNlcm5hbWUiLCJzdHJpcGVDbGllbnQiLCJTdHJpcGUiLCJDb25maWciLCJnZXQiLCJ0eXBlc2NyaXB0IiwiY3VzdG9tZXJzIiwiY3JlYXRlIiwibWV0YWRhdGEiLCJ0aGVuIiwiY3VzdG9tZXIiLCJub3ciLCJEYXRlIiwidXBkYXRlIiwibW9kaWZpZWQiLCJzdHJpcGVDdXN0b21lcklkIiwiaWQiLCJhcWxRcnkiLCJhcWwiLCJxdWVyeSIsImN1cnNvciIsIm5leHQiLCJ1cGRhdGVkVXNlciIsImVycm9yIiwiY2F0ZWdvcnkiLCJsYWJlbCIsImFkZEJhbmtBY2NvdW50IiwiYmFua0FjY291bnQiLCJhY2NvdW50TnVtYmVyIiwiZnVsbE5hbWUiLCJyb3V0aW5nIiwiZm9ybWF0QWNjb3VudCIsIlVzZXJFcnJvciIsImZvcm1hdEZ1bGxOYW1lIiwiZm9ybWF0Um91dGluZyIsInVzZXIiLCJzdHJpcGVBY2NvdW50SWQiLCJzb3VyY2UiLCJhY2NvdW50X2hvbGRlcl9uYW1lIiwiYWNjb3VudF9ob2xkZXJfdHlwZSIsImFjY291bnRfbnVtYmVyIiwiY291bnRyeSIsImN1cnJlbmN5Iiwib2JqZWN0Iiwicm91dGluZ19udW1iZXIiLCJjcmVhdGVTb3VyY2UiLCJhY2NvdW50IiwiYmFua0lkIiwibGFzdDQiLCJiYW5rUm91dGluZyIsImJhbmtGdWxsTmFtZSIsIm1zZyIsIm1lc3NhZ2UiLCJhZGRDcmVkaXRDYXJkIiwiY2FyZCIsImNpdHkiLCJjdmMiLCJleHBNb250aCIsImV4cFllYXIiLCJzdHJlZXQxIiwic3RyZWV0MiIsInN0YXRlIiwiemlwIiwiZm9ybWF0TnVtYmVyIiwiZm9ybWF0RXhwTW9udGgiLCJmb3JtYXRFeHBZZWFyIiwiZm9ybWF0Q3ZjIiwicGF5bWVudENhcmQiLCJmb3JtYXRDaXR5IiwiZm9ybWF0Q291bnRyeSIsImZvcm1hdFN0cmVldDEiLCJmb3JtYXRTdHJlZXQyIiwiZm9ybWF0U3RhdGUiLCJmb3JtYXRaaXAiLCJhZGRyZXNzX2NpdHkiLCJhZGRyZXNzX2NvdW50cnkiLCJhZGRyZXNzX2xpbmUxIiwiYWRkcmVzc19saW5lMiIsImFkZHJlc3Nfc3RhdGUiLCJhZGRyZXNzX3ppcCIsImV4cF9tb250aCIsImV4cF95ZWFyIiwibmFtZSIsIm51bWJlciIsIm5ld1NvdXJjZSIsImJyYW5kIiwiY3ZjQ2hlY2siLCJjdmNfY2hlY2siLCJpbnNlcnQiLCJfa2V5IiwiYWRkZWQiLCJpbnNlcnRBcWxRcnkiLCJuZXdDYXJkIiwiY2FyZElkIiwiX2lkIiwiY2FyZEtleSIsImVkZ2VDb2xsZWN0aW9uIiwiY29sbGVjdGlvbiIsImVkZ2VJZCIsImVkZ2UiLCJfZnJvbSIsIl90byIsInNhdmUiLCJyZXR1cm5OZXciLCJ1cGRhdGVDcmVkaXRDYXJkIiwiZm9ybWF0SWQiLCJyZXN1bHRzIiwidXBkYXRlZENhcmQiLCJzdHJpcGVJZCIsInVwZGF0ZVNvdXJjZSIsImNvbnNvbGUiLCJsb2ciLCJnZXRDcmVkaXRDYXJkcyIsImFsbCIsImxpc3QiLCJkZWxldGVDcmVkaXRDYXJkIiwiZm9ybWF0Q2FyZElkIiwicmVzdWx0Iiwib3V0RWRnZXMiLCJlZGdlcyIsImxlbmd0aCIsIlByb21pc2UiLCJtYXAiLCJlZGdlS2V5IiwicmVtb3ZlQXFsUXJ5IiwiZGVsZXRlU291cmNlIiwiZGVsZXRlQmFua0FjY291bnQiLCJyZXNwb25zZSIsImRlbGV0ZWQiLCJyZXNvbHZlIiwiY3JlYXRlUGF5bWVudFRyYW5zZmVyIiwidHJhbnNmZXIiLCJhbW91bnQiLCJmb3JtYXRBbW91bnQiLCJmb3JtYXRDdXJyZW5jeSIsInRvVXBwZXJDYXNlIiwidHJhbnNmZXJzIiwiZGVzdGluYXRpb24iLCJzdHJpcGVUcmFuc2ZlciIsIm5ld1RyYW5zZmVyIiwiY3JlYXRlUGF5bWVudEhvbGQiLCJwYXltZW50IiwiY2FwdHVyZSIsImRlc2NyaXB0aW9uIiwiY2hhcmdlcyIsInN0cmlwZUNoYXJnZSIsImNoYXJnZUZhaWxDb2RlIiwiZmFpbHVyZV9jb2RlIiwiY2hhcmdlRmFpbE1zZyIsImZhaWx1cmVfbWVzc2FnZSIsImNoYXJnZUlkIiwiY2hhcmdlU3RhdHVzIiwic3RhdHVzIiwibmV3UGF5bWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFJQTs7QUFDQTs7QUFJQTs7QUFDQTs7QUFDQTs7QUFFQTs7QUFFQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLGFBQXFCLEdBQUcsVUFBOUI7QUFDQSxJQUFNQyxVQUFlLEdBQUcsWUFBeEI7O0FBRU8sSUFBTUMsa0JBQWtCLEdBQUcsU0FBckJBLGtCQUFxQixDQUFDQyxPQUFELEVBQTJDO0FBQzNFLE1BQU1DLE1BQWMsR0FBRyxvQkFBdkI7QUFEMkUsTUFFcEVDLFFBRm9FLEdBRTNCRixPQUYyQixDQUVwRUUsUUFGb0U7QUFBQSxNQUVsREMsU0FGa0QsR0FFM0JILE9BRjJCLENBRTFESSxNQUYwRDtBQUFBLE1BRXZDQyxRQUZ1QyxHQUUzQkwsT0FGMkIsQ0FFdkNLLFFBRnVDLEVBSTNFOztBQUNBLE1BQU1DLFlBQVksR0FBRyxJQUFJQyxrQkFBSixDQUFXQyxlQUFPQyxHQUFQLENBQVcsY0FBWCxDQUFYLEVBQXVDO0FBQUNYLElBQUFBLFVBQVUsRUFBVkEsVUFBRDtBQUFhWSxJQUFBQSxVQUFVLEVBQUU7QUFBekIsR0FBdkMsQ0FBckI7QUFFQSxTQUFPSixZQUFZLENBQUNLLFNBQWIsQ0FDSkMsTUFESSxDQUNHO0FBQ05DLElBQUFBLFFBQVEs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QU5BLE1BRjRCO0FBRzVCVSxNQUFBQSxPQUFPLEVBQVBBLE9BSDRCO0FBSTVCakQsTUFBQUEsTUFBTSxFQUFOQSxNQUo0QjtBQUs1QnFELE1BQUFBLGNBQWMsRUFBRUQsWUFBWSxDQUFDRSxZQUxEO0FBTTVCQyxNQUFBQSxhQUFhLEVBQUVILFlBQVksQ0FBQ0ksZUFOQTtBQU81QkMsTUFBQUEsUUFBUSxFQUFFTCxZQUFZLENBQUNqSSxFQVBLO0FBUTVCdUksTUFBQUEsWUFBWSxFQUFFTixZQUFZLENBQUNPLE1BUkM7QUFTNUI5RyxNQUFBQSxRQUFRLEVBQUU0RixjQVRrQjtBQVU1QlMsTUFBQUEsV0FBVyxFQUFYQSxXQVY0QjtBQVc1QmpJLE1BQUFBLFFBQVEsRUFBRUgsR0FYa0I7QUFZNUJaLE1BQUFBLE1BQU0sRUFBRUQ7QUFab0IsS0FBOUI7QUFjQSxRQUFNbUIsTUFBZ0IsT0FBR0MsYUFBSCx1QkFBZ0JzRSxNQUFoQixDQUF0QjtBQUVBLFdBQU8scUJBQU0zRixRQUFOLEVBQWdCc0IsS0FBaEIsQ0FBc0JGLE1BQXRCLEVBQ0pSLElBREksQ0FDQyxVQUFDVyxNQUFEO0FBQUEsYUFBeUJBLE1BQU0sQ0FBQ0MsSUFBUCxFQUF6QjtBQUFBLEtBREQsRUFFSlosSUFGSSxDQUVDLFVBQUNnSixVQUFEO0FBQUEsYUFBK0JBLFVBQS9CO0FBQUEsS0FGRCxDQUFQO0FBR0QsR0E3QkksV0E4QkUsVUFBQ2xJLEtBQUQsRUFBa0I7QUFDdkJ1RixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSw2QkFBWixFQUEyQ3hGLEtBQTNDO0FBQ0EsVUFBTSxJQUFJUyx3QkFBSixDQUFjLGVBQWQsQ0FBTjtBQUNELEdBakNJLENBQVA7QUFrQ0QsQ0F6Q00iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOS1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtjcmVhdGVIYXNoLCBwYXJzZUNoYXIsIHBhcnNlSWQsIHBhcnNlTnVtLCBwYXJzZVN0cmluZywgcGFyc2VWYXJDaGFyfSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHthcWx9IGZyb20gJ2FyYW5nb2pzJztcbmltcG9ydCB7QXFsUXVlcnl9IGZyb20gJ2FyYW5nb2pzL2FxbCc7XG5pbXBvcnQge0VkZ2VDb2xsZWN0aW9ufSBmcm9tICdhcmFuZ29qcy9jb2xsZWN0aW9uJztcbmltcG9ydCB7QXJyYXlDdXJzb3J9IGZyb20gJ2FyYW5nb2pzL2N1cnNvcic7XG5pbXBvcnQge1VzZXJFcnJvcn0gZnJvbSAnZ3JhcGhxbC1lcnJvcnMnO1xuaW1wb3J0IGlzRW1wdHkgZnJvbSAnbG9kYXNoL2lzRW1wdHknO1xuaW1wb3J0IFN0cmlwZSBmcm9tICdzdHJpcGUnO1xuXG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB7QXBpQ29udGV4dCwgUGF5bWVudEJhbmtBY2NvdW50LCBQYXltZW50Q2FyZFR5cGUsIFBheW1lbnRDaGFyZ2UsIFBheW1lbnRUcmFuc2ZlciwgVXNlclR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7bG9nRXJyb3J9IGZyb20gJy4uL3V0aWxzL2FuYWx5dGljcyc7XG5pbXBvcnQge3VzZURifSBmcm9tICcuLi91dGlscy9hcmFuZ29kYic7XG5pbXBvcnQge2dldFVzZXJ9IGZyb20gJy4vdXNlcnMnO1xuXG5jb25zdCBldmVudENhdGVnb3J5OiBzdHJpbmcgPSAncGF5bWVudHMnO1xuY29uc3QgYXBpVmVyc2lvbjogYW55ID0gJzIwMjAtMDMtMDInO1xuXG5leHBvcnQgY29uc3QgYWRkQ3VzdG9tZXJBY2NvdW50ID0gKGNvbnRleHQ6IEFwaUNvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnYWRkQ3VzdG9tZXJBY2NvdW50JztcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZCwgdXNlcm5hbWV9ID0gY29udGV4dDtcblxuICAvLyBTdHJpcGVcbiAgY29uc3Qgc3RyaXBlQ2xpZW50ID0gbmV3IFN0cmlwZShDb25maWcuZ2V0KCdzdHJpcGUudG9rZW4nKSwge2FwaVZlcnNpb24sIHR5cGVzY3JpcHQ6IHRydWV9KTtcblxuICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgIC5jcmVhdGUoe1xuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgdXNlcklkOiBzZXNzaW9uSWQsXG4gICAgICAgIHVzZXJuYW1lXG4gICAgICB9XG4gICAgfSlcbiAgICAudGhlbigoY3VzdG9tZXIpID0+IHtcbiAgICAgIC8vIENyZWF0ZSBzZXNzaW9uXG4gICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB1cGRhdGU6IFVzZXJUeXBlID0ge1xuICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICBzdHJpcGVDdXN0b21lcklkOiBjdXN0b21lci5pZFxuICAgICAgfTtcblxuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgICAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSA9IHt9KSA9PiAhaXNFbXB0eSh1cGRhdGVkVXNlcikpXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgICAgIGxhYmVsOiAnZGJfZXJyb3InXG4gICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBhZGRCYW5rQWNjb3VudCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBiYW5rQWNjb3VudDogUGF5bWVudEJhbmtBY2NvdW50KTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZFBheW1lbnRBY2NvdW50QmFuayc7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcblxuICAvLyBQYXJhbXNcbiAgY29uc3Qge1xuICAgIGFjY291bnROdW1iZXIsXG4gICAgZnVsbE5hbWUsXG4gICAgcm91dGluZ1xuICB9ID0gYmFua0FjY291bnQ7XG5cbiAgY29uc3QgZm9ybWF0QWNjb3VudDogc3RyaW5nID0gcGFyc2VTdHJpbmcoYWNjb3VudE51bWJlciwgMzIpO1xuXG4gIGlmKGZvcm1hdEFjY291bnQgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfYWNjb3VudF9udW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGZvcm1hdEZ1bGxOYW1lOiBzdHJpbmcgPSBwYXJzZVZhckNoYXIoZnVsbE5hbWUsIDEyOCk7XG5cbiAgaWYoZm9ybWF0RnVsbE5hbWUgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfZnVsbF9uYW1lJyk7XG4gIH1cblxuICBjb25zdCBmb3JtYXRSb3V0aW5nOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhyb3V0aW5nLCAzMik7XG5cbiAgaWYoZm9ybWF0Um91dGluZyA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9yb3V0aW5nX251bWJlcicpO1xuICB9XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH06IFVzZXJUeXBlID0gdXNlcjtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuICAgICAgY29uc3Qgc291cmNlOiBhbnkgPSB7XG4gICAgICAgIGFjY291bnRfaG9sZGVyX25hbWU6IGZvcm1hdEZ1bGxOYW1lLFxuICAgICAgICBhY2NvdW50X2hvbGRlcl90eXBlOiAnaW5kaXZpZHVhbCcsXG4gICAgICAgIGFjY291bnRfbnVtYmVyOiBmb3JtYXRBY2NvdW50LFxuICAgICAgICBjb3VudHJ5OiAnVVMnLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIG9iamVjdDogJ2JhbmtfYWNjb3VudCcsXG4gICAgICAgIHJvdXRpbmdfbnVtYmVyOiBmb3JtYXRSb3V0aW5nXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuY3JlYXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwge3NvdXJjZX0pXG4gICAgICAgIC50aGVuKChhY2NvdW50OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCB7aWQ6IGJhbmtJZCwgbGFzdDQ6IGJhbmtBY2NvdW50LCByb3V0aW5nX251bWJlcjogYmFua1JvdXRpbmd9ID0gYWNjb3VudDtcbiAgICAgICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgICAgICAgIGJhbmtBY2NvdW50LFxuICAgICAgICAgICAgYmFua0Z1bGxOYW1lOiBmb3JtYXRGdWxsTmFtZSxcbiAgICAgICAgICAgIGJhbmtJZCxcbiAgICAgICAgICAgIGJhbmtSb3V0aW5nLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKHVwZGF0ZWRVc2VyOiBVc2VyVHlwZSA9IHt9KSA9PiB1cGRhdGVkVXNlcik7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc3QgbXNnID0gZXJyb3IubWVzc2FnZTtcblxuICAgICAgICAgIGlmKG1zZyA9PT0gJ0EgYmFuayBhY2NvdW50IHdpdGggdGhhdCByb3V0aW5nIG51bWJlciBhbmQgYWNjb3VudCBudW1iZXIgJyArXG4gICAgICAgICAgICAnYWxyZWFkeSBleGlzdHMgZm9yIHRoaXMgY3VzdG9tZXIuJykge1xuICAgICAgICAgICAgcmV0dXJuIGxvZ0Vycm9yKHtcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgICAgbGFiZWw6ICdiYW5rX2FjY291bnRfZXhpc3RzJ1xuICAgICAgICAgICAgfSwgZXJyb3IsIGNvbnRleHQpLnRoZW4oKCkgPT4gbnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBsb2dFcnJvcih7XG4gICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICBjYXRlZ29yeTogZXZlbnRDYXRlZ29yeSxcbiAgICAgICAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICAgICAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWRkQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFVzZXJUeXBlPiA9PiB7XG4gIGNvbnN0IGFjdGlvbjogc3RyaW5nID0gJ2FkZENyZWRpdENhcmQnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgLy8gVXNlclxuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH06IFVzZXJUeXBlID0gdXNlcjtcblxuICAgICAgLy8gQ2FyZFxuICAgICAgY29uc3Qge1xuICAgICAgICBhY2NvdW50TnVtYmVyLFxuICAgICAgICBjaXR5LFxuICAgICAgICBjb3VudHJ5LFxuICAgICAgICBjdmMsXG4gICAgICAgIGV4cE1vbnRoLFxuICAgICAgICBleHBZZWFyLFxuICAgICAgICBmdWxsTmFtZSxcbiAgICAgICAgc3RyZWV0MSxcbiAgICAgICAgc3RyZWV0MixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHppcFxuICAgICAgfTogUGF5bWVudENhcmRUeXBlID0gY2FyZDtcblxuICAgICAgY29uc3QgZm9ybWF0TnVtYmVyOiBudW1iZXIgPSBwYXJzZU51bShhY2NvdW50TnVtYmVyLCAxNik7XG5cbiAgICAgIGlmKCFmb3JtYXROdW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfbnVtYmVyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEV4cE1vbnRoOiBudW1iZXIgPSBwYXJzZU51bShleHBNb250aCwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBNb250aCkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdyZXF1aXJlZF9jcmVkaXRfY2FyZF9leHBfbW9udGgnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0RXhwWWVhcjogbnVtYmVyID0gcGFyc2VOdW0oZXhwWWVhciwgMik7XG5cbiAgICAgIGlmKCFmb3JtYXRFeHBZZWFyKSB7XG4gICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3JlcXVpcmVkX2NyZWRpdF9jYXJkX2V4cF95ZWFyJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdEN2YzogbnVtYmVyID0gcGFyc2VOdW0oY3ZjLCAzKTtcblxuICAgICAgLy8gQWRkcmVzc1xuICAgICAgY29uc3QgcGF5bWVudENhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHt9O1xuICAgICAgY29uc3QgZm9ybWF0Q2l0eTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGNpdHksIDMyKTtcblxuICAgICAgaWYoZm9ybWF0Q2l0eSkge1xuICAgICAgICBwYXltZW50Q2FyZC5jaXR5ID0gZm9ybWF0Q2l0eTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZm9ybWF0Q291bnRyeTogc3RyaW5nID0gcGFyc2VDaGFyKGNvdW50cnksIDIpO1xuXG4gICAgICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgICAgIHBheW1lbnRDYXJkLmNvdW50cnkgPSBmb3JtYXRDb3VudHJ5O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRGdWxsTmFtZTogc3RyaW5nID0gcGFyc2VWYXJDaGFyKGZ1bGxOYW1lLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdEZ1bGxOYW1lKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLmZ1bGxOYW1lID0gZm9ybWF0RnVsbE5hbWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDE6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihzdHJlZXQxLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDEpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0cmVldDI6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihzdHJlZXQyLCAzMik7XG5cbiAgICAgIGlmKGZvcm1hdFN0cmVldDIpIHtcbiAgICAgICAgcGF5bWVudENhcmQuc3RyZWV0MiA9IGZvcm1hdFN0cmVldDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZvcm1hdFN0YXRlOiBzdHJpbmcgPSBwYXJzZUNoYXIoc3RhdGUsIDIpO1xuXG4gICAgICBpZihmb3JtYXRTdGF0ZSkge1xuICAgICAgICBwYXltZW50Q2FyZC5zdGF0ZSA9IGZvcm1hdFN0YXRlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3JtYXRaaXA6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICAgICAgaWYoZm9ybWF0WmlwKSB7XG4gICAgICAgIHBheW1lbnRDYXJkLnppcCA9IGZvcm1hdFppcDtcbiAgICAgIH1cblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuICAgICAgY29uc3Qgc291cmNlOiBhbnkgPSB7XG4gICAgICAgIGFkZHJlc3NfY2l0eTogZm9ybWF0Q2l0eSxcbiAgICAgICAgYWRkcmVzc19jb3VudHJ5OiBmb3JtYXRDb3VudHJ5LFxuICAgICAgICBhZGRyZXNzX2xpbmUxOiBmb3JtYXRTdHJlZXQxLFxuICAgICAgICBhZGRyZXNzX2xpbmUyOiBmb3JtYXRTdHJlZXQyLFxuICAgICAgICBhZGRyZXNzX3N0YXRlOiBmb3JtYXRTdGF0ZSxcbiAgICAgICAgYWRkcmVzc196aXA6IGZvcm1hdFppcCxcbiAgICAgICAgY3ZjOiBmb3JtYXRDdmMsXG4gICAgICAgIGV4cF9tb250aDogZm9ybWF0RXhwTW9udGgsXG4gICAgICAgIGV4cF95ZWFyOiBmb3JtYXRFeHBZZWFyLFxuICAgICAgICBuYW1lOiBmdWxsTmFtZSxcbiAgICAgICAgbnVtYmVyOiBmb3JtYXROdW1iZXIsXG4gICAgICAgIG9iamVjdDogJ2NhcmQnXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuY3JlYXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwge3NvdXJjZX0pXG4gICAgICAgIC50aGVuKChuZXdTb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHticmFuZCwgY3ZjX2NoZWNrOiBjdmNDaGVjaywgbGFzdDR9ID0gbmV3U291cmNlO1xuXG4gICAgICAgICAgLy8gQ3JlYXRlIHNlc3Npb25cbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0ID0ge1xuICAgICAgICAgICAgLi4ucGF5bWVudENhcmQsXG4gICAgICAgICAgICBfa2V5OiBjcmVhdGVIYXNoKGB1c2VyLXBheW1lbnQtJHtzZXNzaW9uSWR9YCksXG4gICAgICAgICAgICBhY2NvdW50TnVtYmVyOiBsYXN0NCxcbiAgICAgICAgICAgIGFkZGVkOiBub3csXG4gICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgIGN2Y0NoZWNrLFxuICAgICAgICAgICAgZXhwTW9udGgsXG4gICAgICAgICAgICBleHBZZWFyLFxuICAgICAgICAgICAgbW9kaWZpZWQ6IG5vdyxcbiAgICAgICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBpbnNlcnRBcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYElOU0VSVCAke2luc2VydH0gSU4gY3JlZGl0Q2FyZHMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGluc2VydEFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld0NhcmQ6IFBheW1lbnRDYXJkVHlwZSA9IHt9KSA9PiB7XG4gICAgICAgICAgICAgIGlmKCFpc0VtcHR5KG5ld0NhcmQpKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRkIGxpbmtlZCBlZGdlXG4gICAgICAgICAgICAgICAgY29uc3Qge19pZDogY2FyZElkLCBfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRnZUNvbGxlY3Rpb246IEVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2UpLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlSWQgPSBjcmVhdGVIYXNoKGBwYXltZW50LSR7Y2FyZEtleX1gKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGdlOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICBfZnJvbTogYHVzZXJzLyR7c2Vzc2lvbklkfWAsXG4gICAgICAgICAgICAgICAgICBfa2V5OiBlZGdlSWQsXG4gICAgICAgICAgICAgICAgICBfdG86IGNhcmRJZFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZWRnZUNvbGxlY3Rpb24uc2F2ZShlZGdlLCB7cmV0dXJuTmV3OiB0cnVlfSkudGhlbigoKSA9PiBjYXJkKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHJldHVybiBuZXdDYXJkO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiBsb2dFcnJvcih7XG4gICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IGV2ZW50Q2F0ZWdvcnksXG4gICAgICAgICAgICAgIGxhYmVsOiAncGF5bWVudF9lcnJvcidcbiAgICAgICAgICAgIH0sIGVycm9yLCBjb250ZXh0KS50aGVuKCgpID0+IG51bGwpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkOiBQYXltZW50Q2FyZFR5cGUpOiBQcm9taXNlPFBheW1lbnRDYXJkVHlwZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG5cbiAgY29uc3Qge1xuICAgIGNpdHksXG4gICAgY291bnRyeSxcbiAgICBleHBNb250aCxcbiAgICBleHBZZWFyLFxuICAgIGZ1bGxOYW1lLFxuICAgIGlkLFxuICAgIHN0cmVldDEsXG4gICAgc3RhdGUsXG4gICAgemlwXG4gIH06IFBheW1lbnRDYXJkVHlwZSA9IGNhcmQ7XG5cbiAgY29uc3QgZm9ybWF0SWQ6IHN0cmluZyA9IHBhcnNlSWQoaWQpO1xuXG4gIGlmKGZvcm1hdElkKSB7XG4gICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncmVxdWlyZWRfY3JlZGl0X2NhcmRfaWQnKTtcbiAgfVxuXG4gIGNvbnN0IHBheW1lbnRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSB7fTtcbiAgY29uc3QgZm9ybWF0RXhwTW9udGg6IG51bWJlciA9IHBhcnNlTnVtKGV4cE1vbnRoLCAyKTtcbiAgY29uc3QgZm9ybWF0RXhwWWVhcjogbnVtYmVyID0gcGFyc2VOdW0oZXhwWWVhciwgMik7XG4gIGNvbnN0IGZvcm1hdENpdHk6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihjaXR5LCAzMik7XG4gIGNvbnN0IGZvcm1hdENvdW50cnk6IHN0cmluZyA9IHBhcnNlQ2hhcihjb3VudHJ5LCAyKTtcbiAgY29uc3QgZm9ybWF0RnVsbE5hbWU6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcihmdWxsTmFtZSwgMzIpO1xuICBjb25zdCBmb3JtYXRTdHJlZXQxOiBzdHJpbmcgPSBwYXJzZVN0cmluZyhzdHJlZXQxLCAzMik7XG4gIGNvbnN0IGZvcm1hdFN0YXRlOiBzdHJpbmcgPSBwYXJzZUNoYXIoc3RhdGUsIDIpO1xuICBjb25zdCBmb3JtYXRaaXA6IHN0cmluZyA9IHBhcnNlVmFyQ2hhcih6aXAsIDEwKTtcblxuICBpZihmb3JtYXRFeHBNb250aCkge1xuICAgIHBheW1lbnRDYXJkLmV4cE1vbnRoID0gZm9ybWF0RXhwTW9udGg7XG4gIH1cblxuICBpZihmb3JtYXRFeHBZZWFyKSB7XG4gICAgcGF5bWVudENhcmQuZXhwWWVhciA9IGZvcm1hdEV4cFllYXI7XG4gIH1cblxuICBpZihmb3JtYXRDaXR5KSB7XG4gICAgcGF5bWVudENhcmQuY2l0eSA9IGZvcm1hdENpdHk7XG4gIH1cblxuICBpZihmb3JtYXRDb3VudHJ5KSB7XG4gICAgcGF5bWVudENhcmQuY291bnRyeSA9IGZvcm1hdENvdW50cnk7XG4gIH1cblxuICBpZihmb3JtYXRGdWxsTmFtZSkge1xuICAgIHBheW1lbnRDYXJkLmZ1bGxOYW1lID0gZm9ybWF0RnVsbE5hbWU7XG4gIH1cblxuICBpZihmb3JtYXRTdHJlZXQxKSB7XG4gICAgcGF5bWVudENhcmQuc3RyZWV0MSA9IGZvcm1hdFN0cmVldDE7XG4gIH1cblxuICBpZihmb3JtYXRTdGF0ZSkge1xuICAgIHBheW1lbnRDYXJkLnN0YXRlID0gZm9ybWF0U3RhdGU7XG4gIH1cblxuICBpZihmb3JtYXRaaXApIHtcbiAgICBwYXltZW50Q2FyZC56aXAgPSBmb3JtYXRaaXA7XG4gIH1cblxuICBjb25zdCB1cGRhdGU6IGFueSA9IHBheW1lbnRDYXJkO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgICAgTEVUIHVwZGF0ZWRDYXJkID0gRklSU1QoXG4gICAgICAgIEZPUiBjIElOIGNyZWRpdENhcmRzXG4gICAgICAgIEZJTFRFUiBjLl9rZXkgPT0gJHtmb3JtYXRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICAgIFVQREFURSBjIFdJVEggJHt1cGRhdGV9IElOIGNyZWRpdENhcmRzXG4gICAgICAgIExJTUlUIDFcbiAgICAgICAgUkVUVVJOIE5FV1xuICAgICAgKVxuICAgICAgTEVUIHVzZXIgPSBGSVJTVChcbiAgICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgICAgRklMVEVSIHUuX2tleSA9PSAke3Nlc3Npb25JZH1cbiAgICAgICAgTElNSVQgMVxuICAgICAgICBSRVRVUk4gdVxuICAgICAgKVxuICAgICAgUkVUVVJOIHt1c2VyOiB1c2VyLCBjYXJkOiB1cGRhdGVkQ2FyZH1gO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgIC50aGVuKChyZXN1bHRzID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRDYXJkOiBQYXltZW50Q2FyZFR5cGUgPSByZXN1bHRzLmNhcmQ7XG4gICAgICBjb25zdCB7dXNlcn0gPSByZXN1bHRzO1xuXG4gICAgICBpZihpc0VtcHR5KHVwZGF0ZWRDYXJkKSkge1xuICAgICAgICB0aHJvdyBuZXcgVXNlckVycm9yKCdub3RfZm91bmQnKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge3N0cmlwZUN1c3RvbWVySWR9ID0gdXNlcjtcbiAgICAgIGNvbnN0IHtzdHJpcGVJZH0gPSBjYXJkO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG4gICAgICBjb25zdCB1cGRhdGU6IGFueSA9IHtcbiAgICAgICAgYWRkcmVzc19jaXR5OiBmb3JtYXRDaXR5LFxuICAgICAgICBhZGRyZXNzX2NvdW50cnk6IGZvcm1hdENvdW50cnksXG4gICAgICAgIGFkZHJlc3NfbGluZTE6IGZvcm1hdFN0cmVldDEsXG4gICAgICAgIGFkZHJlc3Nfc3RhdGU6IGZvcm1hdFN0YXRlLFxuICAgICAgICBhZGRyZXNzX3ppcDogZm9ybWF0WmlwLFxuICAgICAgICBleHBfbW9udGg6IGZvcm1hdEV4cE1vbnRoLFxuICAgICAgICBleHBfeWVhcjogZm9ybWF0RXhwWWVhcixcbiAgICAgICAgbmFtZTogZm9ybWF0RnVsbE5hbWVcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQuY3VzdG9tZXJzXG4gICAgICAgIC51cGRhdGVTb3VyY2Uoc3RyaXBlQ3VzdG9tZXJJZCwgc3RyaXBlSWQsIHVwZGF0ZSlcbiAgICAgICAgLnRoZW4oKCkgPT4gY2FyZClcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OnVwZGF0ZUNhcmQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgICAgIHRocm93IG5ldyBVc2VyRXJyb3IoJ3BheW1lbnRfZXJyb3InKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3JlZGl0Q2FyZHMgPSAoY29udGV4dDogQXBpQ29udGV4dCk6IFByb21pc2U8UGF5bWVudENhcmRUeXBlW10+ID0+IHtcbiAgY29uc3QgYWN0aW9uOiBzdHJpbmcgPSAnZ2V0Q3JlZGl0Q2FyZHMnO1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgRk9SIGMgSU4gY3JlZGl0Q2FyZHNcbiAgICBGSUxURVIgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgUkVUVVJOIGNgO1xuXG4gIHJldHVybiB1c2VEYihkYXRhYmFzZSkucXVlcnkoYXFsUXJ5KVxuICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IuYWxsKCkpXG4gICAgLnRoZW4oKGxpc3Q6IFBheW1lbnRDYXJkVHlwZVtdID0gW10pID0+IGxpc3QpXG4gICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IGxvZ0Vycm9yKHtcbiAgICAgIGFjdGlvbixcbiAgICAgIGNhdGVnb3J5OiBldmVudENhdGVnb3J5LFxuICAgICAgbGFiZWw6ICdkYl9lcnJvcidcbiAgICB9LCBlcnJvciwgY29udGV4dCkudGhlbigoKSA9PiBudWxsKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQ3JlZGl0Q2FyZCA9IChjb250ZXh0OiBBcGlDb250ZXh0LCBjYXJkSWQ6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGZvcm1hdENhcmRJZDogc3RyaW5nID0gcGFyc2VJZChjYXJkSWQpO1xuICBjb25zdCBhcWxRcnk6IEFxbFF1ZXJ5ID0gYXFsYFxuICAgIExFVCBjYXJkID0gRklSU1QoXG4gICAgICBGT1IgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgRklMVEVSIGMuX2tleSA9PSAke2Zvcm1hdENhcmRJZH0gJiYgYy51c2VySWQgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRU1PVkUgYyBJTiBjcmVkaXRDYXJkc1xuICAgICAgUkVUVVJOIE9MRFxuICAgIClcbiAgICBMRVQgdXNlciA9IEZJUlNUKFxuICAgICAgRk9SIHUgSU4gdXNlcnNcbiAgICAgIEZJTFRFUiB1Ll9rZXkgPT0gJHtzZXNzaW9uSWR9XG4gICAgICBMSU1JVCAxXG4gICAgICBSRVRVUk4gdVxuICAgIClcbiAgICBSRVRVUk4ge3VzZXI6IHVzZXIsIGNhcmQ6IGNhcmR9YDtcblxuICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAudGhlbigoY3Vyc29yOiBBcnJheUN1cnNvcikgPT4gY3Vyc29yLm5leHQoKSlcbiAgICAudGhlbigocmVzdWx0ID0ge2NhcmQ6IHt9LCB1c2VyOiB7fX0pID0+IHtcbiAgICAgIGlmKGlzRW1wdHkocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtjYXJkLCB1c2VyfSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IHtfa2V5OiBjYXJkS2V5fSA9IGNhcmQ7XG5cbiAgICAgIC8vIFJlbW92ZSBsaW5rZWQgZWRnZXNcbiAgICAgIGNvbnN0IGVkZ2VDb2xsZWN0aW9uID0gdXNlRGIoZGF0YWJhc2UpLmNvbGxlY3Rpb24oJ2hhc1BheW1lbnQnKTtcblxuICAgICAgcmV0dXJuIGVkZ2VDb2xsZWN0aW9uLm91dEVkZ2VzKGNhcmRLZXkpXG4gICAgICAgIC50aGVuKChlZGdlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYoZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGVkZ2VzLm1hcCgoZWRnZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtfa2V5OiBlZGdlS2V5fSA9IGVkZ2U7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlQXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBSRU1PVkUge19rZXk6JHtlZGdlS2V5fX0gSU4gaGFzUGF5bWVudGA7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShyZW1vdmVBcWxRcnkpO1xuICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFN0cmlwZVxuICAgICAgICAgICAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAgICAgICAgICAgLmRlbGV0ZVNvdXJjZSh1c2VyLnN0cmlwZUN1c3RvbWVySWQsIGNhcmQuc3RyaXBlSWQpXG4gICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3BheW1lbnRzOjpkZWxldGVDYXJkOjplcnJvcicsIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGVsZXRlQmFua0FjY291bnQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgYmFua0lkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgY29uc3Qge2RhdGFiYXNlLCB1c2VySWQ6IHNlc3Npb25JZH0gPSBjb250ZXh0O1xuXG4gIC8vIENsZWFuIGRiXG4gIGNvbnN0IHVwZGF0ZTogVXNlclR5cGUgPSB7XG4gICAgYmFua0FjY291bnQ6ICcnLFxuICAgIGJhbmtGdWxsTmFtZTogJycsXG4gICAgYmFua0lkOiAnJyxcbiAgICBiYW5rUm91dGluZzogJycsXG4gICAgbW9kaWZpZWQ6IERhdGUubm93KClcbiAgfTtcbiAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBVUERBVEUgJHtzZXNzaW9uSWR9IFdJVEggJHt1cGRhdGV9IElOIHVzZXJzIExJTUlUIDEgUkVUVVJOIE5FV2A7XG5cbiAgcmV0dXJuIHVzZURiKGRhdGFiYXNlKS5xdWVyeShhcWxRcnkpXG4gICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgLnRoZW4oKHVzZXI6IFVzZXJUeXBlID0ge30pID0+IHtcbiAgICAgIGNvbnN0IHtzdHJpcGVBY2NvdW50SWR9ID0gdXNlcjtcblxuICAgICAgLy8gU3RyaXBlXG4gICAgICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gICAgICByZXR1cm4gc3RyaXBlQ2xpZW50LmN1c3RvbWVyc1xuICAgICAgICAuZGVsZXRlU291cmNlKHN0cmlwZUFjY291bnRJZCwgYmFua0lkKVxuICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSA9IHtkZWxldGVkOiBmYWxzZX0pID0+IHJlc3BvbnNlLmRlbGV0ZWQpXG4gICAgICAgIC5jYXRjaCgoKSA9PiBQcm9taXNlLnJlc29sdmUoZmFsc2UpKTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVQYXltZW50VHJhbnNmZXIgPSAoY29udGV4dDogQXBpQ29udGV4dCwgdHJhbnNmZXI6IFBheW1lbnRUcmFuc2Zlcik6IFByb21pc2U8UGF5bWVudFRyYW5zZmVyPiA9PiB7XG4gIGNvbnN0IHtkYXRhYmFzZSwgdXNlcklkOiBzZXNzaW9uSWR9ID0gY29udGV4dDtcbiAgY29uc3Qge2Ftb3VudCwgY3VycmVuY3l9ID0gdHJhbnNmZXI7XG4gIGNvbnN0IGZvcm1hdEFtb3VudDogbnVtYmVyID0gcGFyc2VOdW0oYW1vdW50KTtcbiAgY29uc3QgZm9ybWF0Q3VycmVuY3k6IHN0cmluZyA9IHBhcnNlQ2hhcihjdXJyZW5jeSwgMywgJ1VTRCcpLnRvVXBwZXJDYXNlKCk7XG5cbiAgcmV0dXJuIGdldFVzZXIoY29udGV4dCwgc2Vzc2lvbklkKVxuICAgIC50aGVuKCh1c2VyOiBVc2VyVHlwZSkgPT4ge1xuICAgICAgY29uc3Qge3N0cmlwZUFjY291bnRJZH0gPSB1c2VyO1xuXG4gICAgICAvLyBTdHJpcGVcbiAgICAgIGNvbnN0IHN0cmlwZUNsaWVudCA9IG5ldyBTdHJpcGUoQ29uZmlnLmdldCgnc3RyaXBlLnRva2VuJyksIHthcGlWZXJzaW9uLCB0eXBlc2NyaXB0OiB0cnVlfSk7XG5cbiAgICAgIHJldHVybiBzdHJpcGVDbGllbnQudHJhbnNmZXJzXG4gICAgICAgIC5jcmVhdGUoe1xuICAgICAgICAgIGFtb3VudDogZm9ybWF0QW1vdW50LFxuICAgICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogc3RyaXBlQWNjb3VudElkXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChzdHJpcGVUcmFuc2ZlcikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKHN0cmlwZVRyYW5zZmVyKTtcbiAgICAgICAgICBjb25zdCBub3c6IG51bWJlciA9IERhdGUubm93KCk7XG4gICAgICAgICAgY29uc3QgaW5zZXJ0OiBQYXltZW50VHJhbnNmZXIgPSB7XG4gICAgICAgICAgICBhZGRlZDogbm93LFxuICAgICAgICAgICAgYW1vdW50OiBmb3JtYXRBbW91bnQsXG4gICAgICAgICAgICBjdXJyZW5jeTogZm9ybWF0Q3VycmVuY3ksXG4gICAgICAgICAgICBtb2RpZmllZDogbm93LFxuICAgICAgICAgICAgdXNlcklkOiBzZXNzaW9uSWRcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IGFxbFFyeTogQXFsUXVlcnkgPSBhcWxgSU5TRVJUICR7aW5zZXJ0fSBJTiB0cmFuc2ZlcnMgUkVUVVJOIE5FV2A7XG5cbiAgICAgICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgICAgIC50aGVuKChjdXJzb3I6IEFycmF5Q3Vyc29yKSA9PiBjdXJzb3IubmV4dCgpKVxuICAgICAgICAgICAgLnRoZW4oKG5ld1RyYW5zZmVyOiBQYXltZW50VHJhbnNmZXIpID0+IG5ld1RyYW5zZmVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlUGF5bWVudEhvbGQgPSAoY29udGV4dDogQXBpQ29udGV4dCwgcGF5bWVudDogUGF5bWVudENoYXJnZSk6IFByb21pc2U8UGF5bWVudENoYXJnZT4gPT4ge1xuICBjb25zdCB7ZGF0YWJhc2UsIHVzZXJJZDogc2Vzc2lvbklkfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHthbW91bnQsIGNhcHR1cmUsIGNhcmRJZCwgY3VycmVuY3ksIGRlc2NyaXB0aW9ufSA9IHBheW1lbnQ7XG4gIGNvbnN0IGZvcm1hdEN1cnJlbmN5ID0gcGFyc2VDaGFyKGN1cnJlbmN5LCAzLCAnVVNEJykudG9VcHBlckNhc2UoKTtcblxuICBjb25zdCBzdHJpcGVDbGllbnQgPSBuZXcgU3RyaXBlKENvbmZpZy5nZXQoJ3N0cmlwZS50b2tlbicpLCB7YXBpVmVyc2lvbiwgdHlwZXNjcmlwdDogdHJ1ZX0pO1xuXG4gIHJldHVybiBzdHJpcGVDbGllbnQuY2hhcmdlc1xuICAgIC5jcmVhdGUoe1xuICAgICAgYW1vdW50LFxuICAgICAgY2FwdHVyZSxcbiAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgc291cmNlOiBjYXJkSWRcbiAgICB9KVxuICAgIC50aGVuKChzdHJpcGVDaGFyZ2UpID0+IHtcbiAgICAgIGNvbnN0IG5vdzogbnVtYmVyID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGluc2VydDogUGF5bWVudENoYXJnZSA9IHtcbiAgICAgICAgYWRkZWQ6IG5vdyxcbiAgICAgICAgYW1vdW50LFxuICAgICAgICBjYXB0dXJlLFxuICAgICAgICBjYXJkSWQsXG4gICAgICAgIGNoYXJnZUZhaWxDb2RlOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9jb2RlLFxuICAgICAgICBjaGFyZ2VGYWlsTXNnOiBzdHJpcGVDaGFyZ2UuZmFpbHVyZV9tZXNzYWdlLFxuICAgICAgICBjaGFyZ2VJZDogc3RyaXBlQ2hhcmdlLmlkLFxuICAgICAgICBjaGFyZ2VTdGF0dXM6IHN0cmlwZUNoYXJnZS5zdGF0dXMsXG4gICAgICAgIGN1cnJlbmN5OiBmb3JtYXRDdXJyZW5jeSxcbiAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIG1vZGlmaWVkOiBub3csXG4gICAgICAgIHVzZXJJZDogc2Vzc2lvbklkXG4gICAgICB9O1xuICAgICAgY29uc3QgYXFsUXJ5OiBBcWxRdWVyeSA9IGFxbGBJTlNFUlQgJHtpbnNlcnR9IElOIHBheW1lbnRzIFJFVFVSTiBORVdgO1xuXG4gICAgICByZXR1cm4gdXNlRGIoZGF0YWJhc2UpLnF1ZXJ5KGFxbFFyeSlcbiAgICAgICAgLnRoZW4oKGN1cnNvcjogQXJyYXlDdXJzb3IpID0+IGN1cnNvci5uZXh0KCkpXG4gICAgICAgIC50aGVuKChuZXdQYXltZW50OiBQYXltZW50Q2hhcmdlKSA9PiBuZXdQYXltZW50KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZygncGF5bWVudHM6OmNyZWF0ZUhvbGQ6OmVycm9yJywgZXJyb3IpO1xuICAgICAgdGhyb3cgbmV3IFVzZXJFcnJvcigncGF5bWVudF9lcnJvcicpO1xuICAgIH0pO1xufTtcbiJdfQ==