@pmcretail/mapper-library 0.0.39 → 0.0.43
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/README.md +24 -24
- 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 +21 -17
- 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,2469 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @fileoverview added by tsickle
|
|
3
|
-
* Generated from: lib/TransactionDocumentBuilder.ts
|
|
4
|
-
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
|
|
5
|
-
*/
|
|
6
|
-
import * as tslib_1 from "tslib";
|
|
7
|
-
import { DELIVERY_METHODS } from "./mapper-library.model";
|
|
8
|
-
import { TRANSACTION_TYPE } from "./mapper-library.model";
|
|
9
|
-
import { BasketService } from "./basket.service";
|
|
10
|
-
import { NumberUtilService } from "./number-util.service";
|
|
11
|
-
/**
|
|
12
|
-
* Transaction document builder
|
|
13
|
-
*/
|
|
14
|
-
var /**
|
|
15
|
-
* Transaction document builder
|
|
16
|
-
*/
|
|
17
|
-
TransactionDocumentBuilder = /** @class */ (function () {
|
|
18
|
-
function TransactionDocumentBuilder(transactionDoc, currencyPipe, basketService) {
|
|
19
|
-
this.currencyPipe = currencyPipe;
|
|
20
|
-
this.basketService = basketService;
|
|
21
|
-
this.numberUtilService = new NumberUtilService(currencyPipe);
|
|
22
|
-
this.basketService = new BasketService(this.numberUtilService);
|
|
23
|
-
this.storeInfo = JSON.parse(localStorage.getItem('storeInfo') || '{}');
|
|
24
|
-
if (transactionDoc) {
|
|
25
|
-
this.transactionDocument = transactionDoc;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
this.transactionDocument = {
|
|
29
|
-
transactionId: "",
|
|
30
|
-
offlineTransactionId: "",
|
|
31
|
-
transactionRef: "",
|
|
32
|
-
dateTime: "",
|
|
33
|
-
orgCode: "",
|
|
34
|
-
storeId: "",
|
|
35
|
-
storeNodeId: "",
|
|
36
|
-
storeNodeStructure: "",
|
|
37
|
-
deviceId: "",
|
|
38
|
-
terminalId: "",
|
|
39
|
-
userId: "",
|
|
40
|
-
initiatingModule: "eBasket",
|
|
41
|
-
export: false,
|
|
42
|
-
basket: (/** @type {?} */ ({})),
|
|
43
|
-
basketSummary: (/** @type {?} */ ({})),
|
|
44
|
-
baseCurrency: "",
|
|
45
|
-
type: "",
|
|
46
|
-
operationStatus: "",
|
|
47
|
-
createdAt: "",
|
|
48
|
-
updatedAt: "",
|
|
49
|
-
id: "",
|
|
50
|
-
currentTransactionDetails: (/** @type {?} */ ({})),
|
|
51
|
-
saleTotal: 0,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Transactions ref
|
|
57
|
-
* @returns ref
|
|
58
|
-
*/
|
|
59
|
-
/**
|
|
60
|
-
* Transactions ref
|
|
61
|
-
* @return {?} ref
|
|
62
|
-
*/
|
|
63
|
-
TransactionDocumentBuilder.prototype.transactionRef = /**
|
|
64
|
-
* Transactions ref
|
|
65
|
-
* @return {?} ref
|
|
66
|
-
*/
|
|
67
|
-
function () {
|
|
68
|
-
/** @type {?} */
|
|
69
|
-
var storeDetails = JSON.parse(localStorage.getItem('storeInfo') || '{}');
|
|
70
|
-
/** @type {?} */
|
|
71
|
-
var date = new Date();
|
|
72
|
-
/** @type {?} */
|
|
73
|
-
var random = (((1 + Math.random()) * 0x10000) | 0)
|
|
74
|
-
.toString(16)
|
|
75
|
-
.substring(1);
|
|
76
|
-
this.transactionDocument.transactionRef =
|
|
77
|
-
storeDetails.orgCode + storeDetails.storeId + date.toISOString() + random;
|
|
78
|
-
console.log("ebasket: transaction ref created", this.transactionDocument.transactionRef);
|
|
79
|
-
return this;
|
|
80
|
-
};
|
|
81
|
-
/**
|
|
82
|
-
* Transactions id
|
|
83
|
-
* @param transactionID
|
|
84
|
-
* @returns id
|
|
85
|
-
*/
|
|
86
|
-
/**
|
|
87
|
-
* Transactions id
|
|
88
|
-
* @param {?} transactionID
|
|
89
|
-
* @param {?=} isOnline
|
|
90
|
-
* @return {?} id
|
|
91
|
-
*/
|
|
92
|
-
TransactionDocumentBuilder.prototype.transactionId = /**
|
|
93
|
-
* Transactions id
|
|
94
|
-
* @param {?} transactionID
|
|
95
|
-
* @param {?=} isOnline
|
|
96
|
-
* @return {?} id
|
|
97
|
-
*/
|
|
98
|
-
function (transactionID, isOnline) {
|
|
99
|
-
if (isOnline === void 0) { isOnline = true; }
|
|
100
|
-
if (isOnline) {
|
|
101
|
-
this.transactionDocument.transactionId = transactionID;
|
|
102
|
-
}
|
|
103
|
-
return this;
|
|
104
|
-
};
|
|
105
|
-
/**
|
|
106
|
-
* Transactions id
|
|
107
|
-
* @param transactionID
|
|
108
|
-
* @returns id
|
|
109
|
-
*/
|
|
110
|
-
/**
|
|
111
|
-
* Transactions id
|
|
112
|
-
* @param {?} transactionID
|
|
113
|
-
* @param {?} isOnline
|
|
114
|
-
* @return {?} id
|
|
115
|
-
*/
|
|
116
|
-
TransactionDocumentBuilder.prototype.offlineTransactionId = /**
|
|
117
|
-
* Transactions id
|
|
118
|
-
* @param {?} transactionID
|
|
119
|
-
* @param {?} isOnline
|
|
120
|
-
* @return {?} id
|
|
121
|
-
*/
|
|
122
|
-
function (transactionID, isOnline) {
|
|
123
|
-
if (!isOnline) {
|
|
124
|
-
this.transactionDocument.offlineTransactionId = transactionID;
|
|
125
|
-
}
|
|
126
|
-
return this;
|
|
127
|
-
};
|
|
128
|
-
/**
|
|
129
|
-
* storeNode Id
|
|
130
|
-
* @param storeNodeId
|
|
131
|
-
* @returns id
|
|
132
|
-
*/
|
|
133
|
-
/**
|
|
134
|
-
* storeNode Id
|
|
135
|
-
* @param {?} storeNodeId
|
|
136
|
-
* @return {?} id
|
|
137
|
-
*/
|
|
138
|
-
TransactionDocumentBuilder.prototype.storeNodeId = /**
|
|
139
|
-
* storeNode Id
|
|
140
|
-
* @param {?} storeNodeId
|
|
141
|
-
* @return {?} id
|
|
142
|
-
*/
|
|
143
|
-
function (storeNodeId) {
|
|
144
|
-
this.transactionDocument.storeNodeId = storeNodeId;
|
|
145
|
-
return this;
|
|
146
|
-
};
|
|
147
|
-
/**
|
|
148
|
-
* storeNode structure
|
|
149
|
-
* @param storeNodeStructure
|
|
150
|
-
* @returns id
|
|
151
|
-
*/
|
|
152
|
-
/**
|
|
153
|
-
* storeNode structure
|
|
154
|
-
* @param {?} storeNodeStructure
|
|
155
|
-
* @return {?} id
|
|
156
|
-
*/
|
|
157
|
-
TransactionDocumentBuilder.prototype.storeNodeStructure = /**
|
|
158
|
-
* storeNode structure
|
|
159
|
-
* @param {?} storeNodeStructure
|
|
160
|
-
* @return {?} id
|
|
161
|
-
*/
|
|
162
|
-
function (storeNodeStructure) {
|
|
163
|
-
this.transactionDocument.storeNodeStructure = storeNodeStructure;
|
|
164
|
-
return this;
|
|
165
|
-
};
|
|
166
|
-
/**
|
|
167
|
-
* Orgs code
|
|
168
|
-
* @param orgCode
|
|
169
|
-
* @returns code
|
|
170
|
-
*/
|
|
171
|
-
/**
|
|
172
|
-
* Orgs code
|
|
173
|
-
* @param {?} orgCode
|
|
174
|
-
* @return {?} code
|
|
175
|
-
*/
|
|
176
|
-
TransactionDocumentBuilder.prototype.orgCode = /**
|
|
177
|
-
* Orgs code
|
|
178
|
-
* @param {?} orgCode
|
|
179
|
-
* @return {?} code
|
|
180
|
-
*/
|
|
181
|
-
function (orgCode) {
|
|
182
|
-
this.transactionDocument.orgCode = orgCode;
|
|
183
|
-
return this;
|
|
184
|
-
};
|
|
185
|
-
/**
|
|
186
|
-
* Stores id
|
|
187
|
-
* @param storeId
|
|
188
|
-
* @returns id
|
|
189
|
-
*/
|
|
190
|
-
/**
|
|
191
|
-
* Stores id
|
|
192
|
-
* @param {?} storeId
|
|
193
|
-
* @return {?} id
|
|
194
|
-
*/
|
|
195
|
-
TransactionDocumentBuilder.prototype.storeId = /**
|
|
196
|
-
* Stores id
|
|
197
|
-
* @param {?} storeId
|
|
198
|
-
* @return {?} id
|
|
199
|
-
*/
|
|
200
|
-
function (storeId) {
|
|
201
|
-
this.transactionDocument.storeId = storeId;
|
|
202
|
-
return this;
|
|
203
|
-
};
|
|
204
|
-
/**
|
|
205
|
-
* Dates time
|
|
206
|
-
* @returns time
|
|
207
|
-
*/
|
|
208
|
-
/**
|
|
209
|
-
* Dates time
|
|
210
|
-
* @return {?} time
|
|
211
|
-
*/
|
|
212
|
-
TransactionDocumentBuilder.prototype.dateTime = /**
|
|
213
|
-
* Dates time
|
|
214
|
-
* @return {?} time
|
|
215
|
-
*/
|
|
216
|
-
function () {
|
|
217
|
-
/** @type {?} */
|
|
218
|
-
var date = new Date();
|
|
219
|
-
this.transactionDocument.dateTime = date.toISOString();
|
|
220
|
-
return this;
|
|
221
|
-
};
|
|
222
|
-
/**
|
|
223
|
-
* Devices id
|
|
224
|
-
* @param deviceId
|
|
225
|
-
* @returns id
|
|
226
|
-
*/
|
|
227
|
-
/**
|
|
228
|
-
* Devices id
|
|
229
|
-
* @param {?} deviceId
|
|
230
|
-
* @return {?} id
|
|
231
|
-
*/
|
|
232
|
-
TransactionDocumentBuilder.prototype.deviceId = /**
|
|
233
|
-
* Devices id
|
|
234
|
-
* @param {?} deviceId
|
|
235
|
-
* @return {?} id
|
|
236
|
-
*/
|
|
237
|
-
function (deviceId) {
|
|
238
|
-
this.transactionDocument.deviceId = deviceId;
|
|
239
|
-
return this;
|
|
240
|
-
};
|
|
241
|
-
/**
|
|
242
|
-
* terminal id
|
|
243
|
-
* @param terminalId
|
|
244
|
-
* @returns id
|
|
245
|
-
*/
|
|
246
|
-
/**
|
|
247
|
-
* terminal id
|
|
248
|
-
* @param {?} terminalId
|
|
249
|
-
* @return {?} id
|
|
250
|
-
*/
|
|
251
|
-
TransactionDocumentBuilder.prototype.terminalId = /**
|
|
252
|
-
* terminal id
|
|
253
|
-
* @param {?} terminalId
|
|
254
|
-
* @return {?} id
|
|
255
|
-
*/
|
|
256
|
-
function (terminalId) {
|
|
257
|
-
this.transactionDocument.terminalId = terminalId;
|
|
258
|
-
return this;
|
|
259
|
-
};
|
|
260
|
-
/**
|
|
261
|
-
* saleExport
|
|
262
|
-
* @param saleExport
|
|
263
|
-
* @returns id
|
|
264
|
-
*/
|
|
265
|
-
/**
|
|
266
|
-
* saleExport
|
|
267
|
-
* @param {?} saleExport
|
|
268
|
-
* @return {?} id
|
|
269
|
-
*/
|
|
270
|
-
TransactionDocumentBuilder.prototype.export = /**
|
|
271
|
-
* saleExport
|
|
272
|
-
* @param {?} saleExport
|
|
273
|
-
* @return {?} id
|
|
274
|
-
*/
|
|
275
|
-
function (saleExport) {
|
|
276
|
-
this.transactionDocument.export = saleExport;
|
|
277
|
-
return this;
|
|
278
|
-
};
|
|
279
|
-
/* customer(): TransactionDocumentBuilder {
|
|
280
|
-
const user = JSON.parse(localStorage.getItem('userDetails'));
|
|
281
|
-
this.transactionDocument.customer = user;
|
|
282
|
-
return this;
|
|
283
|
-
} */
|
|
284
|
-
/**
|
|
285
|
-
* Baskets transaction document builder
|
|
286
|
-
* @param basketDetails
|
|
287
|
-
* @returns basket
|
|
288
|
-
*/
|
|
289
|
-
/* customer(): TransactionDocumentBuilder {
|
|
290
|
-
const user = JSON.parse(localStorage.getItem('userDetails'));
|
|
291
|
-
this.transactionDocument.customer = user;
|
|
292
|
-
return this;
|
|
293
|
-
} */
|
|
294
|
-
/**
|
|
295
|
-
* Baskets transaction document builder
|
|
296
|
-
* @param {?} basketDetails
|
|
297
|
-
* @return {?} basket
|
|
298
|
-
*/
|
|
299
|
-
TransactionDocumentBuilder.prototype.basket = /* customer(): TransactionDocumentBuilder {
|
|
300
|
-
const user = JSON.parse(localStorage.getItem('userDetails'));
|
|
301
|
-
this.transactionDocument.customer = user;
|
|
302
|
-
return this;
|
|
303
|
-
} */
|
|
304
|
-
/**
|
|
305
|
-
* Baskets transaction document builder
|
|
306
|
-
* @param {?} basketDetails
|
|
307
|
-
* @return {?} basket
|
|
308
|
-
*/
|
|
309
|
-
function (basketDetails) {
|
|
310
|
-
var _this = this;
|
|
311
|
-
console.log("ebasket: basket details update in transaction document", JSON.stringify(basketDetails));
|
|
312
|
-
this.transactionDocument.subsidiaryId = basketDetails.subsidiaryId || (localStorage.getItem('subsidiaryId') || '');
|
|
313
|
-
this.transactionDocument.basket.products = (/** @type {?} */ ([]));
|
|
314
|
-
this.transactionDocument.basket.lineDiscount = [];
|
|
315
|
-
this.transactionDocument.basket.linePromotion = [];
|
|
316
|
-
this.transactionDocument.basket.transactionPromotion = [];
|
|
317
|
-
basketDetails.products.forEach((/**
|
|
318
|
-
* @param {?} product
|
|
319
|
-
* @param {?} index
|
|
320
|
-
* @return {?}
|
|
321
|
-
*/
|
|
322
|
-
function (product, index) {
|
|
323
|
-
/** @type {?} */
|
|
324
|
-
var p = (/** @type {?} */ ({}));
|
|
325
|
-
p.itemDiscounts = (/** @type {?} */ ({}));
|
|
326
|
-
p.SKU = product.SKU;
|
|
327
|
-
p.excludePromotion = product.excludePromotion;
|
|
328
|
-
p.barCode = product.barcode;
|
|
329
|
-
p.barcodes = product.barcodes;
|
|
330
|
-
p.description = product.description;
|
|
331
|
-
p.itemLineId = product.itemLineId ? product.itemLineId.toString() : "" + (index + 1);
|
|
332
|
-
p.price = product.selectedPrice;
|
|
333
|
-
p.quantity = product.quantity;
|
|
334
|
-
p.totalLinePrice = product.quantity * product.selectedPrice;
|
|
335
|
-
p.imageUrls = product.imageUrls;
|
|
336
|
-
p.selectedRRPPrice = product.selectedRRPPrice;
|
|
337
|
-
//inventory fields
|
|
338
|
-
p.fullfilmentId = product.fullfilmentId ? product.fullfilmentId : _this.storeInfo.storeId;
|
|
339
|
-
p.fullfilmentLocationName = product.fullfilmentLocationName;
|
|
340
|
-
p.deliveryGroup = product.deliveryGroup;
|
|
341
|
-
p.leadTime = product.leadTime;
|
|
342
|
-
p.deliveryMethod = product.deliveryMethod;
|
|
343
|
-
p.giftCard = product.giftCard;
|
|
344
|
-
p.giftCardExpiryDate = product.giftCardExpiryDate;
|
|
345
|
-
p.giftCardNumberIssued = product.giftCardNumberIssued;
|
|
346
|
-
p.giftCardRecipientEmail = product.giftCardRecipientEmail;
|
|
347
|
-
p.giftCardRecipientName = product.giftCardRecipientName;
|
|
348
|
-
if (product.refundedQuantity > 0) {
|
|
349
|
-
p.refundedQuantity = product.refundedQuantity;
|
|
350
|
-
p.refundedPromotionalQuantity = product.refundPromotionalQuantity;
|
|
351
|
-
p.refunded = product.refunded;
|
|
352
|
-
p.refundedReasonDescription = product.refundedReasonDescription;
|
|
353
|
-
p.refundedReason = product.refundedReason;
|
|
354
|
-
if (!p.refundedReasonDescription) {
|
|
355
|
-
p.refundedReasonDescription = p.refundedReason;
|
|
356
|
-
}
|
|
357
|
-
p.refundedTotal = product.refundedTotal;
|
|
358
|
-
p.isLastExchanged = product.isLastExchanged;
|
|
359
|
-
}
|
|
360
|
-
if (product.exchange) {
|
|
361
|
-
p.exchange = product.exchange;
|
|
362
|
-
}
|
|
363
|
-
if (product.lineDiscount) {
|
|
364
|
-
p.lineDiscount = product.lineDiscount;
|
|
365
|
-
}
|
|
366
|
-
p.itemDiscounts = (/** @type {?} */ (product.itemDiscounts));
|
|
367
|
-
_this.transactionDocument.basket.products.push(p);
|
|
368
|
-
_this.lineDiscount(basketDetails);
|
|
369
|
-
}));
|
|
370
|
-
console.info("ebasket: transactiondocument basket details updated", JSON.stringify(this.transactionDocument.basket));
|
|
371
|
-
return this;
|
|
372
|
-
};
|
|
373
|
-
/**
|
|
374
|
-
* current transaction Details Total(New Products)
|
|
375
|
-
* @returns currentTransactionDetails
|
|
376
|
-
*/
|
|
377
|
-
/**
|
|
378
|
-
* current transaction Details Total(New Products)
|
|
379
|
-
* @param {?} basket
|
|
380
|
-
* @return {?} currentTransactionDetails
|
|
381
|
-
*/
|
|
382
|
-
TransactionDocumentBuilder.prototype.currentTransactionDetails = /**
|
|
383
|
-
* current transaction Details Total(New Products)
|
|
384
|
-
* @param {?} basket
|
|
385
|
-
* @return {?} currentTransactionDetails
|
|
386
|
-
*/
|
|
387
|
-
function (basket) {
|
|
388
|
-
var _a;
|
|
389
|
-
var _this = this;
|
|
390
|
-
console.log("ebasket: current transaction details for exchanges", basket);
|
|
391
|
-
this.transactionDocument.currentTransactionDetails.products = (/** @type {?} */ ([]));
|
|
392
|
-
this.transactionDocument.currentTransactionDetails.linePromotion = (/** @type {?} */ ([]));
|
|
393
|
-
this.transactionDocument.currentTransactionDetails.lineDiscount = (/** @type {?} */ ([]));
|
|
394
|
-
this.transactionDocument.currentTransactionDetails.transactionDiscount = [];
|
|
395
|
-
this.transactionDocument.currentTransactionDetails.products = basket.products;
|
|
396
|
-
this.transactionDocument.currentTransactionDetails.products = this.transactionDocument.currentTransactionDetails.products.filter((/**
|
|
397
|
-
* @param {?} proj
|
|
398
|
-
* @return {?}
|
|
399
|
-
*/
|
|
400
|
-
function (proj) { return proj.refundedQuantity != 0; }));
|
|
401
|
-
this.transactionDocument.currentTransactionDetails.products.forEach((/**
|
|
402
|
-
* @param {?} product
|
|
403
|
-
* @return {?}
|
|
404
|
-
*/
|
|
405
|
-
function (product) {
|
|
406
|
-
if (product.refundedQuantity) {
|
|
407
|
-
product.quantity = product.refundedQuantity;
|
|
408
|
-
// updating total line price with actual price to be refunded including the refunding qty
|
|
409
|
-
product.totalLinePrice = Math.abs(product.refundedTotal);
|
|
410
|
-
product.total = product.totalLinePrice;
|
|
411
|
-
if (product.quantity === product.refundedQuantity) {
|
|
412
|
-
product.refunded = true;
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
//Updating line promotions and line discounts
|
|
416
|
-
if (product.linePromotions && !product.refundedQuantity) {
|
|
417
|
-
_this.transactionDocument.currentTransactionDetails.linePromotion.push(product.linePromotions);
|
|
418
|
-
}
|
|
419
|
-
if (product.lineDiscount && !product.refundedQuantity) {
|
|
420
|
-
_this.transactionDocument.currentTransactionDetails.lineDiscount.push(product.lineDiscount);
|
|
421
|
-
}
|
|
422
|
-
}));
|
|
423
|
-
console.log("ebasket: current transaction details after removing old products", this.transactionDocument.currentTransactionDetails.products);
|
|
424
|
-
if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
|
|
425
|
-
(_a = this.transactionDocument.currentTransactionDetails.transactionDiscount).push.apply(_a, tslib_1.__spread(basket.transactionDiscount));
|
|
426
|
-
}
|
|
427
|
-
this.transactionDocument.currentTransactionDetails.basketSummary = (/** @type {?} */ ({}));
|
|
428
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(this.transactionDocument.currentTransactionDetails));
|
|
429
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.totalItems = basket.quantity;
|
|
430
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal = basket.basketTotal;
|
|
431
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal = this.updateCurrentTransactionDetailsRefundTotal();
|
|
432
|
-
// For partial refund discount is updatied in total line price so discountTotal will always be zero & in case of exchange discount total is calculated
|
|
433
|
-
if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
|
|
434
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateCurrentTransactionDetailsDiscountTotal());
|
|
435
|
-
}
|
|
436
|
-
else {
|
|
437
|
-
if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {
|
|
438
|
-
/** @type {?} */
|
|
439
|
-
var discountTotal_1 = 0;
|
|
440
|
-
this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((/**
|
|
441
|
-
* @param {?} discount
|
|
442
|
-
* @return {?}
|
|
443
|
-
*/
|
|
444
|
-
function (discount) {
|
|
445
|
-
discountTotal_1 += discount.discountAmount;
|
|
446
|
-
}));
|
|
447
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = Math.abs(discountTotal_1);
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = 0;
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
console.log("ebasket:this.transactionDocument.currentTransactionDetails", JSON.stringify(this.transactionDocument.currentTransactionDetails));
|
|
454
|
-
return this;
|
|
455
|
-
};
|
|
456
|
-
/**
|
|
457
|
-
* current transaction Tax Total
|
|
458
|
-
* @returns Tax Total
|
|
459
|
-
*/
|
|
460
|
-
/**
|
|
461
|
-
* current transaction Tax Total
|
|
462
|
-
* @param {?} basketDetails
|
|
463
|
-
* @return {?} Tax Total
|
|
464
|
-
*/
|
|
465
|
-
TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsTaxBreakdown = /**
|
|
466
|
-
* current transaction Tax Total
|
|
467
|
-
* @param {?} basketDetails
|
|
468
|
-
* @return {?} Tax Total
|
|
469
|
-
*/
|
|
470
|
-
function (basketDetails) {
|
|
471
|
-
var _this = this;
|
|
472
|
-
/** @type {?} */
|
|
473
|
-
var transactionDiscountTotal = 0;
|
|
474
|
-
/** @type {?} */
|
|
475
|
-
var taxBreakdown = {
|
|
476
|
-
taxLines: [],
|
|
477
|
-
totalTaxableAmount: 0,
|
|
478
|
-
};
|
|
479
|
-
if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {
|
|
480
|
-
this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((/**
|
|
481
|
-
* @param {?} discount
|
|
482
|
-
* @return {?}
|
|
483
|
-
*/
|
|
484
|
-
function (discount) {
|
|
485
|
-
transactionDiscountTotal += discount.discountAmount;
|
|
486
|
-
}));
|
|
487
|
-
}
|
|
488
|
-
if (this.transactionDocument.currentTransactionDetails.products && this.transactionDocument.currentTransactionDetails.products.length > 0) {
|
|
489
|
-
this.transactionDocument.currentTransactionDetails.products.forEach((/**
|
|
490
|
-
* @param {?} product
|
|
491
|
-
* @return {?}
|
|
492
|
-
*/
|
|
493
|
-
function (product) {
|
|
494
|
-
/** @type {?} */
|
|
495
|
-
var taxLine = {
|
|
496
|
-
itemLineId: product.itemLineId,
|
|
497
|
-
VAT: product.selectedVAT ? product.selectedVAT : 0,
|
|
498
|
-
VATCode: product.selectedVATCode,
|
|
499
|
-
taxLineTotal: 0,
|
|
500
|
-
taxableAmount: product.total,
|
|
501
|
-
PreTax: 0
|
|
502
|
-
};
|
|
503
|
-
console.info("Product contribution : item line ID :current transaction Details", product.itemLineId, "tax line :", JSON.stringify(taxLine), JSON.stringify(basketDetails.basketTotal));
|
|
504
|
-
//step 1
|
|
505
|
-
// if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
|
|
506
|
-
//If transaction discount/promotion is applied taxable amount should be deducting transaction promotion and transaction disacount portion
|
|
507
|
-
if (product.refundedQuantity && product.refundedQuantity > 0) {
|
|
508
|
-
taxLine.taxableAmount = -Math.abs(taxLine.taxableAmount - product.itemDiscounts.currentRefundPortion);
|
|
509
|
-
}
|
|
510
|
-
else {
|
|
511
|
-
taxLine.taxableAmount = taxLine.taxableAmount - product.itemDiscounts.trnDiscountsPortion - product.itemDiscounts.trnPromotionsPortion;
|
|
512
|
-
}
|
|
513
|
-
//step 2 - find pre tax
|
|
514
|
-
taxLine.PreTax = _this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));
|
|
515
|
-
//step 3 - Update taxbreakdown
|
|
516
|
-
taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;
|
|
517
|
-
taxLine.taxableAmount = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);
|
|
518
|
-
// step 4 - update tax Line total
|
|
519
|
-
taxLine.taxLineTotal = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);
|
|
520
|
-
taxBreakdown.taxLines.push(taxLine);
|
|
521
|
-
}));
|
|
522
|
-
}
|
|
523
|
-
taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);
|
|
524
|
-
this.transactionDocument.currentTransactionDetails.taxBreakdown = taxBreakdown;
|
|
525
|
-
if (this.transactionDocument.currentTransactionDetails.taxBreakdown && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.length > 0) {
|
|
526
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.reduce((/**
|
|
527
|
-
* @param {?} n
|
|
528
|
-
* @param {?} __1
|
|
529
|
-
* @return {?}
|
|
530
|
-
*/
|
|
531
|
-
function (n, _a) {
|
|
532
|
-
var taxLineTotal = _a.taxLineTotal;
|
|
533
|
-
return n + taxLineTotal;
|
|
534
|
-
}), 0));
|
|
535
|
-
}
|
|
536
|
-
else {
|
|
537
|
-
this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = 0.00;
|
|
538
|
-
}
|
|
539
|
-
console.log("eBasket:after calculating tax currenttransactionDetails", this.transactionDocument.currentTransactionDetails);
|
|
540
|
-
return this;
|
|
541
|
-
};
|
|
542
|
-
/**
|
|
543
|
-
* @return {?}
|
|
544
|
-
*/
|
|
545
|
-
TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsTotalTaxSummary = /**
|
|
546
|
-
* @return {?}
|
|
547
|
-
*/
|
|
548
|
-
function () {
|
|
549
|
-
var _this = this;
|
|
550
|
-
console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown));
|
|
551
|
-
/** @type {?} */
|
|
552
|
-
var totalTaxSummaryArray = [];
|
|
553
|
-
/** @type {?} */
|
|
554
|
-
var totalTaxSummaryGroup = [];
|
|
555
|
-
console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines));
|
|
556
|
-
this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.forEach((/**
|
|
557
|
-
* @param {?} element
|
|
558
|
-
* @return {?}
|
|
559
|
-
*/
|
|
560
|
-
function (element) {
|
|
561
|
-
/** @type {?} */
|
|
562
|
-
var TaxSummary = {
|
|
563
|
-
VATCode: "",
|
|
564
|
-
VAT: -12345,
|
|
565
|
-
PreTaxSum: 0,
|
|
566
|
-
TaxSum: 0,
|
|
567
|
-
TXrateSum: 0
|
|
568
|
-
};
|
|
569
|
-
TaxSummary.VATCode = element.VATCode;
|
|
570
|
-
TaxSummary.VAT = element.VAT;
|
|
571
|
-
TaxSummary.PreTaxSum = _this.numberUtilService.trimTo2Decimal2(element.PreTax);
|
|
572
|
-
TaxSummary.TaxSum = _this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);
|
|
573
|
-
TaxSummary.TXrateSum = _this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
|
|
574
|
-
totalTaxSummaryArray.push(TaxSummary);
|
|
575
|
-
}));
|
|
576
|
-
console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
|
|
577
|
-
totalTaxSummaryGroup = totalTaxSummaryArray.reduce((/**
|
|
578
|
-
* @param {?} preparedArray
|
|
579
|
-
* @param {?} currentObj
|
|
580
|
-
* @return {?}
|
|
581
|
-
*/
|
|
582
|
-
function (preparedArray, currentObj) {
|
|
583
|
-
/** @type {?} */
|
|
584
|
-
var ind = preparedArray.findIndex((/**
|
|
585
|
-
* @param {?} x
|
|
586
|
-
* @return {?}
|
|
587
|
-
*/
|
|
588
|
-
function (x) { return x.VAT === currentObj.VAT; }));
|
|
589
|
-
if (ind === -1) {
|
|
590
|
-
preparedArray.push(currentObj);
|
|
591
|
-
}
|
|
592
|
-
else {
|
|
593
|
-
preparedArray[ind].VATCode = currentObj.VATCode;
|
|
594
|
-
preparedArray[ind].VAT = currentObj.VAT;
|
|
595
|
-
preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;
|
|
596
|
-
preparedArray[ind].TaxSum += currentObj.TaxSum;
|
|
597
|
-
preparedArray[ind].TXrateSum += currentObj.TXrateSum;
|
|
598
|
-
}
|
|
599
|
-
return preparedArray;
|
|
600
|
-
}), []);
|
|
601
|
-
// listOfTags.map(x => unique.filter(a => a.label == x.label && a.color == x.color).length > 0 ? null : unique.push(x));
|
|
602
|
-
console.log("Total Tax Summer Group :", JSON.stringify(totalTaxSummaryGroup));
|
|
603
|
-
this.transactionDocument.currentTransactionDetails.totalTaxSummary = totalTaxSummaryGroup;
|
|
604
|
-
return this;
|
|
605
|
-
};
|
|
606
|
-
/**
|
|
607
|
-
* current transaction Disocunt Total
|
|
608
|
-
* @returns Discount Total
|
|
609
|
-
*/
|
|
610
|
-
/**
|
|
611
|
-
* current transaction Disocunt Total
|
|
612
|
-
* @return {?} Discount Total
|
|
613
|
-
*/
|
|
614
|
-
TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsDiscountTotal = /**
|
|
615
|
-
* current transaction Disocunt Total
|
|
616
|
-
* @return {?} Discount Total
|
|
617
|
-
*/
|
|
618
|
-
function () {
|
|
619
|
-
/** @type {?} */
|
|
620
|
-
var refundTotal = this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal ? this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal : 0;
|
|
621
|
-
console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", refundTotal, this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal, this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal);
|
|
622
|
-
/** @type {?} */
|
|
623
|
-
var discountTotal = Math.abs(Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal) -
|
|
624
|
-
(Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal) + Math.abs(refundTotal)));
|
|
625
|
-
console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", discountTotal);
|
|
626
|
-
return Number(discountTotal.toFixed(2));
|
|
627
|
-
};
|
|
628
|
-
/**
|
|
629
|
-
* current transaction Refund Total
|
|
630
|
-
* @returns Refund Total
|
|
631
|
-
*/
|
|
632
|
-
/**
|
|
633
|
-
* current transaction Refund Total
|
|
634
|
-
* @return {?} Refund Total
|
|
635
|
-
*/
|
|
636
|
-
TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsRefundTotal = /**
|
|
637
|
-
* current transaction Refund Total
|
|
638
|
-
* @return {?} Refund Total
|
|
639
|
-
*/
|
|
640
|
-
function () {
|
|
641
|
-
/** @type {?} */
|
|
642
|
-
var totalRefund = 0;
|
|
643
|
-
for (var index = 0; index < this.transactionDocument.currentTransactionDetails.products.length; index++) {
|
|
644
|
-
/** @type {?} */
|
|
645
|
-
var product = this.transactionDocument.currentTransactionDetails.products[index];
|
|
646
|
-
if (product.refundedTotal) {
|
|
647
|
-
totalRefund = totalRefund + product.refundedTotal;
|
|
648
|
-
}
|
|
649
|
-
console.log("ebasket : transaction Service: totalRefund for Current TransactionDetails" + totalRefund);
|
|
650
|
-
}
|
|
651
|
-
return totalRefund;
|
|
652
|
-
};
|
|
653
|
-
/**
|
|
654
|
-
* Baskets summary
|
|
655
|
-
* @param basketDetails
|
|
656
|
-
* @returns summary
|
|
657
|
-
*/
|
|
658
|
-
/**
|
|
659
|
-
* Baskets summary
|
|
660
|
-
* @param {?} basketDetails
|
|
661
|
-
* @return {?} summary
|
|
662
|
-
*/
|
|
663
|
-
TransactionDocumentBuilder.prototype.basketSummary = /**
|
|
664
|
-
* Baskets summary
|
|
665
|
-
* @param {?} basketDetails
|
|
666
|
-
* @return {?} summary
|
|
667
|
-
*/
|
|
668
|
-
function (basketDetails) {
|
|
669
|
-
this.transactionDocument.basketSummary.basketTotal = this.numberUtilService.trimTo2Decimal(basketDetails.basketTotal);
|
|
670
|
-
this.transactionDocument.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(basketDetails));
|
|
671
|
-
this.transactionDocument.basketSummary.refundTotal = this.getRefundTotal();
|
|
672
|
-
if (this.transactionDocument.basket.lineDiscount ||
|
|
673
|
-
this.transactionDocument.basket.linePromotion) {
|
|
674
|
-
this.transactionDocument.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateDiscountTotal());
|
|
675
|
-
}
|
|
676
|
-
this.transactionDocument.basketSummary.totalItems = basketDetails.quantity;
|
|
677
|
-
if (this.transactionDocument.basket.taxBreakdown) {
|
|
678
|
-
this.transactionDocument.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.basket.taxBreakdown.taxLines.reduce((/**
|
|
679
|
-
* @param {?} n
|
|
680
|
-
* @param {?} __1
|
|
681
|
-
* @return {?}
|
|
682
|
-
*/
|
|
683
|
-
function (n, _a) {
|
|
684
|
-
var taxLineTotal = _a.taxLineTotal;
|
|
685
|
-
return n + taxLineTotal;
|
|
686
|
-
}), 0));
|
|
687
|
-
}
|
|
688
|
-
else {
|
|
689
|
-
this.transactionDocument.basketSummary.VATTotal = 0.00;
|
|
690
|
-
}
|
|
691
|
-
console.info("ebasket: basketsummary updated in transaction document: ", JSON.stringify(this.transactionDocument.basketSummary));
|
|
692
|
-
return this;
|
|
693
|
-
};
|
|
694
|
-
/**
|
|
695
|
-
* Line Discount
|
|
696
|
-
* @param basketDetails
|
|
697
|
-
* @returns line Discount
|
|
698
|
-
*/
|
|
699
|
-
/**
|
|
700
|
-
* Line Discount
|
|
701
|
-
* @param {?} basketDetails
|
|
702
|
-
* @return {?} line Discount
|
|
703
|
-
*/
|
|
704
|
-
TransactionDocumentBuilder.prototype.lineDiscount = /**
|
|
705
|
-
* Line Discount
|
|
706
|
-
* @param {?} basketDetails
|
|
707
|
-
* @return {?} line Discount
|
|
708
|
-
*/
|
|
709
|
-
function (basketDetails) {
|
|
710
|
-
this.transactionDocument.basket.lineDiscount = [];
|
|
711
|
-
for (var index = 0; index < basketDetails.products.length; index++) {
|
|
712
|
-
/** @type {?} */
|
|
713
|
-
var element = basketDetails.products[index];
|
|
714
|
-
if (element.lineDiscount) {
|
|
715
|
-
this.transactionDocument.basket.lineDiscount.push(element.lineDiscount);
|
|
716
|
-
this.transactionDocument.basket.lineDiscount = this.transactionDocument.basket.lineDiscount.reduce((/**
|
|
717
|
-
* @param {?} acc
|
|
718
|
-
* @param {?} val
|
|
719
|
-
* @return {?}
|
|
720
|
-
*/
|
|
721
|
-
function (acc, val) {
|
|
722
|
-
if (!acc.find((/**
|
|
723
|
-
* @param {?} el
|
|
724
|
-
* @return {?}
|
|
725
|
-
*/
|
|
726
|
-
function (el) { return el.itemLineId === val.itemLineId; }))) {
|
|
727
|
-
acc.push(val);
|
|
728
|
-
}
|
|
729
|
-
return acc;
|
|
730
|
-
}), []);
|
|
731
|
-
}
|
|
732
|
-
// console.info(
|
|
733
|
-
// "e-basket :line discount updated in transaction document",
|
|
734
|
-
// this.transactionDocument.basket.lineDiscount
|
|
735
|
-
// );
|
|
736
|
-
}
|
|
737
|
-
return this;
|
|
738
|
-
};
|
|
739
|
-
/**
|
|
740
|
-
* exchange
|
|
741
|
-
* @param basketDetails
|
|
742
|
-
* @returns exchange
|
|
743
|
-
*/
|
|
744
|
-
/**
|
|
745
|
-
* exchange
|
|
746
|
-
* @param {?} basketDetails
|
|
747
|
-
* @return {?} exchange
|
|
748
|
-
*/
|
|
749
|
-
TransactionDocumentBuilder.prototype.exchange = /**
|
|
750
|
-
* exchange
|
|
751
|
-
* @param {?} basketDetails
|
|
752
|
-
* @return {?} exchange
|
|
753
|
-
*/
|
|
754
|
-
function (basketDetails) {
|
|
755
|
-
this.transactionDocument.basket.exchange = basketDetails.exchange && basketDetails.exchange.length > 0 ? tslib_1.__spread(basketDetails.exchange) : [];
|
|
756
|
-
var _loop_1 = function (index) {
|
|
757
|
-
/** @type {?} */
|
|
758
|
-
var element = basketDetails.products[index];
|
|
759
|
-
if (element.exchange != undefined) {
|
|
760
|
-
/** @type {?} */
|
|
761
|
-
var isPresent = this_1.transactionDocument.basket.exchange.some((/**
|
|
762
|
-
* @param {?} el
|
|
763
|
-
* @return {?}
|
|
764
|
-
*/
|
|
765
|
-
function (el) { return el.exchangeId === element.exchange.exchangeId; }));
|
|
766
|
-
if (!isPresent) {
|
|
767
|
-
/** @type {?} */
|
|
768
|
-
var exchangeItems = [];
|
|
769
|
-
for (var j = 0; j < element.exchange.newItems.length; j++) {
|
|
770
|
-
/** @type {?} */
|
|
771
|
-
var item = element.exchange.newItems[j];
|
|
772
|
-
/** @type {?} */
|
|
773
|
-
var newItems = { lineItemId: item.itemLineId, Quantity: item.quantity };
|
|
774
|
-
exchangeItems.push(newItems);
|
|
775
|
-
}
|
|
776
|
-
element.exchange.newItems = tslib_1.__spread(exchangeItems);
|
|
777
|
-
this_1.transactionDocument.basket.exchange.push(element.exchange);
|
|
778
|
-
}
|
|
779
|
-
}
|
|
780
|
-
console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket exchange", JSON.stringify(this_1.transactionDocument.basket.exchange));
|
|
781
|
-
};
|
|
782
|
-
var this_1 = this;
|
|
783
|
-
for (var index = 0; index < basketDetails.products.length; index++) {
|
|
784
|
-
_loop_1(index);
|
|
785
|
-
}
|
|
786
|
-
return this;
|
|
787
|
-
};
|
|
788
|
-
/**
|
|
789
|
-
* add previous exchange data
|
|
790
|
-
* @param originalTransactionDocument
|
|
791
|
-
* @returns line Promotions
|
|
792
|
-
*/
|
|
793
|
-
/**
|
|
794
|
-
* add previous exchange data
|
|
795
|
-
* @param {?} originalTransactionDocument
|
|
796
|
-
* @return {?} line Promotions
|
|
797
|
-
*/
|
|
798
|
-
TransactionDocumentBuilder.prototype.addExchangeData = /**
|
|
799
|
-
* add previous exchange data
|
|
800
|
-
* @param {?} originalTransactionDocument
|
|
801
|
-
* @return {?} line Promotions
|
|
802
|
-
*/
|
|
803
|
-
function (originalTransactionDocument) {
|
|
804
|
-
this.transactionDocument.basket.exchange = originalTransactionDocument.basket.exchange ? tslib_1.__spread(originalTransactionDocument.basket.exchange) : null;
|
|
805
|
-
return this;
|
|
806
|
-
};
|
|
807
|
-
/**
|
|
808
|
-
* line Promotions
|
|
809
|
-
* @param basketDetails
|
|
810
|
-
* @returns line Promotions
|
|
811
|
-
*/
|
|
812
|
-
/**
|
|
813
|
-
* line Promotions
|
|
814
|
-
* @param {?} basketDetails
|
|
815
|
-
* @return {?} line Promotions
|
|
816
|
-
*/
|
|
817
|
-
TransactionDocumentBuilder.prototype.linePromotion = /**
|
|
818
|
-
* line Promotions
|
|
819
|
-
* @param {?} basketDetails
|
|
820
|
-
* @return {?} line Promotions
|
|
821
|
-
*/
|
|
822
|
-
function (basketDetails) {
|
|
823
|
-
this.transactionDocument.basket.linePromotion = [];
|
|
824
|
-
for (var index = 0; index < basketDetails.products.length; index++) {
|
|
825
|
-
/** @type {?} */
|
|
826
|
-
var element = basketDetails.products[index];
|
|
827
|
-
if (element.linePromotions) {
|
|
828
|
-
this.transactionDocument.basket.linePromotion.push(element.linePromotions);
|
|
829
|
-
this.transactionDocument.basket.linePromotion = this.transactionDocument.basket.linePromotion.reduce((/**
|
|
830
|
-
* @param {?} acc
|
|
831
|
-
* @param {?} val
|
|
832
|
-
* @return {?}
|
|
833
|
-
*/
|
|
834
|
-
function (acc, val) {
|
|
835
|
-
if (!acc.find((/**
|
|
836
|
-
* @param {?} el
|
|
837
|
-
* @return {?}
|
|
838
|
-
*/
|
|
839
|
-
function (el) { return el.itemLineId === val.itemLineId; }))) {
|
|
840
|
-
acc.push(val);
|
|
841
|
-
}
|
|
842
|
-
return acc;
|
|
843
|
-
}), []);
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
return this;
|
|
847
|
-
};
|
|
848
|
-
/**
|
|
849
|
-
* transaction Promotion
|
|
850
|
-
* @param basketDetails
|
|
851
|
-
* @returns transaction Promotion
|
|
852
|
-
*/
|
|
853
|
-
/**
|
|
854
|
-
* transaction Promotion
|
|
855
|
-
* @param {?} basketDetails
|
|
856
|
-
* @return {?} transaction Promotion
|
|
857
|
-
*/
|
|
858
|
-
TransactionDocumentBuilder.prototype.transactionPromotion = /**
|
|
859
|
-
* transaction Promotion
|
|
860
|
-
* @param {?} basketDetails
|
|
861
|
-
* @return {?} transaction Promotion
|
|
862
|
-
*/
|
|
863
|
-
function (basketDetails) {
|
|
864
|
-
if (basketDetails.transactionPromotion) {
|
|
865
|
-
this.transactionDocument.basket.transactionPromotion =
|
|
866
|
-
basketDetails.transactionPromotion;
|
|
867
|
-
// for (let index = 0; index < basketDetails.TransactionDiscount.length; index++) {
|
|
868
|
-
// this.transactionDocument.basket.transactionPromotion.push(element.linePromotions)
|
|
869
|
-
// this.transactionDocument.basket.transactionPromotion = this.transactionDocument.basket.linePromotions.reduce((acc, val) => {
|
|
870
|
-
// if (!acc.find(el => el.itemLineId === val.itemLineId)) {
|
|
871
|
-
// acc.push(val);
|
|
872
|
-
// }
|
|
873
|
-
// return acc;
|
|
874
|
-
// }, []);
|
|
875
|
-
// }
|
|
876
|
-
console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket.transactionPromotion", JSON.stringify(this.transactionDocument.basket.transactionPromotion));
|
|
877
|
-
}
|
|
878
|
-
return this;
|
|
879
|
-
};
|
|
880
|
-
/**
|
|
881
|
-
* @param {?} basketDetails
|
|
882
|
-
* @return {?}
|
|
883
|
-
*/
|
|
884
|
-
TransactionDocumentBuilder.prototype.transactionDiscount = /**
|
|
885
|
-
* @param {?} basketDetails
|
|
886
|
-
* @return {?}
|
|
887
|
-
*/
|
|
888
|
-
function (basketDetails) {
|
|
889
|
-
if (basketDetails.transactionDiscount) {
|
|
890
|
-
this.transactionDocument.basket.transactionDiscount =
|
|
891
|
-
basketDetails.transactionDiscount;
|
|
892
|
-
console.log("e-basket :TransactionDocumentBuilder: transaction Discount", JSON.stringify(this.transactionDocument.basket.transactionDiscount));
|
|
893
|
-
}
|
|
894
|
-
return this;
|
|
895
|
-
};
|
|
896
|
-
/**
|
|
897
|
-
* Payments details
|
|
898
|
-
* @param paymentDetails
|
|
899
|
-
* @returns
|
|
900
|
-
*/
|
|
901
|
-
/**
|
|
902
|
-
* Payments details
|
|
903
|
-
* @template THIS
|
|
904
|
-
* @this {THIS}
|
|
905
|
-
* @param {?} paymentDetails
|
|
906
|
-
* @return {THIS}
|
|
907
|
-
*/
|
|
908
|
-
TransactionDocumentBuilder.prototype.paymentDetails = /**
|
|
909
|
-
* Payments details
|
|
910
|
-
* @template THIS
|
|
911
|
-
* @this {THIS}
|
|
912
|
-
* @param {?} paymentDetails
|
|
913
|
-
* @return {THIS}
|
|
914
|
-
*/
|
|
915
|
-
function (paymentDetails) {
|
|
916
|
-
console.info("ebasket : payment details after transaction completed", JSON.stringify(paymentDetails));
|
|
917
|
-
(/** @type {?} */ (this)).transactionDocument.paymentDetails = paymentDetails;
|
|
918
|
-
return (/** @type {?} */ (this));
|
|
919
|
-
};
|
|
920
|
-
/**
|
|
921
|
-
* Payments details
|
|
922
|
-
* @param paymentDetails
|
|
923
|
-
* @returns
|
|
924
|
-
*/
|
|
925
|
-
/**
|
|
926
|
-
* Payments details
|
|
927
|
-
* @template THIS
|
|
928
|
-
* @this {THIS}
|
|
929
|
-
* @param {?} splitPayment
|
|
930
|
-
* @return {THIS}
|
|
931
|
-
*/
|
|
932
|
-
TransactionDocumentBuilder.prototype.splitPayment = /**
|
|
933
|
-
* Payments details
|
|
934
|
-
* @template THIS
|
|
935
|
-
* @this {THIS}
|
|
936
|
-
* @param {?} splitPayment
|
|
937
|
-
* @return {THIS}
|
|
938
|
-
*/
|
|
939
|
-
function (splitPayment) {
|
|
940
|
-
(/** @type {?} */ (this)).transactionDocument.splitPayment = splitPayment;
|
|
941
|
-
return (/** @type {?} */ (this));
|
|
942
|
-
};
|
|
943
|
-
/**
|
|
944
|
-
* Payments details
|
|
945
|
-
* @param paymentDetails
|
|
946
|
-
* @returns
|
|
947
|
-
*/
|
|
948
|
-
/**
|
|
949
|
-
* Payments details
|
|
950
|
-
* @template THIS
|
|
951
|
-
* @this {THIS}
|
|
952
|
-
* @param {?} isPaymentCompleted
|
|
953
|
-
* @return {THIS}
|
|
954
|
-
*/
|
|
955
|
-
TransactionDocumentBuilder.prototype.isPaymentCompleted = /**
|
|
956
|
-
* Payments details
|
|
957
|
-
* @template THIS
|
|
958
|
-
* @this {THIS}
|
|
959
|
-
* @param {?} isPaymentCompleted
|
|
960
|
-
* @return {THIS}
|
|
961
|
-
*/
|
|
962
|
-
function (isPaymentCompleted) {
|
|
963
|
-
(/** @type {?} */ (this)).transactionDocument.isPaymentCompleted = isPaymentCompleted;
|
|
964
|
-
return (/** @type {?} */ (this));
|
|
965
|
-
};
|
|
966
|
-
/**
|
|
967
|
-
* Bases currency
|
|
968
|
-
* @param currency
|
|
969
|
-
* @returns currency
|
|
970
|
-
*/
|
|
971
|
-
/**
|
|
972
|
-
* Bases currency
|
|
973
|
-
* @param {?} currency
|
|
974
|
-
* @return {?} currency
|
|
975
|
-
*/
|
|
976
|
-
TransactionDocumentBuilder.prototype.baseCurrency = /**
|
|
977
|
-
* Bases currency
|
|
978
|
-
* @param {?} currency
|
|
979
|
-
* @return {?} currency
|
|
980
|
-
*/
|
|
981
|
-
function (currency) {
|
|
982
|
-
this.transactionDocument.baseCurrency = currency;
|
|
983
|
-
return this;
|
|
984
|
-
};
|
|
985
|
-
/**
|
|
986
|
-
* gift option at
|
|
987
|
-
* @returns at
|
|
988
|
-
*/
|
|
989
|
-
/**
|
|
990
|
-
* gift option at
|
|
991
|
-
* @param {?} gift
|
|
992
|
-
* @return {?} at
|
|
993
|
-
*/
|
|
994
|
-
TransactionDocumentBuilder.prototype.giftOption = /**
|
|
995
|
-
* gift option at
|
|
996
|
-
* @param {?} gift
|
|
997
|
-
* @return {?} at
|
|
998
|
-
*/
|
|
999
|
-
function (gift) {
|
|
1000
|
-
console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.giftoption", gift);
|
|
1001
|
-
if (gift) {
|
|
1002
|
-
this.transactionDocument.giftedReceipt = gift;
|
|
1003
|
-
}
|
|
1004
|
-
return this;
|
|
1005
|
-
};
|
|
1006
|
-
/**
|
|
1007
|
-
|
|
1008
|
-
/**
|
|
1009
|
-
* manual Discount
|
|
1010
|
-
* @param discountData
|
|
1011
|
-
* @returns
|
|
1012
|
-
*/
|
|
1013
|
-
// manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
|
|
1014
|
-
// let saleTotal = this.transactionDocument.basketSummary.basketTotal;
|
|
1015
|
-
// if(discountData.discountType =='Percent'){
|
|
1016
|
-
// this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
|
|
1017
|
-
// discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
|
|
1018
|
-
// }else {
|
|
1019
|
-
// this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
|
|
1020
|
-
// discountData.discountAmount = -1*discountData.discountAmount;
|
|
1021
|
-
// }
|
|
1022
|
-
// this.transactionDocument.transactionDiscount.push(discountData);
|
|
1023
|
-
// return this;
|
|
1024
|
-
// }
|
|
1025
|
-
/**
|
|
1026
|
-
* Types transaction document builder
|
|
1027
|
-
* @param t
|
|
1028
|
-
* @returns type
|
|
1029
|
-
*/
|
|
1030
|
-
/**
|
|
1031
|
-
|
|
1032
|
-
/**
|
|
1033
|
-
* manual Discount
|
|
1034
|
-
* @param discountData
|
|
1035
|
-
* @returns
|
|
1036
|
-
*/
|
|
1037
|
-
// manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
|
|
1038
|
-
// let saleTotal = this.transactionDocument.basketSummary.basketTotal;
|
|
1039
|
-
// if(discountData.discountType =='Percent'){
|
|
1040
|
-
// this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
|
|
1041
|
-
// discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
|
|
1042
|
-
// }else {
|
|
1043
|
-
// this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
|
|
1044
|
-
// discountData.discountAmount = -1*discountData.discountAmount;
|
|
1045
|
-
// }
|
|
1046
|
-
// this.transactionDocument.transactionDiscount.push(discountData);
|
|
1047
|
-
// return this;
|
|
1048
|
-
// }
|
|
1049
|
-
/**
|
|
1050
|
-
* Types transaction document builder
|
|
1051
|
-
* @param {?} t
|
|
1052
|
-
* @return {?} type
|
|
1053
|
-
*/
|
|
1054
|
-
TransactionDocumentBuilder.prototype.type = /**
|
|
1055
|
-
|
|
1056
|
-
/**
|
|
1057
|
-
* manual Discount
|
|
1058
|
-
* @param discountData
|
|
1059
|
-
* @returns
|
|
1060
|
-
*/
|
|
1061
|
-
// manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
|
|
1062
|
-
// let saleTotal = this.transactionDocument.basketSummary.basketTotal;
|
|
1063
|
-
// if(discountData.discountType =='Percent'){
|
|
1064
|
-
// this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
|
|
1065
|
-
// discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
|
|
1066
|
-
// }else {
|
|
1067
|
-
// this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
|
|
1068
|
-
// discountData.discountAmount = -1*discountData.discountAmount;
|
|
1069
|
-
// }
|
|
1070
|
-
// this.transactionDocument.transactionDiscount.push(discountData);
|
|
1071
|
-
// return this;
|
|
1072
|
-
// }
|
|
1073
|
-
/**
|
|
1074
|
-
* Types transaction document builder
|
|
1075
|
-
* @param {?} t
|
|
1076
|
-
* @return {?} type
|
|
1077
|
-
*/
|
|
1078
|
-
function (t) {
|
|
1079
|
-
this.transactionDocument.type = t;
|
|
1080
|
-
return this;
|
|
1081
|
-
};
|
|
1082
|
-
/**
|
|
1083
|
-
* Operations status
|
|
1084
|
-
* @param o
|
|
1085
|
-
* @returns status
|
|
1086
|
-
*/
|
|
1087
|
-
/**
|
|
1088
|
-
* Operations status
|
|
1089
|
-
* @param {?} o
|
|
1090
|
-
* @return {?} status
|
|
1091
|
-
*/
|
|
1092
|
-
TransactionDocumentBuilder.prototype.operationStatus = /**
|
|
1093
|
-
* Operations status
|
|
1094
|
-
* @param {?} o
|
|
1095
|
-
* @return {?} status
|
|
1096
|
-
*/
|
|
1097
|
-
function (o) {
|
|
1098
|
-
this.transactionDocument.operationStatus = o;
|
|
1099
|
-
return this;
|
|
1100
|
-
};
|
|
1101
|
-
/**
|
|
1102
|
-
* Created at
|
|
1103
|
-
* @returns at
|
|
1104
|
-
*/
|
|
1105
|
-
/**
|
|
1106
|
-
* Created at
|
|
1107
|
-
* @return {?} at
|
|
1108
|
-
*/
|
|
1109
|
-
TransactionDocumentBuilder.prototype.createdAt = /**
|
|
1110
|
-
* Created at
|
|
1111
|
-
* @return {?} at
|
|
1112
|
-
*/
|
|
1113
|
-
function () {
|
|
1114
|
-
/** @type {?} */
|
|
1115
|
-
var date = new Date();
|
|
1116
|
-
this.transactionDocument.createdAt = date.toISOString();
|
|
1117
|
-
this.transactionDocument.updatedAt = date.toISOString();
|
|
1118
|
-
return this;
|
|
1119
|
-
};
|
|
1120
|
-
/**
|
|
1121
|
-
* Updated at
|
|
1122
|
-
* @returns at
|
|
1123
|
-
*/
|
|
1124
|
-
/**
|
|
1125
|
-
* Updated at
|
|
1126
|
-
* @return {?} at
|
|
1127
|
-
*/
|
|
1128
|
-
TransactionDocumentBuilder.prototype.updatedAt = /**
|
|
1129
|
-
* Updated at
|
|
1130
|
-
* @return {?} at
|
|
1131
|
-
*/
|
|
1132
|
-
function () {
|
|
1133
|
-
/** @type {?} */
|
|
1134
|
-
var date = new Date();
|
|
1135
|
-
this.transactionDocument.updatedAt = date.toISOString();
|
|
1136
|
-
return this;
|
|
1137
|
-
};
|
|
1138
|
-
/**
|
|
1139
|
-
* transsaction completion at
|
|
1140
|
-
* @returns transaction completion date
|
|
1141
|
-
*/
|
|
1142
|
-
/**
|
|
1143
|
-
* transsaction completion at
|
|
1144
|
-
* @return {?} transaction completion date
|
|
1145
|
-
*/
|
|
1146
|
-
TransactionDocumentBuilder.prototype.transactionCompletedAt = /**
|
|
1147
|
-
* transsaction completion at
|
|
1148
|
-
* @return {?} transaction completion date
|
|
1149
|
-
*/
|
|
1150
|
-
function () {
|
|
1151
|
-
/** @type {?} */
|
|
1152
|
-
var date = new Date();
|
|
1153
|
-
this.transactionDocument.transCompletedAt = date.toISOString();
|
|
1154
|
-
return this;
|
|
1155
|
-
};
|
|
1156
|
-
/**
|
|
1157
|
-
* Builds transaction document builder
|
|
1158
|
-
* @returns build
|
|
1159
|
-
*/
|
|
1160
|
-
/**
|
|
1161
|
-
* Builds transaction document builder
|
|
1162
|
-
* @return {?} build
|
|
1163
|
-
*/
|
|
1164
|
-
TransactionDocumentBuilder.prototype.build = /**
|
|
1165
|
-
* Builds transaction document builder
|
|
1166
|
-
* @return {?} build
|
|
1167
|
-
*/
|
|
1168
|
-
function () {
|
|
1169
|
-
return this.transactionDocument;
|
|
1170
|
-
};
|
|
1171
|
-
/**
|
|
1172
|
-
* Sales total in refund
|
|
1173
|
-
* @param saleTotal
|
|
1174
|
-
* @returns total in refund
|
|
1175
|
-
*/
|
|
1176
|
-
/**
|
|
1177
|
-
* Sales total in refund
|
|
1178
|
-
* @param {?} saleTotal
|
|
1179
|
-
* @return {?} total in refund
|
|
1180
|
-
*/
|
|
1181
|
-
TransactionDocumentBuilder.prototype.saleTotalInRefund = /**
|
|
1182
|
-
* Sales total in refund
|
|
1183
|
-
* @param {?} saleTotal
|
|
1184
|
-
* @return {?} total in refund
|
|
1185
|
-
*/
|
|
1186
|
-
function (saleTotal) {
|
|
1187
|
-
this.transactionDocument.saleTotal = saleTotal;
|
|
1188
|
-
return this;
|
|
1189
|
-
};
|
|
1190
|
-
/**
|
|
1191
|
-
* Gets basket details
|
|
1192
|
-
* @returns basket details
|
|
1193
|
-
*/
|
|
1194
|
-
/**
|
|
1195
|
-
* Gets basket details
|
|
1196
|
-
* @return {?} basket details
|
|
1197
|
-
*/
|
|
1198
|
-
TransactionDocumentBuilder.prototype.getBasketDetails = /**
|
|
1199
|
-
* Gets basket details
|
|
1200
|
-
* @return {?} basket details
|
|
1201
|
-
*/
|
|
1202
|
-
function () {
|
|
1203
|
-
var _this = this;
|
|
1204
|
-
console.info("ebasket: Getting Basket for transactionDocument", JSON.stringify(this.transactionDocument));
|
|
1205
|
-
/** @type {?} */
|
|
1206
|
-
var basket = {
|
|
1207
|
-
subsidiaryId: this.transactionDocument.subsidiaryId,
|
|
1208
|
-
transactionDiscount: this.transactionDocument.basket.transactionDiscount,
|
|
1209
|
-
transactionPromotion: this.transactionDocument.basket.transactionPromotion,
|
|
1210
|
-
transactionId: this.transactionDocument.transactionId,
|
|
1211
|
-
offlineTransactionId: this.transactionDocument.offlineTransactionId,
|
|
1212
|
-
total: this.transactionDocument.basketSummary.basketTotal,
|
|
1213
|
-
basketTotal: this.transactionDocument.basketSummary.basketTotal,
|
|
1214
|
-
discountTotal: this.transactionDocument.basketSummary.discountTotal,
|
|
1215
|
-
saleTotal: this.transactionDocument.basketSummary.saleTotal,
|
|
1216
|
-
refundTotal: this.transactionDocument.basketSummary.refundTotal,
|
|
1217
|
-
quantity: this.transactionDocument.basketSummary.totalItems,
|
|
1218
|
-
products: [],
|
|
1219
|
-
baseCurrency: this.transactionDocument.baseCurrency,
|
|
1220
|
-
customer: this.transactionDocument.customer,
|
|
1221
|
-
};
|
|
1222
|
-
basket.products = (/** @type {?} */ ([]));
|
|
1223
|
-
this.transactionDocument.basket.products.forEach((/**
|
|
1224
|
-
* @param {?} product
|
|
1225
|
-
* @param {?} index
|
|
1226
|
-
* @return {?}
|
|
1227
|
-
*/
|
|
1228
|
-
function (product, index) {
|
|
1229
|
-
console.log(JSON.stringify(product), "ebasket: basket detail update in basket");
|
|
1230
|
-
/** @type {?} */
|
|
1231
|
-
var p = (/** @type {?} */ ({}));
|
|
1232
|
-
p.SKU = product.SKU;
|
|
1233
|
-
p.barcode = product.barCode;
|
|
1234
|
-
p.barcodes = product.barcodes;
|
|
1235
|
-
p.description = product.description;
|
|
1236
|
-
p.imageUrls = product.imageUrls;
|
|
1237
|
-
p.currency = _this.transactionDocument.baseCurrency;
|
|
1238
|
-
p.totalLinePrice = product.totalLinePrice;
|
|
1239
|
-
p.itemLineId = Number(product.itemLineId);
|
|
1240
|
-
p.excludePromotion = product.excludePromotion;
|
|
1241
|
-
p.selectedPrice = product.price;
|
|
1242
|
-
p.quantity = product.quantity;
|
|
1243
|
-
p.total = product.totalLinePrice;
|
|
1244
|
-
p.selectedRRPPrice = product.selectedRRPPrice;
|
|
1245
|
-
p.fullfilmentId = product.fullfilmentId;
|
|
1246
|
-
p.fullfilmentLocationName = product.fullfilmentLocationName;
|
|
1247
|
-
p.deliveryGroup = product.deliveryGroup || "1";
|
|
1248
|
-
p.leadTime = product.leadTime;
|
|
1249
|
-
p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
|
|
1250
|
-
if (p.fullfilmentId != _this.transactionDocument.storeId) {
|
|
1251
|
-
p.isWebOrder = true;
|
|
1252
|
-
}
|
|
1253
|
-
p.giftCard = product.giftCard;
|
|
1254
|
-
p.giftCardExpiryDate = product.giftCardExpiryDate;
|
|
1255
|
-
p.giftCardNumberIssued = product.giftCardNumberIssued;
|
|
1256
|
-
p.giftCardRecipientEmail = product.giftCardRecipientEmail;
|
|
1257
|
-
p.giftCardRecipientName = product.giftCardRecipientName;
|
|
1258
|
-
if (_this.transactionDocument.basket.lineDiscount &&
|
|
1259
|
-
_this.transactionDocument.basket.lineDiscount.length > 0) {
|
|
1260
|
-
_this.transactionDocument.basket.lineDiscount.forEach((/**
|
|
1261
|
-
* @param {?} lineDiscount
|
|
1262
|
-
* @return {?}
|
|
1263
|
-
*/
|
|
1264
|
-
function (lineDiscount) {
|
|
1265
|
-
if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1266
|
-
p.lineDiscount = lineDiscount;
|
|
1267
|
-
p.total = lineDiscount.discountedLinePrice;
|
|
1268
|
-
}
|
|
1269
|
-
}));
|
|
1270
|
-
}
|
|
1271
|
-
if (_this.transactionDocument.basket.linePromotion &&
|
|
1272
|
-
_this.transactionDocument.basket.linePromotion.length > 0) {
|
|
1273
|
-
_this.transactionDocument.basket.linePromotion.forEach((/**
|
|
1274
|
-
* @param {?} linePromotion
|
|
1275
|
-
* @return {?}
|
|
1276
|
-
*/
|
|
1277
|
-
function (linePromotion) {
|
|
1278
|
-
if (product.itemLineId === linePromotion.itemLineId.toString()) {
|
|
1279
|
-
p.linePromotions = linePromotion;
|
|
1280
|
-
p.total = linePromotion.promotionLinePrice;
|
|
1281
|
-
}
|
|
1282
|
-
}));
|
|
1283
|
-
}
|
|
1284
|
-
if (_this.transactionDocument.basket.taxBreakdown &&
|
|
1285
|
-
_this.transactionDocument.basket.taxBreakdown.taxLines.length > 0) {
|
|
1286
|
-
_this.transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
|
|
1287
|
-
* @param {?} taxLine
|
|
1288
|
-
* @return {?}
|
|
1289
|
-
*/
|
|
1290
|
-
function (taxLine) {
|
|
1291
|
-
if (product.itemLineId && product.itemLineId === taxLine.itemLineId.toString()) {
|
|
1292
|
-
p.selectedVAT = taxLine.VAT;
|
|
1293
|
-
p.selectedVATCode = taxLine.VATCode;
|
|
1294
|
-
}
|
|
1295
|
-
}));
|
|
1296
|
-
}
|
|
1297
|
-
if (_this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
|
|
1298
|
-
p.total = product.refundedTotal;
|
|
1299
|
-
}
|
|
1300
|
-
else if ((_this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || TRANSACTION_TYPE.SALE_EXCHANGE) && product.refundedQuantity > 0) {
|
|
1301
|
-
p.refundedReasonDescription = product.refundedReasonDescription;
|
|
1302
|
-
p.refundedReason = product.refundedReason;
|
|
1303
|
-
if (!p.refundedReasonDescription) {
|
|
1304
|
-
p.refundedReasonDescription = p.refundedReason;
|
|
1305
|
-
}
|
|
1306
|
-
p.refundedQuantity = product.refundedQuantity;
|
|
1307
|
-
p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
|
|
1308
|
-
p.refundedTotal = product.refundedTotal;
|
|
1309
|
-
p.total -= Math.abs(p.refundedTotal);
|
|
1310
|
-
p.isLastExchanged = product.isLastExchanged;
|
|
1311
|
-
}
|
|
1312
|
-
if (_this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
|
|
1313
|
-
if (p.total > 0) {
|
|
1314
|
-
p.total *= -1;
|
|
1315
|
-
}
|
|
1316
|
-
}
|
|
1317
|
-
basket.products.push(p);
|
|
1318
|
-
}));
|
|
1319
|
-
basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
|
|
1320
|
-
basket.total = (basket.basketTotal || 0) + this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
|
|
1321
|
-
if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
|
|
1322
|
-
basket.quantity = this.getRefundedTotalWithQuantity(basket);
|
|
1323
|
-
}
|
|
1324
|
-
console.info("ebasket: Basket created successfully", JSON.stringify(basket));
|
|
1325
|
-
return basket;
|
|
1326
|
-
};
|
|
1327
|
-
/**
|
|
1328
|
-
* Gets basket details
|
|
1329
|
-
* @returns refund basket details
|
|
1330
|
-
*/
|
|
1331
|
-
// getRefundBasketDetails(): Basket {
|
|
1332
|
-
// let basket: Basket = {
|
|
1333
|
-
// subsidiaryId : this.transactionDocument.subsidiaryId,
|
|
1334
|
-
// transactionDiscount: this.transactionDocument.basket.transactionDiscount,
|
|
1335
|
-
// transactionPromotion: this.transactionDocument.basket.transactionPromotion,
|
|
1336
|
-
// transactionId: this.transactionDocument.transactionId,
|
|
1337
|
-
// total: this.transactionDocument.basketSummary.basketTotal,
|
|
1338
|
-
// basketTotal: this.transactionDocument.basketSummary.basketTotal,
|
|
1339
|
-
// discountTotal: this.transactionDocument.basketSummary.discountTotal,
|
|
1340
|
-
// saleTotal: this.transactionDocument.basketSummary.saleTotal,
|
|
1341
|
-
// quantity: this.transactionDocument.basketSummary.totalItems,
|
|
1342
|
-
// products: [],
|
|
1343
|
-
// baseCurrency: this.transactionDocument.baseCurrency,
|
|
1344
|
-
// customer: this.transactionDocument.customer,
|
|
1345
|
-
// };
|
|
1346
|
-
// basket.products = [] as Product[];
|
|
1347
|
-
// this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
|
|
1348
|
-
// const p = {} as Product;
|
|
1349
|
-
// p.SKU = product.SKU;
|
|
1350
|
-
// p.barcode = product.barCode;
|
|
1351
|
-
// p.barcodes = product.barcodes;
|
|
1352
|
-
// p.description = product.description;
|
|
1353
|
-
// p.imageUrls = product.imageUrls;
|
|
1354
|
-
// p.currency = this.transactionDocument.baseCurrency;
|
|
1355
|
-
// p.totalLinePrice = product.totalLinePrice;
|
|
1356
|
-
// p.itemLineId = Number(product.itemLineId);
|
|
1357
|
-
// p.excludePromotion = product.excludePromotion;
|
|
1358
|
-
// p.selectedPrice = product.price;
|
|
1359
|
-
// p.quantity = product.quantity;
|
|
1360
|
-
// p.total = product.totalLinePrice;
|
|
1361
|
-
// p.selectedRRPPrice = product.selectedRRPPrice;
|
|
1362
|
-
// p.fullfilmentId = product.fullfilmentId;
|
|
1363
|
-
// p.fullfilmentLocationName = product.fullfilmentLocationName;
|
|
1364
|
-
// p.deliveryGroup = product.deliveryGroup || "1";
|
|
1365
|
-
// p.leadTime = product.leadTime;
|
|
1366
|
-
// p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
|
|
1367
|
-
// p.giftCard = product.giftCard;
|
|
1368
|
-
// p.giftCardExpiryDate = product.giftCardExpiryDate;
|
|
1369
|
-
// p.giftCardNumberIssued = product.giftCardNumberIssued;
|
|
1370
|
-
// p.giftCardRecipientEmail = product.giftCardRecipientEmail;
|
|
1371
|
-
// p.giftCardRecipientName = product.giftCardRecipientName;
|
|
1372
|
-
// if(p.fullfilmentId != this.transactionDocument.storeId)
|
|
1373
|
-
// {
|
|
1374
|
-
// p.isWebOrder = true;
|
|
1375
|
-
// }
|
|
1376
|
-
// if (product.itemDiscounts) {
|
|
1377
|
-
// p.itemDiscounts = product.itemDiscounts as ItemDiscount;
|
|
1378
|
-
// }
|
|
1379
|
-
// // if(!p.itemDiscounts){
|
|
1380
|
-
// // console.log(p.itemDiscounts);
|
|
1381
|
-
// // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
|
|
1382
|
-
// // }
|
|
1383
|
-
// p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
|
|
1384
|
-
// if (product.refundedQuantity) {
|
|
1385
|
-
// p.quantity = p.quantity - product.refundedQuantity;
|
|
1386
|
-
// p.totalLinePrice = (p.quantity * product.price);
|
|
1387
|
-
// p.total = p.totalLinePrice;
|
|
1388
|
-
// // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
|
|
1389
|
-
// p.refunded = product.refunded;
|
|
1390
|
-
// p.isLastExchanged = product.isLastExchanged;
|
|
1391
|
-
// }
|
|
1392
|
-
// if (product.exchange) {
|
|
1393
|
-
// p.exchange = product.exchange;
|
|
1394
|
-
// }
|
|
1395
|
-
// if (
|
|
1396
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
1397
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
1398
|
-
// ) {
|
|
1399
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
|
|
1400
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
|
|
1401
|
-
// p.lineDiscount = Object.assign({}, lineDiscount);
|
|
1402
|
-
// p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
|
|
1403
|
-
// p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
|
|
1404
|
-
// p.total = p.lineDiscount.discountedLinePrice;
|
|
1405
|
-
// } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1406
|
-
// p.lineDiscount = lineDiscount;
|
|
1407
|
-
// p.total = lineDiscount.discountedLinePrice
|
|
1408
|
-
// }
|
|
1409
|
-
// });
|
|
1410
|
-
// }
|
|
1411
|
-
// if (
|
|
1412
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
1413
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
1414
|
-
// ) {
|
|
1415
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
|
|
1416
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
|
|
1417
|
-
// p.linePromotions = linePromotion;
|
|
1418
|
-
// p.total = p.linePromotions.promotionLinePrice;
|
|
1419
|
-
// p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
|
|
1420
|
-
// }
|
|
1421
|
-
// });
|
|
1422
|
-
// }
|
|
1423
|
-
// p.refundedQuantity = 0;
|
|
1424
|
-
// p.refundedTotal = 0;
|
|
1425
|
-
// if (
|
|
1426
|
-
// this.transactionDocument.basket.taxBreakdown &&
|
|
1427
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
|
|
1428
|
-
// ) {
|
|
1429
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
|
|
1430
|
-
// if (product.itemLineId === taxLine.itemLineId.toString()) {
|
|
1431
|
-
// p.selectedVAT = taxLine.VAT;
|
|
1432
|
-
// p.selectedVATCode = taxLine.VATCode;
|
|
1433
|
-
// }
|
|
1434
|
-
// });
|
|
1435
|
-
// }
|
|
1436
|
-
// if (p.quantity > 0) {
|
|
1437
|
-
// basket.products.push(p);
|
|
1438
|
-
// }
|
|
1439
|
-
// });
|
|
1440
|
-
// // product.itemDiscounts
|
|
1441
|
-
// if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
|
|
1442
|
-
// basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
|
|
1443
|
-
// }
|
|
1444
|
-
// console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
|
|
1445
|
-
// basket.quantity = basket.products.reduce(
|
|
1446
|
-
// (n: any, { quantity }: any) => n + quantity,
|
|
1447
|
-
// 0
|
|
1448
|
-
// );
|
|
1449
|
-
// basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
|
|
1450
|
-
// basket.basketTotal = basket.total;
|
|
1451
|
-
// basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
|
|
1452
|
-
// console.log(
|
|
1453
|
-
// "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
|
|
1454
|
-
// basket.basketTotal
|
|
1455
|
-
// );
|
|
1456
|
-
// console.log(
|
|
1457
|
-
// "e:basket :TransactionDocumentBuilder : basketDetails updated values",
|
|
1458
|
-
// JSON.stringify(basket)
|
|
1459
|
-
// );
|
|
1460
|
-
// return basket;
|
|
1461
|
-
// }
|
|
1462
|
-
/**
|
|
1463
|
-
* Gets basket details
|
|
1464
|
-
* @param {?} basket
|
|
1465
|
-
* @return {?} refund basket details
|
|
1466
|
-
*/
|
|
1467
|
-
// getRefundBasketDetails(): Basket {
|
|
1468
|
-
// let basket: Basket = {
|
|
1469
|
-
// subsidiaryId : this.transactionDocument.subsidiaryId,
|
|
1470
|
-
// transactionDiscount: this.transactionDocument.basket.transactionDiscount,
|
|
1471
|
-
// transactionPromotion: this.transactionDocument.basket.transactionPromotion,
|
|
1472
|
-
// transactionId: this.transactionDocument.transactionId,
|
|
1473
|
-
// total: this.transactionDocument.basketSummary.basketTotal,
|
|
1474
|
-
// basketTotal: this.transactionDocument.basketSummary.basketTotal,
|
|
1475
|
-
// discountTotal: this.transactionDocument.basketSummary.discountTotal,
|
|
1476
|
-
// saleTotal: this.transactionDocument.basketSummary.saleTotal,
|
|
1477
|
-
// quantity: this.transactionDocument.basketSummary.totalItems,
|
|
1478
|
-
// products: [],
|
|
1479
|
-
// baseCurrency: this.transactionDocument.baseCurrency,
|
|
1480
|
-
// customer: this.transactionDocument.customer,
|
|
1481
|
-
// };
|
|
1482
|
-
// basket.products = [] as Product[];
|
|
1483
|
-
// this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
|
|
1484
|
-
// const p = {} as Product;
|
|
1485
|
-
// p.SKU = product.SKU;
|
|
1486
|
-
// p.barcode = product.barCode;
|
|
1487
|
-
// p.barcodes = product.barcodes;
|
|
1488
|
-
// p.description = product.description;
|
|
1489
|
-
// p.imageUrls = product.imageUrls;
|
|
1490
|
-
// p.currency = this.transactionDocument.baseCurrency;
|
|
1491
|
-
// p.totalLinePrice = product.totalLinePrice;
|
|
1492
|
-
// p.itemLineId = Number(product.itemLineId);
|
|
1493
|
-
// p.excludePromotion = product.excludePromotion;
|
|
1494
|
-
// p.selectedPrice = product.price;
|
|
1495
|
-
// p.quantity = product.quantity;
|
|
1496
|
-
// p.total = product.totalLinePrice;
|
|
1497
|
-
// p.selectedRRPPrice = product.selectedRRPPrice;
|
|
1498
|
-
// p.fullfilmentId = product.fullfilmentId;
|
|
1499
|
-
// p.fullfilmentLocationName = product.fullfilmentLocationName;
|
|
1500
|
-
// p.deliveryGroup = product.deliveryGroup || "1";
|
|
1501
|
-
// p.leadTime = product.leadTime;
|
|
1502
|
-
// p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
|
|
1503
|
-
// p.giftCard = product.giftCard;
|
|
1504
|
-
// p.giftCardExpiryDate = product.giftCardExpiryDate;
|
|
1505
|
-
// p.giftCardNumberIssued = product.giftCardNumberIssued;
|
|
1506
|
-
// p.giftCardRecipientEmail = product.giftCardRecipientEmail;
|
|
1507
|
-
// p.giftCardRecipientName = product.giftCardRecipientName;
|
|
1508
|
-
// if(p.fullfilmentId != this.transactionDocument.storeId)
|
|
1509
|
-
// {
|
|
1510
|
-
// p.isWebOrder = true;
|
|
1511
|
-
// }
|
|
1512
|
-
// if (product.itemDiscounts) {
|
|
1513
|
-
// p.itemDiscounts = product.itemDiscounts as ItemDiscount;
|
|
1514
|
-
// }
|
|
1515
|
-
// // if(!p.itemDiscounts){
|
|
1516
|
-
// // console.log(p.itemDiscounts);
|
|
1517
|
-
// // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
|
|
1518
|
-
// // }
|
|
1519
|
-
// p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
|
|
1520
|
-
// if (product.refundedQuantity) {
|
|
1521
|
-
// p.quantity = p.quantity - product.refundedQuantity;
|
|
1522
|
-
// p.totalLinePrice = (p.quantity * product.price);
|
|
1523
|
-
// p.total = p.totalLinePrice;
|
|
1524
|
-
// // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
|
|
1525
|
-
// p.refunded = product.refunded;
|
|
1526
|
-
// p.isLastExchanged = product.isLastExchanged;
|
|
1527
|
-
// }
|
|
1528
|
-
// if (product.exchange) {
|
|
1529
|
-
// p.exchange = product.exchange;
|
|
1530
|
-
// }
|
|
1531
|
-
// if (
|
|
1532
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
1533
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
1534
|
-
// ) {
|
|
1535
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
|
|
1536
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
|
|
1537
|
-
// p.lineDiscount = Object.assign({}, lineDiscount);
|
|
1538
|
-
// p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
|
|
1539
|
-
// p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
|
|
1540
|
-
// p.total = p.lineDiscount.discountedLinePrice;
|
|
1541
|
-
// } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1542
|
-
// p.lineDiscount = lineDiscount;
|
|
1543
|
-
// p.total = lineDiscount.discountedLinePrice
|
|
1544
|
-
// }
|
|
1545
|
-
// });
|
|
1546
|
-
// }
|
|
1547
|
-
// if (
|
|
1548
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
1549
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
1550
|
-
// ) {
|
|
1551
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
|
|
1552
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
|
|
1553
|
-
// p.linePromotions = linePromotion;
|
|
1554
|
-
// p.total = p.linePromotions.promotionLinePrice;
|
|
1555
|
-
// p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
|
|
1556
|
-
// }
|
|
1557
|
-
// });
|
|
1558
|
-
// }
|
|
1559
|
-
// p.refundedQuantity = 0;
|
|
1560
|
-
// p.refundedTotal = 0;
|
|
1561
|
-
// if (
|
|
1562
|
-
// this.transactionDocument.basket.taxBreakdown &&
|
|
1563
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
|
|
1564
|
-
// ) {
|
|
1565
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
|
|
1566
|
-
// if (product.itemLineId === taxLine.itemLineId.toString()) {
|
|
1567
|
-
// p.selectedVAT = taxLine.VAT;
|
|
1568
|
-
// p.selectedVATCode = taxLine.VATCode;
|
|
1569
|
-
// }
|
|
1570
|
-
// });
|
|
1571
|
-
// }
|
|
1572
|
-
// if (p.quantity > 0) {
|
|
1573
|
-
// basket.products.push(p);
|
|
1574
|
-
// }
|
|
1575
|
-
// });
|
|
1576
|
-
// // product.itemDiscounts
|
|
1577
|
-
// if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
|
|
1578
|
-
// basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
|
|
1579
|
-
// }
|
|
1580
|
-
// console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
|
|
1581
|
-
// basket.quantity = basket.products.reduce(
|
|
1582
|
-
// (n: any, { quantity }: any) => n + quantity,
|
|
1583
|
-
// 0
|
|
1584
|
-
// );
|
|
1585
|
-
// basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
|
|
1586
|
-
// basket.basketTotal = basket.total;
|
|
1587
|
-
// basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
|
|
1588
|
-
// console.log(
|
|
1589
|
-
// "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
|
|
1590
|
-
// basket.basketTotal
|
|
1591
|
-
// );
|
|
1592
|
-
// console.log(
|
|
1593
|
-
// "e:basket :TransactionDocumentBuilder : basketDetails updated values",
|
|
1594
|
-
// JSON.stringify(basket)
|
|
1595
|
-
// );
|
|
1596
|
-
// return basket;
|
|
1597
|
-
// }
|
|
1598
|
-
TransactionDocumentBuilder.prototype.getTransactionDiscountAndTransactionPromotionPortion = /**
|
|
1599
|
-
* Gets basket details
|
|
1600
|
-
* @param {?} basket
|
|
1601
|
-
* @return {?} refund basket details
|
|
1602
|
-
*/
|
|
1603
|
-
// getRefundBasketDetails(): Basket {
|
|
1604
|
-
// let basket: Basket = {
|
|
1605
|
-
// subsidiaryId : this.transactionDocument.subsidiaryId,
|
|
1606
|
-
// transactionDiscount: this.transactionDocument.basket.transactionDiscount,
|
|
1607
|
-
// transactionPromotion: this.transactionDocument.basket.transactionPromotion,
|
|
1608
|
-
// transactionId: this.transactionDocument.transactionId,
|
|
1609
|
-
// total: this.transactionDocument.basketSummary.basketTotal,
|
|
1610
|
-
// basketTotal: this.transactionDocument.basketSummary.basketTotal,
|
|
1611
|
-
// discountTotal: this.transactionDocument.basketSummary.discountTotal,
|
|
1612
|
-
// saleTotal: this.transactionDocument.basketSummary.saleTotal,
|
|
1613
|
-
// quantity: this.transactionDocument.basketSummary.totalItems,
|
|
1614
|
-
// products: [],
|
|
1615
|
-
// baseCurrency: this.transactionDocument.baseCurrency,
|
|
1616
|
-
// customer: this.transactionDocument.customer,
|
|
1617
|
-
// };
|
|
1618
|
-
// basket.products = [] as Product[];
|
|
1619
|
-
// this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
|
|
1620
|
-
// const p = {} as Product;
|
|
1621
|
-
// p.SKU = product.SKU;
|
|
1622
|
-
// p.barcode = product.barCode;
|
|
1623
|
-
// p.barcodes = product.barcodes;
|
|
1624
|
-
// p.description = product.description;
|
|
1625
|
-
// p.imageUrls = product.imageUrls;
|
|
1626
|
-
// p.currency = this.transactionDocument.baseCurrency;
|
|
1627
|
-
// p.totalLinePrice = product.totalLinePrice;
|
|
1628
|
-
// p.itemLineId = Number(product.itemLineId);
|
|
1629
|
-
// p.excludePromotion = product.excludePromotion;
|
|
1630
|
-
// p.selectedPrice = product.price;
|
|
1631
|
-
// p.quantity = product.quantity;
|
|
1632
|
-
// p.total = product.totalLinePrice;
|
|
1633
|
-
// p.selectedRRPPrice = product.selectedRRPPrice;
|
|
1634
|
-
// p.fullfilmentId = product.fullfilmentId;
|
|
1635
|
-
// p.fullfilmentLocationName = product.fullfilmentLocationName;
|
|
1636
|
-
// p.deliveryGroup = product.deliveryGroup || "1";
|
|
1637
|
-
// p.leadTime = product.leadTime;
|
|
1638
|
-
// p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
|
|
1639
|
-
// p.giftCard = product.giftCard;
|
|
1640
|
-
// p.giftCardExpiryDate = product.giftCardExpiryDate;
|
|
1641
|
-
// p.giftCardNumberIssued = product.giftCardNumberIssued;
|
|
1642
|
-
// p.giftCardRecipientEmail = product.giftCardRecipientEmail;
|
|
1643
|
-
// p.giftCardRecipientName = product.giftCardRecipientName;
|
|
1644
|
-
// if(p.fullfilmentId != this.transactionDocument.storeId)
|
|
1645
|
-
// {
|
|
1646
|
-
// p.isWebOrder = true;
|
|
1647
|
-
// }
|
|
1648
|
-
// if (product.itemDiscounts) {
|
|
1649
|
-
// p.itemDiscounts = product.itemDiscounts as ItemDiscount;
|
|
1650
|
-
// }
|
|
1651
|
-
// // if(!p.itemDiscounts){
|
|
1652
|
-
// // console.log(p.itemDiscounts);
|
|
1653
|
-
// // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
|
|
1654
|
-
// // }
|
|
1655
|
-
// p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
|
|
1656
|
-
// if (product.refundedQuantity) {
|
|
1657
|
-
// p.quantity = p.quantity - product.refundedQuantity;
|
|
1658
|
-
// p.totalLinePrice = (p.quantity * product.price);
|
|
1659
|
-
// p.total = p.totalLinePrice;
|
|
1660
|
-
// // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
|
|
1661
|
-
// p.refunded = product.refunded;
|
|
1662
|
-
// p.isLastExchanged = product.isLastExchanged;
|
|
1663
|
-
// }
|
|
1664
|
-
// if (product.exchange) {
|
|
1665
|
-
// p.exchange = product.exchange;
|
|
1666
|
-
// }
|
|
1667
|
-
// if (
|
|
1668
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
1669
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
1670
|
-
// ) {
|
|
1671
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
|
|
1672
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
|
|
1673
|
-
// p.lineDiscount = Object.assign({}, lineDiscount);
|
|
1674
|
-
// p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
|
|
1675
|
-
// p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
|
|
1676
|
-
// p.total = p.lineDiscount.discountedLinePrice;
|
|
1677
|
-
// } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1678
|
-
// p.lineDiscount = lineDiscount;
|
|
1679
|
-
// p.total = lineDiscount.discountedLinePrice
|
|
1680
|
-
// }
|
|
1681
|
-
// });
|
|
1682
|
-
// }
|
|
1683
|
-
// if (
|
|
1684
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
1685
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
1686
|
-
// ) {
|
|
1687
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
|
|
1688
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
|
|
1689
|
-
// p.linePromotions = linePromotion;
|
|
1690
|
-
// p.total = p.linePromotions.promotionLinePrice;
|
|
1691
|
-
// p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
|
|
1692
|
-
// }
|
|
1693
|
-
// });
|
|
1694
|
-
// }
|
|
1695
|
-
// p.refundedQuantity = 0;
|
|
1696
|
-
// p.refundedTotal = 0;
|
|
1697
|
-
// if (
|
|
1698
|
-
// this.transactionDocument.basket.taxBreakdown &&
|
|
1699
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
|
|
1700
|
-
// ) {
|
|
1701
|
-
// this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
|
|
1702
|
-
// if (product.itemLineId === taxLine.itemLineId.toString()) {
|
|
1703
|
-
// p.selectedVAT = taxLine.VAT;
|
|
1704
|
-
// p.selectedVATCode = taxLine.VATCode;
|
|
1705
|
-
// }
|
|
1706
|
-
// });
|
|
1707
|
-
// }
|
|
1708
|
-
// if (p.quantity > 0) {
|
|
1709
|
-
// basket.products.push(p);
|
|
1710
|
-
// }
|
|
1711
|
-
// });
|
|
1712
|
-
// // product.itemDiscounts
|
|
1713
|
-
// if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
|
|
1714
|
-
// basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
|
|
1715
|
-
// }
|
|
1716
|
-
// console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
|
|
1717
|
-
// basket.quantity = basket.products.reduce(
|
|
1718
|
-
// (n: any, { quantity }: any) => n + quantity,
|
|
1719
|
-
// 0
|
|
1720
|
-
// );
|
|
1721
|
-
// basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
|
|
1722
|
-
// basket.basketTotal = basket.total;
|
|
1723
|
-
// basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
|
|
1724
|
-
// console.log(
|
|
1725
|
-
// "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
|
|
1726
|
-
// basket.basketTotal
|
|
1727
|
-
// );
|
|
1728
|
-
// console.log(
|
|
1729
|
-
// "e:basket :TransactionDocumentBuilder : basketDetails updated values",
|
|
1730
|
-
// JSON.stringify(basket)
|
|
1731
|
-
// );
|
|
1732
|
-
// return basket;
|
|
1733
|
-
// }
|
|
1734
|
-
function (basket) {
|
|
1735
|
-
var _this = this;
|
|
1736
|
-
if (basket.transactionDiscount &&
|
|
1737
|
-
basket.transactionDiscount.length > 0) {
|
|
1738
|
-
basket.transactionDiscount.forEach((/**
|
|
1739
|
-
* @param {?} discount
|
|
1740
|
-
* @return {?}
|
|
1741
|
-
*/
|
|
1742
|
-
function (discount) {
|
|
1743
|
-
if (!discount.itemLineIds) {
|
|
1744
|
-
discount.itemLineIds = basket.products.map((/**
|
|
1745
|
-
* @param {?} product
|
|
1746
|
-
* @return {?}
|
|
1747
|
-
*/
|
|
1748
|
-
function (product) {
|
|
1749
|
-
return product.itemLineId;
|
|
1750
|
-
}));
|
|
1751
|
-
}
|
|
1752
|
-
basket = _this.basketService.transactionDiscountProductPortionCalc(basket, discount);
|
|
1753
|
-
}));
|
|
1754
|
-
}
|
|
1755
|
-
if (basket.transactionPromotion &&
|
|
1756
|
-
basket.transactionPromotion.length > 0) {
|
|
1757
|
-
basket.transactionPromotion.forEach((/**
|
|
1758
|
-
* @param {?} tPromotion
|
|
1759
|
-
* @return {?}
|
|
1760
|
-
*/
|
|
1761
|
-
function (tPromotion) {
|
|
1762
|
-
if (!tPromotion.itemLineIds) {
|
|
1763
|
-
/** @type {?} */
|
|
1764
|
-
var filteredData = basket.products.filter((/**
|
|
1765
|
-
* @param {?} item
|
|
1766
|
-
* @return {?}
|
|
1767
|
-
*/
|
|
1768
|
-
function (item) {
|
|
1769
|
-
return item.excludePromotion === false;
|
|
1770
|
-
}));
|
|
1771
|
-
tPromotion.itemLineIds =
|
|
1772
|
-
filteredData.map((/**
|
|
1773
|
-
* @param {?} product
|
|
1774
|
-
* @return {?}
|
|
1775
|
-
*/
|
|
1776
|
-
function (product) {
|
|
1777
|
-
return product.itemLineId;
|
|
1778
|
-
}));
|
|
1779
|
-
}
|
|
1780
|
-
basket = _this.basketService.transactionPromotionProductPortionCalc(basket, tPromotion);
|
|
1781
|
-
}));
|
|
1782
|
-
}
|
|
1783
|
-
return basket;
|
|
1784
|
-
};
|
|
1785
|
-
/**
|
|
1786
|
-
* @param {?} basketDetails
|
|
1787
|
-
* @return {?}
|
|
1788
|
-
*/
|
|
1789
|
-
TransactionDocumentBuilder.prototype.getTotalDiscountWithTransactionDiscountsAndPromotions = /**
|
|
1790
|
-
* @param {?} basketDetails
|
|
1791
|
-
* @return {?}
|
|
1792
|
-
*/
|
|
1793
|
-
function (basketDetails) {
|
|
1794
|
-
/** @type {?} */
|
|
1795
|
-
var discountTotal = 0;
|
|
1796
|
-
if (basketDetails.transactionPromotion &&
|
|
1797
|
-
basketDetails.transactionPromotion.length > 0) {
|
|
1798
|
-
discountTotal += basketDetails.transactionPromotion.reduce((/**
|
|
1799
|
-
* @param {?} n
|
|
1800
|
-
* @param {?} __1
|
|
1801
|
-
* @return {?}
|
|
1802
|
-
*/
|
|
1803
|
-
function (n, _a) {
|
|
1804
|
-
var promotionAmount = _a.promotionAmount;
|
|
1805
|
-
return n + promotionAmount;
|
|
1806
|
-
}), 0);
|
|
1807
|
-
}
|
|
1808
|
-
if (basketDetails.transactionDiscount &&
|
|
1809
|
-
basketDetails.transactionDiscount.length > 0) {
|
|
1810
|
-
discountTotal += basketDetails.transactionDiscount.reduce((/**
|
|
1811
|
-
* @param {?} n
|
|
1812
|
-
* @param {?} __1
|
|
1813
|
-
* @return {?}
|
|
1814
|
-
*/
|
|
1815
|
-
function (n, _a) {
|
|
1816
|
-
var discountAmount = _a.discountAmount;
|
|
1817
|
-
return n + discountAmount;
|
|
1818
|
-
}), 0);
|
|
1819
|
-
}
|
|
1820
|
-
console.log("ebasket : TransactionDocumentBuilder : Transaction discount Total:", discountTotal);
|
|
1821
|
-
return discountTotal;
|
|
1822
|
-
};
|
|
1823
|
-
/**
|
|
1824
|
-
* @param {?} currency
|
|
1825
|
-
* @param {?} value
|
|
1826
|
-
* @return {?}
|
|
1827
|
-
*/
|
|
1828
|
-
TransactionDocumentBuilder.prototype.appendCurrencySymbol = /**
|
|
1829
|
-
* @param {?} currency
|
|
1830
|
-
* @param {?} value
|
|
1831
|
-
* @return {?}
|
|
1832
|
-
*/
|
|
1833
|
-
function (currency, value) {
|
|
1834
|
-
// value=this.decimalpipe.transform(value,'1.2');
|
|
1835
|
-
if (value >= 0) {
|
|
1836
|
-
/** @type {?} */
|
|
1837
|
-
var returnval = currency + value;
|
|
1838
|
-
console.log(returnval, "ebasket: add currency with value");
|
|
1839
|
-
return returnval;
|
|
1840
|
-
}
|
|
1841
|
-
else {
|
|
1842
|
-
/** @type {?} */
|
|
1843
|
-
var returnval = "-" + (currency + value * -1);
|
|
1844
|
-
console.log(returnval, "-(currency+(value*-1))");
|
|
1845
|
-
return returnval;
|
|
1846
|
-
}
|
|
1847
|
-
};
|
|
1848
|
-
// /**
|
|
1849
|
-
// * Updates total refund
|
|
1850
|
-
// * @returns total refund
|
|
1851
|
-
// */
|
|
1852
|
-
// updateTotalRefund(): TransactionDocumentBuilder {
|
|
1853
|
-
// this.transactionDocument.basket.products.forEach((product) => {
|
|
1854
|
-
// product.refundedQuantity = product.quantity;
|
|
1855
|
-
// product.refundedTotal = product.totalLinePrice * -1;
|
|
1856
|
-
// console.log(
|
|
1857
|
-
// "ebasket: Transaction price override :",
|
|
1858
|
-
// this.transactionDocument.basket.lineDiscount
|
|
1859
|
-
// );
|
|
1860
|
-
// if (
|
|
1861
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
1862
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
1863
|
-
// ) {
|
|
1864
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
|
|
1865
|
-
// console.log(
|
|
1866
|
-
// "Promotion: basket linePromotion : ",
|
|
1867
|
-
// this.transactionDocument.basket.linePromotion
|
|
1868
|
-
// );
|
|
1869
|
-
// console.log(
|
|
1870
|
-
// "linePromotion.itemLineId.toString() : ",
|
|
1871
|
-
// linePromotion.itemLineId.toString()
|
|
1872
|
-
// );
|
|
1873
|
-
// console.log(
|
|
1874
|
-
// "condition : " +
|
|
1875
|
-
// (product.itemLineId === linePromotion.itemLineId.toString())
|
|
1876
|
-
// );
|
|
1877
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString()) {
|
|
1878
|
-
// product.refundedTotal =
|
|
1879
|
-
// linePromotion.promotionLinePrice * -1;
|
|
1880
|
-
// }
|
|
1881
|
-
// });
|
|
1882
|
-
// } else
|
|
1883
|
-
// if (
|
|
1884
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
1885
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
1886
|
-
// ) {
|
|
1887
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
|
|
1888
|
-
// console.log(
|
|
1889
|
-
// "product.itemLineId : " +
|
|
1890
|
-
// this.transactionDocument.basket.lineDiscount
|
|
1891
|
-
// );
|
|
1892
|
-
// console.log(
|
|
1893
|
-
// "lineDiscount.itemLineId.toString() : " +
|
|
1894
|
-
// lineDiscount.itemLineId.toString()
|
|
1895
|
-
// );
|
|
1896
|
-
// console.log(
|
|
1897
|
-
// "condition : " +
|
|
1898
|
-
// (product.itemLineId === lineDiscount.itemLineId.toString())
|
|
1899
|
-
// );
|
|
1900
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1901
|
-
// product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
|
|
1902
|
-
// }
|
|
1903
|
-
// });
|
|
1904
|
-
// }
|
|
1905
|
-
// console.log("Product description :" + product.description);
|
|
1906
|
-
// console.log("Product total :" + product.refundedTotal);
|
|
1907
|
-
// // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
|
|
1908
|
-
// // console.log(product.displayrefundedamount,"displayrefundedamount");
|
|
1909
|
-
// product.refunded = true;
|
|
1910
|
-
// });
|
|
1911
|
-
// const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
|
|
1912
|
-
// // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
|
|
1913
|
-
// const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
|
|
1914
|
-
// // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
|
|
1915
|
-
// (this.transactionDocument.basketSummary.VATTotal *= -1);
|
|
1916
|
-
// return this;
|
|
1917
|
-
// }
|
|
1918
|
-
/**
|
|
1919
|
-
* Sale Total
|
|
1920
|
-
* @param basketDetails
|
|
1921
|
-
* @returns Sale Total
|
|
1922
|
-
*/
|
|
1923
|
-
// /**
|
|
1924
|
-
// * Updates total refund
|
|
1925
|
-
// * @returns total refund
|
|
1926
|
-
// */
|
|
1927
|
-
// updateTotalRefund(): TransactionDocumentBuilder {
|
|
1928
|
-
// this.transactionDocument.basket.products.forEach((product) => {
|
|
1929
|
-
// product.refundedQuantity = product.quantity;
|
|
1930
|
-
// product.refundedTotal = product.totalLinePrice * -1;
|
|
1931
|
-
// console.log(
|
|
1932
|
-
// "ebasket: Transaction price override :",
|
|
1933
|
-
// this.transactionDocument.basket.lineDiscount
|
|
1934
|
-
// );
|
|
1935
|
-
// if (
|
|
1936
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
1937
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
1938
|
-
// ) {
|
|
1939
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
|
|
1940
|
-
// console.log(
|
|
1941
|
-
// "Promotion: basket linePromotion : ",
|
|
1942
|
-
// this.transactionDocument.basket.linePromotion
|
|
1943
|
-
// );
|
|
1944
|
-
// console.log(
|
|
1945
|
-
// "linePromotion.itemLineId.toString() : ",
|
|
1946
|
-
// linePromotion.itemLineId.toString()
|
|
1947
|
-
// );
|
|
1948
|
-
// console.log(
|
|
1949
|
-
// "condition : " +
|
|
1950
|
-
// (product.itemLineId === linePromotion.itemLineId.toString())
|
|
1951
|
-
// );
|
|
1952
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString()) {
|
|
1953
|
-
// product.refundedTotal =
|
|
1954
|
-
// linePromotion.promotionLinePrice * -1;
|
|
1955
|
-
// }
|
|
1956
|
-
// });
|
|
1957
|
-
// } else
|
|
1958
|
-
// if (
|
|
1959
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
1960
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
1961
|
-
// ) {
|
|
1962
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
|
|
1963
|
-
// console.log(
|
|
1964
|
-
// "product.itemLineId : " +
|
|
1965
|
-
// this.transactionDocument.basket.lineDiscount
|
|
1966
|
-
// );
|
|
1967
|
-
// console.log(
|
|
1968
|
-
// "lineDiscount.itemLineId.toString() : " +
|
|
1969
|
-
// lineDiscount.itemLineId.toString()
|
|
1970
|
-
// );
|
|
1971
|
-
// console.log(
|
|
1972
|
-
// "condition : " +
|
|
1973
|
-
// (product.itemLineId === lineDiscount.itemLineId.toString())
|
|
1974
|
-
// );
|
|
1975
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
1976
|
-
// product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
|
|
1977
|
-
// }
|
|
1978
|
-
// });
|
|
1979
|
-
// }
|
|
1980
|
-
// console.log("Product description :" + product.description);
|
|
1981
|
-
// console.log("Product total :" + product.refundedTotal);
|
|
1982
|
-
// // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
|
|
1983
|
-
// // console.log(product.displayrefundedamount,"displayrefundedamount");
|
|
1984
|
-
// product.refunded = true;
|
|
1985
|
-
// });
|
|
1986
|
-
// const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
|
|
1987
|
-
// // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
|
|
1988
|
-
// const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
|
|
1989
|
-
// // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
|
|
1990
|
-
// (this.transactionDocument.basketSummary.VATTotal *= -1);
|
|
1991
|
-
// return this;
|
|
1992
|
-
// }
|
|
1993
|
-
/**
|
|
1994
|
-
* Sale Total
|
|
1995
|
-
* @param {?} basketDetails
|
|
1996
|
-
* @return {?} Sale Total
|
|
1997
|
-
*/
|
|
1998
|
-
TransactionDocumentBuilder.prototype.updateSaleTotal =
|
|
1999
|
-
// /**
|
|
2000
|
-
// * Updates total refund
|
|
2001
|
-
// * @returns total refund
|
|
2002
|
-
// */
|
|
2003
|
-
// updateTotalRefund(): TransactionDocumentBuilder {
|
|
2004
|
-
// this.transactionDocument.basket.products.forEach((product) => {
|
|
2005
|
-
// product.refundedQuantity = product.quantity;
|
|
2006
|
-
// product.refundedTotal = product.totalLinePrice * -1;
|
|
2007
|
-
// console.log(
|
|
2008
|
-
// "ebasket: Transaction price override :",
|
|
2009
|
-
// this.transactionDocument.basket.lineDiscount
|
|
2010
|
-
// );
|
|
2011
|
-
// if (
|
|
2012
|
-
// this.transactionDocument.basket.linePromotion &&
|
|
2013
|
-
// this.transactionDocument.basket.linePromotion.length > 0
|
|
2014
|
-
// ) {
|
|
2015
|
-
// this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
|
|
2016
|
-
// console.log(
|
|
2017
|
-
// "Promotion: basket linePromotion : ",
|
|
2018
|
-
// this.transactionDocument.basket.linePromotion
|
|
2019
|
-
// );
|
|
2020
|
-
// console.log(
|
|
2021
|
-
// "linePromotion.itemLineId.toString() : ",
|
|
2022
|
-
// linePromotion.itemLineId.toString()
|
|
2023
|
-
// );
|
|
2024
|
-
// console.log(
|
|
2025
|
-
// "condition : " +
|
|
2026
|
-
// (product.itemLineId === linePromotion.itemLineId.toString())
|
|
2027
|
-
// );
|
|
2028
|
-
// if (product.itemLineId === linePromotion.itemLineId.toString()) {
|
|
2029
|
-
// product.refundedTotal =
|
|
2030
|
-
// linePromotion.promotionLinePrice * -1;
|
|
2031
|
-
// }
|
|
2032
|
-
// });
|
|
2033
|
-
// } else
|
|
2034
|
-
// if (
|
|
2035
|
-
// this.transactionDocument.basket.lineDiscount &&
|
|
2036
|
-
// this.transactionDocument.basket.lineDiscount.length > 0
|
|
2037
|
-
// ) {
|
|
2038
|
-
// this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
|
|
2039
|
-
// console.log(
|
|
2040
|
-
// "product.itemLineId : " +
|
|
2041
|
-
// this.transactionDocument.basket.lineDiscount
|
|
2042
|
-
// );
|
|
2043
|
-
// console.log(
|
|
2044
|
-
// "lineDiscount.itemLineId.toString() : " +
|
|
2045
|
-
// lineDiscount.itemLineId.toString()
|
|
2046
|
-
// );
|
|
2047
|
-
// console.log(
|
|
2048
|
-
// "condition : " +
|
|
2049
|
-
// (product.itemLineId === lineDiscount.itemLineId.toString())
|
|
2050
|
-
// );
|
|
2051
|
-
// if (product.itemLineId === lineDiscount.itemLineId.toString()) {
|
|
2052
|
-
// product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
|
|
2053
|
-
// }
|
|
2054
|
-
// });
|
|
2055
|
-
// }
|
|
2056
|
-
// console.log("Product description :" + product.description);
|
|
2057
|
-
// console.log("Product total :" + product.refundedTotal);
|
|
2058
|
-
// // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
|
|
2059
|
-
// // console.log(product.displayrefundedamount,"displayrefundedamount");
|
|
2060
|
-
// product.refunded = true;
|
|
2061
|
-
// });
|
|
2062
|
-
// const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
|
|
2063
|
-
// // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
|
|
2064
|
-
// const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
|
|
2065
|
-
// // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
|
|
2066
|
-
// (this.transactionDocument.basketSummary.VATTotal *= -1);
|
|
2067
|
-
// return this;
|
|
2068
|
-
// }
|
|
2069
|
-
/**
|
|
2070
|
-
* Sale Total
|
|
2071
|
-
* @param {?} basketDetails
|
|
2072
|
-
* @return {?} Sale Total
|
|
2073
|
-
*/
|
|
2074
|
-
function (basketDetails) {
|
|
2075
|
-
/** @type {?} */
|
|
2076
|
-
var saleTotal = basketDetails.products.reduce((/**
|
|
2077
|
-
* @param {?} n
|
|
2078
|
-
* @param {?} __1
|
|
2079
|
-
* @return {?}
|
|
2080
|
-
*/
|
|
2081
|
-
function (n, _a) {
|
|
2082
|
-
var totalLinePrice = _a.totalLinePrice;
|
|
2083
|
-
return n + totalLinePrice;
|
|
2084
|
-
}), 0);
|
|
2085
|
-
return saleTotal;
|
|
2086
|
-
};
|
|
2087
|
-
/**
|
|
2088
|
-
* @param {?} basketDetails
|
|
2089
|
-
* @return {?}
|
|
2090
|
-
*/
|
|
2091
|
-
TransactionDocumentBuilder.prototype.getTotalWithLineDiscountAndLinePromotionApplied = /**
|
|
2092
|
-
* @param {?} basketDetails
|
|
2093
|
-
* @return {?}
|
|
2094
|
-
*/
|
|
2095
|
-
function (basketDetails) {
|
|
2096
|
-
var e_1, _a;
|
|
2097
|
-
/** @type {?} */
|
|
2098
|
-
var saletotal = 0.0;
|
|
2099
|
-
try {
|
|
2100
|
-
for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
2101
|
-
var product = _c.value;
|
|
2102
|
-
// if (product.linePromotions) {
|
|
2103
|
-
// saletotal += product.linePromotions.promotionLinePrice;
|
|
2104
|
-
// } else if (
|
|
2105
|
-
// product.lineDiscount &&
|
|
2106
|
-
// !product.linePromotions
|
|
2107
|
-
// ) {
|
|
2108
|
-
// saletotal +=
|
|
2109
|
-
// product.quantity * Number(product.lineDiscount.unitPrice.toFixed(2));
|
|
2110
|
-
// } else {
|
|
2111
|
-
// saletotal +=
|
|
2112
|
-
// product.quantity * Number(product.selectedPrice.toFixed(2));
|
|
2113
|
-
// }
|
|
2114
|
-
saletotal += product.total;
|
|
2115
|
-
console.log("e-basket:update product Total:" + saletotal, JSON.stringify(product));
|
|
2116
|
-
}
|
|
2117
|
-
}
|
|
2118
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
2119
|
-
finally {
|
|
2120
|
-
try {
|
|
2121
|
-
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
2122
|
-
}
|
|
2123
|
-
finally { if (e_1) throw e_1.error; }
|
|
2124
|
-
}
|
|
2125
|
-
return saletotal;
|
|
2126
|
-
};
|
|
2127
|
-
/**
|
|
2128
|
-
* @param {?} basketDetails
|
|
2129
|
-
* @return {?}
|
|
2130
|
-
*/
|
|
2131
|
-
TransactionDocumentBuilder.prototype.getRefundedTotalWithQuantity = /**
|
|
2132
|
-
* @param {?} basketDetails
|
|
2133
|
-
* @return {?}
|
|
2134
|
-
*/
|
|
2135
|
-
function (basketDetails) {
|
|
2136
|
-
/** @type {?} */
|
|
2137
|
-
var quantity = 0;
|
|
2138
|
-
for (var index = 0; index < basketDetails.products.length; index++) {
|
|
2139
|
-
/** @type {?} */
|
|
2140
|
-
var product = basketDetails.products[index];
|
|
2141
|
-
if (!product.refundedReasonDescription) {
|
|
2142
|
-
quantity = quantity + product.quantity;
|
|
2143
|
-
}
|
|
2144
|
-
else {
|
|
2145
|
-
quantity = quantity + (product.quantity - product.refundedQuantity);
|
|
2146
|
-
// basketDetails.total = basketDetails.total + product.refundedTotal;
|
|
2147
|
-
}
|
|
2148
|
-
}
|
|
2149
|
-
return quantity;
|
|
2150
|
-
};
|
|
2151
|
-
/**
|
|
2152
|
-
* Discount Total
|
|
2153
|
-
* @returns Discount Total
|
|
2154
|
-
*/
|
|
2155
|
-
/**
|
|
2156
|
-
* Discount Total
|
|
2157
|
-
* @return {?} Discount Total
|
|
2158
|
-
*/
|
|
2159
|
-
TransactionDocumentBuilder.prototype.updateDiscountTotal = /**
|
|
2160
|
-
* Discount Total
|
|
2161
|
-
* @return {?} Discount Total
|
|
2162
|
-
*/
|
|
2163
|
-
function () {
|
|
2164
|
-
/** @type {?} */
|
|
2165
|
-
var refundTotal = this.transactionDocument.basketSummary.refundTotal ? this.transactionDocument.basketSummary.refundTotal : 0;
|
|
2166
|
-
console.info("e-basket: transaction builder: refundTotal", JSON.stringify(refundTotal), JSON.stringify(this.transactionDocument.basketSummary));
|
|
2167
|
-
/** @type {?} */
|
|
2168
|
-
var discountTotal = Math.abs(Math.abs(this.transactionDocument.basketSummary.saleTotal) -
|
|
2169
|
-
(Math.abs(this.transactionDocument.basketSummary.basketTotal) + Math.abs(refundTotal)));
|
|
2170
|
-
console.log("e-basket: transaction builder: discountTotal", JSON.stringify(discountTotal));
|
|
2171
|
-
return Number(discountTotal.toFixed(2));
|
|
2172
|
-
};
|
|
2173
|
-
/**
|
|
2174
|
-
* @param {?} reasonCode
|
|
2175
|
-
* @return {?}
|
|
2176
|
-
*/
|
|
2177
|
-
TransactionDocumentBuilder.prototype.updateReasonCode = /**
|
|
2178
|
-
* @param {?} reasonCode
|
|
2179
|
-
* @return {?}
|
|
2180
|
-
*/
|
|
2181
|
-
function (reasonCode) {
|
|
2182
|
-
this.transactionDocument.reasonCode = reasonCode.code;
|
|
2183
|
-
this.transactionDocument.reasonDescription = reasonCode.name;
|
|
2184
|
-
return this;
|
|
2185
|
-
};
|
|
2186
|
-
/**
|
|
2187
|
-
* @param {?} useroverride
|
|
2188
|
-
* @return {?}
|
|
2189
|
-
*/
|
|
2190
|
-
TransactionDocumentBuilder.prototype.updateManagerOverride = /**
|
|
2191
|
-
* @param {?} useroverride
|
|
2192
|
-
* @return {?}
|
|
2193
|
-
*/
|
|
2194
|
-
function (useroverride) {
|
|
2195
|
-
this.transactionDocument.override = useroverride;
|
|
2196
|
-
return this;
|
|
2197
|
-
};
|
|
2198
|
-
/**
|
|
2199
|
-
* @param {?} userID
|
|
2200
|
-
* @return {?}
|
|
2201
|
-
*/
|
|
2202
|
-
TransactionDocumentBuilder.prototype.updateUserID = /**
|
|
2203
|
-
* @param {?} userID
|
|
2204
|
-
* @return {?}
|
|
2205
|
-
*/
|
|
2206
|
-
function (userID) {
|
|
2207
|
-
this.transactionDocument.userId = userID;
|
|
2208
|
-
return this;
|
|
2209
|
-
};
|
|
2210
|
-
/**
|
|
2211
|
-
* @param {?} name
|
|
2212
|
-
* @return {?}
|
|
2213
|
-
*/
|
|
2214
|
-
TransactionDocumentBuilder.prototype.updateUserName = /**
|
|
2215
|
-
* @param {?} name
|
|
2216
|
-
* @return {?}
|
|
2217
|
-
*/
|
|
2218
|
-
function (name) {
|
|
2219
|
-
this.transactionDocument.userName = name;
|
|
2220
|
-
return this;
|
|
2221
|
-
};
|
|
2222
|
-
/**
|
|
2223
|
-
* @param {?} customerDetail
|
|
2224
|
-
* @return {?}
|
|
2225
|
-
*/
|
|
2226
|
-
TransactionDocumentBuilder.prototype.addCustomerDetails = /**
|
|
2227
|
-
* @param {?} customerDetail
|
|
2228
|
-
* @return {?}
|
|
2229
|
-
*/
|
|
2230
|
-
function (customerDetail) {
|
|
2231
|
-
this.transactionDocument.customer = customerDetail;
|
|
2232
|
-
return this;
|
|
2233
|
-
};
|
|
2234
|
-
/**
|
|
2235
|
-
* @param {?} basketDetails
|
|
2236
|
-
* @return {?}
|
|
2237
|
-
*/
|
|
2238
|
-
TransactionDocumentBuilder.prototype.updateTaxBreakdown = /**
|
|
2239
|
-
* @param {?} basketDetails
|
|
2240
|
-
* @return {?}
|
|
2241
|
-
*/
|
|
2242
|
-
function (basketDetails) {
|
|
2243
|
-
var _this = this;
|
|
2244
|
-
// let transactionDiscountTotal = 0;
|
|
2245
|
-
/** @type {?} */
|
|
2246
|
-
var taxBreakdown = {
|
|
2247
|
-
taxLines: [],
|
|
2248
|
-
totalTaxableAmount: 0,
|
|
2249
|
-
};
|
|
2250
|
-
// if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
|
|
2251
|
-
// this.transactionDocument.basket.transactionDiscount.forEach((discount) => {
|
|
2252
|
-
// transactionDiscountTotal += discount.discountAmount;
|
|
2253
|
-
// });
|
|
2254
|
-
// }
|
|
2255
|
-
// if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
2256
|
-
// this.transactionDocument.basket.transactionPromotion.forEach(
|
|
2257
|
-
// (promotion) => {
|
|
2258
|
-
// transactionDiscountTotal += promotion.promotionAmount;
|
|
2259
|
-
// }
|
|
2260
|
-
// );
|
|
2261
|
-
// }
|
|
2262
|
-
basketDetails.products.forEach((/**
|
|
2263
|
-
* @param {?} product
|
|
2264
|
-
* @return {?}
|
|
2265
|
-
*/
|
|
2266
|
-
function (product) {
|
|
2267
|
-
/** @type {?} */
|
|
2268
|
-
var taxLine = {
|
|
2269
|
-
itemLineId: product.itemLineId,
|
|
2270
|
-
VAT: product.selectedVAT ? product.selectedVAT : 0,
|
|
2271
|
-
VATCode: product.selectedVATCode,
|
|
2272
|
-
taxLineTotal: 0,
|
|
2273
|
-
taxableAmount: product.total,
|
|
2274
|
-
PreTax: 0
|
|
2275
|
-
};
|
|
2276
|
-
console.info("Product contribution : item line ID :", product.itemLineId, "tax line :", JSON.stringify(taxLine));
|
|
2277
|
-
// step 1
|
|
2278
|
-
// if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
|
|
2279
|
-
// if (transactionDiscountTotal > 0) {
|
|
2280
|
-
product = _this.basketService.validateProductItemDiscount(product);
|
|
2281
|
-
/** @type {?} */
|
|
2282
|
-
var productContributionInTotal = product.itemDiscounts.trnDiscountsPortion +
|
|
2283
|
-
product.itemDiscounts.trnPromotionsPortion -
|
|
2284
|
-
product.itemDiscounts.refundPortion;
|
|
2285
|
-
// tp+td-rp;
|
|
2286
|
-
console.info("Product contribution : item line ID :", product.itemLineId, "contribution :", JSON.stringify(productContributionInTotal));
|
|
2287
|
-
// calculate net selling price after applying transaction discount as per product contribution
|
|
2288
|
-
taxLine.taxableAmount -= productContributionInTotal;
|
|
2289
|
-
// }
|
|
2290
|
-
//step 2 - find pre tax
|
|
2291
|
-
taxLine.PreTax = _this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));
|
|
2292
|
-
//step 3 - Update taxbreakdown
|
|
2293
|
-
taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;
|
|
2294
|
-
taxLine.taxableAmount = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);
|
|
2295
|
-
// step 4 - update tax Line total
|
|
2296
|
-
taxLine.taxLineTotal = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);
|
|
2297
|
-
taxBreakdown.taxLines.push(taxLine);
|
|
2298
|
-
}));
|
|
2299
|
-
taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);
|
|
2300
|
-
this.transactionDocument.basket.taxBreakdown = taxBreakdown;
|
|
2301
|
-
return this;
|
|
2302
|
-
};
|
|
2303
|
-
/**
|
|
2304
|
-
* @return {?}
|
|
2305
|
-
*/
|
|
2306
|
-
TransactionDocumentBuilder.prototype.updateTotalTaxSummary = /**
|
|
2307
|
-
* @return {?}
|
|
2308
|
-
*/
|
|
2309
|
-
function () {
|
|
2310
|
-
var _this = this;
|
|
2311
|
-
console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.basket.taxBreakdown));
|
|
2312
|
-
/** @type {?} */
|
|
2313
|
-
var totalTaxSummaryArray = [];
|
|
2314
|
-
/** @type {?} */
|
|
2315
|
-
var totalTaxSummaryGroup = [];
|
|
2316
|
-
console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.basket.taxBreakdown.taxLines));
|
|
2317
|
-
this.transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
|
|
2318
|
-
* @param {?} element
|
|
2319
|
-
* @return {?}
|
|
2320
|
-
*/
|
|
2321
|
-
function (element) {
|
|
2322
|
-
/** @type {?} */
|
|
2323
|
-
var TaxSummary = {
|
|
2324
|
-
VATCode: "",
|
|
2325
|
-
VAT: -12345,
|
|
2326
|
-
PreTaxSum: 0,
|
|
2327
|
-
TaxSum: 0,
|
|
2328
|
-
TXrateSum: 0
|
|
2329
|
-
};
|
|
2330
|
-
TaxSummary.VATCode = element.VATCode;
|
|
2331
|
-
TaxSummary.VAT = element.VAT;
|
|
2332
|
-
TaxSummary.PreTaxSum = _this.numberUtilService.trimTo2Decimal2(element.PreTax);
|
|
2333
|
-
TaxSummary.TaxSum = _this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);
|
|
2334
|
-
TaxSummary.TXrateSum = _this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
|
|
2335
|
-
totalTaxSummaryArray.push(TaxSummary);
|
|
2336
|
-
}));
|
|
2337
|
-
console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
|
|
2338
|
-
totalTaxSummaryGroup = totalTaxSummaryArray.reduce((/**
|
|
2339
|
-
* @param {?} preparedArray
|
|
2340
|
-
* @param {?} currentObj
|
|
2341
|
-
* @return {?}
|
|
2342
|
-
*/
|
|
2343
|
-
function (preparedArray, currentObj) {
|
|
2344
|
-
/** @type {?} */
|
|
2345
|
-
var ind = preparedArray.findIndex((/**
|
|
2346
|
-
* @param {?} x
|
|
2347
|
-
* @return {?}
|
|
2348
|
-
*/
|
|
2349
|
-
function (x) { return x.VAT === currentObj.VAT; }));
|
|
2350
|
-
if (ind === -1) {
|
|
2351
|
-
preparedArray.push(currentObj);
|
|
2352
|
-
}
|
|
2353
|
-
else {
|
|
2354
|
-
preparedArray[ind].VATCode = currentObj.VATCode;
|
|
2355
|
-
preparedArray[ind].VAT = currentObj.VAT;
|
|
2356
|
-
preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;
|
|
2357
|
-
preparedArray[ind].TaxSum += currentObj.TaxSum;
|
|
2358
|
-
preparedArray[ind].TXrateSum += currentObj.TXrateSum;
|
|
2359
|
-
}
|
|
2360
|
-
return preparedArray;
|
|
2361
|
-
}), []);
|
|
2362
|
-
console.log("Total Tax Summer Group :", totalTaxSummaryGroup);
|
|
2363
|
-
this.transactionDocument.basket.totalTaxSummary = totalTaxSummaryGroup;
|
|
2364
|
-
return this;
|
|
2365
|
-
};
|
|
2366
|
-
/**
|
|
2367
|
-
* TransactionId
|
|
2368
|
-
* @returns OriginalTransactionId
|
|
2369
|
-
*/
|
|
2370
|
-
/**
|
|
2371
|
-
* TransactionId
|
|
2372
|
-
* @param {?} tranDoc
|
|
2373
|
-
* @return {?} OriginalTransactionId
|
|
2374
|
-
*/
|
|
2375
|
-
TransactionDocumentBuilder.prototype.addOriginalTransId = /**
|
|
2376
|
-
* TransactionId
|
|
2377
|
-
* @param {?} tranDoc
|
|
2378
|
-
* @return {?} OriginalTransactionId
|
|
2379
|
-
*/
|
|
2380
|
-
function (tranDoc) {
|
|
2381
|
-
if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
|
|
2382
|
-
this.transactionDocument.originalTransId = tranDoc.transactionId;
|
|
2383
|
-
if (tranDoc.apiResponse && tranDoc.apiResponse.internalId) {
|
|
2384
|
-
this.transactionDocument.originalExternalId = tranDoc.apiResponse.internalId.toString();
|
|
2385
|
-
}
|
|
2386
|
-
}
|
|
2387
|
-
return this;
|
|
2388
|
-
};
|
|
2389
|
-
/**
|
|
2390
|
-
* unreferenced Refund
|
|
2391
|
-
* @returns boolean value
|
|
2392
|
-
*/
|
|
2393
|
-
/**
|
|
2394
|
-
* unreferenced Refund
|
|
2395
|
-
* @return {?} boolean value
|
|
2396
|
-
*/
|
|
2397
|
-
TransactionDocumentBuilder.prototype.addUnreferencedRefund = /**
|
|
2398
|
-
* unreferenced Refund
|
|
2399
|
-
* @return {?} boolean value
|
|
2400
|
-
*/
|
|
2401
|
-
function () {
|
|
2402
|
-
this.transactionDocument.unreferencedRefund = true;
|
|
2403
|
-
return this;
|
|
2404
|
-
};
|
|
2405
|
-
/**
|
|
2406
|
-
* @return {?}
|
|
2407
|
-
*/
|
|
2408
|
-
TransactionDocumentBuilder.prototype.getRefundTotal = /**
|
|
2409
|
-
* @return {?}
|
|
2410
|
-
*/
|
|
2411
|
-
function () {
|
|
2412
|
-
/** @type {?} */
|
|
2413
|
-
var totalRefund = 0;
|
|
2414
|
-
for (var index = 0; index < this.transactionDocument.basket.products.length; index++) {
|
|
2415
|
-
/** @type {?} */
|
|
2416
|
-
var product = this.transactionDocument.basket.products[index];
|
|
2417
|
-
if (product.refundedTotal) {
|
|
2418
|
-
totalRefund = totalRefund + product.refundedTotal;
|
|
2419
|
-
}
|
|
2420
|
-
console.log("ebasket : transaction Service: totalRefund" + totalRefund);
|
|
2421
|
-
}
|
|
2422
|
-
return totalRefund;
|
|
2423
|
-
};
|
|
2424
|
-
/**
|
|
2425
|
-
* @param {?} docId
|
|
2426
|
-
* @return {?}
|
|
2427
|
-
*/
|
|
2428
|
-
TransactionDocumentBuilder.prototype.docId = /**
|
|
2429
|
-
* @param {?} docId
|
|
2430
|
-
* @return {?}
|
|
2431
|
-
*/
|
|
2432
|
-
function (docId) {
|
|
2433
|
-
this.transactionDocument.id = docId;
|
|
2434
|
-
return this;
|
|
2435
|
-
};
|
|
2436
|
-
return TransactionDocumentBuilder;
|
|
2437
|
-
}());
|
|
2438
|
-
/**
|
|
2439
|
-
* Transaction document builder
|
|
2440
|
-
*/
|
|
2441
|
-
export { TransactionDocumentBuilder };
|
|
2442
|
-
if (false) {
|
|
2443
|
-
/**
|
|
2444
|
-
* @type {?}
|
|
2445
|
-
* @private
|
|
2446
|
-
*/
|
|
2447
|
-
TransactionDocumentBuilder.prototype.transactionDocument;
|
|
2448
|
-
/**
|
|
2449
|
-
* @type {?}
|
|
2450
|
-
* @private
|
|
2451
|
-
*/
|
|
2452
|
-
TransactionDocumentBuilder.prototype.numberUtilService;
|
|
2453
|
-
/**
|
|
2454
|
-
* @type {?}
|
|
2455
|
-
* @private
|
|
2456
|
-
*/
|
|
2457
|
-
TransactionDocumentBuilder.prototype.storeInfo;
|
|
2458
|
-
/**
|
|
2459
|
-
* @type {?}
|
|
2460
|
-
* @private
|
|
2461
|
-
*/
|
|
2462
|
-
TransactionDocumentBuilder.prototype.currencyPipe;
|
|
2463
|
-
/**
|
|
2464
|
-
* @type {?}
|
|
2465
|
-
* @private
|
|
2466
|
-
*/
|
|
2467
|
-
TransactionDocumentBuilder.prototype.basketService;
|
|
2468
|
-
}
|
|
2469
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcG1jcmV0YWlsL21hcHBlci1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL1RyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFBc0QsZ0JBQWdCLEVBQWlHLE1BQU0sd0JBQXdCLENBQUM7QUFDN00sT0FBTyxFQUFFLGdCQUFnQixFQUErRCxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUsxRDs7OztJQUtFLG9DQUNFLGNBQW9DLEVBQzVCLFlBQTJCLEVBQzNCLGFBQW1DO1FBRG5DLGlCQUFZLEdBQVosWUFBWSxDQUFlO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUUzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDM0M7YUFBTTtZQUNMLElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDekIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFD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V0FBVyxHQUFHLENBQUM7UUFDbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs7Z0JBQzlFLE9BQU8sR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDekUsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUN6QixXQUFXLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDbkQ7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxHQUFHLFdBQVcsQ0FBQyxDQUFBO1NBQ3hFO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCwwQ0FBSzs7OztJQUFMLFVBQU0sS0FBVTtRQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILGlDQUFDO0FBQUQsQ0FBQyxBQXArQ0QsSUFvK0NDOzs7Ozs7Ozs7O0lBbitDQyx5REFBaUQ7Ozs7O0lBQ2pELHVEQUE2Qzs7Ozs7SUFDN0MsK0NBQXdCOzs7OztJQUl0QixrREFBbUM7Ozs7O0lBQ25DLG1EQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQmFza2V0U3VtbWFyeSwgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlscywgQ3VzdG9tZXIsIERFTElWRVJZX01FVEhPRFMsIEl0ZW1EaXNjb3VudHMsIFRheEJyZWFrZG93biwgVGF4TGluZSwgVEJhc2tldCwgVG90YWxUYXhTdW1tYXJ5LCBUUHJvZHVjdCwgVHJhbnNhY3Rpb25Eb2N1bWVudCB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCI7XHJcbmltcG9ydCB7IFRSQU5TQUNUSU9OX1RZUEUsIEJhc2tldCwgTGluZURpc2NvdW50LCBMaW5lUHJvbW90aW9ucywgUHJvZHVjdCwgVXNlck92ZXJyaWRlIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIjtcclxuaW1wb3J0IHsgQmFza2V0U2VydmljZSB9IGZyb20gXCIuL2Jhc2tldC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE51bWJlclV0aWxTZXJ2aWNlIH0gZnJvbSBcIi4vbnVtYmVyLXV0aWwuc2VydmljZVwiO1xyXG5cclxuLyoqXHJcbiAqIFRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xyXG4gIHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlO1xyXG4gIHByaXZhdGUgc3RvcmVJbmZvIDogYW55O1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdHJhbnNhY3Rpb25Eb2M/OiBUcmFuc2FjdGlvbkRvY3VtZW50LFxyXG4gICAgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGUsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U/OiBCYXNrZXRTZXJ2aWNlIHwgYW55LFxyXG4gICkge1xyXG4gICAgdGhpcy5udW1iZXJVdGlsU2VydmljZSA9IG5ldyBOdW1iZXJVdGlsU2VydmljZShjdXJyZW5jeVBpcGUpO1xyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlID0gbmV3IEJhc2tldFNlcnZpY2UodGhpcy5udW1iZXJVdGlsU2VydmljZSk7XHJcbiAgICB0aGlzLnN0b3JlSW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JlSW5mbycpIHx8ICd7fScpO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uRG9jKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHRyYW5zYWN0aW9uRG9jO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0ge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgdHJhbnNhY3Rpb25SZWY6IFwiXCIsXHJcbiAgICAgICAgZGF0ZVRpbWU6IFwiXCIsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIHVzZXJJZDogXCJcIixcclxuICAgICAgICBpbml0aWF0aW5nTW9kdWxlIDogXCJlQmFza2V0XCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBiYXNrZXQ6IHt9IGFzIFRCYXNrZXQsXHJcbiAgICAgICAgYmFza2V0U3VtbWFyeToge30gYXMgQmFza2V0U3VtbWFyeSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgdHlwZTogXCJcIixcclxuICAgICAgICBvcGVyYXRpb25TdGF0dXM6IFwiXCIsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBcIlwiLFxyXG4gICAgICAgIHVwZGF0ZWRBdDogXCJcIixcclxuICAgICAgICBpZDogXCJcIixcclxuICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzOiB7fSBhcyBDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLFxyXG4gICAgICAgIHNhbGVUb3RhbDogMCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9ucyByZWZcclxuICAgKiBAcmV0dXJucyByZWZcclxuICAgKi9cclxuICB0cmFuc2FjdGlvblJlZigpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBzdG9yZURldGFpbHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdG9yZUluZm8nKSB8fCAne30nKTtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgcmFuZG9tID0gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKVxyXG4gICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgIC5zdWJzdHJpbmcoMSk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYgPVxyXG4gICAgICBzdG9yZURldGFpbHMub3JnQ29kZSArIHN0b3JlRGV0YWlscy5zdG9yZUlkICsgZGF0ZS50b0lTT1N0cmluZygpICsgcmFuZG9tO1xyXG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OiB0cmFuc2FjdGlvbiByZWYgY3JlYXRlZFwiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYpXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9ucyBpZFxyXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklEXHJcbiAgICogQHJldHVybnMgaWRcclxuICAgKi9cclxuICB0cmFuc2FjdGlvbklkKHRyYW5zYWN0aW9uSUQ6IHN0cmluZywgaXNPbmxpbmU6IGJvb2xlYW4gPSB0cnVlKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKGlzT25saW5lKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNhY3Rpb25zIGlkXHJcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSURcclxuICAgKiBAcmV0dXJucyBpZFxyXG4gICAqL1xyXG4gIG9mZmxpbmVUcmFuc2FjdGlvbklkKHRyYW5zYWN0aW9uSUQ6IHN0cmluZywgaXNPbmxpbmU6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGlmICghaXNPbmxpbmUpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9mZmxpbmVUcmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBzdG9yZU5vZGUgSWRcclxuICAqIEBwYXJhbSBzdG9yZU5vZGVJZFxyXG4gICogQHJldHVybnMgaWRcclxuICAqL1xyXG4gIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiogc3RvcmVOb2RlIHN0cnVjdHVyZVxyXG4qIEBwYXJhbSBzdG9yZU5vZGVTdHJ1Y3R1cmVcclxuKiBAcmV0dXJucyBpZFxyXG4qL1xyXG4gIHN0b3JlTm9kZVN0cnVjdHVyZShzdG9yZU5vZGVTdHJ1Y3R1cmU6IHN0cmluZyk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZU5vZGVTdHJ1Y3R1cmUgPSBzdG9yZU5vZGVTdHJ1Y3R1cmU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9yZ3MgY29kZVxyXG4gICAqIEBwYXJhbSBvcmdDb2RlXHJcbiAgICogQHJldHVybnMgY29kZVxyXG4gICAqL1xyXG4gIG9yZ0NvZGUob3JnQ29kZTogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9yZ0NvZGUgPSBvcmdDb2RlO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBpZFxyXG4gICAqIEBwYXJhbSBzdG9yZUlkXHJcbiAgICogQHJldHVybnMgaWRcclxuICAgKi9cclxuICBzdG9yZUlkKHN0b3JlSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkID0gc3RvcmVJZDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEYXRlcyB0aW1lXHJcbiAgICogQHJldHVybnMgdGltZVxyXG4gICAqL1xyXG4gIGRhdGVUaW1lKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmRhdGVUaW1lID0gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERldmljZXMgaWRcclxuICAgKiBAcGFyYW0gZGV2aWNlSWRcclxuICAgKiBAcmV0dXJucyBpZFxyXG4gICAqL1xyXG4gIGRldmljZUlkKGRldmljZUlkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogdGVybWluYWwgaWRcclxuICAgICAqIEBwYXJhbSB0ZXJtaW5hbElkXHJcbiAgICAgKiBAcmV0dXJucyBpZFxyXG4gICAgICovXHJcbiAgdGVybWluYWxJZCh0ZXJtaW5hbElkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudGVybWluYWxJZCA9IHRlcm1pbmFsSWQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgICogc2FsZUV4cG9ydFxyXG4gICAgKiBAcGFyYW0gc2FsZUV4cG9ydFxyXG4gICAgKiBAcmV0dXJucyBpZFxyXG4gICAgKi9cclxuICBleHBvcnQoc2FsZUV4cG9ydDogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmV4cG9ydCA9IHNhbGVFeHBvcnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyogIGN1c3RvbWVyKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyRGV0YWlscycpKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lciA9IHVzZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9ICovXHJcbiAgLyoqXHJcbiAgICogQmFza2V0cyB0cmFuc2FjdGlvbiBkb2N1bWVudCBidWlsZGVyXHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBiYXNrZXRcclxuICAgKi9cclxuICBiYXNrZXQoYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OiBiYXNrZXQgZGV0YWlscyB1cGRhdGUgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnRcIiwgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscykpO1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdWJzaWRpYXJ5SWQgPSBiYXNrZXREZXRhaWxzLnN1YnNpZGlhcnlJZCB8fCAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1YnNpZGlhcnlJZCcpIHx8ICcnKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMgPSBbXSBhcyBUUHJvZHVjdFtdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQgPSBbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbiA9IFtdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xyXG4gICAgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnksIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHAgPSB7fSBhcyBUUHJvZHVjdDtcclxuICAgICAgcC5pdGVtRGlzY291bnRzID0ge30gYXMgSXRlbURpc2NvdW50cztcclxuICAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcclxuICAgICAgcC5leGNsdWRlUHJvbW90aW9uID0gcHJvZHVjdC5leGNsdWRlUHJvbW90aW9uO1xyXG4gICAgICBwLmJhckNvZGUgPSBwcm9kdWN0LmJhcmNvZGU7XHJcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xyXG4gICAgICBwLmRlc2NyaXB0aW9uID0gcHJvZHVjdC5kZXNjcmlwdGlvbjtcclxuICAgICAgcC5pdGVtTGluZUlkID0gcHJvZHVjdC5pdGVtTGluZUlkID8gcHJvZHVjdC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIlwiICsgKGluZGV4ICsgMSk7XHJcbiAgICAgIHAucHJpY2UgPSBwcm9kdWN0LnNlbGVjdGVkUHJpY2U7XHJcbiAgICAgIHAucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC5xdWFudGl0eSAqIHByb2R1Y3Quc2VsZWN0ZWRQcmljZTtcclxuICAgICAgcC5pbWFnZVVybHMgPSBwcm9kdWN0LmltYWdlVXJscztcclxuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xyXG5cclxuICAgICAgLy9pbnZlbnRvcnkgZmllbGRzXHJcbiAgICAgIFxyXG4gICAgICBwLmZ1bGxmaWxtZW50SWQgPSBwcm9kdWN0LmZ1bGxmaWxtZW50SWQ/IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDogdGhpcy5zdG9yZUluZm8uc3RvcmVJZDtcclxuXHJcbiAgICAgIHAuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWUgPSBwcm9kdWN0LmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lO1xyXG4gICAgICBwLmRlbGl2ZXJ5R3JvdXAgPSBwcm9kdWN0LmRlbGl2ZXJ5R3JvdXA7XHJcbiAgICAgIHAubGVhZFRpbWUgPSBwcm9kdWN0LmxlYWRUaW1lO1xyXG4gICAgICBwLmRlbGl2ZXJ5TWV0aG9kID0gcHJvZHVjdC5kZWxpdmVyeU1ldGhvZDtcclxuXHJcbiAgICAgIHAuZ2lmdENhcmQgPSBwcm9kdWN0LmdpZnRDYXJkO1xyXG4gICAgICBwLmdpZnRDYXJkRXhwaXJ5RGF0ZSA9IHByb2R1Y3QuZ2lmdENhcmRFeHBpcnlEYXRlO1xyXG4gICAgICBwLmdpZnRDYXJkTnVtYmVySXNzdWVkID0gcHJvZHVjdC5naWZ0Q2FyZE51bWJlcklzc3VlZDtcclxuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsO1xyXG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50TmFtZSA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnROYW1lO1xyXG5cclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcclxuICAgICAgICBwLnJlZnVuZGVkUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHk7XHJcbiAgICAgICAgcC5yZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHk7XHJcbiAgICAgICAgcC5yZWZ1bmRlZCA9IHByb2R1Y3QucmVmdW5kZWQ7XHJcbiAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uO1xyXG4gICAgICAgIHAucmVmdW5kZWRSZWFzb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uO1xyXG4gICAgICAgIGlmICghcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBwLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBwLnJlZnVuZGVkUmVhc29uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwLnJlZnVuZGVkVG90YWwgPSBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgICAgcC5pc0xhc3RFeGNoYW5nZWQgPSBwcm9kdWN0LmlzTGFzdEV4Y2hhbmdlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHByb2R1Y3QuZXhjaGFuZ2UpIHtcclxuICAgICAgICBwLmV4Y2hhbmdlID0gcHJvZHVjdC5leGNoYW5nZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcclxuICAgICAgICBwLmxpbmVEaXNjb3VudCA9IHByb2R1Y3QubGluZURpc2NvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIHAuaXRlbURpc2NvdW50cyA9IHByb2R1Y3QuaXRlbURpc2NvdW50cyBhcyBJdGVtRGlzY291bnRzO1xyXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLnB1c2gocCk7XHJcbiAgICAgIHRoaXMubGluZURpc2NvdW50KGJhc2tldERldGFpbHMpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiB0cmFuc2FjdGlvbmRvY3VtZW50IGJhc2tldCBkZXRhaWxzIHVwZGF0ZWRcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldCkpO1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uIERldGFpbHMgVG90YWwoTmV3IFByb2R1Y3RzKVxyXG4gICAgICogQHJldHVybnMgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1xyXG4gICAgICovXHJcblxyXG4gIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMoYmFza2V0OiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IGN1cnJlbnQgdHJhbnNhY3Rpb24gZGV0YWlscyBmb3IgZXhjaGFuZ2VzXCIsIGJhc2tldCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVQcm9tb3Rpb24gPSBbXSBhcyBMaW5lUHJvbW90aW9uc1tdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZURpc2NvdW50ID0gW10gYXMgTGluZURpc2NvdW50W107XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ID0gW107XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IGJhc2tldC5wcm9kdWN0cztcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMuZmlsdGVyKFxyXG4gICAgICAoICAgICAgcHJvajogeyByZWZ1bmRlZFF1YW50aXR5OiBudW1iZXI7IH0pID0+IHByb2oucmVmdW5kZWRRdWFudGl0eSAhPSAwXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgcmVmdW5kZWRRdWFudGl0eTogYW55OyBxdWFudGl0eTogYW55OyB0b3RhbExpbmVQcmljZTogbnVtYmVyOyByZWZ1bmRlZFRvdGFsOiBudW1iZXI7IHRvdGFsOiBhbnk7IHJlZnVuZGVkOiBib29sZWFuOyBsaW5lUHJvbW90aW9uczogYW55OyBsaW5lRGlzY291bnQ6IGFueTsgfSkgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XHJcbiAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcclxuICAgICAgICAvLyB1cGRhdGluZyB0b3RhbCBsaW5lIHByaWNlIHdpdGggYWN0dWFsIHByaWNlIHRvIGJlIHJlZnVuZGVkIGluY2x1ZGluZyB0aGUgcmVmdW5kaW5nIHF0eVxyXG4gICAgICAgIHByb2R1Y3QudG90YWxMaW5lUHJpY2UgPSBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwpO1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgICAgIGlmIChwcm9kdWN0LnF1YW50aXR5ID09PSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcclxuICAgICAgICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvL1VwZGF0aW5nIGxpbmUgcHJvbW90aW9ucyBhbmQgbGluZSBkaXNjb3VudHMgICAgICBcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMgJiYgIXByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVQcm9tb3Rpb24ucHVzaChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCAmJiAhcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZURpc2NvdW50LnB1c2gocHJvZHVjdC5saW5lRGlzY291bnQpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogY3VycmVudCB0cmFuc2FjdGlvbiBkZXRhaWxzIGFmdGVyIHJlbW92aW5nIG9sZCBwcm9kdWN0c1wiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyk7XHJcblxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5wdXNoKC4uLmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KTtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkgPSB7fSBhcyBCYXNrZXRTdW1tYXJ5O1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVTYWxlVG90YWwodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyA9IGJhc2tldC5xdWFudGl0eTtcclxuXHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbDtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLnVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNSZWZ1bmRUb3RhbCgpO1xyXG4gICAgLy8gRm9yIHBhcnRpYWwgcmVmdW5kIGRpc2NvdW50IGlzIHVwZGF0aWVkIGluIHRvdGFsIGxpbmUgcHJpY2Ugc28gZGlzY291bnRUb3RhbCB3aWxsIGFsd2F5cyBiZSB6ZXJvICYgaW4gY2FzZSBvZiBleGNoYW5nZSBkaXNjb3VudCB0b3RhbCBpcyBjYWxjdWxhdGVkXHJcblxyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzRGlzY291bnRUb3RhbCgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBkaXNjb3VudFRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50OiB7IGRpc2NvdW50QW1vdW50OiBudW1iZXI7IH0pID0+IHtcclxuICAgICAgICAgIGRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDp0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gVGF4IFRvdGFsXHJcbiAqIEByZXR1cm5zIFRheCBUb3RhbFxyXG4gKi9cclxuXHJcbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1RheEJyZWFrZG93bihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBsZXQgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID0gMDtcclxuICAgIGxldCB0YXhCcmVha2Rvd246IFRheEJyZWFrZG93biA9IHtcclxuICAgICAgdGF4TGluZXM6IFtdLFxyXG4gICAgICB0b3RhbFRheGFibGVBbW91bnQ6IDAsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50OiB7IGRpc2NvdW50QW1vdW50OiBudW1iZXI7IH0pID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgaXRlbUxpbmVJZDogYW55OyBzZWxlY3RlZFZBVDogYW55OyBzZWxlY3RlZFZBVENvZGU6IGFueTsgdG90YWw6IGFueTsgcmVmdW5kZWRRdWFudGl0eTogbnVtYmVyOyBpdGVtRGlzY291bnRzOiB7IGN1cnJlbnRSZWZ1bmRQb3J0aW9uOiBudW1iZXI7IHRybkRpc2NvdW50c1BvcnRpb246IG51bWJlcjsgdHJuUHJvbW90aW9uc1BvcnRpb246IG51bWJlcjsgfTsgfSkgPT4ge1xyXG4gICAgICAgIGxldCB0YXhMaW5lOiBUYXhMaW5lID0ge1xyXG4gICAgICAgICAgaXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgICAgVkFUOiBwcm9kdWN0LnNlbGVjdGVkVkFUID8gcHJvZHVjdC5zZWxlY3RlZFZBVCA6IDAsXHJcbiAgICAgICAgICBWQVRDb2RlOiBwcm9kdWN0LnNlbGVjdGVkVkFUQ29kZSxcclxuICAgICAgICAgIHRheExpbmVUb3RhbDogMCxcclxuICAgICAgICAgIHRheGFibGVBbW91bnQ6IHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgICBQcmVUYXg6IDBcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJQcm9kdWN0IGNvbnRyaWJ1dGlvbiA6IGl0ZW0gbGluZSBJRCA6Y3VycmVudCB0cmFuc2FjdGlvbiBEZXRhaWxzXCIsXHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1MaW5lSWQsIFwidGF4IGxpbmUgOlwiLCBKU09OLnN0cmluZ2lmeSh0YXhMaW5lKSwgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCkpO1xyXG5cclxuICAgICAgICAvL3N0ZXAgMVxyXG4gICAgICAgIC8vIGlmIFRyYW5zYWN0aW9uIERpc2NvdW50IGFuZC9vciBwcm9tb3Rpb24gYXBwbGllZCwgZmluZCBuZXQgc2VsbGluZyBwcmljZSBvZiBlYWNoIHByb2R1Y3QgYXMgdGF4YWJsZWFtb3VudFxyXG5cclxuICAgICAgICAvL0lmIHRyYW5zYWN0aW9uIGRpc2NvdW50L3Byb21vdGlvbiBpcyBhcHBsaWVkIHRheGFibGUgYW1vdW50IHNob3VsZCBiZSBkZWR1Y3RpbmcgdHJhbnNhY3Rpb24gcHJvbW90aW9uIGFuZCB0cmFuc2FjdGlvbiBkaXNhY291bnQgcG9ydGlvblxyXG4gICAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG5cclxuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IC1NYXRoLmFicyh0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMuY3VycmVudFJlZnVuZFBvcnRpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgPSB0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbiAtIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc3RlcCAyIC0gZmluZCBwcmUgdGF4XHJcbiAgICAgICAgdGF4TGluZS5QcmVUYXggPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMigodGF4TGluZS50YXhhYmxlQW1vdW50ICogMTAwKSAvICgxMDAgKyB0YXhMaW5lLlZBVCkpO1xyXG5cclxuICAgICAgICAvL3N0ZXAgMyAtIFVwZGF0ZSB0YXhicmVha2Rvd25cclxuICAgICAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ICs9IHRheExpbmUudGF4YWJsZUFtb3VudDtcclxuICAgICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhMaW5lLnRheGFibGVBbW91bnQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHN0ZXAgNCAtIHVwZGF0ZSB0YXggTGluZSB0b3RhbFxyXG4gICAgICAgIHRheExpbmUudGF4TGluZVRvdGFsID0gIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCAtIHRheExpbmUuUHJlVGF4KTtcclxuICAgICAgICB0YXhCcmVha2Rvd24udGF4TGluZXMucHVzaCh0YXhMaW5lKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duID0gdGF4QnJlYWtkb3duO1xyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93biAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duLnRheExpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcy5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyB0YXhMaW5lVG90YWwgfTogYW55KSA9PiBuICsgdGF4TGluZVRvdGFsLFxyXG4gICAgICAgIDBcclxuICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IDAuMDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJlQmFza2V0OmFmdGVyIGNhbGN1bGF0aW5nIHRheCBjdXJyZW50dHJhbnNhY3Rpb25EZXRhaWxzXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzVG90YWxUYXhTdW1tYXJ5KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICBcclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bikpO1xyXG5cclxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlBcnJheTogVG90YWxUYXhTdW1tYXJ5W10gPSBbXVxyXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRheCBMaW5lcyBmb3IgVG90YWwgVGF4IFN1bW1lcnkgOlwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMpKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgoZWxlbWVudDogeyBWQVRDb2RlOiBhbnk7IFZBVDogYW55OyBQcmVUYXg6IGFueTsgdGF4TGluZVRvdGFsOiBhbnk7IH0pID0+IHtcclxuICAgICAgbGV0IFRheFN1bW1hcnk6IFRvdGFsVGF4U3VtbWFyeSA9IHtcclxuICAgICAgICBWQVRDb2RlOlwiXCIsXHJcbiAgICAgICAgVkFUOiAtMTIzNDUsXHJcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxyXG4gICAgICAgIFRheFN1bTogMCxcclxuICAgICAgICBUWHJhdGVTdW06IDBcclxuICAgICAgfTtcclxuICAgICAgICBUYXhTdW1tYXJ5LlZBVENvZGU9ZWxlbWVudC5WQVRDb2RlO1xyXG4gICAgICAgIFRheFN1bW1hcnkuVkFUID0gZWxlbWVudC5WQVQ7ICAgICAgICBcclxuICAgICAgIFxyXG4gICAgICAgIFRheFN1bW1hcnkuUHJlVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC5QcmVUYXgpOyAgICAgICAgXHJcbiAgICAgICAgVGF4U3VtbWFyeS5UYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LnRheExpbmVUb3RhbCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgIFxyXG4gICAgICAgIHRvdGFsVGF4U3VtbWFyeUFycmF5LnB1c2goVGF4U3VtbWFyeSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgIFdpdGhvdXQgR3JvdXBlZCA6IFwiLCBKU09OLnN0cmluZ2lmeSh0b3RhbFRheFN1bW1hcnlBcnJheSkpO1xyXG4gICAgXHJcbiAgICB0b3RhbFRheFN1bW1hcnlHcm91cCA9IHRvdGFsVGF4U3VtbWFyeUFycmF5LnJlZHVjZSgocHJlcGFyZWRBcnJheTphbnksY3VycmVudE9iajphbnkpID0+IHtcclxuICAgICAgbGV0IGluZCA9IHByZXBhcmVkQXJyYXkuZmluZEluZGV4KCh4OiB7IFZBVDogYW55OyB9KSA9PiB4LlZBVCA9PT0gY3VycmVudE9iai5WQVQpO1xyXG4gICAgICBpZihpbmQgPT09IC0xKXtcclxuICAgICAgICBwcmVwYXJlZEFycmF5LnB1c2goY3VycmVudE9iailcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVRDb2RlID0gY3VycmVudE9iai5WQVRDb2RlO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVQgPSBjdXJyZW50T2JqLlZBVDtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uUHJlVGF4U3VtICs9IGN1cnJlbnRPYmouUHJlVGF4U3VtO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5UYXhTdW0gKz0gY3VycmVudE9iai5UYXhTdW07XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRYcmF0ZVN1bSArPSBjdXJyZW50T2JqLlRYcmF0ZVN1bTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJlcGFyZWRBcnJheTtcclxuICAgIH0sW10pXHJcbiAgICAvLyBsaXN0T2ZUYWdzLm1hcCh4ID0+IHVuaXF1ZS5maWx0ZXIoYSA9PiBhLmxhYmVsID09IHgubGFiZWwgJiYgYS5jb2xvciA9PSB4LmNvbG9yKS5sZW5ndGggPiAwID8gbnVsbCA6IHVuaXF1ZS5wdXNoKHgpKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsICBUYXggU3VtbWVyIEdyb3VwIDpcIiwgSlNPTi5zdHJpbmdpZnkodG90YWxUYXhTdW1tYXJ5R3JvdXApKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50b3RhbFRheFN1bW1hcnkgPSB0b3RhbFRheFN1bW1hcnlHcm91cDtcclxuICAgIHJldHVybiB0aGlzO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gRGlzb2N1bnQgVG90YWxcclxuICAgKiBAcmV0dXJucyBEaXNjb3VudCBUb3RhbFxyXG4gICAqL1xyXG4gIHVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNEaXNjb3VudFRvdGFsKCkge1xyXG4gICAgbGV0IHJlZnVuZFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5yZWZ1bmRUb3RhbCA/IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXIgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWw6IGRpc2NvdW50VG90YWxcIiwgcmVmdW5kVG90YWwsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsKTtcclxuICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPVxyXG4gICAgICBNYXRoLmFicyhcclxuICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCkgLVxyXG4gICAgICAgIChNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKSArIE1hdGguYWJzKHJlZnVuZFRvdGFsKSlcclxuICAgICAgKTtcclxuICAgIGNvbnNvbGUubG9nKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXIgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWw6IGRpc2NvdW50VG90YWxcIiwgZGlzY291bnRUb3RhbClcclxuICAgIHJldHVybiBOdW1iZXIoZGlzY291bnRUb3RhbC50b0ZpeGVkKDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogY3VycmVudCB0cmFuc2FjdGlvbiBSZWZ1bmQgVG90YWxcclxuICAqIEByZXR1cm5zIFJlZnVuZCBUb3RhbFxyXG4gICovXHJcbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1JlZnVuZFRvdGFsKCkge1xyXG4gICAgbGV0IHRvdGFsUmVmdW5kID0gMDtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgcHJvZHVjdDogUHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkge1xyXG4gICAgICAgIHRvdGFsUmVmdW5kID0gdG90YWxSZWZ1bmQgKyBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogdHJhbnNhY3Rpb24gU2VydmljZTogdG90YWxSZWZ1bmQgZm9yIEN1cnJlbnQgVHJhbnNhY3Rpb25EZXRhaWxzXCIgKyB0b3RhbFJlZnVuZClcclxuICAgIH1cclxuICAgIHJldHVybiB0b3RhbFJlZnVuZDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQmFza2V0cyBzdW1tYXJ5XHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBzdW1tYXJ5XHJcbiAgICovXHJcbiAgYmFza2V0U3VtbWFyeShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCk7XHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVTYWxlVG90YWwoXHJcbiAgICAgIGJhc2tldERldGFpbHNcclxuICAgICkpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLmdldFJlZnVuZFRvdGFsKCk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50IHx8XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvblxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWwgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0aGlzLnVwZGF0ZURpc2NvdW50VG90YWwoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zID0gYmFza2V0RGV0YWlscy5xdWFudGl0eTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgdGF4TGluZVRvdGFsIH06IGFueSkgPT4gbiArIHRheExpbmVUb3RhbCxcclxuICAgICAgICAwXHJcbiAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gMC4wMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiBiYXNrZXRzdW1tYXJ5IHVwZGF0ZWQgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnQ6IFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeSkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaW5lIERpc2NvdW50XHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBsaW5lIERpc2NvdW50XHJcbiAgICovXHJcbiAgbGluZURpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xyXG4gICAgICBpZiAoZWxlbWVudC5saW5lRGlzY291bnQpIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5wdXNoKGVsZW1lbnQubGluZURpc2NvdW50KTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAgIChhY2M6IGFueVtdLCB2YWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYWNjLmZpbmQoKGVsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4gZWwuaXRlbUxpbmVJZCA9PT0gdmFsLml0ZW1MaW5lSWQpKSB7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2godmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5pbmZvKFxyXG4gICAgICAvLyAgIFwiZS1iYXNrZXQgOmxpbmUgZGlzY291bnQgdXBkYXRlZCBpbiB0cmFuc2FjdGlvbiBkb2N1bWVudFwiLFxyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50XHJcbiAgICAgIC8vICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGV4Y2hhbmdlXHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBleGNoYW5nZSBcclxuICAgKi9cclxuICBleGNoYW5nZShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID0gYmFza2V0RGV0YWlscy5leGNoYW5nZSAmJiBiYXNrZXREZXRhaWxzLmV4Y2hhbmdlLmxlbmd0aCA+IDAgPyBbLi4uYmFza2V0RGV0YWlscy5leGNoYW5nZV0gOiBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG5cclxuICAgICAgY29uc3QgZWxlbWVudDogYW55ID0gYmFza2V0RGV0YWlscy5wcm9kdWN0c1tpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmV4Y2hhbmdlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGlzUHJlc2VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2Uuc29tZSgoZWw6IHsgZXhjaGFuZ2VJZDogYW55OyB9KSA9PiBlbC5leGNoYW5nZUlkID09PSBlbGVtZW50LmV4Y2hhbmdlLmV4Y2hhbmdlSWQpO1xyXG4gICAgICAgIGlmICghaXNQcmVzZW50KSB7XHJcbiAgICAgICAgICBsZXQgZXhjaGFuZ2VJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zW2pdO1xyXG4gICAgICAgICAgICBsZXQgbmV3SXRlbXM6IGFueSA9IHsgbGluZUl0ZW1JZDogaXRlbS5pdGVtTGluZUlkLCBRdWFudGl0eTogaXRlbS5xdWFudGl0eSB9XHJcbiAgICAgICAgICAgIGV4Y2hhbmdlSXRlbXMucHVzaChuZXdJdGVtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zID0gWy4uLmV4Y2hhbmdlSXRlbXNdO1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZS5wdXNoKGVsZW1lbnQuZXhjaGFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldCBleGNoYW5nZVwiLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2UpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGFkZCBwcmV2aW91cyBleGNoYW5nZSBkYXRhXHJcbiAgKiBAcGFyYW0gb3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50XHJcbiAgKiBAcmV0dXJucyBsaW5lIFByb21vdGlvbnNcclxuICAqL1xyXG4gIGFkZEV4Y2hhbmdlRGF0YShvcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQ6IFRyYW5zYWN0aW9uRG9jdW1lbnQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID0gb3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZSA/IFsuLi5vcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlXSA6IG51bGw7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGxpbmUgUHJvbW90aW9uc1xyXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXHJcbiAgICogQHJldHVybnMgbGluZSBQcm9tb3Rpb25zXHJcbiAgICovXHJcbiAgbGluZVByb21vdGlvbihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gYmFza2V0RGV0YWlscy5wcm9kdWN0c1tpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLnB1c2goXHJcbiAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYzogYW55W10sIHZhbDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFhY2MuZmluZCgoZWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICAgICAgICBhY2MucHVzaCh2YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgW11cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRyYW5zYWN0aW9uIFByb21vdGlvblxyXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXHJcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb24gUHJvbW90aW9uXHJcbiAgICovXHJcbiAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbjtcclxuICAgICAgLy8gICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5UcmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaChlbGVtZW50LmxpbmVQcm9tb3Rpb25zKVxyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9ucy5yZWR1Y2UoKGFjYywgdmFsKSA9PiB7XHJcbiAgICAgIC8vICAgICBpZiAoIWFjYy5maW5kKGVsID0+IGVsLml0ZW1MaW5lSWQgPT09IHZhbC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAvLyAgICAgICBhY2MucHVzaCh2YWwpO1xyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgICAgcmV0dXJuIGFjYztcclxuICAgICAgLy8gICB9LCBbXSk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXI6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGlmIChiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ID1cclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQ7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdHJhbnNhY3Rpb24gRGlzY291bnRcIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBheW1lbnRzIGRldGFpbHNcclxuICAgKiBAcGFyYW0gcGF5bWVudERldGFpbHNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHBheW1lbnREZXRhaWxzKHBheW1lbnREZXRhaWxzOiBhbnkpIHtcclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQgOiBwYXltZW50IGRldGFpbHMgYWZ0ZXIgdHJhbnNhY3Rpb24gY29tcGxldGVkXCIsSlNPTi5zdHJpbmdpZnkocGF5bWVudERldGFpbHMpKTtcclxuICAgIFxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzID0gcGF5bWVudERldGFpbHM7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBQYXltZW50cyBkZXRhaWxzXHJcbiAgICogQHBhcmFtIHBheW1lbnREZXRhaWxzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICAgc3BsaXRQYXltZW50KHNwbGl0UGF5bWVudDogYm9vbGVhbikgeyAgICBcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zcGxpdFBheW1lbnQgPSBzcGxpdFBheW1lbnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9IFxyXG5cclxuICAgLyoqXHJcbiAgICogUGF5bWVudHMgZGV0YWlsc1xyXG4gICAqIEBwYXJhbSBwYXltZW50RGV0YWlsc1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgICBpc1BheW1lbnRDb21wbGV0ZWQoaXNQYXltZW50Q29tcGxldGVkOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5pc1BheW1lbnRDb21wbGV0ZWQgPSBpc1BheW1lbnRDb21wbGV0ZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSBcclxuICBcclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBCYXNlcyBjdXJyZW5jeVxyXG4gICAqIEBwYXJhbSBjdXJyZW5jeVxyXG4gICAqIEByZXR1cm5zIGN1cnJlbmN5XHJcbiAgICovXHJcbiAgYmFzZUN1cnJlbmN5KGN1cnJlbmN5OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZ2lmdCBvcHRpb24gYXRcclxuICAqIEByZXR1cm5zIGF0XHJcbiAgKi9cclxuICBnaWZ0T3B0aW9uKGdpZnQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmdpZnRvcHRpb25cIixcclxuICAgICAgZ2lmdFxyXG4gICAgKTtcclxuICAgIGlmIChnaWZ0KSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5naWZ0ZWRSZWNlaXB0ID0gZ2lmdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuXHJcbi8qKlxyXG4gKiBtYW51YWwgRGlzY291bnRcclxuICogQHBhcmFtIGRpc2NvdW50RGF0YVxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuXHJcbiAgLy8gbWFudWFsRGlzY291bnQoZGlzY291bnREYXRhIDogYmFza2V0RGlzY291bnQpOlRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAvLyAgIGxldCBzYWxlVG90YWwgPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWw7XHJcbiAgLy8gICBpZihkaXNjb3VudERhdGEuZGlzY291bnRUeXBlID09J1BlcmNlbnQnKXtcclxuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSBzYWxlVG90YWwtKHNhbGVUb3RhbCooZGlzY291bnREYXRhLmRpc2NvdW50QW1vdW50LzEwMCkpO1xyXG4gIC8vICAgICBkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQgPSAtMSooc2FsZVRvdGFsLXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKTtcclxuICAvLyAgIH1lbHNlIHtcclxuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPXNhbGVUb3RhbC1kaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQ7XHJcbiAgLy8gICAgIGRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudCA9IC0xKmRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudDtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbkRpc2NvdW50LnB1c2goZGlzY291bnREYXRhKTtcclxuICAvLyAgIHJldHVybiB0aGlzO1xyXG5cclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR5cGVzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICAgKiBAcGFyYW0gdFxyXG4gICAqIEByZXR1cm5zIHR5cGVcclxuICAgKi9cclxuICB0eXBlKHQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID0gdDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVyYXRpb25zIHN0YXR1c1xyXG4gICAqIEBwYXJhbSBvXHJcbiAgICogQHJldHVybnMgc3RhdHVzXHJcbiAgICovXHJcbiAgb3BlcmF0aW9uU3RhdHVzKG86IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcGVyYXRpb25TdGF0dXMgPSBvO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZWQgYXRcclxuICAgKiBAcmV0dXJucyBhdFxyXG4gICAqL1xyXG4gIGNyZWF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXBkYXRlZEF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZWQgYXRcclxuICAgKiBAcmV0dXJucyBhdFxyXG4gICAqL1xyXG4gIHVwZGF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdHJhbnNzYWN0aW9uIGNvbXBsZXRpb24gYXRcclxuICAgKiBAcmV0dXJucyB0cmFuc2FjdGlvbiBjb21wbGV0aW9uIGRhdGVcclxuICAgKi9cclxuICB0cmFuc2FjdGlvbkNvbXBsZXRlZEF0KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zQ29tcGxldGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICAgKiBAcmV0dXJucyBidWlsZFxyXG4gICAqL1xyXG4gIGJ1aWxkKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbGVzIHRvdGFsIGluIHJlZnVuZFxyXG4gICAqIEBwYXJhbSBzYWxlVG90YWxcclxuICAgKiBAcmV0dXJucyB0b3RhbCBpbiByZWZ1bmRcclxuICAgKi9cclxuICBzYWxlVG90YWxJblJlZnVuZChzYWxlVG90YWw6IG51bWJlcik6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zYWxlVG90YWwgPSBzYWxlVG90YWw7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcclxuICAgKiBAcmV0dXJucyBiYXNrZXQgZGV0YWlsc1xyXG4gICAqL1xyXG4gIGdldEJhc2tldERldGFpbHMoKTogQmFza2V0IHtcclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQ6IEdldHRpbmcgQmFza2V0IGZvciB0cmFuc2FjdGlvbkRvY3VtZW50XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCkpO1xyXG5cclxuICAgIGxldCBiYXNrZXQ6IEJhc2tldCA9IHtcclxuICAgICAgc3Vic2lkaWFyeUlkIDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN1YnNpZGlhcnlJZCxcclxuICAgICAgdHJhbnNhY3Rpb25EaXNjb3VudDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LFxyXG4gICAgICB0cmFuc2FjdGlvblByb21vdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbixcclxuICAgICAgdHJhbnNhY3Rpb25JZDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zYWN0aW9uSWQsXHJcbiAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub2ZmbGluZVRyYW5zYWN0aW9uSWQsXHJcbiAgICAgIHRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCxcclxuICAgICAgYmFza2V0VG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsLFxyXG4gICAgICBkaXNjb3VudFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsLFxyXG4gICAgICBzYWxlVG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCxcclxuICAgICAgcmVmdW5kVG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsLFxyXG4gICAgICBxdWFudGl0eTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyxcclxuICAgICAgcHJvZHVjdHM6IFtdLFxyXG4gICAgICBiYXNlQ3VycmVuY3k6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgIGN1c3RvbWVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIsXHJcbiAgICB9O1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogeyBTS1U6IGFueTsgYmFyQ29kZTogYW55OyBiYXJjb2RlczogYW55OyBkZXNjcmlwdGlvbjogYW55OyBpbWFnZVVybHM6IGFueTsgdG90YWxMaW5lUHJpY2U6IGFueTsgaXRlbUxpbmVJZDogYW55OyBleGNsdWRlUHJvbW90aW9uOiBhbnk7IHByaWNlOiBhbnk7IHF1YW50aXR5OiBhbnk7IHNlbGVjdGVkUlJQUHJpY2U6IGFueTsgZnVsbGZpbG1lbnRJZDogYW55OyBmdWxsZmlsbWVudExvY2F0aW9uTmFtZTogYW55OyBkZWxpdmVyeUdyb3VwOiBzdHJpbmc7IGxlYWRUaW1lOiBhbnk7IGRlbGl2ZXJ5TWV0aG9kOiBhbnk7IGdpZnRDYXJkOiBhbnk7IGdpZnRDYXJkRXhwaXJ5RGF0ZTogYW55OyBnaWZ0Q2FyZE51bWJlcklzc3VlZDogYW55OyBnaWZ0Q2FyZFJlY2lwaWVudEVtYWlsOiBhbnk7IGdpZnRDYXJkUmVjaXBpZW50TmFtZTogYW55OyByZWZ1bmRlZFRvdGFsOiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgcmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjogYW55OyByZWZ1bmRlZFJlYXNvbjogYW55OyByZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHk6IGFueTsgaXNMYXN0RXhjaGFuZ2VkOiBhbnk7IH0sIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocHJvZHVjdCksIFwiZWJhc2tldDogYmFza2V0IGRldGFpbCB1cGRhdGUgaW4gYmFza2V0XCIpO1xyXG4gICAgICBjb25zdCBwID0ge30gYXMgYW55O1xyXG4gICAgICBwLlNLVSA9IHByb2R1Y3QuU0tVO1xyXG4gICAgICBwLmJhcmNvZGUgPSBwcm9kdWN0LmJhckNvZGU7XHJcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xyXG5cclxuICAgICAgcC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb247XHJcbiAgICAgIHAuaW1hZ2VVcmxzID0gcHJvZHVjdC5pbWFnZVVybHM7XHJcbiAgICAgIHAuY3VycmVuY3kgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5O1xyXG4gICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgcC5pdGVtTGluZUlkID0gTnVtYmVyKHByb2R1Y3QuaXRlbUxpbmVJZCk7XHJcbiAgICAgIHAuZXhjbHVkZVByb21vdGlvbiA9IHByb2R1Y3QuZXhjbHVkZVByb21vdGlvbjtcclxuXHJcbiAgICAgIHAuc2VsZWN0ZWRQcmljZSA9IHByb2R1Y3QucHJpY2U7XHJcbiAgICAgIHAucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICBwLnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xyXG5cclxuICAgICAgcC5mdWxsZmlsbWVudElkID0gcHJvZHVjdC5mdWxsZmlsbWVudElkO1xyXG4gICAgICBwLmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lID0gcHJvZHVjdC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZTtcclxuICAgICAgcC5kZWxpdmVyeUdyb3VwID0gcHJvZHVjdC5kZWxpdmVyeUdyb3VwIHx8IFwiMVwiO1xyXG4gICAgICBwLmxlYWRUaW1lID0gcHJvZHVjdC5sZWFkVGltZTtcclxuICAgICAgcC5kZWxpdmVyeU1ldGhvZCA9IHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgfHwgREVMSVZFUllfTUVUSE9EUy5DT0xMRUNUX0ZST01fU1RPUkUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGlmKHAuZnVsbGZpbG1lbnRJZCAhPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZClcclxuICAgICAge1xyXG4gICAgICAgIHAuaXNXZWJPcmRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcclxuICAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcclxuICAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XHJcbiAgICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcclxuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcclxuICAgICAgXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJlxyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQuZm9yRWFjaCgobGluZURpc2NvdW50OiB7IGl0ZW1MaW5lSWQ6IHsgdG9TdHJpbmc6ICgpID0+IGFueTsgfTsgZGlzY291bnRlZExpbmVQcmljZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgIHAubGluZURpc2NvdW50ID0gbGluZURpc2NvdW50O1xyXG4gICAgICAgICAgICBwLnRvdGFsID0gbGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gJiZcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IHByb21vdGlvbkxpbmVQcmljZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICBwLmxpbmVQcm9tb3Rpb25zID0gbGluZVByb21vdGlvbjtcclxuICAgICAgICAgICAgcC50b3RhbCA9IGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24gJiZcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5sZW5ndGggPiAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKHRheExpbmU6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBWQVQ6IGFueTsgVkFUQ29kZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkICYmIHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gdGF4TGluZS5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcclxuICAgICAgICAgICAgcC5zZWxlY3RlZFZBVCA9IHRheExpbmUuVkFUO1xyXG4gICAgICAgICAgICBwLnNlbGVjdGVkVkFUQ29kZSA9IHRheExpbmUuVkFUQ29kZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCkge1xyXG4gICAgICAgIHAudG90YWwgPSBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EIHx8IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHByb2R1Y3QucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcclxuICAgICAgICBwLnJlZnVuZGVkUmVhc29uID0gcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbjtcclxuICAgICAgICBpZiAoIXAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gcC5yZWZ1bmRlZFJlYXNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xyXG4gICAgICAgIHAucmVmdW5kUHJvbW90aW9uYWxRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5O1xyXG4gICAgICAgIHAucmVmdW5kZWRUb3RhbCA9IHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcclxuICAgICAgICBwLnRvdGFsIC09IE1hdGguYWJzKHAucmVmdW5kZWRUb3RhbCk7XHJcbiAgICAgICAgcC5pc0xhc3RFeGNoYW5nZWQgPSBwcm9kdWN0LmlzTGFzdEV4Y2hhbmdlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCkge1xyXG4gICAgICAgIGlmIChwLnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgcC50b3RhbCAqPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJhc2tldC5wcm9kdWN0cy5wdXNoKHApO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIGJhc2tldCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25EaXNjb3VudEFuZFRyYW5zYWN0aW9uUHJvbW90aW9uUG9ydGlvbihiYXNrZXQpO1xyXG4gICAgYmFza2V0LnRvdGFsID0gKGJhc2tldC5iYXNrZXRUb3RhbCB8fCAwKSArIHRoaXMuZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0KTtcclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCkge1xyXG4gICAgICBiYXNrZXQucXVhbnRpdHkgPSB0aGlzLmdldFJlZnVuZGVkVG90YWxXaXRoUXVhbnRpdHkoYmFza2V0KTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQ6IEJhc2tldCBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiLCBKU09OLnN0cmluZ2lmeShiYXNrZXQpKVxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcclxuICAgKiBAcmV0dXJucyByZWZ1bmQgYmFza2V0IGRldGFpbHNcclxuICAgKi9cclxuICAvLyBnZXRSZWZ1bmRCYXNrZXREZXRhaWxzKCk6IEJhc2tldCB7XHJcbiAgLy8gICBsZXQgYmFza2V0OiBCYXNrZXQgPSB7XHJcbiAgLy8gICAgIHN1YnNpZGlhcnlJZCA6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdWJzaWRpYXJ5SWQsXHJcbiAgLy8gICAgIHRyYW5zYWN0aW9uRGlzY291bnQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCxcclxuICAvLyAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24sXHJcbiAgLy8gICAgIHRyYW5zYWN0aW9uSWQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkLFxyXG4gIC8vICAgICB0b3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXHJcbiAgLy8gICAgIGJhc2tldFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCxcclxuICAvLyAgICAgZGlzY291bnRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCxcclxuICAvLyAgICAgc2FsZVRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwsXHJcbiAgLy8gICAgIHF1YW50aXR5OiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zLFxyXG4gIC8vICAgICBwcm9kdWN0czogW10sXHJcbiAgLy8gICAgIGJhc2VDdXJyZW5jeTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAvLyAgICAgY3VzdG9tZXI6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lcixcclxuICAvLyAgIH07XHJcblxyXG4gIC8vICAgYmFza2V0LnByb2R1Y3RzID0gW10gYXMgUHJvZHVjdFtdO1xyXG4gIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiB7IFNLVTogYW55OyBiYXJDb2RlOiBhbnk7IGJhcmNvZGVzOiBhbnk7IGRlc2NyaXB0aW9uOiBhbnk7IGltYWdlVXJsczogYW55OyB0b3RhbExpbmVQcmljZTogYW55OyBpdGVtTGluZUlkOiBhbnk7IGV4Y2x1ZGVQcm9tb3Rpb246IGFueTsgcHJpY2U6IG51bWJlcjsgcXVhbnRpdHk6IGFueTsgc2VsZWN0ZWRSUlBQcmljZTogYW55OyBmdWxsZmlsbWVudElkOiBhbnk7IGZ1bGxmaWxtZW50TG9jYXRpb25OYW1lOiBhbnk7IGRlbGl2ZXJ5R3JvdXA6IHN0cmluZzsgbGVhZFRpbWU6IGFueTsgZGVsaXZlcnlNZXRob2Q6IGFueTsgZ2lmdENhcmQ6IGFueTsgZ2lmdENhcmRFeHBpcnlEYXRlOiBhbnk7IGdpZnRDYXJkTnVtYmVySXNzdWVkOiBhbnk7IGdpZnRDYXJkUmVjaXBpZW50RW1haWw6IGFueTsgZ2lmdENhcmRSZWNpcGllbnROYW1lOiBhbnk7IGl0ZW1EaXNjb3VudHM6IGFueTsgcmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5OiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgcmVmdW5kZWQ6IGFueTsgaXNMYXN0RXhjaGFuZ2VkOiBhbnk7IGV4Y2hhbmdlOiBhbnk7IHJlZnVuZGVkVG90YWw6IG51bWJlcjsgfSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gIC8vICAgICBjb25zdCBwID0ge30gYXMgUHJvZHVjdDtcclxuICAvLyAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcclxuICAvLyAgICAgcC5iYXJjb2RlID0gcHJvZHVjdC5iYXJDb2RlO1xyXG4gIC8vICAgICBwLmJhcmNvZGVzID0gcHJvZHVjdC5iYXJjb2RlcztcclxuXHJcbiAgLy8gICAgIHAuZGVzY3JpcHRpb24gPSBwcm9kdWN0LmRlc2NyaXB0aW9uO1xyXG4gIC8vICAgICBwLmltYWdlVXJscyA9IHByb2R1Y3QuaW1hZ2VVcmxzO1xyXG4gIC8vICAgICBwLmN1cnJlbmN5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcclxuICAvLyAgICAgcC50b3RhbExpbmVQcmljZSA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgLy8gICAgIHAuaXRlbUxpbmVJZCA9IE51bWJlcihwcm9kdWN0Lml0ZW1MaW5lSWQpO1xyXG4gIC8vICAgICBwLmV4Y2x1ZGVQcm9tb3Rpb24gPSBwcm9kdWN0LmV4Y2x1ZGVQcm9tb3Rpb247XHJcblxyXG4gIC8vICAgICBwLnNlbGVjdGVkUHJpY2UgPSBwcm9kdWN0LnByaWNlO1xyXG4gIC8vICAgICBwLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAvLyAgICAgcC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgLy8gICAgIHAuc2VsZWN0ZWRSUlBQcmljZSA9IHByb2R1Y3Quc2VsZWN0ZWRSUlBQcmljZTtcclxuXHJcbiAgLy8gICAgIHAuZnVsbGZpbG1lbnRJZCA9IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDtcclxuICAvLyAgICAgcC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZSA9IHByb2R1Y3QuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU7XHJcbiAgLy8gICAgIHAuZGVsaXZlcnlHcm91cCA9IHByb2R1Y3QuZGVsaXZlcnlHcm91cCB8fCBcIjFcIjtcclxuICAvLyAgICAgcC5sZWFkVGltZSA9IHByb2R1Y3QubGVhZFRpbWU7XHJcbiAgLy8gICAgIHAuZGVsaXZlcnlNZXRob2QgPSBwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kIHx8IERFTElWRVJZX01FVEhPRFMuQ09MTEVDVF9GUk9NX1NUT1JFLnRvU3RyaW5nKCk7XHJcblxyXG4gIC8vICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcclxuICAvLyAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcclxuICAvLyAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XHJcbiAgLy8gICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcclxuICAvLyAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gIC8vICAgICBpZihwLmZ1bGxmaWxtZW50SWQgIT0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQpXHJcbiAgLy8gICAgIHtcclxuICAvLyAgICAgICBwLmlzV2ViT3JkZXIgPSB0cnVlO1xyXG4gIC8vICAgICB9XHJcbiAgICAgIFxyXG4gIC8vICAgICBpZiAocHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XHJcbiAgLy8gICAgICAgcC5pdGVtRGlzY291bnRzID0gcHJvZHVjdC5pdGVtRGlzY291bnRzIGFzIEl0ZW1EaXNjb3VudDtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgLy8gaWYoIXAuaXRlbURpc2NvdW50cyl7XHJcbiAgLy8gICAgIC8vICAgY29uc29sZS5sb2cocC5pdGVtRGlzY291bnRzKTtcclxuXHJcbiAgLy8gICAgIC8vICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb24oYmFza2V0KTtcclxuICAvLyAgICAgLy8gfVxyXG4gIC8vICAgICBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5IDogMDtcclxuXHJcbiAgLy8gICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcclxuICAvLyAgICAgICBwLnF1YW50aXR5ID0gcC5xdWFudGl0eSAtIHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcclxuICAvLyAgICAgICBwLnRvdGFsTGluZVByaWNlID0gKHAucXVhbnRpdHkgKiBwcm9kdWN0LnByaWNlKTtcclxuICAvLyAgICAgICBwLnRvdGFsID0gcC50b3RhbExpbmVQcmljZTtcclxuICAvLyAgICAgICAvLyBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eTtcclxuICAvLyAgICAgICBwLnJlZnVuZGVkID0gcHJvZHVjdC5yZWZ1bmRlZDtcclxuICAvLyAgICAgICBwLmlzTGFzdEV4Y2hhbmdlZCA9IHByb2R1Y3QuaXNMYXN0RXhjaGFuZ2VkO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmIChwcm9kdWN0LmV4Y2hhbmdlKSB7XHJcbiAgLy8gICAgICAgcC5leGNoYW5nZSA9IHByb2R1Y3QuZXhjaGFuZ2U7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJlxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcblxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZvckVhY2goKGxpbmVEaXNjb3VudDogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IGRpc2NvdW50ZWRMaW5lUHJpY2U6IGFueTsgfSkgPT4ge1xyXG5cclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IE9iamVjdC5hc3NpZ24oe30sIGxpbmVEaXNjb3VudCk7XHJcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgPSBwLmxpbmVEaXNjb3VudC51bml0UHJpY2UgKiBwLnF1YW50aXR5XHJcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ID0gcC50b3RhbCAtIHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2VcclxuICAvLyAgICAgICAgICAgcC50b3RhbCA9IHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgLy8gICAgICAgICB9IGVsc2UgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IGxpbmVEaXNjb3VudDtcclxuICAvLyAgICAgICAgICAgcC50b3RhbCA9IGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gJiZcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxyXG4gIC8vICAgICApIHtcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IHJlZnVuZGVkOiBhbnk7IH0pID0+IHtcclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpICYmICFsaW5lUHJvbW90aW9uLnJlZnVuZGVkKSB7XHJcbiAgLy8gICAgICAgICAgIHAubGluZVByb21vdGlvbnMgPSBsaW5lUHJvbW90aW9uO1xyXG4gIC8vICAgICAgICAgICBwLnRvdGFsID0gcC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgLy8gICAgICAgICAgIHAudG90YWwgPSBwLnRvdGFsIC0gKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkgOiAwKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gMDtcclxuICAvLyAgICAgcC5yZWZ1bmRlZFRvdGFsID0gMDtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93biAmJlxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgodGF4TGluZTogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IFZBVDogYW55OyBWQVRDb2RlOiBhbnk7IH0pID0+IHtcclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IHRheExpbmUuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XHJcbiAgLy8gICAgICAgICAgIHAuc2VsZWN0ZWRWQVQgPSB0YXhMaW5lLlZBVDtcclxuICAvLyAgICAgICAgICAgcC5zZWxlY3RlZFZBVENvZGUgPSB0YXhMaW5lLlZBVENvZGU7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChwLnF1YW50aXR5ID4gMCkge1xyXG4gIC8vICAgICAgIGJhc2tldC5wcm9kdWN0cy5wdXNoKHApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIC8vIHByb2R1Y3QuaXRlbURpc2NvdW50c1xyXG4gIC8vICAgaWYgKCFiYXNrZXQucHJvZHVjdHNbMF0uaGFzT3duUHJvcGVydHkoJ2l0ZW1EaXNjb3VudHMnKSkge1xyXG4gIC8vICAgICBiYXNrZXQgPSB0aGlzLmdldFRyYW5zYWN0aW9uRGlzY291bnRBbmRUcmFuc2FjdGlvblByb21vdGlvblBvcnRpb24oYmFza2V0KTtcclxuXHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgIDpuZXcgY3JlYXRlZCByZWZ1bmRlZCBiYXNrZXRcIiwgSlNPTi5zdHJpbmdpZnkoYmFza2V0KSlcclxuICAvLyAgIGJhc2tldC5xdWFudGl0eSA9IGJhc2tldC5wcm9kdWN0cy5yZWR1Y2UoXHJcbiAgLy8gICAgIChuOiBhbnksIHsgcXVhbnRpdHkgfTogYW55KSA9PiBuICsgcXVhbnRpdHksXHJcbiAgLy8gICAgIDBcclxuICAvLyAgICk7XHJcbiAgLy8gICBiYXNrZXQudG90YWwgPSB0aGlzLmdldFRvdGFsV2l0aExpbmVEaXNjb3VudEFuZExpbmVQcm9tb3Rpb25BcHBsaWVkKGJhc2tldCk7XHJcbiAgLy8gICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQudG90YWw7XHJcbiAgLy8gICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSB0aGlzLmdldFRvdGFsRGlzY291bnRXaXRoVHJhbnNhY3Rpb25EaXNjb3VudHNBbmRQcm9tb3Rpb25zKGJhc2tldCk7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgXCJlYmFza2V0IDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgOiB1cGRhdGUgQmFza2V0IFRvdGFsOiBhZnRlciBwcm9tb3Rpb24gOmJhc2tldFRvdGFsXCIsXHJcbiAgLy8gICAgIGJhc2tldC5iYXNrZXRUb3RhbFxyXG4gIC8vICAgKTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgXCJlOmJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgOiBiYXNrZXREZXRhaWxzIHVwZGF0ZWQgdmFsdWVzXCIsXHJcbiAgLy8gICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldClcclxuICAvLyAgICk7XHJcbiAgLy8gICByZXR1cm4gYmFza2V0O1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIGdldFRyYW5zYWN0aW9uRGlzY291bnRBbmRUcmFuc2FjdGlvblByb21vdGlvblBvcnRpb24oYmFza2V0OmFueSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxyXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgaXRlbUxpbmVJZHM6IGFueTsgfSkgPT4ge1xyXG4gICAgICAgIGlmICghZGlzY291bnQuaXRlbUxpbmVJZHMpIHtcclxuICAgICAgICAgIGRpc2NvdW50Lml0ZW1MaW5lSWRzID0gYmFza2V0LnByb2R1Y3RzLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJhc2tldCA9IHRoaXMuYmFza2V0U2VydmljZS50cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgZGlzY291bnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHRQcm9tb3Rpb246IHsgaXRlbUxpbmVJZHM6IGFueTsgfSkgPT4ge1xyXG4gICAgICAgIGlmICghdFByb21vdGlvbi5pdGVtTGluZUlkcykge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gYmFza2V0LnByb2R1Y3RzLmZpbHRlcihcclxuICAgICAgICAgICAgKGl0ZW06IHsgZXhjbHVkZVByb21vdGlvbjogYm9vbGVhbjsgfSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmV4Y2x1ZGVQcm9tb3Rpb24gPT09IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0UHJvbW90aW9uLml0ZW1MaW5lSWRzID1cclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5pdGVtTGluZUlkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiYXNrZXQgPSB0aGlzLmJhc2tldFNlcnZpY2UudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoYmFza2V0LCB0UHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG5cclxuICBnZXRUb3RhbERpc2NvdW50V2l0aFRyYW5zYWN0aW9uRGlzY291bnRzQW5kUHJvbW90aW9ucyhiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuXHJcbiAgICBsZXQgZGlzY291bnRUb3RhbCA9IDA7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgZGlzY291bnRUb3RhbCArPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAgICkge1xyXG5cclxuICAgICAgZGlzY291bnRUb3RhbCArPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgZGlzY291bnRBbW91bnQgfTogYW55KSA9PiBuICsgZGlzY291bnRBbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciA6IFRyYW5zYWN0aW9uIGRpc2NvdW50IFRvdGFsOlwiLCBkaXNjb3VudFRvdGFsKTtcclxuXHJcbiAgICByZXR1cm4gZGlzY291bnRUb3RhbDtcclxuICB9XHJcblxyXG5cclxuICBhcHBlbmRDdXJyZW5jeVN5bWJvbChjdXJyZW5jeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgdmFsdWU9dGhpcy5kZWNpbWFscGlwZS50cmFuc2Zvcm0odmFsdWUsJzEuMicpO1xyXG4gICAgaWYgKHZhbHVlID49IDApIHtcclxuICAgICAgY29uc3QgcmV0dXJudmFsID0gY3VycmVuY3kgKyB2YWx1ZTtcclxuICAgICAgY29uc29sZS5sb2cocmV0dXJudmFsLCBcImViYXNrZXQ6IGFkZCBjdXJyZW5jeSB3aXRoIHZhbHVlXCIpO1xyXG4gICAgICByZXR1cm4gcmV0dXJudmFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmV0dXJudmFsID0gXCItXCIgKyAoY3VycmVuY3kgKyB2YWx1ZSAqIC0xKTtcclxuICAgICAgY29uc29sZS5sb2cocmV0dXJudmFsLCBcIi0oY3VycmVuY3krKHZhbHVlKi0xKSlcIik7XHJcbiAgICAgIHJldHVybiByZXR1cm52YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBVcGRhdGVzIHRvdGFsIHJlZnVuZFxyXG4gIC8vICAqIEByZXR1cm5zIHRvdGFsIHJlZnVuZFxyXG4gIC8vICAqL1xyXG4gIC8vIHVwZGF0ZVRvdGFsUmVmdW5kKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xyXG4gIC8vICAgICBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gIC8vICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlICogLTE7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFxyXG4gIC8vICAgICAgIFwiZWJhc2tldDogVHJhbnNhY3Rpb24gcHJpY2Ugb3ZlcnJpZGUgOlwiLFxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50XHJcbiAgLy8gICAgICk7XHJcblxyXG4gIC8vICAgICBpZiAoXHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uICYmXHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb24pID0+IHtcclxuICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gIC8vICAgICAgICAgICBcIlByb21vdGlvbjogYmFza2V0IGxpbmVQcm9tb3Rpb24gOiBcIixcclxuICAvLyAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uXHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgIFwibGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIixcclxuICAvLyAgICAgICAgICAgbGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgICAgICAgXCJjb25kaXRpb24gOiBcIiArXHJcbiAgLy8gICAgICAgICAgIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpKVxyXG4gIC8vICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gIC8vICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPVxyXG4gIC8vICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlICogLTE7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH0gZWxzZVxyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXHJcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgLy8gICAgICAgKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQpID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJwcm9kdWN0Lml0ZW1MaW5lSWQgOiBcIiArXHJcbiAgLy8gICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcclxuICAvLyAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpIDogXCIgK1xyXG4gIC8vICAgICAgICAgICAgIGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAvLyAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJjb25kaXRpb24gOiBcIiArXHJcbiAgLy8gICAgICAgICAgICAgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSlcclxuICAvLyAgICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcclxuICAvLyAgICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBsaW5lRGlzY291bnQudW5pdFByaWNlICogcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICogLTE7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH1cclxuXHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFwiUHJvZHVjdCBkZXNjcmlwdGlvbiA6XCIgKyBwcm9kdWN0LmRlc2NyaXB0aW9uKTtcclxuICAvLyAgICAgY29uc29sZS5sb2coXCJQcm9kdWN0IHRvdGFsIDpcIiArIHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XHJcbiAgLy8gICAgIC8vIHByb2R1Y3QuZGlzcGxheXJlZnVuZGVkYW1vdW50PXRoaXMuYXBwZW5kQ3VycmVuY3lTeW1ib2woQ1VSUkVOQ1lbdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeV0scHJvZHVjdC5yZWZ1bmRlZFRvdGFsKTtcclxuICAvLyAgICAgLy8gY29uc29sZS5sb2cocHJvZHVjdC5kaXNwbGF5cmVmdW5kZWRhbW91bnQsXCJkaXNwbGF5cmVmdW5kZWRhbW91bnRcIik7XHJcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gICBjb25zdCBiYXNrZXR0b3RhbCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5YmFza2V0dG90YWw9dGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgYmFza2V0dG90YWwpO1xyXG4gIC8vICAgY29uc3Qgc2FsZXRvdGFsID0gKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5c2FsZXRvdGFsID0gdGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgc2FsZXRvdGFsKTtcclxuICAvLyAgICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICByZXR1cm4gdGhpcztcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbGUgVG90YWxcclxuICAgKiBAcGFyYW0gYmFza2V0RGV0YWlsc1xyXG4gICAqIEByZXR1cm5zIFNhbGUgVG90YWxcclxuICAgKi9cclxuICB1cGRhdGVTYWxlVG90YWwoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55W107IH0pIHtcclxuICAgIGNvbnN0IHNhbGVUb3RhbCA9IGJhc2tldERldGFpbHMucHJvZHVjdHMucmVkdWNlKFxyXG4gICAgICAobjogYW55LCB7IHRvdGFsTGluZVByaWNlIH06IGFueSkgPT4gbiArIHRvdGFsTGluZVByaWNlLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHNhbGVUb3RhbFxyXG4gIH1cclxuXHJcbiAgZ2V0VG90YWxXaXRoTGluZURpc2NvdW50QW5kTGluZVByb21vdGlvbkFwcGxpZWQoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55OyB9KTogbnVtYmVyIHtcclxuICAgIGxldCBzYWxldG90YWw6IG51bWJlciA9IDAuMDtcclxuICAgIGZvciAobGV0IHByb2R1Y3Qgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xyXG4gICAgICAvLyBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAvLyAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgLy8gfSBlbHNlIGlmIChcclxuICAgICAgLy8gICBwcm9kdWN0LmxpbmVEaXNjb3VudCAmJlxyXG4gICAgICAvLyAgICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zXHJcbiAgICAgIC8vICkge1xyXG4gICAgICAvLyAgIHNhbGV0b3RhbCArPVxyXG4gICAgICAvLyAgICAgcHJvZHVjdC5xdWFudGl0eSAqIE51bWJlcihwcm9kdWN0LmxpbmVEaXNjb3VudC51bml0UHJpY2UudG9GaXhlZCgyKSk7XHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgc2FsZXRvdGFsICs9XHJcbiAgICAgIC8vICAgICBwcm9kdWN0LnF1YW50aXR5ICogTnVtYmVyKHByb2R1Y3Quc2VsZWN0ZWRQcmljZS50b0ZpeGVkKDIpKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBzYWxldG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDp1cGRhdGUgcHJvZHVjdCBUb3RhbDpcIiArIHNhbGV0b3RhbCxcclxuICAgICAgICBKU09OLnN0cmluZ2lmeShwcm9kdWN0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhbGV0b3RhbDtcclxuICB9XHJcblxyXG4gIGdldFJlZnVuZGVkVG90YWxXaXRoUXVhbnRpdHkoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogc3RyaW5nIHwgYW55W107IH0pOiBudW1iZXIge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBwcm9kdWN0OiBhbnkgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcclxuXHJcbiAgICAgIGlmICghcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uKSB7XHJcblxyXG4gICAgICAgIHF1YW50aXR5ID0gcXVhbnRpdHkgKyBwcm9kdWN0LnF1YW50aXR5O1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBxdWFudGl0eSA9IHF1YW50aXR5ICsgKHByb2R1Y3QucXVhbnRpdHkgLSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBiYXNrZXREZXRhaWxzLnRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbCArIHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBxdWFudGl0eTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNjb3VudCBUb3RhbFxyXG4gICAqIEByZXR1cm5zIERpc2NvdW50IFRvdGFsXHJcbiAgICovXHJcbiAgdXBkYXRlRGlzY291bnRUb3RhbCgpIHtcclxuICAgIGxldCByZWZ1bmRUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xyXG4gICAgY29uc29sZS5pbmZvKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXI6IHJlZnVuZFRvdGFsXCIsIEpTT04uc3RyaW5naWZ5KHJlZnVuZFRvdGFsKSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkpKTtcclxuICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPVxyXG4gICAgICBNYXRoLmFicyhcclxuICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpIC1cclxuICAgICAgICAoXHJcbiAgICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCkgKyBNYXRoLmFicyhyZWZ1bmRUb3RhbClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICBjb25zb2xlLmxvZyhcImUtYmFza2V0OiB0cmFuc2FjdGlvbiBidWlsZGVyOiBkaXNjb3VudFRvdGFsXCIsIEpTT04uc3RyaW5naWZ5KGRpc2NvdW50VG90YWwpKVxyXG4gICAgcmV0dXJuIE51bWJlcihkaXNjb3VudFRvdGFsLnRvRml4ZWQoMikpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUmVhc29uQ29kZShyZWFzb25Db2RlOiB7XHJcbiAgICBjb2RlOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgfSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5yZWFzb25Db2RlID0gcmVhc29uQ29kZS5jb2RlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnJlYXNvbkRlc2NyaXB0aW9uID0gcmVhc29uQ29kZS5uYW1lO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVNYW5hZ2VyT3ZlcnJpZGUoXHJcbiAgICB1c2Vyb3ZlcnJpZGU6IFVzZXJPdmVycmlkZVxyXG4gICk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vdmVycmlkZSA9IHVzZXJvdmVycmlkZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVXNlcklEKFxyXG4gICAgdXNlcklEOiBzdHJpbmdcclxuICApOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlcklkID0gdXNlcklEO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2VyTmFtZShuYW1lOiBhbnkpIDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lID0gbmFtZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgYWRkQ3VzdG9tZXJEZXRhaWxzKGN1c3RvbWVyRGV0YWlsOiBDdXN0b21lcik6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lciA9IGN1c3RvbWVyRGV0YWlsO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUYXhCcmVha2Rvd24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgLy8gbGV0IHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCA9IDA7XHJcbiAgICBsZXQgdGF4QnJlYWtkb3duOiBUYXhCcmVha2Rvd24gPSB7XHJcbiAgICAgIHRheExpbmVzOiBbXSxcclxuICAgICAgdG90YWxUYXhhYmxlQW1vdW50OiAwLFxyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50KSA9PiB7XHJcbiAgICAvLyAgICAgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsICs9IGRpc2NvdW50LmRpc2NvdW50QW1vdW50O1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKFxyXG4gICAgLy8gICAgIChwcm9tb3Rpb24pID0+IHtcclxuICAgIC8vICAgICAgIHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCArPSBwcm9tb3Rpb24ucHJvbW90aW9uQW1vdW50O1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgdGF4TGluZTogVGF4TGluZSA9IHtcclxuICAgICAgICBpdGVtTGluZUlkOiBwcm9kdWN0Lml0ZW1MaW5lSWQsXHJcbiAgICAgICAgVkFUOiBwcm9kdWN0LnNlbGVjdGVkVkFUID8gcHJvZHVjdC5zZWxlY3RlZFZBVCA6IDAsXHJcbiAgICAgICAgVkFUQ29kZTogcHJvZHVjdC5zZWxlY3RlZFZBVENvZGUsXHJcbiAgICAgICAgdGF4TGluZVRvdGFsOiAwLFxyXG4gICAgICAgIHRheGFibGVBbW91bnQ6IHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgUHJlVGF4OiAwXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2R1Y3QgY29udHJpYnV0aW9uIDogaXRlbSBsaW5lIElEIDpcIiwgcHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgIFwidGF4IGxpbmUgOlwiLCBKU09OLnN0cmluZ2lmeSh0YXhMaW5lKSk7XHJcblxyXG4gICAgICAvLyBzdGVwIDFcclxuICAgICAgLy8gaWYgVHJhbnNhY3Rpb24gRGlzY291bnQgYW5kL29yIHByb21vdGlvbiBhcHBsaWVkLCBmaW5kIG5ldCBzZWxsaW5nIHByaWNlIG9mIGVhY2ggcHJvZHVjdCBhcyB0YXhhYmxlYW1vdW50XHJcbiAgICAgIC8vIGlmICh0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgPiAwKSB7XHJcbiAgICAgIHByb2R1Y3QgPSB0aGlzLmJhc2tldFNlcnZpY2UudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uICtcclxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gLVxyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uO1xyXG4gICAgICAvLyAgdHArdGQtcnA7XHJcblxyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9kdWN0IGNvbnRyaWJ1dGlvbiA6IGl0ZW0gbGluZSBJRCA6XCIsIHByb2R1Y3QuaXRlbUxpbmVJZCxcclxuICAgICAgICBcImNvbnRyaWJ1dGlvbiA6XCIsIEpTT04uc3RyaW5naWZ5KHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XHJcbiAgICAgIC8vIGNhbGN1bGF0ZSBuZXQgc2VsbGluZyBwcmljZSBhZnRlciBhcHBseWluZyB0cmFuc2FjdGlvbiBkaXNjb3VudCBhcyBwZXIgcHJvZHVjdCBjb250cmlidXRpb25cclxuICAgICAgdGF4TGluZS50YXhhYmxlQW1vdW50IC09IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvL3N0ZXAgMiAtIGZpbmQgcHJlIHRheFxyXG4gICAgICB0YXhMaW5lLlByZVRheCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKCh0YXhMaW5lLnRheGFibGVBbW91bnQgKiAxMDApIC8gKDEwMCArIHRheExpbmUuVkFUKSk7XHJcblxyXG4gICAgICAvL3N0ZXAgMyAtIFVwZGF0ZSB0YXhicmVha2Rvd25cclxuICAgICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCArPSB0YXhMaW5lLnRheGFibGVBbW91bnQ7XHJcbiAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBzdGVwIDQgLSB1cGRhdGUgdGF4IExpbmUgdG90YWxcclxuICAgICAgdGF4TGluZS50YXhMaW5lVG90YWwgPSAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4TGluZS50YXhhYmxlQW1vdW50IC0gdGF4TGluZS5QcmVUYXgpO1xyXG4gICAgICB0YXhCcmVha2Rvd24udGF4TGluZXMucHVzaCh0YXhMaW5lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50KTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duID0gdGF4QnJlYWtkb3duO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUb3RhbFRheFN1bW1hcnkoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duKSk7XHJcblxyXG5cclxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlBcnJheTogVG90YWxUYXhTdW1tYXJ5W10gPSBbXVxyXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRheCBMaW5lcyBmb3IgVG90YWwgVGF4IFN1bW1lcnkgOlwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcykpO1xyXG5cclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiB7IFZBVENvZGU6IGFueTsgVkFUOiBhbnk7IFByZVRheDogYW55OyB0YXhMaW5lVG90YWw6IGFueTsgfSkgPT4ge1xyXG4gICAgICBsZXQgVGF4U3VtbWFyeTogVG90YWxUYXhTdW1tYXJ5ID0ge1xyXG4gICAgICAgIFZBVENvZGU6IFwiXCIsXHJcbiAgICAgICAgVkFUOiAtMTIzNDUsXHJcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxyXG4gICAgICAgIFRheFN1bTogMCxcclxuICAgICAgICBUWHJhdGVTdW06IDBcclxuICBcclxuICAgICAgfTtcclxuICAgICAgIFRheFN1bW1hcnkuVkFUQ29kZSA9IGVsZW1lbnQuVkFUQ29kZTtcclxuICAgICAgICBUYXhTdW1tYXJ5LlZBVCA9IGVsZW1lbnQuVkFUOyAgICAgICAgXHJcbiAgICAgICAgVGF4U3VtbWFyeS5QcmVUYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LlByZVRheCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LnRheExpbmVUb3RhbCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgICBcclxuICAgICAgICB0b3RhbFRheFN1bW1hcnlBcnJheS5wdXNoKFRheFN1bW1hcnkpO1xyXG4gICAgfSlcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsIFRheCBTdW1tZXJ5ICBXaXRob3V0IEdyb3VwZWQgOiBcIiwgSlNPTi5zdHJpbmdpZnkodG90YWxUYXhTdW1tYXJ5QXJyYXkpKTtcclxuICAgIFxyXG4gICAgdG90YWxUYXhTdW1tYXJ5R3JvdXAgPSB0b3RhbFRheFN1bW1hcnlBcnJheS5yZWR1Y2UoKHByZXBhcmVkQXJyYXk6YW55LGN1cnJlbnRPYmopID0+IHtcclxuXHJcbiAgICAgIGxldCBpbmQgPSBwcmVwYXJlZEFycmF5LmZpbmRJbmRleCgoeDogeyBWQVQ6IGFueTsgfSkgPT4geC5WQVQgPT09IGN1cnJlbnRPYmouVkFUKTtcclxuICAgICAgaWYoaW5kID09PSAtMSl7XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheS5wdXNoKGN1cnJlbnRPYmopXHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUQ29kZSA9IGN1cnJlbnRPYmouVkFUQ29kZTtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUID0gY3VycmVudE9iai5WQVQ7XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlByZVRheFN1bSArPSBjdXJyZW50T2JqLlByZVRheFN1bTtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVGF4U3VtICs9IGN1cnJlbnRPYmouVGF4U3VtO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5UWHJhdGVTdW0gKz0gY3VycmVudE9iai5UWHJhdGVTdW07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByZXBhcmVkQXJyYXk7XHJcbiAgICB9LFtdKVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsICBUYXggU3VtbWVyIEdyb3VwIDpcIix0b3RhbFRheFN1bW1hcnlHcm91cCk7XHJcblxyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudG90YWxUYXhTdW1tYXJ5ID0gdG90YWxUYXhTdW1tYXJ5R3JvdXA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9uSWRcclxuICAgKiBAcmV0dXJucyBPcmlnaW5hbFRyYW5zYWN0aW9uSWRcclxuICAgKi9cclxuICBhZGRPcmlnaW5hbFRyYW5zSWQodHJhbkRvYzpUcmFuc2FjdGlvbkRvY3VtZW50KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX0VYQ0hBTkdFKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcmlnaW5hbFRyYW5zSWQgPSB0cmFuRG9jLnRyYW5zYWN0aW9uSWQ7XHJcbiAgICAgIGlmKHRyYW5Eb2MuYXBpUmVzcG9uc2UgJiYgdHJhbkRvYy5hcGlSZXNwb25zZS5pbnRlcm5hbElkKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9yaWdpbmFsRXh0ZXJuYWxJZCA9IHRyYW5Eb2MuYXBpUmVzcG9uc2UuaW50ZXJuYWxJZC50b1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHVucmVmZXJlbmNlZCBSZWZ1bmRcclxuICAgKiBAcmV0dXJucyBib29sZWFuIHZhbHVlXHJcbiAgICovXHJcbiAgYWRkVW5yZWZlcmVuY2VkUmVmdW5kKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZ1bmRUb3RhbCgpIHtcclxuICAgIGxldCB0b3RhbFJlZnVuZCA9IDA7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgcHJvZHVjdDogVFByb2R1Y3QgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzW2luZGV4XTtcclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkge1xyXG4gICAgICAgIHRvdGFsUmVmdW5kID0gdG90YWxSZWZ1bmQgKyBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogdHJhbnNhY3Rpb24gU2VydmljZTogdG90YWxSZWZ1bmRcIiArIHRvdGFsUmVmdW5kKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsUmVmdW5kO1xyXG4gIH1cclxuXHJcbiAgZG9jSWQoZG9jSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmlkID0gZG9jSWQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbn1cclxuIl19
|