ravcredit-lib 0.0.2 → 0.0.4

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 (44) hide show
  1. package/esm2022/lib/v1/objects/oAddress.mjs +10 -0
  2. package/esm2022/lib/v1/objects/oBusiness.mjs +2 -0
  3. package/esm2022/lib/v1/objects/oClient.mjs +2 -0
  4. package/esm2022/lib/v1/objects/oConekta.mjs +85 -0
  5. package/esm2022/lib/v1/objects/oContract.mjs +2 -0
  6. package/esm2022/lib/v1/objects/oContractAll.mjs +2 -0
  7. package/esm2022/lib/v1/objects/oCustomer.mjs +18 -0
  8. package/esm2022/lib/v1/objects/oDevice.mjs +2 -0
  9. package/esm2022/lib/v1/objects/oFinancial.mjs +2 -0
  10. package/esm2022/lib/v1/objects/oGlobal.mjs +86 -0
  11. package/esm2022/lib/v1/objects/oLogIn.mjs +17 -0
  12. package/esm2022/lib/v1/objects/oNewPayment.mjs +2 -0
  13. package/esm2022/lib/v1/objects/oNotification.mjs +17 -0
  14. package/esm2022/lib/v1/objects/oPassport.mjs +7 -0
  15. package/esm2022/lib/v1/objects/oUser.mjs +2 -0
  16. package/esm2022/lib/v1/util/UtilBusiness.mjs +171 -0
  17. package/esm2022/lib/v1/util/UtilClient.mjs +221 -0
  18. package/esm2022/lib/v1/util/UtilContract.mjs +331 -0
  19. package/esm2022/lib/v1/util/UtilDynamiCore.mjs +292 -0
  20. package/esm2022/public-api.mjs +20 -2
  21. package/fesm2022/ravcredit-lib.mjs +1243 -1
  22. package/fesm2022/ravcredit-lib.mjs.map +1 -1
  23. package/lib/v1/objects/oAddress.d.ts +10 -0
  24. package/lib/v1/objects/oBusiness.d.ts +101 -0
  25. package/lib/{oClient.d.ts → v1/objects/oClient.d.ts} +0 -1
  26. package/lib/v1/objects/oConekta.d.ts +305 -0
  27. package/lib/v1/objects/oContract.d.ts +23 -0
  28. package/lib/v1/objects/oContractAll.d.ts +21 -0
  29. package/lib/v1/objects/oCustomer.d.ts +17 -0
  30. package/lib/v1/objects/oDevice.d.ts +5 -0
  31. package/lib/v1/objects/oFinancial.d.ts +30 -0
  32. package/lib/v1/objects/oGlobal.d.ts +149 -0
  33. package/lib/v1/objects/oLogIn.d.ts +30 -0
  34. package/lib/v1/objects/oNewPayment.d.ts +11 -0
  35. package/lib/v1/objects/oNotification.d.ts +25 -0
  36. package/lib/v1/objects/oPassport.d.ts +55 -0
  37. package/lib/v1/objects/oUser.d.ts +25 -0
  38. package/lib/v1/util/UtilBusiness.d.ts +52 -0
  39. package/lib/v1/util/UtilClient.d.ts +34 -0
  40. package/lib/v1/util/UtilContract.d.ts +70 -0
  41. package/lib/v1/util/UtilDynamiCore.d.ts +453 -0
  42. package/package.json +1 -1
  43. package/public-api.d.ts +19 -1
  44. package/esm2022/lib/oClient.mjs +0 -2
@@ -0,0 +1,331 @@
1
+ import { UntypedFormArray, UntypedFormControl, Validators } from "@angular/forms";
2
+ import { cClient, cUserReference } from "./UtilClient";
3
+ // import {TaskState} from "firebase/storage";
4
+ import { cBusinessDeadlines } from "./UtilBusiness";
5
+ import { cAddress } from '../objects/oAddress';
6
+ export var eProvider;
7
+ (function (eProvider) {
8
+ eProvider["none"] = "";
9
+ eProvider["Conekta"] = "Conekta";
10
+ eProvider["Passport"] = "Passport";
11
+ eProvider["DynamiCore"] = "DynamiCore";
12
+ })(eProvider || (eProvider = {}));
13
+ // export type ProgressTaskStatus = TaskState | "uploading" | "idle" | "generating" | "unauthorized"
14
+ export const cDevice = {
15
+ device: "",
16
+ IMEI: ""
17
+ };
18
+ export const cFinancial = {
19
+ total: 0,
20
+ initial: 0,
21
+ deadlines: cBusinessDeadlines,
22
+ initDate: 0,
23
+ weeklyPayment: 0,
24
+ pendingOf: [],
25
+ progress: [],
26
+ interest: 0,
27
+ provider: eProvider.DynamiCore,
28
+ financed: 0,
29
+ nextPayment: 0,
30
+ amount_commission_opening: 0,
31
+ principal_disbursed: 0,
32
+ expected_disbursed: 0, // ---------
33
+ credit_type: 'Arrendamiento',
34
+ interest_rate: 0,
35
+ commission_opening: 0,
36
+ interest_arrears: 0,
37
+ };
38
+ export const cContract = {
39
+ id: "",
40
+ client: "",
41
+ address: cAddress,
42
+ device: cDevice,
43
+ financial: cFinancial,
44
+ by: "",
45
+ active: true
46
+ };
47
+ export class FactoryContract {
48
+ static FormClient(client) {
49
+ let data = cClient;
50
+ if (client)
51
+ data = client;
52
+ return {
53
+ name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
54
+ email: new UntypedFormControl(data.username, [Validators.required, Validators.email]),
55
+ phone: new UntypedFormControl(data.phone, [Validators.required, Validators.min(10)]),
56
+ curp: new UntypedFormControl(data.curp, [Validators.required, Validators.minLength(16)]),
57
+ userReferences: new UntypedFormArray([])
58
+ };
59
+ }
60
+ static CreateUserReferenceFormObj(user) {
61
+ let data = cUserReference;
62
+ if (user.name != "")
63
+ data = user;
64
+ return {
65
+ name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
66
+ phone: new UntypedFormControl(data.phone, [Validators.required]),
67
+ relationship: new UntypedFormControl(data.relationship, [Validators.required]),
68
+ };
69
+ }
70
+ static FormAddress(address) {
71
+ let data = cAddress;
72
+ if (address)
73
+ data = address;
74
+ return {
75
+ street: new UntypedFormControl(data.street, Validators.required),
76
+ neighbor: new UntypedFormControl(data.neighbor, Validators.required),
77
+ cp: new UntypedFormControl(data.zip, Validators.required),
78
+ ext: new UntypedFormControl(data.ext, Validators.required),
79
+ int: new UntypedFormControl(data.int),
80
+ city: new UntypedFormControl(data.city, Validators.required),
81
+ state: new UntypedFormControl(data.state, Validators.required),
82
+ };
83
+ }
84
+ static FormDevice(device) {
85
+ let data = cDevice;
86
+ if (device)
87
+ data = device;
88
+ return {
89
+ model: new UntypedFormControl(data.device, Validators.required),
90
+ IMEI: new UntypedFormControl(data.IMEI, Validators.required),
91
+ ID: new UntypedFormControl(data.id),
92
+ };
93
+ }
94
+ static FormFinancial(financial) {
95
+ let data = cFinancial;
96
+ if (financial)
97
+ data = financial;
98
+ data.credit_type = "Arrendamiento";
99
+ // data.deadlines.weeks = cBusinessDeadlines
100
+ return {
101
+ total: new UntypedFormControl(data.total, [Validators.required, Validators.min(1)]),
102
+ initial: new UntypedFormControl(data.initial, [Validators.required]),
103
+ financed: new UntypedFormControl(data.financed, Validators.min(1)),
104
+ weeklyPayment: new UntypedFormControl(data.weeklyPayment, [Validators.required, Validators.min(1)]),
105
+ deadlines: new UntypedFormControl(data.deadlines, [Validators.required]),
106
+ initDate: new UntypedFormControl(data.initDate),
107
+ provider: new UntypedFormControl(data.provider),
108
+ credit_type: new UntypedFormControl(data.credit_type ? data.credit_type : 0),
109
+ interest_rate: new UntypedFormControl(data.interest_rate ? data.interest_rate : 0), // interes credit dynamic
110
+ commission_opening: new UntypedFormControl(data.commission_opening ? data.commission_opening : 0),
111
+ interest_arrears: new UntypedFormControl(data.interest_arrears ? data.interest_arrears : 0), // intereses moratorios dynamic
112
+ amount_commission_opening: new UntypedFormControl(data.amount_commission_opening), // comision por apertura dynamic
113
+ principal_disbursed: new UntypedFormControl(data.principal_disbursed),
114
+ expected_disbursed: new UntypedFormControl(data.expected_disbursed)
115
+ };
116
+ }
117
+ static CreateContractFromFormObj(data, finalPay) {
118
+ const date = new Date();
119
+ const device = {
120
+ device: data["device"][0].model,
121
+ id: data["device"][0].ID,
122
+ IMEI: data["device"][0].IMEI
123
+ };
124
+ const address = {
125
+ street: data["address"][0].street,
126
+ city: data["address"][0].city,
127
+ neighbor: data["address"][0].neighbor,
128
+ zip: data["address"][0].cp,
129
+ ext: data["address"][0].ext,
130
+ int: data["address"][0].int,
131
+ state: data["address"][0].state
132
+ };
133
+ const financial = {
134
+ total: Number(data["financial"][0].total),
135
+ initial: data["financial"][0].initial,
136
+ deadlines: data["financial"][0].deadlines,
137
+ progress: [],
138
+ pendingOf: [],
139
+ weeklyPayment: data["financial"][0].weeklyPayment,
140
+ interest: data["financial"][0].interest_rate,
141
+ finalDate: date.getTime() + (data["financial"][0].deadlines.weeks * (604800 * 1000)),
142
+ initDate: date.getDate(),
143
+ dayCut: date.getDate(),
144
+ provider: data["financial"][0].provider,
145
+ finalPayment: finalPay,
146
+ financed: data["financial"][0].financed,
147
+ nextPayment: data["financial"][0].nextPayment
148
+ };
149
+ if (data["financial"][0].provider == eProvider.DynamiCore) {
150
+ financial.initial = data["financial"][0].amount_commission_opening ? Number(data["financial"][0].amount_commission_opening) : 0;
151
+ financial.expected_disbursed = data["financial"][0].expected_disbursed ? Number(data["financial"][0].expected_disbursed) : 0;
152
+ financial.principal_disbursed = data["financial"][0].principal_disbursed ? Number(data["financial"][0].principal_disbursed) : 0;
153
+ financial.interest_arrears = data["financial"][0].interest_rate ? Number(data["financial"][0].interest_rate) : 0;
154
+ financial.commission_opening = data["financial"][0].commission_opening ? Number(data["financial"][0].commission_opening) : 0;
155
+ financial.credit_type = data["financial"][0].credit_type ? data["financial"][0].credit_type : "";
156
+ financial.clabe = data["financial"][0].clabe ? data["financial"][0].clabe : "";
157
+ }
158
+ if (data["financial"][0].amount_commission_opening != undefined) {
159
+ if (Number(data["financial"][0].amount_commission_opening) > 0)
160
+ financial.initial = Number(data["financial"][0].amount_commission_opening);
161
+ else
162
+ financial.initial = Number(data["financial"][0].initial);
163
+ }
164
+ if (Number(data["financial"][0].amount_commission_opening) > 0)
165
+ financial.amount_commission_opening = Number(data["financial"][0].amount_commission_opening);
166
+ else
167
+ financial.amount_commission_opening = financial.initial;
168
+ if (financial.nextPayment == undefined)
169
+ financial.nextPayment = 0;
170
+ const contract = {
171
+ id: "",
172
+ client: "",
173
+ address: address,
174
+ device: device,
175
+ financial: financial,
176
+ by: "",
177
+ active: true,
178
+ lastPayment: date.getTime(),
179
+ createdAt: date.getTime()
180
+ };
181
+ return contract;
182
+ }
183
+ static CreateContractToConektaObj(data, monthlyPay, finalPay) {
184
+ const o = {};
185
+ const device = {
186
+ device: data.device.device,
187
+ id: data.device.id,
188
+ IMEI: data.device.IMEI
189
+ };
190
+ const address = {
191
+ street: data.address.street,
192
+ city: data.address.city,
193
+ neighbor: data.address.neighbor,
194
+ zip: data.address.zip,
195
+ ext: data.address.ext,
196
+ int: data.address.int,
197
+ state: data.address.state
198
+ };
199
+ const financial = {
200
+ total: data.financial.total,
201
+ initial: data.financial.initial,
202
+ deadlines: data.financial.deadlines,
203
+ progress: data.financial.progress,
204
+ pendingOf: data.financial.pendingOf,
205
+ weeklyPayment: data.financial.weeklyPayment,
206
+ interest: data.financial.interest,
207
+ finalDate: data.financial.finalDate,
208
+ initDate: data.financial.initDate,
209
+ dayCut: data.financial.dayCut,
210
+ provider: data.financial.provider,
211
+ finalPayment: data.financial.finalPayment,
212
+ financed: data.financial.financed,
213
+ nextPayment: data.financial.nextPayment
214
+ };
215
+ const contract = {
216
+ id: "",
217
+ client: "",
218
+ address: address,
219
+ device: device,
220
+ financial: financial,
221
+ by: "",
222
+ active: true
223
+ };
224
+ return contract;
225
+ }
226
+ static CreateAuthForm(username, curp) {
227
+ const password = this.createPassword(curp);
228
+ return {
229
+ username: new UntypedFormControl(username, Validators.required),
230
+ password: new UntypedFormControl(password, Validators.required),
231
+ };
232
+ }
233
+ static createPassword(curp) {
234
+ const _curp = curp.split("");
235
+ let password = "";
236
+ const limit = 7;
237
+ if (_curp.length < 16)
238
+ return "";
239
+ password += _curp[0].toLowerCase();
240
+ for (let i = 1; i <= limit; i++)
241
+ password += _curp[i].toUpperCase();
242
+ password += `*`;
243
+ return password;
244
+ }
245
+ static MapperTypeContCli_Contract(_contract) {
246
+ const contract = {
247
+ id: _contract.contract,
248
+ client: _contract.client,
249
+ address: _contract.address,
250
+ device: _contract.device,
251
+ financial: _contract.financial,
252
+ by: _contract.by,
253
+ active: _contract.active,
254
+ lastPayment: _contract.lastPayment,
255
+ createdAt: _contract.createdAt,
256
+ dynamicAccount: _contract.dynamicAccount,
257
+ };
258
+ return contract;
259
+ }
260
+ static MapperSyncContractDynamic(base, account) {
261
+ let nContract = base;
262
+ let _financial = base.financial;
263
+ let _device = base.device;
264
+ const financial = {
265
+ total: _financial.total,
266
+ initial: account.properties.amount_commission_opening ? account.properties.amount_commission_opening : _financial.initial,
267
+ deadlines: _financial.deadlines,
268
+ progress: _financial.progress ? _financial.progress : [],
269
+ pendingOf: _financial.pendingOf ? _financial.pendingOf : [],
270
+ weeklyPayment: _financial.weeklyPayment,
271
+ interest: _financial.interest,
272
+ finalDate: _financial.finalDate,
273
+ initDate: _financial.initDate,
274
+ dayCut: _financial.dayCut,
275
+ provider: _financial.provider,
276
+ finalPayment: _financial.finalPayment,
277
+ financed: _financial.financed,
278
+ nextPayment: _financial.nextPayment ? _financial.nextPayment : 0,
279
+ amount_commission_opening: account.properties.amount_commission_opening,
280
+ expected_disbursed: account.properties.expected_disbursed ?
281
+ Number(account.properties.expected_disbursed) :
282
+ Number(_financial.expected_disbursed),
283
+ principal_disbursed: account.properties.principal_disbursed ?
284
+ account.properties.principal_disbursed :
285
+ _financial.principal_disbursed,
286
+ commission_opening: account.config.commission_opening ?
287
+ Number(account.config.commission_opening) :
288
+ Number(_financial.commission_opening),
289
+ credit_type: account.config.credit_type ? account.config.credit_type : _financial.credit_type,
290
+ clabe: String(account.properties.clabe ? account.properties.clabe : _financial.clabe)
291
+ };
292
+ const interestArrears = account.config.interest_arrears;
293
+ const prevInterestArrears = _financial.interest_arrears;
294
+ if (interestArrears != undefined) {
295
+ financial.interest_arrears = interestArrears;
296
+ }
297
+ else if (prevInterestArrears != undefined) {
298
+ financial.interest_arrears = prevInterestArrears;
299
+ }
300
+ else {
301
+ financial.interest_arrears = 0;
302
+ }
303
+ const interest = account.config.interest_rate;
304
+ const prevInterest = _financial.interest;
305
+ if (interest != undefined) {
306
+ financial.interest = interest;
307
+ }
308
+ else if (prevInterest != undefined) {
309
+ financial.interest = prevInterest;
310
+ }
311
+ else {
312
+ financial.interest = 0;
313
+ }
314
+ if (account.properties.amount_commission_opening != undefined) {
315
+ if (Number(account.properties.amount_commission_opening) > 0) {
316
+ financial.initial = Number(account.properties.amount_commission_opening);
317
+ financial.amount_commission_opening = Number(account.properties.amount_commission_opening);
318
+ }
319
+ else {
320
+ financial.initial = Number(_financial.initial);
321
+ financial.amount_commission_opening = financial.initial;
322
+ }
323
+ }
324
+ const seller = account.properties.seller_name;
325
+ nContract.by = seller != null ? seller : "";
326
+ nContract.device.id = _device.id ? _device.id : "";
327
+ nContract.financial = financial;
328
+ return nContract;
329
+ }
330
+ }
331
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbENvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmF2Y3JlZGl0LWxpYi9zcmMvbGliL3YxL3V0aWwvVXRpbENvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJbEQsT0FBTyxFQUFDLFFBQVEsRUFBVyxNQUFNLHFCQUFxQixDQUFDO0FBS3ZELE1BQU0sQ0FBTixJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsc0JBQVMsQ0FBQTtJQUNULGdDQUFtQixDQUFBO0lBQ25CLGtDQUFxQixDQUFBO0lBQ3JCLHNDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQjtBQUVELG9HQUFvRztBQUVwRyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQVk7SUFDOUIsTUFBTSxFQUFFLEVBQUU7SUFDVixJQUFJLEVBQUUsRUFBRTtDQUNULENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWU7SUFDcEMsS0FBSyxFQUFFLENBQUM7SUFDUixPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxrQkFBa0I7SUFDN0IsUUFBUSxFQUFFLENBQUM7SUFDWCxhQUFhLEVBQUUsQ0FBQztJQUNoQixTQUFTLEVBQUUsRUFBRTtJQUNiLFFBQVEsRUFBRSxFQUFFO0lBQ1osUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVU7SUFDOUIsUUFBUSxFQUFFLENBQUM7SUFDWCxXQUFXLEVBQUUsQ0FBQztJQUNkLHlCQUF5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LENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF1QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQTtRQUNqRSxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVsRCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2NDbGllbnQsIGNVc2VyUmVmZXJlbmNlfSBmcm9tIFwiLi9VdGlsQ2xpZW50XCI7XG4vLyBpbXBvcnQge1Rhc2tTdGF0ZX0gZnJvbSBcImZpcmViYXNlL3N0b3JhZ2VcIjtcbmltcG9ydCB7Y0J1c2luZXNzRGVhZGxpbmVzfSBmcm9tIFwiLi9VdGlsQnVzaW5lc3NcIjtcbmltcG9ydCB7SURDQWNjb3VudH0gZnJvbSBcIi4vVXRpbER5bmFtaUNvcmVcIjtcbmltcG9ydCB7b0RldmljZX0gZnJvbSAnLi4vb2JqZWN0cy9vRGV2aWNlJztcbmltcG9ydCB7b0ZpbmFuY2lhbH0gZnJvbSAnLi4vb2JqZWN0cy9vRmluYW5jaWFsJztcbmltcG9ydCB7Y0FkZHJlc3MsIG9BZGRyZXNzfSBmcm9tICcuLi9vYmplY3RzL29BZGRyZXNzJztcbmltcG9ydCB7b0NvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29Db250cmFjdCc7XG5pbXBvcnQge29DbGllbnQsIG9Vc2VyUmVmZXJlbmNlfSBmcm9tICcuLi9vYmplY3RzL29DbGllbnQnO1xuaW1wb3J0IHt0eUNsaWVudENvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29HbG9iYWwnO1xuXG5leHBvcnQgZW51bSBlUHJvdmlkZXIge1xuICBub25lID0gXCJcIixcbiAgQ29uZWt0YSA9IFwiQ29uZWt0YVwiLFxuICBQYXNzcG9ydCA9IFwiUGFzc3BvcnRcIixcbiAgRHluYW1pQ29yZSA9IFwiRHluYW1pQ29yZVwiLFxufVxuXG4vLyBleHBvcnQgdHlwZSBQcm9ncmVzc1Rhc2tTdGF0dXMgPSBUYXNrU3RhdGUgfCBcInVwbG9hZGluZ1wiIHwgXCJpZGxlXCIgfCBcImdlbmVyYXRpbmdcIiB8IFwidW5hdXRob3JpemVkXCJcblxuZXhwb3J0IGNvbnN0IGNEZXZpY2U6IG9EZXZpY2UgPSB7XG4gIGRldmljZTogXCJcIixcbiAgSU1FSTogXCJcIlxufVxuXG5leHBvcnQgY29uc3QgY0ZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgdG90YWw6IDAsXG4gIGluaXRpYWw6IDAsXG4gIGRlYWRsaW5lczogY0J1c2luZXNzRGVhZGxpbmVzLFxuICBpbml0RGF0ZTogMCxcbiAgd2Vla2x5UGF5bWVudDogMCxcbiAgcGVuZGluZ09mOiBbXSxcbiAgcHJvZ3Jlc3M6IFtdLFxuICBpbnRlcmVzdDogMCxcbiAgcHJvdmlkZXI6IGVQcm92aWRlci5EeW5hbWlDb3JlLFxuICBmaW5hbmNlZDogMCxcbiAgbmV4dFBheW1lbnQ6IDAsXG4gIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IDAsXG4gIHByaW5jaXBhbF9kaXNidXJzZWQ6IDAsXG4gIGV4cGVjdGVkX2Rpc2J1cnNlZDogMCwgLy8gLS0tLS0tLS0tXG4gIGNyZWRpdF90eXBlOiAnQXJyZW5kYW1pZW50bycsXG4gIGludGVyZXN0X3JhdGU6IDAsXG4gIGNvbW1pc3Npb25fb3BlbmluZzogMCxcbiAgaW50ZXJlc3RfYXJyZWFyczogMCxcbn1cblxuZXhwb3J0IGNvbnN0IGNDb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICBpZDogXCJcIixcbiAgY2xpZW50OiBcIlwiLFxuICBhZGRyZXNzOiBjQWRkcmVzcyxcbiAgZGV2aWNlOiBjRGV2aWNlLFxuICBmaW5hbmNpYWw6IGNGaW5hbmNpYWwsXG4gIGJ5OiBcIlwiLFxuICBhY3RpdmU6IHRydWVcbn1cblxuZXhwb3J0IGNsYXNzIEZhY3RvcnlDb250cmFjdCB7XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtQ2xpZW50KGNsaWVudD86IG9DbGllbnQpIHtcbiAgICBsZXQgZGF0YSA9IGNDbGllbnRcblxuICAgIGlmIChjbGllbnQpIGRhdGEgPSBjbGllbnRcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgZW1haWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS51c2VybmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdKSxcbiAgICAgIHBob25lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucGhvbmUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxMCldKSxcbiAgICAgIGN1cnA6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jdXJwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTYpXSksXG4gICAgICB1c2VyUmVmZXJlbmNlczogbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVVc2VyUmVmZXJlbmNlRm9ybU9iaih1c2VyOiBvVXNlclJlZmVyZW5jZSkge1xuICAgIGxldCBkYXRhID0gY1VzZXJSZWZlcmVuY2VcblxuICAgIGlmICh1c2VyLm5hbWUgIT0gXCJcIikgZGF0YSA9IHVzZXJcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgcGhvbmU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5waG9uZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHJlbGF0aW9uc2hpcDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnJlbGF0aW9uc2hpcCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1BZGRyZXNzKGFkZHJlc3M/OiBvQWRkcmVzcykge1xuICAgIGxldCBkYXRhID0gY0FkZHJlc3NcblxuICAgIGlmIChhZGRyZXNzKSBkYXRhID0gYWRkcmVzc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVldDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnN0cmVldCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBuZWlnaGJvcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLm5laWdoYm9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGNwOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuemlwLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGV4dDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4dCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBpbnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnQpLFxuICAgICAgY2l0eTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNpdHksIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgc3RhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5zdGF0ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtRGV2aWNlKGRldmljZT86IG9EZXZpY2UpIHtcbiAgICBsZXQgZGF0YSA9IGNEZXZpY2VcblxuICAgIGlmIChkZXZpY2UpIGRhdGEgPSBkZXZpY2VcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmRldmljZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJTUVJOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuSU1FSSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJRDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmlkKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1GaW5hbmNpYWwoZmluYW5jaWFsPzogb0ZpbmFuY2lhbCkge1xuICAgIGxldCBkYXRhID0gY0ZpbmFuY2lhbFxuXG4gICAgaWYgKGZpbmFuY2lhbCkgZGF0YSA9IGZpbmFuY2lhbFxuXG4gICAgZGF0YS5jcmVkaXRfdHlwZSA9IFwiQXJyZW5kYW1pZW50b1wiXG4gICAgLy8gZGF0YS5kZWFkbGluZXMud2Vla3MgPSBjQnVzaW5lc3NEZWFkbGluZXNcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnRvdGFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKSxcbiAgICAgIGluaXRpYWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0aWFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZmluYW5jZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5maW5hbmNlZCwgVmFsaWRhdG9ycy5taW4oMSkpLFxuICAgICAgd2Vla2x5UGF5bWVudDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLndlZWtseVBheW1lbnQsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0pLFxuICAgICAgZGVhZGxpbmVzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZGVhZGxpbmVzLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgaW5pdERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0RGF0ZSksXG4gICAgICBwcm92aWRlcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnByb3ZpZGVyKSxcblxuICAgICAgY3JlZGl0X3R5cGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jcmVkaXRfdHlwZSA/IGRhdGEuY3JlZGl0X3R5cGUgOiAwKSxcbiAgICAgIGludGVyZXN0X3JhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnRlcmVzdF9yYXRlID8gZGF0YS5pbnRlcmVzdF9yYXRlIDogMCksIC8vIGludGVyZXMgY3JlZGl0IGR5bmFtaWNcbiAgICAgIGNvbW1pc3Npb25fb3BlbmluZzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNvbW1pc3Npb25fb3BlbmluZyA/IGRhdGEuY29tbWlzc2lvbl9vcGVuaW5nIDogMCksXG4gICAgICBpbnRlcmVzdF9hcnJlYXJzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuaW50ZXJlc3RfYXJyZWFycyA/IGRhdGEuaW50ZXJlc3RfYXJyZWFycyA6IDApLCAvLyBpbnRlcmVzZXMgbW9yYXRvcmlvcyBkeW5hbWljXG5cbiAgICAgIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSwgLy8gY29taXNpb24gcG9yIGFwZXJ0dXJhIGR5bmFtaWNcbiAgICAgIHByaW5jaXBhbF9kaXNidXJzZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5wcmluY2lwYWxfZGlzYnVyc2VkKSxcbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4cGVjdGVkX2Rpc2J1cnNlZClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZUNvbnRyYWN0RnJvbUZvcm1PYmooZGF0YTogYW55LCBmaW5hbFBheTogbnVtYmVyKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IGRldmljZTogb0RldmljZSA9IHtcbiAgICAgIGRldmljZTogZGF0YVtcImRldmljZVwiXVswXS5tb2RlbCxcbiAgICAgIGlkOiBkYXRhW1wiZGV2aWNlXCJdWzBdLklELFxuICAgICAgSU1FSTogZGF0YVtcImRldmljZVwiXVswXS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5zdHJlZXQsXG4gICAgICBjaXR5OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jaXR5LFxuICAgICAgbmVpZ2hib3I6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jcCxcbiAgICAgIGV4dDogZGF0YVtcImFkZHJlc3NcIl1bMF0uZXh0LFxuICAgICAgaW50OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5pbnQsXG4gICAgICBzdGF0ZTogZGF0YVtcImFkZHJlc3NcIl1bMF0uc3RhdGVcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0udG90YWwpLFxuICAgICAgaW5pdGlhbDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogW10sXG4gICAgICB3ZWVrbHlQYXltZW50OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlLFxuICAgICAgZmluYWxEYXRlOiBkYXRlLmdldFRpbWUoKSArIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcy53ZWVrcyAqICg2MDQ4MDAgKiAxMDAwKSksXG4gICAgICBpbml0RGF0ZTogZGF0ZS5nZXREYXRlKCksXG4gICAgICBkYXlDdXQ6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgcHJvdmlkZXI6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IGZpbmFsUGF5LFxuICAgICAgZmluYW5jZWQ6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5uZXh0UGF5bWVudFxuICAgIH1cbiAgICBpZiAoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcm92aWRlciA9PSBlUHJvdmlkZXIuRHluYW1pQ29yZSkge1xuICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCkgOiAwXG4gICAgICBmaW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJpbmNpcGFsX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLnByaW5jaXBhbF9kaXNidXJzZWQpIDogMFxuICAgICAgZmluYW5jaWFsLmludGVyZXN0X2FycmVhcnMgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZyA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZykgOiAwXG4gICAgICBmaW5hbmNpYWwuY3JlZGl0X3R5cGUgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNyZWRpdF90eXBlID8gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5jcmVkaXRfdHlwZSA6IFwiXCJcbiAgICAgIGZpbmFuY2lhbC5jbGFiZSA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY2xhYmUgPyBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNsYWJlIDogXCJcIlxuICAgIH1cblxuICAgIGlmIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgICBmaW5hbmNpYWwuaW5pdGlhbCA9IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgICBlbHNlXG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uaW5pdGlhbClcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgIGVsc2VcbiAgICAgIGZpbmFuY2lhbC5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nID0gZmluYW5jaWFsLmluaXRpYWxcblxuICAgIGlmIChmaW5hbmNpYWwubmV4dFBheW1lbnQgPT0gdW5kZWZpbmVkKSBmaW5hbmNpYWwubmV4dFBheW1lbnQgPSAwXG5cbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBjbGllbnQ6IFwiXCIsXG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IGZpbmFuY2lhbCxcbiAgICAgIGJ5OiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgbGFzdFBheW1lbnQ6IGRhdGUuZ2V0VGltZSgpLFxuICAgICAgY3JlYXRlZEF0OiBkYXRlLmdldFRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQ29udHJhY3RUb0NvbmVrdGFPYmooZGF0YTogb0NvbnRyYWN0LCBtb250aGx5UGF5OiBudW1iZXIsIGZpbmFsUGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBvOiBhbnkgPSB7fVxuXG4gICAgY29uc3QgZGV2aWNlOiBvRGV2aWNlID0ge1xuICAgICAgZGV2aWNlOiBkYXRhLmRldmljZS5kZXZpY2UsXG4gICAgICBpZDogZGF0YS5kZXZpY2UuaWQsXG4gICAgICBJTUVJOiBkYXRhLmRldmljZS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhLmFkZHJlc3Muc3RyZWV0LFxuICAgICAgY2l0eTogZGF0YS5hZGRyZXNzLmNpdHksXG4gICAgICBuZWlnaGJvcjogZGF0YS5hZGRyZXNzLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhLmFkZHJlc3MuemlwLFxuICAgICAgZXh0OiBkYXRhLmFkZHJlc3MuZXh0LFxuICAgICAgaW50OiBkYXRhLmFkZHJlc3MuaW50LFxuICAgICAgc3RhdGU6IGRhdGEuYWRkcmVzcy5zdGF0ZVxuICAgIH1cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogZGF0YS5maW5hbmNpYWwudG90YWwsXG4gICAgICBpbml0aWFsOiBkYXRhLmZpbmFuY2lhbC5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhLmZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogZGF0YS5maW5hbmNpYWwucHJvZ3Jlc3MsXG4gICAgICBwZW5kaW5nT2Y6IGRhdGEuZmluYW5jaWFsLnBlbmRpbmdPZixcbiAgICAgIHdlZWtseVBheW1lbnQ6IGRhdGEuZmluYW5jaWFsLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YS5maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IGRhdGEuZmluYW5jaWFsLmZpbmFsRGF0ZSxcbiAgICAgIGluaXREYXRlOiBkYXRhLmZpbmFuY2lhbC5pbml0RGF0ZSxcbiAgICAgIGRheUN1dDogZGF0YS5maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IGRhdGEuZmluYW5jaWFsLnByb3ZpZGVyLFxuICAgICAgZmluYWxQYXltZW50OiBkYXRhLmZpbmFuY2lhbC5maW5hbFBheW1lbnQsXG4gICAgICBmaW5hbmNlZDogZGF0YS5maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YS5maW5hbmNpYWwubmV4dFBheW1lbnRcbiAgICB9XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBcIlwiLFxuICAgICAgY2xpZW50OiBcIlwiLFxuICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgICAgZmluYW5jaWFsOiBmaW5hbmNpYWwsXG4gICAgICBieTogXCJcIixcbiAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQXV0aEZvcm0odXNlcm5hbWU6IHN0cmluZywgY3VycDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFzc3dvcmQ6IHN0cmluZyA9IHRoaXMuY3JlYXRlUGFzc3dvcmQoY3VycClcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcm5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodXNlcm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgcGFzc3dvcmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wocGFzc3dvcmQsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGFzc3dvcmQoY3VycDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBfY3VycCA9IGN1cnAuc3BsaXQoXCJcIilcbiAgICBsZXQgcGFzc3dvcmQgPSBcIlwiXG4gICAgY29uc3QgbGltaXQgPSA3XG5cbiAgICBpZiAoX2N1cnAubGVuZ3RoIDwgMTYpIHJldHVybiBcIlwiXG5cbiAgICBwYXNzd29yZCArPSBfY3VycFswXS50b0xvd2VyQ2FzZSgpXG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaW1pdDsgaSsrKVxuICAgICAgcGFzc3dvcmQgKz0gX2N1cnBbaV0udG9VcHBlckNhc2UoKVxuXG4gICAgcGFzc3dvcmQgKz0gYCpgXG4gICAgcmV0dXJuIHBhc3N3b3JkXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclR5cGVDb250Q2xpX0NvbnRyYWN0KF9jb250cmFjdDogdHlDbGllbnRDb250cmFjdCk6IG9Db250cmFjdCB7XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBfY29udHJhY3QuY29udHJhY3QhLFxuICAgICAgY2xpZW50OiBfY29udHJhY3QuY2xpZW50LFxuICAgICAgYWRkcmVzczogX2NvbnRyYWN0LmFkZHJlc3MsXG4gICAgICBkZXZpY2U6IF9jb250cmFjdC5kZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IF9jb250cmFjdC5maW5hbmNpYWwsXG4gICAgICBieTogX2NvbnRyYWN0LmJ5LFxuICAgICAgYWN0aXZlOiBfY29udHJhY3QuYWN0aXZlLFxuICAgICAgbGFzdFBheW1lbnQ6IF9jb250cmFjdC5sYXN0UGF5bWVudCxcbiAgICAgIGNyZWF0ZWRBdDogX2NvbnRyYWN0LmNyZWF0ZWRBdCxcbiAgICAgIGR5bmFtaWNBY2NvdW50OiBfY29udHJhY3QuZHluYW1pY0FjY291bnQsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyYWN0XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclN5bmNDb250cmFjdER5bmFtaWMoYmFzZTogb0NvbnRyYWN0LCBhY2NvdW50OiBJRENBY2NvdW50KTogb0NvbnRyYWN0IHtcbiAgICBsZXQgbkNvbnRyYWN0ID0gYmFzZVxuICAgIGxldCBfZmluYW5jaWFsID0gYmFzZS5maW5hbmNpYWxcbiAgICBsZXQgX2RldmljZSA9IGJhc2UuZGV2aWNlXG5cblxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBfZmluYW5jaWFsLnRvdGFsLFxuICAgICAgaW5pdGlhbDogYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA6IF9maW5hbmNpYWwuaW5pdGlhbCxcbiAgICAgIGRlYWRsaW5lczogX2ZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogX2ZpbmFuY2lhbC5wcm9ncmVzcyA/IF9maW5hbmNpYWwucHJvZ3Jlc3MgOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogX2ZpbmFuY2lhbC5wZW5kaW5nT2YgPyBfZmluYW5jaWFsLnBlbmRpbmdPZiA6IFtdLFxuICAgICAgd2Vla2x5UGF5bWVudDogX2ZpbmFuY2lhbC53ZWVrbHlQYXltZW50LFxuICAgICAgaW50ZXJlc3Q6IF9maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IF9maW5hbmNpYWwuZmluYWxEYXRlLFxuICAgICAgaW5pdERhdGU6IF9maW5hbmNpYWwuaW5pdERhdGUsXG4gICAgICBkYXlDdXQ6IF9maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IF9maW5hbmNpYWwucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IF9maW5hbmNpYWwuZmluYWxQYXltZW50LFxuICAgICAgZmluYW5jZWQ6IF9maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogX2ZpbmFuY2lhbC5uZXh0UGF5bWVudCA/IF9maW5hbmNpYWwubmV4dFBheW1lbnQgOiAwLFxuXG4gICAgICBhbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcsXG5cbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDpcbiAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmV4cGVjdGVkX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5leHBlY3RlZF9kaXNidXJzZWQpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQpLFxuXG4gICAgICBwcmluY2lwYWxfZGlzYnVyc2VkOlxuICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMucHJpbmNpcGFsX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLnByaW5jaXBhbF9kaXNidXJzZWQgOlxuICAgICAgICAgIF9maW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCxcblxuICAgICAgY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgICBhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcgP1xuICAgICAgICAgIE51bWJlcihhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcpLFxuXG4gICAgICBjcmVkaXRfdHlwZTpcbiAgICAgICAgYWNjb3VudC5jb25maWcuY3JlZGl0X3R5cGUgPyBhY2NvdW50LmNvbmZpZy5jcmVkaXRfdHlwZSA6IF9maW5hbmNpYWwuY3JlZGl0X3R5cGUsXG5cbiAgICAgIGNsYWJlOlxuICAgICAgICBTdHJpbmcoYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlID8gYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlIDogX2ZpbmFuY2lhbC5jbGFiZSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdEFycmVhcnMgPSBhY2NvdW50LmNvbmZpZy5pbnRlcmVzdF9hcnJlYXJzXG4gICAgY29uc3QgcHJldkludGVyZXN0QXJyZWFycyA9IF9maW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFyc1xuICAgIGlmIChpbnRlcmVzdEFycmVhcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IGludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSBpZiAocHJldkludGVyZXN0QXJyZWFycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gcHJldkludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IDBcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdCA9IGFjY291bnQuY29uZmlnLmludGVyZXN0X3JhdGVcbiAgICBjb25zdCBwcmV2SW50ZXJlc3QgPSBfZmluYW5jaWFsLmludGVyZXN0XG4gICAgaWYgKGludGVyZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0ID0gaW50ZXJlc3RcbiAgICB9IGVsc2UgaWYgKHByZXZJbnRlcmVzdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdCA9IHByZXZJbnRlcmVzdFxuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3QgPSAwXG4gICAgfVxuXG4gICAgaWYgKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKF9maW5hbmNpYWwuaW5pdGlhbClcbiAgICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBmaW5hbmNpYWwuaW5pdGlhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGxlcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gYWNjb3VudC5wcm9wZXJ0aWVzLnNlbGxlcl9uYW1lXG4gICAgbkNvbnRyYWN0LmJ5ID0gc2VsbGVyICE9IG51bGwgPyBzZWxsZXIgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZGV2aWNlLmlkID0gX2RldmljZS5pZCA/IF9kZXZpY2UuaWQgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZmluYW5jaWFsID0gZmluYW5jaWFsXG4gICAgcmV0dXJuIG5Db250cmFjdFxuICB9XG59XG5cbiJdfQ==