bry-biometric-collector 2.2.0-RC02 → 2.2.0

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.
@@ -1,147 +0,0 @@
1
- import { u as D, $ as C, n as y, g, i as b, a as M, s as l, b as h, c as U, F, d as x, e as c, v, f as P, A as B, h as S, j as E, k as W, l as k, m as X, o as w, p as $, q as G } from "./main_a9bb653b_2.2.0-RC02.js";
2
- const d = D(C);
3
- var V = /* @__PURE__ */ ((n) => (n.EXTENSION_MISSING = "EXTENSION_MISSING", n.USER_CANCELLED = "USER_CANCELLED", n.UNAUTHORIZED_EXTENSION = "UNAUTHORIZED_EXTENSION", n.SCANNER_NOT_FOUND = "SCANNER_NOT_FOUND", n.EXTENSION_MODULE_NOT_INSTALLED = "EXTENSION_MODULE_NOT_INSTALLED", n.FINGER_NOT_REMOVED = "FINGER_NOT_REMOVED", n.UNKNOWN_ERROR = "UNKNOWN_ERROR", n.EVALUATE_BIOMETRICS_TIMEOUT = "EVALUATE_BIOMETRICS_TIMEOUT", n.EVALUATE_BIOMETRICS_NETWORK_ISSUE = "EVALUATE_BIOMETRICS_NETWORK_ISSUE", n))(V || {});
4
- class s extends Error {
5
- constructor(a, T) {
6
- super(a), this.status = T;
7
- }
8
- }
9
- async function K(n, a) {
10
- const T = y([n])[0], I = g();
11
- if (b(I))
12
- throw new s(
13
- "Attempting to capture finger but the extension apparently hasn't been properly injected. Received: " + I,
14
- "EXTENSION_MISSING"
15
- /* EXTENSION_MISSING */
16
- );
17
- if (g()) {
18
- if ("isExtensionInstalled" in g() && !await g().isExtensionInstalled())
19
- throw console.error("The extension isn't installed!"), new s(
20
- "The extension isn't installed!",
21
- "EXTENSION_MISSING"
22
- /* EXTENSION_MISSING */
23
- );
24
- M() || await g().installComponents?.([{ type: "fingerPrint" }]);
25
- } else
26
- throw new s(
27
- `The extension variable received is empty: ${g()}!`,
28
- "EXTENSION_MISSING"
29
- /* EXTENSION_MISSING */
30
- );
31
- if (l(!0), h())
32
- throw l(!1), U(!1), new s(
33
- "User cancelled",
34
- "USER_CANCELLED"
35
- /* USER_CANCELLED */
36
- );
37
- let N = null;
38
- try {
39
- N = await I.getFingerprint(
40
- // @ts-ignore TODO: Alex has to fix this functions signature to accept pojo
41
- JSON.stringify(
42
- a ?? { outputFormat: "BASE64", imageFormat: "BMP", nonce: "webCollector", timeout: 3 }
43
- )
44
- );
45
- } catch (e) {
46
- console.error(e);
47
- const t = e;
48
- throw l(!1), t.key === "fingerprint.scanner.timeout" ? new s(
49
- "Fingerprint scan timed out (didn't read a finger.)",
50
- "USER_CANCELLED"
51
- /* USER_CANCELLED */
52
- ) : t.key === "extension.authorization.canceled" ? new s(
53
- "Extension wasn't given authorization.",
54
- "UNAUTHORIZED_EXTENSION"
55
- /* UNAUTHORIZED_EXTENSION */
56
- ) : t.key === "fingerprint.scanner.not.found" ? new s(
57
- "Couldn't find fingerprint scanner.",
58
- "SCANNER_NOT_FOUND"
59
- /* SCANNER_NOT_FOUND */
60
- ) : t.key === "signer.not.installed" ? new s(
61
- "The extension module isn't installed.",
62
- "EXTENSION_MODULE_NOT_INSTALLED"
63
- /* EXTENSION_MODULE_NOT_INSTALLED */
64
- ) : new s(
65
- "Unknown error while capturing fingerprint.",
66
- "UNKNOWN_ERROR"
67
- /* UNKNOWN_ERROR */
68
- );
69
- }
70
- if (h())
71
- throw l(!1), U(!1), new s(
72
- "User cancelled",
73
- "USER_CANCELLED"
74
- /* USER_CANCELLED */
75
- );
76
- const i = q(T);
77
- i.image = N?.content.image?.data, i.base64WSQ = N?.content.fingerprint.data, i.nfiqRating = (N?.content.score || 0) + 98, i.status = F.AVAILABLE;
78
- const L = x(c());
79
- let r, _ = !1;
80
- try {
81
- r = await v(L, i);
82
- } catch (e) {
83
- if (i.nfiqRating = -1, i.base64WSQ = "", i.image = "", console.log("caught while validating fingerprint: ", e), P(e) && "message" in e && e.message === "error.template.extraction")
84
- _ = !0;
85
- else if (e instanceof XMLHttpRequest) {
86
- const t = e;
87
- "response" in t && "data" in t.response.data && t.response.data.message === "error.template.extraction" && (_ = !0);
88
- } else
89
- throw e instanceof B ? e.code === "ECONNABORTED" ? (console.log("The evaluate biometrics request took too long to answer!"), new s(
90
- "Evaluate biometrics took too long to reply",
91
- "EVALUATE_BIOMETRICS_TIMEOUT"
92
- /* EVALUATE_BIOMETRICS_TIMEOUT */
93
- )) : (console.error("Error evaluating biometrics!", e), S(c()), l(!1), new s(
94
- "Network issue while validating biometrics, check logs",
95
- "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
96
- /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
97
- )) : (S(c()), l(!1), new s(
98
- "Network issue while validating biometrics, check logs",
99
- "EVALUATE_BIOMETRICS_NETWORK_ISSUE"
100
- /* EVALUATE_BIOMETRICS_NETWORK_ISSUE */
101
- ));
102
- }
103
- let R, f, O, A, u, o = E.LOW_QUALITY;
104
- if (r) {
105
- const e = r.bodyParts.find(
106
- (t) => t.bodyPart === i.bodyPart
107
- );
108
- i.nfiqRating = e.quality, (e.quality > W() || e.status === "LOW_QUALITY") && (R = !0, o = E.LOW_QUALITY), r.bodyParts.find((t) => t.status === "DUPLICATE") && (f = !0, o = E.DUPLICATE), r.bodyParts.find((t) => t.status === "FORBIDDEN") && (O = !0, o = E.FORBIDDEN), r.bodyParts.find((t) => t.status === "AGR") && (A = !0, o = E.AGR_DETECTED), r.bodyParts.find((t) => t.status === "AGR_NOT_MATCH") && (u = !0, o = E.AGR_NO_MATCH);
109
- }
110
- if (f || R || O || u || A || _) {
111
- i.nfiqRating = -1, i.base64WSQ = "", i.image = "", i.status = F.AVAILABLE;
112
- let e = "badFingerQualitySwal";
113
- f ? e = "unknownDuplicateFingerSwal" : O ? e = "forbiddenFingerSwal" : A ? e = "agrFinger" : u && (e = "agrFingerNotMatched");
114
- let t = d(`${e}.text`);
115
- if (k(X) && f) {
116
- e = "duplicateFingerSwal", t = d(`${e}.text`, {
117
- values: {
118
- finger1: d(`${e}.${r.matchingFingers?.[0]}`),
119
- finger2: d(`${e}.${r.matchingFingers?.[1]}`)
120
- }
121
- });
122
- const m = w();
123
- return {
124
- returnCode: o,
125
- bodyParts: m,
126
- matchingFingers: r.matchingFingers,
127
- message: t
128
- };
129
- }
130
- const p = w();
131
- return { returnCode: o, bodyParts: p, message: t };
132
- }
133
- return S(c()), l(!1), $(), { returnCode: E.CAPTURED, bodyParts: w() };
134
- }
135
- function q(n) {
136
- G();
137
- for (const a of c())
138
- if (a.index === n)
139
- return a.selected = !0, a;
140
- throw new Error(`Finger ${n} not found`);
141
- }
142
- export {
143
- s as CaptureApiError,
144
- V as CaptureErrorStatusEnum,
145
- K as captureSingleFinger
146
- };
147
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmluZ2Vyc0FwaV9hMTMwNTQ5Yl8yLjIuMC1SQzAyLmpzIiwic291cmNlcyI6WyIuLi9zcmMvYXBpL2ZpbmdlcnNBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXhpb3NFcnJvciB9IGZyb20gJ2F4aW9zJztcbmltcG9ydCB0eXBlIHsgQ2FwdHVyZVBhcmFtcywgRmluZ2VycHJpbnRTY2FuIH0gZnJvbSAnLi4vaW5jbHVkZS9FeHRlbnNpb24nO1xuaW1wb3J0IHsgaXNDYW5jZWxsaW5nLCBzZXRDYW5jZWxsaW5nLCBzZXRDYXB0dXJpbmcgfSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9idXR0b25zL2NhcHR1cmUvY2FwdHVyZVN0b3JlJztcbmltcG9ydCB7IGdldEV4dGVuc2lvbiwgaGFzRmluZ2VyT25BbmRPZmYsIGlzRXZlcnl0aGluZ0luc3RhbGxlZCB9IGZyb20gJy4uL2xpYi9maW5nZXJzVGFiL2V4dGVuc2lvbi9leHRlbnNpb24nO1xuaW1wb3J0IHtcbiAgQm9keVBhcnROYW1lcyxcbiAgRmluZ2VyLFxuICBnZXRTZWxlY3RlZEZpbmdlcixcbiAgbm9ybWFsaXplRmluZ2VyTmFtZXNBbmRJbmRleGVzVG9JbmRleGVzLFxuICB0eXBlIEZpbmdlckluZGV4LFxuICBnZXRGaW5nZXJzLFxuICBzZWxlY3ROb3RoaW5nLFxuICBGaW5nZXJTdGF0dXMsXG4gIGdldENvbGxlY3RlZEZpbmdlcnMsXG4gIHNldEZpbmdlcnMsXG4gIGdldE1pbk5maXFBY2NlcHRhYmxlLFxufSBmcm9tICcuLi9saWIvZmluZ2Vyc1RhYi9oYW5kL2hhbmRQYXJ0cy9maW5nZXJzU3RvcmUnO1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzT2JqZWN0RW1wdHkgfSBmcm9tICcuLi9saWIvdXRpbC91dGlsJztcbmltcG9ydCB7XG4gIHZhbGlkYXRlRmluZ2VyQmlvbWV0cmljcyxcbiAgdHlwZSBCb2R5UGFydFJldHVyblR5cGUsXG4gIHVzZVdhc20sXG4gIHR5cGUgQm9keVBhcnQsXG59IGZyb20gJy4uL2xpYi92YWxpZGF0b3JzL2Jpb21ldHJpY3NWYWxpZGF0b3InO1xuaW1wb3J0IHtcbiAgY29sbGVjdEZpbmdlcnMsXG4gIGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMsXG4gIG5vdGlmeUZpbmdlckNvbGxlY3RlZCxcbn0gZnJvbSAnLi4vbGliL2ZpbmdlcnNUYWIvYnV0dG9ucy9idXR0b25IYW5kbGVycyc7XG5pbXBvcnQgeyBmb3JtYXQsIHVud3JhcEZ1bmN0aW9uU3RvcmUgfSBmcm9tICdzdmVsdGUtaTE4bic7XG5pbXBvcnQgeyBnZXQgfSBmcm9tICdzdmVsdGUvc3RvcmUnO1xuY29uc3QgJGZvcm1hdCA9IHVud3JhcEZ1bmN0aW9uU3RvcmUoZm9ybWF0KTtcblxuZXhwb3J0IHsgY2FwdHVyZVNpbmdsZUZpbmdlciB9O1xuXG5leHBvcnQgY29uc3QgZW51bSBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtIHtcbiAgRVhURU5TSU9OX01JU1NJTkcgPSAnRVhURU5TSU9OX01JU1NJTkcnLFxuICBVU0VSX0NBTkNFTExFRCA9ICdVU0VSX0NBTkNFTExFRCcsXG4gIFVOQVVUSE9SSVpFRF9FWFRFTlNJT04gPSAnVU5BVVRIT1JJWkVEX0VYVEVOU0lPTicsXG4gIFNDQU5ORVJfTk9UX0ZPVU5EID0gJ1NDQU5ORVJfTk9UX0ZPVU5EJyxcbiAgRVhURU5TSU9OX01PRFVMRV9OT1RfSU5TVEFMTEVEID0gJ0VYVEVOU0lPTl9NT0RVTEVfTk9UX0lOU1RBTExFRCcsXG4gIEZJTkdFUl9OT1RfUkVNT1ZFRCA9ICdGSU5HRVJfTk9UX1JFTU9WRUQnLFxuICBVTktOT1dOX0VSUk9SID0gJ1VOS05PV05fRVJST1InLFxuICBFVkFMVUFURV9CSU9NRVRSSUNTX1RJTUVPVVQgPSAnRVZBTFVBVEVfQklPTUVUUklDU19USU1FT1VUJyxcbiAgRVZBTFVBVEVfQklPTUVUUklDU19ORVRXT1JLX0lTU1VFID0gJ0VWQUxVQVRFX0JJT01FVFJJQ1NfTkVUV09SS19JU1NVRScsXG59XG5cbmV4cG9ydCBjbGFzcyBDYXB0dXJlQXBpRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHN0YXR1czogQ2FwdHVyZUVycm9yU3RhdHVzRW51bSkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogUHJvZ3JhbW1hdGljYWxseSBjYXB0dXJlIHNpbmdsZSBmaW5nZXJcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FwdHVyZVNpbmdsZUZpbmdlcihcbiAgZmluZ2VyTmFtZU9ySW5kZXg6IG51bWJlciB8IEJvZHlQYXJ0TmFtZXMsXG4gIGdldEZpbmdlcnByaW50UGFyYW1zOiBDYXB0dXJlUGFyYW1zXG4pOiBQcm9taXNlPHtcbiAgcmV0dXJuQ29kZTogaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cztcbiAgYm9keVBhcnRzOiBCb2R5UGFydFtdO1xuICBtYXRjaGluZ0ZpbmdlcnM/OiBCb2R5UGFydE5hbWVzW107XG4gIG1lc3NhZ2U/OiBzdHJpbmc7XG59PiB7XG4gIGNvbnN0IGZpbmdlckluZGV4ID0gbm9ybWFsaXplRmluZ2VyTmFtZXNBbmRJbmRleGVzVG9JbmRleGVzKFtmaW5nZXJOYW1lT3JJbmRleF0pWzBdO1xuICAvLyB0cnkge1xuICBjb25zdCBleHRlbnNpb24gPSBnZXRFeHRlbnNpb24oKTtcbiAgLy8gY2hlY2sgdGhhdCB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZVxuICBpZiAoaXNPYmplY3RFbXB0eShleHRlbnNpb24pKSB7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgIFwiQXR0ZW1wdGluZyB0byBjYXB0dXJlIGZpbmdlciBidXQgdGhlIGV4dGVuc2lvbiBhcHBhcmVudGx5IGhhc24ndCBiZWVuIHByb3Blcmx5IGluamVjdGVkLiBSZWNlaXZlZDogXCIgKyBleHRlbnNpb24sXG4gICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVYVEVOU0lPTl9NSVNTSU5HXG4gICAgKTtcbiAgfVxuXG4gIC8vIGNoZWNrIHRoYXQgdGhlIGV4dGVuc2lvbiBpcyBpbnN0YWxsZWRcbiAgaWYgKGdldEV4dGVuc2lvbigpKSB7XG4gICAgaWYgKCdpc0V4dGVuc2lvbkluc3RhbGxlZCcgaW4gZ2V0RXh0ZW5zaW9uKCkgJiYgIShhd2FpdCBnZXRFeHRlbnNpb24oKS5pc0V4dGVuc2lvbkluc3RhbGxlZCgpKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgVGhlIGV4dGVuc2lvbiBpc24ndCBpbnN0YWxsZWQhYCk7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKFwiVGhlIGV4dGVuc2lvbiBpc24ndCBpbnN0YWxsZWQhXCIsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVhURU5TSU9OX01JU1NJTkcpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIHRoYXQgdGhlIG1vZHVsZSBhbmQgY29tcGxlbWVudCBhcmUgYWxsIGluc3RhbGxlZFxuICAgIGlmICghaXNFdmVyeXRoaW5nSW5zdGFsbGVkKCkpIHtcbiAgICAgIGF3YWl0IGdldEV4dGVuc2lvbigpLmluc3RhbGxDb21wb25lbnRzPy4oW3sgdHlwZTogJ2ZpbmdlclByaW50JyB9XSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICBgVGhlIGV4dGVuc2lvbiB2YXJpYWJsZSByZWNlaXZlZCBpcyBlbXB0eTogJHtnZXRFeHRlbnNpb24oKX0hYCxcbiAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVhURU5TSU9OX01JU1NJTkdcbiAgICApO1xuICB9XG5cbiAgc2V0Q2FwdHVyaW5nKHRydWUpO1xuXG4gIC8vIGlmIHNvbWVob3cgdGhleSBtYW5hZ2VkIHRvIGFzayBmb3IgY2FuY2VsbGF0aW9uIHJpZ2h0IGJlZm9yZSB0aGUgc2NhbiwgdGhpcyBjYXRjaGVzIHRoYXRcbiAgaWYgKGlzQ2FuY2VsbGluZygpKSB7XG4gICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICBzZXRDYW5jZWxsaW5nKGZhbHNlKTtcbiAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKCdVc2VyIGNhbmNlbGxlZCcsIENhcHR1cmVFcnJvclN0YXR1c0VudW0uVVNFUl9DQU5DRUxMRUQpO1xuICB9XG5cbiAgLy8gcHJvbXB0IHVzZXIgdG8gY29sbGVjdCB0aGUgZmluZ2VyXG4gIGxldCBjYXB0dXJlOiBGaW5nZXJwcmludFNjYW4gfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICAvLyBjYXB0dXJlIHRoZSBmaW5nZXJcbiAgICAvLyAqaW1wbGVtZW50YXRpb24gY29uc2lkZXJpbmcgd2Ugb25seSBoYXZlIHRoZSBnZXRGaW5nZXJwcmludCBtZXRob2QgYXZhaWxhYmxlXG4gICAgY2FwdHVyZSA9IGF3YWl0IGV4dGVuc2lvbi5nZXRGaW5nZXJwcmludChcbiAgICAgIC8vIEB0cy1pZ25vcmUgVE9ETzogQWxleCBoYXMgdG8gZml4IHRoaXMgZnVuY3Rpb25zIHNpZ25hdHVyZSB0byBhY2NlcHQgcG9qb1xuICAgICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgIGdldEZpbmdlcnByaW50UGFyYW1zID8/IHsgb3V0cHV0Rm9ybWF0OiAnQkFTRTY0JywgaW1hZ2VGb3JtYXQ6ICdCTVAnLCBub25jZTogJ3dlYkNvbGxlY3RvcicsIHRpbWVvdXQ6IDMgfVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyAvLyBpZiB3ZSBoYXZlIHRoaXMgZnVuY3Rpb25hbGl0eSBhdmFpbGFibGUsIGFzayB0aGUgdXNlciB0byByZW1vdmUgaGlzIGZpbmdlciBmcm9tIHRoZSBzY2FubmVyXG4gICAgLy8gY29uc29sZS5sb2coJ2hhc0Zpbmdlck9uQW5kT2ZmJywgaGFzRmluZ2VyT25BbmRPZmYoKSk7XG4gICAgLy8gaWYgKGhhc0Zpbmdlck9uQW5kT2ZmKCkpIHtcbiAgICAvLyAgIC8vIHByb21wdCB1c2VyIHRvIHJlbW92ZSBoaXMgZmluZ2VyXG4gICAgLy8gICAvLyBpbml0aWF0ZSB0aW1lciwgaWYgYWZ0ZXIgc29tZSB0aW1lIHRoZSBmaW5nZXIgc3RpbGwgaGFzbid0IGJlZW4gbGlmdGVkLCBhc2sgdGhlIHVzZXIgdG8gY2xlYW4gdGhlIHNjYW5uZXJcbiAgICAvLyAgIGxldCBzY2FubmVyRGlydHkgPSBmYWxzZTtcbiAgICAvLyAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vICAgICBzY2FubmVyRGlydHkgPSB0cnVlO1xuICAgIC8vICAgfSwgODAwMCk7XG4gICAgLy8gICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vICAgICBpZiAoKGF3YWl0IGV4dGVuc2lvbi5pc0Zpbmdlck9mZj8uKCkpPy5pc0Zpbmdlck9mZiB8fCBzY2FubmVyRGlydHkgfHwgaXNDYW5jZWxsaW5nKCkpIHtcbiAgICAvLyAgICAgICBicmVhaztcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfVxuICAgIC8vICAgLy8gaW5mb3JtIHVzZXIgdGhleSBzaG91bGQgY2xlYW4gdGhlIHNjYW5uZXJcbiAgICAvLyAgICAgICBpZiAoc2Nhbm5lckRpcnR5KSB7XG5cbiAgICAvLyAgICAgICB9XG4gICAgLy8gfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgY29uc3QgZSA9IGVyciBhcyB7IGtleTogc3RyaW5nOyBkZXNjcmlwdGlvbjogc3RyaW5nIH07XG4gICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAvLyBUT0RPOiB0eXBlIHRoaXMgYW5kIGNyZWF0ZSBlbnVtIGZvciBlcnJvcnNcbiAgICBpZiAoZS5rZXkgPT09ICdmaW5nZXJwcmludC5zY2FubmVyLnRpbWVvdXQnKSB7XG4gICAgICAvLyBpZiB0aW1lZG91dCBqdXN0IHRyeSBhZ2FpbiwgdW5sZXNzIHRyeWluZyB0byBjYW5jZWxcbiAgICAgIC8vIFRPRE86IG1heWJlIHN0b3AgYWZ0ZXIgc28gbWFueSB0cmllc1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgXCJGaW5nZXJwcmludCBzY2FuIHRpbWVkIG91dCAoZGlkbid0IHJlYWQgYSBmaW5nZXIuKVwiLFxuICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09ICdleHRlbnNpb24uYXV0aG9yaXphdGlvbi5jYW5jZWxlZCcpIHtcbiAgICAgIC8vIHVzZXIgZGlkbid0IGF1dGhvcml6ZSB0aGUgZG9tYWluLCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBzbyBzdG9wLlxuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIkV4dGVuc2lvbiB3YXNuJ3QgZ2l2ZW4gYXV0aG9yaXphdGlvbi5cIiwgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5VTkFVVEhPUklaRURfRVhURU5TSU9OKTtcbiAgICB9IGVsc2UgaWYgKGUua2V5ID09PSAnZmluZ2VycHJpbnQuc2Nhbm5lci5ub3QuZm91bmQnKSB7XG4gICAgICAvLyB1c2VyIGRvZXNuJ3QgaGF2ZSBhIHNjYW5uZXIgY29ubmVjdGVkLCB0aGVyZSBpcyBub3RoaW5nIHdlIGNhbiBkbyBzbyBzdG9wLlxuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcIkNvdWxkbid0IGZpbmQgZmluZ2VycHJpbnQgc2Nhbm5lci5cIiwgQ2FwdHVyZUVycm9yU3RhdHVzRW51bS5TQ0FOTkVSX05PVF9GT1VORCk7XG4gICAgfSBlbHNlIGlmIChlLmtleSA9PT0gJ3NpZ25lci5ub3QuaW5zdGFsbGVkJykge1xuICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgXCJUaGUgZXh0ZW5zaW9uIG1vZHVsZSBpc24ndCBpbnN0YWxsZWQuXCIsXG4gICAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVhURU5TSU9OX01PRFVMRV9OT1RfSU5TVEFMTEVEXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQ2FwdHVyZUFwaUVycm9yKCdVbmtub3duIGVycm9yIHdoaWxlIGNhcHR1cmluZyBmaW5nZXJwcmludC4nLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVOS05PV05fRVJST1IpO1xuICAgIH1cbiAgfVxuICAvLyBpZiBzb21laG93IHRoZXkgbWFuYWdlZCB0byBhc2sgZm9yIGNhbmNlbGxhdGlvbiByaWdodCBiZWZvcmUgdGhlIHNjYW4sIHRoaXMgY2F0Y2hlcyB0aGF0XG4gIGlmIChpc0NhbmNlbGxpbmcoKSkge1xuICAgIHNldENhcHR1cmluZyhmYWxzZSk7XG4gICAgc2V0Q2FuY2VsbGluZyhmYWxzZSk7XG4gICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcignVXNlciBjYW5jZWxsZWQnLCBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLlVTRVJfQ0FOQ0VMTEVEKTtcbiAgfVxuXG4gIC8vIHNlbGVjdCBhbmQgZ2V0IGZpbmdlclxuICBjb25zdCBmaW5nZXIgPSBzZWxlY3RGaW5nZXJBcGkoZmluZ2VySW5kZXgpO1xuICAvLyBzZXQgdGhpcyBmaW5nZXJzIGF0dHJpYnV0ZXMgdG8gdGhlIHJlY2VudGx5IGNvbGxlY3RlZCBmaW5nZXJcbiAgZmluZ2VyLmltYWdlID0gY2FwdHVyZT8uY29udGVudC5pbWFnZT8uZGF0YSBhcyBzdHJpbmc7XG4gIGZpbmdlci5iYXNlNjRXU1EgPSBjYXB0dXJlPy5jb250ZW50LmZpbmdlcnByaW50LmRhdGEgYXMgc3RyaW5nO1xuICBmaW5nZXIubmZpcVJhdGluZyA9IChjYXB0dXJlPy5jb250ZW50LnNjb3JlIHx8IDApICsgOTg7XG4gIGZpbmdlci5zdGF0dXMgPSBGaW5nZXJTdGF0dXMuQVZBSUxBQkxFO1xuICAvLyBHZXQgQUxMIHRoZSBjb2xsZWN0ZWQgZmluZ2Vyc1xuICBjb25zdCBjb2xsZWN0ZWRGaW5nZXJzID0gZ2V0Q29sbGVjdGVkRmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuXG4gIC8vIHNlbmQgdG8gcmVtb3RlXG4gIGxldCByZXNwb25zZSxcbiAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IGZhbHNlO1xuICB0cnkge1xuICAgIHJlc3BvbnNlID0gYXdhaXQgdmFsaWRhdGVGaW5nZXJCaW9tZXRyaWNzKGNvbGxlY3RlZEZpbmdlcnMsIGZpbmdlcik7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAvLyBjbGVhciB0aGUgZmluZ2VyXG4gICAgZmluZ2VyLm5maXFSYXRpbmcgPSAtMTtcbiAgICBmaW5nZXIuYmFzZTY0V1NRID0gJyc7XG4gICAgZmluZ2VyLmltYWdlID0gJyc7XG4gICAgLy8gd2FybiBlcnJvclxuICAgIGNvbnNvbGUubG9nKCdjYXVnaHQgd2hpbGUgdmFsaWRhdGluZyBmaW5nZXJwcmludDogJywgZXJyb3IpO1xuICAgIC8vIGVycm9yIHdoaWxlIGV4dHJhY3RpbmcsIHNob3cgYSBsb3cgcXVhbGl0eSBzd2FsXG4gICAgaWYgKGlzT2JqZWN0KGVycm9yKSAmJiAnbWVzc2FnZScgaW4gZXJyb3IgJiYgZXJyb3IubWVzc2FnZSA9PT0gJ2Vycm9yLnRlbXBsYXRlLmV4dHJhY3Rpb24nKSB7XG4gICAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIFhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICBjb25zdCBlID0gZXJyb3I7XG4gICAgICBpZiAoJ3Jlc3BvbnNlJyBpbiBlICYmICdkYXRhJyBpbiBlLnJlc3BvbnNlLmRhdGEgJiYgZS5yZXNwb25zZS5kYXRhLm1lc3NhZ2UgPT09ICdlcnJvci50ZW1wbGF0ZS5leHRyYWN0aW9uJykge1xuICAgICAgICBlcnJvclRlbXBsYXRlRXh0cmFjdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChlcnJvciBpbnN0YW5jZW9mIEF4aW9zRXJyb3IpIHtcbiAgICAgIGlmIChlcnJvci5jb2RlID09PSAnRUNPTk5BQk9SVEVEJykge1xuICAgICAgICBjb25zb2xlLmxvZygnVGhlIGV2YWx1YXRlIGJpb21ldHJpY3MgcmVxdWVzdCB0b29rIHRvbyBsb25nIHRvIGFuc3dlciEnKTtcbiAgICAgICAgdGhyb3cgbmV3IENhcHR1cmVBcGlFcnJvcihcbiAgICAgICAgICAnRXZhbHVhdGUgYmlvbWV0cmljcyB0b29rIHRvbyBsb25nIHRvIHJlcGx5JyxcbiAgICAgICAgICBDYXB0dXJlRXJyb3JTdGF0dXNFbnVtLkVWQUxVQVRFX0JJT01FVFJJQ1NfVElNRU9VVFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZXZhbHVhdGluZyBiaW9tZXRyaWNzIScsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIC8vIHRoaXMgdXBkYXRlcyB0aGUgc3RhdXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgICdOZXR3b3JrIGlzc3VlIHdoaWxlIHZhbGlkYXRpbmcgYmlvbWV0cmljcywgY2hlY2sgbG9ncycsXG4gICAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVZBTFVBVEVfQklPTUVUUklDU19ORVRXT1JLX0lTU1VFXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGlzIGNoYW5nZXMgdXBkYXRlcyB0aGUgc3RhdXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgICAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAgIHRocm93IG5ldyBDYXB0dXJlQXBpRXJyb3IoXG4gICAgICAgICdOZXR3b3JrIGlzc3VlIHdoaWxlIHZhbGlkYXRpbmcgYmlvbWV0cmljcywgY2hlY2sgbG9ncycsXG4gICAgICAgIENhcHR1cmVFcnJvclN0YXR1c0VudW0uRVZBTFVBVEVfQklPTUVUUklDU19ORVRXT1JLX0lTU1VFXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBsZXQgaXNGaW5nZXJMb3dRdWFsaXR5LFxuICAgIGlzRHVwbGljYXRlRmluZ2VyLFxuICAgIGlzRm9yYmlkZGVuRmluZ2VyLFxuICAgIGlzQWdyRmluZ2VyRGV0ZWN0ZWQsXG4gICAgaXNBZ3JOb3RNYXRjaGVkRmluZ2VyLFxuICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkxPV19RVUFMSVRZO1xuICBpZiAocmVzcG9uc2UpIHtcbiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgZmluZ2VyIGZyb20gdGhlIHJldHVybiBsaXN0XG4gICAgY29uc3QgdmFsaWRhdGVkRmluZ2VyID0gcmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoXG4gICAgICAodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuYm9keVBhcnQgPT09IGZpbmdlci5ib2R5UGFydFxuICAgICkgYXMgQm9keVBhcnRSZXR1cm5UeXBlO1xuICAgIC8vIHNldCB0aGlzIGZpbmdlcidzIHF1YWxpdHkgYW5kIGltYWdlXG4gICAgZmluZ2VyLm5maXFSYXRpbmcgPSB2YWxpZGF0ZWRGaW5nZXIucXVhbGl0eTtcbiAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlIGFuZCBsb3cgcXVhbGl0eVxuICAgIGlmICh2YWxpZGF0ZWRGaW5nZXIucXVhbGl0eSA+IGdldE1pbk5maXFBY2NlcHRhYmxlKCkgfHwgdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0xPV19RVUFMSVRZJykge1xuICAgICAgaXNGaW5nZXJMb3dRdWFsaXR5ID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkxPV19RVUFMSVRZO1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuYm9keVBhcnRzLmZpbmQoKHZhbGlkYXRlZEZpbmdlcikgPT4gdmFsaWRhdGVkRmluZ2VyLnN0YXR1cyA9PT0gJ0RVUExJQ0FURScpKSB7XG4gICAgICBpc0R1cGxpY2F0ZUZpbmdlciA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5EVVBMSUNBVEU7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS5ib2R5UGFydHMuZmluZCgodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnRk9SQklEREVOJykpIHtcbiAgICAgIGlzRm9yYmlkZGVuRmluZ2VyID0gdHJ1ZTtcbiAgICAgIHJldHVybkNvZGUgPSBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLkZPUkJJRERFTjtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmJvZHlQYXJ0cy5maW5kKCh2YWxpZGF0ZWRGaW5nZXIpID0+IHZhbGlkYXRlZEZpbmdlci5zdGF0dXMgPT09ICdBR1InKSkge1xuICAgICAgaXNBZ3JGaW5nZXJEZXRlY3RlZCA9IHRydWU7XG4gICAgICByZXR1cm5Db2RlID0gaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5BR1JfREVURUNURUQ7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS5ib2R5UGFydHMuZmluZCgodmFsaWRhdGVkRmluZ2VyKSA9PiB2YWxpZGF0ZWRGaW5nZXIuc3RhdHVzID09PSAnQUdSX05PVF9NQVRDSCcpKSB7XG4gICAgICBpc0Fnck5vdE1hdGNoZWRGaW5nZXIgPSB0cnVlO1xuICAgICAgcmV0dXJuQ29kZSA9IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQUdSX05PX01BVENIO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoaXMgZmluZ2VyIGlzIGxvdyBxdWFsaXR5IG9yIGR1cGxpY2F0ZVxuICAvLyAoaWYgdGhlcmUgaXMgYSBkdXBsaWNhdGUsIGl0IGhhcyB0byBiZSB0aGlzIGZpbmdlcilcbiAgaWYgKFxuICAgIGlzRHVwbGljYXRlRmluZ2VyIHx8XG4gICAgaXNGaW5nZXJMb3dRdWFsaXR5IHx8XG4gICAgaXNGb3JiaWRkZW5GaW5nZXIgfHxcbiAgICBpc0Fnck5vdE1hdGNoZWRGaW5nZXIgfHxcbiAgICBpc0FnckZpbmdlckRldGVjdGVkIHx8XG4gICAgZXJyb3JUZW1wbGF0ZUV4dHJhY3Rpb25cbiAgKSB7XG4gICAgLy8gY2xlYXIgdGhpcyBmaW5nZXJcbiAgICBmaW5nZXIubmZpcVJhdGluZyA9IC0xO1xuICAgIGZpbmdlci5iYXNlNjRXU1EgPSAnJztcbiAgICBmaW5nZXIuaW1hZ2UgPSAnJztcbiAgICBmaW5nZXIuc3RhdHVzID0gRmluZ2VyU3RhdHVzLkFWQUlMQUJMRTtcbiAgICAvLyBzZXQgdGhlIGFwcHJvcHJpYXRlIHN3YWwgcHJlZml4XG4gICAgbGV0IHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnYmFkRmluZ2VyUXVhbGl0eVN3YWwnO1xuICAgIGlmIChpc0R1cGxpY2F0ZUZpbmdlcikge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICd1bmtub3duRHVwbGljYXRlRmluZ2VyU3dhbCc7XG4gICAgfSBlbHNlIGlmIChpc0ZvcmJpZGRlbkZpbmdlcikge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdmb3JiaWRkZW5GaW5nZXJTd2FsJztcbiAgICB9IGVsc2UgaWYgKGlzQWdyRmluZ2VyRGV0ZWN0ZWQpIHtcbiAgICAgIHN3YWxUcmFuc2xhdGVQcmVmaXggPSAnYWdyRmluZ2VyJztcbiAgICB9IGVsc2UgaWYgKGlzQWdyTm90TWF0Y2hlZEZpbmdlcikge1xuICAgICAgc3dhbFRyYW5zbGF0ZVByZWZpeCA9ICdhZ3JGaW5nZXJOb3RNYXRjaGVkJztcbiAgICB9XG4gICAgbGV0IGh0bWwgPSAkZm9ybWF0KGAke3N3YWxUcmFuc2xhdGVQcmVmaXh9LnRleHRgKTtcbiAgICAvLyBpZiB3ZSBhcmUgdXNpbmcgd2FzbSwgd2Uga25vdyBleGFjdGx5IHdoaWNoIGZpbmdlcnMgd2VyZSB0aGUgaXNzdWVcbiAgICBpZiAoZ2V0KHVzZVdhc20pICYmIGlzRHVwbGljYXRlRmluZ2VyKSB7XG4gICAgICBzd2FsVHJhbnNsYXRlUHJlZml4ID0gJ2R1cGxpY2F0ZUZpbmdlclN3YWwnO1xuICAgICAgaHRtbCA9ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0udGV4dGAsIHtcbiAgICAgICAgdmFsdWVzOiB7XG4gICAgICAgICAgZmluZ2VyMTogJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS4keyhyZXNwb25zZSBhcyBhbnkpLm1hdGNoaW5nRmluZ2Vycz8uWzBdfWApLFxuICAgICAgICAgIGZpbmdlcjI6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0uJHsocmVzcG9uc2UgYXMgYW55KS5tYXRjaGluZ0ZpbmdlcnM/LlsxXX1gKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gY29sbGVjdEZpbmdlcnMoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJldHVybkNvZGUsXG4gICAgICAgIGJvZHlQYXJ0czogb3V0cHV0LFxuICAgICAgICBtYXRjaGluZ0ZpbmdlcnM6IChyZXNwb25zZSBhcyBhbnkpLm1hdGNoaW5nRmluZ2VycyBhcyBCb2R5UGFydE5hbWVzW10sXG4gICAgICAgIG1lc3NhZ2U6IGh0bWwsXG4gICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXQgPSBjb2xsZWN0RmluZ2VycygpO1xuICAgIHJldHVybiB7IHJldHVybkNvZGUsIGJvZHlQYXJ0czogb3V0cHV0LCBtZXNzYWdlOiBodG1sIH07XG4gICAgLy8gLy8gZmlyZSBhIHN3YWwgdG8gd2FybiB1c2VyIGFuZCBnZXQgY2hvaWNlXG4gICAgLy8gY29uc3QgY2hvaWNlID0gYXdhaXQgbXlTd2FsLmZpcmUoe1xuICAgIC8vICAgdGl0bGU6ICRmb3JtYXQoYCR7c3dhbFRyYW5zbGF0ZVByZWZpeH0udGl0bGVgKSxcbiAgICAvLyAgIGh0bWwsXG4gICAgLy8gICBjb25maXJtQnV0dG9uVGV4dDogJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS5yZXRyeWApLFxuICAgIC8vICAgY2FuY2VsQnV0dG9uVGV4dDogJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS5jYW5jZWxgKSxcbiAgICAvLyAgIC8vIGlmIHRoZSBmaW5nZXIgaXMgbG93IHF1YWxpdHksIHNob3cgYWxzbyBkZW55IGJ1dHRvblxuICAgIC8vICAgLi4uKGlzRmluZ2VyTG93UXVhbGl0eSAmJiB7IHNob3dEZW55QnV0dG9uOiB0cnVlLCBkZW55QnV0dG9uVGV4dDogJGZvcm1hdChgJHtzd2FsVHJhbnNsYXRlUHJlZml4fS5kZW55YCkgfSksXG4gICAgLy8gICBzaG93Q2FuY2VsQnV0dG9uOiB0cnVlLFxuICAgIC8vICAgaWNvbjogJ2Vycm9yJyxcbiAgICAvLyB9KTtcblxuICAgIC8vIGlmIHRoZSB1c2VyIGNob3NlIHRvIHRyeSBhbm90aGVyIGZpbmdlciwgdGhpcyBmaW5nZXIgd2lsbCBiZSBzZXQgYXMgdW5hdmFpbGFibGVcbiAgICAvLyBpZiAoY2hvaWNlLmlzRGVuaWVkKSB7XG4gICAgLy8gICB1cGRhdGVDdXJyZW50RGlzcGxheShGaW5nZXJEaXNwbGF5QXJlYVR5cGUudW5jb2xsZWN0ZWRGaW5nZXIpO1xuICAgIC8vICAgYXdhaXQgaGFuZGxlTWlzc2luZ09yVW5hdmFpbGFibGUoRmluZ2VyU3RhdHVzLlVOQVZBSUxBQkxFKTtcbiAgICAvLyAgIC8vIHRoaXMgY2hhbmdlcyB1cGRhdGVzIHRoZSBzdGF0dXMgaW4gY2FzZSB0aGUgZmluZ2VyIGhhZCBhIHN0YXR1c1xuICAgIC8vICAgc2V0RmluZ2VycyhnZXRGaW5nZXJzKCkpO1xuICAgIC8vICAgLy8gbm8gbG9uZ2VyIGNhcHR1cmluZ1xuICAgIC8vICAgaWYgKCFpc0F1dG9tYXRpYykgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgICAvLyAgIHJldHVybiBoYW5kbGVDYXB0dXJlUmV0dXJuU3RhdHVzLlRSWUlOR19PVEhFUl9GSU5HRVI7XG4gICAgLy8gfVxuICAgIC8vIC8vIGlmIHRoZSB1c2VyIGNhbmNlbGxlZCwganVzdCByZXR1cm5cbiAgICAvLyBpZiAoY2hvaWNlLmlzRGlzbWlzc2VkKSB7XG4gICAgLy8gICB1cGRhdGVDdXJyZW50RGlzcGxheShGaW5nZXJEaXNwbGF5QXJlYVR5cGUudW5jb2xsZWN0ZWRGaW5nZXIpO1xuICAgIC8vICAgLy8gdGhpcyBjaGFuZ2VzIHVwZGF0ZXMgdGhlIHN0YXR1cyBpbiBjYXNlIHRoZSBmaW5nZXIgaGFkIGEgc3RhdHVzXG4gICAgLy8gICBzZXRGaW5nZXJzKGdldEZpbmdlcnMoKSk7XG4gICAgLy8gICAvLyBubyBsb25nZXIgY2FwdHVyaW5nXG4gICAgLy8gICBzZXRDYXB0dXJpbmcoZmFsc2UpO1xuICAgIC8vICAgcmV0dXJuIHJldHVybkNvZGU7XG4gICAgLy8gfVxuICAgIC8vIC8vIGlmIHRoZSB1c2VyIHdhbnRzIHRvIHRyeSBhZ2FpbiwgdGhlIGZpbmdlcnMgd2lsbCBnZXQgdXBkYXRlZCBvbmx5IHdoZW4gYSBnb29kIGZpbmdlciBpcyBjYXB0dXJlZFxuICAgIC8vIC8vIG9yIHdoZW4gdGhlIHVzZXIgZ2V0cyB0aXJlZCBvZiB0cnlpbmdcbiAgICAvLyBpZiAoY2hvaWNlLmlzQ29uZmlybWVkKSB7XG4gICAgLy8gICBjb25zdCByZXN1bHQgPSBhd2FpdCBoYW5kbGVDYXB0dXJlKGlzQXV0b21hdGljKTtcbiAgICAvLyAgIGlmIChyZXN1bHQgIT09IGhhbmRsZUNhcHR1cmVSZXR1cm5TdGF0dXMuQ0FQVFVSRUQpIHtcbiAgICAvLyAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAvLyAgIH1cbiAgICAvLyB9XG4gIH1cbiAgLy8gc2hvdyB0aGUgY29sbGVjdGVkIGZpbmdlclxuICBzZXRGaW5nZXJzKGdldEZpbmdlcnMoKSk7XG5cbiAgc2V0Q2FwdHVyaW5nKGZhbHNlKTtcbiAgLy8gc2VuZCBjb2xsZWN0ZWQgZmluZ2VyIG1lc3NhZ2VcbiAgbm90aWZ5RmluZ2VyQ29sbGVjdGVkKCk7XG5cbiAgcmV0dXJuIHsgcmV0dXJuQ29kZTogaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cy5DQVBUVVJFRCwgYm9keVBhcnRzOiBjb2xsZWN0RmluZ2VycygpIH07XG59XG5cbi8qKlxuICogU2VsZWN0IGZpbmdlciBwcm9ncmFtbWF0aWNhbGx5ICh3aXRob3V0IHVzZXIgY2xpY2spXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdEZpbmdlckFwaShpbmRleDogRmluZ2VySW5kZXgpOiBGaW5nZXIge1xuICAvLyB1bnNlbGVjdCBldmVyeXRoaW5nXG4gIHNlbGVjdE5vdGhpbmcoKTtcbiAgZm9yIChjb25zdCBmaW5nZXIgb2YgZ2V0RmluZ2VycygpKSB7XG4gICAgaWYgKGZpbmdlci5pbmRleCA9PT0gaW5kZXgpIHtcbiAgICAgIGZpbmdlci5zZWxlY3RlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmluZ2VyO1xuICAgIH1cbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEZpbmdlciAke2luZGV4fSBub3QgZm91bmRgKTtcbn1cbiJdLCJuYW1lcyI6WyIkZm9ybWF0IiwidW53cmFwRnVuY3Rpb25TdG9yZSIsImZvcm1hdCIsIkNhcHR1cmVFcnJvclN0YXR1c0VudW0iLCJDYXB0dXJlQXBpRXJyb3IiLCJtZXNzYWdlIiwic3RhdHVzIiwiY2FwdHVyZVNpbmdsZUZpbmdlciIsImZpbmdlck5hbWVPckluZGV4IiwiZ2V0RmluZ2VycHJpbnRQYXJhbXMiLCJmaW5nZXJJbmRleCIsIm5vcm1hbGl6ZUZpbmdlck5hbWVzQW5kSW5kZXhlc1RvSW5kZXhlcyIsImV4dGVuc2lvbiIsImdldEV4dGVuc2lvbiIsImlzT2JqZWN0RW1wdHkiLCJpc0V2ZXJ5dGhpbmdJbnN0YWxsZWQiLCJzZXRDYXB0dXJpbmciLCJpc0NhbmNlbGxpbmciLCJzZXRDYW5jZWxsaW5nIiwiY2FwdHVyZSIsImVyciIsImUiLCJmaW5nZXIiLCJzZWxlY3RGaW5nZXJBcGkiLCJGaW5nZXJTdGF0dXMiLCJjb2xsZWN0ZWRGaW5nZXJzIiwiZ2V0Q29sbGVjdGVkRmluZ2VycyIsImdldEZpbmdlcnMiLCJyZXNwb25zZSIsImVycm9yVGVtcGxhdGVFeHRyYWN0aW9uIiwidmFsaWRhdGVGaW5nZXJCaW9tZXRyaWNzIiwiZXJyb3IiLCJpc09iamVjdCIsIkF4aW9zRXJyb3IiLCJzZXRGaW5nZXJzIiwiaXNGaW5nZXJMb3dRdWFsaXR5IiwiaXNEdXBsaWNhdGVGaW5nZXIiLCJpc0ZvcmJpZGRlbkZpbmdlciIsImlzQWdyRmluZ2VyRGV0ZWN0ZWQiLCJpc0Fnck5vdE1hdGNoZWRGaW5nZXIiLCJyZXR1cm5Db2RlIiwiaGFuZGxlQ2FwdHVyZVJldHVyblN0YXR1cyIsInZhbGlkYXRlZEZpbmdlciIsImdldE1pbk5maXFBY2NlcHRhYmxlIiwic3dhbFRyYW5zbGF0ZVByZWZpeCIsImh0bWwiLCJnZXQiLCJ1c2VXYXNtIiwib3V0cHV0IiwiY29sbGVjdEZpbmdlcnMiLCJub3RpZnlGaW5nZXJDb2xsZWN0ZWQiLCJpbmRleCIsInNlbGVjdE5vdGhpbmciXSwibWFwcGluZ3MiOiI7QUErQkEsTUFBTUEsSUFBVUMsRUFBb0JDLENBQU07QUFJeEIsSUFBQUMsc0JBQUFBLE9BQ2hCQSxFQUFBLG9CQUFvQixxQkFDcEJBLEVBQUEsaUJBQWlCLGtCQUNqQkEsRUFBQSx5QkFBeUIsMEJBQ3pCQSxFQUFBLG9CQUFvQixxQkFDcEJBLEVBQUEsaUNBQWlDLGtDQUNqQ0EsRUFBQSxxQkFBcUIsc0JBQ3JCQSxFQUFBLGdCQUFnQixpQkFDaEJBLEVBQUEsOEJBQThCLCtCQUM5QkEsRUFBQSxvQ0FBb0MscUNBVHBCQSxJQUFBQSxLQUFBLENBQUEsQ0FBQTtBQVlYLE1BQU1DLFVBQXdCLE1BQU07QUFBQSxFQUN6QyxZQUFZQyxHQUF3QkMsR0FBZ0M7QUFDbEUsVUFBTUQsQ0FBTyxHQURxQixLQUFBLFNBQUFDO0FBQUEsRUFFcEM7QUFDRjtBQUtBLGVBQWVDLEVBQ2JDLEdBQ0FDLEdBTUM7QUFDRCxRQUFNQyxJQUFjQyxFQUF3QyxDQUFDSCxDQUFpQixDQUFDLEVBQUUsQ0FBQyxHQUU1RUksSUFBWUM7QUFFZCxNQUFBQyxFQUFjRixDQUFTO0FBQ3pCLFVBQU0sSUFBSVI7QUFBQSxNQUNSLHdHQUF3R1E7QUFBQSxNQUN4RztBQUFBO0FBQUEsSUFBQTtBQUtKLE1B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