@bitgo-beta/sdk-coin-avaxp 5.7.3-beta.225 → 5.7.3-beta.226

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 +1 @@
1
- {"version":3,"file":"deprecatedTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AA2ChC,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CAMxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAE5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CA6BrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
1
+ {"version":3,"file":"deprecatedTransaction.d.ts","sourceRoot":"","sources":["../../../src/lib/deprecatedTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACL,OAAO,EACP,eAAe,EACf,KAAK,EAGL,cAAc,EACd,eAAe,EAChB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,MAAM,EAGP,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,EAAE,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,WAAW,CAAC;AAErD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAqDhC,qBAAa,qBAAsB,SAAQ,eAAe;IACxD,SAAS,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAClC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa,EAAE,UAAU,CAAC;IAC1B,UAAU,SAAK;IACf,SAAS,EAAE,EAAE,CAAa;IAC1B,cAAc,EAAE,UAAU,EAAE,CAAM;IAClC,gBAAgB,EAAE,UAAU,EAAE,CAAC;IAC/B,MAAM,EAAE,cAAc,EAAE,CAAM;IAC9B,GAAG,EAAE,UAAU,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAM;gBAE9B,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;IAQ5C,IAAI,gBAAgB,IAAI,gBAAgB,CAEvC;IAED,IAAI,SAAS,IAAI,MAAM,EAAE,CA0BxB;IAED,IAAI,WAAW,IAAI,UAAU,EAAE,CAE9B;IAED,IAAI,cAAc,IAAI,OAAO,CAK5B;IAED,kBAAkB;IAClB,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,OAAO,GAAG,OAAO;IAKlC;;;;;;;;OAQG;IACH,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IA+B5B,kBAAkB;IAClB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAoC3B,MAAM,IAAI,MAAM;IAmBhB,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI;IAItC;;;;OAIG;IACH,kBAAkB,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI;IAI1D;;;OAGG;IACH,IAAI,eAAe,IAAI,MAAM,CAE5B;IAED,IAAI,EAAE,IAAI,MAAM,CAEf;IAED,IAAI,aAAa,IAAI,MAAM,EAAE,CAE5B;IAED,IAAI,eAAe,IAAI,MAAM,EAAE,CAE9B;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,KAAK,EAAE,CA6BrB;IAED;;OAEG;IACH,IAAI,GAAG,IAAI,cAAc,CAExB;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAU3B;IAED,IAAI,MAAM,IAAI,KAAK,EAAE,CA2BpB;IAED;;;;OAIG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IASpC,kBAAkB;IAClB,kBAAkB,IAAI,sBAAsB;IA2B5C;;OAEG;IACH,IAAI,sBAAsB,IAAI,OAAO,CAEpC;IAED;;OAEG;IACH,IAAI,WAAW,IAAI,MAAM,GAAG,SAAS,CAapC;IAED;;OAEG;IACH,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAazC;IAED;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;CAW5B"}
@@ -11,6 +11,16 @@ const utils_1 = __importDefault(require("./utils"));
11
11
  function isEmptySignature(s) {
12
12
  return !!s && s.startsWith(''.padStart(90, '0'));
13
13
  }
14
+ // An address placeholder is 90 zero hex chars (45-byte prefix) followed by a 20-byte address.
15
+ // A purely empty slot is all zeros. Non-zero bytes after position 90 distinguish the two.
16
+ // This matters for toBroadcastFormat(): a real ECDSA alongside an addr placeholder is the
17
+ // exact shape produced by the hasCredentials guard bypass (CECHO-1697) and must be blocked.
18
+ function isAddrPlaceholder(s) {
19
+ if (!isEmptySignature(s))
20
+ return false;
21
+ const suffix = s.substring(90);
22
+ return suffix.length > 0 && suffix !== ''.padStart(suffix.length, '0');
23
+ }
14
24
  /**
15
25
  * Signatures are prestore as empty buffer for hsm and address of signar for first signature.
16
26
  * When sign is required, this method return the function that identify a signature to be replaced.
@@ -59,17 +69,39 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
59
69
  return this._avaxTransaction.getUnsignedTx().getTransaction();
60
70
  }
61
71
  get signature() {
62
- if (this.credentials.length === 0) {
72
+ if (!this.credentials || this.credentials.length === 0) {
63
73
  return [];
64
74
  }
65
- const obj = this.credentials[0].serialize();
66
- return obj.sigArray.map((s) => s.bytes).filter((s) => !isEmptySignature(s));
75
+ // Use the intersection of non-empty ECDSAs across all credentials. A signer's
76
+ // ECDSA is counted only if it appears in every credential (every input). Since
77
+ // RFC6979 is deterministic, the same key produces identical bytes for the same
78
+ // tx across all credentials. The intersection catches corrupt states where one
79
+ // credential is missing a signature that another credential already has.
80
+ let intersection = null;
81
+ for (const c of this.credentials) {
82
+ const cs = c.serialize();
83
+ const credSigs = new Set(cs.sigArray.map((s) => s.bytes).filter((b) => !isEmptySignature(b)));
84
+ if (intersection === null) {
85
+ intersection = credSigs;
86
+ }
87
+ else {
88
+ for (const sig of intersection) {
89
+ if (!credSigs.has(sig)) {
90
+ intersection.delete(sig);
91
+ }
92
+ }
93
+ }
94
+ }
95
+ return intersection ? [...intersection] : [];
67
96
  }
68
97
  get credentials() {
69
98
  return this._avaxTransaction?.credentials;
70
99
  }
71
100
  get hasCredentials() {
72
- return this.credentials !== undefined && this.credentials.length > 0;
101
+ // Guard against credential regeneration whenever credentials have been set from a parsed tx.
102
+ // Must use != null (not length check) so credentials=[] still blocks buildAvaxTransaction()
103
+ // from wiping a partially-signed state.
104
+ return this.credentials != null;
73
105
  }
74
106
  /** @inheritdoc */
75
107
  canSign({ key }) {
@@ -94,7 +126,7 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
94
126
  if (!this.avaxPTransaction) {
95
127
  throw new sdk_core_1.InvalidTransactionError('empty transaction to sign');
96
128
  }
97
- if (!this.hasCredentials) {
129
+ if (!this.credentials || this.credentials.length === 0) {
98
130
  throw new sdk_core_1.InvalidTransactionError('empty credentials to sign');
99
131
  }
100
132
  const signature = this.createSignature(prv);
@@ -124,6 +156,33 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
124
156
  if (!this.avaxPTransaction) {
125
157
  throw new sdk_core_1.InvalidTransactionError('Empty transaction data');
126
158
  }
159
+ // Block the exact shape produced by the hasCredentials guard bypass (CECHO-1697):
160
+ // a real ECDSA alongside an address placeholder (r=0) in the same credential set.
161
+ // Normal states are safe: unsigned txs have credentials=null (not yet set); half-signed
162
+ // txs have empty-zero slots (not addr placeholders) in unfilled positions.
163
+ // credentials=[] is always a bug: hasCredentials returns true for [] but the array is
164
+ // empty, so no signer has touched the tx — serializing it would produce a zero-credential tx.
165
+ if (this.credentials != null && this.credentials.length === 0) {
166
+ throw new sdk_core_1.InvalidTransactionError('transaction has no credentials — cannot broadcast');
167
+ }
168
+ if (this.credentials && this.credentials.length > 0) {
169
+ let hasRealSig = false;
170
+ let hasAddrPlaceholder = false;
171
+ for (const c of this.credentials) {
172
+ const cs = c.serialize();
173
+ for (const s of cs.sigArray) {
174
+ if (!isEmptySignature(s.bytes)) {
175
+ hasRealSig = true;
176
+ }
177
+ else if (isAddrPlaceholder(s.bytes)) {
178
+ hasAddrPlaceholder = true;
179
+ }
180
+ }
181
+ }
182
+ if (hasRealSig && hasAddrPlaceholder) {
183
+ throw new sdk_core_1.InvalidTransactionError('transaction has a real ECDSA alongside an address placeholder (r=0): incomplete signing detected, refusing broadcast');
184
+ }
185
+ }
127
186
  return this._avaxTransaction.toStringHex();
128
187
  }
129
188
  // types - stakingTransaction, import, export
@@ -341,4 +400,4 @@ class DeprecatedTransaction extends sdk_core_1.BaseTransaction {
341
400
  }
342
401
  }
343
402
  exports.DeprecatedTransaction = DeprecatedTransaction;
344
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXByZWNhdGVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBUThCO0FBRTlCLG1DQVFpQjtBQUdqQix5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBWTVCLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx5QkFBeUIsQ0FBQyxVQUFpQztJQUNsRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEYsb0JBQW9CO1FBQ3BCLE9BQU8sVUFBVSxHQUFHLEVBQUUsT0FBTztZQUMzQixJQUFJLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNqQyxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO2dCQUNELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNwQyxPQUFPLEdBQUcsS0FBSyxPQUFPLENBQUM7WUFDekIsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsT0FBTyxLQUFLLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQyxDQUFDO0lBQ0osQ0FBQztTQUFNLENBQUM7UUFDTix3QkFBd0I7UUFDeEIsT0FBTyxVQUFVLEdBQUcsRUFB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QUMsUUFBUSxDQUFDLFlBQVk7Z0JBQzdCLE9BQU8sR0FBRyxDQUFDO1lBQ2I7Z0JBQ0UsT0FBTyxZQUFZLENBQUM7UUFDeEIsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpWRCxzREFpVkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBdmFsYW5jaGVOZXR3b3JrLCBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQge1xuICBCYXNlS2V5LFxuICBCYXNlVHJhbnNhY3Rpb24sXG4gIEVudHJ5LFxuICBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcixcbiAgU2lnbmluZ0Vycm9yLFxuICBUcmFuc2FjdGlvbkZlZSxcbiAgVHJhbnNhY3Rpb25UeXBlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBLZXlQYWlyIH0gZnJvbSAnLi9rZXlQYWlyJztcbmltcG9ydCB7XG4gIERlcHJlY2F0ZWRCYXNlVHgsXG4gIERlY29kZWRVdHhvT2JqLFxuICBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uLFxuICBEZXByZWNhdGVkVHgsXG4gIFR4RGF0YSxcbiAgSU5QVVRfU0VQQVJBVE9SLFxuICBBRERSRVNTX1NFUEFSQVRPUixcbn0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBBZGREZWxlZ2F0b3JUeCwgQW1vdW50SW5wdXQsIEJhc2VUeCBhcyBQVk1CYXNlVHgsIEV4cG9ydFR4LCBJbXBvcnRUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvcGxhdGZvcm12bSc7XG5pbXBvcnQgeyBFeHBvcnRUeCBhcyBFVk1FeHBvcnRUeCwgSW1wb3J0VHggYXMgRVZNSW1wb3J0VHggfSBmcm9tICdhdmFsYW5jaGUvZGlzdC9hcGlzL2V2bSc7XG5pbXBvcnQgeyBCTiwgQnVmZmVyIGFzIEJ1ZmZlckF2YXggfSBmcm9tICdhdmFsYW5jaGUnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ3JlZGVudGlhbCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2NvbW1vbic7XG5pbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuXG4vLyByZWdpb24gdXRpbHMgdG8gc2lnblxuaW50ZXJmYWNlIHNpZ25hdHVyZVNlcmlhbGl6ZWQge1xuICBieXRlczogc3RyaW5nO1xufVxuaW50ZXJmYWNlIENoZWNrU2lnbmF0dXJlIHtcbiAgKHNpZ2F0dXJlOiBzaWduYXR1cmVTZXJpYWxpemVkLCBhZGRyZXNzSGV4OiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5U2lnbmF0dXJlKHM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gISFzICYmIHMuc3RhcnRzV2l0aCgnJy5wYWRTdGFydCg5MCwgJzAnKSk7XG59XG5cbi8qKlxuICogU2lnbmF0dXJlcyBhcmUgcHJlc3RvcmUgYXMgZW1wdHkgYnVmZmVyIGZvciBoc20gYW5kIGFkZHJlc3Mgb2Ygc2lnbmFyIGZvciBmaXJzdCBzaWduYXR1cmUuXG4gKiBXaGVuIHNpZ24gaXMgcmVxdWlyZWQsIHRoaXMgbWV0aG9kIHJldHVybiB0aGUgZnVuY3Rpb24gdGhhdCBpZGVudGlmeSBhIHNpZ25hdHVyZSB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSBzaWduYXR1cmVzIGFueSBzaWduYXR1cmVzIGFzIHNhbXBsZXMgdG8gaWRlbnRpZnkgd2hpY2ggc2lnbmF0dXJlIHJlcXVpcmVkIHJlcGxhY2UuXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoc2lnbmF0dXJlczogc2lnbmF0dXJlU2VyaWFsaXplZFtdKTogQ2hlY2tTaWduYXR1cmUge1xuICBpZiAoc2lnbmF0dXJlcy5sZW5ndGggPiAxICYmIHNpZ25hdHVyZXMuZXZlcnkoKHNpZykgPT4gaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSkge1xuICAgIC8vIExvb2sgZm9yIGFkZHJlc3MuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChzaWcsIGFkZHJlc3MpOiBib29sZWFuIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHB1YiA9IHNpZy5ieXRlcy5zdWJzdHJpbmcoOTApO1xuICAgICAgICByZXR1cm4gcHViID09PSBhZGRyZXNzO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMb29rIGZvciBlbXB0eSBzdHJpbmdcbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgaWYgKGlzRW1wdHlTaWduYXR1cmUoc2lnLmJ5dGVzKSkgcmV0dXJuIHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfVxufVxuLy8gZW5kIHJlZ2lvbiB1dGlscyBmb3Igc2lnblxuXG5leHBvcnQgY2xhc3MgRGVwcmVjYXRlZFRyYW5zYWN0aW9uIGV4dGVuZHMgQmFzZVRyYW5zYWN0aW9uIHtcbiAgcHJvdGVjdGVkIF9hdmF4VHJhbnNhY3Rpb246IERlcHJlY2F0ZWRUeDtcbiAgcHVibGljIF90eXBlOiBUcmFuc2FjdGlvblR5cGU7XG4gIHB1YmxpYyBfbmV0d29yazogQXZhbGFuY2hlTmV0d29yaztcbiAgcHVibGljIF9uZXR3b3JrSUQ6IG51bWJlcjtcbiAgcHVibGljIF9hc3NldElkOiBCdWZmZXJBdmF4O1xuICBwdWJsaWMgX2Jsb2NrY2hhaW5JRDogQnVmZmVyQXZheDtcbiAgcHVibGljIF90aHJlc2hvbGQgPSAyO1xuICBwdWJsaWMgX2xvY2t0aW1lOiBCTiA9IG5ldyBCTigwKTtcbiAgcHVibGljIF9mcm9tQWRkcmVzc2VzOiBCdWZmZXJBdmF4W10gPSBbXTtcbiAgcHVibGljIF9yZXdhcmRBZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF91dHhvczogRGVjb2RlZFV0eG9PYmpbXSA9IFtdO1xuICBwdWJsaWMgX3RvOiBCdWZmZXJBdmF4W107XG4gIHB1YmxpYyBfZmVlOiBQYXJ0aWFsPFRyYW5zYWN0aW9uRmVlPiA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fbmV0d29yayA9IGNvaW5Db25maWcubmV0d29yayBhcyBBdmFsYW5jaGVOZXR3b3JrO1xuICAgIHRoaXMuX2Fzc2V0SWQgPSB1dGlscy5jYjU4RGVjb2RlKHRoaXMuX25ldHdvcmsuYXZheEFzc2V0SUQpO1xuICAgIHRoaXMuX2Jsb2NrY2hhaW5JRCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5ibG9ja2NoYWluSUQpO1xuICAgIHRoaXMuX25ldHdvcmtJRCA9IHRoaXMuX25ldHdvcmsubmV0d29ya0lEO1xuICB9XG5cbiAgZ2V0IGF2YXhQVHJhbnNhY3Rpb24oKTogRGVwcmVjYXRlZEJhc2VUeCB7XG4gICAgcmV0dXJuIHRoaXMuX2F2YXhUcmFuc2FjdGlvbi5nZXRVbnNpZ25lZFR4KCkuZ2V0VHJhbnNhY3Rpb24oKTtcbiAgfVxuXG4gIGdldCBzaWduYXR1cmUoKTogc3RyaW5nW10ge1xuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBvYmo6IGFueSA9IHRoaXMuY3JlZGVudGlhbHNbMF0uc2VyaWFsaXplKCk7XG4gICAgcmV0dXJuIG9iai5zaWdBcnJheS5tYXAoKHMpID0+IHMuYnl0ZXMpLmZpbHRlcigocykgPT4gIWlzRW1wdHlTaWduYXR1cmUocykpO1xuICB9XG5cbiAgZ2V0IGNyZWRlbnRpYWxzKCk6IENyZWRlbnRpYWxbXSB7XG4gICAgcmV0dXJuICh0aGlzLl9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KT8uY3JlZGVudGlhbHM7XG4gIH1cblxuICBnZXQgaGFzQ3JlZGVudGlhbHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmNyZWRlbnRpYWxzLmxlbmd0aCA+IDA7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBhdmF4cCB0cmFuc2FjdGlvbiBhbmQgdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogdmFsaWRhdG9yLCBkZWxlZ2F0b3IsIGltcG9ydCwgZXhwb3J0cyBleHRlbmQgYmFzZVR4XG4gICAqIHVuc2lnbmVkVHg6IFVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgpICAoYmFzZVR4ID0gYWRkVmFsaWRhdG9yVHgpXG4gICAqIGNvbnN0IHR4OiBUeCA9IHVuc2lnbmVkVHguc2lnbihrZXljaGFpbikgKHR4IGlzIHR5cGUgc3RhbmRhcmQgc2lnbmVkIHR4KVxuICAgKiBnZXQgYmFzZVR4IHRoZW4gY3JlYXRlIG5ldyB1bnNpZ25lZFR4IHRoZW4gc2lnblxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpO1xuICAgIGNvbnN0IGFkZHJlc3NIZXggPSBrZXlQYWlyLmdldEFkZHJlc3NCdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuaGFzQ3JlZGVudGlhbHMpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgY3JlZGVudGlhbHMgdG8gc2lnbicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmNyZWF0ZVNpZ25hdHVyZShwcnYpO1xuICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3JlZGVudGlhbHMuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNzOiBhbnkgPSBjLnNlcmlhbGl6ZSgpO1xuICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNoZWNrU2lnbiA9IGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoY3Muc2lnQXJyYXkpO1xuICAgICAgfVxuICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgIGNzLnNpZ0FycmF5LmZvckVhY2goKHNpZykgPT4ge1xuICAgICAgICBpZiAoY2hlY2tTaWduICYmIGNoZWNrU2lnbihzaWcsIGFkZHJlc3NIZXgpKSB7XG4gICAgICAgICAgc2lnLmJ5dGVzID0gc2lnbmF0dXJlO1xuICAgICAgICAgIGZpbmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghZmluZCkgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICBjLmRlc2VyaWFsaXplKGNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAvKipcbiAgICogc2hvdWxkIGJlIG9mIHNpZ25lZFR4IGRvaW5nIHRoaXMgd2l0aCBiYXNlVHhcbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXZheFRyYW5zYWN0aW9uLnRvU3RyaW5nSGV4KCk7XG4gIH1cblxuICAvLyB0eXBlcyAtIHN0YWtpbmdUcmFuc2FjdGlvbiwgaW1wb3J0LCBleHBvcnRcbiAgdG9Kc29uKCk6IFR4RGF0YSB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBpbnB1dHM6IHRoaXMuaW5wdXRzLFxuICAgICAgZnJvbUFkZHJlc3NlczogdGhpcy5mcm9tQWRkcmVzc2VzLFxuICAgICAgdGhyZXNob2xkOiB0aGlzLl90aHJlc2hvbGQsXG4gICAgICBsb2NrdGltZTogdGhpcy5fbG9ja3RpbWUudG9TdHJpbmcoKSxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlLFxuICAgICAgb3V0cHV0czogdGhpcy5vdXRwdXRzLFxuICAgICAgY2hhbmdlT3V0cHV0czogdGhpcy5jaGFuZ2VPdXRwdXRzLFxuICAgICAgc291cmNlQ2hhaW46IHRoaXMuc291cmNlQ2hhaW4sXG4gICAgICBkZXN0aW5hdGlvbkNoYWluOiB0aGlzLmRlc3RpbmF0aW9uQ2hhaW4sXG4gICAgfTtcbiAgfVxuXG4gIHNldFRyYW5zYWN0aW9uKHR4OiBEZXByZWNhdGVkVHgpOiB2b2lkIHtcbiAgICB0aGlzLl9hdmF4VHJhbnNhY3Rpb24gPSB0eDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHBhcmFtIHtUcmFuc2FjdGlvblR5cGV9IHRyYW5zYWN0aW9uVHlwZSBUaGUgdHJhbnNhY3Rpb24gdHlwZSB0byBiZSBzZXRcbiAgICovXG4gIHNldFRyYW5zYWN0aW9uVHlwZSh0cmFuc2FjdGlvblR5cGU6IFRyYW5zYWN0aW9uVHlwZSk6IHZvaWQge1xuICAgIHRoaXMuX3R5cGUgPSB0cmFuc2FjdGlvblR5cGU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9ydGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBuZWVkcyB0byBiZSBzaWduZWQgaW4gQnVmZmVyIGZvcm1hdC5cbiAgICogT25seSBuZWVkZWQgZm9yIGNvaW5zIHRoYXQgc3VwcG9ydCBhZGRpbmcgc2lnbmF0dXJlcyBkaXJlY3RseSAoZS5nLiBUU1MpLlxuICAgKi9cbiAgZ2V0IHNpZ25hYmxlUGF5bG9hZCgpOiBCdWZmZXIge1xuICAgIHJldHVybiB1dGlscy5zaGEyNTYodGhpcy5fYXZheFRyYW5zYWN0aW9uLmdldFVuc2lnbmVkVHgoKS50b0J1ZmZlcigpKTtcbiAgfVxuXG4gIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB1dGlscy5jYjU4RW5jb2RlKEJ1ZmZlckF2YXguZnJvbSh1dGlscy5zaGEyNTYodGhpcy5fYXZheFRyYW5zYWN0aW9uLnRvQnVmZmVyKCkpKSk7XG4gIH1cblxuICBnZXQgZnJvbUFkZHJlc3NlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2Zyb21BZGRyZXNzZXMubWFwKChhKSA9PiB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy5fbmV0d29yay5ocnAsIHRoaXMuX25ldHdvcmsuYWxpYXMsIGEpKTtcbiAgfVxuXG4gIGdldCByZXdhcmRBZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9yZXdhcmRBZGRyZXNzZXMubWFwKChhKSA9PiB1dGlscy5hZGRyZXNzVG9TdHJpbmcodGhpcy5fbmV0d29yay5ocnAsIHRoaXMuX25ldHdvcmsuYWxpYXMsIGEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGxpc3Qgb2Ygb3V0cHV0cy4gQW1vdW50cyBhcmUgZXhwcmVzc2VkIGluIGFic29sdXRlIHZhbHVlLlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkltcG9ydDpcbiAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeClcbiAgICAgICAgICAuZ2V0T3V0cygpXG4gICAgICAgICAgLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGlmICh1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRCkpIHtcbiAgICAgICAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFVk1FeHBvcnRUeClcbiAgICAgICAgICAgIC5nZXRFeHBvcnRlZE91dHB1dHMoKVxuICAgICAgICAgICAgLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHgpXG4gICAgICAgICAgICAuZ2V0RXhwb3J0T3V0cHV0cygpXG4gICAgICAgICAgICAubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkRGVsZWdhdG9yOlxuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuQWRkVmFsaWRhdG9yOlxuICAgICAgICAvLyBHZXQgc3Rha2VkIG91dHB1dHNcbiAgICAgICAgY29uc3QgYWRkVmFsaWRhdG9yVHggPSB0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgQWRkRGVsZWdhdG9yVHg7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWRkcmVzczogYWRkVmFsaWRhdG9yVHguZ2V0Tm9kZUlEU3RyaW5nKCksXG4gICAgICAgICAgICB2YWx1ZTogYWRkVmFsaWRhdG9yVHguZ2V0U3Rha2VBbW91bnQoKS50b1N0cmluZygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIFRyYW5zYXNjdGlvbiBGZWUuXG4gICAqL1xuICBnZXQgZmVlKCk6IFRyYW5zYWN0aW9uRmVlIHtcbiAgICByZXR1cm4geyBmZWU6ICcwJywgLi4udGhpcy5fZmVlIH07XG4gIH1cblxuICBnZXQgY2hhbmdlT3V0cHV0cygpOiBFbnRyeVtdIHtcbiAgICAvLyBDLWNoYWluIHR4IGFkbiBJbXBvcnQgVHhzIGRvbid0IGhhdmUgY2hhbmdlIG91dHB1dHNcbiAgICBpZiAoXG4gICAgICB0aGlzLnR5cGUgPT09IFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQgfHxcbiAgICAgIHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKVxuICAgICkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICAvLyBnZW5lcmFsIHN1cHBvcnQgYW55IHRyYW5zYWN0aW9uIHR5cGUsIGJ1dCBpdCdzIHNjb3BlZCB5ZXRcbiAgICByZXR1cm4gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldE91dHMoKS5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBFbnRyeVtdIHtcbiAgICBsZXQgaW5wdXRzO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0SW1wb3J0SW5wdXRzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpKSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRVZNRXhwb3J0VHgpLmdldElucHV0cygpLm1hcCgoZXZtSW5wdXQpID0+ICh7XG4gICAgICAgICAgICBhZGRyZXNzOiAnMHgnICsgZXZtSW5wdXQuZ2V0QWRkcmVzc1N0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBCTigoZXZtSW5wdXQgYXMgYW55KS5hbW91bnQpLnRvU3RyaW5nKCksXG4gICAgICAgICAgICBub25jZTogZXZtSW5wdXQuZ2V0Tm9uY2UoKS50b051bWJlcigpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIFBWTUJhc2VUeCkuZ2V0SW5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldElucygpO1xuICAgIH1cbiAgICByZXR1cm4gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IGFtb3VudElucHV0ID0gaW5wdXQuZ2V0SW5wdXQoKSBhcyBhbnkgYXMgQW1vdW50SW5wdXQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogdXRpbHMuY2I1OEVuY29kZShpbnB1dC5nZXRUeElEKCkpICsgSU5QVVRfU0VQQVJBVE9SICsgdXRpbHMub3V0cHV0aWR4QnVmZmVyVG9OdW1iZXIoaW5wdXQuZ2V0T3V0cHV0SWR4KCkpLFxuICAgICAgICBhZGRyZXNzOiB0aGlzLmZyb21BZGRyZXNzZXMuc29ydCgpLmpvaW4oQUREUkVTU19TRVBBUkFUT1IpLFxuICAgICAgICB2YWx1ZTogYW1vdW50SW5wdXQuZ2V0QW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXZheCB3cmFwcGVyIHRvIGNyZWF0ZSBzaWduYXR1cmUgYW5kIHJldHVybiBpdCBmb3IgY3JlZGVudGlhbHNcbiAgICogQHBhcmFtIHBydlxuICAgKiBAcmV0dXJuIGhleHN0cmluZ1xuICAgKi9cbiAgY3JlYXRlU2lnbmF0dXJlKHBydjogQnVmZmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBzaWdudmFsID0gdXRpbHMuY3JlYXRlU2lnbmF0dXJlQXZheEJ1ZmZlcihcbiAgICAgIHRoaXMuX25ldHdvcmssXG4gICAgICBCdWZmZXJBdmF4LmZyb20odGhpcy5zaWduYWJsZVBheWxvYWQpLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHBydilcbiAgICApO1xuICAgIHJldHVybiBzaWdudmFsLnRvU3RyaW5nKCdoZXgnKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBleHBsYWluVHJhbnNhY3Rpb24oKTogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiB7XG4gICAgY29uc3QgdHhKc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBjb25zdCBkaXNwbGF5T3JkZXIgPSBbJ2lkJywgJ2lucHV0cycsICdvdXRwdXRBbW91bnQnLCAnY2hhbmdlQW1vdW50JywgJ291dHB1dHMnLCAnY2hhbmdlT3V0cHV0cycsICdmZWUnLCAndHlwZSddO1xuXG4gICAgY29uc3Qgb3V0cHV0QW1vdW50ID0gdHhKc29uLm91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgY2hhbmdlQW1vdW50ID0gdHhKc29uLmNoYW5nZU91dHB1dHMucmVkdWNlKChwLCBuKSA9PiBwLmFkZChuZXcgQk4obi52YWx1ZSkpLCBuZXcgQk4oMCkpLnRvU3RyaW5nKCk7XG5cbiAgICBsZXQgcmV3YXJkQWRkcmVzc2VzO1xuICAgIGlmIChbVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvciwgVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRvcl0uaW5jbHVkZXModHhKc29uLnR5cGUpKSB7XG4gICAgICByZXdhcmRBZGRyZXNzZXMgPSB0aGlzLnJld2FyZEFkZHJlc3NlcztcbiAgICAgIGRpc3BsYXlPcmRlci5zcGxpY2UoNiwgMCwgJ3Jld2FyZEFkZHJlc3NlcycpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5T3JkZXIsXG4gICAgICBpZDogdHhKc29uLmlkLFxuICAgICAgaW5wdXRzOiB0eEpzb24uaW5wdXRzLFxuICAgICAgb3V0cHV0czogdHhKc29uLm91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBvdXRwdXRBbW91bnQsXG4gICAgICBjaGFuZ2VPdXRwdXRzOiB0eEpzb24uY2hhbmdlT3V0cHV0cy5tYXAoKG8pID0+ICh7IGFkZHJlc3M6IG8uYWRkcmVzcywgYW1vdW50OiBvLnZhbHVlIH0pKSxcbiAgICAgIGNoYW5nZUFtb3VudCxcbiAgICAgIHJld2FyZEFkZHJlc3NlcyxcbiAgICAgIGZlZTogdGhpcy5mZWUsXG4gICAgICB0eXBlOiB0eEpzb24udHlwZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIHRoaXMgdHJhbnNhY3Rpb24gaXMgYSBQIGNoYWluXG4gICAqL1xuICBnZXQgaXNUcmFuc2FjdGlvbkZvckNDaGFpbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgc291cmNlIGNoYWluIGlkIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgY3Jvc3MgY2hhaW4gdHJhbnNmZXIuXG4gICAqL1xuICBnZXQgc291cmNlQ2hhaW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYmxvY2tjaGFpbklEO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0U291cmNlQ2hhaW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5FeHBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRXhwb3J0VHggfCBFVk1FeHBvcnRUeCkuZ2V0QmxvY2tjaGFpbklEKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgZGVzdGluYXRpb25DaGFpbiBvciB1bmRlZmluZWQgaWYgaXQncyBhIGNyb3NzIGNoYWluIHRyYW5zZmVyLlxuICAgKi9cbiAgZ2V0IGRlc3RpbmF0aW9uQ2hhaW4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgYmxvY2tjaGFpbklEO1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIGJsb2NrY2hhaW5JRCA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgSW1wb3J0VHggfCBFVk1JbXBvcnRUeCkuZ2V0QmxvY2tjaGFpbklEKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBibG9ja2NoYWluSUQgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEV4cG9ydFR4IHwgRVZNRXhwb3J0VHgpLmdldERlc3RpbmF0aW9uQ2hhaW4oKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JRCk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydCBhIGJsb2NrY2hhaW5JZCBidWZmZXIgdG8gc3RyaW5nIGFuZCByZXR1cm4gUCBvciBDIGFsaWFzIGlmIG1hdGNoIG9mIGFueSBvZiB0aGF0IGNoYWlucy5cbiAgICogQHBhcmFtIHtCdWZmZXJBdmF4fSBibG9ja2NoYWluSURCdWZmZXJcbiAgICogQHJldHVybiB7c3RyaW5nfSBibG9jY2hhaW5JRCBvciBhbGlhcyBpZiBleGlzdHMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEQnVmZmVyOiBCdWZmZXJBdmF4KTogc3RyaW5nIHtcbiAgICBjb25zdCBibG9ja2NoYWluSWQgPSB1dGlscy5jYjU4RW5jb2RlKGJsb2NrY2hhaW5JREJ1ZmZlcik7XG4gICAgc3dpdGNoIChibG9ja2NoYWluSWQpIHtcbiAgICAgIGNhc2UgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQ6XG4gICAgICAgIHJldHVybiAnQyc7XG4gICAgICBjYXNlIHRoaXMuX25ldHdvcmsuYmxvY2tjaGFpbklEOlxuICAgICAgICByZXR1cm4gJ1AnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGJsb2NrY2hhaW5JZDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
403
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwcmVjYXRlZFRyYW5zYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9kZXByZWNhdGVkVHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQ0EsbURBUThCO0FBRTlCLG1DQVFpQjtBQUdqQix5Q0FBcUQ7QUFDckQsb0RBQTRCO0FBWTVCLFNBQVMsZ0JBQWdCLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDBGQUEwRjtBQUMxRiw0RkFBNEY7QUFDNUYsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN2QyxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLE9BQU8sTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksTUFBTSxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMseUJBQXlCLENBQUMsVUFBaUM7SUFDbEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BGLG9CQUFvQjtRQUNwQixPQUFPLFVBQVUsR0FBRyxFQUFFLE9BQU87WUFDM0IsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxn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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF2YWxhbmNoZU5ldHdvcmssIEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7XG4gIEJhc2VLZXksXG4gIEJhc2VUcmFuc2FjdGlvbixcbiAgRW50cnksXG4gIEludmFsaWRUcmFuc2FjdGlvbkVycm9yLFxuICBTaWduaW5nRXJyb3IsXG4gIFRyYW5zYWN0aW9uRmVlLFxuICBUcmFuc2FjdGlvblR5cGUsXG59IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHtcbiAgRGVwcmVjYXRlZEJhc2VUeCxcbiAgRGVjb2RlZFV0eG9PYmosXG4gIFRyYW5zYWN0aW9uRXhwbGFuYXRpb24sXG4gIERlcHJlY2F0ZWRUeCxcbiAgVHhEYXRhLFxuICBJTlBVVF9TRVBBUkFUT1IsXG4gIEFERFJFU1NfU0VQQVJBVE9SLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IEFkZERlbGVnYXRvclR4LCBBbW91bnRJbnB1dCwgQmFzZVR4IGFzIFBWTUJhc2VUeCwgRXhwb3J0VHgsIEltcG9ydFR4IH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvYXBpcy9wbGF0Zm9ybXZtJztcbmltcG9ydCB7IEV4cG9ydFR4IGFzIEVWTUV4cG9ydFR4LCBJbXBvcnRUeCBhcyBFVk1JbXBvcnRUeCB9IGZyb20gJ2F2YWxhbmNoZS9kaXN0L2FwaXMvZXZtJztcbmltcG9ydCB7IEJOLCBCdWZmZXIgYXMgQnVmZmVyQXZheCB9IGZyb20gJ2F2YWxhbmNoZSc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBDcmVkZW50aWFsIH0gZnJvbSAnYXZhbGFuY2hlL2Rpc3QvY29tbW9uJztcbmltcG9ydCB7IEJ1ZmZlciB9IGZyb20gJ2J1ZmZlcic7XG5cbi8vIHJlZ2lvbiB1dGlscyB0byBzaWduXG5pbnRlcmZhY2Ugc2lnbmF0dXJlU2VyaWFsaXplZCB7XG4gIGJ5dGVzOiBzdHJpbmc7XG59XG5pbnRlcmZhY2UgQ2hlY2tTaWduYXR1cmUge1xuICAoc2lnYXR1cmU6IHNpZ25hdHVyZVNlcmlhbGl6ZWQsIGFkZHJlc3NIZXg6IHN0cmluZyk6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlTaWduYXR1cmUoczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXMgJiYgcy5zdGFydHNXaXRoKCcnLnBhZFN0YXJ0KDkwLCAnMCcpKTtcbn1cblxuLy8gQW4gYWRkcmVzcyBwbGFjZWhvbGRlciBpcyA5MCB6ZXJvIGhleCBjaGFycyAoNDUtYnl0ZSBwcmVmaXgpIGZvbGxvd2VkIGJ5IGEgMjAtYnl0ZSBhZGRyZXNzLlxuLy8gQSBwdXJlbHkgZW1wdHkgc2xvdCBpcyBhbGwgemVyb3MuIE5vbi16ZXJvIGJ5dGVzIGFmdGVyIHBvc2l0aW9uIDkwIGRpc3Rpbmd1aXNoIHRoZSB0d28uXG4vLyBUaGlzIG1hdHRlcnMgZm9yIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IGEgcmVhbCBFQ0RTQSBhbG9uZ3NpZGUgYW4gYWRkciBwbGFjZWhvbGRlciBpcyB0aGVcbi8vIGV4YWN0IHNoYXBlIHByb2R1Y2VkIGJ5IHRoZSBoYXNDcmVkZW50aWFscyBndWFyZCBieXBhc3MgKENFQ0hPLTE2OTcpIGFuZCBtdXN0IGJlIGJsb2NrZWQuXG5mdW5jdGlvbiBpc0FkZHJQbGFjZWhvbGRlcihzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHMpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHN1ZmZpeCA9IHMuc3Vic3RyaW5nKDkwKTtcbiAgcmV0dXJuIHN1ZmZpeC5sZW5ndGggPiAwICYmIHN1ZmZpeCAhPT0gJycucGFkU3RhcnQoc3VmZml4Lmxlbmd0aCwgJzAnKTtcbn1cblxuLyoqXG4gKiBTaWduYXR1cmVzIGFyZSBwcmVzdG9yZSBhcyBlbXB0eSBidWZmZXIgZm9yIGhzbSBhbmQgYWRkcmVzcyBvZiBzaWduYXIgZm9yIGZpcnN0IHNpZ25hdHVyZS5cbiAqIFdoZW4gc2lnbiBpcyByZXF1aXJlZCwgdGhpcyBtZXRob2QgcmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGlkZW50aWZ5IGEgc2lnbmF0dXJlIHRvIGJlIHJlcGxhY2VkLlxuICogQHBhcmFtIHNpZ25hdHVyZXMgYW55IHNpZ25hdHVyZXMgYXMgc2FtcGxlcyB0byBpZGVudGlmeSB3aGljaCBzaWduYXR1cmUgcmVxdWlyZWQgcmVwbGFjZS5cbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVTZWxlY3RvclNpZ25hdHVyZShzaWduYXR1cmVzOiBzaWduYXR1cmVTZXJpYWxpemVkW10pOiBDaGVja1NpZ25hdHVyZSB7XG4gIGlmIChzaWduYXR1cmVzLmxlbmd0aCA+IDEgJiYgc2lnbmF0dXJlcy5ldmVyeSgoc2lnKSA9PiBpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpKSB7XG4gICAgLy8gTG9vayBmb3IgYWRkcmVzcy5cbiAgICByZXR1cm4gZnVuY3Rpb24gKHNpZywgYWRkcmVzcyk6IGJvb2xlYW4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCFpc0VtcHR5U2lnbmF0dXJlKHNpZy5ieXRlcykpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcHViID0gc2lnLmJ5dGVzLnN1YnN0cmluZyg5MCk7XG4gICAgICAgIHJldHVybiBwdWIgPT09IGFkZHJlc3M7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIC8vIExvb2sgZm9yIGVtcHR5IHN0cmluZ1xuICAgIHJldHVybiBmdW5jdGlvbiAoc2lnLCBhZGRyZXNzKTogYm9vbGVhbiB7XG4gICAgICBpZiAoaXNFbXB0eVNpZ25hdHVyZShzaWcuYnl0ZXMpKSByZXR1cm4gdHJ1ZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuICB9XG59XG4vLyBlbmQgcmVnaW9uIHV0aWxzIGZvciBzaWduXG5cbmV4cG9ydCBjbGFzcyBEZXByZWNhdGVkVHJhbnNhY3Rpb24gZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb24ge1xuICBwcm90ZWN0ZWQgX2F2YXhUcmFuc2FjdGlvbjogRGVwcmVjYXRlZFR4O1xuICBwdWJsaWMgX3R5cGU6IFRyYW5zYWN0aW9uVHlwZTtcbiAgcHVibGljIF9uZXR3b3JrOiBBdmFsYW5jaGVOZXR3b3JrO1xuICBwdWJsaWMgX25ldHdvcmtJRDogbnVtYmVyO1xuICBwdWJsaWMgX2Fzc2V0SWQ6IEJ1ZmZlckF2YXg7XG4gIHB1YmxpYyBfYmxvY2tjaGFpbklEOiBCdWZmZXJBdmF4O1xuICBwdWJsaWMgX3RocmVzaG9sZCA9IDI7XG4gIHB1YmxpYyBfbG9ja3RpbWU6IEJOID0gbmV3IEJOKDApO1xuICBwdWJsaWMgX2Zyb21BZGRyZXNzZXM6IEJ1ZmZlckF2YXhbXSA9IFtdO1xuICBwdWJsaWMgX3Jld2FyZEFkZHJlc3NlczogQnVmZmVyQXZheFtdO1xuICBwdWJsaWMgX3V0eG9zOiBEZWNvZGVkVXR4b09ialtdID0gW107XG4gIHB1YmxpYyBfdG86IEJ1ZmZlckF2YXhbXTtcbiAgcHVibGljIF9mZWU6IFBhcnRpYWw8VHJhbnNhY3Rpb25GZWU+ID0ge307XG5cbiAgY29uc3RydWN0b3IoY29pbkNvbmZpZzogUmVhZG9ubHk8Q29pbkNvbmZpZz4pIHtcbiAgICBzdXBlcihjb2luQ29uZmlnKTtcbiAgICB0aGlzLl9uZXR3b3JrID0gY29pbkNvbmZpZy5uZXR3b3JrIGFzIEF2YWxhbmNoZU5ldHdvcms7XG4gICAgdGhpcy5fYXNzZXRJZCA9IHV0aWxzLmNiNThEZWNvZGUodGhpcy5fbmV0d29yay5hdmF4QXNzZXRJRCk7XG4gICAgdGhpcy5fYmxvY2tjaGFpbklEID0gdXRpbHMuY2I1OERlY29kZSh0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRCk7XG4gICAgdGhpcy5fbmV0d29ya0lEID0gdGhpcy5fbmV0d29yay5uZXR3b3JrSUQ7XG4gIH1cblxuICBnZXQgYXZheFBUcmFuc2FjdGlvbigpOiBEZXByZWNhdGVkQmFzZVR4IHtcbiAgICByZXR1cm4gdGhpcy5fYXZheFRyYW5zYWN0aW9uLmdldFVuc2lnbmVkVHgoKS5nZXRUcmFuc2FjdGlvbigpO1xuICB9XG5cbiAgZ2V0IHNpZ25hdHVyZSgpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmNyZWRlbnRpYWxzIHx8IHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIC8vIFVzZSB0aGUgaW50ZXJzZWN0aW9uIG9mIG5vbi1lbXB0eSBFQ0RTQXMgYWNyb3NzIGFsbCBjcmVkZW50aWFscy4gQSBzaWduZXInc1xuICAgIC8vIEVDRFNBIGlzIGNvdW50ZWQgb25seSBpZiBpdCBhcHBlYXJzIGluIGV2ZXJ5IGNyZWRlbnRpYWwgKGV2ZXJ5IGlucHV0KS4gU2luY2VcbiAgICAvLyBSRkM2OTc5IGlzIGRldGVybWluaXN0aWMsIHRoZSBzYW1lIGtleSBwcm9kdWNlcyBpZGVudGljYWwgYnl0ZXMgZm9yIHRoZSBzYW1lXG4gICAgLy8gdHggYWNyb3NzIGFsbCBjcmVkZW50aWFscy4gVGhlIGludGVyc2VjdGlvbiBjYXRjaGVzIGNvcnJ1cHQgc3RhdGVzIHdoZXJlIG9uZVxuICAgIC8vIGNyZWRlbnRpYWwgaXMgbWlzc2luZyBhIHNpZ25hdHVyZSB0aGF0IGFub3RoZXIgY3JlZGVudGlhbCBhbHJlYWR5IGhhcy5cbiAgICBsZXQgaW50ZXJzZWN0aW9uOiBTZXQ8c3RyaW5nPiB8IG51bGwgPSBudWxsO1xuICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNyZWRlbnRpYWxzKSB7XG4gICAgICBjb25zdCBjczogYW55ID0gYy5zZXJpYWxpemUoKTtcbiAgICAgIGNvbnN0IGNyZWRTaWdzID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgICBjcy5zaWdBcnJheS5tYXAoKHM6IGFueSkgPT4gcy5ieXRlcyBhcyBzdHJpbmcpLmZpbHRlcigoYjogc3RyaW5nKSA9PiAhaXNFbXB0eVNpZ25hdHVyZShiKSlcbiAgICAgICk7XG4gICAgICBpZiAoaW50ZXJzZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgIGludGVyc2VjdGlvbiA9IGNyZWRTaWdzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm9yIChjb25zdCBzaWcgb2YgaW50ZXJzZWN0aW9uKSB7XG4gICAgICAgICAgaWYgKCFjcmVkU2lncy5oYXMoc2lnKSkge1xuICAgICAgICAgICAgaW50ZXJzZWN0aW9uLmRlbGV0ZShzaWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9uID8gWy4uLmludGVyc2VjdGlvbl0gOiBbXTtcbiAgfVxuXG4gIGdldCBjcmVkZW50aWFscygpOiBDcmVkZW50aWFsW10ge1xuICAgIHJldHVybiAodGhpcy5fYXZheFRyYW5zYWN0aW9uIGFzIGFueSk/LmNyZWRlbnRpYWxzO1xuICB9XG5cbiAgZ2V0IGhhc0NyZWRlbnRpYWxzKCk6IGJvb2xlYW4ge1xuICAgIC8vIEd1YXJkIGFnYWluc3QgY3JlZGVudGlhbCByZWdlbmVyYXRpb24gd2hlbmV2ZXIgY3JlZGVudGlhbHMgaGF2ZSBiZWVuIHNldCBmcm9tIGEgcGFyc2VkIHR4LlxuICAgIC8vIE11c3QgdXNlICE9IG51bGwgKG5vdCBsZW5ndGggY2hlY2spIHNvIGNyZWRlbnRpYWxzPVtdIHN0aWxsIGJsb2NrcyBidWlsZEF2YXhUcmFuc2FjdGlvbigpXG4gICAgLy8gZnJvbSB3aXBpbmcgYSBwYXJ0aWFsbHktc2lnbmVkIHN0YXRlLlxuICAgIHJldHVybiB0aGlzLmNyZWRlbnRpYWxzICE9IG51bGw7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgY2FuU2lnbih7IGtleSB9OiBCYXNlS2V5KTogYm9vbGVhbiB7XG4gICAgLy8gVE9ETyhCRy01NjcwMCk6ICBJbXByb3ZlIGNhblNpZ24gYnkgY2hlY2sgaW4gYWRkcmVzc2VzIGluIGVtcHR5IGNyZWRlbnRpYWxzIG1hdGNoIHNpZ25lclxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gYSBhdmF4cCB0cmFuc2FjdGlvbiBhbmQgdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBoZXhcbiAgICogdmFsaWRhdG9yLCBkZWxlZ2F0b3IsIGltcG9ydCwgZXhwb3J0cyBleHRlbmQgYmFzZVR4XG4gICAqIHVuc2lnbmVkVHg6IFVuc2lnbmVkVHggPSBuZXcgVW5zaWduZWRUeChiYXNlVHgpICAoYmFzZVR4ID0gYWRkVmFsaWRhdG9yVHgpXG4gICAqIGNvbnN0IHR4OiBUeCA9IHVuc2lnbmVkVHguc2lnbihrZXljaGFpbikgKHR4IGlzIHR5cGUgc3RhbmRhcmQgc2lnbmVkIHR4KVxuICAgKiBnZXQgYmFzZVR4IHRoZW4gY3JlYXRlIG5ldyB1bnNpZ25lZFR4IHRoZW4gc2lnblxuICAgKlxuICAgKiBAcGFyYW0ge0tleVBhaXJ9IGtleVBhaXJcbiAgICovXG4gIHNpZ24oa2V5UGFpcjogS2V5UGFpcik6IHZvaWQge1xuICAgIGNvbnN0IHBydiA9IGtleVBhaXIuZ2V0UHJpdmF0ZUtleSgpO1xuICAgIGNvbnN0IGFkZHJlc3NIZXggPSBrZXlQYWlyLmdldEFkZHJlc3NCdWZmZXIoKS50b1N0cmluZygnaGV4Jyk7XG4gICAgaWYgKCFwcnYpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgdHJhbnNhY3Rpb24gdG8gc2lnbicpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuY3JlZGVudGlhbHMgfHwgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignZW1wdHkgY3JlZGVudGlhbHMgdG8gc2lnbicpO1xuICAgIH1cbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLmNyZWF0ZVNpZ25hdHVyZShwcnYpO1xuICAgIGxldCBjaGVja1NpZ246IENoZWNrU2lnbmF0dXJlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY3JlZGVudGlhbHMuZm9yRWFjaCgoYywgaW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IGNzOiBhbnkgPSBjLnNlcmlhbGl6ZSgpO1xuICAgICAgaWYgKGNoZWNrU2lnbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNoZWNrU2lnbiA9IGdlbmVyYXRlU2VsZWN0b3JTaWduYXR1cmUoY3Muc2lnQXJyYXkpO1xuICAgICAgfVxuICAgICAgbGV0IGZpbmQgPSBmYWxzZTtcbiAgICAgIGNzLnNpZ0FycmF5LmZvckVhY2goKHNpZykgPT4ge1xuICAgICAgICBpZiAoY2hlY2tTaWduICYmIGNoZWNrU2lnbihzaWcsIGFkZHJlc3NIZXgpKSB7XG4gICAgICAgICAgc2lnLmJ5dGVzID0gc2lnbmF0dXJlO1xuICAgICAgICAgIGZpbmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGlmICghZmluZCkgdGhyb3cgbmV3IFNpZ25pbmdFcnJvcignUHJpdmF0ZSBrZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uJyk7XG4gICAgICBjLmRlc2VyaWFsaXplKGNzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICAvKipcbiAgICogc2hvdWxkIGJlIG9mIHNpZ25lZFR4IGRvaW5nIHRoaXMgd2l0aCBiYXNlVHhcbiAgICovXG4gIHRvQnJvYWRjYXN0Rm9ybWF0KCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmF2YXhQVHJhbnNhY3Rpb24pIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcignRW1wdHkgdHJhbnNhY3Rpb24gZGF0YScpO1xuICAgIH1cbiAgICAvLyBCbG9jayB0aGUgZXhhY3Qgc2hhcGUgcHJvZHVjZWQgYnkgdGhlIGhhc0NyZWRlbnRpYWxzIGd1YXJkIGJ5cGFzcyAoQ0VDSE8tMTY5Nyk6XG4gICAgLy8gYSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyZXNzIHBsYWNlaG9sZGVyIChyPTApIGluIHRoZSBzYW1lIGNyZWRlbnRpYWwgc2V0LlxuICAgIC8vIE5vcm1hbCBzdGF0ZXMgYXJlIHNhZmU6IHVuc2lnbmVkIHR4cyBoYXZlIGNyZWRlbnRpYWxzPW51bGwgKG5vdCB5ZXQgc2V0KTsgaGFsZi1zaWduZWRcbiAgICAvLyB0eHMgaGF2ZSBlbXB0eS16ZXJvIHNsb3RzIChub3QgYWRkciBwbGFjZWhvbGRlcnMpIGluIHVuZmlsbGVkIHBvc2l0aW9ucy5cbiAgICAvLyBjcmVkZW50aWFscz1bXSBpcyBhbHdheXMgYSBidWc6IGhhc0NyZWRlbnRpYWxzIHJldHVybnMgdHJ1ZSBmb3IgW10gYnV0IHRoZSBhcnJheSBpc1xuICAgIC8vIGVtcHR5LCBzbyBubyBzaWduZXIgaGFzIHRvdWNoZWQgdGhlIHR4IOKAlCBzZXJpYWxpemluZyBpdCB3b3VsZCBwcm9kdWNlIGEgemVyby1jcmVkZW50aWFsIHR4LlxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzICE9IG51bGwgJiYgdGhpcy5jcmVkZW50aWFscy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcigndHJhbnNhY3Rpb24gaGFzIG5vIGNyZWRlbnRpYWxzIOKAlCBjYW5ub3QgYnJvYWRjYXN0Jyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNyZWRlbnRpYWxzICYmIHRoaXMuY3JlZGVudGlhbHMubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGhhc1JlYWxTaWcgPSBmYWxzZTtcbiAgICAgIGxldCBoYXNBZGRyUGxhY2Vob2xkZXIgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3QgYyBvZiB0aGlzLmNyZWRlbnRpYWxzKSB7XG4gICAgICAgIGNvbnN0IGNzOiBhbnkgPSBjLnNlcmlhbGl6ZSgpO1xuICAgICAgICBmb3IgKGNvbnN0IHMgb2YgY3Muc2lnQXJyYXkpIHtcbiAgICAgICAgICBpZiAoIWlzRW1wdHlTaWduYXR1cmUocy5ieXRlcykpIHtcbiAgICAgICAgICAgIGhhc1JlYWxTaWcgPSB0cnVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNBZGRyUGxhY2Vob2xkZXIocy5ieXRlcykpIHtcbiAgICAgICAgICAgIGhhc0FkZHJQbGFjZWhvbGRlciA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaGFzUmVhbFNpZyAmJiBoYXNBZGRyUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAgICd0cmFuc2FjdGlvbiBoYXMgYSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyZXNzIHBsYWNlaG9sZGVyIChyPTApOiBpbmNvbXBsZXRlIHNpZ25pbmcgZGV0ZWN0ZWQsIHJlZnVzaW5nIGJyb2FkY2FzdCdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F2YXhUcmFuc2FjdGlvbi50b1N0cmluZ0hleCgpO1xuICB9XG5cbiAgLy8gdHlwZXMgLSBzdGFraW5nVHJhbnNhY3Rpb24sIGltcG9ydCwgZXhwb3J0XG4gIHRvSnNvbigpOiBUeERhdGEge1xuICAgIGlmICghdGhpcy5hdmF4UFRyYW5zYWN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IoJ0VtcHR5IHRyYW5zYWN0aW9uIGRhdGEnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIGZyb21BZGRyZXNzZXM6IHRoaXMuZnJvbUFkZHJlc3NlcyxcbiAgICAgIHRocmVzaG9sZDogdGhpcy5fdGhyZXNob2xkLFxuICAgICAgbG9ja3RpbWU6IHRoaXMuX2xvY2t0aW1lLnRvU3RyaW5nKCksXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICBzaWduYXR1cmVzOiB0aGlzLnNpZ25hdHVyZSxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0cyxcbiAgICAgIGNoYW5nZU91dHB1dHM6IHRoaXMuY2hhbmdlT3V0cHV0cyxcbiAgICAgIHNvdXJjZUNoYWluOiB0aGlzLnNvdXJjZUNoYWluLFxuICAgICAgZGVzdGluYXRpb25DaGFpbjogdGhpcy5kZXN0aW5hdGlvbkNoYWluLFxuICAgIH07XG4gIH1cblxuICBzZXRUcmFuc2FjdGlvbih0eDogRGVwcmVjYXRlZFR4KTogdm9pZCB7XG4gICAgdGhpcy5fYXZheFRyYW5zYWN0aW9uID0gdHg7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB0cmFuc2FjdGlvbiB0eXBlXG4gICAqXG4gICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25UeXBlfSB0cmFuc2FjdGlvblR5cGUgVGhlIHRyYW5zYWN0aW9uIHR5cGUgdG8gYmUgc2V0XG4gICAqL1xuICBzZXRUcmFuc2FjdGlvblR5cGUodHJhbnNhY3Rpb25UeXBlOiBUcmFuc2FjdGlvblR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLl90eXBlID0gdHJhbnNhY3Rpb25UeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHBvcnRpb24gb2YgdGhlIHRyYW5zYWN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgc2lnbmVkIGluIEJ1ZmZlciBmb3JtYXQuXG4gICAqIE9ubHkgbmVlZGVkIGZvciBjb2lucyB0aGF0IHN1cHBvcnQgYWRkaW5nIHNpZ25hdHVyZXMgZGlyZWN0bHkgKGUuZy4gVFNTKS5cbiAgICovXG4gIGdldCBzaWduYWJsZVBheWxvYWQoKTogQnVmZmVyIHtcbiAgICByZXR1cm4gdXRpbHMuc2hhMjU2KHRoaXMuX2F2YXhUcmFuc2FjdGlvbi5nZXRVbnNpZ25lZFR4KCkudG9CdWZmZXIoKSk7XG4gIH1cblxuICBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdXRpbHMuY2I1OEVuY29kZShCdWZmZXJBdmF4LmZyb20odXRpbHMuc2hhMjU2KHRoaXMuX2F2YXhUcmFuc2FjdGlvbi50b0J1ZmZlcigpKSkpO1xuICB9XG5cbiAgZ2V0IGZyb21BZGRyZXNzZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9mcm9tQWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMuYWRkcmVzc1RvU3RyaW5nKHRoaXMuX25ldHdvcmsuaHJwLCB0aGlzLl9uZXR3b3JrLmFsaWFzLCBhKSk7XG4gIH1cblxuICBnZXQgcmV3YXJkQWRkcmVzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5fcmV3YXJkQWRkcmVzc2VzLm1hcCgoYSkgPT4gdXRpbHMuYWRkcmVzc1RvU3RyaW5nKHRoaXMuX25ldHdvcmsuaHJwLCB0aGlzLl9uZXR3b3JrLmFsaWFzLCBhKSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0IG9mIG91dHB1dHMuIEFtb3VudHMgYXJlIGV4cHJlc3NlZCBpbiBhYnNvbHV0ZSB2YWx1ZS5cbiAgICovXG4gIGdldCBvdXRwdXRzKCk6IEVudHJ5W10ge1xuICAgIHN3aXRjaCAodGhpcy50eXBlKSB7XG4gICAgICBjYXNlIFRyYW5zYWN0aW9uVHlwZS5JbXBvcnQ6XG4gICAgICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEltcG9ydFR4IHwgRVZNSW1wb3J0VHgpXG4gICAgICAgICAgLmdldE91dHMoKVxuICAgICAgICAgIC5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBpZiAodXRpbHMuaXNUcmFuc2FjdGlvbk9mKHRoaXMuX2F2YXhUcmFuc2FjdGlvbiwgdGhpcy5fbmV0d29yay5jQ2hhaW5CbG9ja2NoYWluSUQpKSB7XG4gICAgICAgICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgRVZNRXhwb3J0VHgpXG4gICAgICAgICAgICAuZ2V0RXhwb3J0ZWRPdXRwdXRzKClcbiAgICAgICAgICAgIC5tYXAodXRpbHMuZGVwcmVjYXRlZE1hcE91dHB1dFRvRW50cnkodGhpcy5fbmV0d29yaykpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEV4cG9ydFR4KVxuICAgICAgICAgICAgLmdldEV4cG9ydE91dHB1dHMoKVxuICAgICAgICAgICAgLm1hcCh1dGlscy5kZXByZWNhdGVkTWFwT3V0cHV0VG9FbnRyeSh0aGlzLl9uZXR3b3JrKSk7XG4gICAgICAgIH1cbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZERlbGVnYXRvcjpcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkFkZFZhbGlkYXRvcjpcbiAgICAgICAgLy8gR2V0IHN0YWtlZCBvdXRwdXRzXG4gICAgICAgIGNvbnN0IGFkZFZhbGlkYXRvclR4ID0gdGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEFkZERlbGVnYXRvclR4O1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFkZHJlc3M6IGFkZFZhbGlkYXRvclR4LmdldE5vZGVJRFN0cmluZygpLFxuICAgICAgICAgICAgdmFsdWU6IGFkZFZhbGlkYXRvclR4LmdldFN0YWtlQW1vdW50KCkudG9TdHJpbmcoKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBUcmFuc2FzY3Rpb24gRmVlLlxuICAgKi9cbiAgZ2V0IGZlZSgpOiBUcmFuc2FjdGlvbkZlZSB7XG4gICAgcmV0dXJuIHsgZmVlOiAnMCcsIC4uLnRoaXMuX2ZlZSB9O1xuICB9XG5cbiAgZ2V0IGNoYW5nZU91dHB1dHMoKTogRW50cnlbXSB7XG4gICAgLy8gQy1jaGFpbiB0eCBhZG4gSW1wb3J0IFR4cyBkb24ndCBoYXZlIGNoYW5nZSBvdXRwdXRzXG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0IHx8XG4gICAgICB1dGlscy5pc1RyYW5zYWN0aW9uT2YodGhpcy5fYXZheFRyYW5zYWN0aW9uLCB0aGlzLl9uZXR3b3JrLmNDaGFpbkJsb2NrY2hhaW5JRClcbiAgICApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gZ2VuZXJhbCBzdXBwb3J0IGFueSB0cmFuc2FjdGlvbiB0eXBlLCBidXQgaXQncyBzY29wZWQgeWV0XG4gICAgcmV0dXJuICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgUFZNQmFzZVR4KS5nZXRPdXRzKCkubWFwKHV0aWxzLmRlcHJlY2F0ZWRNYXBPdXRwdXRUb0VudHJ5KHRoaXMuX25ldHdvcmspKTtcbiAgfVxuXG4gIGdldCBpbnB1dHMoKTogRW50cnlbXSB7XG4gICAgbGV0IGlucHV0cztcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICBpbnB1dHMgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEltcG9ydFR4IHwgRVZNSW1wb3J0VHgpLmdldEltcG9ydElucHV0cygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgaWYgKHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKSkge1xuICAgICAgICAgIHJldHVybiAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEVWTUV4cG9ydFR4KS5nZXRJbnB1dHMoKS5tYXAoKGV2bUlucHV0KSA9PiAoe1xuICAgICAgICAgICAgYWRkcmVzczogJzB4JyArIGV2bUlucHV0LmdldEFkZHJlc3NTdHJpbmcoKSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgQk4oKGV2bUlucHV0IGFzIGFueSkuYW1vdW50KS50b1N0cmluZygpLFxuICAgICAgICAgICAgbm9uY2U6IGV2bUlucHV0LmdldE5vbmNlKCkudG9OdW1iZXIoKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXRzID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBQVk1CYXNlVHgpLmdldElucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlucHV0cyA9ICh0aGlzLmF2YXhQVHJhbnNhY3Rpb24gYXMgUFZNQmFzZVR4KS5nZXRJbnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBhbW91bnRJbnB1dCA9IGlucHV0LmdldElucHV0KCkgYXMgYW55IGFzIEFtb3VudElucHV0O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHV0aWxzLmNiNThFbmNvZGUoaW5wdXQuZ2V0VHhJRCgpKSArIElOUFVUX1NFUEFSQVRPUiArIHV0aWxzLm91dHB1dGlkeEJ1ZmZlclRvTnVtYmVyKGlucHV0LmdldE91dHB1dElkeCgpKSxcbiAgICAgICAgYWRkcmVzczogdGhpcy5mcm9tQWRkcmVzc2VzLnNvcnQoKS5qb2luKEFERFJFU1NfU0VQQVJBVE9SKSxcbiAgICAgICAgdmFsdWU6IGFtb3VudElucHV0LmdldEFtb3VudCgpLnRvU3RyaW5nKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEF2YXggd3JhcHBlciB0byBjcmVhdGUgc2lnbmF0dXJlIGFuZCByZXR1cm4gaXQgZm9yIGNyZWRlbnRpYWxzXG4gICAqIEBwYXJhbSBwcnZcbiAgICogQHJldHVybiBoZXhzdHJpbmdcbiAgICovXG4gIGNyZWF0ZVNpZ25hdHVyZShwcnY6IEJ1ZmZlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc2lnbnZhbCA9IHV0aWxzLmNyZWF0ZVNpZ25hdHVyZUF2YXhCdWZmZXIoXG4gICAgICB0aGlzLl9uZXR3b3JrLFxuICAgICAgQnVmZmVyQXZheC5mcm9tKHRoaXMuc2lnbmFibGVQYXlsb2FkKSxcbiAgICAgIEJ1ZmZlckF2YXguZnJvbShwcnYpXG4gICAgKTtcbiAgICByZXR1cm4gc2lnbnZhbC50b1N0cmluZygnaGV4Jyk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgZXhwbGFpblRyYW5zYWN0aW9uKCk6IFRyYW5zYWN0aW9uRXhwbGFuYXRpb24ge1xuICAgIGNvbnN0IHR4SnNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3QgZGlzcGxheU9yZGVyID0gWydpZCcsICdpbnB1dHMnLCAnb3V0cHV0QW1vdW50JywgJ2NoYW5nZUFtb3VudCcsICdvdXRwdXRzJywgJ2NoYW5nZU91dHB1dHMnLCAnZmVlJywgJ3R5cGUnXTtcblxuICAgIGNvbnN0IG91dHB1dEFtb3VudCA9IHR4SnNvbi5vdXRwdXRzLnJlZHVjZSgocCwgbikgPT4gcC5hZGQobmV3IEJOKG4udmFsdWUpKSwgbmV3IEJOKDApKS50b1N0cmluZygpO1xuICAgIGNvbnN0IGNoYW5nZUFtb3VudCA9IHR4SnNvbi5jaGFuZ2VPdXRwdXRzLnJlZHVjZSgocCwgbikgPT4gcC5hZGQobmV3IEJOKG4udmFsdWUpKSwgbmV3IEJOKDApKS50b1N0cmluZygpO1xuXG4gICAgbGV0IHJld2FyZEFkZHJlc3NlcztcbiAgICBpZiAoW1RyYW5zYWN0aW9uVHlwZS5BZGRWYWxpZGF0b3IsIFRyYW5zYWN0aW9uVHlwZS5BZGREZWxlZ2F0b3JdLmluY2x1ZGVzKHR4SnNvbi50eXBlKSkge1xuICAgICAgcmV3YXJkQWRkcmVzc2VzID0gdGhpcy5yZXdhcmRBZGRyZXNzZXM7XG4gICAgICBkaXNwbGF5T3JkZXIuc3BsaWNlKDYsIDAsICdyZXdhcmRBZGRyZXNzZXMnKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU9yZGVyLFxuICAgICAgaWQ6IHR4SnNvbi5pZCxcbiAgICAgIGlucHV0czogdHhKc29uLmlucHV0cyxcbiAgICAgIG91dHB1dHM6IHR4SnNvbi5vdXRwdXRzLm1hcCgobykgPT4gKHsgYWRkcmVzczogby5hZGRyZXNzLCBhbW91bnQ6IG8udmFsdWUgfSkpLFxuICAgICAgb3V0cHV0QW1vdW50LFxuICAgICAgY2hhbmdlT3V0cHV0czogdHhKc29uLmNoYW5nZU91dHB1dHMubWFwKChvKSA9PiAoeyBhZGRyZXNzOiBvLmFkZHJlc3MsIGFtb3VudDogby52YWx1ZSB9KSksXG4gICAgICBjaGFuZ2VBbW91bnQsXG4gICAgICByZXdhcmRBZGRyZXNzZXMsXG4gICAgICBmZWU6IHRoaXMuZmVlLFxuICAgICAgdHlwZTogdHhKc29uLnR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGlzIHRyYW5zYWN0aW9uIGlzIGEgUCBjaGFpblxuICAgKi9cbiAgZ2V0IGlzVHJhbnNhY3Rpb25Gb3JDQ2hhaW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHV0aWxzLmlzVHJhbnNhY3Rpb25PZih0aGlzLl9hdmF4VHJhbnNhY3Rpb24sIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIHNvdXJjZSBjaGFpbiBpZCBvciB1bmRlZmluZWQgaWYgaXQncyBhIGNyb3NzIGNoYWluIHRyYW5zZmVyLlxuICAgKi9cbiAgZ2V0IHNvdXJjZUNoYWluKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGJsb2NrY2hhaW5JRDtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICBibG9ja2NoYWluSUQgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEltcG9ydFR4IHwgRVZNSW1wb3J0VHgpLmdldFNvdXJjZUNoYWluKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuRXhwb3J0OlxuICAgICAgICBibG9ja2NoYWluSUQgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEV4cG9ydFR4IHwgRVZNRXhwb3J0VHgpLmdldEJsb2NrY2hhaW5JRCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJsb2NrY2hhaW5JRHRvQWxpYXMoYmxvY2tjaGFpbklEKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIGRlc3RpbmF0aW9uQ2hhaW4gb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBjcm9zcyBjaGFpbiB0cmFuc2Zlci5cbiAgICovXG4gIGdldCBkZXN0aW5hdGlvbkNoYWluKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgbGV0IGJsb2NrY2hhaW5JRDtcbiAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgY2FzZSBUcmFuc2FjdGlvblR5cGUuSW1wb3J0OlxuICAgICAgICBibG9ja2NoYWluSUQgPSAodGhpcy5hdmF4UFRyYW5zYWN0aW9uIGFzIEltcG9ydFR4IHwgRVZNSW1wb3J0VHgpLmdldEJsb2NrY2hhaW5JRCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgVHJhbnNhY3Rpb25UeXBlLkV4cG9ydDpcbiAgICAgICAgYmxvY2tjaGFpbklEID0gKHRoaXMuYXZheFBUcmFuc2FjdGlvbiBhcyBFeHBvcnRUeCB8IEVWTUV4cG9ydFR4KS5nZXREZXN0aW5hdGlvbkNoYWluKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmxvY2tjaGFpbklEdG9BbGlhcyhibG9ja2NoYWluSUQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnQgYSBibG9ja2NoYWluSWQgYnVmZmVyIHRvIHN0cmluZyBhbmQgcmV0dXJuIFAgb3IgQyBhbGlhcyBpZiBtYXRjaCBvZiBhbnkgb2YgdGhhdCBjaGFpbnMuXG4gICAqIEBwYXJhbSB7QnVmZmVyQXZheH0gYmxvY2tjaGFpbklEQnVmZmVyXG4gICAqIEByZXR1cm4ge3N0cmluZ30gYmxvY2NoYWluSUQgb3IgYWxpYXMgaWYgZXhpc3RzLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBibG9ja2NoYWluSUR0b0FsaWFzKGJsb2NrY2hhaW5JREJ1ZmZlcjogQnVmZmVyQXZheCk6IHN0cmluZyB7XG4gICAgY29uc3QgYmxvY2tjaGFpbklkID0gdXRpbHMuY2I1OEVuY29kZShibG9ja2NoYWluSURCdWZmZXIpO1xuICAgIHN3aXRjaCAoYmxvY2tjaGFpbklkKSB7XG4gICAgICBjYXNlIHRoaXMuX25ldHdvcmsuY0NoYWluQmxvY2tjaGFpbklEOlxuICAgICAgICByZXR1cm4gJ0MnO1xuICAgICAgY2FzZSB0aGlzLl9uZXR3b3JrLmJsb2NrY2hhaW5JRDpcbiAgICAgICAgcmV0dXJuICdQJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBibG9ja2NoYWluSWQ7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -156,6 +156,129 @@ describe('AvaxP Export P2C Tx Builder', () => {
156
156
  prv2: testData.EXPORT_P_2_C_WITHOUT_CHANGEOUTPUT.privKey.prv2,
157
157
  },
158
158
  });
159
+ describe('Credential guard bypass regression (CECHO-1697)', () => {
160
+ // Regression for production incident 2026-07-16:
161
+ // tx 8xbiLpsKDKkJrN3YUqcZpFcxApLCwmQkpKUuvmHU1GL9RmAyu was broadcast
162
+ // with sig[1] still an address placeholder (r=0) because hasCredentials([])
163
+ // returned false, causing buildAvaxTransaction() to wipe Signer 1's ECDSA.
164
+ const data = testData.EXPORT_P_2_C;
165
+ it('hasCredentials returns true for credentials=[] preventing credential wipe', async () => {
166
+ // Signer 1 half-signs
167
+ const signer1Builder = factory.from(data.unsignedTxHex);
168
+ signer1Builder.sign({ key: data.privKey.prv1 });
169
+ const halfSignedTx = await signer1Builder.build();
170
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
171
+ // Simulate the bug trigger: credentials=[] on the parsed tx
172
+ const signer2Builder = factory.from(halfSignedHex);
173
+ const internalTx = signer2Builder.transaction;
174
+ // Force credentials to [] as happens in production deserialization edge case
175
+ internalTx._avaxTransaction.credentials = [];
176
+ // Before fix: hasCredentials was false → buildAvaxTransaction() would regenerate
177
+ // After fix: hasCredentials is true → guard fires → credentials preserved
178
+ internalTx.hasCredentials.should.be.true('hasCredentials must return true for credentials=[] to block credential regeneration');
179
+ });
180
+ it('credential regeneration is blocked when credentials=[] preventing Signer 1 ECDSA wipe', async () => {
181
+ // Signer 1 half-signs
182
+ const signer1Builder = factory.from(data.unsignedTxHex);
183
+ signer1Builder.sign({ key: data.privKey.prv1 });
184
+ const halfSignedTx = await signer1Builder.build();
185
+ const halfSignedHex = halfSignedTx.toBroadcastFormat();
186
+ // Simulate bug: force credentials=[] before Signer 2 calls build()
187
+ const signer2Builder = factory.from(halfSignedHex);
188
+ const internalTx = signer2Builder.transaction;
189
+ internalTx._avaxTransaction.credentials = [];
190
+ // build() must NOT regenerate fresh placeholder credentials
191
+ const rebuilt = await signer2Builder.build();
192
+ const rebuiltCreds = rebuilt.credentials;
193
+ // After fix: credentials stay as [] (guard fired, no regeneration)
194
+ // Before fix: credentials would be regenerated to N×[PLACEHOLDER, PLACEHOLDER]
195
+ rebuiltCreds.length.should.equal(0, 'build() must not regenerate credentials when credentials=[] — guard must fire');
196
+ });
197
+ it('signature getter exposes incomplete signing across all credentials', async () => {
198
+ // Signer 1 half-signs only
199
+ const signer1Builder = factory.from(data.unsignedTxHex);
200
+ signer1Builder.sign({ key: data.privKey.prv1 });
201
+ const halfSignedTx = await signer1Builder.build();
202
+ // After Signer 1: signature getter must show exactly 1 real ECDSA
203
+ halfSignedTx.signature.length.should.equal(1, 'should expose exactly 1 real ECDSA after first signer — Signer 2 slot is still empty');
204
+ // Simulate the corrupt state the PR targets: fully sign the tx, then corrupt
205
+ // one credential so that credentials[0] has both ECDSAs but credentials[1]
206
+ // only has one. A union would still return 2 (masking the corruption).
207
+ // The intersection must return 1 because the second signer's ECDSA is absent
208
+ // from credentials[1].
209
+ const fullBuilder = factory.from(data.halfsigntxHex);
210
+ fullBuilder.sign({ key: data.privKey.prv2 });
211
+ const fullTx = await fullBuilder.build();
212
+ fullTx.signature.length.should.equal(2, 'sanity: fully signed tx should have 2 signatures');
213
+ // 90 hex chars of leading zeros is the empty-signature prefix used by isEmptySignature().
214
+ const EMPTY_SIG_ZERO_PREFIX = ''.padStart(90, '0');
215
+ // Corrupt credentials[1]: zero out Signer 2's slot so the intersection drops to 1.
216
+ // Use assertions instead of guards so the test fails loudly if the tx shape changes.
217
+ const creds = fullTx.credentials;
218
+ assert_1.default.ok(creds && creds.length >= 2, 'fully signed tx must have at least 2 credentials');
219
+ const cred1 = creds[1];
220
+ const cs1 = cred1.serialize();
221
+ const targetIdx = cs1.sigArray.findIndex((s, i) => i > 0 && !s.bytes.startsWith(EMPTY_SIG_ZERO_PREFIX));
222
+ assert_1.default.ok(targetIdx !== -1, 'credentials[1] must have a non-empty slot beyond index 0 (Signer 2 slot)');
223
+ cs1.sigArray[targetIdx].bytes = ''.padStart(cs1.sigArray[targetIdx].bytes.length, '0');
224
+ cred1.deserialize(cs1);
225
+ // With intersection, removing ECDSA2 from credentials[1] must reduce the count to 1.
226
+ fullTx.signature.length.should.equal(1, 'intersection must detect that credentials[1] is missing ECDSA2 — incomplete signing visible');
227
+ });
228
+ it('full sign from half-signed hex produces 2 real ECDSAs and correct tx', async () => {
229
+ // This is the exact flow that MUST work in production after the fix:
230
+ // Signer 2 takes Signer 1's half-signed hex and fills the remaining slot.
231
+ const txBuilder = factory.from(data.halfsigntxHex);
232
+ txBuilder.sign({ key: data.privKey.prv2 });
233
+ const tx = await txBuilder.build();
234
+ tx.toBroadcastFormat().should.equal(data.fullsigntxHex);
235
+ tx.signature.length.should.equal(2, 'both HSM signer slots must be filled with real ECDSAs');
236
+ });
237
+ it('sign() throws on empty credentials rather than silently producing bad tx', async () => {
238
+ // Signer 1 half-signs
239
+ const signer1Builder = factory.from(data.unsignedTxHex);
240
+ signer1Builder.sign({ key: data.privKey.prv1 });
241
+ const halfTx = await signer1Builder.build();
242
+ // Simulate bug: credentials wiped to [] before Signer 2 signs
243
+ const signer2Builder = factory.from(halfTx.toBroadcastFormat());
244
+ signer2Builder.sign({ key: data.privKey.prv2 });
245
+ signer2Builder.transaction._avaxTransaction.credentials = [];
246
+ // build() calls transaction.sign() which must throw — not silently produce a bad tx
247
+ await signer2Builder
248
+ .build()
249
+ .then(() => assert_1.default.fail('Expected sign to throw on empty credentials'))
250
+ .catch((e) => {
251
+ e.message.should.equal('empty credentials to sign');
252
+ });
253
+ });
254
+ it('toBroadcastFormat() throws when real ECDSA coexists with address placeholder (production failure shape)', async () => {
255
+ // Reproduce the exact credential layout from the Jul 16 production failure:
256
+ // slot[0] = real ECDSA (Signer 2 filled wrong slot due to MODE 1 mismatch)
257
+ // slot[1] = ADDR_PLACEHOLDER (r=0, 90 zero hex chars + HSM1 address)
258
+ // This is the shape that AvalancheGo rejected with "failed verifySpend: invalid signature".
259
+ const EMPTY_SIG_ZERO_PREFIX = ''.padStart(90, '0');
260
+ const signer1Builder = factory.from(data.unsignedTxHex);
261
+ signer1Builder.sign({ key: data.privKey.prv1 });
262
+ const halfTx = await signer1Builder.build();
263
+ const fullBuilder = factory.from(halfTx.toBroadcastFormat());
264
+ fullBuilder.sign({ key: data.privKey.prv2 });
265
+ const fullTx = (await fullBuilder.build());
266
+ // Corrupt credentials: swap slot[0] (realECDSA1) with an addr placeholder,
267
+ // leaving slot[1] = realECDSA2. This mimics the bug output where a real ECDSA
268
+ // coexists with an addr placeholder in the same credential.
269
+ const creds = fullTx.credentials;
270
+ if (creds && creds.length > 0) {
271
+ const cred0 = creds[0];
272
+ const cs = cred0.serialize();
273
+ // Build a fake addr placeholder: 90 zeros + 40 hex chars of a mock address
274
+ const fakeAddrPlaceholder = EMPTY_SIG_ZERO_PREFIX + 'df32717bd7b7a2d50a715202795940250c7ba9e4';
275
+ cs.sigArray[0].bytes = fakeAddrPlaceholder;
276
+ cred0.deserialize(cs);
277
+ }
278
+ assert_1.default.throws(() => fullTx.toBroadcastFormat(), (e) => e.message ===
279
+ 'transaction has a real ECDSA alongside an address placeholder (r=0): incomplete signing detected, refusing broadcast');
280
+ });
281
+ });
159
282
  describe('Key cannot sign the transaction ', () => {
160
283
  const data = testData.EXPORT_P_2_C;
161
284
  it('Should full sign a export tx from unsigned raw tx', () => {
@@ -180,4 +303,4 @@ describe('AvaxP Export P2C Tx Builder', () => {
180
303
  });
181
304
  });
182
305
  });
183
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLGlEQUE0QztBQUM1QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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O1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUM3RCxNQUFNLFNBQVMsR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9GLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLFNBQVM7aUJBQ04sS0FBSyxFQUFFO2lCQUNQLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxnQkFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztpQkFDdEMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ2IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUNsRSxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIHRlc3REYXRhIGZyb20gJy4uLy4uL3Jlc291cmNlcy9hdmF4cCc7XG5pbXBvcnQgKiBhcyBlcnJvck1lc3NhZ2UgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2Vycm9ycyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5LCBEZWNvZGVkVXR4b09iaiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBzaWduRmxvd1Rlc3QgZnJvbSAnLi9zaWduRmxvd1Rlc3RTdWl0JztcblxuZGVzY3JpYmUoJ0F2YXhQIEV4cG9ydCBQMkMgVHggQnVpbGRlcicsICgpID0+IHtcbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpO1xuXG4gIGRlc2NyaWJlKCd2YWxpZGF0ZSB0eEJ1aWxkZXIgZmllbGRzJywgKCkgPT4ge1xuICAgIGNvbnN0IHR4QnVpbGRlciA9IGZhY3RvcnkuZ2V0RXhwb3J0QnVpbGRlcigpO1xuICAgIGl0KCdzaG91bGQgZmFpbCBhbW91bnQgbG93IHRoYW4gemVybycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuYW1vdW50KCctMScpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBsZW5ndGggaW5jb3JyZWN0JywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQoQnVmZmVyLmZyb20odGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCkpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9MRU5HVEhcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIG5vdCBhIHZhaWxkIGJhc2U1OCBzdHJpbmcnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5JTlZBTElEX0NIQUlOX0lEKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfTk9UX0JBU0U1OFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgY2I1OCBpbnZhbGlkIGNoZWNrc3VtJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuVkFMSURfQ19DSEFJTl9JRC5zbGljZSgyKSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX0lOVkFMSURfQ0hFQ0tTVU1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3MgZW1wdHkgc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfVVRYT1NfRU1QVFlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdmFsaWRhdGUgVXR4b3Mgd2l0aG91dCBhbW91bnQgZmllbGQnLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLnZhbGlkYXRlVXR4b3MoW3sgb3V0cHV0SUQ6ICcnIH0gYXMgYW55IGFzIERlY29kZWRVdHhvT2JqXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0FNT1VOVFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGggY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DLmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DLm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy51bnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5oYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5mdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjEsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyByZWNvdmVyeSB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuclVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJIYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5yRnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYzLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgd2l0aG91dCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQub3V0cHV0cyksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MSxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHJlY292ZXJ5IHdpdGhvdXQgY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULm91dHB1dHMpXG4gICAgICAgIC5yZWNvdmVyTW9kZSgpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5yVW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuckhhbGZzaWdudHhIZXgsXG4gICAgZnVsbHNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJGdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjMsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uICcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbChlcnJvck1lc3NhZ2UuRVJST1JfS0VZX0NBTk5PVF9TSUdOKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIDIgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnJVbnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0UDJDVHhCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L2xpYi9leHBvcnRQMkNUeEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsa0JBQWdCO0FBQ2hCLGdFQUFrRDtBQUNsRCxxRUFBdUQ7QUFDdkQsMENBQTZFO0FBQzdFLGlEQUE0QztBQUM1QywwRUFBOEM7QUFFOUMsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxNQUFNLE9BQU8sR0FBRyxJQUFJLCtCQUF5QixDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUVuRSxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzdDLEVBQUUsQ0FBQyxrQ0FBa0MsRUFBRSxHQUFHLEVBQUU7WUFDMUMsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekIsQ0FBQyxFQUNELENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLFlBQVksQ0FBQyxZQUFZLENBQ3BELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztRQUNILEVBQUUsQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDdEQsZ0JBQU0sQ0FBQyxNQUFNLENBQ1gsR0FBRyxFQUFFO2dCQUNILFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLENBQUMsRUFDRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFD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Q3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDN0QsTUFBTSxTQUFTLEdBQUcsSUFBSSwrQkFBeUIsQ0FBQyxlQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMvRixTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQyxTQUFTO2lCQUNOLEtBQUssRUFBRTtpQkFDUCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsZ0JBQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7aUJBQ3RDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNiLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFDbEUsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgJ3Nob3VsZCc7XG5pbXBvcnQgKiBhcyB0ZXN0RGF0YSBmcm9tICcuLi8uLi9yZXNvdXJjZXMvYXZheHAnO1xuaW1wb3J0ICogYXMgZXJyb3JNZXNzYWdlIGZyb20gJy4uLy4uL3Jlc291cmNlcy9lcnJvcnMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSwgRGVjb2RlZFV0eG9PYmogfSBmcm9tICcuLi8uLi8uLi9zcmMvbGliJztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgc2lnbkZsb3dUZXN0IGZyb20gJy4vc2lnbkZsb3dUZXN0U3VpdCc7XG5cbmRlc2NyaWJlKCdBdmF4UCBFeHBvcnQgUDJDIFR4IEJ1aWxkZXInLCAoKSA9PiB7XG4gIGNvbnN0IGZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKTtcblxuICBkZXNjcmliZSgndmFsaWRhdGUgdHhCdWlsZGVyIGZpZWxkcycsICgpID0+IHtcbiAgICBjb25zdCB0eEJ1aWxkZXIgPSBmYWN0b3J5LmdldEV4cG9ydEJ1aWxkZXIoKTtcbiAgICBpdCgnc2hvdWxkIGZhaWwgYW1vdW50IGxvdyB0aGFuIHplcm8nLCAoKSA9PiB7XG4gICAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdHhCdWlsZGVyLmFtb3VudCgnLTEnKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQU1PVU5UXG4gICAgICApO1xuICAgIH0pO1xuICAgIGl0KCdzaG91bGQgZmFpbCB0YXJnZXQgY2hhaW4gaWQgbGVuZ3RoIGluY29ycmVjdCcsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKEJ1ZmZlci5mcm9tKHRlc3REYXRhLklOVkFMSURfQ0hBSU5fSUQpKTtcbiAgICAgICAgfSxcbiAgICAgICAgKGU6IGFueSkgPT4gZS5tZXNzYWdlID09PSBlcnJvck1lc3NhZ2UuRVJST1JfQ0hBSU5fSURfTEVOR1RIXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHRhcmdldCBjaGFpbiBpZCBub3QgYSB2YWlsZCBiYXNlNTggc3RyaW5nJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci5leHRlcm5hbENoYWluSWQodGVzdERhdGEuSU5WQUxJRF9DSEFJTl9JRCk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX0NIQUlOX0lEX05PVF9CQVNFNThcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGZhaWwgdGFyZ2V0IGNoYWluIGlkIGNiNTggaW52YWxpZCBjaGVja3N1bScsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLlZBTElEX0NfQ0hBSU5fSUQuc2xpY2UoMikpO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9DSEFJTl9JRF9JTlZBTElEX0NIRUNLU1VNXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIGVtcHR5IHN0cmluZycsICgpID0+IHtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0eEJ1aWxkZXIudmFsaWRhdGVVdHhvcyhbXSk7XG4gICAgICAgIH0sXG4gICAgICAgIChlOiBhbnkpID0+IGUubWVzc2FnZSA9PT0gZXJyb3JNZXNzYWdlLkVSUk9SX1VUWE9TX0VNUFRZXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBmYWlsIHZhbGlkYXRlIFV0eG9zIHdpdGhvdXQgYW1vdW50IGZpZWxkJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHR4QnVpbGRlci52YWxpZGF0ZVV0eG9zKFt7IG91dHB1dElEOiAnJyB9IGFzIGFueSBhcyBEZWNvZGVkVXR4b09ial0pO1xuICAgICAgICB9LFxuICAgICAgICAoZTogYW55KSA9PiBlLm1lc3NhZ2UgPT09IGVycm9yTWVzc2FnZS5FUlJPUl9VVFhPU19BTU9VTlRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyB3aXRoIGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DLnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DLmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQy5vdXRwdXRzKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MudW5zaWduZWRUeEhleCxcbiAgICBoYWxmc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuaGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuZnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MucHJpdktleS5wcnYxLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBzaWduRmxvd1Rlc3Qoe1xuICAgIHRyYW5zYWN0aW9uVHlwZTogJ0V4cG9ydCBQMkMgcmVjb3Zlcnkgd2l0aCBjaGFuZ2VvdXRwdXQnLFxuICAgIG5ld1R4RmFjdG9yeTogKCkgPT4gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSksXG4gICAgbmV3VHhCdWlsZGVyOiAoKSA9PlxuICAgICAgbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSlcbiAgICAgICAgLmdldEV4cG9ydEJ1aWxkZXIoKVxuICAgICAgICAudGhyZXNob2xkKHRlc3REYXRhLkVYUE9SVF9QXzJfQy50aHJlc2hvbGQpXG4gICAgICAgIC5sb2NrdGltZSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0MubG9ja3RpbWUpXG4gICAgICAgIC5mcm9tUHViS2V5KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wQWRkcmVzc2VzKVxuICAgICAgICAuYW1vdW50KHRlc3REYXRhLkVYUE9SVF9QXzJfQy5hbW91bnQpXG4gICAgICAgIC5leHRlcm5hbENoYWluSWQodGVzdERhdGEuRVhQT1JUX1BfMl9DLnRhcmdldENoYWluSWQpXG4gICAgICAgIC51dHhvcyh0ZXN0RGF0YS5FWFBPUlRfUF8yX0Mub3V0cHV0cylcbiAgICAgICAgLnJlY292ZXJNb2RlKCksXG4gICAgdW5zaWduZWRUeEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnJVbnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5ySGFsZnNpZ250eEhleCxcbiAgICBmdWxsc2lnbnR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0MuckZ1bGxzaWdudHhIZXgsXG4gICAgcHJpdktleToge1xuICAgICAgcHJ2MTogdGVzdERhdGEuRVhQT1JUX1BfMl9DLnByaXZLZXkucHJ2MyxcbiAgICAgIHBydjI6IHRlc3REYXRhLkVYUE9SVF9QXzJfQy5wcml2S2V5LnBydjIsXG4gICAgfSxcbiAgfSk7XG5cbiAgc2lnbkZsb3dUZXN0KHtcbiAgICB0cmFuc2FjdGlvblR5cGU6ICdFeHBvcnQgUDJDIHdpdGhvdXQgY2hhbmdlb3V0cHV0JyxcbiAgICBuZXdUeEZhY3Rvcnk6ICgpID0+IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpLFxuICAgIG5ld1R4QnVpbGRlcjogKCkgPT5cbiAgICAgIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW5zLmdldCgndGF2YXhwJykpXG4gICAgICAgIC5nZXRFeHBvcnRCdWlsZGVyKClcbiAgICAgICAgLnRocmVzaG9sZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGhyZXNob2xkKVxuICAgICAgICAubG9ja3RpbWUodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmxvY2t0aW1lKVxuICAgICAgICAuZnJvbVB1YktleSh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucEFkZHJlc3NlcylcbiAgICAgICAgLmFtb3VudCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuYW1vdW50KVxuICAgICAgICAuZXh0ZXJuYWxDaGFpbklkKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC50YXJnZXRDaGFpbklkKVxuICAgICAgICAudXR4b3ModGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULm91dHB1dHMpLFxuICAgIHVuc2lnbmVkVHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC51bnNpZ25lZFR4SGV4LFxuICAgIGhhbGZzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5oYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5mdWxsc2lnbnR4SGV4LFxuICAgIHByaXZLZXk6IHtcbiAgICAgIHBydjE6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5wcml2S2V5LnBydjEsXG4gICAgICBwcnYyOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYyLFxuICAgIH0sXG4gIH0pO1xuXG4gIHNpZ25GbG93VGVzdCh7XG4gICAgdHJhbnNhY3Rpb25UeXBlOiAnRXhwb3J0IFAyQyByZWNvdmVyeSB3aXRob3V0IGNoYW5nZW91dHB1dCcsXG4gICAgbmV3VHhGYWN0b3J5OiAoKSA9PiBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKSxcbiAgICBuZXdUeEJ1aWxkZXI6ICgpID0+XG4gICAgICBuZXcgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeShjb2lucy5nZXQoJ3RhdmF4cCcpKVxuICAgICAgICAuZ2V0RXhwb3J0QnVpbGRlcigpXG4gICAgICAgIC50aHJlc2hvbGQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnRocmVzaG9sZClcbiAgICAgICAgLmxvY2t0aW1lKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5sb2NrdGltZSlcbiAgICAgICAgLmZyb21QdWJLZXkodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnBBZGRyZXNzZXMpXG4gICAgICAgIC5hbW91bnQodGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULmFtb3VudClcbiAgICAgICAgLmV4dGVybmFsQ2hhaW5JZCh0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQudGFyZ2V0Q2hhaW5JZClcbiAgICAgICAgLnV0eG9zKHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5vdXRwdXRzKVxuICAgICAgICAucmVjb3Zlck1vZGUoKSxcbiAgICB1bnNpZ25lZFR4SGV4OiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQuclVuc2lnbmVkVHhIZXgsXG4gICAgaGFsZnNpZ250eEhleDogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnJIYWxmc2lnbnR4SGV4LFxuICAgIGZ1bGxzaWdudHhIZXg6IHRlc3REYXRhLkVYUE9SVF9QXzJfQ19XSVRIT1VUX0NIQU5HRU9VVFBVVC5yRnVsbHNpZ250eEhleCxcbiAgICBwcml2S2V5OiB7XG4gICAgICBwcnYxOiB0ZXN0RGF0YS5FWFBPUlRfUF8yX0NfV0lUSE9VVF9DSEFOR0VPVVRQVVQucHJpdktleS5wcnYzLFxuICAgICAgcHJ2MjogdGVzdERhdGEuRVhQT1JUX1BfMl9DX1dJVEhPVVRfQ0hBTkdFT1VUUFVULnByaXZLZXkucHJ2MixcbiAgICB9LFxuICB9KTtcblxuICBkZXNjcmliZSgnQ3JlZGVudGlhbCBndWFyZCBieXBhc3MgcmVncmVzc2lvbiAoQ0VDSE8tMTY5NyknLCAoKSA9PiB7XG4gICAgLy8gUmVncmVzc2lvbiBmb3IgcHJvZHVjdGlvbiBpbmNpZGVudCAyMDI2LTA3LTE2OlxuICAgIC8vIHR4IDh4YmlMcHNLREtrSnJOM1lVcWNacEZjeEFwTEN3bVFrcEtVdXZtSFUxR0w5Um1BeXUgd2FzIGJyb2FkY2FzdFxuICAgIC8vIHdpdGggc2lnWzFdIHN0aWxsIGFuIGFkZHJlc3MgcGxhY2Vob2xkZXIgKHI9MCkgYmVjYXVzZSBoYXNDcmVkZW50aWFscyhbXSlcbiAgICAvLyByZXR1cm5lZCBmYWxzZSwgY2F1c2luZyBidWlsZEF2YXhUcmFuc2FjdGlvbigpIHRvIHdpcGUgU2lnbmVyIDEncyBFQ0RTQS5cbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuXG4gICAgaXQoJ2hhc0NyZWRlbnRpYWxzIHJldHVybnMgdHJ1ZSBmb3IgY3JlZGVudGlhbHM9W10gcHJldmVudGluZyBjcmVkZW50aWFsIHdpcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zXG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZEhleCA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBTaW11bGF0ZSB0aGUgYnVnIHRyaWdnZXI6IGNyZWRlbnRpYWxzPVtdIG9uIHRoZSBwYXJzZWQgdHhcbiAgICAgIGNvbnN0IHNpZ25lcjJCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGhhbGZTaWduZWRIZXgpIGFzIGFueTtcbiAgICAgIGNvbnN0IGludGVybmFsVHggPSBzaWduZXIyQnVpbGRlci50cmFuc2FjdGlvbjtcblxuICAgICAgLy8gRm9yY2UgY3JlZGVudGlhbHMgdG8gW10gYXMgaGFwcGVucyBpbiBwcm9kdWN0aW9uIGRlc2VyaWFsaXphdGlvbiBlZGdlIGNhc2VcbiAgICAgIChpbnRlcm5hbFR4Ll9hdmF4VHJhbnNhY3Rpb24gYXMgYW55KS5jcmVkZW50aWFscyA9IFtdO1xuXG4gICAgICAvLyBCZWZvcmUgZml4OiBoYXNDcmVkZW50aWFscyB3YXMgZmFsc2Ug4oaSIGJ1aWxkQXZheFRyYW5zYWN0aW9uKCkgd291bGQgcmVnZW5lcmF0ZVxuICAgICAgLy8gQWZ0ZXIgZml4OiBoYXNDcmVkZW50aWFscyBpcyB0cnVlIOKGkiBndWFyZCBmaXJlcyDihpIgY3JlZGVudGlhbHMgcHJlc2VydmVkXG4gICAgICBpbnRlcm5hbFR4Lmhhc0NyZWRlbnRpYWxzLnNob3VsZC5iZS50cnVlKFxuICAgICAgICAnaGFzQ3JlZGVudGlhbHMgbXVzdCByZXR1cm4gdHJ1ZSBmb3IgY3JlZGVudGlhbHM9W10gdG8gYmxvY2sgY3JlZGVudGlhbCByZWdlbmVyYXRpb24nXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2NyZWRlbnRpYWwgcmVnZW5lcmF0aW9uIGlzIGJsb2NrZWQgd2hlbiBjcmVkZW50aWFscz1bXSBwcmV2ZW50aW5nIFNpZ25lciAxIEVDRFNBIHdpcGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBTaWduZXIgMSBoYWxmLXNpZ25zXG4gICAgICBjb25zdCBzaWduZXIxQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgc2lnbmVyMUJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjEgfSk7XG4gICAgICBjb25zdCBoYWxmU2lnbmVkVHggPSBhd2FpdCBzaWduZXIxQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZEhleCA9IGhhbGZTaWduZWRUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBTaW11bGF0ZSBidWc6IGZvcmNlIGNyZWRlbnRpYWxzPVtdIGJlZm9yZSBTaWduZXIgMiBjYWxscyBidWlsZCgpXG4gICAgICBjb25zdCBzaWduZXIyQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmU2lnbmVkSGV4KSBhcyBhbnk7XG4gICAgICBjb25zdCBpbnRlcm5hbFR4ID0gc2lnbmVyMkJ1aWxkZXIudHJhbnNhY3Rpb247XG4gICAgICAoaW50ZXJuYWxUeC5fYXZheFRyYW5zYWN0aW9uIGFzIGFueSkuY3JlZGVudGlhbHMgPSBbXTtcblxuICAgICAgLy8gYnVpbGQoKSBtdXN0IE5PVCByZWdlbmVyYXRlIGZyZXNoIHBsYWNlaG9sZGVyIGNyZWRlbnRpYWxzXG4gICAgICBjb25zdCByZWJ1aWx0ID0gYXdhaXQgc2lnbmVyMkJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IHJlYnVpbHRDcmVkcyA9IChyZWJ1aWx0IGFzIGFueSkuY3JlZGVudGlhbHM7XG5cbiAgICAgIC8vIEFmdGVyIGZpeDogY3JlZGVudGlhbHMgc3RheSBhcyBbXSAoZ3VhcmQgZmlyZWQsIG5vIHJlZ2VuZXJhdGlvbilcbiAgICAgIC8vIEJlZm9yZSBmaXg6IGNyZWRlbnRpYWxzIHdvdWxkIGJlIHJlZ2VuZXJhdGVkIHRvIE7Dl1tQTEFDRUhPTERFUiwgUExBQ0VIT0xERVJdXG4gICAgICByZWJ1aWx0Q3JlZHMubGVuZ3RoLnNob3VsZC5lcXVhbChcbiAgICAgICAgMCxcbiAgICAgICAgJ2J1aWxkKCkgbXVzdCBub3QgcmVnZW5lcmF0ZSBjcmVkZW50aWFscyB3aGVuIGNyZWRlbnRpYWxzPVtdIOKAlCBndWFyZCBtdXN0IGZpcmUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25hdHVyZSBnZXR0ZXIgZXhwb3NlcyBpbmNvbXBsZXRlIHNpZ25pbmcgYWNyb3NzIGFsbCBjcmVkZW50aWFscycsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNpZ25lciAxIGhhbGYtc2lnbnMgb25seVxuICAgICAgY29uc3Qgc2lnbmVyMUJ1aWxkZXIgPSBmYWN0b3J5LmZyb20oZGF0YS51bnNpZ25lZFR4SGV4KTtcbiAgICAgIHNpZ25lcjFCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYxIH0pO1xuICAgICAgY29uc3QgaGFsZlNpZ25lZFR4ID0gYXdhaXQgc2lnbmVyMUJ1aWxkZXIuYnVpbGQoKTtcblxuICAgICAgLy8gQWZ0ZXIgU2lnbmVyIDE6IHNpZ25hdHVyZSBnZXR0ZXIgbXVzdCBzaG93IGV4YWN0bHkgMSByZWFsIEVDRFNBXG4gICAgICBoYWxmU2lnbmVkVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIDEsXG4gICAgICAgICdzaG91bGQgZXhwb3NlIGV4YWN0bHkgMSByZWFsIEVDRFNBIGFmdGVyIGZpcnN0IHNpZ25lciDigJQgU2lnbmVyIDIgc2xvdCBpcyBzdGlsbCBlbXB0eSdcbiAgICAgICk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIHRoZSBjb3JydXB0IHN0YXRlIHRoZSBQUiB0YXJnZXRzOiBmdWxseSBzaWduIHRoZSB0eCwgdGhlbiBjb3JydXB0XG4gICAgICAvLyBvbmUgY3JlZGVudGlhbCBzbyB0aGF0IGNyZWRlbnRpYWxzWzBdIGhhcyBib3RoIEVDRFNBcyBidXQgY3JlZGVudGlhbHNbMV1cbiAgICAgIC8vIG9ubHkgaGFzIG9uZS4gIEEgdW5pb24gd291bGQgc3RpbGwgcmV0dXJuIDIgKG1hc2tpbmcgdGhlIGNvcnJ1cHRpb24pLlxuICAgICAgLy8gVGhlIGludGVyc2VjdGlvbiBtdXN0IHJldHVybiAxIGJlY2F1c2UgdGhlIHNlY29uZCBzaWduZXIncyBFQ0RTQSBpcyBhYnNlbnRcbiAgICAgIC8vIGZyb20gY3JlZGVudGlhbHNbMV0uXG4gICAgICBjb25zdCBmdWxsQnVpbGRlciA9IGZhY3RvcnkuZnJvbShkYXRhLmhhbGZzaWdudHhIZXgpO1xuICAgICAgZnVsbEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCBmdWxsVHggPSBhd2FpdCBmdWxsQnVpbGRlci5idWlsZCgpO1xuICAgICAgZnVsbFR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDIsICdzYW5pdHk6IGZ1bGx5IHNpZ25lZCB0eCBzaG91bGQgaGF2ZSAyIHNpZ25hdHVyZXMnKTtcblxuICAgICAgLy8gOTAgaGV4IGNoYXJzIG9mIGxlYWRpbmcgemVyb3MgaXMgdGhlIGVtcHR5LXNpZ25hdHVyZSBwcmVmaXggdXNlZCBieSBpc0VtcHR5U2lnbmF0dXJlKCkuXG4gICAgICBjb25zdCBFTVBUWV9TSUdfWkVST19QUkVGSVggPSAnJy5wYWRTdGFydCg5MCwgJzAnKTtcblxuICAgICAgLy8gQ29ycnVwdCBjcmVkZW50aWFsc1sxXTogemVybyBvdXQgU2lnbmVyIDIncyBzbG90IHNvIHRoZSBpbnRlcnNlY3Rpb24gZHJvcHMgdG8gMS5cbiAgICAgIC8vIFVzZSBhc3NlcnRpb25zIGluc3RlYWQgb2YgZ3VhcmRzIHNvIHRoZSB0ZXN0IGZhaWxzIGxvdWRseSBpZiB0aGUgdHggc2hhcGUgY2hhbmdlcy5cbiAgICAgIGNvbnN0IGNyZWRzID0gKGZ1bGxUeCBhcyBhbnkpLmNyZWRlbnRpYWxzO1xuICAgICAgYXNzZXJ0Lm9rKGNyZWRzICYmIGNyZWRzLmxlbmd0aCA+PSAyLCAnZnVsbHkgc2lnbmVkIHR4IG11c3QgaGF2ZSBhdCBsZWFzdCAyIGNyZWRlbnRpYWxzJyk7XG4gICAgICBjb25zdCBjcmVkMTogYW55ID0gY3JlZHNbMV07XG4gICAgICBjb25zdCBjczE6IGFueSA9IGNyZWQxLnNlcmlhbGl6ZSgpO1xuICAgICAgY29uc3QgdGFyZ2V0SWR4ID0gY3MxLnNpZ0FycmF5LmZpbmRJbmRleChcbiAgICAgICAgKHM6IGFueSwgaTogbnVtYmVyKSA9PiBpID4gMCAmJiAhcy5ieXRlcy5zdGFydHNXaXRoKEVNUFRZX1NJR19aRVJPX1BSRUZJWClcbiAgICAgICk7XG4gICAgICBhc3NlcnQub2sodGFyZ2V0SWR4ICE9PSAtMSwgJ2NyZWRlbnRpYWxzWzFdIG11c3QgaGF2ZSBhIG5vbi1lbXB0eSBzbG90IGJleW9uZCBpbmRleCAwIChTaWduZXIgMiBzbG90KScpO1xuICAgICAgY3MxLnNpZ0FycmF5W3RhcmdldElkeF0uYnl0ZXMgPSAnJy5wYWRTdGFydChjczEuc2lnQXJyYXlbdGFyZ2V0SWR4XS5ieXRlcy5sZW5ndGgsICcwJyk7XG4gICAgICBjcmVkMS5kZXNlcmlhbGl6ZShjczEpO1xuXG4gICAgICAvLyBXaXRoIGludGVyc2VjdGlvbiwgcmVtb3ZpbmcgRUNEU0EyIGZyb20gY3JlZGVudGlhbHNbMV0gbXVzdCByZWR1Y2UgdGhlIGNvdW50IHRvIDEuXG4gICAgICBmdWxsVHguc2lnbmF0dXJlLmxlbmd0aC5zaG91bGQuZXF1YWwoXG4gICAgICAgIDEsXG4gICAgICAgICdpbnRlcnNlY3Rpb24gbXVzdCBkZXRlY3QgdGhhdCBjcmVkZW50aWFsc1sxXSBpcyBtaXNzaW5nIEVDRFNBMiDigJQgaW5jb21wbGV0ZSBzaWduaW5nIHZpc2libGUnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ2Z1bGwgc2lnbiBmcm9tIGhhbGYtc2lnbmVkIGhleCBwcm9kdWNlcyAyIHJlYWwgRUNEU0FzIGFuZCBjb3JyZWN0IHR4JywgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gVGhpcyBpcyB0aGUgZXhhY3QgZmxvdyB0aGF0IE1VU1Qgd29yayBpbiBwcm9kdWN0aW9uIGFmdGVyIHRoZSBmaXg6XG4gICAgICAvLyBTaWduZXIgMiB0YWtlcyBTaWduZXIgMSdzIGhhbGYtc2lnbmVkIGhleCBhbmQgZmlsbHMgdGhlIHJlbWFpbmluZyBzbG90LlxuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEuaGFsZnNpZ250eEhleCk7XG4gICAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IHR4QnVpbGRlci5idWlsZCgpO1xuICAgICAgdHgudG9Ccm9hZGNhc3RGb3JtYXQoKS5zaG91bGQuZXF1YWwoZGF0YS5mdWxsc2lnbnR4SGV4KTtcbiAgICAgIHR4LnNpZ25hdHVyZS5sZW5ndGguc2hvdWxkLmVxdWFsKDIsICdib3RoIEhTTSBzaWduZXIgc2xvdHMgbXVzdCBiZSBmaWxsZWQgd2l0aCByZWFsIEVDRFNBcycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ24oKSB0aHJvd3Mgb24gZW1wdHkgY3JlZGVudGlhbHMgcmF0aGVyIHRoYW4gc2lsZW50bHkgcHJvZHVjaW5nIGJhZCB0eCcsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFNpZ25lciAxIGhhbGYtc2lnbnNcbiAgICAgIGNvbnN0IHNpZ25lcjFCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEudW5zaWduZWRUeEhleCk7XG4gICAgICBzaWduZXIxQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IGhhbGZUeCA9IGF3YWl0IHNpZ25lcjFCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIC8vIFNpbXVsYXRlIGJ1ZzogY3JlZGVudGlhbHMgd2lwZWQgdG8gW10gYmVmb3JlIFNpZ25lciAyIHNpZ25zXG4gICAgICBjb25zdCBzaWduZXIyQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSkgYXMgYW55O1xuICAgICAgc2lnbmVyMkJ1aWxkZXIuc2lnbih7IGtleTogZGF0YS5wcml2S2V5LnBydjIgfSk7XG4gICAgICAoc2lnbmVyMkJ1aWxkZXIudHJhbnNhY3Rpb24uX2F2YXhUcmFuc2FjdGlvbiBhcyBhbnkpLmNyZWRlbnRpYWxzID0gW107XG5cbiAgICAgIC8vIGJ1aWxkKCkgY2FsbHMgdHJhbnNhY3Rpb24uc2lnbigpIHdoaWNoIG11c3QgdGhyb3cg4oCUIG5vdCBzaWxlbnRseSBwcm9kdWNlIGEgYmFkIHR4XG4gICAgICBhd2FpdCBzaWduZXIyQnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnRXhwZWN0ZWQgc2lnbiB0byB0aHJvdyBvbiBlbXB0eSBjcmVkZW50aWFscycpKVxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xuICAgICAgICAgIGUubWVzc2FnZS5zaG91bGQuZXF1YWwoJ2VtcHR5IGNyZWRlbnRpYWxzIHRvIHNpZ24nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgndG9Ccm9hZGNhc3RGb3JtYXQoKSB0aHJvd3Mgd2hlbiByZWFsIEVDRFNBIGNvZXhpc3RzIHdpdGggYWRkcmVzcyBwbGFjZWhvbGRlciAocHJvZHVjdGlvbiBmYWlsdXJlIHNoYXBlKScsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFJlcHJvZHVjZSB0aGUgZXhhY3QgY3JlZGVudGlhbCBsYXlvdXQgZnJvbSB0aGUgSnVsIDE2IHByb2R1Y3Rpb24gZmFpbHVyZTpcbiAgICAgIC8vIHNsb3RbMF0gPSByZWFsIEVDRFNBIChTaWduZXIgMiBmaWxsZWQgd3Jvbmcgc2xvdCBkdWUgdG8gTU9ERSAxIG1pc21hdGNoKVxuICAgICAgLy8gc2xvdFsxXSA9IEFERFJfUExBQ0VIT0xERVIgKHI9MCwgOTAgemVybyBoZXggY2hhcnMgKyBIU00xIGFkZHJlc3MpXG4gICAgICAvLyBUaGlzIGlzIHRoZSBzaGFwZSB0aGF0IEF2YWxhbmNoZUdvIHJlamVjdGVkIHdpdGggXCJmYWlsZWQgdmVyaWZ5U3BlbmQ6IGludmFsaWQgc2lnbmF0dXJlXCIuXG4gICAgICBjb25zdCBFTVBUWV9TSUdfWkVST19QUkVGSVggPSAnJy5wYWRTdGFydCg5MCwgJzAnKTtcbiAgICAgIGNvbnN0IHNpZ25lcjFCdWlsZGVyID0gZmFjdG9yeS5mcm9tKGRhdGEudW5zaWduZWRUeEhleCk7XG4gICAgICBzaWduZXIxQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIGNvbnN0IGhhbGZUeCA9IGF3YWl0IHNpZ25lcjFCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBmdWxsQnVpbGRlciA9IGZhY3RvcnkuZnJvbShoYWxmVHgudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgICBmdWxsQnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MiB9KTtcbiAgICAgIGNvbnN0IGZ1bGxUeCA9IChhd2FpdCBmdWxsQnVpbGRlci5idWlsZCgpKSBhcyBhbnk7XG5cbiAgICAgIC8vIENvcnJ1cHQgY3JlZGVudGlhbHM6IHN3YXAgc2xvdFswXSAocmVhbEVDRFNBMSkgd2l0aCBhbiBhZGRyIHBsYWNlaG9sZGVyLFxuICAgICAgLy8gbGVhdmluZyBzbG90WzFdID0gcmVhbEVDRFNBMi4gVGhpcyBtaW1pY3MgdGhlIGJ1ZyBvdXRwdXQgd2hlcmUgYSByZWFsIEVDRFNBXG4gICAgICAvLyBjb2V4aXN0cyB3aXRoIGFuIGFkZHIgcGxhY2Vob2xkZXIgaW4gdGhlIHNhbWUgY3JlZGVudGlhbC5cbiAgICAgIGNvbnN0IGNyZWRzID0gZnVsbFR4LmNyZWRlbnRpYWxzO1xuICAgICAgaWYgKGNyZWRzICYmIGNyZWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgY3JlZDA6IGFueSA9IGNyZWRzWzBdO1xuICAgICAgICBjb25zdCBjczogYW55ID0gY3JlZDAuc2VyaWFsaXplKCk7XG4gICAgICAgIC8vIEJ1aWxkIGEgZmFrZSBhZGRyIHBsYWNlaG9sZGVyOiA5MCB6ZXJvcyArIDQwIGhleCBjaGFycyBvZiBhIG1vY2sgYWRkcmVzc1xuICAgICAgICBjb25zdCBmYWtlQWRkclBsYWNlaG9sZGVyID0gRU1QVFlfU0lHX1pFUk9fUFJFRklYICsgJ2RmMzI3MTdiZDdiN2EyZDUwYTcxNTIwMjc5NTk0MDI1MGM3YmE5ZTQnO1xuICAgICAgICBjcy5zaWdBcnJheVswXS5ieXRlcyA9IGZha2VBZGRyUGxhY2Vob2xkZXI7XG4gICAgICAgIGNyZWQwLmRlc2VyaWFsaXplKGNzKTtcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gZnVsbFR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIChlOiBhbnkpID0+XG4gICAgICAgICAgZS5tZXNzYWdlID09PVxuICAgICAgICAgICd0cmFuc2FjdGlvbiBoYXMgYSByZWFsIEVDRFNBIGFsb25nc2lkZSBhbiBhZGRyZXNzIHBsYWNlaG9sZGVyIChyPTApOiBpbmNvbXBsZXRlIHNpZ25pbmcgZGV0ZWN0ZWQsIHJlZnVzaW5nIGJyb2FkY2FzdCdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdLZXkgY2Fubm90IHNpZ24gdGhlIHRyYW5zYWN0aW9uICcsICgpID0+IHtcbiAgICBjb25zdCBkYXRhID0gdGVzdERhdGEuRVhQT1JUX1BfMl9DO1xuICAgIGl0KCdTaG91bGQgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnVuc2lnbmVkVHhIZXgpO1xuICAgICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6IGRhdGEucHJpdktleS5wcnYyIH0pO1xuICAgICAgdHhCdWlsZGVyXG4gICAgICAgIC5idWlsZCgpXG4gICAgICAgIC50aGVuKCgpID0+IGFzc2VydC5mYWlsKCdpdCBjYW4gc2lnbicpKVxuICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGVyci5tZXNzYWdlLnNob3VsZC5iZS5lcXVhbChlcnJvck1lc3NhZ2UuRVJST1JfS0VZX0NBTk5PVF9TSUdOKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnU2hvdWxkIDIgZnVsbCBzaWduIGEgZXhwb3J0IHR4IGZyb20gdW5zaWduZWQgcmF3IHR4JywgKCkgPT4ge1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0YXZheHAnKSkuZnJvbShkYXRhLnJVbnNpZ25lZFR4SGV4KTtcbiAgICAgIHR4QnVpbGRlci5zaWduKHsga2V5OiBkYXRhLnByaXZLZXkucHJ2MSB9KTtcbiAgICAgIHR4QnVpbGRlclxuICAgICAgICAuYnVpbGQoKVxuICAgICAgICAudGhlbigoKSA9PiBhc3NlcnQuZmFpbCgnaXQgY2FuIHNpZ24nKSlcbiAgICAgICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICBlcnIubWVzc2FnZS5zaG91bGQuYmUuZXF1YWwoZXJyb3JNZXNzYWdlLkVSUk9SX0tFWV9DQU5OT1RfU0lHTik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19