@pmcretail/mapper-library 0.0.44 → 0.0.46

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 (39) hide show
  1. package/README.md +24 -24
  2. package/bundles/pmcretail-mapper-library.umd.js +4373 -4105
  3. package/bundles/pmcretail-mapper-library.umd.js.map +1 -1
  4. package/esm2015/lib/RJ-mapper.class.js +877 -875
  5. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -1240
  6. package/esm2015/lib/WebReturn-mapper.class.js +326 -324
  7. package/esm2015/lib/WebReturnMagentoV2Rest.class.js +262 -0
  8. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -410
  9. package/esm2015/lib/basket.service.js +527 -516
  10. package/esm2015/lib/mapper-library.component.js +26 -26
  11. package/esm2015/lib/mapper-library.model.js +40 -39
  12. package/esm2015/lib/mapper-library.module.js +21 -21
  13. package/esm2015/lib/number-util.service.js +42 -40
  14. package/esm2015/pmcretail-mapper-library.js +4 -4
  15. package/esm2015/public-api.js +10 -9
  16. package/fesm2015/pmcretail-mapper-library.js +3733 -3458
  17. package/fesm2015/pmcretail-mapper-library.js.map +1 -1
  18. package/lib/RJ-mapper.class.d.ts +80 -79
  19. package/lib/RJ-mapper.class.d.ts.map +1 -1
  20. package/lib/TransactionDocumentBuilder.d.ts +271 -270
  21. package/lib/TransactionDocumentBuilder.d.ts.map +1 -1
  22. package/lib/WebReturn-mapper.class.d.ts +27 -26
  23. package/lib/WebReturn-mapper.class.d.ts.map +1 -1
  24. package/lib/WebReturnMagentoV2Rest.class.d.ts +29 -0
  25. package/lib/WebReturnMagentoV2Rest.class.d.ts.map +1 -0
  26. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
  27. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -1
  28. package/lib/basket.service.d.ts +105 -104
  29. package/lib/basket.service.d.ts.map +1 -1
  30. package/lib/mapper-library.component.d.ts +8 -8
  31. package/lib/mapper-library.model.d.ts +694 -693
  32. package/lib/mapper-library.model.d.ts.map +1 -1
  33. package/lib/mapper-library.module.d.ts +7 -7
  34. package/lib/number-util.service.d.ts +13 -12
  35. package/lib/number-util.service.d.ts.map +1 -1
  36. package/package.json +2 -2
  37. package/pmcretail-mapper-library.d.ts +5 -5
  38. package/public-api.d.ts +6 -5
  39. package/public-api.d.ts.map +1 -1
@@ -0,0 +1,262 @@
1
+ import { INITIATING_MODULE, PROVIDERS } from "./mapper-library.model";
2
+ import { NumberUtilService } from "./number-util.service";
3
+ import { AppLoggerService } from '@pmcretail/common-services/common/app-logger.service';
4
+ export class WebReturnMagentoV2RestMapperBuilderClass {
5
+ constructor(orderDetails, currencyPipe) {
6
+ this.currencyPipe = currencyPipe;
7
+ this.className = "WebReturnMagentoV2RestMapperBuilderClass";
8
+ this.webReturnObject = {
9
+ id: '',
10
+ orgCode: "",
11
+ storeId: "",
12
+ storeNodeId: "",
13
+ storeNodeStructure: "",
14
+ deviceId: "",
15
+ terminalId: "",
16
+ initiatingModule: "",
17
+ export: false,
18
+ isInStoreOrder: false,
19
+ basket: {},
20
+ basketSummary: {},
21
+ baseCurrency: "",
22
+ customer: {
23
+ id: '',
24
+ email: '',
25
+ firstName: '',
26
+ lastName: '',
27
+ billingAddress: [],
28
+ shippingAddress: [],
29
+ shipmentDetails: [],
30
+ telephone: '',
31
+ postCode: '',
32
+ noCustomerSelected: false
33
+ },
34
+ currentTransactionDetails: {}
35
+ };
36
+ if (orderDetails) {
37
+ this.orderDetails = orderDetails;
38
+ }
39
+ this.numberUtilService = new NumberUtilService(currencyPipe);
40
+ }
41
+ webReturnCommonMapper() {
42
+ AppLoggerService.logDebug(this.className, "webReturnCommonMapper", "webReturnCommonMapper started...");
43
+ // this.webReturnObject['type'] = TRANSACTION_TYPE.WEB_RETURNS; // TODO
44
+ this.webReturnObject['datetime'] = this.getUTCDateTime(this.orderDetails.updated_at);
45
+ this.webReturnObject.baseCurrency = this.orderDetails.order_currency_code;
46
+ this.webReturnObject.subsidiaryId = '1';
47
+ this.webReturnObject.export = true;
48
+ this.webReturnObject.initiatingModule = INITIATING_MODULE.EBASKET;
49
+ this.webReturnObject.createdAt = this.getUTCDateTime(this.orderDetails.created_at);
50
+ this.webReturnObject.updatedAt = this.getUTCDateTime(this.orderDetails.updated_at);
51
+ this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.orderDetails.updated_at);
52
+ this.webReturnObject['externalTransactionId'] = this.orderDetails.increment_id;
53
+ AppLoggerService.logDebug(this.className, "webReturnCommonMapper", "webReturnCommonMapper ended...");
54
+ return this;
55
+ }
56
+ // getDeliveryMethod() {
57
+ // if(this.orderDetails.shipments && this.orderDetails.shipments.length > 0) {
58
+ // const shipToStoreShipment = this.orderDetails.shipments.find(shipment => shipment.c_fromStoreId);
59
+ // if(shipToStoreShipment) return DELIVERY_METHODS.SHIP_TO_STORE;
60
+ // else return DELIVERY_METHODS.DELIVERY;
61
+ // } else {
62
+ // return '';
63
+ // }
64
+ // }
65
+ product() {
66
+ AppLoggerService.logDebug(this.className, "product", "product mapping started...");
67
+ this.webReturnObject.basket['products'] = [];
68
+ if (this.orderDetails.items && this.orderDetails.items.length > 0) {
69
+ let index = 0;
70
+ this.orderDetails.items.forEach((product) => {
71
+ if (product && product.base_price) {
72
+ const productObj = {
73
+ description: product.name ? product.name : '',
74
+ SKU: product.sku ? product.sku : '',
75
+ quantity: product.qty_ordered ? product.qty_ordered : 0,
76
+ refundedQuantity: product.qty_refunded ? product.qty_refunded : 0,
77
+ price: product.base_price ? product.base_price : 0,
78
+ itemLineId: (index + 1).toString(),
79
+ externalItemLineId: product.item_id ? product.item_id : (index + 1).toString(),
80
+ // deliveryMethod: this.getDeliveryMethod().toString(),
81
+ totalLinePrice: (product.qty_ordered && product.base_price) ? (product.qty_ordered * product.base_price) : 0
82
+ };
83
+ this.webReturnObject.basket['products'].push(productObj);
84
+ index++;
85
+ }
86
+ });
87
+ }
88
+ AppLoggerService.logDebug(this.className, "product", "product mapping ended...");
89
+ return this;
90
+ }
91
+ linePromotion() {
92
+ AppLoggerService.logDebug(this.className, "linePromotion", "linePromotion mapping started...");
93
+ this.webReturnObject.basket['linePromotion'] = [];
94
+ if (this.orderDetails.items && this.orderDetails.items.length > 0) {
95
+ let index = 0;
96
+ this.orderDetails.items.forEach((product) => {
97
+ if (product && product.base_price) {
98
+ let linePromotionObj = {};
99
+ let trigger = {};
100
+ trigger.itemLineId = (index + 1).toString();
101
+ trigger.quantity = product.qty_ordered ? product.qty_ordered : 0;
102
+ linePromotionObj.trigger = [];
103
+ linePromotionObj.trigger.push(trigger);
104
+ linePromotionObj.itemLineId = index + 1;
105
+ linePromotionObj.promotionId = '';
106
+ linePromotionObj.displayText = this.orderDetails.coupon_code ? this.orderDetails.coupon_code : '';
107
+ linePromotionObj.promotionType = '';
108
+ linePromotionObj.promotionAmount = product.discount_amount ? product.discount_amount : 0;
109
+ linePromotionObj.name = this.orderDetails.coupon_code ? this.orderDetails.coupon_code : '';
110
+ ;
111
+ linePromotionObj.promotionInfo = '';
112
+ linePromotionObj.promotionLinePrice = product.row_total ? product.row_total : 0;
113
+ this.webReturnObject.basket.linePromotion.push(linePromotionObj);
114
+ index++;
115
+ }
116
+ });
117
+ }
118
+ AppLoggerService.logDebug(this.className, "linePromotion", "linePromotion mapping ended...");
119
+ return this;
120
+ }
121
+ customer() {
122
+ AppLoggerService.logDebug(this.className, "customer", "customer mapping started...");
123
+ this.webReturnObject.customer.id = this.orderDetails.customer_id ? this.orderDetails.customer_id : '';
124
+ this.webReturnObject.customer.email = this.orderDetails.customer_email ? this.orderDetails.customer_email : '';
125
+ this.webReturnObject.customer.firstName = this.orderDetails.customer_firstname ? this.orderDetails.customer_firstname : '';
126
+ this.webReturnObject.customer.lastName = this.orderDetails.customer_lastname ? this.orderDetails.customer_lastname : '';
127
+ const isShipping = this.orderDetails.extension_attributes &&
128
+ Object.values(this.orderDetails.extension_attributes).length > 0 && this.orderDetails.extension_attributes.shipping_assignments &&
129
+ this.orderDetails.extension_attributes.shipping_assignments.length > 0;
130
+ if (isShipping) {
131
+ this.orderDetails.extension_attributes.shipping_assignments.forEach(shipment => {
132
+ if (shipment.shipping && Object.values(shipment.shipping) && shipment.shipping.address && Object.values(shipment.shipping.address)) {
133
+ const address = shipment.shipping.address;
134
+ let shippingAddressObj = {};
135
+ shippingAddressObj.id = address.customer_address_id ? address.customer_address_id : '';
136
+ shippingAddressObj.countryCode = address.country_id ? address.country_id : '';
137
+ if (address.street && address.street.length > 0) {
138
+ shippingAddressObj.address1 = address.street[0] ? address.street[0] : '';
139
+ shippingAddressObj.address2 = address.street[1] ? address.street[1] : '';
140
+ shippingAddressObj.address3 = address.street[2] ? address.street[2] : '';
141
+ }
142
+ shippingAddressObj.city = address.city ? address.city : '';
143
+ shippingAddressObj.country = '';
144
+ shippingAddressObj.postCode = address.postcode ? address.postcode : '';
145
+ this.webReturnObject.customer.shippingAddress.push(shippingAddressObj);
146
+ }
147
+ });
148
+ }
149
+ if (this.orderDetails.billing_address && Object.values(this.orderDetails.billing_address).length > 0) {
150
+ const address = this.orderDetails.billing_address;
151
+ let billingAddressObj = {};
152
+ billingAddressObj.id = address.customer_address_id ? address.customer_address_id : '';
153
+ billingAddressObj.countryCode = address.country_id ? address.country_id : '';
154
+ if (address.street && address.street.length > 0) {
155
+ billingAddressObj.address1 = address.street[0] ? address.street[0] : '';
156
+ billingAddressObj.address2 = address.street[1] ? address.street[1] : '';
157
+ billingAddressObj.address3 = address.street[2] ? address.street[2] : '';
158
+ }
159
+ billingAddressObj.city = address.city ? address.city : '';
160
+ billingAddressObj.country = '';
161
+ billingAddressObj.postCode = address.postcode ? address.postcode : '';
162
+ this.webReturnObject.customer.shippingAddress.push(billingAddressObj);
163
+ }
164
+ // let shipmentDetails = [] as ShipmentDetails[];
165
+ // this.orderDetails.shipments.forEach(
166
+ // shipment => {
167
+ // let shipmentDetailsObj = {} as ShipmentDetails;
168
+ // shipmentDetailsObj.id = shipment.shipment_id ? shipment.shipment_id : '';
169
+ // shipmentDetailsObj.deliveryGroup = shipment.shipment_id ? shipment.shipment_id : '';
170
+ // shipmentDetails.push(shipmentDetailsObj);
171
+ // }
172
+ // );
173
+ // customerObj.shipmentDetails = shipmentDetails;
174
+ // this.webReturnObject.customer = customerObj;
175
+ AppLoggerService.logDebug(this.className, "customer", "customer mapping ended...");
176
+ return this;
177
+ }
178
+ isInStoreOrder() {
179
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping started...");
180
+ this.webReturnObject.isInStoreOrder = false;
181
+ AppLoggerService.logDebug(this.className, "isInStoreOrder", "isInStoreOrder mapping ended...");
182
+ return this;
183
+ }
184
+ externalTransactionDetails() {
185
+ AppLoggerService.logDebug(this.className, "externalTransactionDetails", "externalTransactionDetails mapping started...");
186
+ let externalTransactionDetails = [];
187
+ let externalTransactionDetailsObj = {};
188
+ let transactionInfo = {};
189
+ externalTransactionDetailsObj.uniqueId = this.orderDetails.increment_id ? this.orderDetails.increment_id : '';
190
+ externalTransactionDetailsObj.providerType = PROVIDERS.MAGENTO;
191
+ externalTransactionDetails.push(externalTransactionDetailsObj);
192
+ this.webReturnObject.externalTransactionDetails = externalTransactionDetails;
193
+ AppLoggerService.logDebug(this.className, "externalTransactionDetails", "externalTransactionDetails mapping ended...");
194
+ return this;
195
+ }
196
+ basketSummary() {
197
+ AppLoggerService.logDebug(this.className, "basketSummary", "basketSummary mapping started...");
198
+ let basketSummary = {};
199
+ let basketSummaryWebOrder = {};
200
+ const linePromotionTotal = this.webReturnObject.basket.linePromotion.map(linePromotion => linePromotion.promotionAmount).reduce((accumulator, currentValue) => accumulator + currentValue, 0);
201
+ const transactionPromotionTotal = 0;
202
+ basketSummary.discountTotal = linePromotionTotal + transactionPromotionTotal;
203
+ basketSummary.VATTotal = this.orderDetails.tax_amount ? this.orderDetails.tax_amount : 0;
204
+ basketSummary.saleTotal = this.orderDetails.subtotal ? this.orderDetails.subtotal : 0;
205
+ basketSummary.basketTotal = (this.orderDetails.subtotal && this.orderDetails.total_online_refunded) ? (this.orderDetails.subtotal - this.orderDetails.total_online_refunded) : 0;
206
+ basketSummary.totalItems = this.orderDetails.total_qty_ordered ? this.orderDetails.total_qty_ordered.length : 0;
207
+ basketSummary.shippingTotal = this.orderDetails.shipping_incl_tax ? this.orderDetails.shipping_incl_tax : 0;
208
+ basketSummary.basketTotalWithShippingTotal = this.orderDetails.total_invoiced ? this.orderDetails.total_invoiced : 0;
209
+ basketSummaryWebOrder.shippingTotal = this.orderDetails.shipping_incl_tax ? this.orderDetails.shipping_incl_tax : 0;
210
+ basketSummaryWebOrder.basketTotalWithShippingTotal = this.orderDetails.total_invoiced ? this.orderDetails.total_invoiced : 0;
211
+ basketSummary.webOrder = basketSummaryWebOrder;
212
+ this.webReturnObject.basketSummary = basketSummary;
213
+ AppLoggerService.logDebug(this.className, "basketSummary", "basketSummary mapping ended...");
214
+ return this;
215
+ }
216
+ deviceId(deviceId) {
217
+ this.webReturnObject.deviceId = deviceId;
218
+ return this;
219
+ }
220
+ terminalId(terminalId) {
221
+ this.webReturnObject.terminalId = terminalId;
222
+ return this;
223
+ }
224
+ orgCode(orgCode) {
225
+ this.webReturnObject.orgCode = orgCode;
226
+ return this;
227
+ }
228
+ storeId() {
229
+ this.webReturnObject.storeId = this.orderDetails.store_id;
230
+ return this;
231
+ }
232
+ storeNodeId(storeNodeId) {
233
+ this.webReturnObject.storeNodeId = storeNodeId;
234
+ return this;
235
+ }
236
+ storeNodeStructure(storeNodeStructure) {
237
+ this.webReturnObject.storeNodeStructure = storeNodeStructure;
238
+ return this;
239
+ }
240
+ docId(docId) {
241
+ this.webReturnObject.id = docId;
242
+ return this;
243
+ }
244
+ updateUserID(userID) {
245
+ this.webReturnObject.userId = userID;
246
+ return this;
247
+ }
248
+ updateUserName(name) {
249
+ this.webReturnObject.userName = name;
250
+ return this;
251
+ }
252
+ build() {
253
+ AppLoggerService.logDebug(this.className, "build", "mapping done...");
254
+ return this.webReturnObject;
255
+ }
256
+ getUTCDateTime(date) {
257
+ if (date) {
258
+ return new Date(date).toISOString();
259
+ }
260
+ }
261
+ }
262
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuTWFnZW50b1YyUmVzdC5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hcHBlci1saWJyYXJ5L3NyYy9saWIvV2ViUmV0dXJuTWFnZW50b1YyUmVzdC5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQXdJLGlCQUFpQixFQUFnQyxTQUFTLEVBQXFLLE1BQU0sd0JBQXdCLENBQUM7QUFDN1ksT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFFeEYsTUFBTSxPQUFPLHdDQUF3QztJQWtDakQsWUFBWSxZQUFpQixFQUNqQixZQUEyQjtRQUEzQixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQWpDdkMsY0FBUyxHQUFHLDBDQUEwQyxDQUFDO1FBRS9DLG9CQUFlLEdBQXdCO1lBQzNDLEVBQUUsRUFBRSxFQUFFO1lBQ04sT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtZQUNYLFdBQVcsRUFBRSxFQUFFO1lBQ2Ysa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxFQUFFO2dCQUNOLEtBQUssRUFBRSxFQUFFO2dCQUNULFNBQVMsRUFBRSxFQUFFO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLFNB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TyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkYsa0JBQWtCLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFFOUUsSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDN0Msa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDekUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3QkFDekUsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztxQkFDNUU7b0JBRUQsa0JBQWtCLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDM0Qsa0JBQWtCLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztvQkFDaEMsa0JBQWtCLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDdkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxR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QWUsQ0FBQyxrQkFBa0IsR0FBRyxrQkFBa0IsQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDaEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELFlBQVksQ0FBQyxNQUFjO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsY0FBYyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELEtBQUs7UUFDRCxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDaEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFJO1FBQ2YsSUFBSSxJQUFJLEVBQUU7WUFDTixPQUFPLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ3VycmVuY3lQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBBZGRyZXNzLCBCYXNrZXRTdW1tYXJ5LCBCYXNrZXRTdW1tYXJ5RGV0YWlscywgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlscywgQ3VzdG9tZXIsIERFTElWRVJZX01FVEhPRFMsIFBST01PVElPTl9MRVZFTCwgUFJPTU9USU9OX1RZUEUsIElOSVRJQVRJTkdfTU9EVUxFLCBMaW5lUHJvbW90aW9ucywgT3JkZXJEZXRhaWxzLCBQUk9WSURFUlMsIFNoaXBtZW50RGV0YWlscywgVFJBTlNBQ1RJT05fVFlQRSwgVHJhbnNhY3Rpb25Eb2N1bWVudCwgVHJhbnNhY3Rpb25JbmZvLCBUcmFuc2FjdGlvblByb21vdGlvbiwgVHJpZ2dlciwgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMsIFRQcm9kdWN0LCBSZWZ1bmRQcm9kdWN0Q2hhbmdlIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIjtcclxuaW1wb3J0IHsgTnVtYmVyVXRpbFNlcnZpY2UgfSBmcm9tIFwiLi9udW1iZXItdXRpbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFwcExvZ2dlclNlcnZpY2UgfSBmcm9tICdAcG1jcmV0YWlsL2NvbW1vbi1zZXJ2aWNlcy9jb21tb24vYXBwLWxvZ2dlci5zZXJ2aWNlJztcclxuXHJcbmV4cG9ydCBjbGFzcyBXZWJSZXR1cm5NYWdlbnRvVjJSZXN0TWFwcGVyQnVpbGRlckNsYXNzIHtcclxuXHJcbiAgICBjbGFzc05hbWUgPSBcIldlYlJldHVybk1hZ2VudG9WMlJlc3RNYXBwZXJCdWlsZGVyQ2xhc3NcIjtcclxuICAgIHByaXZhdGUgb3JkZXJEZXRhaWxzOiBhbnk7XHJcbiAgICBwcml2YXRlIHdlYlJldHVybk9iamVjdDogVHJhbnNhY3Rpb25Eb2N1bWVudCA9IHtcclxuICAgICAgICBpZDogJycsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiXCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBpc0luU3RvcmVPcmRlcjogZmFsc2UsXHJcbiAgICAgICAgYmFza2V0OiB7fSxcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5OiB7fSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgY3VzdG9tZXI6IHtcclxuICAgICAgICAgICAgaWQ6ICcnLFxyXG4gICAgICAgICAgICBlbWFpbDogJycsXHJcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXHJcbiAgICAgICAgICAgIGxhc3ROYW1lOiAnJyxcclxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IFtdLFxyXG4gICAgICAgICAgICBzaGlwbWVudERldGFpbHM6IFtdLFxyXG4gICAgICAgICAgICB0ZWxlcGhvbmU6ICcnLFxyXG4gICAgICAgICAgICBwb3N0Q29kZTogJycsXHJcbiAgICAgICAgICAgIG5vQ3VzdG9tZXJTZWxlY3RlZDogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNcclxuICAgIH1cclxuICAgIG51bWJlclV0aWxTZXJ2aWNlOiBhbnk7XHJcblxyXG4gICAgY29uc3RydWN0b3Iob3JkZXJEZXRhaWxzOiBhbnksXHJcbiAgICAgICAgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGVcclxuICAgICAgICApIHtcclxuICAgICAgICBpZiAob3JkZXJEZXRhaWxzKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzID0gb3JkZXJEZXRhaWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlID0gbmV3IE51bWJlclV0aWxTZXJ2aWNlKGN1cnJlbmN5UGlwZSk7XHJcbiAgICB9XHJcblxyXG4gICAgd2ViUmV0dXJuQ29tbW9uTWFwcGVyKCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyXCIsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3RbJ3R5cGUnXSA9IFRSQU5TQUNUSU9OX1RZUEUuV0VCX1JFVFVSTlM7IC8vIFRPRE9cclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnZGF0ZXRpbWUnXSA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFzZUN1cnJlbmN5ID0gdGhpcy5vcmRlckRldGFpbHMub3JkZXJfY3VycmVuY3lfY29kZTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdWJzaWRpYXJ5SWQgPSAnMSc7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZXhwb3J0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pbml0aWF0aW5nTW9kdWxlID0gSU5JVElBVElOR19NT0RVTEUuRUJBU0tFVDtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5jcmVhdGVkQXQgPSB0aGlzLmdldFVUQ0RhdGVUaW1lKHRoaXMub3JkZXJEZXRhaWxzLmNyZWF0ZWRfYXQpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVwZGF0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudHJhbnNDb21wbGV0ZWRBdCA9IHRoaXMuZ2V0VVRDRGF0ZVRpbWUodGhpcy5vcmRlckRldGFpbHMudXBkYXRlZF9hdCk7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2V4dGVybmFsVHJhbnNhY3Rpb25JZCddID0gdGhpcy5vcmRlckRldGFpbHMuaW5jcmVtZW50X2lkO1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyXCIsIFwid2ViUmV0dXJuQ29tbW9uTWFwcGVyIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldERlbGl2ZXJ5TWV0aG9kKCkge1xyXG4gICAgLy8gICAgIGlmKHRoaXMub3JkZXJEZXRhaWxzLnNoaXBtZW50cyAmJiB0aGlzLm9yZGVyRGV0YWlscy5zaGlwbWVudHMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICBjb25zdCBzaGlwVG9TdG9yZVNoaXBtZW50ID0gdGhpcy5vcmRlckRldGFpbHMuc2hpcG1lbnRzLmZpbmQoc2hpcG1lbnQgPT4gc2hpcG1lbnQuY19mcm9tU3RvcmVJZCk7XHJcbiAgICAvLyAgICAgICAgIGlmKHNoaXBUb1N0b3JlU2hpcG1lbnQpIHJldHVybiBERUxJVkVSWV9NRVRIT0RTLlNISVBfVE9fU1RPUkU7XHJcbiAgICAvLyAgICAgICAgIGVsc2UgcmV0dXJuIERFTElWRVJZX01FVEhPRFMuREVMSVZFUlk7XHJcbiAgICAvLyAgICAgfSBlbHNlIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vIH1cclxuXHJcbiAgICBwcm9kdWN0KCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwicHJvZHVjdFwiLCBcInByb2R1Y3QgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXSA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLm9yZGVyRGV0YWlscy5pdGVtcyAmJiB0aGlzLm9yZGVyRGV0YWlscy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHByb2R1Y3QgJiYgcHJvZHVjdC5iYXNlX3ByaWNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2R1Y3RPYmogPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogcHJvZHVjdC5uYW1lID8gcHJvZHVjdC5uYW1lIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTS1U6IHByb2R1Y3Quc2t1ID8gcHJvZHVjdC5za3UgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXR5OiBwcm9kdWN0LnF0eV9vcmRlcmVkID8gcHJvZHVjdC5xdHlfb3JkZXJlZCA6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZ1bmRlZFF1YW50aXR5OiBwcm9kdWN0LnF0eV9yZWZ1bmRlZCA/IHByb2R1Y3QucXR5X3JlZnVuZGVkIDogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcm9kdWN0LmJhc2VfcHJpY2UgPyBwcm9kdWN0LmJhc2VfcHJpY2UgOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsSXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtX2lkID8gcHJvZHVjdC5pdGVtX2lkIDogKGluZGV4ICsgMSkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5TWV0aG9kOiB0aGlzLmdldERlbGl2ZXJ5TWV0aG9kKCkudG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGluZVByaWNlOiAocHJvZHVjdC5xdHlfb3JkZXJlZCAmJiBwcm9kdWN0LmJhc2VfcHJpY2UpID8gKHByb2R1Y3QucXR5X29yZGVyZWQgKiBwcm9kdWN0LmJhc2VfcHJpY2UpIDogMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXS5wdXNoKHByb2R1Y3RPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJwcm9kdWN0XCIsIFwicHJvZHVjdCBtYXBwaW5nIGVuZGVkLi4uXCIpO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGxpbmVQcm9tb3Rpb24oKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJsaW5lUHJvbW90aW9uXCIsIFwibGluZVByb21vdGlvbiBtYXBwaW5nIHN0YXJ0ZWQuLi5cIik7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10gPSBbXSBhcyBMaW5lUHJvbW90aW9uc1tdO1xyXG4gICAgICAgIGlmICh0aGlzLm9yZGVyRGV0YWlscy5pdGVtcyAmJiB0aGlzLm9yZGVyRGV0YWlscy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMub3JkZXJEZXRhaWxzLml0ZW1zLmZvckVhY2goXHJcbiAgICAgICAgICAgICAgICAocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QuYmFzZV9wcmljZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGluZVByb21vdGlvbk9iaiA9IHt9IGFzIExpbmVQcm9tb3Rpb25zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJpZ2dlciA9IHt9IGFzIFRyaWdnZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuaXRlbUxpbmVJZCA9IChpbmRleCArIDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF0eV9vcmRlcmVkID8gcHJvZHVjdC5xdHlfb3JkZXJlZCA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoudHJpZ2dlciA9IFtdIGFzIFRyaWdnZXJbXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai50cmlnZ2VyLnB1c2godHJpZ2dlcik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUHJvbW90aW9uT2JqLml0ZW1MaW5lSWQgPSBpbmRleCArIDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uSWQgPSAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai5kaXNwbGF5VGV4dCA9IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlID8gdGhpcy5vcmRlckRldGFpbHMuY291cG9uX2NvZGUgOiAnJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluZVByb21vdGlvbk9iai5wcm9tb3Rpb25UeXBlID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uQW1vdW50ID0gcHJvZHVjdC5kaXNjb3VudF9hbW91bnQgPyBwcm9kdWN0LmRpc2NvdW50X2Ftb3VudCA6IDA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoubmFtZSA9IHRoaXMub3JkZXJEZXRhaWxzLmNvdXBvbl9jb2RlID8gdGhpcy5vcmRlckRldGFpbHMuY291cG9uX2NvZGUgOiAnJzs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb25PYmoucHJvbW90aW9uSW5mbyA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5lUHJvbW90aW9uT2JqLnByb21vdGlvbkxpbmVQcmljZSA9IHByb2R1Y3Qucm93X3RvdGFsID8gcHJvZHVjdC5yb3dfdG90YWwgOiAwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQubGluZVByb21vdGlvbi5wdXNoKGxpbmVQcm9tb3Rpb25PYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCsrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwibGluZVByb21vdGlvblwiLCBcImxpbmVQcm9tb3Rpb24gbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuICAgICAgXHJcbiAgICBjdXN0b21lcigpIHtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImN1c3RvbWVyXCIsIFwiY3VzdG9tZXIgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmlkID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfaWQgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9pZCA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmVtYWlsID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfZW1haWwgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9lbWFpbCA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmZpcnN0TmFtZSA9IHRoaXMub3JkZXJEZXRhaWxzLmN1c3RvbWVyX2ZpcnN0bmFtZSA/IHRoaXMub3JkZXJEZXRhaWxzLmN1c3RvbWVyX2ZpcnN0bmFtZSA6ICcnO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLmxhc3ROYW1lID0gdGhpcy5vcmRlckRldGFpbHMuY3VzdG9tZXJfbGFzdG5hbWUgPyB0aGlzLm9yZGVyRGV0YWlscy5jdXN0b21lcl9sYXN0bmFtZSA6ICcnO1xyXG5cclxuICAgICAgICBjb25zdCBpc1NoaXBwaW5nID0gdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMgJiYgXHJcbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXModGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMpLmxlbmd0aCA+IDAgJiYgdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMuc2hpcHBpbmdfYXNzaWdubWVudHMgJiZcclxuICAgICAgICAgICAgdGhpcy5vcmRlckRldGFpbHMuZXh0ZW5zaW9uX2F0dHJpYnV0ZXMuc2hpcHBpbmdfYXNzaWdubWVudHMubGVuZ3RoID4gMDtcclxuICAgICAgICBcclxuICAgICAgICBpZiAoaXNTaGlwcGluZykge1xyXG4gICAgICAgICAgICB0aGlzLm9yZGVyRGV0YWlscy5leHRlbnNpb25fYXR0cmlidXRlcy5zaGlwcGluZ19hc3NpZ25tZW50cy5mb3JFYWNoKFxyXG4gICAgICAgICAgICAgICAgc2hpcG1lbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHNoaXBtZW50LnNoaXBwaW5nICYmIE9iamVjdC52YWx1ZXMoc2hpcG1lbnQuc2hpcHBpbmcpICYmIHNoaXBtZW50LnNoaXBwaW5nLmFkZHJlc3MgJiYgT2JqZWN0LnZhbHVlcyhzaGlwbWVudC5zaGlwcGluZy5hZGRyZXNzKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRyZXNzID0gc2hpcG1lbnQuc2hpcHBpbmcuYWRkcmVzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNoaXBwaW5nQWRkcmVzc09iaiA9IHt9IGFzIEFkZHJlc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5pZCA9IGFkZHJlc3MuY3VzdG9tZXJfYWRkcmVzc19pZCA/IGFkZHJlc3MuY3VzdG9tZXJfYWRkcmVzc19pZCA6ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouY291bnRyeUNvZGUgPSBhZGRyZXNzLmNvdW50cnlfaWQgPyBhZGRyZXNzLmNvdW50cnlfaWQgOiAnJztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzLnN0cmVldCAmJiBhZGRyZXNzLnN0cmVldC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczEgPSBhZGRyZXNzLnN0cmVldFswXSA/IGFkZHJlc3Muc3RyZWV0WzBdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczIgPSBhZGRyZXNzLnN0cmVldFsxXSA/IGFkZHJlc3Muc3RyZWV0WzFdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3NPYmouYWRkcmVzczMgPSBhZGRyZXNzLnN0cmVldFsyXSA/IGFkZHJlc3Muc3RyZWV0WzJdIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5jaXR5ID0gYWRkcmVzcy5jaXR5ID8gYWRkcmVzcy5jaXR5IDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5jb3VudHJ5ID0gJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzc09iai5wb3N0Q29kZSA9IGFkZHJlc3MucG9zdGNvZGUgPyBhZGRyZXNzLnBvc3Rjb2RlIDogJyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmN1c3RvbWVyLnNoaXBwaW5nQWRkcmVzcy5wdXNoKHNoaXBwaW5nQWRkcmVzc09iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5vcmRlckRldGFpbHMuYmlsbGluZ19hZGRyZXNzICYmIE9iamVjdC52YWx1ZXModGhpcy5vcmRlckRldGFpbHMuYmlsbGluZ19hZGRyZXNzKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGFkZHJlc3MgPSB0aGlzLm9yZGVyRGV0YWlscy5iaWxsaW5nX2FkZHJlc3M7XHJcbiAgICAgICAgICAgIGxldCBiaWxsaW5nQWRkcmVzc09iaiA9IHt9IGFzIEFkZHJlc3M7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmlkID0gYWRkcmVzcy5jdXN0b21lcl9hZGRyZXNzX2lkID8gYWRkcmVzcy5jdXN0b21lcl9hZGRyZXNzX2lkIDogJyc7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmNvdW50cnlDb2RlID0gYWRkcmVzcy5jb3VudHJ5X2lkID8gYWRkcmVzcy5jb3VudHJ5X2lkIDogJyc7XHJcblxyXG4gICAgICAgICAgICBpZiAoYWRkcmVzcy5zdHJlZXQgJiYgYWRkcmVzcy5zdHJlZXQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3NPYmouYWRkcmVzczEgPSBhZGRyZXNzLnN0cmVldFswXSA/IGFkZHJlc3Muc3RyZWV0WzBdIDogJyc7XHJcbiAgICAgICAgICAgICAgICBiaWxsaW5nQWRkcmVzc09iai5hZGRyZXNzMiA9IGFkZHJlc3Muc3RyZWV0WzFdID8gYWRkcmVzcy5zdHJlZXRbMV0gOiAnJztcclxuICAgICAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmFkZHJlc3MzID0gYWRkcmVzcy5zdHJlZXRbMl0gPyBhZGRyZXNzLnN0cmVldFsyXSA6ICcnO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBiaWxsaW5nQWRkcmVzc09iai5jaXR5ID0gYWRkcmVzcy5jaXR5ID8gYWRkcmVzcy5jaXR5IDogJyc7XHJcbiAgICAgICAgICAgIGJpbGxpbmdBZGRyZXNzT2JqLmNvdW50cnkgPSAnJztcclxuICAgICAgICAgICAgYmlsbGluZ0FkZHJlc3NPYmoucG9zdENvZGUgPSBhZGRyZXNzLnBvc3Rjb2RlID8gYWRkcmVzcy5wb3N0Y29kZSA6ICcnO1xyXG4gICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5jdXN0b21lci5zaGlwcGluZ0FkZHJlc3MucHVzaChiaWxsaW5nQWRkcmVzc09iaik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsZXQgc2hpcG1lbnREZXRhaWxzID0gW10gYXMgU2hpcG1lbnREZXRhaWxzW107XHJcbiAgICAgICAgLy8gdGhpcy5vcmRlckRldGFpbHMuc2hpcG1lbnRzLmZvckVhY2goXHJcbiAgICAgICAgLy8gICAgIHNoaXBtZW50ID0+IHtcclxuICAgICAgICAvLyAgICAgICAgIGxldCBzaGlwbWVudERldGFpbHNPYmogPSB7fSBhcyBTaGlwbWVudERldGFpbHM7XHJcbiAgICAgICAgLy8gICAgICAgICBzaGlwbWVudERldGFpbHNPYmouaWQgPSBzaGlwbWVudC5zaGlwbWVudF9pZCA/IHNoaXBtZW50LnNoaXBtZW50X2lkIDogJyc7XHJcbiAgICAgICAgLy8gICAgICAgICBzaGlwbWVudERldGFpbHNPYmouZGVsaXZlcnlHcm91cCA9IHNoaXBtZW50LnNoaXBtZW50X2lkID8gc2hpcG1lbnQuc2hpcG1lbnRfaWQgOiAnJztcclxuICAgICAgICAvLyAgICAgICAgIHNoaXBtZW50RGV0YWlscy5wdXNoKHNoaXBtZW50RGV0YWlsc09iaik7XHJcbiAgICAgICAgLy8gICAgIH1cclxuICAgICAgICAvLyApO1xyXG4gICAgICAgIC8vIGN1c3RvbWVyT2JqLnNoaXBtZW50RGV0YWlscyA9IHNoaXBtZW50RGV0YWlscztcclxuXHJcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuY3VzdG9tZXIgPSBjdXN0b21lck9iajtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImN1c3RvbWVyXCIsIFwiY3VzdG9tZXIgbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBpc0luU3RvcmVPcmRlcigpIHtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImlzSW5TdG9yZU9yZGVyXCIsIFwiaXNJblN0b3JlT3JkZXIgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmlzSW5TdG9yZU9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJpc0luU3RvcmVPcmRlclwiLCBcImlzSW5TdG9yZU9yZGVyIG1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBcImV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzIG1hcHBpbmcgc3RhcnRlZC4uLlwiKTtcclxuICAgICAgICBsZXQgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgPSBbXSBhcyBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc1tdO1xyXG4gICAgICAgIGxldCBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iaiA9IHt9IGFzIGV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzO1xyXG4gICAgICAgIGxldCB0cmFuc2FjdGlvbkluZm8gPSB7fSBhcyBUcmFuc2FjdGlvbkluZm87XHJcbiAgICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHNPYmoudW5pcXVlSWQgPSB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQgPyB0aGlzLm9yZGVyRGV0YWlscy5pbmNyZW1lbnRfaWQgOiAnJztcclxuICAgICAgICBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iai5wcm92aWRlclR5cGUgPSBQUk9WSURFUlMuTUFHRU5UTztcclxuXHJcbiAgICAgICAgZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMucHVzaChleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlsc09iaik7XHJcbiAgICAgICAgXHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgPSBleHRlcm5hbFRyYW5zYWN0aW9uRGV0YWlscztcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImV4dGVybmFsVHJhbnNhY3Rpb25EZXRhaWxzXCIsIFwiZXh0ZXJuYWxUcmFuc2FjdGlvbkRldGFpbHMgbWFwcGluZyBlbmRlZC4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBiYXNrZXRTdW1tYXJ5KCkge1xyXG4gICAgICAgIEFwcExvZ2dlclNlcnZpY2UubG9nRGVidWcodGhpcy5jbGFzc05hbWUsIFwiYmFza2V0U3VtbWFyeVwiLCBcImJhc2tldFN1bW1hcnkgbWFwcGluZyBzdGFydGVkLi4uXCIpO1xyXG4gICAgICAgIGxldCBiYXNrZXRTdW1tYXJ5ID0ge30gYXMgQmFza2V0U3VtbWFyeTtcclxuICAgICAgICBsZXQgYmFza2V0U3VtbWFyeVdlYk9yZGVyID0ge30gYXMgQmFza2V0U3VtbWFyeURldGFpbHM7XHJcbiAgICAgICAgY29uc3QgbGluZVByb21vdGlvblRvdGFsID0gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LmxpbmVQcm9tb3Rpb24ubWFwKGxpbmVQcm9tb3Rpb24gPT4gbGluZVByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQpLnJlZHVjZSgoYWNjdW11bGF0b3IsIGN1cnJlbnRWYWx1ZSkgPT4gYWNjdW11bGF0b3IgKyBjdXJyZW50VmFsdWUsIDApO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uUHJvbW90aW9uVG90YWwgPSAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCA9IGxpbmVQcm9tb3Rpb25Ub3RhbCArIHRyYW5zYWN0aW9uUHJvbW90aW9uVG90YWw7XHJcbiAgICAgICAgYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnRheF9hbW91bnQgPyB0aGlzLm9yZGVyRGV0YWlscy50YXhfYW1vdW50IDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnN1YnRvdGFsID8gdGhpcy5vcmRlckRldGFpbHMuc3VidG90YWwgOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSAodGhpcy5vcmRlckRldGFpbHMuc3VidG90YWwgJiYgdGhpcy5vcmRlckRldGFpbHMudG90YWxfb25saW5lX3JlZnVuZGVkKSA/ICh0aGlzLm9yZGVyRGV0YWlscy5zdWJ0b3RhbCAtIHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX29ubGluZV9yZWZ1bmRlZCkgOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnkudG90YWxJdGVtcyA9IHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX3F0eV9vcmRlcmVkID8gdGhpcy5vcmRlckRldGFpbHMudG90YWxfcXR5X29yZGVyZWQubGVuZ3RoIDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LnNoaXBwaW5nVG90YWwgPSB0aGlzLm9yZGVyRGV0YWlscy5zaGlwcGluZ19pbmNsX3RheCA/IHRoaXMub3JkZXJEZXRhaWxzLnNoaXBwaW5nX2luY2xfdGF4IDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsV2l0aFNoaXBwaW5nVG90YWwgPSB0aGlzLm9yZGVyRGV0YWlscy50b3RhbF9pbnZvaWNlZCA/IHRoaXMub3JkZXJEZXRhaWxzLnRvdGFsX2ludm9pY2VkIDogMDtcclxuICAgICAgICBiYXNrZXRTdW1tYXJ5V2ViT3JkZXIuc2hpcHBpbmdUb3RhbCA9IHRoaXMub3JkZXJEZXRhaWxzLnNoaXBwaW5nX2luY2xfdGF4ID8gdGhpcy5vcmRlckRldGFpbHMuc2hpcHBpbmdfaW5jbF90YXggOiAwO1xyXG4gICAgICAgIGJhc2tldFN1bW1hcnlXZWJPcmRlci5iYXNrZXRUb3RhbFdpdGhTaGlwcGluZ1RvdGFsID0gdGhpcy5vcmRlckRldGFpbHMudG90YWxfaW52b2ljZWQgPyB0aGlzLm9yZGVyRGV0YWlscy50b3RhbF9pbnZvaWNlZCA6IDA7XHJcbiAgICAgICAgYmFza2V0U3VtbWFyeS53ZWJPcmRlciA9IGJhc2tldFN1bW1hcnlXZWJPcmRlcjtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5ID0gYmFza2V0U3VtbWFyeTtcclxuICAgICAgICBBcHBMb2dnZXJTZXJ2aWNlLmxvZ0RlYnVnKHRoaXMuY2xhc3NOYW1lLCBcImJhc2tldFN1bW1hcnlcIiwgXCJiYXNrZXRTdW1tYXJ5IG1hcHBpbmcgZW5kZWQuLi5cIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGV2aWNlSWQoZGV2aWNlSWQpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5kZXZpY2VJZCA9IGRldmljZUlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRlcm1pbmFsSWQodGVybWluYWxJZCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnRlcm1pbmFsSWQgPSB0ZXJtaW5hbElkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIG9yZ0NvZGUob3JnQ29kZSkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0Lm9yZ0NvZGUgPSBvcmdDb2RlO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlSWQoKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVJZCA9IHRoaXMub3JkZXJEZXRhaWxzLnN0b3JlX2lkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5zdG9yZU5vZGVJZCA9IHN0b3JlTm9kZUlkO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3JlTm9kZVN0cnVjdHVyZShzdG9yZU5vZGVTdHJ1Y3R1cmU6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlTm9kZVN0cnVjdHVyZSA9IHN0b3JlTm9kZVN0cnVjdHVyZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBkb2NJZChkb2NJZCkge1xyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmlkID0gZG9jSWQ7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlVXNlcklEKHVzZXJJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXNlcklkID0gdXNlcklEO1xyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVVzZXJOYW1lKG5hbWUpIHtcclxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC51c2VyTmFtZSA9IG5hbWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgYnVpbGQoKSB7XHJcbiAgICAgICAgQXBwTG9nZ2VyU2VydmljZS5sb2dEZWJ1Zyh0aGlzLmNsYXNzTmFtZSwgXCJidWlsZFwiLCBcIm1hcHBpbmcgZG9uZS4uLlwiKTtcclxuICAgICAgICByZXR1cm4gdGhpcy53ZWJSZXR1cm5PYmplY3Q7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VVRDRGF0ZVRpbWUoZGF0ZSkge1xyXG4gICAgICAgIGlmIChkYXRlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=