@pmcretail/mapper-library 0.0.39 → 0.0.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/RJ-mapper.class.mjs +875 -0
- package/esm2022/lib/TransactionDocumentBuilder.mjs +1240 -0
- package/esm2022/lib/WebReturn-mapper.class.mjs +324 -0
- package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +410 -0
- package/esm2022/lib/basket.service.mjs +516 -0
- package/esm2022/lib/mapper-library.component.mjs +22 -0
- package/esm2022/lib/mapper-library.model.mjs +39 -0
- package/esm2022/lib/mapper-library.module.mjs +21 -0
- package/esm2022/lib/number-util.service.mjs +40 -0
- package/esm2022/pmcretail-mapper-library.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/pmcretail-mapper-library.mjs +3482 -0
- package/fesm2022/pmcretail-mapper-library.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/RJ-mapper.class.d.ts +80 -79
- package/lib/RJ-mapper.class.d.ts.map +1 -0
- package/lib/TransactionDocumentBuilder.d.ts +271 -270
- package/lib/TransactionDocumentBuilder.d.ts.map +1 -0
- package/lib/WebReturn-mapper.class.d.ts +27 -26
- package/lib/WebReturn-mapper.class.d.ts.map +1 -0
- package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
- package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -0
- package/lib/basket.service.d.ts +105 -103
- package/lib/basket.service.d.ts.map +1 -0
- package/lib/mapper-library.component.d.ts +9 -5
- package/lib/mapper-library.component.d.ts.map +1 -0
- package/lib/mapper-library.model.d.ts +694 -693
- package/lib/mapper-library.model.d.ts.map +1 -0
- package/lib/mapper-library.module.d.ts +8 -2
- package/lib/mapper-library.module.d.ts.map +1 -0
- package/lib/number-util.service.d.ts +13 -9
- package/lib/number-util.service.d.ts.map +1 -0
- package/package.json +20 -16
- package/pmcretail-mapper-library.d.ts.map +1 -0
- package/public-api.d.ts +6 -5
- package/public-api.d.ts.map +1 -0
- package/bundles/pmcretail-mapper-library.umd.js +0 -8542
- package/bundles/pmcretail-mapper-library.umd.js.map +0 -1
- package/bundles/pmcretail-mapper-library.umd.min.js +0 -16
- package/bundles/pmcretail-mapper-library.umd.min.js.map +0 -1
- package/esm2015/lib/RJ-mapper.class.js +0 -1464
- package/esm2015/lib/TransactionDocumentBuilder.js +0 -1535
- package/esm2015/lib/WebReturn-mapper.class.js +0 -501
- package/esm2015/lib/WebReturnSalesforceMapper.class.js +0 -683
- package/esm2015/lib/basket.service.js +0 -851
- package/esm2015/lib/mapper-library.component.js +0 -27
- package/esm2015/lib/mapper-library.model.js +0 -1442
- package/esm2015/lib/mapper-library.module.js +0 -21
- package/esm2015/lib/number-util.service.js +0 -78
- package/esm2015/pmcretail-mapper-library.js +0 -10
- package/esm2015/public-api.js +0 -14
- package/esm5/lib/RJ-mapper.class.js +0 -1762
- package/esm5/lib/TransactionDocumentBuilder.js +0 -2469
- package/esm5/lib/WebReturn-mapper.class.js +0 -592
- package/esm5/lib/WebReturnSalesforceMapper.class.js +0 -857
- package/esm5/lib/basket.service.js +0 -1076
- package/esm5/lib/mapper-library.component.js +0 -29
- package/esm5/lib/mapper-library.model.js +0 -1442
- package/esm5/lib/mapper-library.module.js +0 -25
- package/esm5/lib/number-util.service.js +0 -95
- package/esm5/pmcretail-mapper-library.js +0 -10
- package/esm5/public-api.js +0 -14
- package/fesm2015/pmcretail-mapper-library.js +0 -6594
- package/fesm2015/pmcretail-mapper-library.js.map +0 -1
- package/fesm5/pmcretail-mapper-library.js +0 -8326
- package/fesm5/pmcretail-mapper-library.js.map +0 -1
- package/pmcretail-mapper-library.d.ts +0 -5
- package/pmcretail-mapper-library.metadata.json +0 -1
|
@@ -1,1076 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/basket.service.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import * as tslib_1 from "tslib";
|
|
7
|
-
import { BehaviorSubject } from 'rxjs';
|
|
8
|
-
import { DELIVERY_METHODS } from './mapper-library.model';
|
|
9
|
-
var BasketService = /** @class */ (function () {
|
|
10
|
-
function BasketService(numberUtilService) {
|
|
11
|
-
this.numberUtilService = numberUtilService;
|
|
12
|
-
this.currentBasket = {
|
|
13
|
-
products: [],
|
|
14
|
-
transactionDiscount: [],
|
|
15
|
-
quantity: 0,
|
|
16
|
-
total: 0,
|
|
17
|
-
saleTotal: 0,
|
|
18
|
-
baseCurrency: ''
|
|
19
|
-
};
|
|
20
|
-
this.basketSource = new BehaviorSubject(null);
|
|
21
|
-
this.basket = this.basketSource.asObservable();
|
|
22
|
-
this.productSource = new BehaviorSubject(null);
|
|
23
|
-
this.product = this.productSource.asObservable();
|
|
24
|
-
this.peerSource = new BehaviorSubject(false);
|
|
25
|
-
this.peerSync = this.peerSource.asObservable();
|
|
26
|
-
this.scanSource = new BehaviorSubject(false);
|
|
27
|
-
this.scanner = this.scanSource.asObservable();
|
|
28
|
-
}
|
|
29
|
-
Object.defineProperty(BasketService.prototype, "isMixedBasketSales", {
|
|
30
|
-
get: /**
|
|
31
|
-
* @return {?}
|
|
32
|
-
*/
|
|
33
|
-
function () {
|
|
34
|
-
return this._isMixedBasketSales;
|
|
35
|
-
},
|
|
36
|
-
set: /**
|
|
37
|
-
* @param {?} v
|
|
38
|
-
* @return {?}
|
|
39
|
-
*/
|
|
40
|
-
function (v) {
|
|
41
|
-
this._isMixedBasketSales = v;
|
|
42
|
-
},
|
|
43
|
-
enumerable: true,
|
|
44
|
-
configurable: true
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* @param {?} basket
|
|
48
|
-
* @return {?}
|
|
49
|
-
*/
|
|
50
|
-
BasketService.prototype.updateBasket = /**
|
|
51
|
-
* @param {?} basket
|
|
52
|
-
* @return {?}
|
|
53
|
-
*/
|
|
54
|
-
function (basket) {
|
|
55
|
-
this.currentBasket = basket;
|
|
56
|
-
this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
|
|
57
|
-
this.basketSource.next(basket);
|
|
58
|
-
};
|
|
59
|
-
/**
|
|
60
|
-
* calculates the total basket value and quantity
|
|
61
|
-
* @param null
|
|
62
|
-
* @returns void
|
|
63
|
-
*/
|
|
64
|
-
/**
|
|
65
|
-
* calculates the total basket value and quantity
|
|
66
|
-
* @param {?} basketDetails
|
|
67
|
-
* @param {?} basketState
|
|
68
|
-
* @return {?} void
|
|
69
|
-
*/
|
|
70
|
-
BasketService.prototype.updateBasketTotal = /**
|
|
71
|
-
* calculates the total basket value and quantity
|
|
72
|
-
* @param {?} basketDetails
|
|
73
|
-
* @param {?} basketState
|
|
74
|
-
* @return {?} void
|
|
75
|
-
*/
|
|
76
|
-
function (basketDetails, basketState) {
|
|
77
|
-
var e_1, _a;
|
|
78
|
-
basketDetails.quantity = 0;
|
|
79
|
-
basketDetails.total = 0;
|
|
80
|
-
try {
|
|
81
|
-
for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
82
|
-
var p = _c.value;
|
|
83
|
-
basketDetails.quantity = basketDetails.quantity + p.quantity;
|
|
84
|
-
basketDetails.total =
|
|
85
|
-
this.numberUtilService.trimTo2Decimal(basketDetails.total) +
|
|
86
|
-
this.numberUtilService.trimTo2Decimal(p.total);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
90
|
-
finally {
|
|
91
|
-
try {
|
|
92
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
93
|
-
}
|
|
94
|
-
finally { if (e_1) throw e_1.error; }
|
|
95
|
-
}
|
|
96
|
-
console.log("e:basket :basket service : basketDetails updated values for transaction id", basketDetails.transactionId, JSON.stringify(basketDetails));
|
|
97
|
-
basketDetails.basketTotal = basketDetails.total;
|
|
98
|
-
basketState.updateBasket(basketDetails);
|
|
99
|
-
};
|
|
100
|
-
/**
|
|
101
|
-
* add Line promotion
|
|
102
|
-
* @param null
|
|
103
|
-
* @returns basketDetails
|
|
104
|
-
*/
|
|
105
|
-
/**
|
|
106
|
-
* add Line promotion
|
|
107
|
-
* @param {?} promotionList
|
|
108
|
-
* @param {?} basketDetails
|
|
109
|
-
* @return {?} basketDetails
|
|
110
|
-
*/
|
|
111
|
-
BasketService.prototype.addlinePromotion = /**
|
|
112
|
-
* add Line promotion
|
|
113
|
-
* @param {?} promotionList
|
|
114
|
-
* @param {?} basketDetails
|
|
115
|
-
* @return {?} basketDetails
|
|
116
|
-
*/
|
|
117
|
-
function (promotionList, basketDetails) {
|
|
118
|
-
var e_2, _a, e_3, _b;
|
|
119
|
-
console.log("e:basket :basket Service : promotionList and basketDetails for linePromotions", JSON.stringify(promotionList), JSON.stringify(basketDetails));
|
|
120
|
-
if (promotionList &&
|
|
121
|
-
promotionList.result &&
|
|
122
|
-
promotionList.result.linePromotions &&
|
|
123
|
-
promotionList.result.linePromotions.length > 0) {
|
|
124
|
-
try {
|
|
125
|
-
for (var _c = tslib_1.__values(basketDetails.products), _d = _c.next(); !_d.done; _d = _c.next()) {
|
|
126
|
-
var element = _d.value;
|
|
127
|
-
try {
|
|
128
|
-
for (var _e = (e_3 = void 0, tslib_1.__values(promotionList.result.linePromotions)), _f = _e.next(); !_f.done; _f = _e.next()) {
|
|
129
|
-
var promotionelement = _f.value;
|
|
130
|
-
if (element.itemLineId.toString() ===
|
|
131
|
-
promotionelement.itemLineId.toString()) {
|
|
132
|
-
element.linePromotions = promotionelement;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
catch (e_3_1) { e_3 = { error: e_3_1 }; }
|
|
137
|
-
finally {
|
|
138
|
-
try {
|
|
139
|
-
if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
|
|
140
|
-
}
|
|
141
|
-
finally { if (e_3) throw e_3.error; }
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
146
|
-
finally {
|
|
147
|
-
try {
|
|
148
|
-
if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
|
|
149
|
-
}
|
|
150
|
-
finally { if (e_2) throw e_2.error; }
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return basketDetails;
|
|
154
|
-
};
|
|
155
|
-
/**
|
|
156
|
-
* add Transaction promotion
|
|
157
|
-
* @param null
|
|
158
|
-
* @returns basketDetails
|
|
159
|
-
*/
|
|
160
|
-
/**
|
|
161
|
-
* add Transaction promotion
|
|
162
|
-
* @param {?} promotionList
|
|
163
|
-
* @param {?} basketdetails
|
|
164
|
-
* @return {?} basketDetails
|
|
165
|
-
*/
|
|
166
|
-
BasketService.prototype.addTransactionPromotion = /**
|
|
167
|
-
* add Transaction promotion
|
|
168
|
-
* @param {?} promotionList
|
|
169
|
-
* @param {?} basketdetails
|
|
170
|
-
* @return {?} basketDetails
|
|
171
|
-
*/
|
|
172
|
-
function (promotionList, basketdetails) {
|
|
173
|
-
var _this = this;
|
|
174
|
-
console.log("e:basket :basket Service : promotionList and basketDetails for transactionPromotion", JSON.stringify(promotionList), JSON.stringify(basketdetails), JSON.stringify(basketdetails.transactionPromotion));
|
|
175
|
-
if (promotionList &&
|
|
176
|
-
promotionList.result &&
|
|
177
|
-
promotionList.result.transactionPromotion &&
|
|
178
|
-
promotionList.result.transactionPromotion.length > 0) {
|
|
179
|
-
promotionList.result.transactionPromotion.forEach((/**
|
|
180
|
-
* @param {?} tPromotion
|
|
181
|
-
* @return {?}
|
|
182
|
-
*/
|
|
183
|
-
function (tPromotion) {
|
|
184
|
-
/** @type {?} */
|
|
185
|
-
var transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
|
|
186
|
-
transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((/**
|
|
187
|
-
* @param {?} product
|
|
188
|
-
* @return {?}
|
|
189
|
-
*/
|
|
190
|
-
function (product) {
|
|
191
|
-
return product.itemLineId;
|
|
192
|
-
}));
|
|
193
|
-
if (!basketdetails.transactionPromotion) {
|
|
194
|
-
basketdetails.transactionPromotion = [];
|
|
195
|
-
}
|
|
196
|
-
basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
|
|
197
|
-
basketdetails = _this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
|
|
198
|
-
}));
|
|
199
|
-
}
|
|
200
|
-
console.log("basket details in refund calculation file", JSON.stringify(basketdetails));
|
|
201
|
-
return basketdetails;
|
|
202
|
-
};
|
|
203
|
-
/**
|
|
204
|
-
* @param {?} basketDetails
|
|
205
|
-
* @return {?}
|
|
206
|
-
*/
|
|
207
|
-
BasketService.prototype.updateProductTotalForSummary = /**
|
|
208
|
-
* @param {?} basketDetails
|
|
209
|
-
* @return {?}
|
|
210
|
-
*/
|
|
211
|
-
function (basketDetails) {
|
|
212
|
-
/*sale- product refundedQuantity = undefined
|
|
213
|
-
partial refund - product refundedQuantity is > 0
|
|
214
|
-
total refund - proudct refundedQuantity is > 0
|
|
215
|
-
exchange - exchange product refundedQuantity is > 0
|
|
216
|
-
new product refundedQuantity = undefined
|
|
217
|
-
old product without exchange refundedQuantity = 0
|
|
218
|
-
unreference refund-product refundedQuantity is > 0 */
|
|
219
|
-
var e_4, _a;
|
|
220
|
-
basketDetails.total = 0;
|
|
221
|
-
basketDetails.quantity = 0;
|
|
222
|
-
try {
|
|
223
|
-
for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
224
|
-
var product = _c.value;
|
|
225
|
-
if (product.linePromotions) {
|
|
226
|
-
product.total = product.linePromotions.promotionLinePrice;
|
|
227
|
-
}
|
|
228
|
-
else if (product.lineDiscount && !product.linePromotions) {
|
|
229
|
-
product.total = product.lineDiscount.discountedLinePrice;
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
product.total = product.totalLinePrice;
|
|
233
|
-
}
|
|
234
|
-
product.total =
|
|
235
|
-
product.total -
|
|
236
|
-
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
237
|
-
basketDetails.total += product.total;
|
|
238
|
-
basketDetails.quantity =
|
|
239
|
-
basketDetails.quantity +
|
|
240
|
-
(product.quantity -
|
|
241
|
-
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
242
|
-
console.log("e-basket:ExchangeSummaryScreen:update basketdetails total :" +
|
|
243
|
-
basketDetails.total +
|
|
244
|
-
" Product line ID : " +
|
|
245
|
-
product.itemLineId +
|
|
246
|
-
" product total : " +
|
|
247
|
-
product.total, "quantity : " + basketDetails.quantity);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
catch (e_4_1) { e_4 = { error: e_4_1 }; }
|
|
251
|
-
finally {
|
|
252
|
-
try {
|
|
253
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
254
|
-
}
|
|
255
|
-
finally { if (e_4) throw e_4.error; }
|
|
256
|
-
}
|
|
257
|
-
return this.updateBasketTotalForSummary(basketDetails);
|
|
258
|
-
};
|
|
259
|
-
/**
|
|
260
|
-
* @param {?} basketDetails
|
|
261
|
-
* @return {?}
|
|
262
|
-
*/
|
|
263
|
-
BasketService.prototype.updateBasketTotalForSummary = /**
|
|
264
|
-
* @param {?} basketDetails
|
|
265
|
-
* @return {?}
|
|
266
|
-
*/
|
|
267
|
-
function (basketDetails) {
|
|
268
|
-
basketDetails.basketTotal = basketDetails.total;
|
|
269
|
-
console.info("ebasket : basket Service : update Basket Total for transaction transactionDiscount ", JSON.stringify(basketDetails.transactionDiscount));
|
|
270
|
-
console.info("ebasket : basket Service : update Basket Total for transaction transactionPromotion ", JSON.stringify(basketDetails.transactionPromotion));
|
|
271
|
-
basketDetails = this.updateTransactionPromotion(basketDetails);
|
|
272
|
-
basketDetails = this.updateTransactionDiscount(basketDetails);
|
|
273
|
-
basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
|
|
274
|
-
console.info("ebasket : basket Service : update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
|
|
275
|
-
return basketDetails;
|
|
276
|
-
};
|
|
277
|
-
/**
|
|
278
|
-
* @param {?} basketDetails
|
|
279
|
-
* @return {?}
|
|
280
|
-
*/
|
|
281
|
-
BasketService.prototype.updateTransactionDiscount = /**
|
|
282
|
-
* @param {?} basketDetails
|
|
283
|
-
* @return {?}
|
|
284
|
-
*/
|
|
285
|
-
function (basketDetails) {
|
|
286
|
-
if (basketDetails.transactionDiscount &&
|
|
287
|
-
basketDetails.transactionDiscount.length > 0) {
|
|
288
|
-
/** @type {?} */
|
|
289
|
-
var discountTotal = basketDetails.transactionDiscount.reduce((/**
|
|
290
|
-
* @param {?} n
|
|
291
|
-
* @param {?} __1
|
|
292
|
-
* @return {?}
|
|
293
|
-
*/
|
|
294
|
-
function (n, _a) {
|
|
295
|
-
var discountAmount = _a.discountAmount;
|
|
296
|
-
return n + discountAmount;
|
|
297
|
-
}), 0);
|
|
298
|
-
console.log("ebasket : basket Service : discountTotal ", discountTotal);
|
|
299
|
-
basketDetails.basketTotal =
|
|
300
|
-
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
301
|
-
}
|
|
302
|
-
return basketDetails;
|
|
303
|
-
};
|
|
304
|
-
/**
|
|
305
|
-
* @param {?} basketDetails
|
|
306
|
-
* @return {?}
|
|
307
|
-
*/
|
|
308
|
-
BasketService.prototype.updateTransactionPromotion = /**
|
|
309
|
-
* @param {?} basketDetails
|
|
310
|
-
* @return {?}
|
|
311
|
-
*/
|
|
312
|
-
function (basketDetails) {
|
|
313
|
-
if (basketDetails.transactionPromotion &&
|
|
314
|
-
basketDetails.transactionPromotion.length > 0) {
|
|
315
|
-
/** @type {?} */
|
|
316
|
-
var discountTotal = basketDetails.transactionPromotion.reduce((/**
|
|
317
|
-
* @param {?} n
|
|
318
|
-
* @param {?} __1
|
|
319
|
-
* @return {?}
|
|
320
|
-
*/
|
|
321
|
-
function (n, _a) {
|
|
322
|
-
var promotionAmount = _a.promotionAmount;
|
|
323
|
-
return n + promotionAmount;
|
|
324
|
-
}), 0);
|
|
325
|
-
basketDetails.basketTotal =
|
|
326
|
-
basketDetails.basketTotal - Math.abs(discountTotal);
|
|
327
|
-
}
|
|
328
|
-
return basketDetails;
|
|
329
|
-
};
|
|
330
|
-
/**
|
|
331
|
-
* @param {?} basket
|
|
332
|
-
* @return {?}
|
|
333
|
-
*/
|
|
334
|
-
BasketService.prototype.updateBasketTotalWithoutDiscount = /**
|
|
335
|
-
* @param {?} basket
|
|
336
|
-
* @return {?}
|
|
337
|
-
*/
|
|
338
|
-
function (basket) {
|
|
339
|
-
var e_5, _a;
|
|
340
|
-
basket.total = 0;
|
|
341
|
-
basket.quantity = 0;
|
|
342
|
-
try {
|
|
343
|
-
for (var _b = tslib_1.__values(basket.products), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
344
|
-
var product = _c.value;
|
|
345
|
-
if (product.linePromotions) {
|
|
346
|
-
product.total = product.linePromotions.promotionLinePrice;
|
|
347
|
-
}
|
|
348
|
-
else if (product.lineDiscount && !product.linePromotions) {
|
|
349
|
-
product.total = product.lineDiscount.discountedLinePrice || 0;
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
product.total = product.totalLinePrice;
|
|
353
|
-
}
|
|
354
|
-
product.total =
|
|
355
|
-
product.total -
|
|
356
|
-
Math.abs(product.refundedTotal ? product.refundedTotal : 0);
|
|
357
|
-
basket.total += product.total;
|
|
358
|
-
basket.quantity =
|
|
359
|
-
basket.quantity +
|
|
360
|
-
(product.quantity -
|
|
361
|
-
(product.refundedQuantity ? product.refundedQuantity : 0));
|
|
362
|
-
console.log("e-basket:basket service:update basketdetails total :" +
|
|
363
|
-
JSON.stringify(basket) +
|
|
364
|
-
basket.total +
|
|
365
|
-
" Product line ID : " +
|
|
366
|
-
product.itemLineId +
|
|
367
|
-
" product total : " +
|
|
368
|
-
product.total);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
catch (e_5_1) { e_5 = { error: e_5_1 }; }
|
|
372
|
-
finally {
|
|
373
|
-
try {
|
|
374
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
375
|
-
}
|
|
376
|
-
finally { if (e_5) throw e_5.error; }
|
|
377
|
-
}
|
|
378
|
-
basket.basketTotal = basket.total;
|
|
379
|
-
return basket;
|
|
380
|
-
};
|
|
381
|
-
/**
|
|
382
|
-
* @param {?} basket
|
|
383
|
-
* @return {?}
|
|
384
|
-
*/
|
|
385
|
-
BasketService.prototype.updateBasketTotalWithDiscounts = /**
|
|
386
|
-
* @param {?} basket
|
|
387
|
-
* @return {?}
|
|
388
|
-
*/
|
|
389
|
-
function (basket) {
|
|
390
|
-
console.log("e:basket :RefundBasketScreen : this.basketDetails new values", basket, JSON.stringify(basket.basketTotal));
|
|
391
|
-
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
392
|
-
/** @type {?} */
|
|
393
|
-
var discountTotal = basket.transactionPromotion.reduce((/**
|
|
394
|
-
* @param {?} n
|
|
395
|
-
* @param {?} __1
|
|
396
|
-
* @return {?}
|
|
397
|
-
*/
|
|
398
|
-
function (n, _a) {
|
|
399
|
-
var promotionAmount = _a.promotionAmount;
|
|
400
|
-
return n + promotionAmount;
|
|
401
|
-
}), 0);
|
|
402
|
-
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
403
|
-
}
|
|
404
|
-
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
405
|
-
/** @type {?} */
|
|
406
|
-
var discountTotal = basket.transactionDiscount.reduce((/**
|
|
407
|
-
* @param {?} n
|
|
408
|
-
* @param {?} __1
|
|
409
|
-
* @return {?}
|
|
410
|
-
*/
|
|
411
|
-
function (n, _a) {
|
|
412
|
-
var discountAmount = _a.discountAmount;
|
|
413
|
-
return n + discountAmount;
|
|
414
|
-
}), 0);
|
|
415
|
-
basket.basketTotal = basket.basketTotal - discountTotal;
|
|
416
|
-
}
|
|
417
|
-
console.log("e:basket :RefundBasketScreen : basket new values", JSON.stringify(basket));
|
|
418
|
-
return basket;
|
|
419
|
-
};
|
|
420
|
-
/**
|
|
421
|
-
* @param {?} basket
|
|
422
|
-
* @return {?}
|
|
423
|
-
*/
|
|
424
|
-
BasketService.prototype.transactionDiscountAndPromotionProductortionCalculation = /**
|
|
425
|
-
* @param {?} basket
|
|
426
|
-
* @return {?}
|
|
427
|
-
*/
|
|
428
|
-
function (basket) {
|
|
429
|
-
var _this = this;
|
|
430
|
-
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
431
|
-
basket.transactionDiscount.forEach((/**
|
|
432
|
-
* @param {?} discount
|
|
433
|
-
* @return {?}
|
|
434
|
-
*/
|
|
435
|
-
function (discount) {
|
|
436
|
-
return (basket = _this.transactionDiscountProductPortionCalc(basket, discount));
|
|
437
|
-
}));
|
|
438
|
-
}
|
|
439
|
-
if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
|
|
440
|
-
basket.transactionPromotion.forEach((/**
|
|
441
|
-
* @param {?} promotion
|
|
442
|
-
* @return {?}
|
|
443
|
-
*/
|
|
444
|
-
function (promotion) {
|
|
445
|
-
basket = _this.transactionPromotionProductPortionCalc(basket, promotion);
|
|
446
|
-
}));
|
|
447
|
-
}
|
|
448
|
-
console.log("ebasket: basket item discount protion calculation", basket, basket.products);
|
|
449
|
-
return basket;
|
|
450
|
-
};
|
|
451
|
-
/**
|
|
452
|
-
* @param {?} basket
|
|
453
|
-
* @param {?} promotion
|
|
454
|
-
* @return {?}
|
|
455
|
-
*/
|
|
456
|
-
BasketService.prototype.transactionPromotionProductPortionCalc = /**
|
|
457
|
-
* @param {?} basket
|
|
458
|
-
* @param {?} promotion
|
|
459
|
-
* @return {?}
|
|
460
|
-
*/
|
|
461
|
-
function (basket, promotion) {
|
|
462
|
-
var _this = this;
|
|
463
|
-
/** @type {?} */
|
|
464
|
-
var total = 0;
|
|
465
|
-
/** @type {?} */
|
|
466
|
-
var percentage = 0;
|
|
467
|
-
{
|
|
468
|
-
basket.products.forEach((/**
|
|
469
|
-
* @param {?} p
|
|
470
|
-
* @return {?}
|
|
471
|
-
*/
|
|
472
|
-
function (p) {
|
|
473
|
-
if (promotion.itemLineIds.includes(p.itemLineId)) {
|
|
474
|
-
p = _this.validateProductItemDiscount(p);
|
|
475
|
-
/** @type {?} */
|
|
476
|
-
var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
477
|
-
_this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
478
|
-
_this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
479
|
-
total += (p.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
480
|
-
}
|
|
481
|
-
}));
|
|
482
|
-
console.log("ebasket: trnsactionPromotion: " + JSON.stringify(promotion) + ", selected products total: " + total);
|
|
483
|
-
basket.products.forEach((/**
|
|
484
|
-
* @param {?} product
|
|
485
|
-
* @return {?}
|
|
486
|
-
*/
|
|
487
|
-
function (product) {
|
|
488
|
-
product = _this.validateProductItemDiscount(product);
|
|
489
|
-
/** @type {?} */
|
|
490
|
-
var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
491
|
-
_this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
492
|
-
_this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
493
|
-
if (promotion.itemLineIds.includes(product.itemLineId)) {
|
|
494
|
-
percentage = ((product.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
495
|
-
product.itemDiscounts.trnPromotionsPortion +=
|
|
496
|
-
(promotion.promotionAmount * percentage) / 100;
|
|
497
|
-
product.itemDiscounts.trnPromotionsPortion = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
|
|
498
|
-
}
|
|
499
|
-
}));
|
|
500
|
-
}
|
|
501
|
-
return basket;
|
|
502
|
-
};
|
|
503
|
-
/**
|
|
504
|
-
* @param {?} basket
|
|
505
|
-
* @param {?} discount
|
|
506
|
-
* @return {?}
|
|
507
|
-
*/
|
|
508
|
-
BasketService.prototype.transactionDiscountProductPortionCalc = /**
|
|
509
|
-
* @param {?} basket
|
|
510
|
-
* @param {?} discount
|
|
511
|
-
* @return {?}
|
|
512
|
-
*/
|
|
513
|
-
function (basket, discount) {
|
|
514
|
-
var _this = this;
|
|
515
|
-
/** @type {?} */
|
|
516
|
-
var total = 0;
|
|
517
|
-
/** @type {?} */
|
|
518
|
-
var percentage = 0;
|
|
519
|
-
basket.products.forEach((/**
|
|
520
|
-
* @param {?} p
|
|
521
|
-
* @return {?}
|
|
522
|
-
*/
|
|
523
|
-
function (p) {
|
|
524
|
-
if (discount.itemLineIds.includes(p.itemLineId)) {
|
|
525
|
-
p = _this.validateProductItemDiscount(p);
|
|
526
|
-
/** @type {?} */
|
|
527
|
-
var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
|
|
528
|
-
_this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
|
|
529
|
-
_this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
|
|
530
|
-
total += (p.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
|
|
531
|
-
}
|
|
532
|
-
}));
|
|
533
|
-
console.log("ebasket: trnsactionDiscount: " + JSON.stringify(discount) + ", selected products total: " + total);
|
|
534
|
-
basket.products.forEach((/**
|
|
535
|
-
* @param {?} product
|
|
536
|
-
* @return {?}
|
|
537
|
-
*/
|
|
538
|
-
function (product) {
|
|
539
|
-
product = _this.validateProductItemDiscount(product);
|
|
540
|
-
console.log(product.discountable, "ebasket : basket service : discountable in basket service");
|
|
541
|
-
/** @type {?} */
|
|
542
|
-
var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
|
|
543
|
-
_this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
|
|
544
|
-
_this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
|
|
545
|
-
if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
|
|
546
|
-
percentage = ((product.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
|
|
547
|
-
product.itemDiscounts.trnDiscountsPortion +=
|
|
548
|
-
(discount.discountAmount * percentage) / 100;
|
|
549
|
-
product.itemDiscounts.trnDiscountsPortion = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
|
|
550
|
-
}
|
|
551
|
-
}));
|
|
552
|
-
return basket;
|
|
553
|
-
};
|
|
554
|
-
/**
|
|
555
|
-
* @param {?} product
|
|
556
|
-
* @return {?}
|
|
557
|
-
*/
|
|
558
|
-
BasketService.prototype.validateProductItemDiscount = /**
|
|
559
|
-
* @param {?} product
|
|
560
|
-
* @return {?}
|
|
561
|
-
*/
|
|
562
|
-
function (product) {
|
|
563
|
-
if (!product.itemDiscounts) {
|
|
564
|
-
product.itemDiscounts = {
|
|
565
|
-
trnDiscountsPortion: 0,
|
|
566
|
-
trnPromotionsPortion: 0,
|
|
567
|
-
refundPortion: 0,
|
|
568
|
-
};
|
|
569
|
-
}
|
|
570
|
-
return product;
|
|
571
|
-
};
|
|
572
|
-
/**
|
|
573
|
-
* @param {?} product
|
|
574
|
-
* @return {?}
|
|
575
|
-
*/
|
|
576
|
-
BasketService.prototype.markProduct = /**
|
|
577
|
-
* @param {?} product
|
|
578
|
-
* @return {?}
|
|
579
|
-
*/
|
|
580
|
-
function (product) {
|
|
581
|
-
this.productSource.next(product);
|
|
582
|
-
};
|
|
583
|
-
/**
|
|
584
|
-
* @param {?} peerSync
|
|
585
|
-
* @return {?}
|
|
586
|
-
*/
|
|
587
|
-
BasketService.prototype.stopPeerSyncProcess = /**
|
|
588
|
-
* @param {?} peerSync
|
|
589
|
-
* @return {?}
|
|
590
|
-
*/
|
|
591
|
-
function (peerSync) {
|
|
592
|
-
this.peerSource.next(peerSync);
|
|
593
|
-
};
|
|
594
|
-
/**
|
|
595
|
-
* @param {?} isScanning
|
|
596
|
-
* @return {?}
|
|
597
|
-
*/
|
|
598
|
-
BasketService.prototype.scanStart = /**
|
|
599
|
-
* @param {?} isScanning
|
|
600
|
-
* @return {?}
|
|
601
|
-
*/
|
|
602
|
-
function (isScanning) {
|
|
603
|
-
this.scanSource.next(isScanning);
|
|
604
|
-
};
|
|
605
|
-
/**
|
|
606
|
-
* @param {?} promotion
|
|
607
|
-
* @return {?}
|
|
608
|
-
*/
|
|
609
|
-
BasketService.prototype.promotionRemainingCalculation = /**
|
|
610
|
-
* @param {?} promotion
|
|
611
|
-
* @return {?}
|
|
612
|
-
*/
|
|
613
|
-
function (promotion) {
|
|
614
|
-
/** @type {?} */
|
|
615
|
-
var promotionValue = 0;
|
|
616
|
-
promotion.forEach((/**
|
|
617
|
-
* @param {?} element
|
|
618
|
-
* @return {?}
|
|
619
|
-
*/
|
|
620
|
-
function (element) {
|
|
621
|
-
promotionValue += element.promotionAmount;
|
|
622
|
-
}));
|
|
623
|
-
return promotionValue;
|
|
624
|
-
};
|
|
625
|
-
/**
|
|
626
|
-
* @param {?} discount
|
|
627
|
-
* @return {?}
|
|
628
|
-
*/
|
|
629
|
-
BasketService.prototype.discountRemainingCalculation = /**
|
|
630
|
-
* @param {?} discount
|
|
631
|
-
* @return {?}
|
|
632
|
-
*/
|
|
633
|
-
function (discount) {
|
|
634
|
-
/** @type {?} */
|
|
635
|
-
var discountValue = 0;
|
|
636
|
-
discount.forEach((/**
|
|
637
|
-
* @param {?} element
|
|
638
|
-
* @return {?}
|
|
639
|
-
*/
|
|
640
|
-
function (element) {
|
|
641
|
-
discountValue += element.discountAmount;
|
|
642
|
-
}));
|
|
643
|
-
return discountValue;
|
|
644
|
-
};
|
|
645
|
-
/**
|
|
646
|
-
* @param {?} discount
|
|
647
|
-
* @return {?}
|
|
648
|
-
*/
|
|
649
|
-
BasketService.prototype.discountRefundedCalculation = /**
|
|
650
|
-
* @param {?} discount
|
|
651
|
-
* @return {?}
|
|
652
|
-
*/
|
|
653
|
-
function (discount) {
|
|
654
|
-
/** @type {?} */
|
|
655
|
-
var discountValue = 0;
|
|
656
|
-
discount.forEach((/**
|
|
657
|
-
* @param {?} element
|
|
658
|
-
* @return {?}
|
|
659
|
-
*/
|
|
660
|
-
function (element) {
|
|
661
|
-
if (element.discountAmount < 0) {
|
|
662
|
-
discountValue += element.discountAmount;
|
|
663
|
-
}
|
|
664
|
-
}));
|
|
665
|
-
return discountValue;
|
|
666
|
-
};
|
|
667
|
-
/**
|
|
668
|
-
* @param {?} products
|
|
669
|
-
* @return {?}
|
|
670
|
-
*/
|
|
671
|
-
BasketService.prototype.generateNewItemLineId = /**
|
|
672
|
-
* @param {?} products
|
|
673
|
-
* @return {?}
|
|
674
|
-
*/
|
|
675
|
-
function (products) {
|
|
676
|
-
/** @type {?} */
|
|
677
|
-
var largestNumber = 0;
|
|
678
|
-
if (products.length > 0) {
|
|
679
|
-
/** @type {?} */
|
|
680
|
-
var itemLineIdArray = products.map((/**
|
|
681
|
-
* @param {?} product
|
|
682
|
-
* @return {?}
|
|
683
|
-
*/
|
|
684
|
-
function (product) {
|
|
685
|
-
return product.itemLineId;
|
|
686
|
-
}));
|
|
687
|
-
largestNumber = itemLineIdArray.reduce((/**
|
|
688
|
-
* @param {?} a
|
|
689
|
-
* @param {?} b
|
|
690
|
-
* @return {?}
|
|
691
|
-
*/
|
|
692
|
-
function (a, b) { return Math.max(a, b); }));
|
|
693
|
-
}
|
|
694
|
-
return largestNumber + 1;
|
|
695
|
-
};
|
|
696
|
-
/**
|
|
697
|
-
* @param {?} product
|
|
698
|
-
* @param {?} quantity
|
|
699
|
-
* @return {?}
|
|
700
|
-
*/
|
|
701
|
-
BasketService.prototype.updateBasketProductDataAsPerQuantity = /**
|
|
702
|
-
* @param {?} product
|
|
703
|
-
* @param {?} quantity
|
|
704
|
-
* @return {?}
|
|
705
|
-
*/
|
|
706
|
-
function (product, quantity) {
|
|
707
|
-
console.log("ebasket: updateBasketProductDataAsPerQuantity : " + quantity + " product: " + JSON.stringify(product));
|
|
708
|
-
product.quantity = quantity;
|
|
709
|
-
if (product.hasOwnProperty("lineDiscount")) {
|
|
710
|
-
// && this.product.quantity !== this.productDetailForm.controls.quantity.value
|
|
711
|
-
product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
|
|
712
|
-
product.lineDiscount.discountAmount =
|
|
713
|
-
product.totalLinePrice - product.lineDiscount.discountedLinePrice;
|
|
714
|
-
}
|
|
715
|
-
else {
|
|
716
|
-
product.totalLinePrice =
|
|
717
|
-
quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
|
|
718
|
-
}
|
|
719
|
-
if (product.lineDiscount) {
|
|
720
|
-
product.total = product.lineDiscount.discountedLinePrice;
|
|
721
|
-
}
|
|
722
|
-
else {
|
|
723
|
-
product.total = product.totalLinePrice;
|
|
724
|
-
}
|
|
725
|
-
console.log("ebasket: updateBasketProductDataAsPerQuantity : " + quantity + " product: " + JSON.stringify(product));
|
|
726
|
-
return product;
|
|
727
|
-
};
|
|
728
|
-
/**
|
|
729
|
-
* @param {?} isWebOrder
|
|
730
|
-
* @return {?}
|
|
731
|
-
*/
|
|
732
|
-
BasketService.prototype.filterProductListWithWebOrder = /**
|
|
733
|
-
* @param {?} isWebOrder
|
|
734
|
-
* @return {?}
|
|
735
|
-
*/
|
|
736
|
-
function (isWebOrder) {
|
|
737
|
-
console.log("ebasket: filterProductListWithWebOrder hit", JSON.stringify(this.currentBasket.products));
|
|
738
|
-
if (isWebOrder)
|
|
739
|
-
return this.currentBasket.products.filter((/**
|
|
740
|
-
* @param {?} x
|
|
741
|
-
* @return {?}
|
|
742
|
-
*/
|
|
743
|
-
function (x) { return x.isWebOrder; }));
|
|
744
|
-
else {
|
|
745
|
-
return this.currentBasket.products.filter((/**
|
|
746
|
-
* @param {?} x
|
|
747
|
-
* @return {?}
|
|
748
|
-
*/
|
|
749
|
-
function (x) { return !x.isWebOrder; }));
|
|
750
|
-
}
|
|
751
|
-
};
|
|
752
|
-
/**
|
|
753
|
-
* @return {?}
|
|
754
|
-
*/
|
|
755
|
-
BasketService.prototype.filterProductListWithDelivery = /**
|
|
756
|
-
* @return {?}
|
|
757
|
-
*/
|
|
758
|
-
function () {
|
|
759
|
-
console.log("ebasket: filterProductListWithDelivery hit", JSON.stringify(this.currentBasket.products));
|
|
760
|
-
return this.currentBasket.products.filter((/**
|
|
761
|
-
* @param {?} x
|
|
762
|
-
* @return {?}
|
|
763
|
-
*/
|
|
764
|
-
function (x) { return x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString(); }));
|
|
765
|
-
};
|
|
766
|
-
/**
|
|
767
|
-
* @param {?} group
|
|
768
|
-
* @param {?} products
|
|
769
|
-
* @return {?}
|
|
770
|
-
*/
|
|
771
|
-
BasketService.prototype.filterProductListWithDeliveryGroup = /**
|
|
772
|
-
* @param {?} group
|
|
773
|
-
* @param {?} products
|
|
774
|
-
* @return {?}
|
|
775
|
-
*/
|
|
776
|
-
function (group, products) {
|
|
777
|
-
console.log("ebasket: filterProductListWithDeliveryGroup hit", JSON.stringify(products));
|
|
778
|
-
return products.filter((/**
|
|
779
|
-
* @param {?} x
|
|
780
|
-
* @return {?}
|
|
781
|
-
*/
|
|
782
|
-
function (x) { return x.deliveryGroup === group; }));
|
|
783
|
-
};
|
|
784
|
-
/**
|
|
785
|
-
* @param {?} products
|
|
786
|
-
* @return {?}
|
|
787
|
-
*/
|
|
788
|
-
BasketService.prototype.generateNewDeliveryGroupNumber = /**
|
|
789
|
-
* @param {?} products
|
|
790
|
-
* @return {?}
|
|
791
|
-
*/
|
|
792
|
-
function (products) {
|
|
793
|
-
/** @type {?} */
|
|
794
|
-
var largestNumber = 0;
|
|
795
|
-
if (products.length > 0) {
|
|
796
|
-
/** @type {?} */
|
|
797
|
-
var deliveryGroupArr = products.map((/**
|
|
798
|
-
* @param {?} product
|
|
799
|
-
* @return {?}
|
|
800
|
-
*/
|
|
801
|
-
function (product) {
|
|
802
|
-
if (product.deliveryGroup) {
|
|
803
|
-
return parseInt(product.deliveryGroup);
|
|
804
|
-
}
|
|
805
|
-
return 0;
|
|
806
|
-
}));
|
|
807
|
-
largestNumber = deliveryGroupArr.reduce((/**
|
|
808
|
-
* @param {?} a
|
|
809
|
-
* @param {?} b
|
|
810
|
-
* @return {?}
|
|
811
|
-
*/
|
|
812
|
-
function (a, b) { return Math.max(a, b); }));
|
|
813
|
-
}
|
|
814
|
-
return (largestNumber + 1).toString();
|
|
815
|
-
};
|
|
816
|
-
/**
|
|
817
|
-
* @param {?} products
|
|
818
|
-
* @return {?}
|
|
819
|
-
*/
|
|
820
|
-
BasketService.prototype.getDeliveryGroupNumbers = /**
|
|
821
|
-
* @param {?} products
|
|
822
|
-
* @return {?}
|
|
823
|
-
*/
|
|
824
|
-
function (products) {
|
|
825
|
-
console.log("getDeliveryGroupNumbers initiating : ", JSON.stringify(products));
|
|
826
|
-
/** @type {?} */
|
|
827
|
-
var uniqueAndsortedResult = [];
|
|
828
|
-
if (products.length > 0) {
|
|
829
|
-
/** @type {?} */
|
|
830
|
-
var deliveryGroupArr = products.map((/**
|
|
831
|
-
* @param {?} product
|
|
832
|
-
* @return {?}
|
|
833
|
-
*/
|
|
834
|
-
function (product) {
|
|
835
|
-
if (product.deliveryGroup) {
|
|
836
|
-
return parseInt(product.deliveryGroup);
|
|
837
|
-
}
|
|
838
|
-
else if (product.deliveryMethod === "1") {
|
|
839
|
-
return 1;
|
|
840
|
-
}
|
|
841
|
-
return 0;
|
|
842
|
-
}));
|
|
843
|
-
uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((/**
|
|
844
|
-
* @param {?} a
|
|
845
|
-
* @param {?} b
|
|
846
|
-
* @return {?}
|
|
847
|
-
*/
|
|
848
|
-
function (a, b) { return a - b; }));
|
|
849
|
-
console.log("getDeliveryGroupNumbers : ", JSON.stringify(uniqueAndsortedResult));
|
|
850
|
-
}
|
|
851
|
-
return uniqueAndsortedResult;
|
|
852
|
-
};
|
|
853
|
-
/**
|
|
854
|
-
* @param {?} products
|
|
855
|
-
* @return {?}
|
|
856
|
-
*/
|
|
857
|
-
BasketService.prototype.updateProductsWithNewDeliveryGroupNumber = /**
|
|
858
|
-
* @param {?} products
|
|
859
|
-
* @return {?}
|
|
860
|
-
*/
|
|
861
|
-
function (products) {
|
|
862
|
-
console.log("updateProductsWithNewDeliveryGroupNumber initiating : ", JSON.stringify(products));
|
|
863
|
-
/** @type {?} */
|
|
864
|
-
var newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
|
|
865
|
-
if (products.length > 0) {
|
|
866
|
-
this.currentBasket.products.forEach((/**
|
|
867
|
-
* @param {?} cBProducts
|
|
868
|
-
* @return {?}
|
|
869
|
-
*/
|
|
870
|
-
function (cBProducts) {
|
|
871
|
-
products.forEach((/**
|
|
872
|
-
* @param {?} element
|
|
873
|
-
* @return {?}
|
|
874
|
-
*/
|
|
875
|
-
function (element) {
|
|
876
|
-
if (cBProducts.itemLineId === element.itemLineId) {
|
|
877
|
-
cBProducts.deliveryGroup = newGroupNumber;
|
|
878
|
-
}
|
|
879
|
-
}));
|
|
880
|
-
}));
|
|
881
|
-
}
|
|
882
|
-
this.updateBasket(this.currentBasket);
|
|
883
|
-
return;
|
|
884
|
-
};
|
|
885
|
-
/**
|
|
886
|
-
* @param {?} products
|
|
887
|
-
* @return {?}
|
|
888
|
-
*/
|
|
889
|
-
BasketService.prototype.calculateEstimatedTime = /**
|
|
890
|
-
* @param {?} products
|
|
891
|
-
* @return {?}
|
|
892
|
-
*/
|
|
893
|
-
function (products) {
|
|
894
|
-
try {
|
|
895
|
-
/** @type {?} */
|
|
896
|
-
var time_1;
|
|
897
|
-
/** @type {?} */
|
|
898
|
-
var estmatedTime_1 = 0;
|
|
899
|
-
/** @type {?} */
|
|
900
|
-
var estimatedDays_1 = "Hours";
|
|
901
|
-
products.forEach((/**
|
|
902
|
-
* @param {?} element
|
|
903
|
-
* @return {?}
|
|
904
|
-
*/
|
|
905
|
-
function (element) {
|
|
906
|
-
if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
|
|
907
|
-
time_1 = Number(element.leadTime.value) * 24 * 7;
|
|
908
|
-
estmatedTime_1 = Math.max(estmatedTime_1, time_1);
|
|
909
|
-
estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
|
|
910
|
-
console.log("week", estmatedTime_1, estimatedDays_1);
|
|
911
|
-
}
|
|
912
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "days") {
|
|
913
|
-
time_1 = Number(element.leadTime.value) * 24;
|
|
914
|
-
estmatedTime_1 = Math.max(estmatedTime_1, time_1);
|
|
915
|
-
estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
|
|
916
|
-
console.log("days", estmatedTime_1, estimatedDays_1);
|
|
917
|
-
}
|
|
918
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "months") {
|
|
919
|
-
time_1 = Number(element.leadTime.value) * 24 * 30;
|
|
920
|
-
estmatedTime_1 = Math.max(estmatedTime_1, time_1);
|
|
921
|
-
estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
|
|
922
|
-
console.log("months", estmatedTime_1, estimatedDays_1);
|
|
923
|
-
}
|
|
924
|
-
else if (element.leadTime.type.toLocaleLowerCase() === "years") {
|
|
925
|
-
time_1 = Number(element.leadTime.value) * 24 * 365;
|
|
926
|
-
estmatedTime_1 = Math.max(estmatedTime_1, time_1);
|
|
927
|
-
estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
|
|
928
|
-
console.log("years", estmatedTime_1, estimatedDays_1);
|
|
929
|
-
}
|
|
930
|
-
else {
|
|
931
|
-
time_1 = Number(element.leadTime.value);
|
|
932
|
-
estmatedTime_1 = Math.max(estmatedTime_1, time_1);
|
|
933
|
-
estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
|
|
934
|
-
console.log("hours", estmatedTime_1, estimatedDays_1);
|
|
935
|
-
}
|
|
936
|
-
}));
|
|
937
|
-
if (estimatedDays_1.toLocaleLowerCase() === "days") {
|
|
938
|
-
estmatedTime_1 = estmatedTime_1 / 24;
|
|
939
|
-
}
|
|
940
|
-
else if (estimatedDays_1.toLocaleLowerCase() === "weeks") {
|
|
941
|
-
estmatedTime_1 = estmatedTime_1 / (24 * 7);
|
|
942
|
-
}
|
|
943
|
-
else if (estimatedDays_1.toLocaleLowerCase() === "months") {
|
|
944
|
-
estmatedTime_1 = estmatedTime_1 / (24 * 30);
|
|
945
|
-
}
|
|
946
|
-
else if (estimatedDays_1.toLocaleLowerCase() === "years") {
|
|
947
|
-
estmatedTime_1 = estmatedTime_1 / (24 * 365);
|
|
948
|
-
}
|
|
949
|
-
/** @type {?} */
|
|
950
|
-
var estimate = {
|
|
951
|
-
value: estmatedTime_1.toString(),
|
|
952
|
-
type: estimatedDays_1
|
|
953
|
-
};
|
|
954
|
-
return estimate;
|
|
955
|
-
}
|
|
956
|
-
catch (error) {
|
|
957
|
-
console.log("error in calculateEstimatedTime", error);
|
|
958
|
-
}
|
|
959
|
-
return 0;
|
|
960
|
-
};
|
|
961
|
-
/**
|
|
962
|
-
* @param {?} oldGroup
|
|
963
|
-
* @param {?} newGroup
|
|
964
|
-
* @return {?}
|
|
965
|
-
*/
|
|
966
|
-
BasketService.prototype.updateProductsWithDeliveryGroupNumber = /**
|
|
967
|
-
* @param {?} oldGroup
|
|
968
|
-
* @param {?} newGroup
|
|
969
|
-
* @return {?}
|
|
970
|
-
*/
|
|
971
|
-
function (oldGroup, newGroup) {
|
|
972
|
-
console.log("updateProductsWithDeliveryGroupNumber initiating");
|
|
973
|
-
this.currentBasket.products.forEach((/**
|
|
974
|
-
* @param {?} cBProducts
|
|
975
|
-
* @return {?}
|
|
976
|
-
*/
|
|
977
|
-
function (cBProducts) {
|
|
978
|
-
if (cBProducts.deliveryGroup === oldGroup) {
|
|
979
|
-
cBProducts.deliveryGroup = newGroup;
|
|
980
|
-
}
|
|
981
|
-
}));
|
|
982
|
-
this.updateBasket(this.currentBasket);
|
|
983
|
-
return;
|
|
984
|
-
};
|
|
985
|
-
/**
|
|
986
|
-
* @return {?}
|
|
987
|
-
*/
|
|
988
|
-
BasketService.prototype.getDeliveryInfo = /**
|
|
989
|
-
* @return {?}
|
|
990
|
-
*/
|
|
991
|
-
function () {
|
|
992
|
-
var _this = this;
|
|
993
|
-
console.log("getDeliveryGroupInfor initiating");
|
|
994
|
-
try {
|
|
995
|
-
/** @type {?} */
|
|
996
|
-
var groupInfo_1 = {
|
|
997
|
-
groups: []
|
|
998
|
-
};
|
|
999
|
-
this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((/**
|
|
1000
|
-
* @param {?} groupNumber
|
|
1001
|
-
* @return {?}
|
|
1002
|
-
*/
|
|
1003
|
-
function (groupNumber) {
|
|
1004
|
-
/** @type {?} */
|
|
1005
|
-
var group = {
|
|
1006
|
-
groupNumber: groupNumber,
|
|
1007
|
-
items: [],
|
|
1008
|
-
estimate: {
|
|
1009
|
-
type: "Hours",
|
|
1010
|
-
value: "0"
|
|
1011
|
-
}
|
|
1012
|
-
};
|
|
1013
|
-
_this.currentBasket.products.forEach((/**
|
|
1014
|
-
* @param {?} cBProducts
|
|
1015
|
-
* @return {?}
|
|
1016
|
-
*/
|
|
1017
|
-
function (cBProducts) {
|
|
1018
|
-
if (cBProducts.deliveryGroup === groupNumber.toString()) {
|
|
1019
|
-
group.items.push(cBProducts);
|
|
1020
|
-
}
|
|
1021
|
-
}));
|
|
1022
|
-
group.estimate = _this.calculateEstimatedTime(group.items);
|
|
1023
|
-
groupInfo_1.groups.push(group);
|
|
1024
|
-
}));
|
|
1025
|
-
return groupInfo_1;
|
|
1026
|
-
}
|
|
1027
|
-
catch (error) {
|
|
1028
|
-
console.log("error", error);
|
|
1029
|
-
}
|
|
1030
|
-
};
|
|
1031
|
-
return BasketService;
|
|
1032
|
-
}());
|
|
1033
|
-
export { BasketService };
|
|
1034
|
-
if (false) {
|
|
1035
|
-
/** @type {?} */
|
|
1036
|
-
BasketService.prototype.currentBasket;
|
|
1037
|
-
/**
|
|
1038
|
-
* @type {?}
|
|
1039
|
-
* @private
|
|
1040
|
-
*/
|
|
1041
|
-
BasketService.prototype.basketSource;
|
|
1042
|
-
/** @type {?} */
|
|
1043
|
-
BasketService.prototype.basket;
|
|
1044
|
-
/**
|
|
1045
|
-
* @type {?}
|
|
1046
|
-
* @private
|
|
1047
|
-
*/
|
|
1048
|
-
BasketService.prototype.productSource;
|
|
1049
|
-
/** @type {?} */
|
|
1050
|
-
BasketService.prototype.product;
|
|
1051
|
-
/**
|
|
1052
|
-
* @type {?}
|
|
1053
|
-
* @private
|
|
1054
|
-
*/
|
|
1055
|
-
BasketService.prototype.peerSource;
|
|
1056
|
-
/** @type {?} */
|
|
1057
|
-
BasketService.prototype.peerSync;
|
|
1058
|
-
/**
|
|
1059
|
-
* @type {?}
|
|
1060
|
-
* @private
|
|
1061
|
-
*/
|
|
1062
|
-
BasketService.prototype.scanSource;
|
|
1063
|
-
/** @type {?} */
|
|
1064
|
-
BasketService.prototype.scanner;
|
|
1065
|
-
/**
|
|
1066
|
-
* @type {?}
|
|
1067
|
-
* @private
|
|
1068
|
-
*/
|
|
1069
|
-
BasketService.prototype._isMixedBasketSales;
|
|
1070
|
-
/**
|
|
1071
|
-
* @type {?}
|
|
1072
|
-
* @private
|
|
1073
|
-
*/
|
|
1074
|
-
BasketService.prototype.numberUtilService;
|
|
1075
|
-
}
|
|
1076
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcG1jcmV0YWlsL21hcHBlci1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLMUQ7SUErQkUsdUJBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFXbUIsQ0FBQztJQVI3RCxzQkFBVyw2Q0FBa0I7Ozs7UUFBN0I7WUFDRSxPQUFPLElBQUksQ0FBQyxtQkFB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LENBQUMsT0FBTzs7OztnQkFBQyxVQUFBLFVBQVU7b0JBQzVDLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3ZELEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUM5QjtnQkFDSCxDQUFDLEVBQUMsQ0FBQztnQkFFSCxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFELFdBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLENBQUMsRUFBQyxDQUFDO1lBRUgsT0FBTyxXQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTVyQkQsSUE0ckJDOzs7O0lBM3JCQyxzQ0FPRTs7Ozs7SUFFRixxQ0FBc0Q7O0lBQ3RELCtCQUEwQzs7Ozs7SUFFMUMsc0NBQXVEOztJQUN2RCxnQ0FBNEM7Ozs7O0lBRTVDLG1DQUF5RDs7SUFDekQsaUNBQTBDOzs7OztJQUUxQyxtQ0FBeUQ7O0lBQ3pELGdDQUF5Qzs7Ozs7SUFFekMsNENBQWlEOzs7OztJQVNyQywwQ0FBNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBERUxJVkVSWV9NRVRIT0RTIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2tldCwgRGVsaXZlcnlHcm91cEluZm8sIERlbGl2ZXJ5SW5mbywgUHJvZHVjdCwgVHJhbnNhY3Rpb25Qcm9tb3Rpb24gfSBmcm9tICcuL21hcHBlci1saWJyYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgVHJhbnNhY3Rpb25EaXNjb3VudCB9IGZyb20gJy4vbWFwcGVyLWxpYnJhcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gJy4vbnVtYmVyLXV0aWwuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQmFza2V0U2VydmljZSB7XHJcbiAgY3VycmVudEJhc2tldDogQmFza2V0ID0ge1xyXG4gICAgcHJvZHVjdHM6IFtdLFxyXG4gICAgdHJhbnNhY3Rpb25EaXNjb3VudDogW10sXHJcbiAgICBxdWFudGl0eTogMCxcclxuICAgIHRvdGFsOiAwLFxyXG4gICAgc2FsZVRvdGFsOiAwLFxyXG4gICAgYmFzZUN1cnJlbmN5OiAnJ1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgYmFza2V0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG4gIGJhc2tldCA9IHRoaXMuYmFza2V0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIHByb2R1Y3RTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XHJcbiAgcHJvZHVjdCA9IHRoaXMucHJvZHVjdFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBwZWVyU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcGVlclN5bmMgPSB0aGlzLnBlZXJTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgc2NhblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHNjYW5uZXIgPSB0aGlzLnNjYW5Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2lzTWl4ZWRCYXNrZXRTYWxlczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZ2V0IGlzTWl4ZWRCYXNrZXRTYWxlcygpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTWl4ZWRCYXNrZXRTYWxlcztcclxuICB9XHJcbiAgcHVibGljIHNldCBpc01peGVkQmFza2V0U2FsZXModjogYW55KSB7XHJcbiAgICB0aGlzLl9pc01peGVkQmFza2V0U2FsZXMgPSB2O1xyXG4gIH1cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdXBkYXRlQmFza2V0KGJhc2tldDogQmFza2V0KSB7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XHJcbiAgICB0aGlzLmlzTWl4ZWRCYXNrZXRTYWxlcyA9IHRoaXMuZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIodHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuYmFza2V0U291cmNlLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICovXHJcbiAgdXBkYXRlQmFza2V0VG90YWwoYmFza2V0RGV0YWlsczogeyBxdWFudGl0eTogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBwcm9kdWN0czogYW55OyB0cmFuc2FjdGlvbklkOiBhbnk7IGJhc2tldFRvdGFsOiBhbnk7IH0sIGJhc2tldFN0YXRlOiB7IHVwZGF0ZUJhc2tldDogKGFyZzA6IGFueSkgPT4gdm9pZDsgfSkge1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGZvciAoY29uc3QgcCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSBiYXNrZXREZXRhaWxzLnF1YW50aXR5ICsgcC5xdWFudGl0eTtcclxuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChiYXNrZXREZXRhaWxzLnRvdGFsKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwLnRvdGFsKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBcImU6YmFza2V0IDpiYXNrZXQgc2VydmljZSA6IGJhc2tldERldGFpbHMgdXBkYXRlZCB2YWx1ZXMgZm9yIHRyYW5zYWN0aW9uIGlkXCIsXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25JZCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscylcclxuICAgICk7XHJcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbDtcclxuICAgIGJhc2tldFN0YXRlLnVwZGF0ZUJhc2tldChiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZCBMaW5lIHByb21vdGlvblxyXG4gICAqIEBwYXJhbSAgbnVsbFxyXG4gICAqIEByZXR1cm5zIGJhc2tldERldGFpbHNcclxuICAgKi9cclxuICBhZGRsaW5lUHJvbW90aW9uKHByb21vdGlvbkxpc3Q6IHsgcmVzdWx0OiB7IGxpbmVQcm9tb3Rpb25zOiBzdHJpbmcgfCBhbnlbXTsgfTsgfSwgYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55OyB9KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6YmFza2V0IFNlcnZpY2UgOiBwcm9tb3Rpb25MaXN0IGFuZCBiYXNrZXREZXRhaWxzIGZvciBsaW5lUHJvbW90aW9uc1wiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscylcclxuICAgICk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHByb21vdGlvbkxpc3QgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAodmFyIGVsZW1lbnQgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xyXG4gICAgICAgIGZvciAodmFyIHByb21vdGlvbmVsZW1lbnQgb2YgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgPT09XHJcbiAgICAgICAgICAgIHByb21vdGlvbmVsZW1lbnQuaXRlbUxpbmVJZC50b1N0cmluZygpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudC5saW5lUHJvbW90aW9ucyA9IHByb21vdGlvbmVsZW1lbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFza2V0RGV0YWlscztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZCBUcmFuc2FjdGlvbiBwcm9tb3Rpb25cclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyBiYXNrZXREZXRhaWxzXHJcbiAgICovXHJcblxyXG4gIGFkZFRyYW5zYWN0aW9uUHJvbW90aW9uKHByb21vdGlvbkxpc3Q6IHsgcmVzdWx0OiB7IHRyYW5zYWN0aW9uUHJvbW90aW9uOiBhbnkgfTsgfSwgYmFza2V0ZGV0YWlsczogQmFza2V0KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6YmFza2V0IFNlcnZpY2UgOiBwcm9tb3Rpb25MaXN0IGFuZCBiYXNrZXREZXRhaWxzIGZvciB0cmFuc2FjdGlvblByb21vdGlvblwiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscyksXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICBwcm9tb3Rpb25MaXN0ICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0ICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWQ6IGFueSA9IE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIHRQcm9tb3Rpb25cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZC5pdGVtTGluZUlkcyA9IGJhc2tldGRldGFpbHMucHJvZHVjdHMubWFwKFxyXG4gICAgICAgICAgKHByb2R1Y3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIWJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcclxuICAgICAgICAgIGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBiYXNrZXRkZXRhaWxzID0gdGhpcy50cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldGRldGFpbHMsXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIFwiYmFza2V0IGRldGFpbHMgaW4gcmVmdW5kIGNhbGN1bGF0aW9uIGZpbGVcIixcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscylcclxuICAgICk7XHJcbiAgICByZXR1cm4gYmFza2V0ZGV0YWlscztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByb2R1Y3RUb3RhbEZvclN1bW1hcnkoYmFza2V0RGV0YWlsczogeyB0b3RhbDogc3RyaW5nIHwgbnVtYmVyOyBxdWFudGl0eTogc3RyaW5nIHwgbnVtYmVyOyBwcm9kdWN0czogYW55OyB9KSB7XHJcbiAgICAvKnNhbGUtICAgICAgICAgICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkXHJcbiAgICBwYXJ0aWFsIHJlZnVuZCAtICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMFxyXG4gICAgdG90YWwgcmVmdW5kIC0gICAgIHByb3VkY3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcclxuICAgIGV4Y2hhbmdlIC0gICAgICAgICBleGNoYW5nZSBwcm9kdWN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwICBcclxuICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkICBcclxuICAgICAgICAgICAgICAgICAgICAgICBvbGQgcHJvZHVjdCB3aXRob3V0IGV4Y2hhbmdlIHJlZnVuZGVkUXVhbnRpdHkgPSAwXHJcbiAgICB1bnJlZmVyZW5jZSByZWZ1bmQtcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAqL1xyXG5cclxuICAgIGJhc2tldERldGFpbHMudG90YWwgPSAwO1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBmb3IgKHZhciBwcm9kdWN0IG9mIGJhc2tldERldGFpbHMucHJvZHVjdHMpIHtcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgfVxyXG4gICAgICBwcm9kdWN0LnRvdGFsID1cclxuICAgICAgICBwcm9kdWN0LnRvdGFsIC1cclxuICAgICAgICBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwgPyBwcm9kdWN0LnJlZnVuZGVkVG90YWwgOiAwKTtcclxuXHJcbiAgICAgIGJhc2tldERldGFpbHMudG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSArXHJcbiAgICAgICAgKHByb2R1Y3QucXVhbnRpdHkgLVxyXG4gICAgICAgICAgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA6IDApKTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDpFeGNoYW5nZVN1bW1hcnlTY3JlZW46dXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICtcclxuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXHJcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcclxuICAgICAgICBcIiBwcm9kdWN0IHRvdGFsIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsO1xyXG4gICAgY29uc29sZS5pbmZvKFxyXG4gICAgICBcImViYXNrZXQgOiBiYXNrZXQgU2VydmljZSA6IHVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnNvbGUuaW5mbyhcclxuICAgICAgXCJlYmFza2V0IDogYmFza2V0IFNlcnZpY2UgOiB1cGRhdGUgQmFza2V0IFRvdGFsIGZvciB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvblByb21vdGlvbiAgXCIsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pXHJcbiAgICApO1xyXG5cclxuICAgIGJhc2tldERldGFpbHMgPSB0aGlzLnVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uKGJhc2tldERldGFpbHMpO1xyXG4gICAgYmFza2V0RGV0YWlscyA9IHRoaXMudXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudChiYXNrZXREZXRhaWxzKTtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBOdW1iZXIoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbC50b0ZpeGVkKDIpKTtcclxuXHJcbiAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgIFwiZWJhc2tldCA6IGJhc2tldCBTZXJ2aWNlIDogdXBkYXRlIEJhc2tldCBUb3RhbDogYmFza2V0VG90YWwgYWZ0ZXIgcHJvbW90aW9uIGFwcGxpZWQgIGZvciBiYXNrZXRUb3RhbFwiLFxyXG4gICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25EaXNjb3VudDogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyBkaXNjb3VudEFtb3VudCB9OiBhbnkpID0+IG4gKyBkaXNjb3VudEFtb3VudCxcclxuICAgICAgICAwXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldCA6IGJhc2tldCBTZXJ2aWNlIDogIGRpc2NvdW50VG90YWwgXCIsIGRpc2NvdW50VG90YWwpO1xyXG4gICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID1cclxuICAgICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsIC0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFza2V0RGV0YWlscztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uKGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IGFueVtdOyBiYXNrZXRUb3RhbDogbnVtYmVyOyB9KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAwXHJcbiAgICAgICk7XHJcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0VG90YWxXaXRob3V0RGlzY291bnQoYmFza2V0OiBCYXNrZXQpOiBCYXNrZXQge1xyXG4gICAgYmFza2V0LnRvdGFsID0gMDtcclxuICAgIGJhc2tldC5xdWFudGl0eSA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXQucHJvZHVjdHMpIHtcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcm9kdWN0LnRvdGFsID1cclxuICAgICAgICBwcm9kdWN0LnRvdGFsIC1cclxuICAgICAgICBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwgPyBwcm9kdWN0LnJlZnVuZGVkVG90YWwgOiAwKTtcclxuICAgICAgYmFza2V0LnRvdGFsICs9IHByb2R1Y3QudG90YWw7XHJcbiAgICAgIGJhc2tldC5xdWFudGl0eSA9XHJcbiAgICAgICAgYmFza2V0LnF1YW50aXR5ICtcclxuICAgICAgICAocHJvZHVjdC5xdWFudGl0eSAtXHJcbiAgICAgICAgICAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5IDogMCkpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDpiYXNrZXQgc2VydmljZTp1cGRhdGUgYmFza2V0ZGV0YWlscyB0b3RhbCA6XCIgK1xyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xyXG4gICAgICAgIGJhc2tldC50b3RhbCArXHJcbiAgICAgICAgXCIgUHJvZHVjdCBsaW5lIElEIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXHJcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50cyhiYXNrZXQ6IGFueSk6IEJhc2tldCB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6UmVmdW5kQmFza2V0U2NyZWVuIDogdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXNcIixcclxuICAgICAgYmFza2V0LFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShiYXNrZXQuYmFza2V0VG90YWwpXHJcbiAgICApO1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xyXG4gICAgfVxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6UmVmdW5kQmFza2V0U2NyZWVuIDogYmFza2V0IG5ldyB2YWx1ZXNcIixcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0KVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25EaXNjb3VudEFuZFByb21vdGlvblByb2R1Y3RvcnRpb25DYWxjdWxhdGlvbihiYXNrZXQ6IEJhc2tldCkge1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaChcclxuICAgICAgICAoZGlzY291bnQpID0+XHJcbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldCxcclxuICAgICAgICAgIGRpc2NvdW50XHJcbiAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChwcm9tb3Rpb24pID0+IHtcclxuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlYmFza2V0OiBiYXNrZXQgaXRlbSBkaXNjb3VudCBwcm90aW9uIGNhbGN1bGF0aW9uXCIsXHJcbiAgICAgIGJhc2tldCxcclxuICAgICAgYmFza2V0LnByb2R1Y3RzXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBwcm9tb3Rpb246IGFueVxyXG4gICkge1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGxldCBwZXJjZW50YWdlID0gMDtcclxuICAgIHtcclxuICAgICAgYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHA6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwLml0ZW1MaW5lSWQpKSB7XHJcbiAgICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcbiAgICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25Qcm9tb3Rpb246ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwcm9tb3Rpb25cclxuICAgICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbikgK1xyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICAgIGlmIChwcm9tb3Rpb24uaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz1cclxuICAgICAgICAgICAgKHByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBkaXNjb3VudDogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuXHJcbiAgICAgICAgdG90YWwgKz0gKHAudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25EaXNjb3VudDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICBkaXNjb3VudFxyXG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcclxuICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG4gICAgICBjb25zb2xlLmxvZyhwcm9kdWN0LmRpc2NvdW50YWJsZSwgXCJlYmFza2V0IDogYmFza2V0IHNlcnZpY2UgOiBkaXNjb3VudGFibGUgaW4gYmFza2V0IHNlcnZpY2VcIik7XHJcblxyXG4gICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICBpZiAoZGlzY291bnQuaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSAmJiBwcm9kdWN0LmRpc2NvdW50YWJsZSA9PSB0cnVlKSB7XHJcbiAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gKz1cclxuICAgICAgICAgIChkaXNjb3VudC5kaXNjb3VudEFtb3VudCAqIHBlcmNlbnRhZ2UpIC8gMTAwO1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcclxuICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzID0ge1xyXG4gICAgICAgIHRybkRpc2NvdW50c1BvcnRpb246IDAsXHJcbiAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXHJcbiAgICAgICAgcmVmdW5kUG9ydGlvbjogMCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9kdWN0O1xyXG4gIH1cclxuXHJcbiAgbWFya1Byb2R1Y3QocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgdGhpcy5wcm9kdWN0U291cmNlLm5leHQocHJvZHVjdCk7XHJcbiAgfVxyXG4gIHN0b3BQZWVyU3luY1Byb2Nlc3MocGVlclN5bmM6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucGVlclNvdXJjZS5uZXh0KHBlZXJTeW5jKTtcclxuICB9XHJcblxyXG4gIHNjYW5TdGFydChpc1NjYW5uaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNjYW5Tb3VyY2UubmV4dChpc1NjYW5uaW5nKTtcclxuICB9XHJcblxyXG4gIHByb21vdGlvblJlbWFpbmluZ0NhbGN1bGF0aW9uKHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25bXSkge1xyXG4gICAgdmFyIHByb21vdGlvblZhbHVlID0gMDtcclxuICAgIHByb21vdGlvbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIHByb21vdGlvblZhbHVlICs9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbW90aW9uVmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNjb3VudFJlbWFpbmluZ0NhbGN1bGF0aW9uKGRpc2NvdW50OiBUcmFuc2FjdGlvbkRpc2NvdW50W10pIHtcclxuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcclxuICAgIGRpc2NvdW50LmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgZGlzY291bnRWYWx1ZSArPSBlbGVtZW50LmRpc2NvdW50QW1vdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlzY291bnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGRpc2NvdW50UmVmdW5kZWRDYWxjdWxhdGlvbihkaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudFtdKSB7XHJcbiAgICB2YXIgZGlzY291bnRWYWx1ZSA9IDA7XHJcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCkge1xyXG4gICAgICAgIGRpc2NvdW50VmFsdWUgKz0gZWxlbWVudC5kaXNjb3VudEFtb3VudDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlzY291bnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlTmV3SXRlbUxpbmVJZChwcm9kdWN0czogUHJvZHVjdFtdKSB7XHJcbiAgICBsZXQgbGFyZ2VzdE51bWJlcjogYW55ID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gcHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gaXRlbUxpbmVJZEFycmF5LnJlZHVjZSgoYSA6YW55LCBiOmFueSkgPT4gTWF0aC5tYXgoYSwgYikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYXJnZXN0TnVtYmVyICsgMTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eShcclxuICAgIHByb2R1Y3Q6IGFueSxcclxuICAgIHF1YW50aXR5OiBudW1iZXJcclxuICApOiBQcm9kdWN0IHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhgZWJhc2tldDogdXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5IDogJHtxdWFudGl0eX0gcHJvZHVjdDogJHtKU09OLnN0cmluZ2lmeShwcm9kdWN0KX1gKTtcclxuICAgIHByb2R1Y3QucXVhbnRpdHkgPSBxdWFudGl0eTtcclxuICAgIGlmIChwcm9kdWN0Lmhhc093blByb3BlcnR5KFwibGluZURpc2NvdW50XCIpKSB7XHJcbiAgICAgIC8vICYmIHRoaXMucHJvZHVjdC5xdWFudGl0eSAhPT0gdGhpcy5wcm9kdWN0RGV0YWlsRm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZVxyXG4gICAgICBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlID0gTnVtYmVyKFxyXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UuZ2V0Rmxvb3JlZEZpeGVkKFxyXG4gICAgICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQudW5pdFByaWNlICogcXVhbnRpdHksXHJcbiAgICAgICAgICAyXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgICBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCA9XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsTGluZVByaWNlID1cclxuICAgICAgICBxdWFudGl0eSAqIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwocHJvZHVjdC5zZWxlY3RlZFByaWNlKTtcclxuICAgIH1cclxuICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCkge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3Q7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJQcm9kdWN0TGlzdFdpdGhXZWJPcmRlcihpc1dlYk9yZGVyOiBib29sZWFuKTogUHJvZHVjdFtdIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIgaGl0XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cykpO1xyXG4gICAgaWYgKGlzV2ViT3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmlzV2ViT3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiAheC5pc1dlYk9yZGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5KCk6IFByb2R1Y3RbXSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5IGhpdFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpKTtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cCBoaXRcIiwgSlNPTi5zdHJpbmdpZnkocHJvZHVjdHMpKTtcclxuICAgIHJldHVybiBwcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gZGVsaXZlcnlHcm91cEFyci5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGxhcmdlc3ROdW1iZXIgKyAxKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgY29uc29sZS5sb2coXCJnZXREZWxpdmVyeUdyb3VwTnVtYmVycyBpbml0aWF0aW5nIDogXCIsIEpTT04uc3RyaW5naWZ5KHByb2R1Y3RzKSk7XHJcblxyXG4gICAgbGV0IHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kID09PSBcIjFcIikge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCA9IEFycmF5LmZyb20obmV3IFNldChkZWxpdmVyeUdyb3VwQXJyKSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzIDogXCIsIEpTT04uc3RyaW5naWZ5KHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aE5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgY29uc29sZS5sb2coXCJ1cGRhdGVQcm9kdWN0c1dpdGhOZXdEZWxpdmVyeUdyb3VwTnVtYmVyIGluaXRpYXRpbmcgOiBcIiwgSlNPTi5zdHJpbmdpZnkocHJvZHVjdHMpKTtcclxuXHJcbiAgICBsZXQgbmV3R3JvdXBOdW1iZXIgPSB0aGlzLmdlbmVyYXRlTmV3RGVsaXZlcnlHcm91cE51bWJlcih0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpO1xyXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgcHJvZHVjdHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIGlmIChjQlByb2R1Y3RzLml0ZW1MaW5lSWQgPT09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cE51bWJlcjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldCh0aGlzLmN1cnJlbnRCYXNrZXQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlRXN0aW1hdGVkVGltZShwcm9kdWN0czogYW55W10pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCB0aW1lO1xyXG4gICAgICBsZXQgZXN0bWF0ZWRUaW1lOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgZXN0aW1hdGVkRGF5czogc3RyaW5nID0gXCJIb3Vyc1wiO1xyXG4gICAgICBwcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiB7IGxlYWRUaW1lOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueTsgfTsgfSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5sZWFkVGltZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwid2Vla3NcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogNztcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndlZWtcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJkYXlzXCIpIHtcclxuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSkgKiAyNDtcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJkYXlzXCIsIGVzdG1hdGVkVGltZSwgZXN0aW1hdGVkRGF5cyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogMzA7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwibW9udGhzXCIsIGVzdG1hdGVkVGltZSwgZXN0aW1hdGVkRGF5cyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzNjU7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwieWVhcnNcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSk7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5cztcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaG91cnNcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XHJcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gMjQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiA3KTtcclxuICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwibW9udGhzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInllYXJzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzNjUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZXN0aW1hdGUgPSB7XHJcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6IGVzdGltYXRlZERheXNcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXN0aW1hdGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0c1dpdGhEZWxpdmVyeUdyb3VwTnVtYmVyKG9sZEdyb3VwOiBzdHJpbmcsIG5ld0dyb3VwOiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKFwidXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlciBpbml0aWF0aW5nXCIpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKGNCUHJvZHVjdHMgPT4ge1xyXG4gICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBvbGRHcm91cCkge1xyXG4gICAgICAgIGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9IG5ld0dyb3VwO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGdldERlbGl2ZXJ5SW5mbygpOiBhbnkge1xyXG4gICAgY29uc29sZS5sb2coXCJnZXREZWxpdmVyeUdyb3VwSW5mb3IgaW5pdGlhdGluZ1wiKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBncm91cEluZm86IERlbGl2ZXJ5SW5mbyA9IHtcclxuICAgICAgICBncm91cHM6IFtdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZ2V0RGVsaXZlcnlHcm91cE51bWJlcnModGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKS5mb3JFYWNoKChncm91cE51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBncm91cDogYW55ID0ge1xyXG4gICAgICAgICAgZ3JvdXBOdW1iZXI6IGdyb3VwTnVtYmVyLFxyXG4gICAgICAgICAgaXRlbXM6IFtdLFxyXG4gICAgICAgICAgZXN0aW1hdGU6IHtcclxuICAgICAgICAgICAgdHlwZTogXCJIb3Vyc1wiLFxyXG4gICAgICAgICAgICB2YWx1ZTogXCIwXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBncm91cE51bWJlci50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLml0ZW1zLnB1c2goY0JQcm9kdWN0cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyb3VwLmVzdGltYXRlID0gdGhpcy5jYWxjdWxhdGVFc3RpbWF0ZWRUaW1lKGdyb3VwLml0ZW1zKTtcclxuXHJcbiAgICAgICAgZ3JvdXBJbmZvLmdyb3Vwcy5wdXNoKGdyb3VwKTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGdyb3VwSW5mbztcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|