@nlabs/reaktor 0.2.2 → 0.3.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 (63) hide show
  1. package/lib/data/conversations.d.ts +3 -1
  2. package/lib/data/dynamodb.d.ts +8 -8
  3. package/lib/data/email.d.ts +2 -2
  4. package/lib/data/images.d.ts +1 -1
  5. package/lib/data/index.d.ts +1 -0
  6. package/lib/data/ios.d.ts +5 -5
  7. package/lib/data/notifications.d.ts +1 -1
  8. package/lib/data/payments.d.ts +3 -4
  9. package/lib/data/reactions.d.ts +1 -1
  10. package/lib/data/s3.d.ts +6 -6
  11. package/lib/data/subscription.d.ts +1 -1
  12. package/lib/data/websockets.d.ts +6 -0
  13. package/lib/types/payments.d.ts +1 -0
  14. package/lib/types/posts.d.ts +2 -0
  15. package/lib/utils/arangodb.d.ts +2 -1
  16. package/package.json +26 -24
  17. package/lib/config.js +0 -145
  18. package/lib/data/conversations.js +0 -226
  19. package/lib/data/dynamodb.js +0 -174
  20. package/lib/data/email.js +0 -194
  21. package/lib/data/files.js +0 -465
  22. package/lib/data/groups.js +0 -401
  23. package/lib/data/images.js +0 -899
  24. package/lib/data/index.js +0 -234
  25. package/lib/data/ios.js +0 -329
  26. package/lib/data/locations.js +0 -148
  27. package/lib/data/messages.js +0 -283
  28. package/lib/data/notifications.js +0 -59
  29. package/lib/data/payments.js +0 -800
  30. package/lib/data/posts.js +0 -690
  31. package/lib/data/reactions.js +0 -487
  32. package/lib/data/s3.js +0 -147
  33. package/lib/data/search.js +0 -113
  34. package/lib/data/sms.js +0 -79
  35. package/lib/data/subscription.js +0 -311
  36. package/lib/data/tags.js +0 -345
  37. package/lib/data/users.js +0 -419
  38. package/lib/index.js +0 -42
  39. package/lib/types/apps.js +0 -2
  40. package/lib/types/arangodb.js +0 -2
  41. package/lib/types/auth.js +0 -2
  42. package/lib/types/conversations.js +0 -2
  43. package/lib/types/email.js +0 -2
  44. package/lib/types/files.js +0 -2
  45. package/lib/types/google.js +0 -2
  46. package/lib/types/groups.js +0 -2
  47. package/lib/types/images.js +0 -2
  48. package/lib/types/index.js +0 -210
  49. package/lib/types/locations.js +0 -2
  50. package/lib/types/messages.js +0 -2
  51. package/lib/types/notifications.js +0 -2
  52. package/lib/types/payments.js +0 -2
  53. package/lib/types/posts.js +0 -2
  54. package/lib/types/reactions.js +0 -2
  55. package/lib/types/tags.js +0 -2
  56. package/lib/types/users.js +0 -2
  57. package/lib/utils/analytics.js +0 -61
  58. package/lib/utils/arangodb.js +0 -122
  59. package/lib/utils/auth.js +0 -57
  60. package/lib/utils/graphql.js +0 -19
  61. package/lib/utils/index.js +0 -78
  62. package/lib/utils/objects.js +0 -54
  63. package/lib/utils/redis.js +0 -32
@@ -1,800 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.createPaymentHold = exports.createPaymentTransfer = exports.deletePaymentAccountBank = exports.deleteCreditCard = exports.getCreditCards = exports.updateCreditCard = exports.addCreditCard = exports.addPaymentAccountCard = exports.addPaymentAccountBank = exports.addCustomerAccount = void 0;
7
-
8
- var _utils = require("@nlabs/utils");
9
-
10
- var _arangojs = require("arangojs");
11
-
12
- var _graphqlErrors = require("graphql-errors");
13
-
14
- var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
15
-
16
- var _luxon = require("luxon");
17
-
18
- var stripe = _interopRequireWildcard(require("stripe"));
19
-
20
- var _config = require("../config");
21
-
22
- var _analytics = require("../utils/analytics");
23
-
24
- var _arangodb = require("../utils/arangodb");
25
-
26
- var _users = require("./users");
27
-
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
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
31
-
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
- function _templateObject10() {
43
- var data = _taggedTemplateLiteral(["INSERT ", " IN transfers RETURN NEW"]);
44
-
45
- _templateObject10 = function _templateObject10() {
46
- return data;
47
- };
48
-
49
- return data;
50
- }
51
-
52
- function _templateObject9() {
53
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
54
-
55
- _templateObject9 = function _templateObject9() {
56
- return data;
57
- };
58
-
59
- return data;
60
- }
61
-
62
- function _templateObject8() {
63
- var data = _taggedTemplateLiteral(["REMOVE {_key:", "} IN hasPayment"]);
64
-
65
- _templateObject8 = function _templateObject8() {
66
- return data;
67
- };
68
-
69
- return data;
70
- }
71
-
72
- 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}"]);
74
-
75
- _templateObject7 = function _templateObject7() {
76
- return data;
77
- };
78
-
79
- return data;
80
- }
81
-
82
- function _templateObject6() {
83
- var data = _taggedTemplateLiteral(["FOR c IN creditCards\n FILTER c.userId == ", "\n RETURN c"]);
84
-
85
- _templateObject6 = function _templateObject6() {
86
- return data;
87
- };
88
-
89
- return data;
90
- }
91
-
92
- 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}"]);
94
-
95
- _templateObject5 = function _templateObject5() {
96
- return data;
97
- };
98
-
99
- return data;
100
- }
101
-
102
- function _templateObject4() {
103
- var data = _taggedTemplateLiteral(["INSERT ", " IN creditCards RETURN NEW"]);
104
-
105
- _templateObject4 = function _templateObject4() {
106
- return data;
107
- };
108
-
109
- return data;
110
- }
111
-
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
- function _templateObject3() {
119
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
120
-
121
- _templateObject3 = function _templateObject3() {
122
- return data;
123
- };
124
-
125
- return data;
126
- }
127
-
128
- function _templateObject2() {
129
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
130
-
131
- _templateObject2 = function _templateObject2() {
132
- return data;
133
- };
134
-
135
- return data;
136
- }
137
-
138
- function _templateObject() {
139
- var data = _taggedTemplateLiteral(["UPDATE ", " WITH ", " IN users LIMIT 1 RETURN NEW"]);
140
-
141
- _templateObject = function _templateObject() {
142
- return data;
143
- };
144
-
145
- return data;
146
- }
147
-
148
- function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
149
-
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
- var eventCategory = 'payments';
155
-
156
- var addCustomerAccount = function addCustomerAccount(context) {
157
- var action = 'addCustomerAccount';
158
- var database = context.database,
159
- sessionId = context.userId,
160
- username = context.username; // Stripe
161
-
162
- var stripeClient = stripe(_config.Config.get('stripe.token'));
163
- return stripeClient.customers.create({
164
- metadata: {
165
- userId: sessionId,
166
- username: username
167
- }
168
- }).then(function (customer) {
169
- // Create session
170
- var now = Date.now();
171
- var update = {
172
- modified: now,
173
- stripeCustomerId: customer.id
174
- };
175
- var aqlQry = (0, _arangojs.aql)(_templateObject(), sessionId, update);
176
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
177
- return cursor.next();
178
- }).then(function () {
179
- var updatedUser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
180
- return !(0, _isEmpty["default"])(updatedUser);
181
- })["catch"](function (error) {
182
- return (0, _analytics.logError)({
183
- action: action,
184
- category: eventCategory,
185
- label: 'db_error'
186
- }, error, context).then(function () {
187
- return null;
188
- });
189
- });
190
- });
191
- };
192
-
193
- exports.addCustomerAccount = addCustomerAccount;
194
-
195
- var addPaymentAccountBank = function addPaymentAccountBank(context, bankAccount) {
196
- var action = 'addPaymentAccountBank';
197
- var database = context.database,
198
- sessionId = context.userId; // Params
199
-
200
- var accountNumber = bankAccount.accountNumber,
201
- fullName = bankAccount.fullName,
202
- routing = bankAccount.routing;
203
- var formatAccount = (0, _utils.parseString)(accountNumber, 32);
204
-
205
- if (formatAccount === '') {
206
- throw new _graphqlErrors.UserError('required_account_number');
207
- }
208
-
209
- var formatFullName = (0, _utils.parseVarChar)(fullName, 128);
210
-
211
- if (formatFullName === '') {
212
- throw new _graphqlErrors.UserError('required_full_name');
213
- }
214
-
215
- var formatRouting = (0, _utils.parseString)(routing, 32);
216
-
217
- if (formatRouting === '') {
218
- throw new _graphqlErrors.UserError('required_routing_number');
219
- }
220
-
221
- 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
- }
234
- }).then(function (account) {
235
- var update = {
236
- bankAccount: account.last4,
237
- bankFullName: formatFullName,
238
- bankId: account.id,
239
- bankRouting: account.routing_number,
240
- modified: Date.now()
241
- };
242
- var aqlQry = (0, _arangojs.aql)(_templateObject2(), sessionId, update);
243
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
244
- return cursor.next();
245
- }).then(function () {
246
- var updatedUser = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
247
- return updatedUser;
248
- });
249
- })["catch"](function (error) {
250
- var msg = error.message;
251
-
252
- if (msg === 'A bank account with that routing number and account number ' + 'already exists for this customer.') {
253
- return (0, _analytics.logError)({
254
- action: action,
255
- category: eventCategory,
256
- label: 'bank_account_exists'
257
- }, error, context).then(function () {
258
- return null;
259
- });
260
- }
261
-
262
- return (0, _analytics.logError)({
263
- action: action,
264
- category: eventCategory,
265
- label: 'payment_error'
266
- }, error, context).then(function () {
267
- return null;
268
- });
269
- });
270
- });
271
- };
272
-
273
- exports.addPaymentAccountBank = addPaymentAccountBank;
274
-
275
- var addPaymentAccountCard = function addPaymentAccountCard(context, card, requestData) {
276
- var action = 'addPaymentAccountCard';
277
- var database = context.database,
278
- sessionId = context.userId;
279
- return (0, _users.getUser)(context, sessionId).then(function (user) {
280
- // 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
296
-
297
- var accountNumber = card.accountNumber,
298
- acceptedTerms = card.acceptedTerms,
299
- expMonth = card.expMonth,
300
- expYear = card.expYear,
301
- state = card.state,
302
- 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
- };
371
-
372
- exports.addPaymentAccountCard = addPaymentAccountCard;
373
-
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);
389
-
390
- if (!formatNumber) {
391
- throw new _graphqlErrors.UserError('required_credit_card_number');
392
- }
393
-
394
- var formatExpMonth = (0, _utils.parseNum)(expMonth, 2);
395
-
396
- if (!formatExpMonth) {
397
- throw new _graphqlErrors.UserError('required_credit_card_exp_month');
398
- }
399
-
400
- var formatExpYear = (0, _utils.parseNum)(expYear, 2);
401
-
402
- if (!formatExpYear) {
403
- throw new _graphqlErrors.UserError('required_credit_card_exp_year');
404
- }
405
-
406
- var formatCvc = (0, _utils.parseNum)(cvc, 3);
407
-
408
- if (!formatCvc) {
409
- throw new _graphqlErrors.UserError('required_credit_card_cvc');
410
- }
411
-
412
- var paymentCard = {};
413
- var formatCity = (0, _utils.parseVarChar)(city, 32);
414
-
415
- if (formatCity) {
416
- paymentCard.city = formatCity;
417
- }
418
-
419
- var formatCountry = (0, _utils.parseVarChar)(country, 32);
420
-
421
- if (formatCountry) {
422
- paymentCard.country = formatCountry;
423
- }
424
-
425
- var formatFullName = (0, _utils.parseVarChar)(fullName, 32);
426
-
427
- if (formatFullName) {
428
- paymentCard.fullName = formatFullName;
429
- }
430
-
431
- var formatStreet = (0, _utils.parseVarChar)(street1, 32);
432
-
433
- if (formatStreet) {
434
- paymentCard.street1 = formatStreet;
435
- }
436
-
437
- var formatState = (0, _utils.parseVarChar)(state, 32);
438
-
439
- if (formatState) {
440
- paymentCard.state = formatState;
441
- }
442
-
443
- var formatZip = (0, _utils.parseVarChar)(zip, 32);
444
-
445
- if (formatZip) {
446
- paymentCard.zip = formatZip;
447
- } // Get stripe id
448
-
449
-
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
- var now = Date.now();
471
-
472
- var insert = _objectSpread({}, paymentCard, {
473
- _key: (0, _utils.createHash)("user-payment-".concat(sessionId)),
474
- accountNumber: stripeObj.last4,
475
- added: now,
476
- brand: stripeObj.brand,
477
- cvc: stripeObj.cvc_check,
478
- expMonth: expMonth,
479
- expYear: expYear,
480
- modified: now,
481
- userId: sessionId
482
- });
483
-
484
- var insertAqlQry = (0, _arangojs.aql)(_templateObject4(), insert);
485
- return (0, _arangodb.useDb)(database).query(insertAqlQry).then(function (cursor) {
486
- return cursor.next();
487
- }).then(function () {
488
- var newCard = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
489
-
490
- if (!(0, _isEmpty["default"])(newCard)) {
491
- // Add linked edge
492
- var cardId = card._id,
493
- cardKey = card._key;
494
- var edgeCollection = (0, _arangodb.useDb)(database).edgeCollection('hasPayment');
495
- var edgeId = (0, _utils.createHash)("payment-".concat(cardKey));
496
- var edge = {
497
- _key: edgeId
498
- };
499
- return edgeCollection.save(edge, "users/".concat(sessionId), cardId).then(function () {
500
- return card;
501
- });
502
- }
503
-
504
- 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;
513
- });
514
- });
515
- });
516
- };
517
-
518
- exports.addCreditCard = addCreditCard;
519
-
520
- var updateCreditCard = function updateCreditCard(context, card) {
521
- var database = context.database,
522
- sessionId = context.userId;
523
- var city = card.city,
524
- country = card.country,
525
- expMonth = card.expMonth,
526
- expYear = card.expYear,
527
- fullName = card.fullName,
528
- id = card.id,
529
- street1 = card.street1,
530
- state = card.state,
531
- zip = card.zip;
532
- var formatId = (0, _utils.parseId)(id);
533
-
534
- if (formatId) {
535
- throw new _graphqlErrors.UserError('required_credit_card_id');
536
- }
537
-
538
- var paymentCard = {};
539
- var formatExpMonth = (0, _utils.parseNum)(expMonth, 2);
540
- var formatExpYear = (0, _utils.parseNum)(expYear, 2);
541
- var formatCity = (0, _utils.parseVarChar)(city, 32);
542
- var formatCountry = (0, _utils.parseVarChar)(country, 2);
543
- var formatFullName = (0, _utils.parseVarChar)(fullName, 32);
544
- var formatStreet1 = (0, _utils.parseString)(street1, 32);
545
- var formatState = (0, _utils.parseVarChar)(state, 2);
546
- var formatZip = (0, _utils.parseVarChar)(zip, 10);
547
-
548
- if (formatExpMonth) {
549
- paymentCard.expMonth = formatExpMonth;
550
- }
551
-
552
- if (formatExpYear) {
553
- paymentCard.expYear = formatExpYear;
554
- }
555
-
556
- if (formatCity) {
557
- paymentCard.city = formatCity;
558
- }
559
-
560
- if (formatCountry) {
561
- paymentCard.country = formatCountry;
562
- }
563
-
564
- if (formatFullName) {
565
- paymentCard.fullName = formatFullName;
566
- }
567
-
568
- if (formatStreet1) {
569
- paymentCard.street1 = formatStreet1;
570
- }
571
-
572
- if (formatState) {
573
- paymentCard.state = formatState;
574
- }
575
-
576
- if (formatZip) {
577
- paymentCard.zip = formatZip;
578
- }
579
-
580
- var update = paymentCard;
581
- var aqlQry = (0, _arangojs.aql)(_templateObject5(), formatId, sessionId, update, sessionId);
582
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
583
- return cursor.next();
584
- }).then(function () {
585
- var results = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
586
- card: {},
587
- user: {}
588
- };
589
- var updatedCard = results.card;
590
- var user = results.user;
591
-
592
- if ((0, _isEmpty["default"])(updatedCard)) {
593
- throw new _graphqlErrors.UserError('not_found');
594
- } // Stripe
595
-
596
-
597
- var stripeClient = stripe(_config.Config.get('stripe.token'));
598
- return stripeClient.customers.updateCard(user.stripeCustomerId, card.stripeId, {
599
- address_city: formatCity,
600
- address_country: formatCountry,
601
- address_line1: formatStreet1,
602
- address_state: formatState,
603
- address_zip: formatZip,
604
- exp_month: formatExpMonth,
605
- exp_year: formatExpYear,
606
- name: formatFullName
607
- }).then(function () {
608
- return card;
609
- })["catch"](function (error) {
610
- console.log('payments::updateCard::error', error);
611
- throw new _graphqlErrors.UserError('payment_error');
612
- });
613
- });
614
- };
615
-
616
- exports.updateCreditCard = updateCreditCard;
617
-
618
- var getCreditCards = function getCreditCards(context) {
619
- var action = 'getCreditCards';
620
- var database = context.database,
621
- sessionId = context.userId;
622
- var aqlQry = (0, _arangojs.aql)(_templateObject6(), sessionId);
623
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
624
- return cursor.all();
625
- }).then(function () {
626
- var list = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
627
- return list;
628
- })["catch"](function (error) {
629
- return (0, _analytics.logError)({
630
- action: action,
631
- category: eventCategory,
632
- label: 'db_error'
633
- }, error, context).then(function () {
634
- return null;
635
- });
636
- });
637
- };
638
-
639
- exports.getCreditCards = getCreditCards;
640
-
641
- var deleteCreditCard = function deleteCreditCard(context, cardId) {
642
- var database = context.database,
643
- sessionId = context.userId;
644
- var formatCardId = (0, _utils.parseId)(cardId);
645
- var aqlQry = (0, _arangojs.aql)(_templateObject7(), formatCardId, sessionId, sessionId);
646
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
647
- return cursor.next();
648
- }).then(function () {
649
- var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
650
- card: {},
651
- user: {}
652
- };
653
-
654
- if ((0, _isEmpty["default"])(result)) {
655
- return false;
656
- }
657
-
658
- var card = result.card,
659
- user = result.user;
660
- var cardKey = card._key; // Remove linked edges
661
-
662
- var edgeCollection = (0, _arangodb.useDb)(database).edgeCollection('hasPayment');
663
- return edgeCollection.outEdges(cardKey).then(function (edges) {
664
- if (edges.length) {
665
- return Promise.all(edges.map(function (edge) {
666
- var edgeKey = edge._key;
667
- var removeAqlQry = (0, _arangojs.aql)(_templateObject8(), edgeKey);
668
- return (0, _arangodb.useDb)(database).query(removeAqlQry);
669
- })).then(function () {
670
- // Stripe
671
- var stripeClient = stripe(_config.Config.get('stripe.token'));
672
- return stripeClient.customers.deleteCard(user.stripeCustomerId, card.stripeId).then(function () {
673
- return true;
674
- })["catch"](function (error) {
675
- console.log('payments::deleteCard::error', error);
676
- throw new _graphqlErrors.UserError('payment_error');
677
- });
678
- });
679
- }
680
-
681
- return false;
682
- });
683
- });
684
- };
685
-
686
- exports.deleteCreditCard = deleteCreditCard;
687
-
688
- var deletePaymentAccountBank = function deletePaymentAccountBank(context, bankId) {
689
- var database = context.database,
690
- sessionId = context.userId; // Clean db
691
-
692
- var update = {
693
- bankAccount: '',
694
- bankFullName: '',
695
- bankId: '',
696
- bankRouting: '',
697
- modified: Date.now()
698
- };
699
- var aqlQry = (0, _arangojs.aql)(_templateObject9(), sessionId, update);
700
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
701
- return cursor.next();
702
- }).then(function () {
703
- 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 () {
707
- var response = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {
708
- deleted: false
709
- };
710
- return response.deleted;
711
- })["catch"](function () {
712
- return Promise.resolve(false);
713
- });
714
- });
715
- };
716
-
717
- exports.deletePaymentAccountBank = deletePaymentAccountBank;
718
-
719
- var createPaymentTransfer = function createPaymentTransfer(context, transfer) {
720
- var database = context.database,
721
- sessionId = context.userId;
722
- var amount = transfer.amount,
723
- currency = transfer.currency;
724
- var formatAmount = (0, _utils.parseNum)(amount);
725
- var formatCurrency = (0, _utils.parseChar)(currency, 3, 'USD').toUpperCase();
726
- return (0, _users.getUser)(context, sessionId).then(function (user) {
727
- // Stripe
728
- var stripeClient = stripe(_config.Config.get('stripe.token'));
729
- return stripeClient.transfers.create({
730
- amount: formatAmount,
731
- currency: formatCurrency,
732
- destination: user.stripeAccountId
733
- }).then(function (stripeTransfer) {
734
- console.log(stripeTransfer);
735
- var now = Date.now();
736
- var insert = {
737
- added: now,
738
- amount: formatAmount,
739
- currency: formatCurrency,
740
- modified: now,
741
- userId: sessionId
742
- };
743
- var aqlQry = (0, _arangojs.aql)(_templateObject10(), insert);
744
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
745
- return cursor.next();
746
- }).then(function (newTransfer) {
747
- return newTransfer;
748
- });
749
- });
750
- });
751
- };
752
-
753
- exports.createPaymentTransfer = createPaymentTransfer;
754
-
755
- var createPaymentHold = function createPaymentHold(context, payment) {
756
- var database = context.database,
757
- sessionId = context.userId;
758
- var amount = payment.amount,
759
- capture = payment.capture,
760
- cardId = payment.cardId,
761
- currency = payment.currency,
762
- description = payment.description;
763
- var formatCurrency = (0, _utils.parseChar)(currency, 3, 'USD').toUpperCase();
764
- var stripeClient = stripe(_config.Config.get('stripe.token'));
765
- return stripeClient.charges.create({
766
- amount: amount,
767
- capture: capture,
768
- currency: formatCurrency,
769
- description: description,
770
- source: cardId
771
- }).then(function (stripeCharge) {
772
- var now = Date.now();
773
- var insert = {
774
- added: now,
775
- amount: amount,
776
- capture: capture,
777
- cardId: cardId,
778
- chargeFailCode: stripeCharge.failure_code,
779
- chargeFailMsg: stripeCharge.failure_message,
780
- chargeId: stripeCharge.id,
781
- chargeStatus: stripeCharge.status,
782
- currency: formatCurrency,
783
- description: description,
784
- modified: now,
785
- userId: sessionId
786
- };
787
- var aqlQry = (0, _arangojs.aql)(_templateObject11(), insert);
788
- return (0, _arangodb.useDb)(database).query(aqlQry).then(function (cursor) {
789
- return cursor.next();
790
- }).then(function (newPayment) {
791
- return newPayment;
792
- });
793
- })["catch"](function (error) {
794
- console.log('payments::createHold::error', error);
795
- throw new _graphqlErrors.UserError('payment_error');
796
- });
797
- };
798
-
799
- 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==