@pmcretail/mapper-library 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/bundles/pmcretail-mapper-library.umd.js +6133 -0
  3. package/bundles/pmcretail-mapper-library.umd.js.map +1 -0
  4. package/bundles/pmcretail-mapper-library.umd.min.js +16 -0
  5. package/bundles/pmcretail-mapper-library.umd.min.js.map +1 -0
  6. package/esm2015/lib/RJ-mapper.class.js +1061 -0
  7. package/esm2015/lib/TransactionDocumentBuilder.js +1535 -0
  8. package/esm2015/lib/basket.service.js +851 -0
  9. package/esm2015/lib/mapper-library.component.js +27 -0
  10. package/esm2015/lib/mapper-library.model.js +974 -0
  11. package/esm2015/lib/mapper-library.module.js +21 -0
  12. package/esm2015/lib/number-util.service.js +77 -0
  13. package/esm2015/pmcretail-mapper-library.js +10 -0
  14. package/esm2015/public-api.js +12 -0
  15. package/esm5/lib/RJ-mapper.class.js +1262 -0
  16. package/esm5/lib/TransactionDocumentBuilder.js +2469 -0
  17. package/esm5/lib/basket.service.js +1076 -0
  18. package/esm5/lib/mapper-library.component.js +29 -0
  19. package/esm5/lib/mapper-library.model.js +974 -0
  20. package/esm5/lib/mapper-library.module.js +25 -0
  21. package/esm5/lib/number-util.service.js +94 -0
  22. package/esm5/pmcretail-mapper-library.js +10 -0
  23. package/esm5/public-api.js +12 -0
  24. package/{fesm2020/pmcretail-mapper-library.mjs → fesm2015/pmcretail-mapper-library.js} +2627 -602
  25. package/fesm2015/pmcretail-mapper-library.js.map +1 -0
  26. package/fesm5/pmcretail-mapper-library.js +5919 -0
  27. package/fesm5/pmcretail-mapper-library.js.map +1 -0
  28. package/lib/TransactionDocumentBuilder.d.ts +1 -1
  29. package/lib/basket.service.d.ts +1 -5
  30. package/lib/mapper-library.component.d.ts +0 -3
  31. package/lib/mapper-library.module.d.ts +0 -5
  32. package/lib/number-util.service.d.ts +2 -4
  33. package/package.json +16 -26
  34. package/pmcretail-mapper-library.d.ts +1 -1
  35. package/pmcretail-mapper-library.metadata.json +1 -0
  36. package/public-api.d.ts +0 -1
  37. package/esm2020/lib/RJ-mapper.class.mjs +0 -597
  38. package/esm2020/lib/TransactionDocumentBuilder.mjs +0 -1240
  39. package/esm2020/lib/basket.service.mjs +0 -527
  40. package/esm2020/lib/mapper-library.component.mjs +0 -26
  41. package/esm2020/lib/mapper-library.model.mjs +0 -20
  42. package/esm2020/lib/mapper-library.module.mjs +0 -21
  43. package/esm2020/lib/mapper-library.service.mjs +0 -56
  44. package/esm2020/lib/number-util.service.mjs +0 -41
  45. package/esm2020/pmcretail-mapper-library.mjs +0 -5
  46. package/esm2020/public-api.mjs +0 -8
  47. package/fesm2015/pmcretail-mapper-library.mjs +0 -2526
  48. package/fesm2015/pmcretail-mapper-library.mjs.map +0 -1
  49. package/fesm2020/pmcretail-mapper-library.mjs.map +0 -1
  50. package/lib/mapper-library.service.d.ts +0 -9
@@ -0,0 +1,1061 @@
1
+ /**
2
+ * @fileoverview added by tsickle
3
+ * Generated from: lib/RJ-mapper.class.ts
4
+ * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
+ */
6
+ import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
7
+ import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
8
+ export class RJMapperBuilderClass {
9
+ /**
10
+ * @param {?=} transactionDoc
11
+ */
12
+ constructor(transactionDoc) {
13
+ this.productQuantity = 0;
14
+ this.itemCount = 0;
15
+ this.largestNumber = 0;
16
+ this.rjObject = {};
17
+ this.paymentTypes = [
18
+ {
19
+ paymentType: 'Card',
20
+ type: 'SEPAY',
21
+ tenderType: '5',
22
+ tenderSubType: '8',
23
+ },
24
+ {
25
+ paymentType: 'Cash',
26
+ type: 'TMC_CASH',
27
+ tenderType: '1',
28
+ tenderSubType: '0'
29
+ },
30
+ {
31
+ paymentType: 'PDQ',
32
+ type: 'Unintegrated',
33
+ tenderType: '2',
34
+ tenderSubType: '8'
35
+ },
36
+ {
37
+ paymentType: 'Gift Card',
38
+ type: 'TMC_GIFTCARD',
39
+ tenderType: '5',
40
+ tenderSubType: '8'
41
+ }
42
+ ];
43
+ if (transactionDoc) {
44
+ this.transactionDocument = transactionDoc;
45
+ }
46
+ else {
47
+ this.transactionDocument = {
48
+ transactionId: "",
49
+ offlineTransactionId: "",
50
+ transactionRef: "",
51
+ dateTime: "",
52
+ orgCode: "",
53
+ storeId: "",
54
+ storeNodeId: "",
55
+ storeNodeStructure: "",
56
+ deviceId: "",
57
+ terminalId: "",
58
+ userId: "",
59
+ initiatingModule: "eBasket",
60
+ export: false,
61
+ basket: (/** @type {?} */ ({})),
62
+ basketSummary: (/** @type {?} */ ({})),
63
+ baseCurrency: "",
64
+ type: "",
65
+ operationStatus: "",
66
+ createdAt: "",
67
+ updatedAt: "",
68
+ id: "",
69
+ currentTransactionDetails: (/** @type {?} */ ({})),
70
+ saleTotal: 0,
71
+ };
72
+ }
73
+ this.initilizeItemCount();
74
+ this.setLineNumberForProducts();
75
+ }
76
+ /**
77
+ * @template THIS
78
+ * @this {THIS}
79
+ * @return {THIS}
80
+ */
81
+ getPosbasketInfo() {
82
+ (/** @type {?} */ (this)).rjObject['Keyword'] = (/** @type {?} */ (this)).generateKeyword();
83
+ (/** @type {?} */ (this)).rjObject['ID'] = (/** @type {?} */ (this)).generateId((/** @type {?} */ (this)).transactionDocument.createdAt);
84
+ (/** @type {?} */ (this)).rjObject['XMLSchemaVersion'] = '2';
85
+ (/** @type {?} */ (this)).rjObject['LastUpdated'] = (/** @type {?} */ (this)).transactionDocument.updatedAt;
86
+ (/** @type {?} */ (this)).rjObject['MajorVersion'] = (/** @type {?} */ (this)).majorVersion;
87
+ (/** @type {?} */ (this)).rjObject['MinorVersion'] = (/** @type {?} */ (this)).minorVersion;
88
+ (/** @type {?} */ (this)).rjObject['ManifestVersion'] = (/** @type {?} */ (this)).manifestVersion;
89
+ (/** @type {?} */ (this)).rjObject['DatabaseSchemaVersion'] = (/** @type {?} */ (this)).databaseSchemaVersion;
90
+ (/** @type {?} */ (this)).rjObject['BasketType'] = (/** @type {?} */ (this)).basketType;
91
+ (/** @type {?} */ (this)).rjObject['State'] = (/** @type {?} */ (this)).getState();
92
+ (/** @type {?} */ (this)).rjObject['ExternalState'] = (/** @type {?} */ (this)).externalState;
93
+ return (/** @type {?} */ (this));
94
+ }
95
+ /**
96
+ * @template THIS
97
+ * @this {THIS}
98
+ * @return {THIS}
99
+ */
100
+ getheaderInfo() {
101
+ (/** @type {?} */ (this)).rjObject['Header'] = {};
102
+ (/** @type {?} */ (this)).rjObject['Header'].TimeZoneOffset = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).generateTimezoneoffset((/** @type {?} */ (this)).transactionDocument.createdAt));
103
+ (/** @type {?} */ (this)).rjObject['Header'].DateTimeCreated = (/** @type {?} */ (this)).transactionDocument.createdAt;
104
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy = {};
105
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.DeviceID = (/** @type {?} */ (this)).deviceId;
106
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.CashierID = (/** @type {?} */ (this)).cashierId;
107
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.CompanyID = (/** @type {?} */ (this)).companyId;
108
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.StoreID = (/** @type {?} */ (this)).transactionDocument.storeId;
109
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.BranchID = (/** @type {?} */ (this)).transactionDocument.storeId;
110
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.TerminalNumber = (/** @type {?} */ (this)).terminalNumber;
111
+ (/** @type {?} */ (this)).rjObject['Header'].OriginatedBy.TransactionNumber = (/** @type {?} */ (this)).transactionNumber;
112
+ (/** @type {?} */ (this)).rjObject['Header'].TaxMethodID = (/** @type {?} */ (this)).taxMethodId;
113
+ (/** @type {?} */ (this)).rjObject['Header'].DynamicStockLookup = (/** @type {?} */ (this)).generateDynamicStockLookUp(); //todo
114
+ (/** @type {?} */ (this)).rjObject['Header'].BasketLanguageID = (/** @type {?} */ (this)).basketLanguageId; //todo
115
+ (/** @type {?} */ (this)).rjObject['Header'].BasketCountryID = (/** @type {?} */ (this)).basketCountryId; //todo
116
+ (/** @type {?} */ (this)).rjObject['Header'].BasketCurrencyID = (/** @type {?} */ (this)).transactionDocument.baseCurrency;
117
+ (/** @type {?} */ (this)).rjObject['Header'].TradingRegionID = (/** @type {?} */ (this)).tradingRegionId;
118
+ (/** @type {?} */ (this)).rjObject['Header'].Eurozone = " "; //unknown
119
+ (/** @type {?} */ (this)).rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
120
+ (/** @type {?} */ (this)).rjObject['Header'].PrintableName = ""; //unknown
121
+ return (/** @type {?} */ (this));
122
+ }
123
+ /**
124
+ * @template THIS
125
+ * @this {THIS}
126
+ * @return {THIS}
127
+ */
128
+ rjMapper() {
129
+ if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE) {
130
+ (/** @type {?} */ (this)).rjObject['ProductSale'] = [];
131
+ (/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
132
+ (/** @type {?} */ (this)).transactionDocument.basket.products.forEach((/**
133
+ * @param {?} element
134
+ * @return {?}
135
+ */
136
+ (element) => {
137
+ /** @type {?} */
138
+ let lineDiscount = [];
139
+ if ((/** @type {?} */ (this)).transactionDocument.basket.lineDiscount && (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.length > 0) {
140
+ lineDiscount = (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.filter((/**
141
+ * @param {?} x
142
+ * @return {?}
143
+ */
144
+ (x) => x.itemLineId === element.itemLineId));
145
+ if (lineDiscount.length > 0) {
146
+ /** @type {?} */
147
+ const index = (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
148
+ if (index > -1) {
149
+ (/** @type {?} */ (this)).transactionDocument.basket.lineDiscount.splice(index, 1);
150
+ }
151
+ }
152
+ }
153
+ /** @type {?} */
154
+ let data = (/** @type {?} */ (this)).addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null));
155
+ (/** @type {?} */ (this)).rjObject['ProductSale'].push(data);
156
+ (/** @type {?} */ (this)).getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
157
+ }));
158
+ }
159
+ else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.REFUND) {
160
+ (/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
161
+ (/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
162
+ (/** @type {?} */ (this)).transactionDocument.basket.products.forEach((/**
163
+ * @param {?} element
164
+ * @return {?}
165
+ */
166
+ (element) => {
167
+ /** @type {?} */
168
+ let data = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null));
169
+ (/** @type {?} */ (this)).rjObject['ProductReturn'].push(data);
170
+ (/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
171
+ }));
172
+ }
173
+ else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
174
+ (/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
175
+ (/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
176
+ /** @type {?} */
177
+ let transactionDoc = new TransactionDocumentBuilder().basket((/** @type {?} */ (this)).transactionDocument.currentTransactionDetails).build();
178
+ transactionDoc.basket.products.forEach((/**
179
+ * @param {?} element
180
+ * @return {?}
181
+ */
182
+ (element) => {
183
+ /** @type {?} */
184
+ let data = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null));
185
+ (/** @type {?} */ (this)).rjObject['ProductReturn'].push(data);
186
+ (/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
187
+ }));
188
+ }
189
+ else if ((/** @type {?} */ (this)).transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
190
+ (/** @type {?} */ (this)).rjObject['ProductReturn'] = [];
191
+ (/** @type {?} */ (this)).rjObject['ProductSale'] = [];
192
+ (/** @type {?} */ (this)).rjObject['ModifierItem'] = [];
193
+ /** @type {?} */
194
+ let transactionDoc = new TransactionDocumentBuilder().basket((/** @type {?} */ (this)).transactionDocument.currentTransactionDetails).build();
195
+ transactionDoc.basket.products.forEach((/**
196
+ * @param {?} element
197
+ * @return {?}
198
+ */
199
+ (element) => {
200
+ if (element.refundedQuantity > 0) {
201
+ /** @type {?} */
202
+ let returnProduct = (/** @type {?} */ (this)).returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null));
203
+ (/** @type {?} */ (this)).rjObject['ProductReturn'].push(returnProduct);
204
+ }
205
+ else {
206
+ /** @type {?} */
207
+ let addProduct = (/** @type {?} */ (this)).addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null));
208
+ (/** @type {?} */ (this)).rjObject['ProductSale'].push(addProduct);
209
+ }
210
+ (/** @type {?} */ (this)).getModifierItem(element.lineDiscount, element.itemLineId);
211
+ }));
212
+ }
213
+ return (/** @type {?} */ (this));
214
+ }
215
+ /**
216
+ * @template THIS
217
+ * @this {THIS}
218
+ * @return {THIS}
219
+ */
220
+ getBasketDiscount() {
221
+ (/** @type {?} */ (this)).rjObject['BasketDiscount'] = [];
222
+ if (!(/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount)
223
+ return (/** @type {?} */ (this));
224
+ (/** @type {?} */ (this)).transactionDocument.basket.transactionDiscount.forEach((/**
225
+ * @param {?} element
226
+ * @return {?}
227
+ */
228
+ (element) => {
229
+ /** @type {?} */
230
+ let obj = {};
231
+ obj['XMLSchemaVersion'] = 1;
232
+ obj['NetValue'] = element.discountAmount < 0 ? element.discountAmount : -element.discountAmount;
233
+ obj['EffectiveNetValue'] = element.discountAmount < 0 ? element.discountAmount : -element.discountAmount;
234
+ obj['Description'] = element.reasonCode;
235
+ obj['UserID'] = (/** @type {?} */ (this)).transactionDocument.basket.userId;
236
+ obj['ReasonCodeID'] = element.reasonCode;
237
+ obj['DiscountType'] = element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1; // todo - compare values
238
+ obj['RoundingRule'] = 2;
239
+ obj['ModifiedLineNumber '] = [];
240
+ element.itemLineIds.forEach((/**
241
+ * @param {?} element
242
+ * @return {?}
243
+ */
244
+ (element) => {
245
+ obj['ModifiedLineNumber'].push(element);
246
+ }));
247
+ obj['LineNumber'] = (/** @type {?} */ (this)).generateLineNumber();
248
+ // obj['DiscountedValue'] = obj['discountAmount'] // todo - confirm value before discount;
249
+ // obj['DiscountPercentage'] = obj['discountAmount'] / 100 ; // todo - optional
250
+ (/** @type {?} */ (this)).rjObject['BasketDiscount'].push(obj);
251
+ }));
252
+ return (/** @type {?} */ (this));
253
+ }
254
+ /**
255
+ * @param {?} data
256
+ * @param {?} lineNo
257
+ * @return {?}
258
+ */
259
+ getModifierItem(data, lineNo) {
260
+ if (data && lineNo) {
261
+ /** @type {?} */
262
+ let obj = {};
263
+ obj.XMLSchemaVersion = 1;
264
+ obj.LineNumber = this.generateLineNumber();
265
+ obj.NetValue = 0;
266
+ obj.EffectiveNetValue = 0;
267
+ obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
268
+ obj.DeviceID = this.deviceId;
269
+ obj.UserID = this.userId;
270
+ obj.DateTimeCreated = this.transactionDocument.updatedAt;
271
+ obj.AuthorisingUserID = this.userId;
272
+ obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
273
+ obj.ModifiedLineNumber = lineNo;
274
+ obj.ModifiedIndex = 1;
275
+ this.rjObject['ModifierItem'].push(obj);
276
+ }
277
+ }
278
+ /**
279
+ * @template THIS
280
+ * @this {THIS}
281
+ * @return {THIS}
282
+ */
283
+ getTrailerInfo() {
284
+ (/** @type {?} */ (this)).rjObject['Trailer'] = {};
285
+ (/** @type {?} */ (this)).rjObject.Trailer.DateTimeCompleted = (/** @type {?} */ (this)).transactionDocument.updatedAt;
286
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy = {};
287
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.DeviceID = (/** @type {?} */ (this)).deviceId; //todo
288
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.CashierID = (/** @type {?} */ (this)).cashierId; //todo
289
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.StoreID = (/** @type {?} */ (this)).transactionDocument.storeId;
290
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.BranchID = (/** @type {?} */ (this)).transactionDocument.storeId;
291
+ (/** @type {?} */ (this)).rjObject.Trailer.CompletedBy.TerminalNumber = (/** @type {?} */ (this)).transactionDocument.terminalId;
292
+ (/** @type {?} */ (this)).rjObject.Trailer.Total = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.basketTotal * 100);
293
+ (/** @type {?} */ (this)).rjObject.Trailer.ItemCount = (/** @type {?} */ (this)).itemCount; //gives total count for product
294
+ (/** @type {?} */ (this)).rjObject.Trailer.ItemQuantity = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.totalItems);
295
+ (/** @type {?} */ (this)).rjObject.Trailer.NetItemQuantity = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.totalItems);
296
+ (/** @type {?} */ (this)).rjObject.Trailer.TaxTotal = (/** @type {?} */ (this)).convertToString((/** @type {?} */ (this)).transactionDocument.basketSummary.VATTotal);
297
+ (/** @type {?} */ (this)).rjObject.Trailer.SequenceDeviceID = (/** @type {?} */ (this)).deviceId;
298
+ (/** @type {?} */ (this)).rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
299
+ (/** @type {?} */ (this)).rjObject['Trailer']['TaxItem'] = [];
300
+ (/** @type {?} */ (this)).transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
301
+ * @param {?} element
302
+ * @return {?}
303
+ */
304
+ (element) => {
305
+ /** @type {?} */
306
+ let obj = {};
307
+ obj['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
308
+ obj['TaxRate'] = element.VAT;
309
+ obj['TaxableTotal'] = (/** @type {?} */ (this)).convertToString(element.taxableAmount);
310
+ obj['TaxTotal'] = (/** @type {?} */ (this)).convertToString(element.taxLineTotal);
311
+ obj['TaxDescription'] = (/** @type {?} */ (this)).convertToString(element.VATCode);
312
+ obj['TaxIncluded'] = '1';
313
+ obj['TaxPercentage'] = element.VAT; // todo
314
+ (/** @type {?} */ (this)).rjObject['Trailer']['TaxItem'].push(obj);
315
+ }));
316
+ // TODO: make Trailer object from promotion
317
+ (/** @type {?} */ (this)).rjObject['Trailer']['PromotionItem'] = [];
318
+ (/** @type {?} */ (this)).transactionDocument.basket.linePromotion.forEach((/**
319
+ * @param {?} element
320
+ * @return {?}
321
+ */
322
+ (element) => {
323
+ /** @type {?} */
324
+ let obj = {};
325
+ obj['PromotionID'] = element.promotionId;
326
+ obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
327
+ obj['PromotionQuantity'] = ""; // todo - not avaialble
328
+ obj['PromotionDescription'] = element.displayText;
329
+ obj['PromotionHit']['XMLSchemaVersion'] = (/** @type {?} */ (this)).transactionDocument.storeId;
330
+ obj['PromotionHit']['HitNumber'] = ""; // todo;
331
+ obj['PromotionHit']['HitQuantity'] = ""; // todo;
332
+ obj['PromotionHit']['HitSaving'] = ""; // todo;
333
+ obj['PromotionHit']['PromotionTrigger'] = [];
334
+ element.trigger.forEach((/**
335
+ * @param {?} subElement
336
+ * @return {?}
337
+ */
338
+ (subElement) => {
339
+ /** @type {?} */
340
+ let objSub = {};
341
+ /** @type {?} */
342
+ let product = (/** @type {?} */ (this)).transactionDocument.basket.products.find((/**
343
+ * @param {?} item
344
+ * @return {?}
345
+ */
346
+ (item) => item.lineItemId == subElement.itemLineId));
347
+ objSub['XMLSchemaVersion'] = (/** @type {?} */ (this)).xmlSchemaVersion;
348
+ objSub['ProductID'] = (/** @type {?} */ (this)).transactionDocument.basket.products.find((/**
349
+ * @param {?} item
350
+ * @return {?}
351
+ */
352
+ (item) => item.itemLineId === subElement.itemLineId)).SKU;
353
+ objSub['UnitValue'] = (/** @type {?} */ (this)).convertToString(element.promotionLinePrice / product.quantity);
354
+ objSub['LineNumber'] = (/** @type {?} */ (this)).convertToString(subElement.itemLineId);
355
+ objSub['Quantity'] = (/** @type {?} */ (this)).convertToString(subElement.quantity.toFixed(1));
356
+ objSub['TaxCode'] = (/** @type {?} */ (this)).transactionDocument.basket.taxBreakdown.taxLines.find((/**
357
+ * @param {?} item
358
+ * @return {?}
359
+ */
360
+ (item) => item.itemLineId == element.itemLineId)).VATCode; // todo
361
+ obj['PromotionHit']['PromotionTrigger'].push(objSub);
362
+ }));
363
+ (/** @type {?} */ (this)).rjObject['Trailer']['PromotionItem'].push(obj);
364
+ }));
365
+ //console.log(this.rjObject);
366
+ return (/** @type {?} */ (this));
367
+ }
368
+ /**
369
+ * @template THIS
370
+ * @this {THIS}
371
+ * @return {THIS}
372
+ */
373
+ getTenderInfo() {
374
+ (/** @type {?} */ (this)).rjObject['CashTender'] = [];
375
+ if ((/** @type {?} */ (this)).transactionDocument.paymentDetails && (/** @type {?} */ (this)).transactionDocument.paymentDetails.length > 0) {
376
+ (/** @type {?} */ (this)).transactionDocument.paymentDetails.forEach((/**
377
+ * @param {?} element
378
+ * @return {?}
379
+ */
380
+ (element) => {
381
+ /** @type {?} */
382
+ let value = (/** @type {?} */ (this)).paymentTypes.filter((/**
383
+ * @param {?} x
384
+ * @return {?}
385
+ */
386
+ x => x.paymentType.toUpperCase() === element.paymentType.toUpperCase()));
387
+ if (element.paymentType.toUpperCase() === 'GIFT CARD') {
388
+ /** @type {?} */
389
+ let obj = {
390
+ XMLSchemaVersion: (/** @type {?} */ (this)).xmlSchemaVersion,
391
+ LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
392
+ NetValue: (/** @type {?} */ (this)).convertToString(-1 * (Math.round(element.amount))),
393
+ EffectiveNetValue: (/** @type {?} */ (this)).convertToString(-1 * (Math.round(element.amount))),
394
+ Description: (/** @type {?} */ (this)).getDescription(value[0].paymentType, element),
395
+ //todo
396
+ DeviceID: (/** @type {?} */ (this)).deviceId,
397
+ //todo
398
+ UserID: (/** @type {?} */ (this)).userId,
399
+ //todo
400
+ DateTimeCreated: (/** @type {?} */ (this)).transactionDocument.updatedAt,
401
+ TenderType: value[0].tenderType,
402
+ TenderSubType: value[0].tenderSubType,
403
+ TenderAmount: (/** @type {?} */ (this)).convertToString(-1 * (Math.round(element.amount))),
404
+ CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
405
+ CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
406
+ GiftVoucherSalesAllowed: '',
407
+ //todo
408
+ AllowRechargeableVoucherSales: '',
409
+ //todo
410
+ GiftVoucherID: ''
411
+ };
412
+ (/** @type {?} */ (this)).rjObject['CashTender'].push(obj);
413
+ }
414
+ else {
415
+ /** @type {?} */
416
+ let obj1 = {
417
+ XMLSchemaVersion: "1",
418
+ LineNumber: (/** @type {?} */ (this)).generateLineNumber(),
419
+ //todo
420
+ NetValue: JSON.stringify(-1 * (Math.round(element.amount))),
421
+ EffectiveNetValue: JSON.stringify(-1 * (Math.round(element.amount))),
422
+ Description: (/** @type {?} */ (this)).getDescription(value[0].paymentType, element),
423
+ //todo
424
+ DeviceID: (/** @type {?} */ (this)).deviceId,
425
+ //todo
426
+ UserID: (/** @type {?} */ (this)).userId,
427
+ //todo
428
+ DateTimeCreated: (/** @type {?} */ (this)).transactionDocument.updatedAt,
429
+ TenderType: value[0].tenderType,
430
+ TenderSubType: value[0].tenderSubType,
431
+ TenderAmount: JSON.stringify(-1 * (Math.round(element.amount))),
432
+ CurrencyID: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
433
+ CurrencyDescription: (/** @type {?} */ (this)).transactionDocument.baseCurrency,
434
+ IncludeInTransactionTotalCheck: "1",
435
+ AllowRechargeableVoucherSales: "1",
436
+ OpenDrawerAtEnd: "1"
437
+ };
438
+ (/** @type {?} */ (this)).rjObject['CashTender'].push(obj1);
439
+ }
440
+ }));
441
+ }
442
+ return (/** @type {?} */ (this));
443
+ }
444
+ /**
445
+ * @return {?}
446
+ */
447
+ setLineNumberForProducts() {
448
+ /** @type {?} */
449
+ let itemLineIdArray = [];
450
+ itemLineIdArray = this.transactionDocument.basket.products.map((/**
451
+ * @param {?} product
452
+ * @return {?}
453
+ */
454
+ (product) => {
455
+ return parseInt(product.itemLineId);
456
+ }));
457
+ this.largestNumber = itemLineIdArray.reduce((/**
458
+ * @param {?} a
459
+ * @param {?} b
460
+ * @return {?}
461
+ */
462
+ (a, b) => Math.max(a, b)));
463
+ }
464
+ /**
465
+ * @return {?}
466
+ */
467
+ generateLineNumber() {
468
+ this.largestNumber += 1;
469
+ this.itemCount += 1;
470
+ return this.largestNumber;
471
+ }
472
+ /**
473
+ * @return {?}
474
+ */
475
+ initilizeItemCount() {
476
+ this.itemCount = this.transactionDocument.basket.products.length;
477
+ }
478
+ /**
479
+ * @return {?}
480
+ */
481
+ build() {
482
+ return this.rjObject;
483
+ }
484
+ /**
485
+ * @param {?} paymentType
486
+ * @param {?} element
487
+ * @return {?}
488
+ */
489
+ getDescription(paymentType, element) {
490
+ if (paymentType.toUpperCase() === 'CARD') {
491
+ return element.cardType;
492
+ }
493
+ else {
494
+ return paymentType;
495
+ }
496
+ }
497
+ /**
498
+ * @template THIS
499
+ * @this {THIS}
500
+ * @param {?} id
501
+ * @return {THIS}
502
+ */
503
+ setDeviceInfo(id) {
504
+ (/** @type {?} */ (this)).deviceId = id;
505
+ return (/** @type {?} */ (this));
506
+ }
507
+ /**
508
+ * @template THIS
509
+ * @this {THIS}
510
+ * @param {?} id
511
+ * @return {THIS}
512
+ */
513
+ setUserInfo(id) {
514
+ (/** @type {?} */ (this)).userId = id;
515
+ return (/** @type {?} */ (this));
516
+ }
517
+ /**
518
+ * @param {?} value
519
+ * @return {?}
520
+ */
521
+ removeDecimal(value) {
522
+ return value * 100;
523
+ }
524
+ /**
525
+ * @template THIS
526
+ * @this {THIS}
527
+ * @param {?} value
528
+ * @return {THIS}
529
+ */
530
+ setTransactionNumber(value) {
531
+ (/** @type {?} */ (this)).transactionNumber = value;
532
+ return (/** @type {?} */ (this));
533
+ }
534
+ /**
535
+ * @template THIS
536
+ * @this {THIS}
537
+ * @param {?} value
538
+ * @return {THIS}
539
+ */
540
+ setManifestVersion(value) {
541
+ (/** @type {?} */ (this)).manifestVersion = value;
542
+ return (/** @type {?} */ (this));
543
+ }
544
+ /**
545
+ * @template THIS
546
+ * @this {THIS}
547
+ * @param {?} value
548
+ * @return {THIS}
549
+ */
550
+ setDatabaseSchemaVersion(value) {
551
+ (/** @type {?} */ (this)).databaseSchemaVersion = value;
552
+ return (/** @type {?} */ (this));
553
+ }
554
+ /**
555
+ * @template THIS
556
+ * @this {THIS}
557
+ * @param {?} value
558
+ * @return {THIS}
559
+ */
560
+ setBasketType(value) {
561
+ (/** @type {?} */ (this)).basketType = value;
562
+ return (/** @type {?} */ (this));
563
+ }
564
+ /**
565
+ * @template THIS
566
+ * @this {THIS}
567
+ * @param {?} value
568
+ * @return {THIS}
569
+ */
570
+ setTradingRegionID(value) {
571
+ (/** @type {?} */ (this)).tradingRegionId = value;
572
+ return (/** @type {?} */ (this));
573
+ }
574
+ /**
575
+ * @template THIS
576
+ * @this {THIS}
577
+ * @param {?} value
578
+ * @return {THIS}
579
+ */
580
+ setCompanyID(value) {
581
+ (/** @type {?} */ (this)).companyId = value;
582
+ return (/** @type {?} */ (this));
583
+ }
584
+ /**
585
+ * @template THIS
586
+ * @this {THIS}
587
+ * @param {?} value
588
+ * @return {THIS}
589
+ */
590
+ setTaxMethodID(value) {
591
+ (/** @type {?} */ (this)).taxMethodId = value;
592
+ return (/** @type {?} */ (this));
593
+ }
594
+ /**
595
+ * @template THIS
596
+ * @this {THIS}
597
+ * @param {?} value
598
+ * @return {THIS}
599
+ */
600
+ setMajorVersion(value) {
601
+ (/** @type {?} */ (this)).majorVersion = value;
602
+ return (/** @type {?} */ (this));
603
+ }
604
+ /**
605
+ * @template THIS
606
+ * @this {THIS}
607
+ * @param {?} value
608
+ * @return {THIS}
609
+ */
610
+ setMinorVersion(value) {
611
+ (/** @type {?} */ (this)).minorVersion = value;
612
+ return (/** @type {?} */ (this));
613
+ }
614
+ /**
615
+ * @template THIS
616
+ * @this {THIS}
617
+ * @param {?} value
618
+ * @return {THIS}
619
+ */
620
+ setXMLSchemaVersion(value) {
621
+ (/** @type {?} */ (this)).xmlSchemaVersion = value;
622
+ return (/** @type {?} */ (this));
623
+ }
624
+ /**
625
+ * @template THIS
626
+ * @this {THIS}
627
+ * @param {?} value
628
+ * @return {THIS}
629
+ */
630
+ setExternalState(value) {
631
+ (/** @type {?} */ (this)).externalState = value;
632
+ return (/** @type {?} */ (this));
633
+ }
634
+ /**
635
+ * @template THIS
636
+ * @this {THIS}
637
+ * @param {?} value
638
+ * @return {THIS}
639
+ */
640
+ setCashierID(value) {
641
+ (/** @type {?} */ (this)).cashierId = value;
642
+ return (/** @type {?} */ (this));
643
+ }
644
+ /**
645
+ * @template THIS
646
+ * @this {THIS}
647
+ * @param {?} value
648
+ * @return {THIS}
649
+ */
650
+ setTerminalNumber(value) {
651
+ (/** @type {?} */ (this)).terminalNumber = value;
652
+ return (/** @type {?} */ (this));
653
+ }
654
+ /**
655
+ * @template THIS
656
+ * @this {THIS}
657
+ * @param {?} value
658
+ * @return {THIS}
659
+ */
660
+ setBasketLanguageID(value) {
661
+ (/** @type {?} */ (this)).basketLanguageId = value;
662
+ return (/** @type {?} */ (this));
663
+ }
664
+ /**
665
+ * @template THIS
666
+ * @this {THIS}
667
+ * @param {?} value
668
+ * @return {THIS}
669
+ */
670
+ setBasketCountryID(value) {
671
+ (/** @type {?} */ (this)).basketCountryId = value;
672
+ return (/** @type {?} */ (this));
673
+ }
674
+ /**
675
+ * @template THIS
676
+ * @this {THIS}
677
+ * @param {?} value
678
+ * @return {THIS}
679
+ */
680
+ setBasketCurrencyID(value) {
681
+ (/** @type {?} */ (this)).basketCurrencyId = value;
682
+ return (/** @type {?} */ (this));
683
+ }
684
+ /**
685
+ * @param {?} date
686
+ * @return {?}
687
+ */
688
+ generateId(date) {
689
+ /** @type {?} */
690
+ let newDateTime = date.replace(/[^0-9]/g, '');
691
+ /** @type {?} */
692
+ let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
693
+ return id;
694
+ }
695
+ /**
696
+ * @param {?} date
697
+ * @return {?}
698
+ */
699
+ generateTimezoneoffset(date) {
700
+ /** @type {?} */
701
+ let x = date ? date : '';
702
+ return new Date(x).getTimezoneOffset();
703
+ }
704
+ /**
705
+ * @return {?}
706
+ */
707
+ generateKeyword() {
708
+ /** @type {?} */
709
+ let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
710
+ return x;
711
+ }
712
+ /**
713
+ * @return {?}
714
+ */
715
+ getState() {
716
+ if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
717
+ return 'Completed';
718
+ }
719
+ else {
720
+ return 'Cancelled';
721
+ }
722
+ }
723
+ /**
724
+ * @param {?} element
725
+ * @param {?} lineDiscount
726
+ * @return {?}
727
+ */
728
+ returnProduct(element, lineDiscount) {
729
+ /** @type {?} */
730
+ let obj = {};
731
+ obj['LineNumber'] = element['itemLineId'];
732
+ obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
733
+ obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
734
+ obj['Description'] = element['description'];
735
+ obj['DeviceID'] = this.transactionDocument['terminalId'];
736
+ obj['UserID'] = this.userId;
737
+ obj['DateTimeCreated'] = this.transactionDocument['createdAt'];
738
+ obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice']);
739
+ obj['UnitPrice'] = this.removeDecimal(element['price']);
740
+ obj['Quantity'] = element['refundedQuantity'] < 0 ? element['refundedQuantity'].toFixed(1) : -element['refundedQuantity'].toFixed(1);
741
+ obj['OriginalTaxAmountSet'] = 1;
742
+ obj['ProductID'] = element['SKU'];
743
+ obj['HandKeyed'] = 1;
744
+ obj['LongDescription'] = element['description'];
745
+ obj['Return'] = {};
746
+ obj['Return']['ReturnReasonID'] = element['refundedReason'];
747
+ obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
748
+ obj['Return']['ReturnToStock'] = element['refundedQuantity'] > 0 ? element['refundedQuantity'] : -1 * element['refundedQuantity'];
749
+ obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
750
+ * @param {?} item
751
+ * @return {?}
752
+ */
753
+ (item) => item.itemLineId == element['itemLineId'])).VATCode;
754
+ obj['DisplayTaxCode'] = ''; // todo
755
+ obj['ProductAttributes'] = ''; //todo - not required
756
+ obj['Perishable'] = this.getAttributes();
757
+ obj['MMGroupID'] = this.getAttributes();
758
+ obj['CustomerDetails'] = ""; // todo - blank
759
+ obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
760
+ // TODO
761
+ /** @type {?} */
762
+ let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((/**
763
+ * @param {?} item
764
+ * @return {?}
765
+ */
766
+ (item) => item.itemLineId == element['itemLineId']));
767
+ obj['OriginalTaxAmount'] = taxTotal.taxLineTotal < 0 ? this.removeDecimal(taxTotal.taxLineTotal) : this.removeDecimal(-taxTotal.taxLineTotal); //todo
768
+ obj['taxAmount'] = taxTotal.taxLineTotal < 0 ? this.removeDecimal(taxTotal.taxLineTotal) : this.removeDecimal(-taxTotal.taxLineTotal);
769
+ if (lineDiscount) {
770
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
771
+ // line discount
772
+ obj['Discount'] = {};
773
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.unitPrice) * -1;
774
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
775
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
776
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
777
+ obj['Discount'].AuthorisingUserID = this.userId;
778
+ obj['Discount'].DiscountType = lineDiscount.discountType;
779
+ obj['Discount'].XMLSchemaVersion = 1;
780
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
781
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
782
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
783
+ obj['Discount'].RoundingRule = 2;
784
+ }
785
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
786
+ //price override
787
+ obj['PriceOverride'] = {};
788
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
789
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
790
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
791
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
792
+ obj['PriceOverride'].AuthorisingUserID = this.userId;
793
+ obj['PriceOverride'].XMLSchemaVersion = 1;
794
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
795
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
796
+ }
797
+ //update the product price
798
+ obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
799
+ obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
800
+ obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
801
+ obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
802
+ }
803
+ return obj;
804
+ }
805
+ /**
806
+ * @param {?} element
807
+ * @param {?} lineDiscount
808
+ * @return {?}
809
+ */
810
+ addProduct(element, lineDiscount) {
811
+ /** @type {?} */
812
+ let obj = {
813
+ XMLSchemaVersion: this.xmlSchemaVersion,
814
+ LineNumber: element.itemLineId,
815
+ NetValue: this.removeDecimal(element.totalLinePrice),
816
+ EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
817
+ Description: element.description,
818
+ DeviceID: this.deviceId,
819
+ //to do
820
+ UserID: this.userId,
821
+ //to do,
822
+ DateTimeCreated: this.transactionDocument.createdAt,
823
+ ExtendedValue: this.removeDecimal(element.price),
824
+ UnitPrice: this.removeDecimal(element.price),
825
+ MMGroupID: this.getAttributes(),
826
+ //todo
827
+ Quantity: element.quantity.toFixed(1),
828
+ SalespersonID: this.transactionDocument.userId,
829
+ SalespersonName: this.transactionDocument.userName,
830
+ TaxCode: 0,
831
+ //todo
832
+ TaxModifiable: 1,
833
+ //todo
834
+ TaxAmount: 0,
835
+ //todo
836
+ OriginalTaxAmount: 0,
837
+ //todo
838
+ OriginalTaxAmountSet: 1,
839
+ //todo
840
+ ProductID: element.SKU,
841
+ HandKeyed: 1,
842
+ //todo
843
+ CustomerDetails: "",
844
+ Perishable: this.getAttributes()
845
+ };
846
+ if (lineDiscount) {
847
+ if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
848
+ // line discount
849
+ obj['Discount'] = {};
850
+ obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.unitPrice) * -1;
851
+ obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
852
+ obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
853
+ obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
854
+ obj['Discount'].AuthorisingUserID = this.userId;
855
+ obj['Discount'].DiscountType = lineDiscount.discountType;
856
+ obj['Discount'].XMLSchemaVersion = 1;
857
+ obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
858
+ obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
859
+ obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
860
+ obj['Discount'].RoundingRule = 2;
861
+ }
862
+ if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
863
+ //price override
864
+ obj['PriceOverride'] = {};
865
+ obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
866
+ obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
867
+ obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
868
+ obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
869
+ obj['PriceOverride'].AuthorisingUserID = this.userId;
870
+ obj['PriceOverride'].XMLSchemaVersion = 1;
871
+ obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
872
+ obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
873
+ }
874
+ //update the product price
875
+ obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
876
+ obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
877
+ obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
878
+ obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
879
+ }
880
+ return obj;
881
+ }
882
+ /**
883
+ * @param {?} value
884
+ * @return {?}
885
+ */
886
+ convertToString(value) {
887
+ try {
888
+ value = JSON.stringify(value);
889
+ return value;
890
+ }
891
+ catch (e) {
892
+ console.log(value, ' can not be converted in string', e);
893
+ }
894
+ }
895
+ /**
896
+ * @return {?}
897
+ */
898
+ generateDynamicStockLookUp() {
899
+ /** @type {?} */
900
+ let x = '0';
901
+ this.transactionDocument.basket.products.forEach((/**
902
+ * @param {?} element
903
+ * @return {?}
904
+ */
905
+ (element) => {
906
+ if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
907
+ x = '1';
908
+ }
909
+ }));
910
+ return x;
911
+ }
912
+ /**
913
+ * @return {?}
914
+ */
915
+ getAttributes() {
916
+ /** @type {?} */
917
+ let name = [];
918
+ this.transactionDocument.basket.products.forEach((/**
919
+ * @param {?} element
920
+ * @return {?}
921
+ */
922
+ (element) => {
923
+ if (element.attributes && element.attributes.length > 0) {
924
+ name = element.attributes.filter((/**
925
+ * @param {?} x
926
+ * @return {?}
927
+ */
928
+ (x) => x.name.toUpperCase() === element.name.toUpperCase()));
929
+ }
930
+ }));
931
+ if (name.length > 0) {
932
+ return name[0].value;
933
+ }
934
+ else {
935
+ return "";
936
+ }
937
+ }
938
+ }
939
+ if (false) {
940
+ /**
941
+ * @type {?}
942
+ * @private
943
+ */
944
+ RJMapperBuilderClass.prototype.transactionDocument;
945
+ /**
946
+ * @type {?}
947
+ * @private
948
+ */
949
+ RJMapperBuilderClass.prototype.productQuantity;
950
+ /**
951
+ * @type {?}
952
+ * @private
953
+ */
954
+ RJMapperBuilderClass.prototype.userId;
955
+ /**
956
+ * @type {?}
957
+ * @private
958
+ */
959
+ RJMapperBuilderClass.prototype.deviceId;
960
+ /**
961
+ * @type {?}
962
+ * @private
963
+ */
964
+ RJMapperBuilderClass.prototype.transactionNumber;
965
+ /**
966
+ * @type {?}
967
+ * @private
968
+ */
969
+ RJMapperBuilderClass.prototype.manifestVersion;
970
+ /**
971
+ * @type {?}
972
+ * @private
973
+ */
974
+ RJMapperBuilderClass.prototype.databaseSchemaVersion;
975
+ /**
976
+ * @type {?}
977
+ * @private
978
+ */
979
+ RJMapperBuilderClass.prototype.basketType;
980
+ /**
981
+ * @type {?}
982
+ * @private
983
+ */
984
+ RJMapperBuilderClass.prototype.xmlSchemaVersion;
985
+ /**
986
+ * @type {?}
987
+ * @private
988
+ */
989
+ RJMapperBuilderClass.prototype.majorVersion;
990
+ /**
991
+ * @type {?}
992
+ * @private
993
+ */
994
+ RJMapperBuilderClass.prototype.minorVersion;
995
+ /**
996
+ * @type {?}
997
+ * @private
998
+ */
999
+ RJMapperBuilderClass.prototype.externalState;
1000
+ /**
1001
+ * @type {?}
1002
+ * @private
1003
+ */
1004
+ RJMapperBuilderClass.prototype.cashierId;
1005
+ /**
1006
+ * @type {?}
1007
+ * @private
1008
+ */
1009
+ RJMapperBuilderClass.prototype.companyId;
1010
+ /**
1011
+ * @type {?}
1012
+ * @private
1013
+ */
1014
+ RJMapperBuilderClass.prototype.terminalNumber;
1015
+ /**
1016
+ * @type {?}
1017
+ * @private
1018
+ */
1019
+ RJMapperBuilderClass.prototype.taxMethodId;
1020
+ /**
1021
+ * @type {?}
1022
+ * @private
1023
+ */
1024
+ RJMapperBuilderClass.prototype.tradingRegionId;
1025
+ /**
1026
+ * @type {?}
1027
+ * @private
1028
+ */
1029
+ RJMapperBuilderClass.prototype.basketCurrencyId;
1030
+ /**
1031
+ * @type {?}
1032
+ * @private
1033
+ */
1034
+ RJMapperBuilderClass.prototype.basketCountryId;
1035
+ /**
1036
+ * @type {?}
1037
+ * @private
1038
+ */
1039
+ RJMapperBuilderClass.prototype.basketLanguageId;
1040
+ /**
1041
+ * @type {?}
1042
+ * @private
1043
+ */
1044
+ RJMapperBuilderClass.prototype.itemCount;
1045
+ /**
1046
+ * @type {?}
1047
+ * @private
1048
+ */
1049
+ RJMapperBuilderClass.prototype.largestNumber;
1050
+ /**
1051
+ * @type {?}
1052
+ * @private
1053
+ */
1054
+ RJMapperBuilderClass.prototype.rjObject;
1055
+ /**
1056
+ * @type {?}
1057
+ * @private
1058
+ */
1059
+ RJMapperBuilderClass.prototype.paymentTypes;
1060
+ }
1061
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHBtY3JldGFpbC9tYXBwZXItbGlicmFyeS8iLCJzb3VyY2VzIjpbImxpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ3BILE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE1BQU0sT0FBTyxvQkFBb0I7Ozs7SUF5RDdCLFlBQVksY0FBb0M7UUFyRHhDLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBbUJwQixjQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2Qsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsYUFBUSxHQUFRLEVBQUUsQ0FBQTtRQUVsQixpQkFBWSxHQUFHO1lBQ25CO2dCQUNJLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixJQUFJLEVBQUUsT0FBTztnQkFDYixVQUFVLEVBQUUsR0FBRztnQkFDZixhQUFhLEVBQUUsR0FBRzthQUVyQjtZQUNEO2dCQUNJLFdBQVcsRUFBRSxNQUFNO2dCQUNuQixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsVUFBVSxFQUFFLEdBQUc7Z0JBQ2YsYUFBYSxFQUFFLEdBQUc7YUFFckI7WUFDRDtnQkFDSSxXQUFXLEVBQUUsS0FBSztnQkFDbEIsSUFBSSxFQUFFLGNBQWM7Z0JBQ3BCLFVBQVUsRUFBRSxHQUFHO2dCQUNmLGFBQWEsRUFBRSxHQUFHO2FBRXJCO1lBQ0Q7Z0JBQ0ksV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLElBQUksRUFBRSxjQUFjO2dCQUNwQixVQUFVLEVBQUUsR0FBRztnQkFDZixhQUFhLEVBQUUsR0FBRzthQUNyQjtTQUNKLENBQUE7UUFHRyxJQUFJLGNBQWMsRUFBRTtZQUNoQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsY0FBYyxDQUFDO1NBQzdDO2FBQU07WUFDSCxJQUFJLENB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OztJQUM5Qix5Q0FBc0I7Ozs7O0lBQ3RCLDZDQUEwQjs7Ozs7SUFDMUIsd0NBQTBCOzs7OztJQUUxQiw0Q0E0QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBESVNDT1VOVFRZUEUsIExpbmVEaXNjb3VudCwgVFByb2R1Y3QsIFRyYW5zYWN0aW9uRG9jdW1lbnQsIFRSQU5TQUNUSU9OX1RZUEUgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiXHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIH0gZnJvbSBcIi4vVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXJcIjtcclxuZXhwb3J0IGNsYXNzIFJKTWFwcGVyQnVpbGRlckNsYXNzIHtcclxuXHJcblxyXG4gICAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xyXG4gICAgcHJpdmF0ZSBwcm9kdWN0UXVhbnRpdHkgPSAwO1xyXG4gICAgcHJpdmF0ZSB1c2VySWQ6IGFueTtcclxuICAgIHByaXZhdGUgZGV2aWNlSWQ6IGFueTtcclxuICAgIHByaXZhdGUgdHJhbnNhY3Rpb25OdW1iZXI6IGFueTtcclxuICAgIHByaXZhdGUgbWFuaWZlc3RWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIGRhdGFiYXNlU2NoZW1hVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBiYXNrZXRUeXBlOiBhbnk7XHJcbiAgICBwcml2YXRlIHhtbFNjaGVtYVZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgbWFqb3JWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIG1pbm9yVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBleHRlcm5hbFN0YXRlOiBhbnk7XHJcbiAgICBwcml2YXRlIGNhc2hpZXJJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBjb21wYW55SWQ6IGFueTtcclxuICAgIHByaXZhdGUgdGVybWluYWxOdW1iZXI6IGFueTtcclxuICAgIHByaXZhdGUgdGF4TWV0aG9kSWQ6IGFueTtcclxuICAgIHByaXZhdGUgdHJhZGluZ1JlZ2lvbklkOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldEN1cnJlbmN5SWQ6IGFueTtcclxuICAgIHByaXZhdGUgYmFza2V0Q291bnRyeUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldExhbmd1YWdlSWQ6IGFueTtcclxuICAgIHByaXZhdGUgaXRlbUNvdW50ID0gMDtcclxuICAgIHByaXZhdGUgbGFyZ2VzdE51bWJlciA9IDA7XHJcbiAgICBwcml2YXRlIHJqT2JqZWN0OiBhbnkgPSB7fVxyXG5cclxuICAgIHByaXZhdGUgcGF5bWVudFR5cGVzID0gW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF5bWVudFR5cGU6ICdDYXJkJyxcclxuICAgICAgICAgICAgdHlwZTogJ1NFUEFZJyxcclxuICAgICAgICAgICAgdGVuZGVyVHlwZTogJzUnLFxyXG4gICAgICAgICAgICB0ZW5kZXJTdWJUeXBlOiAnOCcsXHJcblxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBwYXltZW50VHlwZTogJ0Nhc2gnLFxyXG4gICAgICAgICAgICB0eXBlOiAnVE1DX0NBU0gnLFxyXG4gICAgICAgICAgICB0ZW5kZXJUeXBlOiAnMScsXHJcbiAgICAgICAgICAgIHRlbmRlclN1YlR5cGU6ICcwJ1xyXG5cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgcGF5bWVudFR5cGU6ICdQRFEnLFxyXG4gICAgICAgICAgICB0eXBlOiAnVW5pbnRlZ3JhdGVkJyxcclxuICAgICAgICAgICAgdGVuZGVyVHlwZTogJzInLFxyXG4gICAgICAgICAgICB0ZW5kZXJTdWJUeXBlOiAnOCdcclxuXHJcbiAgICAgICAgfSxcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIHBheW1lbnRUeXBlOiAnR2lmdCBDYXJkJyxcclxuICAgICAgICAgICAgdHlwZTogJ1RNQ19HSUZUQ0FSRCcsXHJcbiAgICAgICAgICAgIHRlbmRlclR5cGU6ICc1JyxcclxuICAgICAgICAgICAgdGVuZGVyU3ViVHlwZTogJzgnXHJcbiAgICAgICAgfVxyXG4gICAgXVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHRyYW5zYWN0aW9uRG9jPzogVHJhbnNhY3Rpb25Eb2N1bWVudCkge1xyXG4gICAgICAgIGlmICh0cmFuc2FjdGlvbkRvYykge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB0cmFuc2FjdGlvbkRvYztcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgPSB7XHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblJlZjogXCJcIixcclxuICAgICAgICAgICAgICAgIGRhdGVUaW1lOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICAgICAgICAgIHN0b3JlSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICAgICAgICAgIGRldmljZUlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdGVybWluYWxJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHVzZXJJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiZUJhc2tldFwiLFxyXG4gICAgICAgICAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGJhc2tldDoge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgYmFza2V0U3VtbWFyeToge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgYmFzZUN1cnJlbmN5OiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdHlwZTogXCJcIixcclxuICAgICAgICAgICAgICAgIG9wZXJhdGlvblN0YXR1czogXCJcIixcclxuICAgICAgICAgICAgICAgIGNyZWF0ZWRBdDogXCJcIixcclxuICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogXCJcIixcclxuICAgICAgICAgICAgICAgIGlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsczoge30gYXMgYW55LFxyXG4gICAgICAgICAgICAgICAgc2FsZVRvdGFsOiAwLFxyXG4gICAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluaXRpbGl6ZUl0ZW1Db3VudCgpO1xyXG4gICAgICAgIHRoaXMuc2V0TGluZU51bWJlckZvclByb2R1Y3RzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UG9zYmFza2V0SW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydLZXl3b3JkJ10gPSB0aGlzLmdlbmVyYXRlS2V5d29yZCgpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0lEJ10gPSB0aGlzLmdlbmVyYXRlSWQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnWE1MU2NoZW1hVmVyc2lvbiddID0gJzInO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0xhc3RVcGRhdGVkJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXBkYXRlZEF0O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ01ham9yVmVyc2lvbiddID0gdGhpcy5tYWpvclZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWlub3JWZXJzaW9uJ10gPSB0aGlzLm1pbm9yVmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydNYW5pZmVzdFZlcnNpb24nXSA9IHRoaXMubWFuaWZlc3RWZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0RhdGFiYXNlU2NoZW1hVmVyc2lvbiddID0gdGhpcy5kYXRhYmFzZVNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0VHlwZSddID0gdGhpcy5iYXNrZXRUeXBlO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1N0YXRlJ10gPSB0aGlzLmdldFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnRXh0ZXJuYWxTdGF0ZSddID0gdGhpcy5leHRlcm5hbFN0YXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0aGVhZGVySW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRpbWVab25lT2Zmc2V0ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5nZW5lcmF0ZVRpbWV6b25lb2Zmc2V0KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQpKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5EYXRlVGltZUNyZWF0ZWQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5Db21wYW55SUQgPSB0aGlzLmNvbXBhbnlJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5CcmFuY2hJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudGVybWluYWxOdW1iZXI7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LlRyYW5zYWN0aW9uTnVtYmVyID0gdGhpcy50cmFuc2FjdGlvbk51bWJlcjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UYXhNZXRob2RJRCA9IHRoaXMudGF4TWV0aG9kSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRHluYW1pY1N0b2NrTG9va3VwID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpOy8vdG9kb1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkJhc2tldExhbmd1YWdlSUQgPSB0aGlzLmJhc2tldExhbmd1YWdlSWQ7IC8vdG9kb1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkJhc2tldENvdW50cnlJRCA9IHRoaXMuYmFza2V0Q291bnRyeUlkOyAvL3RvZG9cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRDdXJyZW5jeUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UcmFkaW5nUmVnaW9uSUQgPSB0aGlzLnRyYWRpbmdSZWdpb25JZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5FdXJvem9uZSA9IFwiIFwiOy8vdW5rbm93blxyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm9CYXNlRXhjaGFuZ2VSYXRlID0gXCJcIjsgLy91bmtub3duXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uUHJpbnRhYmxlTmFtZSA9IFwiXCI7IC8vdW5rbm93blxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICByak1hcHBlcigpIHtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRSkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ01vZGlmaWVySXRlbSddID0gW107XHJcblxyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGxpbmVEaXNjb3VudCA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBsaW5lRGlzY291bnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5maWx0ZXIoKHg6IGFueSkgPT4geC5pdGVtTGluZUlkID09PSBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmluZGV4T2YobGluZURpc2NvdW50WzBdKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnNwbGljZShpbmRleCwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHRoaXMuYWRkUHJvZHVjdChlbGVtZW50LCAobGluZURpc2NvdW50Lmxlbmd0aCA+IDAgPyBsaW5lRGlzY291bnRbMF0gOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShsaW5lRGlzY291bnQubGVuZ3RoID4gMCA/IGxpbmVEaXNjb3VudFswXSA6IG51bGwsIGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuUkVGVU5EKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uRG9jOiBhbnkgPSBuZXcgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIoKS5iYXNrZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpLmJ1aWxkKCk7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddLnB1c2goZGF0YSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShlbGVtZW50LmxpbmVEaXNjb3VudCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFJldHVybiddID0gW107XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0cmFuc2FjdGlvbkRvYzogYW55ID0gbmV3IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyKCkuYmFza2V0KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKS5idWlsZCgpO1xyXG4gICAgICAgICAgICB0cmFuc2FjdGlvbkRvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXR1cm5Qcm9kdWN0ID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKHJldHVyblByb2R1Y3QpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkUHJvZHVjdCA9IHRoaXMuYWRkUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goYWRkUHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShlbGVtZW50LmxpbmVEaXNjb3VudCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2tldERpc2NvdW50KCkge1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10gPSBbXTtcclxuICAgICAgICBpZiAoIXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCkgcmV0dXJuIHRoaXM7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge31cclxuICAgICAgICAgICAgb2JqWydYTUxTY2hlbWFWZXJzaW9uJ10gPSAxO1xyXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSBlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCA/IGVsZW1lbnQuZGlzY291bnRBbW91bnQgOiAtZWxlbWVudC5kaXNjb3VudEFtb3VudDtcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDAgPyBlbGVtZW50LmRpc2NvdW50QW1vdW50IDogLWVsZW1lbnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgICAgICAgIG9ialsnRGVzY3JpcHRpb24nXSA9IGVsZW1lbnQucmVhc29uQ29kZTtcclxuICAgICAgICAgICAgb2JqWydVc2VySUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudXNlcklkO1xyXG4gICAgICAgICAgICBvYmpbJ1JlYXNvbkNvZGVJRCddID0gZWxlbWVudC5yZWFzb25Db2RlO1xyXG4gICAgICAgICAgICBvYmpbJ0Rpc2NvdW50VHlwZSddID0gZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpID8gMCA6IDE7IC8vIHRvZG8gLSBjb21wYXJlIHZhbHVlcyBcclxuICAgICAgICAgICAgb2JqWydSb3VuZGluZ1J1bGUnXSA9IDI7XHJcbiAgICAgICAgICAgIG9ialsnTW9kaWZpZWRMaW5lTnVtYmVyICddID0gW107XHJcblxyXG4gICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWRzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgb2JqWydNb2RpZmllZExpbmVOdW1iZXInXS5wdXNoKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb2JqWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpO1xyXG5cclxuICAgICAgICAgICAgLy8gb2JqWydEaXNjb3VudGVkVmFsdWUnXSA9IG9ialsnZGlzY291bnRBbW91bnQnXSAvLyB0b2RvIC0gY29uZmlybSB2YWx1ZSBiZWZvcmUgZGlzY291bnQ7XHJcbiAgICAgICAgICAgIC8vIG9ialsnRGlzY291bnRQZXJjZW50YWdlJ10gPSBvYmpbJ2Rpc2NvdW50QW1vdW50J10gLyAxMDAgOyAvLyB0b2RvIC0gb3B0aW9uYWxcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Jhc2tldERpc2NvdW50J10ucHVzaChvYmopO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1vZGlmaWVySXRlbShkYXRhOiBhbnksIGxpbmVObzogYW55KSB7XHJcbiAgICAgICAgaWYgKGRhdGEgJiYgbGluZU5vKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICBvYmouWE1MU2NoZW1hVmVyc2lvbiA9IDE7XHJcbiAgICAgICAgICAgIG9iai5MaW5lTnVtYmVyID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gMDtcclxuICAgICAgICAgICAgb2JqLkVmZmVjdGl2ZU5ldFZhbHVlID0gMDtcclxuICAgICAgICAgICAgb2JqLkRlc2NyaXB0aW9uID0gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lID8gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lIDogZGF0YS5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcclxuICAgICAgICAgICAgb2JqLkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICAgICAgb2JqLlVzZXJJRCA9IHRoaXMudXNlcklkO1xyXG4gICAgICAgICAgICBvYmouRGF0ZVRpbWVDcmVhdGVkID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVwZGF0ZWRBdDtcclxuICAgICAgICAgICAgb2JqLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy51c2VySWQ7XHJcbiAgICAgICAgICAgIG9iai5SZWFzb25Db2RlSUQgPSBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUgPyBkYXRhLnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUgOiBkYXRhLnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICBvYmouTW9kaWZpZWRMaW5lTnVtYmVyID0gbGluZU5vO1xyXG4gICAgICAgICAgICBvYmouTW9kaWZpZWRJbmRleCA9IDE7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXS5wdXNoKG9iaik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFRyYWlsZXJJbmZvKCkge1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5EYXRlVGltZUNvbXBsZXRlZCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5ID0ge307XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkRldmljZUlEID0gdGhpcy5kZXZpY2VJZDsgLy90b2RvXHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LkNhc2hpZXJJRCA9IHRoaXMuY2FzaGllcklkOyAvL3RvZG9cclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5CcmFuY2hJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50ZXJtaW5hbElkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Ub3RhbCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsICogMTAwKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbUNvdW50ID0gdGhpcy5pdGVtQ291bnQ7IC8vZ2l2ZXMgdG90YWwgY291bnQgZm9yIHByb2R1Y3RcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbVF1YW50aXR5ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLk5ldEl0ZW1RdWFudGl0eSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5UYXhUb3RhbCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuU2VxdWVuY2VEZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLlNlcXVlbmNlTnVtYmVyID0gJ3Nuc24nIC8vc3RhdGljIGZvciBub3dcclxuXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnVHJhaWxlciddWydUYXhJdGVtJ10gPSBbXTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcblxyXG4gICAgICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgb2JqWydUYXhSYXRlJ10gPSBlbGVtZW50LlZBVDtcclxuICAgICAgICAgICAgb2JqWydUYXhhYmxlVG90YWwnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQudGF4YWJsZUFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnVGF4VG90YWwnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQudGF4TGluZVRvdGFsKTtcclxuICAgICAgICAgICAgb2JqWydUYXhEZXNjcmlwdGlvbiddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5WQVRDb2RlKTtcclxuICAgICAgICAgICAgb2JqWydUYXhJbmNsdWRlZCddID0gJzEnO1xyXG4gICAgICAgICAgICBvYmpbJ1RheFBlcmNlbnRhZ2UnXSA9IGVsZW1lbnQuVkFUOyAvLyB0b2RvXHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1RheEl0ZW0nXS5wdXNoKG9iailcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gVE9ETzogbWFrZSBUcmFpbGVyIG9iamVjdCBmcm9tIHByb21vdGlvblxyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddID0gW107XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSUQnXSA9IGVsZW1lbnQucHJvbW90aW9uSWQ7XHJcbiAgICAgICAgICAgIG9ialsnUHJvbW90aW9uU2F2aW5nJ10gPSBlbGVtZW50LnByb21vdGlvbkFtb3VudCA8IDAgPyBlbGVtZW50LnByb21vdGlvbkFtb3VudCA6IC1lbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25RdWFudGl0eSddID0gXCJcIjsgLy8gdG9kbyAtIG5vdCBhdmFpYWxibGVcclxuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25EZXNjcmlwdGlvbiddID0gZWxlbWVudC5kaXNwbGF5VGV4dDtcclxuXHJcbiAgICAgICAgICAgIG9ialsnUHJvbW90aW9uSGl0J11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXROdW1iZXInXSA9IFwiXCIgLy8gdG9kbztcclxuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0UXVhbnRpdHknXSA9IFwiXCIgLy8gdG9kbztcclxuICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0U2F2aW5nJ10gPSBcIlwiIC8vIHRvZG87XHJcblxyXG4gICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIGVsZW1lbnQudHJpZ2dlci5mb3JFYWNoKChzdWJFbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBvYmpTdWI6IGFueSA9IHt9O1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0ubGluZUl0ZW1JZCA9PSBzdWJFbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICAgICAgb2JqU3ViWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICBvYmpTdWJbJ1Byb2R1Y3RJRCddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PT0gc3ViRWxlbWVudC5pdGVtTGluZUlkKS5TS1U7XHJcbiAgICAgICAgICAgICAgICBvYmpTdWJbJ1VuaXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5wcm9tb3Rpb25MaW5lUHJpY2UgLyBwcm9kdWN0LnF1YW50aXR5KTtcclxuICAgICAgICAgICAgICAgIG9ialN1YlsnTGluZU51bWJlciddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoc3ViRWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgICAgIG9ialN1YlsnUXVhbnRpdHknXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHN1YkVsZW1lbnQucXVhbnRpdHkudG9GaXhlZCgxKSk7XHJcbiAgICAgICAgICAgICAgICBvYmpTdWJbJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkuVkFUQ29kZTsgLy8gdG9kb1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddLnB1c2gob2JqU3ViKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXS5wdXNoKG9iaik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5yak9iamVjdCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGVuZGVySW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10gPSBbXTtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucGF5bWVudFR5cGVzLmZpbHRlcih4ID0+IHgucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gZWxlbWVudC5wYXltZW50VHlwZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBheW1lbnRUeXBlLnRvVXBwZXJDYXNlKCkgPT09ICdHSUZUIENBUkQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogdGhpcy54bWxTY2hlbWFWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiAoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKHZhbHVlWzBdLnBheW1lbnRUeXBlLCBlbGVtZW50KSwvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy51c2VySWQsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogdmFsdWVbMF0udGVuZGVyVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogdmFsdWVbMF0udGVuZGVyU3ViVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBHaWZ0Vm91Y2hlclNhbGVzQWxsb3dlZDogJycsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93UmVjaGFyZ2VhYmxlVm91Y2hlclNhbGVzOiAnJywvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJJRDogJydcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddLnB1c2gob2JqKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajEgPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiAoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IEpTT04uc3RyaW5naWZ5KC0xICogKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKHZhbHVlWzBdLnBheW1lbnRUeXBlLCBlbGVtZW50KSwvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy51c2VySWQsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogdmFsdWVbMF0udGVuZGVyVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogdmFsdWVbMF0udGVuZGVyU3ViVHlwZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiBKU09OLnN0cmluZ2lmeSgtMSAqIChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeUlEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW5jeURlc2NyaXB0aW9uOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBJbmNsdWRlSW5UcmFuc2FjdGlvblRvdGFsQ2hlY2s6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1JlY2hhcmdlYWJsZVZvdWNoZXJTYWxlczogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5EcmF3ZXJBdEVuZDogXCIxXCJcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnQ2FzaFRlbmRlciddLnB1c2gob2JqMSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExpbmVOdW1iZXJGb3JQcm9kdWN0cygpIHtcclxuICAgICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gW107XHJcbiAgICAgICAgaXRlbUxpbmVJZEFycmF5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5tYXAoKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocHJvZHVjdC5pdGVtTGluZUlkKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMubGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGE6IGFueSwgYjogYW55KSA9PiBNYXRoLm1heChhLCBiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVMaW5lTnVtYmVyKCkge1xyXG4gICAgICAgIHRoaXMubGFyZ2VzdE51bWJlciArPSAxO1xyXG4gICAgICAgIHRoaXMuaXRlbUNvdW50ICs9IDE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFyZ2VzdE51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWxpemVJdGVtQ291bnQoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtQ291bnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yak9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXNjcmlwdGlvbihwYXltZW50VHlwZTogc3RyaW5nLCBlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAocGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0NBUkQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNhcmRUeXBlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gcGF5bWVudFR5cGVcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGV2aWNlSW5mbyhpZDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VJZCA9IGlkXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRVc2VySW5mbyhpZDogYW55KSB7XHJcbiAgICAgICAgdGhpcy51c2VySWQgPSBpZDtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHJlbW92ZURlY2ltYWwodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiB2YWx1ZSAqIDEwMDtcclxuICAgIH1cclxuXHJcbiAgICBzZXRUcmFuc2FjdGlvbk51bWJlcih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbk51bWJlciA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFuaWZlc3RWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1hbmlmZXN0VmVyc2lvbiA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGF0YWJhc2VTY2hlbWFWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmRhdGFiYXNlU2NoZW1hVmVyc2lvbiA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFza2V0VHlwZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRUeXBlID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRUcmFkaW5nUmVnaW9uSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudHJhZGluZ1JlZ2lvbklkID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldENvbXBhbnlJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5jb21wYW55SWQgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGF4TWV0aG9kSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudGF4TWV0aG9kSWQgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWFqb3JWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1ham9yVmVyc2lvbiA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRNaW5vclZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMubWlub3JWZXJzaW9uID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldFhNTFNjaGVtYVZlcnNpb24odmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMueG1sU2NoZW1hVmVyc2lvbiA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRFeHRlcm5hbFN0YXRlKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmV4dGVybmFsU3RhdGUgPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0Q2FzaGllcklEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmNhc2hpZXJJZCA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VGVybWluYWxOdW1iZXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudGVybWluYWxOdW1iZXIgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNrZXRMYW5ndWFnZUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldExhbmd1YWdlSWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgIHNldEJhc2tldENvdW50cnlJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRDb3VudHJ5SWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRCYXNrZXRDdXJyZW5jeUlEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLmJhc2tldEN1cnJlbmN5SWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUlkKGRhdGU6IGFueSkge1xyXG4gICAgICAgIGxldCBuZXdEYXRlVGltZSA9IGRhdGUucmVwbGFjZSgvW14wLTldL2csICcnKVxyXG4gICAgICAgIGxldCBpZCA9ICh0aGlzLmRldmljZUlkICsgJ3wnICsgbmV3RGF0ZVRpbWUgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgIHJldHVybiBpZDtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZVRpbWV6b25lb2Zmc2V0KGRhdGU6IGFueSkge1xyXG4gICAgICAgIGxldCB4ID0gZGF0ZSA/IGRhdGUgOiAnJztcclxuICAgICAgICByZXR1cm4gbmV3IERhdGUoeCkuZ2V0VGltZXpvbmVPZmZzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUtleXdvcmQoKSB7XHJcbiAgICAgICAgbGV0IHggPSAodGhpcy5jb21wYW55SWQgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZCArICd8JyArIHRoaXMudGVybWluYWxOdW1iZXIgKyAnfCcgKyB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyKS50b1N0cmluZygpO1xyXG4gICAgICAgIHJldHVybiB4O1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0YXRlKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub3BlcmF0aW9uU3RhdHVzID09PSAnUEFZX1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQ29tcGxldGVkJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiAnQ2FuY2VsbGVkJztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuUHJvZHVjdChlbGVtZW50OiBhbnksIGxpbmVEaXNjb3VudDogTGluZURpc2NvdW50KSB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0ge31cclxuXHJcbiAgICAgICAgb2JqWydMaW5lTnVtYmVyJ10gPSBlbGVtZW50WydpdGVtTGluZUlkJ107XHJcbiAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XHJcbiAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3JlZnVuZGVkVG90YWwnXSk7XHJcbiAgICAgICAgb2JqWydEZXNjcmlwdGlvbiddID0gZWxlbWVudFsnZGVzY3JpcHRpb24nXTtcclxuICAgICAgICBvYmpbJ0RldmljZUlEJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnRbJ3Rlcm1pbmFsSWQnXTtcclxuICAgICAgICBvYmpbJ1VzZXJJRCddID0gdGhpcy51c2VySWQ7XHJcbiAgICAgICAgb2JqWydEYXRlVGltZUNyZWF0ZWQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudFsnY3JlYXRlZEF0J107XHJcbiAgICAgICAgb2JqWydFeHRlbmRlZFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsndG90YWxMaW5lUHJpY2UnXSk7XHJcbiAgICAgICAgb2JqWydVbml0UHJpY2UnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50WydwcmljZSddKTtcclxuICAgICAgICBvYmpbJ1F1YW50aXR5J10gPSBlbGVtZW50WydyZWZ1bmRlZFF1YW50aXR5J10gPCAwID8gZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddLnRvRml4ZWQoMSkgOiAtZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddLnRvRml4ZWQoMSk7XHJcbiAgICAgICAgb2JqWydPcmlnaW5hbFRheEFtb3VudFNldCddID0gMTtcclxuICAgICAgICBvYmpbJ1Byb2R1Y3RJRCddID0gZWxlbWVudFsnU0tVJ107XHJcbiAgICAgICAgb2JqWydIYW5kS2V5ZWQnXSA9IDE7XHJcbiAgICAgICAgb2JqWydMb25nRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ2Rlc2NyaXB0aW9uJ107XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXSA9IHt9O1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ11bJ1JldHVyblJlYXNvbklEJ10gPSBlbGVtZW50WydyZWZ1bmRlZFJlYXNvbiddO1xyXG4gICAgICAgIG9ialsnUmV0dXJuJ11bJ1JldHVybkRlc2NyaXB0aW9uJ10gPSBlbGVtZW50WydyZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uJ107XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuVG9TdG9jayddID0gZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddID4gMCA/IGVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSA6IC0xICogZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddO1xyXG4gICAgICAgIG9ialsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKS5WQVRDb2RlO1xyXG5cclxuICAgICAgICBvYmpbJ0Rpc3BsYXlUYXhDb2RlJ10gPSAnJzsgLy8gdG9kb1xyXG4gICAgICAgIG9ialsnUHJvZHVjdEF0dHJpYnV0ZXMnXSA9ICcnOyAvL3RvZG8gLSBub3QgcmVxdWlyZWRcclxuICAgICAgICBvYmpbJ1BlcmlzaGFibGUnXSA9IHRoaXMuZ2V0QXR0cmlidXRlcygpO1xyXG4gICAgICAgIG9ialsnTU1Hcm91cElEJ10gPSB0aGlzLmdldEF0dHJpYnV0ZXMoKTtcclxuICAgICAgICBvYmpbJ0N1c3RvbWVyRGV0YWlscyddID0gXCJcIjsgLy8gdG9kbyAtIGJsYW5rXHJcbiAgICAgICAgb2JqWydUb3RhbFByb21vdGlvblNhdmluZyddID0gZWxlbWVudFsncHJvbW90aW9uQW1vdW50J10gfHwgLTE7IC8vIFRPRE9cclxuICAgICAgICBsZXQgdGF4VG90YWwgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pO1xyXG4gICAgICAgIG9ialsnT3JpZ2luYWxUYXhBbW91bnQnXSA9IHRheFRvdGFsLnRheExpbmVUb3RhbCA8IDAgPyB0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsKSA6IHRoaXMucmVtb3ZlRGVjaW1hbCgtdGF4VG90YWwudGF4TGluZVRvdGFsKTsgLy90b2RvXHJcbiAgICAgICAgb2JqWyd0YXhBbW91bnQnXSA9IHRheFRvdGFsLnRheExpbmVUb3RhbCA8IDAgPyB0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsKSA6IHRoaXMucmVtb3ZlRGVjaW1hbCgtdGF4VG90YWwudGF4TGluZVRvdGFsKTtcclxuXHJcbiAgICAgICAgaWYgKGxpbmVEaXNjb3VudCkge1xyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWUgJiYgbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGUpIHtcclxuICAgICAgICAgICAgICAgIC8vIGxpbmUgZGlzY291bnRcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSkgKiAtMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJEZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy51c2VySWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRUeXBlID0gbGluZURpc2NvdW50LmRpc2NvdW50VHlwZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCArIChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRlZFZhbHVlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLkRpc2NvdW50UGVyY2VudGFnZSA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRWYWx1ZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Sb3VuZGluZ1J1bGUgPSAyO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAobGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlICYmIGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZSkge1xyXG4gICAgICAgICAgICAgICAgLy9wcmljZSBvdmVycmlkZVxyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJEYXRlVGltZSA9IG9iai5EYXRlVGltZUNyZWF0ZWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbklEID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJSZWFzb25EZXNjcmlwdGlvbiA9IGxpbmVEaXNjb3VudC5wcmljZU92ZXJyaWRlUmVhc29uTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy51c2VySWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk5ld1ByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uT3JpZ2luYWxQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIHByb2R1Y3QgcHJpY2VcclxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgb2JqLkVmZmVjdGl2ZU5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgb2JqLkV4dGVuZGVkVmFsdWUgPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICBvYmouVW5pdFByaWNlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkUHJvZHVjdChlbGVtZW50OiBUUHJvZHVjdCwgbGluZURpc2NvdW50OiBMaW5lRGlzY291bnQpIHtcclxuXHJcbiAgICAgICAgbGV0IG9iajogYW55ID0ge1xyXG4gICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXHJcbiAgICAgICAgICAgIExpbmVOdW1iZXI6IGVsZW1lbnQuaXRlbUxpbmVJZCxcclxuICAgICAgICAgICAgTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcclxuICAgICAgICAgICAgRWZmZWN0aXZlTmV0VmFsdWU6IHRoaXMucmVtb3ZlRGVjaW1hbChlbGVtZW50LnRvdGFsTGluZVByaWNlKSxcclxuICAgICAgICAgICAgRGVzY3JpcHRpb246IGVsZW1lbnQuZGVzY3JpcHRpb24sXHJcbiAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLCAvL3RvIGRvXHJcbiAgICAgICAgICAgIFVzZXJJRDogdGhpcy51c2VySWQsLy90byBkbyxcclxuICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0LFxyXG4gICAgICAgICAgICBFeHRlbmRlZFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC5wcmljZSksXHJcbiAgICAgICAgICAgIFVuaXRQcmljZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQucHJpY2UpLFxyXG4gICAgICAgICAgICBNTUdyb3VwSUQ6IHRoaXMuZ2V0QXR0cmlidXRlcygpLCAvL3RvZG9cclxuICAgICAgICAgICAgUXVhbnRpdHk6IGVsZW1lbnQucXVhbnRpdHkudG9GaXhlZCgxKSxcclxuICAgICAgICAgICAgU2FsZXNwZXJzb25JRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJJZCxcclxuICAgICAgICAgICAgU2FsZXNwZXJzb25OYW1lOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgIFRheENvZGU6IDAsIC8vdG9kb1xyXG4gICAgICAgICAgICBUYXhNb2RpZmlhYmxlOiAxLCAvL3RvZG9cclxuICAgICAgICAgICAgVGF4QW1vdW50OiAwLC8vdG9kb1xyXG4gICAgICAgICAgICBPcmlnaW5hbFRheEFtb3VudDogMCwvL3RvZG9cclxuICAgICAgICAgICAgT3JpZ2luYWxUYXhBbW91bnRTZXQ6IDEsLy90b2RvXHJcbiAgICAgICAgICAgIFByb2R1Y3RJRDogZWxlbWVudC5TS1UsXHJcbiAgICAgICAgICAgIEhhbmRLZXllZDogMSwvL3RvZG9cclxuICAgICAgICAgICAgQ3VzdG9tZXJEZXRhaWxzOiBcIlwiLFxyXG4gICAgICAgICAgICBQZXJpc2hhYmxlOiB0aGlzLmdldEF0dHJpYnV0ZXMoKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGluZURpc2NvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbGluZSBkaXNjb3VudFxyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQudW5pdFByaWNlKSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGF0ZVRpbWUgPSBvYmouRGF0ZVRpbWVDcmVhdGVkO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5Nb2RpZmllckRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudFR5cGUgPSBsaW5lRGlzY291bnQuZGlzY291bnRUeXBlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ICsgKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApKTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlJvdW5kaW5nUnVsZSA9IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGUgJiYgbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvL3ByaWNlIG92ZXJyaWRlXHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbkRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnVzZXJJZDtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTmV3UHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDAgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxyXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnRXh0ZW5kZWRWYWx1ZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnVW5pdFByaWNlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydFRvU3RyaW5nKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSwgJyBjYW4gbm90IGJlIGNvbnZlcnRlZCBpbiBzdHJpbmcnLCBlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVEeW5hbWljU3RvY2tMb29rVXAoKSB7XHJcbiAgICAgICAgbGV0IHggPSAnMCc7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVsaXZlcnlNZXRob2QgPT09ICcxJyB8fCBlbGVtZW50LmRlbGl2ZXJ5TWV0aG9kID09PSAnMicpIHtcclxuICAgICAgICAgICAgICAgIHggPSAnMSc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4geDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRBdHRyaWJ1dGVzKCl7XHJcbiAgICAgICAgbGV0IG5hbWU6IHN0cmluZyB8IGFueVtdID0gW11cclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQuYXR0cmlidXRlcy5maWx0ZXIoKHg6IGFueSkgPT4geC5uYW1lLnRvVXBwZXJDYXNlKCkgPT09IGVsZW1lbnQubmFtZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmIChuYW1lLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5hbWVbMF0udmFsdWVcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZXtcclxuICAgICAgICAgICAgcmV0dXJuIFwiXCJcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=