@pipeline-builder/pipeline-events 4.0.19 → 4.0.21

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.
package/lib/auth.js CHANGED
@@ -12,7 +12,7 @@
12
12
  * batch on an exchange failure rather than shipping events unauthenticated.
13
13
  */
14
14
  import { createPlatformCredential } from '@pipeline-builder/pipeline-core/lib/handlers/platform-credential.js';
15
- import { log } from './util.js';
15
+ import { fetchWithTimeout, log } from './util.js';
16
16
  /** Refresh at this fraction of the token's life — never at the last moment. */
17
17
  const TOKEN_REFRESH_FRACTION = 0.8;
18
18
  /** Floor on the cached lifetime, so a surprisingly short TTL can't cause a
@@ -44,20 +44,14 @@ export async function getAuthToken() {
44
44
  if (!baseUrl)
45
45
  throw new Error('PLATFORM_BASE_URL environment variable is required');
46
46
  const key = await credential.getKey();
47
- const controller = new AbortController();
48
- const timer = setTimeout(() => controller.abort(), EXCHANGE_TIMEOUT_MS);
49
- let res;
50
- try {
51
- res = await fetch(`${baseUrl}/api/auth/token/exchange`, {
52
- method: 'POST',
53
- headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
54
- body: JSON.stringify({ key }),
55
- signal: controller.signal,
56
- });
57
- }
58
- finally {
59
- clearTimeout(timer);
60
- }
47
+ // Same deadline as before, through the package's one bounded-fetch helper: a manual
48
+ // controller plus a timer it has to remember to clear is a leak waiting for an early
49
+ // `return`, and two spellings of "time this out" is how one of them ends up missing.
50
+ const res = await fetchWithTimeout(`${baseUrl}/api/auth/token/exchange`, {
51
+ method: 'POST',
52
+ headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
53
+ body: JSON.stringify({ key }),
54
+ }, EXCHANGE_TIMEOUT_MS);
61
55
  if (!res.ok) {
62
56
  // A rejected key is the one failure an operator has to act on, and platform
63
57
  // deliberately answers every refusal the same way — so say what to check
@@ -96,4 +90,4 @@ export function _resetAuthForTests() {
96
90
  cachedTokenExpiresAt = 0;
97
91
  credential.reset();
98
92
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQy9HLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFaEMsK0VBQStFO0FBQy9FLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DO3VEQUN1RDtBQUN2RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxpREFBaUQ7QUFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztJQUMxQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0I7SUFDbEQsU0FBUyxFQUFFLHFCQUFxQjtDQUNqQyxDQUFDLENBQUM7QUFFSCxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0FBQ3RDLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRTdCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVk7SUFDaEMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLG9CQUFvQjtRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXpFLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQUksQ0FBQyxPQUFPO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRXRDLE1BQU0sVUFBVSxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hFLElBQUksR0FBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQztRQUNILEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxHQUFHLE9BQU8sMEJBQTBCLEVBQUU7WUFDdEQsTUFBTSxFQUFFLE1BQU07WUFDZCxPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFFO1lBQzdFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDN0IsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSwrQ0FBK0M7UUFDL0MsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDLEdBQUcsQ0FBQyxNQUFNLG1EQUFtRDtrQkFDM0Ysb0ZBQW9GLENBQ3ZGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUE0RCxDQUFDO0lBQzNHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO0lBQzNDLElBQUksQ0FBQyxXQUFXO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBRWxGLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3ZILFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDMUIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxHQUFHLHNCQUFzQixDQUFDLENBQUM7SUFDakcsR0FBRyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQixDQUFDO0FBRUQsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXBvcnRpbmctQVBJIGF1dGhlbnRpY2F0aW9uLiBUaGUgc3RvcmVkIGNyZWRlbnRpYWwgaXMgYW4gT1BBUVVFXG4gKiBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCksIHRyYWRlZCBhdCBwbGF0Zm9ybSBmb3IgYSBzaG9ydC1saXZlZCBKV1QuXG4gKiBOb3RoaW5nIGlzIHZlcmlmaWVkIGhlcmU6IGFuIG9wYXF1ZSBrZXkgaGFzIG5vIGNsYWltcyBhbmQgbm8gc2lnbmF0dXJlLCBhbmRcbiAqIHRoZSBleGNoYW5nZSByZS1yZWFkcyB0aGUgYWNjb3VudCwgaXRzIG9yZyBhbmQgdGhlIGtleSdzIG93biBzdGF0ZSBldmVyeSB0aW1lLFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHJldm9jYXRpb24gdGFrZSBlZmZlY3Qgd2l0aGluIG9uZSB0b2tlbiBsaWZldGltZS5cbiAqXG4gKiBDb250cmFjdDogY2FjaGUgdGhlIHRva2VuIGluIHRoZSB3YXJtIGNvbnRhaW5lciwgcmVmcmVzaCBFQVJMWSAoYmVmb3JlXG4gKiBleHBpcnkpIHNvIGEgYmF0Y2ggbmV2ZXIgcHJlc2VudHMgYSB0b2tlbiB0aGF0IGRpZXMgbWlkLWZsaWdodCwgYW5kIGZhaWwgdGhlXG4gKiBiYXRjaCBvbiBhbiBleGNoYW5nZSBmYWlsdXJlIHJhdGhlciB0aGFuIHNoaXBwaW5nIGV2ZW50cyB1bmF1dGhlbnRpY2F0ZWQuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9saWIvaGFuZGxlcnMvcGxhdGZvcm0tY3JlZGVudGlhbC5qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vKiogUmVmcmVzaCBhdCB0aGlzIGZyYWN0aW9uIG9mIHRoZSB0b2tlbidzIGxpZmUg4oCUIG5ldmVyIGF0IHRoZSBsYXN0IG1vbWVudC4gKi9cbmNvbnN0IFRPS0VOX1JFRlJFU0hfRlJBQ1RJT04gPSAwLjg7XG4vKiogRmxvb3Igb24gdGhlIGNhY2hlZCBsaWZldGltZSwgc28gYSBzdXJwcmlzaW5nbHkgc2hvcnQgVFRMIGNhbid0IGNhdXNlIGFcbiAqICByZWZyZXNoIHN0b3JtIChvbmUgZXhjaGFuZ2UgcGVyIGJhdGNoIGF0IHdvcnN0KS4gKi9cbmNvbnN0IE1JTl9UT0tFTl9DQUNIRV9NUyA9IDMwXzAwMDtcbi8qKiBQZXItcmVxdWVzdCB0aW1lb3V0IGZvciB0aGUgZXhjaGFuZ2UgY2FsbC4gKi9cbmNvbnN0IEVYQ0hBTkdFX1RJTUVPVVRfTVMgPSA1MDAwO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5OiBgUExBVEZPUk1fQUNDRVNTX0tFWWAgaWYgc2V0LCBvdGhlcndpc2UgdGhlXG4gKiBgcGFzc3dvcmRgIGZpZWxkIG9mIHRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IG5hbWVkIGJ5IGBQTEFURk9STV9TRUNSRVRfTkFNRWAuXG4gKiBBIHN0b3JlZCBKV1QgaXMgcmVmdXNlZCBsb3VkbHksIG5hbWluZyB0aGUgZml4LCBpbnN0ZWFkIG9mIGZhaWxpbmcgbGF0ZXIgYXMgYW5cbiAqIG9wYXF1ZSA0MDEgZnJvbSB0aGUgcmVwb3J0aW5nIEFQSS5cbiAqL1xuY29uc3QgY3JlZGVudGlhbCA9IGNyZWF0ZVBsYXRmb3JtQ3JlZGVudGlhbCh7XG4gIHNlY3JldE5hbWU6ICgpID0+IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FLFxuICBlbnZLZXlWYXI6ICdQTEFURk9STV9BQ0NFU1NfS0VZJyxcbn0pO1xuXG5sZXQgY2FjaGVkVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xubGV0IGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gMDtcblxuLyoqXG4gKiBUcmFkZSB0aGUgc3RvcmVkIGtleSBmb3IgYSBzaG9ydC1saXZlZCBwbGF0Zm9ybSB0b2tlbiwgY2FjaGVkIHBlciB3YXJtXG4gKiBjb250YWluZXIgdW50aWwgaXQgaXMgODAlIHRocm91Z2ggaXRzIGxpZmUuIFRocm93cyBvbiBhbnkgZmFpbHVyZSwgd2hpY2ggZmFpbHNcbiAqIHRoZSBiYXRjaCBzbyBTUVMgcmV0cmllcyBpdCDigJQgYW4gdW5hdXRoZW50aWNhdGVkIHNoaXAgaXMgbmV2ZXIgYW4gb3B0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChjYWNoZWRUb2tlbiAmJiBEYXRlLm5vdygpIDwgY2FjaGVkVG9rZW5FeHBpcmVzQXQpIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICBjb25zdCBiYXNlVXJsID0gKHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMIHx8ICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyZWRlbnRpYWwuZ2V0S2V5KCk7XG5cbiAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgRVhDSEFOR0VfVElNRU9VVF9NUyk7XG4gIGxldCByZXM6IFJlc3BvbnNlO1xuICB0cnkge1xuICAgIHJlcyA9IGF3YWl0IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9hdXRoL3Rva2VuL2V4Y2hhbmdlYCwge1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsga2V5IH0pLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9XG5cbiAgaWYgKCFyZXMub2spIHtcbiAgICAvLyBBIHJlamVjdGVkIGtleSBpcyB0aGUgb25lIGZhaWx1cmUgYW4gb3BlcmF0b3IgaGFzIHRvIGFjdCBvbiwgYW5kIHBsYXRmb3JtXG4gICAgLy8gZGVsaWJlcmF0ZWx5IGFuc3dlcnMgZXZlcnkgcmVmdXNhbCB0aGUgc2FtZSB3YXkg4oCUIHNvIHNheSB3aGF0IHRvIGNoZWNrXG4gICAgLy8gcmF0aGVyIHRoYW4gZWNob2luZyBhbiB1bmRpZmZlcmVudGlhdGVkIDQwMS5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQWNjZXNzLWtleSBleGNoYW5nZSByZWZ1c2VkICgke3Jlcy5zdGF0dXN9KSDigJQgdGhlIHN0b3JlZCBrZXkgaXMgdW5rbm93biwgcmV2b2tlZCwgZXhwaXJlZCwgYFxuICAgICAgICArICdpdHMgc2VydmljZSBhY2NvdW50IGlzIGRpc2FibGVkLCBvciB0aGlzIGFkZHJlc3MgaXMgb3V0c2lkZSB0aGUga2V54oCZcyBJUCBhbGxvd2xpc3QnLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBY2Nlc3Mta2V5IGV4Y2hhbmdlIGZhaWxlZDogJHtyZXMuc3RhdHVzfWApO1xuICB9XG5cbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSkgYXMgeyBkYXRhPzogeyBhY2Nlc3NUb2tlbj86IHN0cmluZzsgZXhwaXJlc0luPzogbnVtYmVyIH0gfTtcbiAgY29uc3QgYWNjZXNzVG9rZW4gPSBib2R5LmRhdGE/LmFjY2Vzc1Rva2VuO1xuICBpZiAoIWFjY2Vzc1Rva2VuKSB0aHJvdyBuZXcgRXJyb3IoJ0FjY2Vzcy1rZXkgZXhjaGFuZ2UgcmV0dXJuZWQgbm8gYWNjZXNzIHRva2VuJyk7XG5cbiAgY29uc3QgdHRsTXMgPSAodHlwZW9mIGJvZHkuZGF0YT8uZXhwaXJlc0luID09PSAnbnVtYmVyJyAmJiBib2R5LmRhdGEuZXhwaXJlc0luID4gMCA/IGJvZHkuZGF0YS5leHBpcmVzSW4gOiAzMDApICogMTAwMDtcbiAgY2FjaGVkVG9rZW4gPSBhY2Nlc3NUb2tlbjtcbiAgY2FjaGVkVG9rZW5FeHBpcmVzQXQgPSBEYXRlLm5vdygpICsgTWF0aC5tYXgoTUlOX1RPS0VOX0NBQ0hFX01TLCB0dGxNcyAqIFRPS0VOX1JFRlJFU0hfRlJBQ1RJT04pO1xuICBsb2cuaW5mbygnRXhjaGFuZ2VkIHRoZSBzdG9yZWQgc2VydmljZS1hY2NvdW50IGtleSBmb3IgYSBwbGF0Zm9ybSB0b2tlbicpO1xuICByZXR1cm4gYWNjZXNzVG9rZW47XG59XG5cbi8qKlxuICogRHJvcCBldmVyeXRoaW5nIHRoZSBjb250YWluZXIgaG9sZHMgYWJvdXQgaXRzIGNyZWRlbnRpYWwgYWZ0ZXIgYSA0MDEvNDAzIGZyb21cbiAqIHRoZSBBUEk6IHRoZSB0b2tlbiwgYW5kIHRoZSBLRVkg4oCUIHRoZSB0b2tlbi1yZW5ldyBMYW1iZGEgcm90YXRlcyB0aGUgc2VjcmV0XG4gKiB1bmRlcm5lYXRoIHVzLCBzbyBhIHdhcm0gY29udGFpbmVyIHRoYXQgb25seSByZS1leGNoYW5nZWQgd291bGQga2VlcFxuICogcHJlc2VudGluZyB0aGUgcmV0aXJlZCBrZXkgZm9yZXZlci4gQW4gZW52LXByb3ZpZGVkIGtleSBjYW5ub3QgY2hhbmdlIHdpdGhvdXRcbiAqIGEgbmV3IGNvbnRhaW5lciwgc28gaXQgaXMga2VwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmFsaWRhdGVDcmVkZW50aWFsKCk6IHZvaWQge1xuICBjYWNoZWRUb2tlbiA9IG51bGw7XG4gIGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gMDtcbiAgY3JlZGVudGlhbC5pbnZhbGlkYXRlKCk7XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgZXZlcnkgY2FjaGVkIGNyZWRlbnRpYWwuICovXG5leHBvcnQgZnVuY3Rpb24gX3Jlc2V0QXV0aEZvclRlc3RzKCk6IHZvaWQge1xuICBjYWNoZWRUb2tlbiA9IG51bGw7XG4gIGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gMDtcbiAgY3JlZGVudGlhbC5yZXNldCgpO1xufVxuIl19
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEM7Ozs7Ozs7Ozs7R0FVRztBQUVILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFFQUFxRSxDQUFDO0FBQy9HLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFbEQsK0VBQStFO0FBQy9FLE1BQU0sc0JBQXNCLEdBQUcsR0FBRyxDQUFDO0FBQ25DO3VEQUN1RDtBQUN2RCxNQUFNLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUNsQyxpREFBaUQ7QUFDakQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUM7QUFFakM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsR0FBRyx3QkFBd0IsQ0FBQztJQUMxQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0I7SUFDbEQsU0FBUyxFQUFFLHFCQUFxQjtDQUNqQyxDQUFDLENBQUM7QUFFSCxJQUFJLFdBQVcsR0FBa0IsSUFBSSxDQUFDO0FBQ3RDLElBQUksb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRTdCOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFlBQVk7SUFDaEMsSUFBSSxXQUFXLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLG9CQUFvQjtRQUFFLE9BQU8sV0FBVyxDQUFDO0lBRXpFLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQUksQ0FBQyxPQUFPO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0lBQ3BGLE1BQU0sR0FBRyxHQUFHLE1BQU0sVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBRXRDLG9GQUFvRjtJQUNwRixxRkFBcUY7SUFDckYscUZBQXFGO0lBQ3JGLE1BQU0sR0FBRyxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxPQUFPLDBCQUEwQixFQUFFO1FBQ3ZFLE1BQU0sRUFBRSxNQUFNO1FBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxrQkFBa0IsRUFBRTtRQUM3RSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0tBQzlCLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV4QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ1osNEVBQTRFO1FBQzVFLHlFQUF5RTtRQUN6RSwrQ0FBK0M7UUFDL0MsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0NBQWdDLEdBQUcsQ0FBQyxNQUFNLG1EQUFtRDtrQkFDM0Ysb0ZBQW9GLENBQ3ZGLENBQUM7UUFDSixDQUFDO1FBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUE0RCxDQUFDO0lBQzNHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDO0lBQzNDLElBQUksQ0FBQyxXQUFXO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0lBRWxGLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3ZILFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDMUIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxHQUFHLHNCQUFzQixDQUFDLENBQUM7SUFDakcsR0FBRyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLFdBQVcsR0FBRyxJQUFJLENBQUM7SUFDbkIsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUMxQixDQUFDO0FBRUQsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUNuQixvQkFBb0IsR0FBRyxDQUFDLENBQUM7SUFDekIsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBSZXBvcnRpbmctQVBJIGF1dGhlbnRpY2F0aW9uLiBUaGUgc3RvcmVkIGNyZWRlbnRpYWwgaXMgYW4gT1BBUVVFXG4gKiBzZXJ2aWNlLWFjY291bnQga2V5IChgcGJfc2Ff4oCmYCksIHRyYWRlZCBhdCBwbGF0Zm9ybSBmb3IgYSBzaG9ydC1saXZlZCBKV1QuXG4gKiBOb3RoaW5nIGlzIHZlcmlmaWVkIGhlcmU6IGFuIG9wYXF1ZSBrZXkgaGFzIG5vIGNsYWltcyBhbmQgbm8gc2lnbmF0dXJlLCBhbmRcbiAqIHRoZSBleGNoYW5nZSByZS1yZWFkcyB0aGUgYWNjb3VudCwgaXRzIG9yZyBhbmQgdGhlIGtleSdzIG93biBzdGF0ZSBldmVyeSB0aW1lLFxuICogd2hpY2ggaXMgd2hhdCBtYWtlcyBhIHJldm9jYXRpb24gdGFrZSBlZmZlY3Qgd2l0aGluIG9uZSB0b2tlbiBsaWZldGltZS5cbiAqXG4gKiBDb250cmFjdDogY2FjaGUgdGhlIHRva2VuIGluIHRoZSB3YXJtIGNvbnRhaW5lciwgcmVmcmVzaCBFQVJMWSAoYmVmb3JlXG4gKiBleHBpcnkpIHNvIGEgYmF0Y2ggbmV2ZXIgcHJlc2VudHMgYSB0b2tlbiB0aGF0IGRpZXMgbWlkLWZsaWdodCwgYW5kIGZhaWwgdGhlXG4gKiBiYXRjaCBvbiBhbiBleGNoYW5nZSBmYWlsdXJlIHJhdGhlciB0aGFuIHNoaXBwaW5nIGV2ZW50cyB1bmF1dGhlbnRpY2F0ZWQuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUGxhdGZvcm1DcmVkZW50aWFsIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvcGlwZWxpbmUtY29yZS9saWIvaGFuZGxlcnMvcGxhdGZvcm0tY3JlZGVudGlhbC5qcyc7XG5pbXBvcnQgeyBmZXRjaFdpdGhUaW1lb3V0LCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vKiogUmVmcmVzaCBhdCB0aGlzIGZyYWN0aW9uIG9mIHRoZSB0b2tlbidzIGxpZmUg4oCUIG5ldmVyIGF0IHRoZSBsYXN0IG1vbWVudC4gKi9cbmNvbnN0IFRPS0VOX1JFRlJFU0hfRlJBQ1RJT04gPSAwLjg7XG4vKiogRmxvb3Igb24gdGhlIGNhY2hlZCBsaWZldGltZSwgc28gYSBzdXJwcmlzaW5nbHkgc2hvcnQgVFRMIGNhbid0IGNhdXNlIGFcbiAqICByZWZyZXNoIHN0b3JtIChvbmUgZXhjaGFuZ2UgcGVyIGJhdGNoIGF0IHdvcnN0KS4gKi9cbmNvbnN0IE1JTl9UT0tFTl9DQUNIRV9NUyA9IDMwXzAwMDtcbi8qKiBQZXItcmVxdWVzdCB0aW1lb3V0IGZvciB0aGUgZXhjaGFuZ2UgY2FsbC4gKi9cbmNvbnN0IEVYQ0hBTkdFX1RJTUVPVVRfTVMgPSA1MDAwO1xuXG4vKipcbiAqIFRoZSBzZXJ2aWNlLWFjY291bnQga2V5OiBgUExBVEZPUk1fQUNDRVNTX0tFWWAgaWYgc2V0LCBvdGhlcndpc2UgdGhlXG4gKiBgcGFzc3dvcmRgIGZpZWxkIG9mIHRoZSBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IG5hbWVkIGJ5IGBQTEFURk9STV9TRUNSRVRfTkFNRWAuXG4gKiBBIHN0b3JlZCBKV1QgaXMgcmVmdXNlZCBsb3VkbHksIG5hbWluZyB0aGUgZml4LCBpbnN0ZWFkIG9mIGZhaWxpbmcgbGF0ZXIgYXMgYW5cbiAqIG9wYXF1ZSA0MDEgZnJvbSB0aGUgcmVwb3J0aW5nIEFQSS5cbiAqL1xuY29uc3QgY3JlZGVudGlhbCA9IGNyZWF0ZVBsYXRmb3JtQ3JlZGVudGlhbCh7XG4gIHNlY3JldE5hbWU6ICgpID0+IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FLFxuICBlbnZLZXlWYXI6ICdQTEFURk9STV9BQ0NFU1NfS0VZJyxcbn0pO1xuXG5sZXQgY2FjaGVkVG9rZW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xubGV0IGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gMDtcblxuLyoqXG4gKiBUcmFkZSB0aGUgc3RvcmVkIGtleSBmb3IgYSBzaG9ydC1saXZlZCBwbGF0Zm9ybSB0b2tlbiwgY2FjaGVkIHBlciB3YXJtXG4gKiBjb250YWluZXIgdW50aWwgaXQgaXMgODAlIHRocm91Z2ggaXRzIGxpZmUuIFRocm93cyBvbiBhbnkgZmFpbHVyZSwgd2hpY2ggZmFpbHNcbiAqIHRoZSBiYXRjaCBzbyBTUVMgcmV0cmllcyBpdCDigJQgYW4gdW5hdXRoZW50aWNhdGVkIHNoaXAgaXMgbmV2ZXIgYW4gb3B0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXV0aFRva2VuKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChjYWNoZWRUb2tlbiAmJiBEYXRlLm5vdygpIDwgY2FjaGVkVG9rZW5FeHBpcmVzQXQpIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICBjb25zdCBiYXNlVXJsID0gKHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMIHx8ICcnKS5yZXBsYWNlKC9cXC8rJC8sICcnKTtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG4gIGNvbnN0IGtleSA9IGF3YWl0IGNyZWRlbnRpYWwuZ2V0S2V5KCk7XG5cbiAgLy8gU2FtZSBkZWFkbGluZSBhcyBiZWZvcmUsIHRocm91Z2ggdGhlIHBhY2thZ2UncyBvbmUgYm91bmRlZC1mZXRjaCBoZWxwZXI6IGEgbWFudWFsXG4gIC8vIGNvbnRyb2xsZXIgcGx1cyBhIHRpbWVyIGl0IGhhcyB0byByZW1lbWJlciB0byBjbGVhciBpcyBhIGxlYWsgd2FpdGluZyBmb3IgYW4gZWFybHlcbiAgLy8gYHJldHVybmAsIGFuZCB0d28gc3BlbGxpbmdzIG9mIFwidGltZSB0aGlzIG91dFwiIGlzIGhvdyBvbmUgb2YgdGhlbSBlbmRzIHVwIG1pc3NpbmcuXG4gIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoV2l0aFRpbWVvdXQoYCR7YmFzZVVybH0vYXBpL2F1dGgvdG9rZW4vZXhjaGFuZ2VgLCB7XG4gICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBrZXkgfSksXG4gIH0sIEVYQ0hBTkdFX1RJTUVPVVRfTVMpO1xuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgLy8gQSByZWplY3RlZCBrZXkgaXMgdGhlIG9uZSBmYWlsdXJlIGFuIG9wZXJhdG9yIGhhcyB0byBhY3Qgb24sIGFuZCBwbGF0Zm9ybVxuICAgIC8vIGRlbGliZXJhdGVseSBhbnN3ZXJzIGV2ZXJ5IHJlZnVzYWwgdGhlIHNhbWUgd2F5IOKAlCBzbyBzYXkgd2hhdCB0byBjaGVja1xuICAgIC8vIHJhdGhlciB0aGFuIGVjaG9pbmcgYW4gdW5kaWZmZXJlbnRpYXRlZCA0MDEuXG4gICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFjY2Vzcy1rZXkgZXhjaGFuZ2UgcmVmdXNlZCAoJHtyZXMuc3RhdHVzfSkg4oCUIHRoZSBzdG9yZWQga2V5IGlzIHVua25vd24sIHJldm9rZWQsIGV4cGlyZWQsIGBcbiAgICAgICAgKyAnaXRzIHNlcnZpY2UgYWNjb3VudCBpcyBkaXNhYmxlZCwgb3IgdGhpcyBhZGRyZXNzIGlzIG91dHNpZGUgdGhlIGtleeKAmXMgSVAgYWxsb3dsaXN0JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQWNjZXNzLWtleSBleGNoYW5nZSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpIGFzIHsgZGF0YT86IHsgYWNjZXNzVG9rZW4/OiBzdHJpbmc7IGV4cGlyZXNJbj86IG51bWJlciB9IH07XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID0gYm9keS5kYXRhPy5hY2Nlc3NUb2tlbjtcbiAgaWYgKCFhY2Nlc3NUb2tlbikgdGhyb3cgbmV3IEVycm9yKCdBY2Nlc3Mta2V5IGV4Y2hhbmdlIHJldHVybmVkIG5vIGFjY2VzcyB0b2tlbicpO1xuXG4gIGNvbnN0IHR0bE1zID0gKHR5cGVvZiBib2R5LmRhdGE/LmV4cGlyZXNJbiA9PT0gJ251bWJlcicgJiYgYm9keS5kYXRhLmV4cGlyZXNJbiA+IDAgPyBib2R5LmRhdGEuZXhwaXJlc0luIDogMzAwKSAqIDEwMDA7XG4gIGNhY2hlZFRva2VuID0gYWNjZXNzVG9rZW47XG4gIGNhY2hlZFRva2VuRXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIE1hdGgubWF4KE1JTl9UT0tFTl9DQUNIRV9NUywgdHRsTXMgKiBUT0tFTl9SRUZSRVNIX0ZSQUNUSU9OKTtcbiAgbG9nLmluZm8oJ0V4Y2hhbmdlZCB0aGUgc3RvcmVkIHNlcnZpY2UtYWNjb3VudCBrZXkgZm9yIGEgcGxhdGZvcm0gdG9rZW4nKTtcbiAgcmV0dXJuIGFjY2Vzc1Rva2VuO1xufVxuXG4vKipcbiAqIERyb3AgZXZlcnl0aGluZyB0aGUgY29udGFpbmVyIGhvbGRzIGFib3V0IGl0cyBjcmVkZW50aWFsIGFmdGVyIGEgNDAxLzQwMyBmcm9tXG4gKiB0aGUgQVBJOiB0aGUgdG9rZW4sIGFuZCB0aGUgS0VZIOKAlCB0aGUgdG9rZW4tcmVuZXcgTGFtYmRhIHJvdGF0ZXMgdGhlIHNlY3JldFxuICogdW5kZXJuZWF0aCB1cywgc28gYSB3YXJtIGNvbnRhaW5lciB0aGF0IG9ubHkgcmUtZXhjaGFuZ2VkIHdvdWxkIGtlZXBcbiAqIHByZXNlbnRpbmcgdGhlIHJldGlyZWQga2V5IGZvcmV2ZXIuIEFuIGVudi1wcm92aWRlZCBrZXkgY2Fubm90IGNoYW5nZSB3aXRob3V0XG4gKiBhIG5ldyBjb250YWluZXIsIHNvIGl0IGlzIGtlcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlQ3JlZGVudGlhbCgpOiB2b2lkIHtcbiAgY2FjaGVkVG9rZW4gPSBudWxsO1xuICBjYWNoZWRUb2tlbkV4cGlyZXNBdCA9IDA7XG4gIGNyZWRlbnRpYWwuaW52YWxpZGF0ZSgpO1xufVxuXG4vKiogQGludGVybmFsIFRlc3Qtb25seTogZm9yZ2V0IGV2ZXJ5IGNhY2hlZCBjcmVkZW50aWFsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEF1dGhGb3JUZXN0cygpOiB2b2lkIHtcbiAgY2FjaGVkVG9rZW4gPSBudWxsO1xuICBjYWNoZWRUb2tlbkV4cGlyZXNBdCA9IDA7XG4gIGNyZWRlbnRpYWwucmVzZXQoKTtcbn1cbiJdfQ==
package/lib/health.js CHANGED
@@ -1,7 +1,7 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { getAuthToken } from './auth.js';
4
- import { BoundedMap, CACHE_MAX_ENTRIES, loadSdk, log } from './util.js';
4
+ import { BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
5
5
  let sqsMod;
6
6
  let sqsClientsByRegion;
7
7
  async function sqsClient(region) {
@@ -81,7 +81,7 @@ async function startMoveTask(region, dlqArn, mainArn) {
81
81
  async function postIngestHealth(baseUrl, body) {
82
82
  try {
83
83
  const token = await getAuthToken();
84
- const res = await fetch(`${baseUrl}/api/reports/ingest-health`, {
84
+ const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
85
85
  method: 'POST',
86
86
  headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
87
87
  body: JSON.stringify(body),
@@ -188,4 +188,4 @@ export function _resetHealthForTests() {
188
188
  lastHealthAt = 0;
189
189
  lastRedriveAt = 0;
190
190
  }
191
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBeUJ4RSxJQUFJLE1BQTZCLENBQUM7QUFDbEMsSUFBSSxrQkFBMEQsQ0FBQztBQUMvRCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWM7SUFDckMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQVkscUJBQXFCLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsa0JBQWtCO1FBQUUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLG9GQUFvRjtBQUNwRixzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQWlCLGlCQUFpQixDQUFDLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBaUIsaUJBQWlCLENBQUMsQ0FBQztBQUMzRSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7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Q0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzFCLGNBQWMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDeEMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNQLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJO2dCQUFFLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDeEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxvQkFBb0I7SUFDbEMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDakIsYUFBYSxHQUFHLENBQUMsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IGdldEF1dGhUb2tlbiB9IGZyb20gJy4vYXV0aC5qcyc7XG5pbXBvcnQgeyBCb3VuZGVkTWFwLCBDQUNIRV9NQVhfRU5UUklFUywgbG9hZFNkaywgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRGVsaXZlcnkgaGVhbHRoICsgc2VsZi1oZWFsaW5nIERMUSByZWRyaXZlLlxuLy8gQWZ0ZXIgYSBTVUNDRVNTRlVMIGJhdGNoIFBPU1Qgd2UgKHRocm90dGxlZCwgYmVzdC1lZmZvcnQpOlxuLy8gICAxLiBQT1NUIGFuIGluZ2VzdC1oZWFsdGggc2lnbmFsIHRvIC9hcGkvcmVwb3J0cy9pbmdlc3QtaGVhbHRoIHNvIHRoZSBSZXBvcnRzIFVJXG4vLyAgICAgIGNhbiBzaG93IGZsb3dpbmcgLyBzdGFsZSAvIGRyb3BwaW5nLlxuLy8gICAyLiBJZiB0aGUgRExRIGlzIG5vbi1lbXB0eSwgbm8gbW92ZSB0YXNrIGlzIGFscmVhZHkgcnVubmluZywgQU5EIHRoZSBvbGRlc3QgRExRXG4vLyAgICAgIG1lc3NhZ2UgaXMgeW91bmdlciB0aGFuIHRoZSBwb2lzb24tYWdlIGNlaWxpbmcsIGtpY2sgb2ZmIGFuIFNRU1xuLy8gICAgICBNZXNzYWdlTW92ZVRhc2sgKERMUSDihpIgbWFpbiBxdWV1ZSkgc28gcmV0cnlhYmxlIGZhaWx1cmVzIHNlbGYtaGVhbCB3aXRob3V0IGFcbi8vICAgICAgbmV3IEFXUyBzZXJ2aWNlLiBUaGUgcmVwb3J0aW5nIGluZ2VzdCdzIHBhcnRpYWwtdW5pcXVlIGluZGV4IGRlZHVwZXMgYW55XG4vLyAgICAgIHJlZGVsaXZlcmVkIGV2ZW50LCBzbyBhIHJlZHJpdmUgY2FuJ3QgZG91YmxlLWNvdW50LlxuLy8gR3VhcmRzOiBvbmx5IG9uIHN1Y2Nlc3MsIG9uZS1hdC1hLXRpbWUgKExpc3RNZXNzYWdlTW92ZVRhc2tzKSwgYSBwb2lzb24tYWdlIGNlaWxpbmdcbi8vIChzbyBhIG1lc3NhZ2UgdGhhdCBhbHdheXMgZmFpbHMgY2FuJ3QgbG9vcCBETFHihpJtYWlu4oaSRExRIGZvcmV2ZXIpLCBhbmQgdGhyb3R0bGVkIHZpYVxuLy8gbW9kdWxlIHRpbWVzdGFtcHMuIE5FVkVSIHRocm93cyDigJQgYSBmYWlsdXJlIGhlcmUgbXVzdCBub3QgZmFpbCB0aGUgYmF0Y2guXG4vL1xuLy8gSUFNIHJlcXVpcmVkIChkb2N1bWVudCBvbmx5IOKAlCBncmFudGVkIG9uIHRoZSBldmVudHMgc3RhY2spOlxuLy8gICBzcXM6R2V0UXVldWVBdHRyaWJ1dGVzLCBzcXM6TGlzdE1lc3NhZ2VNb3ZlVGFza3MsIHNxczpTdGFydE1lc3NhZ2VNb3ZlVGFzayAob24gdGhlIERMUSlcblxuaW50ZXJmYWNlIFNxc0NsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IH1cbmludGVyZmFjZSBTcXNNb2R1bGUge1xuICBTUVNDbGllbnQ6IG5ldyAoY29uZmlnOiB7IHJlZ2lvbjogc3RyaW5nIH0pID0+IFNxc0NsaWVudExpa2U7XG4gIEdldFF1ZXVlQXR0cmlidXRlc0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgUXVldWVVcmw6IHN0cmluZzsgQXR0cmlidXRlTmFtZXM6IHN0cmluZ1tdIH0pID0+IHVua25vd247XG4gIExpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZDogbmV3IChpbnB1dDogeyBTb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xuICBTdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgU291cmNlQXJuOiBzdHJpbmc7IERlc3RpbmF0aW9uQXJuPzogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgc3FzTW9kOiBTcXNNb2R1bGUgfCB1bmRlZmluZWQ7XG5sZXQgc3FzQ2xpZW50c0J5UmVnaW9uOiBNYXA8c3RyaW5nLCBTcXNDbGllbnRMaWtlPiB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIHNxc0NsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8U3FzQ2xpZW50TGlrZT4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGlmICghc3FzQ2xpZW50c0J5UmVnaW9uKSBzcXNDbGllbnRzQnlSZWdpb24gPSBuZXcgTWFwKCk7XG4gIGxldCBjbGllbnQgPSBzcXNDbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gbmV3IHNxc01vZC5TUVNDbGllbnQoeyByZWdpb24gfSk7XG4gICAgc3FzQ2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLy8gRGVsaXZlcnktaGVhbHRoIGNvdW50ZXJzIGFyZSBhdHRyaWJ1dGVkIFBFUiBSRVNPTFZFRCBPUkcgKHRoZSBmb3J3YXJkZXIgaXMgYSBmbGVldFxuLy8gTGFtYmRhIHNlcnZpbmcgbWFueSBvcmdzOyBhIHNpbmdsZSBnbG9iYWwgY291bnRlciB3b3VsZCBtaXMtYXR0cmlidXRlIG9uZSBvcmcnc1xuLy8gdGhyb3VnaHB1dCB0byBhbm90aGVyKS4gS2V5ZWQgYnkgb3JnSWQgKCcnIGJ1Y2tldCA9IHBpcGVsaW5lIHdpdGggbm8gT3JnSWQgdGFnKS5cbi8vIFRoZSBETFEgZGVwdGggKGBkcm9wcGVkYCkgaXMgZ2VudWluZWx5IGZsZWV0LWdsb2JhbCDigJQgb25lIHNoYXJlZCBETFEg4oCUIHNvIGl0IGlzIGFcbi8vIHNpbmdsZSBzbmFwc2hvdCBwb3N0ZWQgYWxvbmdzaWRlIGVhY2ggb3JnJ3MgaGVhbHRoLCBkb2N1bWVudGVkIGFzIHRoZSBzaGFyZWQgZGVwdGguXG5jb25zdCBmb3J3YXJkZWRCeU9yZyA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgbnVtYmVyPihDQUNIRV9NQVhfRU5UUklFUyk7XG5jb25zdCBsYXN0RXZlbnRBdEJ5T3JnID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBzdHJpbmc+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmxldCBsYXN0SGVhbHRoQXQgPSAwO1xubGV0IGxhc3RSZWRyaXZlQXQgPSAwO1xuY29uc3QgSEVBTFRIX1RIUk9UVExFX01TID0gNjAgKiAxMDAwO1xuY29uc3QgUkVEUklWRV9USFJPVFRMRV9NUyA9IDUgKiA2MCAqIDEwMDA7XG4vLyBQb2lzb24tbWVzc2FnZSBjZWlsaW5nOiBpZiB0aGUgb2xkZXN0IERMUSBtZXNzYWdlIGlzIG9sZGVyIHRoYW4gdGhpcywgd2UgU1RPUFxuLy8gcmVkcml2aW5nIGl0IChETFHihpJtYWlu4oaSZmFpbOKGkkRMUSB3b3VsZCBsb29wIGZvcmV2ZXIpLiBTdWNoIG1lc3NhZ2VzIGFyZSBsZWZ0IGZvciBhblxuLy8gYWxhcm0gLyBtYW51YWwgaW5zcGVjdGlvbiBpbnN0ZWFkIG9mIGNodXJuaW5nIHRoZSBmbGVldCBpbmRlZmluaXRlbHkuXG5jb25zdCBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQyA9IDYgKiA2MCAqIDYwOyAvLyA2IGhvdXJzXG5cbi8qKiBQYXJzZSB0aGUgU1FTIHRyaWdnZXIgQVJOIGFuZCBkZXJpdmUgdGhlIG1haW4gKyBETFEgQVJOcyBhbmQgdGhlIERMUSBVUkwuICovXG5mdW5jdGlvbiBkZXJpdmVRdWV1ZXMobWFpblF1ZXVlQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQpOiB7IHJlZ2lvbjogc3RyaW5nOyBtYWluQXJuOiBzdHJpbmc7IGRscUFybjogc3RyaW5nOyBkbHFVcmw6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFtYWluUXVldWVBcm4pIHJldHVybiB1bmRlZmluZWQ7XG4gIC8vIGFybjphd3M6c3FzOntyZWdpb259OnthY2NvdW50fTp7bmFtZX1cbiAgY29uc3QgcGFydHMgPSBtYWluUXVldWVBcm4uc3BsaXQoJzonKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCA8IDYgfHwgcGFydHNbMl0gIT09ICdzcXMnKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbLCAsICwgcmVnaW9uLCBhY2NvdW50LCBuYW1lXSA9IHBhcnRzO1xuICBjb25zdCBkbHFBcm4gPSBwcm9jZXNzLmVudi5FVkVOVF9ETFFfQVJOIHx8IGBhcm46YXdzOnNxczoke3JlZ2lvbn06JHthY2NvdW50fToke25hbWV9LWRscWA7XG4gIGNvbnN0IGRscU5hbWUgPSBkbHFBcm4uc3BsaXQoJzonKS5wb3AoKSA/PyBgJHtuYW1lfS1kbHFgO1xuICBjb25zdCBkbHFVcmwgPSBgaHR0cHM6Ly9zcXMuJHtyZWdpb259LmFtYXpvbmF3cy5jb20vJHthY2NvdW50fS8ke2RscU5hbWV9YDtcbiAgcmV0dXJuIHsgcmVnaW9uLCBtYWluQXJuOiBtYWluUXVldWVBcm4sIGRscUFybiwgZGxxVXJsIH07XG59XG5cbi8qKiBTbmFwc2hvdCB0aGUgRExRIGRlcHRoICsgdGhlIGFnZSAoc2Vjb25kcykgb2YgaXRzIG9sZGVzdCBtZXNzYWdlIChmb3IgdGhlXG4gKiAgcG9pc29uLW1lc3NhZ2UgcmVkcml2ZSBjZWlsaW5nKS4gTWlzc2luZy9OYU4gYXR0cmlidXRlcyBmYWxsIGJhY2sgdG8gMC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRscVN0YXRzKHJlZ2lvbjogc3RyaW5nLCBkbHFVcmw6IHN0cmluZyk6IFByb21pc2U8eyBkZXB0aDogbnVtYmVyOyBvbGRlc3RBZ2VTZWM6IG51bWJlciB9PiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgc3FzQ2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBzcXNNb2QuR2V0UXVldWVBdHRyaWJ1dGVzQ29tbWFuZCh7XG4gICAgUXVldWVVcmw6IGRscVVybCxcbiAgICBBdHRyaWJ1dGVOYW1lczogWydBcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXMnLCAnQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2UnXSxcbiAgfSkpIGFzIHsgQXR0cmlidXRlcz86IHsgQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzPzogc3RyaW5nOyBBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZT86IHN0cmluZyB9IH07XG4gIGNvbnN0IG4gPSBOdW1iZXIob3V0LkF0dHJpYnV0ZXM/LkFwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcyA/PyAnMCcpO1xuICBjb25zdCBhZ2UgPSBOdW1iZXIob3V0LkF0dHJpYnV0ZXM/LkFwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlID8/ICcwJyk7XG4gIHJldHVybiB7XG4gICAgZGVwdGg6IE51bWJlci5pc0Zpbml0ZShuKSA/IG4gOiAwLFxuICAgIG9sZGVzdEFnZVNlYzogTnVtYmVyLmlzRmluaXRlKGFnZSkgPyBhZ2UgOiAwLFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBY3RpdmVNb3ZlVGFzayhyZWdpb246IHN0cmluZywgZGxxQXJuOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5MaXN0TWVzc2FnZU1vdmVUYXNrc0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiB9KSkgYXMge1xuICAgIFJlc3VsdHM/OiBBcnJheTx7IFN0YXR1cz86IHN0cmluZyB9PjtcbiAgfTtcbiAgcmV0dXJuIChvdXQuUmVzdWx0cyA/PyBbXSkuc29tZSh0ID0+IHQuU3RhdHVzID09PSAnUlVOTklORycpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzdGFydE1vdmVUYXNrKHJlZ2lvbjogc3RyaW5nLCBkbHFBcm46IHN0cmluZywgbWFpbkFybjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgY29uc3QgY2xpZW50ID0gYXdhaXQgc3FzQ2xpZW50KHJlZ2lvbik7XG4gIGF3YWl0IGNsaWVudC5zZW5kKG5ldyBzcXNNb2QuU3RhcnRNZXNzYWdlTW92ZVRhc2tDb21tYW5kKHsgU291cmNlQXJuOiBkbHFBcm4sIERlc3RpbmF0aW9uQXJuOiBtYWluQXJuIH0pKTtcbn1cblxuLyoqIFBPU1Qgb25lIG9yZydzIGluZ2VzdC1oZWFsdGggc2lnbmFsLiBSZXR1cm5zIHRydWUgb25seSBvbiBhIGNvbmZpcm1lZCAyeHggc28gdGhlXG4gKiAgY2FsbGVyIHJlc2V0cyB0aGF0IG9yZydzIGBmb3J3YXJkZWRgIGNvdW50ZXIgT05MWSB3aGVuIHRoZSBzaWduYWwgd2FzIGFjY2VwdGVkXG4gKiAgKGEgZHJvcHBlZC9mYWlsZWQgUE9TVCBtdXN0IG5vdCBzaWxlbnRseSB6ZXJvIHRoZSBhY2N1bXVsYXRlZCBjb3VudCkuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0SW5nZXN0SGVhbHRoKGJhc2VVcmw6IHN0cmluZywgYm9keTogeyBvcmdJZD86IHN0cmluZzsgZm9yd2FyZGVkOiBudW1iZXI7IGRyb3BwZWQ6IG51bWJlcjsgbGFzdEV2ZW50QXQ/OiBzdHJpbmcgfSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgZ2V0QXV0aFRva2VuKCk7XG4gICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvaW5nZXN0LWhlYWx0aGAsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLCAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICB9KTtcbiAgICBpZiAoIXJlcy5vaykge1xuICAgICAgbG9nLndhcm4oJ2luZ2VzdC1oZWFsdGggUE9TVCByZXR1cm5lZCBub24tMnh4IChpZ25vcmVkKScsIHsgc3RhdHVzOiByZXMuc3RhdHVzLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IFN0cmluZyhlcnIpLCBvcmdJZDogYm9keS5vcmdJZCB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvdHRsZWQsIGJlc3QtZWZmb3J0IHBvc3Qtc3VjY2VzcyB3b3JrOiBlbWl0IHBlci1vcmcgaW5nZXN0LWhlYWx0aCBhbmQgc2VsZi1oZWFsXG4gKiB0aGUgRExRLiBOZXZlciB0aHJvd3MuIGBmb3J3YXJkZWRgL2BsYXN0RXZlbnRBdGAgYWNjdW11bGF0ZSBQRVIgT1JHIGFjcm9zcyBiYXRjaGVzXG4gKiBiZXR3ZWVuIGhlYWx0aCBwb3N0czsgYGRyb3BwZWRgIGlzIHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoIHNuYXBzaG90LiBBIHBlci1vcmdcbiAqIGNvdW50ZXIgaXMgemVyb2VkIG9ubHkgYWZ0ZXIgdGhhdCBvcmcncyBoZWFsdGggUE9TVCBpcyBjb25maXJtZWQgMnh4LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVwb3J0SGVhbHRoQW5kUmVkcml2ZShiYXNlVXJsOiBzdHJpbmcsIG1haW5RdWV1ZUFybjogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGlmIChub3cgLSBsYXN0SGVhbHRoQXQgPCBIRUFMVEhfVEhST1RUTEVfTVMpIHJldHVybjtcbiAgbGFzdEhlYWx0aEF0ID0gbm93O1xuICB0cnkge1xuICAgIGNvbnN0IHEgPSBkZXJpdmVRdWV1ZXMobWFpblF1ZXVlQXJuKTtcbiAgICBsZXQgZGVwdGggPSAwO1xuICAgIGxldCBvbGRlc3RBZ2VTZWMgPSAwO1xuICAgIGlmIChxKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IGRscVN0YXRzKHEucmVnaW9uLCBxLmRscVVybCk7XG4gICAgICAgIGRlcHRoID0gc3RhdHMuZGVwdGg7XG4gICAgICAgIG9sZGVzdEFnZVNlYyA9IHN0YXRzLm9sZGVzdEFnZVNlYztcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2cud2FybignRExRIHN0YXRzIGNoZWNrIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQb3N0IG9uZSBoZWFsdGggc2lnbmFsIHBlciByZXNvbHZlZCBvcmcsIGF0dHJpYnV0aW5nIGl0cyBvd24gZm9yd2FyZGVkIGNvdW50ICtcbiAgICAvLyBsYXN0IGV2ZW50IHRpbWUuIGBkcm9wcGVkYCAodGhlIHNoYXJlZCBmbGVldCBETFEgZGVwdGgpIHJpZGVzIGFsb25nIG9uIGVhY2guXG4gICAgLy8gU25hcHNob3QgdGhlIGtleXMgZmlyc3Qgc28gd2UgZG9uJ3QgbXV0YXRlIHRoZSBtYXAgd2hpbGUgaXRlcmF0aW5nLlxuICAgIGNvbnN0IG9yZ0tleXMgPSBuZXcgU2V0KFsuLi5mb3J3YXJkZWRCeU9yZy5rZXlzKCksIC4uLmxhc3RFdmVudEF0QnlPcmcua2V5cygpXSk7XG4gICAgaWYgKG9yZ0tleXMuc2l6ZSA9PT0gMCkgb3JnS2V5cy5hZGQoJycpOyAvLyBub3RoaW5nIGZvcndhcmRlZCB5ZXQg4oaSIHN0aWxsIHJlcG9ydCBkZXB0aFxuICAgIGZvciAoY29uc3Qga2V5IG9mIG9yZ0tleXMpIHtcbiAgICAgIGNvbnN0IGZvcndhcmRlZCA9IGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDA7XG4gICAgICBjb25zdCBsYXN0RXZlbnRBdCA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBjb25zdCBvayA9IGF3YWl0IHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybCwge1xuICAgICAgICAuLi4oa2V5ID8geyBvcmdJZDoga2V5IH0gOiB7fSksXG4gICAgICAgIGZvcndhcmRlZCxcbiAgICAgICAgZHJvcHBlZDogZGVwdGgsXG4gICAgICAgIGxhc3RFdmVudEF0LFxuICAgICAgfSk7XG4gICAgICAvLyBSZXNldCB0aGUgZm9yd2FyZGVkIGNvdW50ZXIgT05MWSBvbiBhIGNvbmZpcm1lZCAyeHgg4oCUIGEgZmFpbGVkL2Ryb3BwZWQgUE9TVFxuICAgICAgLy8ga2VlcHMgdGhlIGNvdW50IHNvIHRoZSBuZXh0IHRpY2sgcmUtcmVwb3J0cyBpdCBpbnN0ZWFkIG9mIGxvc2luZyBpdC5cbiAgICAgIGlmIChvaykgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgMCk7XG4gICAgfVxuXG4gICAgaWYgKHEgJiYgZGVwdGggPiAwICYmIG5vdyAtIGxhc3RSZWRyaXZlQXQgPj0gUkVEUklWRV9USFJPVFRMRV9NUykge1xuICAgICAgLy8gUG9pc29uLW1lc3NhZ2UgY2VpbGluZzogbmV2ZXIgcmVkcml2ZSBhIERMUSB3aG9zZSBvbGRlc3QgbWVzc2FnZSBoYXMgYWdlZFxuICAgICAgLy8gcGFzdCB0aGUgY2VpbGluZyDigJQgdGhhdCBtZXNzYWdlIGtlZXBzIGZhaWxpbmcgYW5kIHdvdWxkIGxvb3AgRExR4oaSbWFpbuKGkkRMUS5cbiAgICAgIGlmIChvbGRlc3RBZ2VTZWMgPiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQykge1xuICAgICAgICBsb2cud2FybignRExRIG9sZGVzdCBtZXNzYWdlIGV4Y2VlZHMgcG9pc29uLWFnZSBjZWlsaW5nIOKAlCBza2lwcGluZyByZWRyaXZlIChuZWVkcyBtYW51YWwgYXR0ZW50aW9uKScsIHtcbiAgICAgICAgICBkbHFBcm46IHEuZGxxQXJuLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjLCBjZWlsaW5nU2VjOiBNQVhfRExRX1JFRFJJVkVfQUdFX1NFQyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICghKGF3YWl0IGhhc0FjdGl2ZU1vdmVUYXNrKHEucmVnaW9uLCBxLmRscUFybikpKSB7XG4gICAgICAgICAgICBsYXN0UmVkcml2ZUF0ID0gbm93O1xuICAgICAgICAgICAgYXdhaXQgc3RhcnRNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4sIHEubWFpbkFybik7XG4gICAgICAgICAgICBsb2cuaW5mbygnU3RhcnRlZCBzZWxmLWhlYWxpbmcgRExR4oaSbWFpbiByZWRyaXZlJywgeyBkbHFBcm46IHEuZGxxQXJuLCBkcm9wcGVkOiBkZXB0aCwgb2xkZXN0QWdlU2VjIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbG9nLndhcm4oJ0RMUSByZWRyaXZlIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ2hlYWx0aC9yZWRyaXZlIHN0ZXAgZmFpbGVkIChpZ25vcmVkKScsIHsgZXJyb3I6IFN0cmluZyhlcnIpIH0pO1xuICB9XG59XG5cbi8qKiBDb3VudCBhIGZvcndhcmRlZCBiYXRjaCB0b3dhcmQgZWFjaCByZXNvbHZlZCBvcmcncyBkZWxpdmVyeS1oZWFsdGggcmVwb3J0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEZvcndhcmRlZChldmVudHM6IFJlYWRvbmx5QXJyYXk8eyBvcmdJZDogc3RyaW5nIHwgbnVsbDsgY29tcGxldGVkQXQ/OiBzdHJpbmc7IHN0YXJ0ZWRBdD86IHN0cmluZyB9Pik6IHZvaWQge1xuICBmb3IgKGNvbnN0IGUgb2YgZXZlbnRzKSB7XG4gICAgY29uc3Qga2V5ID0gZS5vcmdJZCA/PyAnJztcbiAgICBmb3J3YXJkZWRCeU9yZy5zZXQoa2V5LCAoZm9yd2FyZGVkQnlPcmcuZ2V0KGtleSkgPz8gMCkgKyAxKTtcbiAgICBjb25zdCBhdCA9IGUuY29tcGxldGVkQXQgfHwgZS5zdGFydGVkQXQ7XG4gICAgaWYgKGF0KSB7XG4gICAgICBjb25zdCBwcmV2ID0gbGFzdEV2ZW50QXRCeU9yZy5nZXQoa2V5KTtcbiAgICAgIGlmICghcHJldiB8fCBhdCA+IHByZXYpIGxhc3RFdmVudEF0QnlPcmcuc2V0KGtleSwgYXQpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQGludGVybmFsIFRlc3Qtb25seTogZm9yZ2V0IGhlYWx0aCBjb3VudGVycyBhbmQgdGhyb3R0bGVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldEhlYWx0aEZvclRlc3RzKCk6IHZvaWQge1xuICBmb3J3YXJkZWRCeU9yZy5jbGVhcigpO1xuICBsYXN0RXZlbnRBdEJ5T3JnLmNsZWFyKCk7XG4gIGxhc3RIZWFsdGhBdCA9IDA7XG4gIGxhc3RSZWRyaXZlQXQgPSAwO1xufVxuIl19
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2hlYWx0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBeUIxRixJQUFJLE1BQTZCLENBQUM7QUFDbEMsSUFBSSxrQkFBMEQsQ0FBQztBQUMvRCxLQUFLLFVBQVUsU0FBUyxDQUFDLE1BQWM7SUFDckMsSUFBSSxDQUFDLE1BQU07UUFBRSxNQUFNLEdBQUcsTUFBTSxPQUFPLENBQVkscUJBQXFCLENBQUMsQ0FBQztJQUN0RSxJQUFJLENBQUMsa0JBQWtCO1FBQUUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxJQUFJLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDMUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELHFGQUFxRjtBQUNyRixrRkFBa0Y7QUFDbEYsbUZBQW1GO0FBQ25GLG9GQUFvRjtBQUNwRixzRkFBc0Y7QUFDdEYsTUFBTSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQWlCLGlCQUFpQixDQUFDLENBQUM7QUFDekUsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFVBQVUsQ0FBaUIsaUJBQWlCLENBQUMsQ0FBQztBQUMzRSxJQUFJLFlBQVksR0FB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Q3ZILEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDMUIsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUN4QyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ1AsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUk7Z0JBQUUsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxpRUFBaUU7QUFDakUsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDdkIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekIsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNqQixhQUFhLEdBQUcsQ0FBQyxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgZ2V0QXV0aFRva2VuIH0gZnJvbSAnLi9hdXRoLmpzJztcbmltcG9ydCB7IEJvdW5kZWRNYXAsIENBQ0hFX01BWF9FTlRSSUVTLCBmZXRjaFdpdGhUaW1lb3V0LCBsb2FkU2RrLCBsb2cgfSBmcm9tICcuL3V0aWwuanMnO1xuXG4vLyBEZWxpdmVyeSBoZWFsdGggKyBzZWxmLWhlYWxpbmcgRExRIHJlZHJpdmUuXG4vLyBBZnRlciBhIFNVQ0NFU1NGVUwgYmF0Y2ggUE9TVCB3ZSAodGhyb3R0bGVkLCBiZXN0LWVmZm9ydCk6XG4vLyAgIDEuIFBPU1QgYW4gaW5nZXN0LWhlYWx0aCBzaWduYWwgdG8gL2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGggc28gdGhlIFJlcG9ydHMgVUlcbi8vICAgICAgY2FuIHNob3cgZmxvd2luZyAvIHN0YWxlIC8gZHJvcHBpbmcuXG4vLyAgIDIuIElmIHRoZSBETFEgaXMgbm9uLWVtcHR5LCBubyBtb3ZlIHRhc2sgaXMgYWxyZWFkeSBydW5uaW5nLCBBTkQgdGhlIG9sZGVzdCBETFFcbi8vICAgICAgbWVzc2FnZSBpcyB5b3VuZ2VyIHRoYW4gdGhlIHBvaXNvbi1hZ2UgY2VpbGluZywga2ljayBvZmYgYW4gU1FTXG4vLyAgICAgIE1lc3NhZ2VNb3ZlVGFzayAoRExRIOKGkiBtYWluIHF1ZXVlKSBzbyByZXRyeWFibGUgZmFpbHVyZXMgc2VsZi1oZWFsIHdpdGhvdXQgYVxuLy8gICAgICBuZXcgQVdTIHNlcnZpY2UuIFRoZSByZXBvcnRpbmcgaW5nZXN0J3MgcGFydGlhbC11bmlxdWUgaW5kZXggZGVkdXBlcyBhbnlcbi8vICAgICAgcmVkZWxpdmVyZWQgZXZlbnQsIHNvIGEgcmVkcml2ZSBjYW4ndCBkb3VibGUtY291bnQuXG4vLyBHdWFyZHM6IG9ubHkgb24gc3VjY2Vzcywgb25lLWF0LWEtdGltZSAoTGlzdE1lc3NhZ2VNb3ZlVGFza3MpLCBhIHBvaXNvbi1hZ2UgY2VpbGluZ1xuLy8gKHNvIGEgbWVzc2FnZSB0aGF0IGFsd2F5cyBmYWlscyBjYW4ndCBsb29wIERMUeKGkm1haW7ihpJETFEgZm9yZXZlciksIGFuZCB0aHJvdHRsZWQgdmlhXG4vLyBtb2R1bGUgdGltZXN0YW1wcy4gTkVWRVIgdGhyb3dzIOKAlCBhIGZhaWx1cmUgaGVyZSBtdXN0IG5vdCBmYWlsIHRoZSBiYXRjaC5cbi8vXG4vLyBJQU0gcmVxdWlyZWQgKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIHNxczpHZXRRdWV1ZUF0dHJpYnV0ZXMsIHNxczpMaXN0TWVzc2FnZU1vdmVUYXNrcywgc3FzOlN0YXJ0TWVzc2FnZU1vdmVUYXNrIChvbiB0aGUgRExRKVxuXG5pbnRlcmZhY2UgU3FzQ2xpZW50TGlrZSB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfVxuaW50ZXJmYWNlIFNxc01vZHVsZSB7XG4gIFNRU0NsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gU3FzQ2xpZW50TGlrZTtcbiAgR2V0UXVldWVBdHRyaWJ1dGVzQ29tbWFuZDogbmV3IChpbnB1dDogeyBRdWV1ZVVybDogc3RyaW5nOyBBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10gfSkgPT4gdW5rbm93bjtcbiAgTGlzdE1lc3NhZ2VNb3ZlVGFza3NDb21tYW5kOiBuZXcgKGlucHV0OiB7IFNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG4gIFN0YXJ0TWVzc2FnZU1vdmVUYXNrQ29tbWFuZDogbmV3IChpbnB1dDogeyBTb3VyY2VBcm46IHN0cmluZzsgRGVzdGluYXRpb25Bcm4/OiBzdHJpbmcgfSkgPT4gdW5rbm93bjtcbn1cbmxldCBzcXNNb2Q6IFNxc01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBzcXNDbGllbnRzQnlSZWdpb246IE1hcDxzdHJpbmcsIFNxc0NsaWVudExpa2U+IHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gc3FzQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxTcXNDbGllbnRMaWtlPiB7XG4gIGlmICghc3FzTW9kKSBzcXNNb2QgPSBhd2FpdCBsb2FkU2RrPFNxc01vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1zcXMnKTtcbiAgaWYgKCFzcXNDbGllbnRzQnlSZWdpb24pIHNxc0NsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IHNxc0NsaWVudHNCeVJlZ2lvbi5nZXQocmVnaW9uKTtcbiAgaWYgKCFjbGllbnQpIHtcbiAgICBjbGllbnQgPSBuZXcgc3FzTW9kLlNRU0NsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBzcXNDbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vLyBEZWxpdmVyeS1oZWFsdGggY291bnRlcnMgYXJlIGF0dHJpYnV0ZWQgUEVSIFJFU09MVkVEIE9SRyAodGhlIGZvcndhcmRlciBpcyBhIGZsZWV0XG4vLyBMYW1iZGEgc2VydmluZyBtYW55IG9yZ3M7IGEgc2luZ2xlIGdsb2JhbCBjb3VudGVyIHdvdWxkIG1pcy1hdHRyaWJ1dGUgb25lIG9yZydzXG4vLyB0aHJvdWdocHV0IHRvIGFub3RoZXIpLiBLZXllZCBieSBvcmdJZCAoJycgYnVja2V0ID0gcGlwZWxpbmUgd2l0aCBubyBPcmdJZCB0YWcpLlxuLy8gVGhlIERMUSBkZXB0aCAoYGRyb3BwZWRgKSBpcyBnZW51aW5lbHkgZmxlZXQtZ2xvYmFsIOKAlCBvbmUgc2hhcmVkIERMUSDigJQgc28gaXQgaXMgYVxuLy8gc2luZ2xlIHNuYXBzaG90IHBvc3RlZCBhbG9uZ3NpZGUgZWFjaCBvcmcncyBoZWFsdGgsIGRvY3VtZW50ZWQgYXMgdGhlIHNoYXJlZCBkZXB0aC5cbmNvbnN0IGZvcndhcmRlZEJ5T3JnID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBudW1iZXI+KENBQ0hFX01BWF9FTlRSSUVTKTtcbmNvbnN0IGxhc3RFdmVudEF0QnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIHN0cmluZz4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xubGV0IGxhc3RIZWFsdGhBdCA9IDA7XG5sZXQgbGFzdFJlZHJpdmVBdCA9IDA7XG5jb25zdCBIRUFMVEhfVEhST1RUTEVfTVMgPSA2MCAqIDEwMDA7XG5jb25zdCBSRURSSVZFX1RIUk9UVExFX01TID0gNSAqIDYwICogMTAwMDtcbi8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IGlmIHRoZSBvbGRlc3QgRExRIG1lc3NhZ2UgaXMgb2xkZXIgdGhhbiB0aGlzLCB3ZSBTVE9QXG4vLyByZWRyaXZpbmcgaXQgKERMUeKGkm1haW7ihpJmYWls4oaSRExRIHdvdWxkIGxvb3AgZm9yZXZlcikuIFN1Y2ggbWVzc2FnZXMgYXJlIGxlZnQgZm9yIGFuXG4vLyBhbGFybSAvIG1hbnVhbCBpbnNwZWN0aW9uIGluc3RlYWQgb2YgY2h1cm5pbmcgdGhlIGZsZWV0IGluZGVmaW5pdGVseS5cbmNvbnN0IE1BWF9ETFFfUkVEUklWRV9BR0VfU0VDID0gNiAqIDYwICogNjA7IC8vIDYgaG91cnNcblxuLyoqIFBhcnNlIHRoZSBTUVMgdHJpZ2dlciBBUk4gYW5kIGRlcml2ZSB0aGUgbWFpbiArIERMUSBBUk5zIGFuZCB0aGUgRExRIFVSTC4gKi9cbmZ1bmN0aW9uIGRlcml2ZVF1ZXVlcyhtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcmVnaW9uOiBzdHJpbmc7IG1haW5Bcm46IHN0cmluZzsgZGxxQXJuOiBzdHJpbmc7IGRscVVybDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBpZiAoIW1haW5RdWV1ZUFybikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgLy8gYXJuOmF3czpzcXM6e3JlZ2lvbn06e2FjY291bnR9OntuYW1lfVxuICBjb25zdCBwYXJ0cyA9IG1haW5RdWV1ZUFybi5zcGxpdCgnOicpO1xuICBpZiAocGFydHMubGVuZ3RoIDwgNiB8fCBwYXJ0c1syXSAhPT0gJ3NxcycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IFssICwgLCByZWdpb24sIGFjY291bnQsIG5hbWVdID0gcGFydHM7XG4gIGNvbnN0IGRscUFybiA9IHByb2Nlc3MuZW52LkVWRU5UX0RMUV9BUk4gfHwgYGFybjphd3M6c3FzOiR7cmVnaW9ufToke2FjY291bnR9OiR7bmFtZX0tZGxxYDtcbiAgY29uc3QgZGxxTmFtZSA9IGRscUFybi5zcGxpdCgnOicpLnBvcCgpID8/IGAke25hbWV9LWRscWA7XG4gIGNvbnN0IGRscVVybCA9IGBodHRwczovL3Nxcy4ke3JlZ2lvbn0uYW1hem9uYXdzLmNvbS8ke2FjY291bnR9LyR7ZGxxTmFtZX1gO1xuICByZXR1cm4geyByZWdpb24sIG1haW5Bcm46IG1haW5RdWV1ZUFybiwgZGxxQXJuLCBkbHFVcmwgfTtcbn1cblxuLyoqIFNuYXBzaG90IHRoZSBETFEgZGVwdGggKyB0aGUgYWdlIChzZWNvbmRzKSBvZiBpdHMgb2xkZXN0IG1lc3NhZ2UgKGZvciB0aGVcbiAqICBwb2lzb24tbWVzc2FnZSByZWRyaXZlIGNlaWxpbmcpLiBNaXNzaW5nL05hTiBhdHRyaWJ1dGVzIGZhbGwgYmFjayB0byAwLiAqL1xuYXN5bmMgZnVuY3Rpb24gZGxxU3RhdHMocmVnaW9uOiBzdHJpbmcsIGRscVVybDogc3RyaW5nKTogUHJvbWlzZTx7IGRlcHRoOiBudW1iZXI7IG9sZGVzdEFnZVNlYzogbnVtYmVyIH0+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5HZXRRdWV1ZUF0dHJpYnV0ZXNDb21tYW5kKHtcbiAgICBRdWV1ZVVybDogZGxxVXJsLFxuICAgIEF0dHJpYnV0ZU5hbWVzOiBbJ0FwcHJveGltYXRlTnVtYmVyT2ZNZXNzYWdlcycsICdBcHByb3hpbWF0ZUFnZU9mT2xkZXN0TWVzc2FnZSddLFxuICB9KSkgYXMgeyBBdHRyaWJ1dGVzPzogeyBBcHByb3hpbWF0ZU51bWJlck9mTWVzc2FnZXM/OiBzdHJpbmc7IEFwcHJveGltYXRlQWdlT2ZPbGRlc3RNZXNzYWdlPzogc3RyaW5nIH0gfTtcbiAgY29uc3QgbiA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVOdW1iZXJPZk1lc3NhZ2VzID8/ICcwJyk7XG4gIGNvbnN0IGFnZSA9IE51bWJlcihvdXQuQXR0cmlidXRlcz8uQXBwcm94aW1hdGVBZ2VPZk9sZGVzdE1lc3NhZ2UgPz8gJzAnKTtcbiAgcmV0dXJuIHtcbiAgICBkZXB0aDogTnVtYmVyLmlzRmluaXRlKG4pID8gbiA6IDAsXG4gICAgb2xkZXN0QWdlU2VjOiBOdW1iZXIuaXNGaW5pdGUoYWdlKSA/IGFnZSA6IDAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhc0FjdGl2ZU1vdmVUYXNrKHJlZ2lvbjogc3RyaW5nLCBkbHFBcm46IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIXNxc01vZCkgc3FzTW9kID0gYXdhaXQgbG9hZFNkazxTcXNNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtc3FzJyk7XG4gIGNvbnN0IGNsaWVudCA9IGF3YWl0IHNxc0NsaWVudChyZWdpb24pO1xuICBjb25zdCBvdXQgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgc3FzTW9kLkxpc3RNZXNzYWdlTW92ZVRhc2tzQ29tbWFuZCh7IFNvdXJjZUFybjogZGxxQXJuIH0pKSBhcyB7XG4gICAgUmVzdWx0cz86IEFycmF5PHsgU3RhdHVzPzogc3RyaW5nIH0+O1xuICB9O1xuICByZXR1cm4gKG91dC5SZXN1bHRzID8/IFtdKS5zb21lKHQgPT4gdC5TdGF0dXMgPT09ICdSVU5OSU5HJyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0TW92ZVRhc2socmVnaW9uOiBzdHJpbmcsIGRscUFybjogc3RyaW5nLCBtYWluQXJuOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFzcXNNb2QpIHNxc01vZCA9IGF3YWl0IGxvYWRTZGs8U3FzTW9kdWxlPignQGF3cy1zZGsvY2xpZW50LXNxcycpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBzcXNDbGllbnQocmVnaW9uKTtcbiAgYXdhaXQgY2xpZW50LnNlbmQobmV3IHNxc01vZC5TdGFydE1lc3NhZ2VNb3ZlVGFza0NvbW1hbmQoeyBTb3VyY2VBcm46IGRscUFybiwgRGVzdGluYXRpb25Bcm46IG1haW5Bcm4gfSkpO1xufVxuXG4vKiogUE9TVCBvbmUgb3JnJ3MgaW5nZXN0LWhlYWx0aCBzaWduYWwuIFJldHVybnMgdHJ1ZSBvbmx5IG9uIGEgY29uZmlybWVkIDJ4eCBzbyB0aGVcbiAqICBjYWxsZXIgcmVzZXRzIHRoYXQgb3JnJ3MgYGZvcndhcmRlZGAgY291bnRlciBPTkxZIHdoZW4gdGhlIHNpZ25hbCB3YXMgYWNjZXB0ZWRcbiAqICAoYSBkcm9wcGVkL2ZhaWxlZCBQT1NUIG11c3Qgbm90IHNpbGVudGx5IHplcm8gdGhlIGFjY3VtdWxhdGVkIGNvdW50KS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RJbmdlc3RIZWFsdGgoYmFzZVVybDogc3RyaW5nLCBib2R5OiB7IG9yZ0lkPzogc3RyaW5nOyBmb3J3YXJkZWQ6IG51bWJlcjsgZHJvcHBlZDogbnVtYmVyOyBsYXN0RXZlbnRBdD86IHN0cmluZyB9KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgdG9rZW4gPSBhd2FpdCBnZXRBdXRoVG9rZW4oKTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2luZ2VzdC1oZWFsdGhgLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJywgJ0F1dGhvcml6YXRpb24nOiBgQmVhcmVyICR7dG9rZW59YCB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfSk7XG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGxvZy53YXJuKCdpbmdlc3QtaGVhbHRoIFBPU1QgcmV0dXJuZWQgbm9uLTJ4eCAoaWdub3JlZCknLCB7IHN0YXR1czogcmVzLnN0YXR1cywgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignaW5nZXN0LWhlYWx0aCBQT1NUIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSwgb3JnSWQ6IGJvZHkub3JnSWQgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3R0bGVkLCBiZXN0LWVmZm9ydCBwb3N0LXN1Y2Nlc3Mgd29yazogZW1pdCBwZXItb3JnIGluZ2VzdC1oZWFsdGggYW5kIHNlbGYtaGVhbFxuICogdGhlIERMUS4gTmV2ZXIgdGhyb3dzLiBgZm9yd2FyZGVkYC9gbGFzdEV2ZW50QXRgIGFjY3VtdWxhdGUgUEVSIE9SRyBhY3Jvc3MgYmF0Y2hlc1xuICogYmV0d2VlbiBoZWFsdGggcG9zdHM7IGBkcm9wcGVkYCBpcyB0aGUgc2hhcmVkIGZsZWV0IERMUSBkZXB0aCBzbmFwc2hvdC4gQSBwZXItb3JnXG4gKiBjb3VudGVyIGlzIHplcm9lZCBvbmx5IGFmdGVyIHRoYXQgb3JnJ3MgaGVhbHRoIFBPU1QgaXMgY29uZmlybWVkIDJ4eC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcG9ydEhlYWx0aEFuZFJlZHJpdmUoYmFzZVVybDogc3RyaW5nLCBtYWluUXVldWVBcm46IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBpZiAobm93IC0gbGFzdEhlYWx0aEF0IDwgSEVBTFRIX1RIUk9UVExFX01TKSByZXR1cm47XG4gIGxhc3RIZWFsdGhBdCA9IG5vdztcbiAgdHJ5IHtcbiAgICBjb25zdCBxID0gZGVyaXZlUXVldWVzKG1haW5RdWV1ZUFybik7XG4gICAgbGV0IGRlcHRoID0gMDtcbiAgICBsZXQgb2xkZXN0QWdlU2VjID0gMDtcbiAgICBpZiAocSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBkbHFTdGF0cyhxLnJlZ2lvbiwgcS5kbHFVcmwpO1xuICAgICAgICBkZXB0aCA9IHN0YXRzLmRlcHRoO1xuICAgICAgICBvbGRlc3RBZ2VTZWMgPSBzdGF0cy5vbGRlc3RBZ2VTZWM7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBzdGF0cyBjaGVjayBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUG9zdCBvbmUgaGVhbHRoIHNpZ25hbCBwZXIgcmVzb2x2ZWQgb3JnLCBhdHRyaWJ1dGluZyBpdHMgb3duIGZvcndhcmRlZCBjb3VudCArXG4gICAgLy8gbGFzdCBldmVudCB0aW1lLiBgZHJvcHBlZGAgKHRoZSBzaGFyZWQgZmxlZXQgRExRIGRlcHRoKSByaWRlcyBhbG9uZyBvbiBlYWNoLlxuICAgIC8vIFNuYXBzaG90IHRoZSBrZXlzIGZpcnN0IHNvIHdlIGRvbid0IG11dGF0ZSB0aGUgbWFwIHdoaWxlIGl0ZXJhdGluZy5cbiAgICBjb25zdCBvcmdLZXlzID0gbmV3IFNldChbLi4uZm9yd2FyZGVkQnlPcmcua2V5cygpLCAuLi5sYXN0RXZlbnRBdEJ5T3JnLmtleXMoKV0pO1xuICAgIGlmIChvcmdLZXlzLnNpemUgPT09IDApIG9yZ0tleXMuYWRkKCcnKTsgLy8gbm90aGluZyBmb3J3YXJkZWQgeWV0IOKGkiBzdGlsbCByZXBvcnQgZGVwdGhcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBvcmdLZXlzKSB7XG4gICAgICBjb25zdCBmb3J3YXJkZWQgPSBmb3J3YXJkZWRCeU9yZy5nZXQoa2V5KSA/PyAwO1xuICAgICAgY29uc3QgbGFzdEV2ZW50QXQgPSBsYXN0RXZlbnRBdEJ5T3JnLmdldChrZXkpO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCBwb3N0SW5nZXN0SGVhbHRoKGJhc2VVcmwsIHtcbiAgICAgICAgLi4uKGtleSA/IHsgb3JnSWQ6IGtleSB9IDoge30pLFxuICAgICAgICBmb3J3YXJkZWQsXG4gICAgICAgIGRyb3BwZWQ6IGRlcHRoLFxuICAgICAgICBsYXN0RXZlbnRBdCxcbiAgICAgIH0pO1xuICAgICAgLy8gUmVzZXQgdGhlIGZvcndhcmRlZCBjb3VudGVyIE9OTFkgb24gYSBjb25maXJtZWQgMnh4IOKAlCBhIGZhaWxlZC9kcm9wcGVkIFBPU1RcbiAgICAgIC8vIGtlZXBzIHRoZSBjb3VudCBzbyB0aGUgbmV4dCB0aWNrIHJlLXJlcG9ydHMgaXQgaW5zdGVhZCBvZiBsb3NpbmcgaXQuXG4gICAgICBpZiAob2spIGZvcndhcmRlZEJ5T3JnLnNldChrZXksIDApO1xuICAgIH1cblxuICAgIGlmIChxICYmIGRlcHRoID4gMCAmJiBub3cgLSBsYXN0UmVkcml2ZUF0ID49IFJFRFJJVkVfVEhST1RUTEVfTVMpIHtcbiAgICAgIC8vIFBvaXNvbi1tZXNzYWdlIGNlaWxpbmc6IG5ldmVyIHJlZHJpdmUgYSBETFEgd2hvc2Ugb2xkZXN0IG1lc3NhZ2UgaGFzIGFnZWRcbiAgICAgIC8vIHBhc3QgdGhlIGNlaWxpbmcg4oCUIHRoYXQgbWVzc2FnZSBrZWVwcyBmYWlsaW5nIGFuZCB3b3VsZCBsb29wIERMUeKGkm1haW7ihpJETFEuXG4gICAgICBpZiAob2xkZXN0QWdlU2VjID4gTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMpIHtcbiAgICAgICAgbG9nLndhcm4oJ0RMUSBvbGRlc3QgbWVzc2FnZSBleGNlZWRzIHBvaXNvbi1hZ2UgY2VpbGluZyDigJQgc2tpcHBpbmcgcmVkcml2ZSAobmVlZHMgbWFudWFsIGF0dGVudGlvbiknLCB7XG4gICAgICAgICAgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYywgY2VpbGluZ1NlYzogTUFYX0RMUV9SRURSSVZFX0FHRV9TRUMsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAoIShhd2FpdCBoYXNBY3RpdmVNb3ZlVGFzayhxLnJlZ2lvbiwgcS5kbHFBcm4pKSkge1xuICAgICAgICAgICAgbGFzdFJlZHJpdmVBdCA9IG5vdztcbiAgICAgICAgICAgIGF3YWl0IHN0YXJ0TW92ZVRhc2socS5yZWdpb24sIHEuZGxxQXJuLCBxLm1haW5Bcm4pO1xuICAgICAgICAgICAgbG9nLmluZm8oJ1N0YXJ0ZWQgc2VsZi1oZWFsaW5nIERMUeKGkm1haW4gcmVkcml2ZScsIHsgZGxxQXJuOiBxLmRscUFybiwgZHJvcHBlZDogZGVwdGgsIG9sZGVzdEFnZVNlYyB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGxvZy53YXJuKCdETFEgcmVkcml2ZSBmYWlsZWQgKGlnbm9yZWQpJywgeyBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdoZWFsdGgvcmVkcml2ZSBzdGVwIGZhaWxlZCAoaWdub3JlZCknLCB7IGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgfVxufVxuXG4vKiogQ291bnQgYSBmb3J3YXJkZWQgYmF0Y2ggdG93YXJkIGVhY2ggcmVzb2x2ZWQgb3JnJ3MgZGVsaXZlcnktaGVhbHRoIHJlcG9ydC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWNvcmRGb3J3YXJkZWQoZXZlbnRzOiBSZWFkb25seUFycmF5PHsgb3JnSWQ6IHN0cmluZyB8IG51bGw7IGNvbXBsZXRlZEF0Pzogc3RyaW5nOyBzdGFydGVkQXQ/OiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGNvbnN0IGtleSA9IGUub3JnSWQgPz8gJyc7XG4gICAgZm9yd2FyZGVkQnlPcmcuc2V0KGtleSwgKGZvcndhcmRlZEJ5T3JnLmdldChrZXkpID8/IDApICsgMSk7XG4gICAgY29uc3QgYXQgPSBlLmNvbXBsZXRlZEF0IHx8IGUuc3RhcnRlZEF0O1xuICAgIGlmIChhdCkge1xuICAgICAgY29uc3QgcHJldiA9IGxhc3RFdmVudEF0QnlPcmcuZ2V0KGtleSk7XG4gICAgICBpZiAoIXByZXYgfHwgYXQgPiBwcmV2KSBsYXN0RXZlbnRBdEJ5T3JnLnNldChrZXksIGF0KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEBpbnRlcm5hbCBUZXN0LW9ubHk6IGZvcmdldCBoZWFsdGggY291bnRlcnMgYW5kIHRocm90dGxlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRIZWFsdGhGb3JUZXN0cygpOiB2b2lkIHtcbiAgZm9yd2FyZGVkQnlPcmcuY2xlYXIoKTtcbiAgbGFzdEV2ZW50QXRCeU9yZy5jbGVhcigpO1xuICBsYXN0SGVhbHRoQXQgPSAwO1xuICBsYXN0UmVkcml2ZUF0ID0gMDtcbn1cbiJdfQ==
package/lib/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SQSEvent } from 'aws-lambda';
1
+ import type { SQSBatchResponse, SQSEvent } from 'aws-lambda';
2
2
  /**
3
3
  * Pipeline event ingestion Lambda handler.
4
4
  *
@@ -24,4 +24,4 @@ import type { SQSEvent } from 'aws-lambda';
24
24
  * self-healing redrive; defaults to `<main-queue-arn>-dlq` derived from the SQS
25
25
  * trigger's eventSourceARN.
26
26
  */
27
- export declare const handler: (event: SQSEvent) => Promise<void>;
27
+ export declare const handler: (event: SQSEvent) => Promise<SQSBatchResponse>;
package/lib/index.js CHANGED
@@ -81,6 +81,10 @@ var CACHE_MAX_ENTRIES = 5e3;
81
81
  async function loadSdk(pkg) {
82
82
  return await import(pkg);
83
83
  }
84
+ var FETCH_TIMEOUT_MS = Number(process.env.REPORTING_FETCH_TIMEOUT_MS ?? 5e3) || 5e3;
85
+ function fetchWithTimeout(url, init = {}, timeoutMs = FETCH_TIMEOUT_MS) {
86
+ return fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
87
+ }
84
88
 
85
89
  // src/auth.ts
86
90
  var TOKEN_REFRESH_FRACTION = 0.8;
@@ -97,19 +101,11 @@ async function getAuthToken() {
97
101
  const baseUrl = (process.env.PLATFORM_BASE_URL || "").replace(/\/+$/, "");
98
102
  if (!baseUrl) throw new Error("PLATFORM_BASE_URL environment variable is required");
99
103
  const key = await credential.getKey();
100
- const controller = new AbortController();
101
- const timer = setTimeout(() => controller.abort(), EXCHANGE_TIMEOUT_MS);
102
- let res;
103
- try {
104
- res = await fetch(`${baseUrl}/api/auth/token/exchange`, {
105
- method: "POST",
106
- headers: { "Content-Type": "application/json", "Accept": "application/json" },
107
- body: JSON.stringify({ key }),
108
- signal: controller.signal
109
- });
110
- } finally {
111
- clearTimeout(timer);
112
- }
104
+ const res = await fetchWithTimeout(`${baseUrl}/api/auth/token/exchange`, {
105
+ method: "POST",
106
+ headers: { "Content-Type": "application/json", "Accept": "application/json" },
107
+ body: JSON.stringify({ key })
108
+ }, EXCHANGE_TIMEOUT_MS);
113
109
  if (!res.ok) {
114
110
  if (res.status === 401 || res.status === 403) {
115
111
  throw new Error(
@@ -196,7 +192,7 @@ async function startMoveTask(region, dlqArn, mainArn) {
196
192
  async function postIngestHealth(baseUrl, body) {
197
193
  try {
198
194
  const token = await getAuthToken();
199
- const res = await fetch(`${baseUrl}/api/reports/ingest-health`, {
195
+ const res = await fetchWithTimeout(`${baseUrl}/api/reports/ingest-health`, {
200
196
  method: "POST",
201
197
  headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
202
198
  body: JSON.stringify(body)
@@ -287,6 +283,7 @@ function _resetHealthForTests() {
287
283
  import { GetSecretValueCommand as GetSecretValueCommand2, SecretsManagerClient as SecretsManagerClient2 } from "@aws-sdk/client-secrets-manager";
288
284
  var commitResultCache = new BoundedMap(CACHE_MAX_ENTRIES);
289
285
  var lastShaByPipeline = new BoundedMap(CACHE_MAX_ENTRIES);
286
+ var noRecordedDeploy = /* @__PURE__ */ new Set();
290
287
  var commitMetaCache = new BoundedMap(CACHE_MAX_ENTRIES);
291
288
  var scmCooldownUntil = 0;
292
289
  var SCM_COOLDOWN_MS = 2 * 60 * 1e3;
@@ -325,15 +322,6 @@ async function getGitHubToken(orgId) {
325
322
  githubTokenByOrg.set(key, token);
326
323
  return token;
327
324
  }
328
- async function fetchWithTimeout(url, opts) {
329
- const controller = new AbortController();
330
- const timer = setTimeout(() => controller.abort(), SCM_FETCH_TIMEOUT_MS);
331
- try {
332
- return await fetch(url, { ...opts, signal: controller.signal });
333
- } finally {
334
- clearTimeout(timer);
335
- }
336
- }
337
325
  function toIso(value) {
338
326
  if (typeof value !== "string" || value.length === 0) return void 0;
339
327
  const epoch = /^(\d{9,})\b/.exec(value.trim());
@@ -420,7 +408,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
420
408
  if (token) headers.Authorization = `Bearer ${token}`;
421
409
  const rateLimited = (r) => r.status === 403 || r.status === 429;
422
410
  if (sinceSha) {
423
- const r = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/compare/${sinceSha}...${sha}`, { headers });
411
+ const r = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/compare/${sinceSha}...${sha}`, { headers }, SCM_FETCH_TIMEOUT_MS);
424
412
  if (rateLimited(r)) {
425
413
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
426
414
  return {};
@@ -434,7 +422,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
434
422
  }
435
423
  }
436
424
  }
437
- const r2 = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/commits/${sha}`, { headers });
425
+ const r2 = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/commits/${sha}`, { headers }, SCM_FETCH_TIMEOUT_MS);
438
426
  if (rateLimited(r2)) {
439
427
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
440
428
  return {};
@@ -449,7 +437,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
449
437
  async function resolveBitbucket(owner, repo, sha) {
450
438
  const r = await fetchWithTimeout(`https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/commit/${sha}`, {
451
439
  headers: { "User-Agent": "pipeline-builder-forwarder", "Accept": "application/json" }
452
- });
440
+ }, SCM_FETCH_TIMEOUT_MS);
453
441
  if (r.status === 429) {
454
442
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
455
443
  return {};
@@ -466,7 +454,7 @@ async function resolveCommitInfo(pipelineId, orgId, region, src) {
466
454
  const rkey = `${pipelineId}|${src.sha}`;
467
455
  const cached = commitResultCache.get(rkey);
468
456
  if (cached) return cached;
469
- const prev = lastShaByPipeline.get(pipelineId);
457
+ const prev = lastShaByPipeline.get(pipelineId) ?? await fetchLastDeployedSha(pipelineId);
470
458
  const sinceSha = prev && prev !== src.sha ? prev : void 0;
471
459
  let info = {};
472
460
  try {
@@ -487,9 +475,37 @@ async function resolveCommitInfo(pipelineId, orgId, region, src) {
487
475
  }
488
476
  return info;
489
477
  }
478
+ async function fetchLastDeployedSha(pipelineId) {
479
+ const baseUrl = process.env.PLATFORM_BASE_URL;
480
+ if (!baseUrl || noRecordedDeploy.has(pipelineId)) return void 0;
481
+ try {
482
+ const res = await fetchWithTimeout(
483
+ `${baseUrl}/api/reports/events/last-deploy-commit?pipelineId=${encodeURIComponent(pipelineId)}`,
484
+ { headers: { Authorization: `Bearer ${await getAuthToken()}`, Accept: "application/json" } }
485
+ );
486
+ if (!res.ok) {
487
+ log.warn("Last-deploy-commit lookup failed; resolving a single commit", { status: res.status });
488
+ return void 0;
489
+ }
490
+ const body = await res.json();
491
+ const sha = body.data?.commitSha ?? void 0;
492
+ if (!sha) {
493
+ noRecordedDeploy.add(pipelineId);
494
+ return void 0;
495
+ }
496
+ lastShaByPipeline.set(pipelineId, sha);
497
+ return sha;
498
+ } catch (err) {
499
+ log.warn("Last-deploy-commit lookup errored; resolving a single commit", {
500
+ error: err?.name ?? String(err)
501
+ });
502
+ return void 0;
503
+ }
504
+ }
490
505
  function _resetScmForTests() {
491
506
  commitResultCache.clear();
492
507
  lastShaByPipeline.clear();
508
+ noRecordedDeploy.clear();
493
509
  commitMetaCache.clear();
494
510
  scmCooldownUntil = 0;
495
511
  githubTokenByOrg.clear();
@@ -624,15 +640,16 @@ async function parseRecord(record) {
624
640
  const arn = `arn:aws:codepipeline:${event.region}:${event.account}:${pipelineName}`;
625
641
  const { pipelineId, orgId, deploys } = await resolvePipeline(arn, event.region);
626
642
  if (!pipelineId) return null;
627
- const startedAt = detail["start-time"] || event.time;
643
+ const declaredStart = detail["start-time"];
644
+ const startedAt = declaredStart || event.time;
628
645
  const state = detail.state;
629
646
  let durationMs;
630
647
  let completedAt;
631
648
  if (["SUCCEEDED", "FAILED", "CANCELED", "STOPPED"].includes(state)) {
632
649
  completedAt = event.time;
633
- if (startedAt && completedAt) {
634
- const ms = new Date(completedAt).getTime() - new Date(startedAt).getTime();
635
- if (ms >= 0) durationMs = ms;
650
+ if (declaredStart) {
651
+ const ms = new Date(completedAt).getTime() - new Date(declaredStart).getTime();
652
+ if (Number.isFinite(ms) && ms >= 0) durationMs = ms;
636
653
  }
637
654
  }
638
655
  const result = detail["execution-result"];
@@ -677,13 +694,26 @@ async function parseRecord(record) {
677
694
  var handler = async (event) => {
678
695
  const baseUrl = process.env.PLATFORM_BASE_URL;
679
696
  if (!baseUrl) throw new Error("PLATFORM_BASE_URL environment variable is required");
680
- const events = (await Promise.all(event.Records.map(parseRecord))).filter((e) => e !== null);
697
+ const settled = await Promise.all(event.Records.map(async (record) => {
698
+ try {
699
+ return { record, parsed: await parseRecord(record) };
700
+ } catch (err) {
701
+ log.warn("Record resolution failed; reporting it as a batch item failure", {
702
+ messageId: record.messageId,
703
+ error: err instanceof Error ? err.message : String(err)
704
+ });
705
+ return { record, failed: true };
706
+ }
707
+ }));
708
+ const failures = settled.filter((r) => "failed" in r).map((r) => r.record);
709
+ const resolved = settled.filter((r) => !("failed" in r));
710
+ const events = resolved.map((r) => r.parsed).filter((e) => e !== null);
681
711
  if (events.length === 0) {
682
- log.info("No resolvable CodePipeline events in batch");
683
- return;
712
+ log.info("No resolvable CodePipeline events in batch", { itemFailures: failures.length });
713
+ return batchResponse(failures);
684
714
  }
685
715
  const payloadEvents = events.map(({ orgId: _orgId, ...rest }) => rest);
686
- const post = (token) => fetch(`${baseUrl}/api/reports/events`, {
716
+ const post = (token) => fetchWithTimeout(`${baseUrl}/api/reports/events`, {
687
717
  method: "POST",
688
718
  headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}` },
689
719
  body: JSON.stringify({ events: payloadEvents })
@@ -697,13 +727,23 @@ var handler = async (event) => {
697
727
  if (!res.ok) {
698
728
  const body = await res.text().catch(() => "");
699
729
  log.error(`Reporting API returned ${res.status}`, { body });
700
- throw new Error(`Reporting API failed: ${res.status}`);
730
+ return batchResponse([
731
+ ...failures,
732
+ ...resolved.filter((r) => r.parsed !== null).map((r) => r.record)
733
+ ]);
701
734
  }
702
735
  const result = await res.json().catch(() => ({}));
703
736
  log.info(`Ingested ${events.length} events`, { inserted: result.data });
704
737
  recordForwarded(events);
705
738
  await reportHealthAndRedrive(baseUrl, event.Records[0]?.eventSourceARN);
739
+ return batchResponse(failures);
706
740
  };
741
+ function batchResponse(failed) {
742
+ if (failed.length > 0) {
743
+ log.warn("Returning batch item failures for redelivery", { count: failed.length });
744
+ }
745
+ return { batchItemFailures: failed.map((r) => ({ itemIdentifier: r.messageId })) };
746
+ }
707
747
  function _resetForTests() {
708
748
  _resetTagsForTests();
709
749
  _resetScmForTests();
package/lib/parse.js CHANGED
@@ -84,15 +84,24 @@ export async function parseRecord(record) {
84
84
  const { pipelineId, orgId, deploys } = await resolvePipeline(arn, event.region);
85
85
  if (!pipelineId)
86
86
  return null; // untagged / unregistered → skip
87
- const startedAt = detail['start-time'] || event.time;
87
+ // AWS does not always send `start-time`. `event.time` stands in for it so the
88
+ // row still lands in the report windows, which filter on `started_at` — but it
89
+ // is NOT a measurement, and the duration below must not be computed from it.
90
+ const declaredStart = detail['start-time'];
91
+ const startedAt = declaredStart || event.time;
88
92
  const state = detail.state;
89
93
  let durationMs;
90
94
  let completedAt;
91
95
  if (['SUCCEEDED', 'FAILED', 'CANCELED', 'STOPPED'].includes(state)) {
92
96
  completedAt = event.time;
93
- if (startedAt && completedAt) {
94
- const ms = new Date(completedAt).getTime() - new Date(startedAt).getTime();
95
- if (ms >= 0)
97
+ // ONLY from a start AWS actually declared. With the fallback, `startedAt` and
98
+ // `completedAt` are both `event.time` on a terminal event, so the duration came
99
+ // out as exactly 0 — reported as a real measurement, dragging every average and
100
+ // p95 stage duration toward zero with no sign anything was missing. Unknown is
101
+ // left unknown (NULL), which the reports already handle.
102
+ if (declaredStart) {
103
+ const ms = new Date(completedAt).getTime() - new Date(declaredStart).getTime();
104
+ if (Number.isFinite(ms) && ms >= 0)
96
105
  durationMs = ms;
97
106
  }
98
107
  }
@@ -147,4 +156,4 @@ export async function parseRecord(record) {
147
156
  detail,
148
157
  };
149
158
  }
150
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ2hDLGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFlO0lBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBK0I7SUFDcEQscUZBQXFGO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FDcEIsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRCx5RUFBeUU7SUFDekUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUF3QyxDQUFDO0lBRXJGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FDekIs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QyxNQUFNLElBQUksR0FBRyxNQUFNLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2xHLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ3ZDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxPQUFPO1FBQ0wsS0FBSztRQUNMLFVBQVU7UUFDVixXQUFXO1FBQ1gsU0FBUztRQUNULE1BQU0sRUFBRSxLQUFLO1FBQ2IsV0FBVztRQUNYLFNBQVM7UUFDVCxVQUFVO1FBQ1YsWUFBWTtRQUNaLFNBQVM7UUFDVCxXQUFXO1FBQ1gsVUFBVTtRQUNWLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7UUFDL0IsR0FBRyxDQUFDLGVBQWUsSUFBSSxFQUFFLGVBQWUsRUFBRSxDQUFDO1FBQzNDLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDbkMsTUFBTTtLQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB0eXBlIHsgU1FTUmVjb3JkIH0gZnJvbSAnYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBjbGFzc2lmeVNvdXJjZSwgcmVzb2x2ZUNvbW1pdEluZm8gfSBmcm9tICcuL3NjbS5qcyc7XG5pbXBvcnQgeyBNQVhfQVRUUiwgcmVzb2x2ZVBpcGVsaW5lIH0gZnJvbSAnLi90YWdzLmpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIEV2ZW50IHBhcnNpbmc6IGFuIFNRUyByZWNvcmQg4oaSIHRoZSBub3JtYWxpemVkIHJlcG9ydGluZyBldmVudC5cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZWRFdmVudCB7XG4gIC8qKlxuICAgKiBSZXNvbHZlZCBwbGF0Zm9ybSBvcmdJZCAoZnJvbSB0aGUgcGlwZWxpbmUncyBPcmdJZCB0YWc7IG51bGwgd2hlbiB1bnRhZ2dlZCkuXG4gICAqIElOVEVSTkFMIOKAlCB1c2VkIG9ubHkgdG8ga2V5IHRoZSBwZXItb3JnIEdpdEh1YiB0b2tlbiBhbmQgdG8gYXR0cmlidXRlXG4gICAqIGluZ2VzdC1oZWFsdGguIFN0cmlwcGVkIGZyb20gdGhlIHBheWxvYWQgUE9TVGVkIHRvIC9yZXBvcnRzL2V2ZW50cyAod2hpY2hcbiAgICogcmVzb2x2ZXMgb3JnIGZyb20gdGhlIHBpcGVsaW5lIHJlZ2lzdHJ5LCBub3QgdGhlIGJvZHkpLlxuICAgKi9cbiAgb3JnSWQ6IHN0cmluZyB8IG51bGw7XG4gIHBpcGVsaW5lSWQ6IHN0cmluZztcbiAgZXZlbnRTb3VyY2U6IHN0cmluZztcbiAgZXZlbnRUeXBlOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBleGVjdXRpb25JZD86IHN0cmluZztcbiAgc3RhZ2VOYW1lPzogc3RyaW5nO1xuICBhY3Rpb25OYW1lPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZmFpbHVyZSByZWFzb24sIGZyb20gYW4gQWN0aW9uIGV2ZW50J3NcbiAgICogIGBleGVjdXRpb24tcmVzdWx0LmV4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5YC4gVGhlIGxvZyBVUkwgKyBlcnJvci1jb2RlXG4gICAqICBzdGF5IGluIGBkZXRhaWxgIGZvciBkcmlsbC1kb3duLiAqL1xuICBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XG4gIHN0YXJ0ZWRBdD86IHN0cmluZztcbiAgY29tcGxldGVkQXQ/OiBzdHJpbmc7XG4gIGR1cmF0aW9uTXM/OiBudW1iZXI7XG4gIC8qKiBTb3VyY2UgY29tbWl0IGlkIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuIFVuZGVmaW5lZCB3aGVuIHRoZSBldmVudFxuICAgKiAgY2FycmllcyBubyBzb3VyY2UgcmV2aXNpb24g4oCUIHN0b3JlZCBOVUxMIGRvd25zdHJlYW0uICovXG4gIGNvbW1pdFNoYT86IHN0cmluZztcbiAgLyoqIFNvdXJjZSBicmFuY2gvcmVmIChET1JBIGRlcGxveSBhdHRyaWJ1dGlvbikuIFVuZGVmaW5lZCB3aGVuIHVuYXZhaWxhYmxlLiAqL1xuICBjb21taXRSZWY/OiBzdHJpbmc7XG4gIC8qKiBPbGRlc3QtdW5zaGlwcGVkIGNvbW1pdCB0aW1lc3RhbXAgKElTTyA4NjAxKSBmb3IgdGhlIHJhbmdlIHNpbmNlIHRoZSBsYXN0XG4gICAqICBkZXBsb3kg4oCUIHJlc29sdmVkIGluLWFjY291bnQuIFVuZGVmaW5lZCB3aGVuIHVucmVzb2x2YWJsZS4gKi9cbiAgY29tbWl0VGltZXN0YW1wPzogc3RyaW5nO1xuICAvKiogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIHJlc29sdmVkIHJhbmdlICjiiaUxKS4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRDb3VudD86IG51bWJlcjtcbiAgLyoqIERlcGxveSBlbnZpcm9ubWVudCDigJQgc2V0IG9ubHkgd2hlbiB0aGUgZXZlbnQncyBzdGFnZSBpcyBsaXN0ZWQgaW4gdGhlXG4gICAqICBwaXBlbGluZSdzIGBwYi5kZXBsb3lzYCB0YWcuIFVuZGVmaW5lZCBvdGhlcndpc2UgKOKHkiBub3QgYSBkZXBsb3kpLiAqL1xuICBlbnZpcm9ubWVudD86IHN0cmluZztcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbi8qKiBGaXJzdCBub24tZW1wdHkgc3RyaW5nIGFtb25nIHRoZSBjYW5kaWRhdGVzLCBjYXBwZWQgdG8gdGhlIGluZ2VzdCBtYXguICovXG5mdW5jdGlvbiBmaXJzdEF0dHIoLi4udmFsczogdW5rbm93bltdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCB2IG9mIHZhbHMpIHtcbiAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYubGVuZ3RoID4gMCkgcmV0dXJuIHYuc2xpY2UoMCwgTUFYX0FUVFIpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQmVzdC1lZmZvcnQgZXh0cmFjdGlvbiBvZiB0aGUgc291cmNlIGNvbW1pdCBpZCArIHJlZiAoYW5kIHRoZSByZXZpc2lvbiBVUkwsIHVzZWRcbiAqIG9ubHkgaW4tYWNjb3VudCB0byBjbGFzc2lmeSB0aGUgc291cmNlIHR5cGUgZm9yIGNvbW1pdC1yYW5nZSByZXNvbHV0aW9uKSBmcm9tIGFcbiAqIENvZGVQaXBlbGluZSBldmVudCBkZXRhaWwuIENvZGVQaXBlbGluZSBzdXJmYWNlcyB0aGUgc291cmNlIHJldmlzaW9uIHVuZGVyIGEgZmV3XG4gKiBzaGFwZXMgZGVwZW5kaW5nIG9uIHRoZSBldmVudCB0eXBlIC8gc291cmNlLWFjdGlvbjsgd2UgY2hlY2sgdGhlIGtub3duIG9uZXMgYW5kXG4gKiBsZWF2ZSB0aGUgZmllbGRzIHVuZGVmaW5lZCB3aGVuIG5vbmUgYXJlIHByZXNlbnQgKE5VTEwgZG93bnN0cmVhbSkuIE5ldmVyIHB1bGxzIGFuXG4gKiBBUk4vYWNjb3VudCBpZDogb25seSByZXZpc2lvbi9icmFuY2gvdXJsIHN0cmluZyBmaWVsZHMgYXJlIHJlYWQ7IHRoZSByZXZpc2lvblVybFxuICogaXMgY29uc3VtZWQgaW4tYWNjb3VudCAoc291cmNlIGNsYXNzaWZpY2F0aW9uKSBhbmQgbmV2ZXIgZm9yd2FyZGVkIG9uIGl0cyBvd24uXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RDb21taXQoZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHsgY29tbWl0U2hhPzogc3RyaW5nOyBjb21taXRSZWY/OiBzdHJpbmc7IHJldmlzaW9uVXJsPzogc3RyaW5nIH0ge1xuICAvLyBgc291cmNlLXJldmlzaW9uc2AgKGtlYmFiLCBFdmVudEJyaWRnZSkgLyBgc291cmNlUmV2aXNpb25zYCAoY2FtZWwpIOKAlCBmaXJzdCBlbnRyeS5cbiAgY29uc3QgcmV2cyA9IChkZXRhaWxbJ3NvdXJjZS1yZXZpc2lvbnMnXSA/PyBkZXRhaWwuc291cmNlUmV2aXNpb25zKSBhc1xuICAgIHwgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBmaXJzdFJldiA9IEFycmF5LmlzQXJyYXkocmV2cykgPyByZXZzWzBdIDogdW5kZWZpbmVkO1xuICAvLyBPbiBzb3VyY2UgYWN0aW9ucyB0aGUgcmV2aXNpb24gaWQgY2FuIGFsc28gcmlkZSBvbiBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IGV4ZWNSZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcblxuICBjb25zdCBjb21taXRTaGEgPSBmaXJzdEF0dHIoXG4gICAgZGV0YWlsLmNvbW1pdElkLFxuICAgIGRldGFpbC5yZXZpc2lvbklkLFxuICAgIGZpcnN0UmV2Py5yZXZpc2lvbklkLFxuICAgIGV4ZWNSZXN1bHQ/LnJldmlzaW9uSWQsXG4gICk7XG4gIGNvbnN0IGNvbW1pdFJlZiA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0UmVmLFxuICAgIGRldGFpbC5icmFuY2gsXG4gICAgZGV0YWlsLnNvdXJjZUJyYW5jaCxcbiAgICBmaXJzdFJldj8uYnJhbmNoTmFtZSxcbiAgICBmaXJzdFJldj8uYnJhbmNoLFxuICApO1xuICBjb25zdCByZXZpc2lvblVybCA9IHR5cGVvZiBmaXJzdFJldj8ucmV2aXNpb25VcmwgPT09ICdzdHJpbmcnID8gZmlyc3RSZXYucmV2aXNpb25VcmwgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHsgLi4uKGNvbW1pdFNoYSAmJiB7IGNvbW1pdFNoYSB9KSwgLi4uKGNvbW1pdFJlZiAmJiB7IGNvbW1pdFJlZiB9KSwgLi4uKHJldmlzaW9uVXJsICYmIHsgcmV2aXNpb25VcmwgfSkgfTtcbn1cblxuZnVuY3Rpb24gY2xhc3NpZnlFdmVudChkZXRhaWxUeXBlOiBzdHJpbmcpOiB7IGV2ZW50VHlwZTogc3RyaW5nOyBldmVudFNvdXJjZTogc3RyaW5nIH0ge1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnUGlwZWxpbmUgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdTdGFnZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnU1RBR0UnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0FjdGlvbiBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQUNUSU9OJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIC8vIENvZGVCdWlsZCBcIkJ1aWxkIFN0YXRlXCIgZXZlbnRzIGlkZW50aWZ5IGEgYnVpbGQgKnByb2plY3QqLCBub3QgYSBwaXBlbGluZSwgc29cbiAgLy8gcGFyc2VSZWNvcmQgZHJvcHMgdGhlbSBvbiB0aGUgYGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJ2AgY2hlY2sgYmVsb3cg4oCUXG4gIC8vIHRoZSAnQlVJTEQnIGV2ZW50VHlwZSBpcyBuZXZlciBwZXJzaXN0ZWQgaGVyZSAocGx1Z2luIEJVSUxEIGV2ZW50cyBhcmVcbiAgLy8gcmVjb3JkZWQgZGlyZWN0bHkgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlKS4gVGhlICdjb2RlYnVpbGQnIHNvdXJjZSBpcyB3aGF0XG4gIC8vIHJvdXRlcyB0aGUgZHJvcDsga2VlcCB0aGlzIGJyYW5jaCBvbmx5IGZvciB0aGF0LlxuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlUmVjb3JkKHJlY29yZDogU1FTUmVjb3JkKTogUHJvbWlzZTxQYXJzZWRFdmVudCB8IG51bGw+IHtcbiAgbGV0IGV2ZW50OiB7XG4gICAgJ2RldGFpbC10eXBlJzogc3RyaW5nO1xuICAgICdzb3VyY2UnOiBzdHJpbmc7XG4gICAgJ2RldGFpbCc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICd0aW1lJzogc3RyaW5nO1xuICAgICdyZWdpb24nOiBzdHJpbmc7XG4gICAgJ2FjY291bnQnOiBzdHJpbmc7XG4gIH07XG4gIC8vIEEgbWFsZm9ybWVkIGJvZHkgaXMgYSBkZWFkIG1lc3NhZ2UgKHJldHJ5aW5nIHdvbid0IGhlbHApIOKAlCBsb2cgKyBza2lwIGl0IHNvXG4gIC8vIGl0IGNhbid0IGZhaWwgdGhlIHdob2xlIGJhdGNoLiBSZXNvbHV0aW9uIGVycm9ycyBiZWxvdyAoZS5nLiBBY2Nlc3NEZW5pZWQpXG4gIC8vIGFyZSBOT1QgY2F1Z2h0IGhlcmU6IHRob3NlIGFyZSB0cmFuc2llbnQvaW5mcmEgYW5kIG11c3QgcHJvcGFnYXRlIHRvIHJldHJ5LlxuICB0cnkge1xuICAgIGV2ZW50ID0gSlNPTi5wYXJzZShyZWNvcmQuYm9keSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBTUVMgcmVjb3JkIHdpdGggdW5wYXJzZWFibGUgYm9keScsIHsgbWVzc2FnZUlkOiByZWNvcmQubWVzc2FnZUlkLCBlcnJvcjogU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIHBpcGVsaW5lIGlkLCBzbyBza2lwIHRoZW0uXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIHBiLnBpcGVsaW5lLWlkICg9IHBsYXRmb3JtIHBpcGVsaW5lSWQpICsgcGIuZGVwbG95cyBtYXAuXG4gIC8vIFRoZSBBUk4gaXMgb25seSBhIHRyYW5zaWVudCBoYW5kbGUgZm9yIHRoZSB0YWcgbG9va3VwOyBpdCBpcyBuZXZlciBzdG9yZWQuXG4gIGNvbnN0IGFybiA9IGBhcm46YXdzOmNvZGVwaXBlbGluZToke2V2ZW50LnJlZ2lvbn06JHtldmVudC5hY2NvdW50fToke3BpcGVsaW5lTmFtZX1gO1xuICBjb25zdCB7IHBpcGVsaW5lSWQsIG9yZ0lkLCBkZXBsb3lzIH0gPSBhd2FpdCByZXNvbHZlUGlwZWxpbmUoYXJuLCBldmVudC5yZWdpb24pO1xuICBpZiAoIXBpcGVsaW5lSWQpIHJldHVybiBudWxsOyAvLyB1bnRhZ2dlZCAvIHVucmVnaXN0ZXJlZCDihpIgc2tpcFxuXG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IChkZXRhaWxbJ3N0YXJ0LXRpbWUnXSBhcyBzdHJpbmcpIHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgaWYgKHN0YXJ0ZWRBdCAmJiBjb21wbGV0ZWRBdCkge1xuICAgICAgY29uc3QgbXMgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoc3RhcnRlZEF0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAobXMgPj0gMCkgZHVyYXRpb25NcyA9IG1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21vdGUgdGhlIGZhaWx1cmUgcmVhc29uIHRvIGEgdHlwZWQgZmllbGQuIE9uIEFjdGlvbiBldmVudHMgQVdTIHB1dHMgdGhlXG4gIC8vIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgKGFuZCBhIGxvZyBVUkwgKyBlcnJvci1jb2RlLCB3aGljaCBzdGF5IGluIGBkZXRhaWxgKVxuICAvLyB1bmRlciBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IHJlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIHsgJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5Jz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VtbWFyeSA9IHJlc3VsdD8uWydleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSddO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0eXBlb2Ygc3VtbWFyeSA9PT0gJ3N0cmluZycgJiYgc3VtbWFyeS5sZW5ndGggPiAwXG4gICAgPyBzdW1tYXJ5LnNsaWNlKDAsIE1BWF9FUlJPUl9NRVNTQUdFKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIERPUkEgZGVwbG95IGF0dHJpYnV0aW9uIOKAlCBhbGwgb3B0aW9uYWw6IG9taXR0ZWQgKHVuZGVmaW5lZCkgd2hlbiB0aGVcbiAgLy8gZXZlbnQvcGlwZWxpbmUgZG9lc24ndCBjYXJyeSB0aGVtLlxuICBjb25zdCB7IGNvbW1pdFNoYSwgY29tbWl0UmVmLCByZXZpc2lvblVybCB9ID0gZXh0cmFjdENvbW1pdChkZXRhaWwpO1xuXG4gIGNvbnN0IGV4ZWN1dGlvbklkID0gZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0YWdlTmFtZSA9IGRldGFpbC5zdGFnZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGFjdGlvbk5hbWUgPSBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBFbnZpcm9ubWVudCAo4oeSIGlzRGVwbG95KSBpcyBzZXQgT05MWSB3aGVuIHRoaXMgZXZlbnQncyBzdGFnZSBpcyBsaXN0ZWQgaW4gdGhlXG4gIC8vIHBpcGVsaW5lJ3MgcGIuZGVwbG95cyB0YWcuIFBJUEVMSU5FIGV2ZW50cyBoYXZlIG5vIHN0YWdlIOKGkiBuZXZlciBhIGRlcGxveS5cbiAgY29uc3QgZW52aXJvbm1lbnQgPSBzdGFnZU5hbWUgPyBkZXBsb3lzLmdldChzdGFnZU5hbWUpIDogdW5kZWZpbmVkO1xuXG4gIC8vIFJlc29sdmUgdGhlIGNvbW1pdCByYW5nZSAob2xkZXN0LXVuc2hpcHBlZCB0aW1lc3RhbXAgKyBjb3VudCkgZm9yIGFueVxuICAvLyBldmVudCBjYXJyeWluZyBhIGNvbW1pdC4gQmVzdC1lZmZvcnQvaW4tYWNjb3VudDsgb21pdHRlZCBvbiBhbnkgZmFpbHVyZS5cbiAgLy8gR0FURUQgb24gYERPUkFfRU5BQkxFRGAgKHNldCBieSBgc2V0dXAtZXZlbnRzIC0td2l0aC1kb3JhYCk6IERPUkEgbGVhZCB0aW1lIGlzIGFuXG4gIC8vIGFkdmFuY2VkX3JlcG9ydGluZyBhZGQtb24sIHNvIG9yZ3Mgd2l0aG91dCBpdCBza2lwIHRoZSBTQ00vc2VjcmV0IGNvc3QgZW50aXJlbHkg4oCUXG4gIC8vIHN0YW5kYXJkIHJlcG9ydGluZyAoY29tbWl0U2hhICsgYWxsIG90aGVyIGZpZWxkcykgc3RpbGwgZm9yd2FyZHMgcmVnYXJkbGVzcy5cbiAgbGV0IGNvbW1pdFRpbWVzdGFtcDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tbWl0Q291bnQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgaWYgKGNvbW1pdFNoYSAmJiBwcm9jZXNzLmVudi5ET1JBX0VOQUJMRUQgPT09ICd0cnVlJykge1xuICAgIGNvbnN0IHNyYyA9IGNsYXNzaWZ5U291cmNlKHJldmlzaW9uVXJsKTtcbiAgICBjb25zdCBpbmZvID0gYXdhaXQgcmVzb2x2ZUNvbW1pdEluZm8ocGlwZWxpbmVJZCwgb3JnSWQsIGV2ZW50LnJlZ2lvbiwgeyBzaGE6IGNvbW1pdFNoYSwgLi4uc3JjIH0pO1xuICAgIGNvbW1pdFRpbWVzdGFtcCA9IGluZm8uY29tbWl0VGltZXN0YW1wO1xuICAgIGNvbW1pdENvdW50ID0gaW5mby5jb21taXRDb3VudDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgb3JnSWQsXG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZCxcbiAgICBzdGFnZU5hbWUsXG4gICAgYWN0aW9uTmFtZSxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgLi4uKGNvbW1pdFNoYSAmJiB7IGNvbW1pdFNoYSB9KSxcbiAgICAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLFxuICAgIC4uLihjb21taXRUaW1lc3RhbXAgJiYgeyBjb21taXRUaW1lc3RhbXAgfSksXG4gICAgLi4uKGNvbW1pdENvdW50ICYmIHsgY29tbWl0Q291bnQgfSksXG4gICAgLi4uKGVudmlyb25tZW50ICYmIHsgZW52aXJvbm1lbnQgfSksXG4gICAgZGV0YWlsLFxuICB9O1xufVxuIl19
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUd0QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdELE9BQU8sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxXQUFXLENBQUM7QUEwQ2hDLGtGQUFrRjtBQUNsRixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUUvQiw2RUFBNkU7QUFDN0UsU0FBUyxTQUFTLENBQUMsR0FBRyxJQUFlO0lBQ25DLEtBQUssTUFBTSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLElBQUksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxhQUFhLENBQUMsTUFBK0I7SUFDcEQscUZBQXFGO0lBQ3JGLE1BQU0sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGtCQUFrQixDQUFDLElBQUksTUFBTSxDQUFDLGVBQWUsQ0FDcEIsQ0FBQztJQUMvQyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUMzRCx5RUFBeUU7SUFDekUsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUF3QyxDQUFDO0lBRXJGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FDekIs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O0lBQy9FLElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLFdBQStCLENBQUM7SUFDcEMsSUFBSSxTQUFTLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDckQsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLE1BQU0saUJBQWlCLENBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDbEcsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDdkMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLO1FBQ0wsVUFBVTtRQUNWLFdBQVc7UUFDWCxTQUFTO1FBQ1QsTUFBTSxFQUFFLEtBQUs7UUFDYixXQUFXO1FBQ1gsU0FBUztRQUNULFVBQVU7UUFDVixZQUFZO1FBQ1osU0FBUztRQUNULFdBQVc7UUFDWCxVQUFVO1FBQ1YsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsZUFBZSxJQUFJLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDM0MsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQ25DLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNuQyxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHR5cGUgeyBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcbmltcG9ydCB7IGNsYXNzaWZ5U291cmNlLCByZXNvbHZlQ29tbWl0SW5mbyB9IGZyb20gJy4vc2NtLmpzJztcbmltcG9ydCB7IE1BWF9BVFRSLCByZXNvbHZlUGlwZWxpbmUgfSBmcm9tICcuL3RhZ3MuanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gRXZlbnQgcGFyc2luZzogYW4gU1FTIHJlY29yZCDihpIgdGhlIG5vcm1hbGl6ZWQgcmVwb3J0aW5nIGV2ZW50LlxuXG5leHBvcnQgaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgLyoqXG4gICAqIFJlc29sdmVkIHBsYXRmb3JtIG9yZ0lkIChmcm9tIHRoZSBwaXBlbGluZSdzIE9yZ0lkIHRhZzsgbnVsbCB3aGVuIHVudGFnZ2VkKS5cbiAgICogSU5URVJOQUwg4oCUIHVzZWQgb25seSB0byBrZXkgdGhlIHBlci1vcmcgR2l0SHViIHRva2VuIGFuZCB0byBhdHRyaWJ1dGVcbiAgICogaW5nZXN0LWhlYWx0aC4gU3RyaXBwZWQgZnJvbSB0aGUgcGF5bG9hZCBQT1NUZWQgdG8gL3JlcG9ydHMvZXZlbnRzICh3aGljaFxuICAgKiByZXNvbHZlcyBvcmcgZnJvbSB0aGUgcGlwZWxpbmUgcmVnaXN0cnksIG5vdCB0aGUgYm9keSkuXG4gICAqL1xuICBvcmdJZDogc3RyaW5nIHwgbnVsbDtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgLyoqIFNvdXJjZSBjb21taXQgaWQgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdGhlIGV2ZW50XG4gICAqICBjYXJyaWVzIG5vIHNvdXJjZSByZXZpc2lvbiDigJQgc3RvcmVkIE5VTEwgZG93bnN0cmVhbS4gKi9cbiAgY29tbWl0U2hhPzogc3RyaW5nO1xuICAvKiogU291cmNlIGJyYW5jaC9yZWYgKERPUkEgZGVwbG95IGF0dHJpYnV0aW9uKS4gVW5kZWZpbmVkIHdoZW4gdW5hdmFpbGFibGUuICovXG4gIGNvbW1pdFJlZj86IHN0cmluZztcbiAgLyoqIE9sZGVzdC11bnNoaXBwZWQgY29tbWl0IHRpbWVzdGFtcCAoSVNPIDg2MDEpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3RcbiAgICogIGRlcGxveSDigJQgcmVzb2x2ZWQgaW4tYWNjb3VudC4gVW5kZWZpbmVkIHdoZW4gdW5yZXNvbHZhYmxlLiAqL1xuICBjb21taXRUaW1lc3RhbXA/OiBzdHJpbmc7XG4gIC8qKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcmVzb2x2ZWQgcmFuZ2UgKOKJpTEpLiBVbmRlZmluZWQgd2hlbiB1bnJlc29sdmFibGUuICovXG4gIGNvbW1pdENvdW50PzogbnVtYmVyO1xuICAvKiogRGVwbG95IGVudmlyb25tZW50IOKAlCBzZXQgb25seSB3aGVuIHRoZSBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgICogIHBpcGVsaW5lJ3MgYHBiLmRlcGxveXNgIHRhZy4gVW5kZWZpbmVkIG90aGVyd2lzZSAo4oeSIG5vdCBhIGRlcGxveSkuICovXG4gIGVudmlyb25tZW50Pzogc3RyaW5nO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuLyoqIEZpcnN0IG5vbi1lbXB0eSBzdHJpbmcgYW1vbmcgdGhlIGNhbmRpZGF0ZXMsIGNhcHBlZCB0byB0aGUgaW5nZXN0IG1heC4gKi9cbmZ1bmN0aW9uIGZpcnN0QXR0ciguLi52YWxzOiB1bmtub3duW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IHYgb2YgdmFscykge1xuICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdi5sZW5ndGggPiAwKSByZXR1cm4gdi5zbGljZSgwLCBNQVhfQVRUUik7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCZXN0LWVmZm9ydCBleHRyYWN0aW9uIG9mIHRoZSBzb3VyY2UgY29tbWl0IGlkICsgcmVmIChhbmQgdGhlIHJldmlzaW9uIFVSTCwgdXNlZFxuICogb25seSBpbi1hY2NvdW50IHRvIGNsYXNzaWZ5IHRoZSBzb3VyY2UgdHlwZSBmb3IgY29tbWl0LXJhbmdlIHJlc29sdXRpb24pIGZyb20gYVxuICogQ29kZVBpcGVsaW5lIGV2ZW50IGRldGFpbC4gQ29kZVBpcGVsaW5lIHN1cmZhY2VzIHRoZSBzb3VyY2UgcmV2aXNpb24gdW5kZXIgYSBmZXdcbiAqIHNoYXBlcyBkZXBlbmRpbmcgb24gdGhlIGV2ZW50IHR5cGUgLyBzb3VyY2UtYWN0aW9uOyB3ZSBjaGVjayB0aGUga25vd24gb25lcyBhbmRcbiAqIGxlYXZlIHRoZSBmaWVsZHMgdW5kZWZpbmVkIHdoZW4gbm9uZSBhcmUgcHJlc2VudCAoTlVMTCBkb3duc3RyZWFtKS4gTmV2ZXIgcHVsbHMgYW5cbiAqIEFSTi9hY2NvdW50IGlkOiBvbmx5IHJldmlzaW9uL2JyYW5jaC91cmwgc3RyaW5nIGZpZWxkcyBhcmUgcmVhZDsgdGhlIHJldmlzaW9uVXJsXG4gKiBpcyBjb25zdW1lZCBpbi1hY2NvdW50IChzb3VyY2UgY2xhc3NpZmljYXRpb24pIGFuZCBuZXZlciBmb3J3YXJkZWQgb24gaXRzIG93bi5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdENvbW1pdChkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogeyBjb21taXRTaGE/OiBzdHJpbmc7IGNvbW1pdFJlZj86IHN0cmluZzsgcmV2aXNpb25Vcmw/OiBzdHJpbmcgfSB7XG4gIC8vIGBzb3VyY2UtcmV2aXNpb25zYCAoa2ViYWIsIEV2ZW50QnJpZGdlKSAvIGBzb3VyY2VSZXZpc2lvbnNgIChjYW1lbCkg4oCUIGZpcnN0IGVudHJ5LlxuICBjb25zdCByZXZzID0gKGRldGFpbFsnc291cmNlLXJldmlzaW9ucyddID8/IGRldGFpbC5zb3VyY2VSZXZpc2lvbnMpIGFzXG4gICAgfCBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZpcnN0UmV2ID0gQXJyYXkuaXNBcnJheShyZXZzKSA/IHJldnNbMF0gOiB1bmRlZmluZWQ7XG4gIC8vIE9uIHNvdXJjZSBhY3Rpb25zIHRoZSByZXZpc2lvbiBpZCBjYW4gYWxzbyByaWRlIG9uIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgZXhlY1Jlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGNvbW1pdFNoYSA9IGZpcnN0QXR0cihcbiAgICBkZXRhaWwuY29tbWl0SWQsXG4gICAgZGV0YWlsLnJldmlzaW9uSWQsXG4gICAgZmlyc3RSZXY/LnJldmlzaW9uSWQsXG4gICAgZXhlY1Jlc3VsdD8ucmV2aXNpb25JZCxcbiAgKTtcbiAgY29uc3QgY29tbWl0UmVmID0gZmlyc3RBdHRyKFxuICAgIGRldGFpbC5jb21taXRSZWYsXG4gICAgZGV0YWlsLmJyYW5jaCxcbiAgICBkZXRhaWwuc291cmNlQnJhbmNoLFxuICAgIGZpcnN0UmV2Py5icmFuY2hOYW1lLFxuICAgIGZpcnN0UmV2Py5icmFuY2gsXG4gICk7XG4gIGNvbnN0IHJldmlzaW9uVXJsID0gdHlwZW9mIGZpcnN0UmV2Py5yZXZpc2lvblVybCA9PT0gJ3N0cmluZycgPyBmaXJzdFJldi5yZXZpc2lvblVybCA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLCAuLi4oY29tbWl0UmVmICYmIHsgY29tbWl0UmVmIH0pLCAuLi4ocmV2aXNpb25VcmwgJiYgeyByZXZpc2lvblVybCB9KSB9O1xufVxuXG5mdW5jdGlvbiBjbGFzc2lmeUV2ZW50KGRldGFpbFR5cGU6IHN0cmluZyk6IHsgZXZlbnRUeXBlOiBzdHJpbmc7IGV2ZW50U291cmNlOiBzdHJpbmcgfSB7XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdQaXBlbGluZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1N0YWdlIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdTVEFHRScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQWN0aW9uIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdBQ1RJT04nLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLCBzb1xuICAvLyBwYXJzZVJlY29yZCBkcm9wcyB0aGVtIG9uIHRoZSBgZXZlbnRTb3VyY2UgIT09ICdjb2RlcGlwZWxpbmUnYCBjaGVjayBiZWxvdyDigJRcbiAgLy8gdGhlICdCVUlMRCcgZXZlbnRUeXBlIGlzIG5ldmVyIHBlcnNpc3RlZCBoZXJlIChwbHVnaW4gQlVJTEQgZXZlbnRzIGFyZVxuICAvLyByZWNvcmRlZCBkaXJlY3RseSBieSB0aGUgcGx1Z2luIHNlcnZpY2UpLiBUaGUgJ2NvZGVidWlsZCcgc291cmNlIGlzIHdoYXRcbiAgLy8gcm91dGVzIHRoZSBkcm9wOyBrZWVwIHRoaXMgYnJhbmNoIG9ubHkgZm9yIHRoYXQuXG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdCdWlsZCBTdGF0ZScpKSByZXR1cm4geyBldmVudFR5cGU6ICdCVUlMRCcsIGV2ZW50U291cmNlOiAnY29kZWJ1aWxkJyB9O1xuICByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xufVxuXG4vKiogUGFyc2UgKyByZXNvbHZlIG9uZSByZWNvcmQgdG8gYSByZXBvcnRhYmxlIGV2ZW50LCBvciBudWxsIHRvIHNraXAgaXQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgcGlwZWxpbmUgaWQsIHNvIHNraXAgdGhlbS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgcGIucGlwZWxpbmUtaWQgKD0gcGxhdGZvcm0gcGlwZWxpbmVJZCkgKyBwYi5kZXBsb3lzIG1hcC5cbiAgLy8gVGhlIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHsgcGlwZWxpbmVJZCwgb3JnSWQsIGRlcGxveXMgfSA9IGF3YWl0IHJlc29sdmVQaXBlbGluZShhcm4sIGV2ZW50LnJlZ2lvbik7XG4gIGlmICghcGlwZWxpbmVJZCkgcmV0dXJuIG51bGw7IC8vIHVudGFnZ2VkIC8gdW5yZWdpc3RlcmVkIOKGkiBza2lwXG5cbiAgLy8gQVdTIGRvZXMgbm90IGFsd2F5cyBzZW5kIGBzdGFydC10aW1lYC4gYGV2ZW50LnRpbWVgIHN0YW5kcyBpbiBmb3IgaXQgc28gdGhlXG4gIC8vIHJvdyBzdGlsbCBsYW5kcyBpbiB0aGUgcmVwb3J0IHdpbmRvd3MsIHdoaWNoIGZpbHRlciBvbiBgc3RhcnRlZF9hdGAg4oCUIGJ1dCBpdFxuICAvLyBpcyBOT1QgYSBtZWFzdXJlbWVudCwgYW5kIHRoZSBkdXJhdGlvbiBiZWxvdyBtdXN0IG5vdCBiZSBjb21wdXRlZCBmcm9tIGl0LlxuICBjb25zdCBkZWNsYXJlZFN0YXJ0ID0gZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdGFydGVkQXQgPSBkZWNsYXJlZFN0YXJ0IHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgLy8gT05MWSBmcm9tIGEgc3RhcnQgQVdTIGFjdHVhbGx5IGRlY2xhcmVkLiBXaXRoIHRoZSBmYWxsYmFjaywgYHN0YXJ0ZWRBdGAgYW5kXG4gICAgLy8gYGNvbXBsZXRlZEF0YCBhcmUgYm90aCBgZXZlbnQudGltZWAgb24gYSB0ZXJtaW5hbCBldmVudCwgc28gdGhlIGR1cmF0aW9uIGNhbWVcbiAgICAvLyBvdXQgYXMgZXhhY3RseSAwIOKAlCByZXBvcnRlZCBhcyBhIHJlYWwgbWVhc3VyZW1lbnQsIGRyYWdnaW5nIGV2ZXJ5IGF2ZXJhZ2UgYW5kXG4gICAgLy8gcDk1IHN0YWdlIGR1cmF0aW9uIHRvd2FyZCB6ZXJvIHdpdGggbm8gc2lnbiBhbnl0aGluZyB3YXMgbWlzc2luZy4gVW5rbm93biBpc1xuICAgIC8vIGxlZnQgdW5rbm93biAoTlVMTCksIHdoaWNoIHRoZSByZXBvcnRzIGFscmVhZHkgaGFuZGxlLlxuICAgIGlmIChkZWNsYXJlZFN0YXJ0KSB7XG4gICAgICBjb25zdCBtcyA9IG5ldyBEYXRlKGNvbXBsZXRlZEF0KS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShkZWNsYXJlZFN0YXJ0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKG1zKSAmJiBtcyA+PSAwKSBkdXJhdGlvbk1zID0gbXM7XG4gICAgfVxuICB9XG5cbiAgLy8gUHJvbW90ZSB0aGUgZmFpbHVyZSByZWFzb24gdG8gYSB0eXBlZCBmaWVsZC4gT24gQWN0aW9uIGV2ZW50cyBBV1MgcHV0cyB0aGVcbiAgLy8gaHVtYW4tcmVhZGFibGUgc3VtbWFyeSAoYW5kIGEgbG9nIFVSTCArIGVycm9yLWNvZGUsIHdoaWNoIHN0YXkgaW4gYGRldGFpbGApXG4gIC8vIHVuZGVyIGBleGVjdXRpb24tcmVzdWx0YC5cbiAgY29uc3QgcmVzdWx0ID0gZGV0YWlsWydleGVjdXRpb24tcmVzdWx0J10gYXMgeyAnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknPzogdW5rbm93biB9IHwgdW5kZWZpbmVkO1xuICBjb25zdCBzdW1tYXJ5ID0gcmVzdWx0Py5bJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5J107XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IHR5cGVvZiBzdW1tYXJ5ID09PSAnc3RyaW5nJyAmJiBzdW1tYXJ5Lmxlbmd0aCA+IDBcbiAgICA/IHN1bW1hcnkuc2xpY2UoMCwgTUFYX0VSUk9SX01FU1NBR0UpXG4gICAgOiB1bmRlZmluZWQ7XG5cbiAgLy8gRE9SQSBkZXBsb3kgYXR0cmlidXRpb24g4oCUIGFsbCBvcHRpb25hbDogb21pdHRlZCAodW5kZWZpbmVkKSB3aGVuIHRoZVxuICAvLyBldmVudC9waXBlbGluZSBkb2Vzbid0IGNhcnJ5IHRoZW0uXG4gIGNvbnN0IHsgY29tbWl0U2hhLCBjb21taXRSZWYsIHJldmlzaW9uVXJsIH0gPSBleHRyYWN0Q29tbWl0KGRldGFpbCk7XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1pZCddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RhZ2VOYW1lID0gZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29uc3QgYWN0aW9uTmFtZSA9IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEVudmlyb25tZW50ICjih5IgaXNEZXBsb3kpIGlzIHNldCBPTkxZIHdoZW4gdGhpcyBldmVudCdzIHN0YWdlIGlzIGxpc3RlZCBpbiB0aGVcbiAgLy8gcGlwZWxpbmUncyBwYi5kZXBsb3lzIHRhZy4gUElQRUxJTkUgZXZlbnRzIGhhdmUgbm8gc3RhZ2Ug4oaSIG5ldmVyIGEgZGVwbG95LlxuICBjb25zdCBlbnZpcm9ubWVudCA9IHN0YWdlTmFtZSA/IGRlcGxveXMuZ2V0KHN0YWdlTmFtZSkgOiB1bmRlZmluZWQ7XG5cbiAgLy8gUmVzb2x2ZSB0aGUgY29tbWl0IHJhbmdlIChvbGRlc3QtdW5zaGlwcGVkIHRpbWVzdGFtcCArIGNvdW50KSBmb3IgYW55XG4gIC8vIGV2ZW50IGNhcnJ5aW5nIGEgY29tbWl0LiBCZXN0LWVmZm9ydC9pbi1hY2NvdW50OyBvbWl0dGVkIG9uIGFueSBmYWlsdXJlLlxuICAvLyBHQVRFRCBvbiBgRE9SQV9FTkFCTEVEYCAoc2V0IGJ5IGBzZXR1cC1ldmVudHMgLS13aXRoLWRvcmFgKTogRE9SQSBsZWFkIHRpbWUgaXMgYW5cbiAgLy8gYWR2YW5jZWRfcmVwb3J0aW5nIGFkZC1vbiwgc28gb3JncyB3aXRob3V0IGl0IHNraXAgdGhlIFNDTS9zZWNyZXQgY29zdCBlbnRpcmVseSDigJRcbiAgLy8gc3RhbmRhcmQgcmVwb3J0aW5nIChjb21taXRTaGEgKyBhbGwgb3RoZXIgZmllbGRzKSBzdGlsbCBmb3J3YXJkcyByZWdhcmRsZXNzLlxuICBsZXQgY29tbWl0VGltZXN0YW1wOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBjb21taXRDb3VudDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBpZiAoY29tbWl0U2hhICYmIHByb2Nlc3MuZW52LkRPUkFfRU5BQkxFRCA9PT0gJ3RydWUnKSB7XG4gICAgY29uc3Qgc3JjID0gY2xhc3NpZnlTb3VyY2UocmV2aXNpb25VcmwpO1xuICAgIGNvbnN0IGluZm8gPSBhd2FpdCByZXNvbHZlQ29tbWl0SW5mbyhwaXBlbGluZUlkLCBvcmdJZCwgZXZlbnQucmVnaW9uLCB7IHNoYTogY29tbWl0U2hhLCAuLi5zcmMgfSk7XG4gICAgY29tbWl0VGltZXN0YW1wID0gaW5mby5jb21taXRUaW1lc3RhbXA7XG4gICAgY29tbWl0Q291bnQgPSBpbmZvLmNvbW1pdENvdW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBvcmdJZCxcbiAgICBwaXBlbGluZUlkLFxuICAgIGV2ZW50U291cmNlLFxuICAgIGV2ZW50VHlwZSxcbiAgICBzdGF0dXM6IHN0YXRlLFxuICAgIGV4ZWN1dGlvbklkLFxuICAgIHN0YWdlTmFtZSxcbiAgICBhY3Rpb25OYW1lLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICAuLi4oY29tbWl0U2hhICYmIHsgY29tbWl0U2hhIH0pLFxuICAgIC4uLihjb21taXRSZWYgJiYgeyBjb21taXRSZWYgfSksXG4gICAgLi4uKGNvbW1pdFRpbWVzdGFtcCAmJiB7IGNvbW1pdFRpbWVzdGFtcCB9KSxcbiAgICAuLi4oY29tbWl0Q291bnQgJiYgeyBjb21taXRDb3VudCB9KSxcbiAgICAuLi4oZW52aXJvbm1lbnQgJiYgeyBlbnZpcm9ubWVudCB9KSxcbiAgICBkZXRhaWwsXG4gIH07XG59XG4iXX0=
package/lib/scm.js CHANGED
@@ -1,7 +1,8 @@
1
1
  // Copyright 2026 Pipeline Builder Contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  import { GetSecretValueCommand, SecretsManagerClient } from '@aws-sdk/client-secrets-manager';
4
- import { BoundedMap, CACHE_MAX_ENTRIES, loadSdk, log } from './util.js';
4
+ import { getAuthToken } from './auth.js';
5
+ import { BoundedMap, CACHE_MAX_ENTRIES, fetchWithTimeout, loadSdk, log } from './util.js';
5
6
  // Per-(pipeline,sha) resolved result — computed once, reused across the many events
6
7
  // (PIPELINE/STAGE/ACTION) that share a source revision and across redeliveries.
7
8
  // Only RESOLVED results are cached — an empty `{}` (SCM cooldown, a timeout, a
@@ -9,9 +10,15 @@ import { BoundedMap, CACHE_MAX_ENTRIES, loadSdk, log } from './util.js';
9
10
  // that sha for the container's lifetime.
10
11
  const commitResultCache = new BoundedMap(CACHE_MAX_ENTRIES);
11
12
  // Last sha we successfully resolved per pipeline — the exclusive lower bound for the
12
- // next range ("commits since the last deploy"). In-memory only: a cold start resets
13
- // it, so the first post-cold event resolves as a single commit (expected, defensive).
13
+ // next range ("commits since the last deploy"). In-memory, so a cold start empties
14
+ // it; `fetchLastDeployedSha` then reads the bound back from the reporting API,
15
+ // because resolving as a single commit made lead time and commitCount far too
16
+ // small on every fresh container — which is most of them.
14
17
  const lastShaByPipeline = new BoundedMap(CACHE_MAX_ENTRIES);
18
+ // Pipelines whose bound we already asked the reporting API for and it had none.
19
+ // Without this, a pipeline that genuinely has never deployed re-asks on every
20
+ // event for the life of the container.
21
+ const noRecordedDeploy = new Set();
15
22
  // Per-sha CodeCommit metadata cache (date + first-parent) for range walks.
16
23
  const commitMetaCache = new BoundedMap(CACHE_MAX_ENTRIES);
17
24
  // SCM rate-limit cooldown: after a 403/429 we stop calling the SCM for a while.
@@ -72,16 +79,6 @@ async function getGitHubToken(orgId) {
72
79
  githubTokenByOrg.set(key, token);
73
80
  return token;
74
81
  }
75
- async function fetchWithTimeout(url, opts) {
76
- const controller = new AbortController();
77
- const timer = setTimeout(() => controller.abort(), SCM_FETCH_TIMEOUT_MS);
78
- try {
79
- return await fetch(url, { ...opts, signal: controller.signal });
80
- }
81
- finally {
82
- clearTimeout(timer);
83
- }
84
- }
85
82
  /** Normalize a commit date to ISO 8601. Accepts ISO strings and CodeCommit's
86
83
  * "<epoch-seconds> +ZZZZ" form. Returns undefined when unparseable. */
87
84
  function toIso(value) {
@@ -192,7 +189,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
192
189
  headers.Authorization = `Bearer ${token}`;
193
190
  const rateLimited = (r) => r.status === 403 || r.status === 429;
194
191
  if (sinceSha) {
195
- const r = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/compare/${sinceSha}...${sha}`, { headers });
192
+ const r = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/compare/${sinceSha}...${sha}`, { headers }, SCM_FETCH_TIMEOUT_MS);
196
193
  if (rateLimited(r)) {
197
194
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
198
195
  return {};
@@ -208,7 +205,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
208
205
  }
209
206
  // fall through to single-commit resolution
210
207
  }
211
- const r2 = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/commits/${sha}`, { headers });
208
+ const r2 = await fetchWithTimeout(`https://api.github.com/repos/${owner}/${repo}/commits/${sha}`, { headers }, SCM_FETCH_TIMEOUT_MS);
212
209
  if (rateLimited(r2)) {
213
210
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
214
211
  return {};
@@ -224,7 +221,7 @@ async function resolveGitHub(owner, repo, sha, sinceSha, orgId) {
224
221
  async function resolveBitbucket(owner, repo, sha) {
225
222
  const r = await fetchWithTimeout(`https://api.bitbucket.org/2.0/repositories/${owner}/${repo}/commit/${sha}`, {
226
223
  headers: { 'User-Agent': 'pipeline-builder-forwarder', 'Accept': 'application/json' },
227
- });
224
+ }, SCM_FETCH_TIMEOUT_MS);
228
225
  if (r.status === 429) {
229
226
  scmCooldownUntil = Date.now() + SCM_COOLDOWN_MS;
230
227
  return {};
@@ -249,7 +246,10 @@ export async function resolveCommitInfo(pipelineId, orgId, region, src) {
249
246
  const cached = commitResultCache.get(rkey);
250
247
  if (cached)
251
248
  return cached;
252
- const prev = lastShaByPipeline.get(pipelineId);
249
+ // Cold-start recovery: nothing in this container's memory, so ask the reporting
250
+ // API what this pipeline last shipped. Without it the range below collapses to
251
+ // the single newest commit.
252
+ const prev = lastShaByPipeline.get(pipelineId) ?? await fetchLastDeployedSha(pipelineId);
253
253
  const sinceSha = prev && prev !== src.sha ? prev : undefined;
254
254
  let info = {};
255
255
  try {
@@ -275,12 +275,54 @@ export async function resolveCommitInfo(pipelineId, orgId, region, src) {
275
275
  }
276
276
  return info;
277
277
  }
278
+ /**
279
+ * The exclusive lower bound from durable storage, for a container whose memory is
280
+ * empty. Best-effort: on ANY failure this returns undefined and the caller resolves
281
+ * a single commit exactly as before, so a reporting-API blip degrades lead time
282
+ * rather than failing the batch (which would redeliver already-forwarded events).
283
+ *
284
+ * No `environment` is sent: this runs while handling the SOURCE event, and the
285
+ * execution has not reached a deploy stage yet, so the environment is not yet
286
+ * known. The API then answers "last shipped anywhere", which is the correct bound
287
+ * for an SCM range walk.
288
+ */
289
+ async function fetchLastDeployedSha(pipelineId) {
290
+ const baseUrl = process.env.PLATFORM_BASE_URL;
291
+ if (!baseUrl || noRecordedDeploy.has(pipelineId))
292
+ return undefined;
293
+ try {
294
+ // The package's REPORTING budget, deliberately, not SCM_FETCH_TIMEOUT_MS: this is a
295
+ // call to our own reporting service, and the tighter SCM deadline exists for
296
+ // third-party forges we cannot reason about.
297
+ const res = await fetchWithTimeout(`${baseUrl}/api/reports/events/last-deploy-commit?pipelineId=${encodeURIComponent(pipelineId)}`, { headers: { Authorization: `Bearer ${await getAuthToken()}`, Accept: 'application/json' } });
298
+ if (!res.ok) {
299
+ log.warn('Last-deploy-commit lookup failed; resolving a single commit', { status: res.status });
300
+ return undefined;
301
+ }
302
+ const body = await res.json();
303
+ const sha = body.data?.commitSha ?? undefined;
304
+ if (!sha) {
305
+ // A real "never deployed" answer — remember it so we ask once per container.
306
+ noRecordedDeploy.add(pipelineId);
307
+ return undefined;
308
+ }
309
+ lastShaByPipeline.set(pipelineId, sha);
310
+ return sha;
311
+ }
312
+ catch (err) {
313
+ log.warn('Last-deploy-commit lookup errored; resolving a single commit', {
314
+ error: err?.name ?? String(err),
315
+ });
316
+ return undefined;
317
+ }
318
+ }
278
319
  /** @internal Test-only: forget resolved commits, SCM cooldown and cached tokens. */
279
320
  export function _resetScmForTests() {
280
321
  commitResultCache.clear();
281
322
  lastShaByPipeline.clear();
323
+ noRecordedDeploy.clear();
282
324
  commitMetaCache.clear();
283
325
  scmCooldownUntil = 0;
284
326
  githubTokenByOrg.clear();
285
327
  }
286
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQThCeEUsb0ZBQW9GO0FBQ3BGLGdGQUFnRjtBQUNoRiwrRUFBK0U7QUFDL0UsZ0ZBQWdGO0FBQ2hGLHlDQUF5QztBQUN6QyxNQUFNLGlCQUFpQixHQUFHLElBQUksVUFBVSxDQUFxQixpQkFBaUIsQ0FBQyxDQUFDO0FBQ2hGLHFGQUFxRjtBQUNyRixvRkFBb0Y7QUFDcEYsc0ZBQXNGO0FBQ3RGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxVQUFVLENBQWlCLGlCQUFpQixDQUFDLENBQUM7QUFDNUUsMkVBQTJFO0FBQzNFLE1BQU0sZUFBZSxHQUFHLElBQUksVUFBVSxDQUFnRCxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pHLGdGQUFnRjtBQUNoRixJQUFJLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUN6QixNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0QyxzRkFBc0Y7QUFDdEYsTUFBTSxlQUFlLEdBQUcsRUFBRSxDQUFDO0FBQzNCLGtGQUFrRjtBQUNsRixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUVsQywrRUFBK0U7QUFDL0Usb0ZBQW9GO0FBQ3BGLHNGQUFzRjtBQUN0RixzRkFBc0Y7QUFDdEYsNkVBQTZFO0FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxVQUFVLENBQXdCLGlCQUFpQixDQUFDLENBQUM7QUFFbEY7Ozs7OztHQU1HO0FBQ0gsU0FBUyxxQkFBcUIsQ0FBQyxLQUFvQjtJQUNqRCxNQUFNLElB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LENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBCb3VuZGVkTWFwLCBDQUNIRV9NQVhfRU5UUklFUywgbG9hZFNkaywgbG9nIH0gZnJvbSAnLi91dGlsLmpzJztcblxuLy8gSW4tYWNjb3VudCBjb21taXQtcmFuZ2UgcmVzb2x1dGlvbi5cbi8vIEZvciBhIHNvdXJjZS9kZXBsb3kgZXZlbnQgY2FycnlpbmcgYSBjb21taXRTaGEgd2UgcmVzb2x2ZSB0aGUgY29tbWl0IHRpbWVzdGFtcFxuLy8gKGFuZCBob3cgbWFueSBjb21taXRzIHNoaXBwZWQpIGZvciB0aGUgcmFuZ2Ugc2luY2UgdGhlIGxhc3QgcmVzb2x2ZWQgc2hhIG9mIHRoZVxuLy8gc2FtZSBwaXBlbGluZSDigJQgZW50aXJlbHkgSU4tQUNDT1VOVCwgcGVyIHNvdXJjZSB0eXBlOlxuLy8gICDigKIgQ29kZUNvbW1pdCAg4oaSIEFXUyBTREsgR2V0Q29tbWl0ICh3YWxrIGZpcnN0LXBhcmVudHMgYmFjayB0byB0aGUgYm91bmRhcnkpLlxuLy8gICDigKIgR2l0SHViL0NvZGVDb25uZWN0aW9ucy1HaXRIdWIg4oaSIEdpdEh1YiBSRVNUIGNvbXBhcmUvY29tbWl0cyBBUEkuIEF1dGhlbnRpY2F0ZWRcbi8vICAgICB3aXRoIHRoZSBvcmcncyBgcGlwZWxpbmUtYnVpbGRlci97b3JnSWR9L2dpdGh1Yi10b2tlbmAgc2VjcmV0IHdoZW4gcHJlc2VudFxuLy8gICAgIChkZXJpdmVkIGZyb20gUExBVEZPUk1fU0VDUkVUX05BTUUpLCBvdGhlcndpc2UgYmVzdC1lZmZvcnQgdW5hdXRoZW50aWNhdGVkLlxuLy8gICDigKIgQml0YnVja2V0ICAg4oaSIEJpdGJ1Y2tldCBSRVNUIGNvbW1pdCBBUEkgKHNpbmdsZS1jb21taXQ7IHJhbmdlIHdhbGsgb21pdHRlZCkuXG4vLyBUaGUgb2xkZXN0IHVuc2hpcHBlZCBjb21taXQncyB0aW1lc3RhbXAg4oaSIGBjb21taXRUaW1lc3RhbXBgOyB0aGUgbnVtYmVyIG9mIGNvbW1pdHNcbi8vIGluIHRoZSByYW5nZSDihpIgYGNvbW1pdENvdW50YC4gRXZlcnl0aGluZyBoZXJlIGlzIEJFU1QtRUZGT1JUOiBvbiBhbnkgZmFpbHVyZSB0aGVcbi8vIGZpZWxkcyBhcmUgc2ltcGx5IG9taXR0ZWQgKHJlcG9ydGluZyBmYWxscyBiYWNrIHRvIGB1bmtub3duYCkuIEl0IG11c3QgTkVWRVIgZmFpbFxuLy8gdGhlIGJhdGNoLlxuLy9cbi8vIElBTSByZXF1aXJlZCBieSB0aGlzIHBhdGggKGRvY3VtZW50IG9ubHkg4oCUIGdyYW50ZWQgb24gdGhlIGV2ZW50cyBzdGFjayk6XG4vLyAgIOKAoiBjb2RlY29tbWl0OkdldENvbW1pdCAgICAgICAgICAgIChDb2RlQ29tbWl0IHNvdXJjZXMpXG4vLyAgIOKAoiBzZWNyZXRzbWFuYWdlcjpHZXRTZWNyZXRWYWx1ZSBvbiBgcGlwZWxpbmUtYnVpbGRlci8qL2dpdGh1Yi10b2tlbmAgKHRva2VuIFNDTSBzb3VyY2VzKVxuXG50eXBlIFNvdXJjZVByb3ZpZGVyID0gJ2dpdGh1YicgfCAnYml0YnVja2V0JyB8ICdjb2RlY29tbWl0JyB8ICd1bmtub3duJztcbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlUmVmIHtcbiAgc2hhOiBzdHJpbmc7XG4gIHByb3ZpZGVyOiBTb3VyY2VQcm92aWRlcjtcbiAgb3duZXI/OiBzdHJpbmc7XG4gIHJlcG8/OiBzdHJpbmc7XG4gIHJlcG9zaXRvcnlOYW1lPzogc3RyaW5nO1xufVxuZXhwb3J0IGludGVyZmFjZSBDb21taXRJbmZvIHsgY29tbWl0VGltZXN0YW1wPzogc3RyaW5nOyBjb21taXRDb3VudD86IG51bWJlciB9XG5cbi8vIFBlci0ocGlwZWxpbmUsc2hhKSByZXNvbHZlZCByZXN1bHQg4oCUIGNvbXB1dGVkIG9uY2UsIHJldXNlZCBhY3Jvc3MgdGhlIG1hbnkgZXZlbnRzXG4vLyAoUElQRUxJTkUvU1RBR0UvQUNUSU9OKSB0aGF0IHNoYXJlIGEgc291cmNlIHJldmlzaW9uIGFuZCBhY3Jvc3MgcmVkZWxpdmVyaWVzLlxuLy8gT25seSBSRVNPTFZFRCByZXN1bHRzIGFyZSBjYWNoZWQg4oCUIGFuIGVtcHR5IGB7fWAgKFNDTSBjb29sZG93biwgYSB0aW1lb3V0LCBhXG4vLyA0MDQgZnJvbSBhIHJlcG8gd2hvc2UgdG9rZW4gd2FzIGp1c3QgYWRkZWQpIG11c3Qgbm90IHBpbiBcIm5vIGNvbW1pdCBpbmZvXCIgZm9yXG4vLyB0aGF0IHNoYSBmb3IgdGhlIGNvbnRhaW5lcidzIGxpZmV0aW1lLlxuY29uc3QgY29tbWl0UmVzdWx0Q2FjaGUgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIENvbW1pdEluZm8+KENBQ0hFX01BWF9FTlRSSUVTKTtcbi8vIExhc3Qgc2hhIHdlIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBwZXIgcGlwZWxpbmUg4oCUIHRoZSBleGNsdXNpdmUgbG93ZXIgYm91bmQgZm9yIHRoZVxuLy8gbmV4dCByYW5nZSAoXCJjb21taXRzIHNpbmNlIHRoZSBsYXN0IGRlcGxveVwiKS4gSW4tbWVtb3J5IG9ubHk6IGEgY29sZCBzdGFydCByZXNldHNcbi8vIGl0LCBzbyB0aGUgZmlyc3QgcG9zdC1jb2xkIGV2ZW50IHJlc29sdmVzIGFzIGEgc2luZ2xlIGNvbW1pdCAoZXhwZWN0ZWQsIGRlZmVuc2l2ZSkuXG5jb25zdCBsYXN0U2hhQnlQaXBlbGluZSA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgc3RyaW5nPihDQUNIRV9NQVhfRU5UUklFUyk7XG4vLyBQZXItc2hhIENvZGVDb21taXQgbWV0YWRhdGEgY2FjaGUgKGRhdGUgKyBmaXJzdC1wYXJlbnQpIGZvciByYW5nZSB3YWxrcy5cbmNvbnN0IGNvbW1pdE1ldGFDYWNoZSA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgeyBkYXRlPzogc3RyaW5nOyBwYXJlbnRzPzogc3RyaW5nW10gfT4oQ0FDSEVfTUFYX0VOVFJJRVMpO1xuLy8gU0NNIHJhdGUtbGltaXQgY29vbGRvd246IGFmdGVyIGEgNDAzLzQyOSB3ZSBzdG9wIGNhbGxpbmcgdGhlIFNDTSBmb3IgYSB3aGlsZS5cbmxldCBzY21Db29sZG93blVudGlsID0gMDtcbmNvbnN0IFNDTV9DT09MRE9XTl9NUyA9IDIgKiA2MCAqIDEwMDA7XG4vLyBDYXAgdGhlIENvZGVDb21taXQgZmlyc3QtcGFyZW50IHdhbGsgc28gYSBsb25nIHJhbmdlIGNhbid0IGJsb3cgdGhlIExhbWJkYSB0aW1lb3V0LlxuY29uc3QgTUFYX0NPTU1JVF9XQUxLID0gNTA7XG4vLyBQZXItcmVxdWVzdCB0aW1lb3V0IGZvciBleHRlcm5hbCBTQ00gY2FsbHMgKGRlZmVuc2l2ZSBhZ2FpbnN0IHNsb3cvaHVuZyBob3N0cykuXG5jb25zdCBTQ01fRkVUQ0hfVElNRU9VVF9NUyA9IDMwMDA7XG5cbi8vIFRoZSBmb3J3YXJkZXIgaXMgYSBmbGVldCBMYW1iZGE6IG9uZSB3YXJtIGNvbnRhaW5lciByZXNvbHZlcyBldmVudHMgZm9yIE1BTllcbi8vIG9yZ3MsIHNvIHRoZSBHaXRIdWIgdG9rZW4gTVVTVCBiZSBrZXllZCBieSB0aGUgZXZlbnQncyByZXNvbHZlZCBvcmcgKG5vdCBhIHNpbmdsZVxuLy8gY29udGFpbmVyLWdsb2JhbCB0b2tlbikuIEVhY2ggb3JnJ3MgdG9rZW4gbGl2ZXMgYXQgYDxwcmVmaXg+LzxvcmdJZD4vZ2l0aHViLXRva2VuYCxcbi8vIGRlcml2ZWQgZnJvbSBQTEFURk9STV9TRUNSRVRfTkFNRSAoYDxwcmVmaXg+Lzxjb250YWluZXJPcmc+L3BsYXRmb3JtYCkuIG51bGwgY2FjaGVzXG4vLyBhIGRlZmluaXRpdmUgbWlzcyAobm8gc2VjcmV0IC8gcmVhZCBmYWlsZWQpIOKGkiB1bmF1dGhlbnRpY2F0ZWQgYmVzdC1lZmZvcnQuXG5jb25zdCBnaXRodWJUb2tlbkJ5T3JnID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBzdHJpbmcgfCBudWxsPihDQUNIRV9NQVhfRU5UUklFUyk7XG5cbi8qKlxuICogRGVyaXZlIGEgc3BlY2lmaWMgb3JnJ3MgZ2l0aHViLXRva2VuIHNlY3JldCBuYW1lIGZyb20gUExBVEZPUk1fU0VDUkVUX05BTUVcbiAqIChgPHByZWZpeD4vPGNvbnRhaW5lck9yZz4vcGxhdGZvcm1gKS4gV2l0aCBhbiBgb3JnSWRgIHdlIHN3YXAgdGhlIG9yZyBzZWdtZW50XG4gKiAoYDxwcmVmaXg+LzxvcmdJZD4vZ2l0aHViLXRva2VuYCk7IHdpdGhvdXQgb25lIChwaXBlbGluZSBjYXJyaWVkIG5vIE9yZ0lkIHRhZykgd2VcbiAqIGZhbGwgYmFjayB0byB0aGUgY29udGFpbmVyJ3Mgb3duIHNpYmxpbmcgc2VjcmV0LiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuXG4gKiBQTEFURk9STV9TRUNSRVRfTkFNRSBpc24ndCB0aGUgZXhwZWN0ZWQgYC4uLi9wbGF0Zm9ybWAgc2hhcGUuXG4gKi9cbmZ1bmN0aW9uIGdpdGh1YlRva2VuU2VjcmV0TmFtZShvcmdJZDogc3RyaW5nIHwgbnVsbCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5QTEFURk9STV9TRUNSRVRfTkFNRTtcbiAgaWYgKCFuYW1lIHx8ICFuYW1lLmVuZHNXaXRoKCcvcGxhdGZvcm0nKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgYmFzZSA9IG5hbWUuc2xpY2UoMCwgLScvcGxhdGZvcm0nLmxlbmd0aCk7IC8vIDxwcmVmaXg+Lzxjb250YWluZXJPcmc+XG4gIGlmIChvcmdJZCkge1xuICAgIGNvbnN0IHNsYXNoID0gYmFzZS5sYXN0SW5kZXhPZignLycpO1xuICAgIGNvbnN0IHByZWZpeCA9IHNsYXNoID4gMCA/IGJhc2Uuc2xpY2UoMCwgc2xhc2gpIDogYmFzZTtcbiAgICByZXR1cm4gYCR7cHJlZml4fS8ke29yZ0lkfS9naXRodWItdG9rZW5gO1xuICB9XG4gIHJldHVybiBgJHtiYXNlfS9naXRodWItdG9rZW5gO1xufVxuXG4vKiogUmVhZCAoYW5kIGNhY2hlLCBwZXIgb3JnKSB0aGUgb3JnIGdpdGh1YiB0b2tlbjsgbnVsbCDihpIgdW5hdXRoZW50aWNhdGVkIGJlc3QtZWZmb3J0LiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0R2l0SHViVG9rZW4ob3JnSWQ6IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgY29uc3Qga2V5ID0gb3JnSWQgPz8gJyc7XG4gIGNvbnN0IGNhY2hlZCA9IGdpdGh1YlRva2VuQnlPcmcuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNhY2hlZDtcbiAgY29uc3Qgc2VjcmV0TmFtZSA9IGdpdGh1YlRva2VuU2VjcmV0TmFtZShvcmdJZCk7XG4gIGlmICghc2VjcmV0TmFtZSkgeyBnaXRodWJUb2tlbkJ5T3JnLnNldChrZXksIG51bGwpOyByZXR1cm4gbnVsbDsgfVxuICBsZXQgdG9rZW46IHN0cmluZyB8IG51bGw7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KHt9KTtcbiAgICBjb25zdCByZXMgPSBhd2FpdCBjbGllbnQuc2VuZChuZXcgR2V0U2VjcmV0VmFsdWVDb21tYW5kKHsgU2VjcmV0SWQ6IHNlY3JldE5hbWUgfSkpO1xuICAgIC8vIFRoZSBnaXRodWItdG9rZW4gc2VjcmV0IGlzIGEgUkFXIHRva2VuIHN0cmluZyAobm90IEpTT04g4oCUIENESyByZXNvbHZlcyBpdCB2aWFcbiAgICAvLyB0aGUgZGVmYXVsdCBTZWNyZXRTdHJpbmcgd2l0aCBubyBrZXkpLlxuICAgIHRva2VuID0gcmVzLlNlY3JldFN0cmluZyAmJiByZXMuU2VjcmV0U3RyaW5nLmxlbmd0aCA+IDAgPyByZXMuU2VjcmV0U3RyaW5nLnRyaW0oKSA6IG51bGw7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdObyBnaXRodWItdG9rZW4gc2VjcmV0IOKAlCBHaXRIdWIgY29tbWl0IHJlc29sdXRpb24gd2lsbCBiZSB1bmF1dGhlbnRpY2F0ZWQnLCB7IG9yZ0lkLCBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgfSk7XG4gICAgdG9rZW4gPSBudWxsO1xuICB9XG4gIGdpdGh1YlRva2VuQnlPcmcuc2V0KGtleSwgdG9rZW4pO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQodXJsOiBzdHJpbmcsIG9wdHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBTQ01fRkVUQ0hfVElNRU9VVF9NUyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZldGNoKHVybCwgeyAuLi5vcHRzLCBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gIH1cbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGNvbW1pdCBkYXRlIHRvIElTTyA4NjAxLiBBY2NlcHRzIElTTyBzdHJpbmdzIGFuZCBDb2RlQ29tbWl0J3NcbiAqICBcIjxlcG9jaC1zZWNvbmRzPiArWlpaWlwiIGZvcm0uIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdW5wYXJzZWFibGUuICovXG5mdW5jdGlvbiB0b0lzbyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXBvY2ggPSAvXihcXGR7OSx9KVxcYi8uZXhlYyh2YWx1ZS50cmltKCkpO1xuICBpZiAoZXBvY2gpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoTnVtYmVyKGVwb2NoWzFdKSAqIDEwMDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xuICB9XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xufVxuXG4vKiogQ2xhc3NpZnkgYSBzb3VyY2UtcmV2aXNpb24gVVJMIGludG8gYSBwcm92aWRlciArIHJlcG8gY29vcmRpbmF0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTb3VyY2UodXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPbWl0PFNvdXJjZVJlZiwgJ3NoYSc+IHtcbiAgaWYgKCF1cmwpIHJldHVybiB7IHByb3ZpZGVyOiAndW5rbm93bicgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IGhvc3QgPSB1Lmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhvc3QgPT09ICdnaXRodWIuY29tJyB8fCBob3N0LmVuZHNXaXRoKCcuZ2l0aHViLmNvbScpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IDIpIHJldHVybiB7IHByb3ZpZGVyOiAnZ2l0aHViJywgb3duZXI6IHBhcnRzWzBdLCByZXBvOiBwYXJ0c1sxXS5yZXBsYWNlKC9cXC5naXQkLywgJycpIH07XG4gICAgfVxuICAgIGlmIChob3N0ID09PSAnYml0YnVja2V0Lm9yZycpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikgcmV0dXJuIHsgcHJvdmlkZXI6ICdiaXRidWNrZXQnLCBvd25lcjogcGFydHNbMF0sIHJlcG86IHBhcnRzWzFdLnJlcGxhY2UoL1xcLmdpdCQvLCAnJykgfTtcbiAgICB9XG4gICAgaWYgKHUucGF0aG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnY29kZWNvbW1pdCcpIHx8IHUuaGFzaC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb2RlY29tbWl0JykgfHwgdS5wYXRobmFtZS5pbmNsdWRlcygnL3JlcG9zaXRvcmllcy8nKSkge1xuICAgICAgY29uc3QgbSA9IC9yZXBvc2l0b3IoPzp5fGllcylcXC8oW14vIz9dKykvLmV4ZWModS5wYXRobmFtZSArIHUuaGFzaCk7XG4gICAgICBpZiAobSkgcmV0dXJuIHsgcHJvdmlkZXI6ICdjb2RlY29tbWl0JywgcmVwb3NpdG9yeU5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKSB9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gbm90IGEgVVJMIOKGkiB1bmtub3duXG4gIH1cbiAgcmV0dXJuIHsgcHJvdmlkZXI6ICd1bmtub3duJyB9O1xufVxuXG5sZXQgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IH0+IHwgdW5kZWZpbmVkO1xuaW50ZXJmYWNlIENvZGVDb21taXRNb2R1bGUge1xuICBDb2RlQ29tbWl0Q2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfTtcbiAgR2V0Q29tbWl0Q29tbWFuZDogbmV3IChpbnB1dDogeyByZXBvc2l0b3J5TmFtZTogc3RyaW5nOyBjb21taXRJZDogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZWNvbW1pdE1vZDogQ29kZUNvbW1pdE1vZHVsZSB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9PiB7XG4gIGlmICghY29kZWNvbW1pdE1vZCkgY29kZWNvbW1pdE1vZCA9IGF3YWl0IGxvYWRTZGs8Q29kZUNvbW1pdE1vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlY29tbWl0Jyk7XG4gIGlmICghY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbikgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IGNvZGVjb21taXRDbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gbmV3IGNvZGVjb21taXRNb2QuQ29kZUNvbW1pdENsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqIEZldGNoIChjYWNoZWQpIGEgc2luZ2xlIENvZGVDb21taXQgY29tbWl0J3MgZGF0ZSArIGZpcnN0IHBhcmVudHMgdmlhIEdldENvbW1pdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRNZXRhKHJlZ2lvbjogc3RyaW5nLCByZXBvc2l0b3J5TmFtZTogc3RyaW5nLCBjb21taXRJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGU/OiBzdHJpbmc7IHBhcmVudHM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNvbW1pdE1ldGFDYWNoZS5nZXQoY29tbWl0SWQpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBpZiAoIWNvZGVjb21taXRNb2QpIGNvZGVjb21taXRNb2QgPSBhd2FpdCBsb2FkU2RrPENvZGVDb21taXRNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdCcpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBjb2RlQ29tbWl0Q2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBjb2RlY29tbWl0TW9kLkdldENvbW1pdENvbW1hbmQoeyByZXBvc2l0b3J5TmFtZSwgY29tbWl0SWQgfSkpIGFzIHtcbiAgICBjb21taXQ/OiB7IGNvbW1pdHRlcj86IHsgZGF0ZT86IHN0cmluZyB9OyBhdXRob3I/OiB7IGRhdGU/OiBzdHJpbmcgfTsgcGFyZW50cz86IHN0cmluZ1tdIH07XG4gIH07XG4gIGNvbnN0IGNvbW1pdCA9IG91dC5jb21taXQ7XG4gIGNvbnN0IG1ldGEgPSB7IGRhdGU6IHRvSXNvKGNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGNvbW1pdD8uYXV0aG9yPy5kYXRlKSwgcGFyZW50czogY29tbWl0Py5wYXJlbnRzIH07XG4gIGNvbW1pdE1ldGFDYWNoZS5zZXQoY29tbWl0SWQsIG1ldGEpO1xuICByZXR1cm4gbWV0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvZGVDb21taXQocmVnaW9uOiBzdHJpbmcsIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYT86IHN0cmluZyk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBzaGE7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBvbGRlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRydW5jYXRlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBpZiAoIWN1cikgYnJlYWs7IC8vIHJlYWNoZWQgaGlzdG9yeSByb290IOKAlCB0aGUgd2hvbGUgcmFuZ2UgaXMgY292ZXJlZFxuICAgIGlmIChzaW5jZVNoYSAmJiBjdXIgPT09IHNpbmNlU2hhKSBicmVhazsgLy8gcmVhY2hlZCB0aGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kXG4gICAgaWYgKGkgPj0gTUFYX0NPTU1JVF9XQUxLKSB7IHRydW5jYXRlZCA9IHRydWU7IGJyZWFrOyB9IC8vIGhpdCB0aGUgY2FwIGJlZm9yZSB0aGUgYm91bmRhcnlcbiAgICBjb25zdCBtZXRhID0gYXdhaXQgY29kZUNvbW1pdE1ldGEocmVnaW9uLCByZXBvc2l0b3J5TmFtZSwgY3VyKTtcbiAgICBpZiAoIW1ldGE/LmRhdGUpIGJyZWFrO1xuICAgIGNvdW50Kys7XG4gICAgb2xkZXN0ID0gbWV0YS5kYXRlO1xuICAgIGlmICghc2luY2VTaGEpIGJyZWFrOyAvLyBubyByYW5nZSDihpIgc2luZ2xlIGNvbW1pdFxuICAgIGN1ciA9IG1ldGEucGFyZW50cz8uWzBdO1xuICB9XG4gIC8vIEEgdHJ1bmNhdGVkIHdhbGsgeWllbGRzIGEgY29tbWl0IE5FV0VSIHRoYW4gdGhlIHRydWUgb2xkZXN0LXVuc2hpcHBlZCBjb21taXQsXG4gIC8vIHdoaWNoIHdvdWxkIFVOREVSU1RBVEUgbGVhZCB0aW1lIOKAlCBvbWl0IHRoZSBmaWVsZHMgZW50aXJlbHkgcmF0aGVyIHRoYW4gcmVwb3J0IGFcbiAgLy8gd3JvbmcgKHRvby1zbWFsbCkgdmFsdWUuIFJlcG9ydGluZyBmYWxscyBiYWNrIHRvIGB1bmtub3duYC5cbiAgaWYgKHRydW5jYXRlZCkgcmV0dXJuIHt9O1xuICByZXR1cm4gb2xkZXN0ID8geyBjb21taXRUaW1lc3RhbXA6IG9sZGVzdCwgY29tbWl0Q291bnQ6IGNvdW50IH0gOiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUdpdEh1Yihvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmdJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEdpdEh1YlRva2VuKG9yZ0lkKTtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsXG4gICAgJ1VzZXItQWdlbnQnOiAncGlwZWxpbmUtYnVpbGRlci1mb3J3YXJkZXInLFxuICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgfTtcbiAgaWYgKHRva2VuKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgY29uc3QgcmF0ZUxpbWl0ZWQgPSAocjogUmVzcG9uc2UpID0+IHIuc3RhdHVzID09PSA0MDMgfHwgci5zdGF0dXMgPT09IDQyOTtcblxuICBpZiAoc2luY2VTaGEpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbXBhcmUvJHtzaW5jZVNoYX0uLi4ke3NoYX1gLCB7IGhlYWRlcnMgfSk7XG4gICAgaWYgKHJhdGVMaW1pdGVkKHIpKSB7IHNjbUNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgU0NNX0NPT0xET1dOX01TOyByZXR1cm4ge307IH1cbiAgICBpZiAoci5vaykge1xuICAgICAgY29uc3QgaiA9IGF3YWl0IHIuanNvbigpIGFzIHsgY29tbWl0cz86IEFycmF5PHsgY29tbWl0PzogeyBjb21taXR0ZXI/OiB7IGRhdGU/OiBzdHJpbmcgfTsgYXV0aG9yPzogeyBkYXRlPzogc3RyaW5nIH0gfSB9PiB9O1xuICAgICAgY29uc3QgY29tbWl0cyA9IEFycmF5LmlzQXJyYXkoai5jb21taXRzKSA/IGouY29tbWl0cyA6IFtdO1xuICAgICAgaWYgKGNvbW1pdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBvbGRlc3QgPSB0b0lzbyhjb21taXRzWzBdPy5jb21taXQ/LmNvbW1pdHRlcj8uZGF0ZSA/PyBjb21taXRzWzBdPy5jb21taXQ/LmF1dGhvcj8uZGF0ZSk7XG4gICAgICAgIGlmIChvbGRlc3QpIHJldHVybiB7IGNvbW1pdFRpbWVzdGFtcDogb2xkZXN0LCBjb21taXRDb3VudDogY29tbWl0cy5sZW5ndGggfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gZmFsbCB0aHJvdWdoIHRvIHNpbmdsZS1jb21taXQgcmVzb2x1dGlvblxuICB9XG4gIGNvbnN0IHIyID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbW1pdHMvJHtzaGF9YCwgeyBoZWFkZXJzIH0pO1xuICBpZiAocmF0ZUxpbWl0ZWQocjIpKSB7IHNjbUNvb2xkb3duVW50aWwgPSBEYXRlLm5vdygpICsgU0NNX0NPT0xET1dOX01TOyByZXR1cm4ge307IH1cbiAgaWYgKHIyLm9rKSB7XG4gICAgY29uc3QgaiA9IGF3YWl0IHIyLmpzb24oKSBhcyB7IGNvbW1pdD86IHsgY29tbWl0dGVyPzogeyBkYXRlPzogc3RyaW5nIH07IGF1dGhvcj86IHsgZGF0ZT86IHN0cmluZyB9IH0gfTtcbiAgICBjb25zdCBkID0gdG9Jc28oai5jb21taXQ/LmNvbW1pdHRlcj8uZGF0ZSA/PyBqLmNvbW1pdD8uYXV0aG9yPy5kYXRlKTtcbiAgICBpZiAoZCkgcmV0dXJuIHsgY29tbWl0VGltZXN0YW1wOiBkLCBjb21taXRDb3VudDogMSB9O1xuICB9XG4gIHJldHVybiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUJpdGJ1Y2tldChvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIHNoYTogc3RyaW5nKTogUHJvbWlzZTxDb21taXRJbmZvPiB7XG4gIGNvbnN0IHIgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KGBodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJHtvd25lcn0vJHtyZXBvfS9jb21taXQvJHtzaGF9YCwge1xuICAgIGhlYWRlcnM6IHsgJ1VzZXItQWdlbnQnOiAncGlwZWxpbmUtYnVpbGRlci1mb3J3YXJkZXInLCAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gIH0pO1xuICBpZiAoci5zdGF0dXMgPT09IDQyOSkgeyBzY21Db29sZG93blVudGlsID0gRGF0ZS5ub3coKSArIFNDTV9DT09MRE9XTl9NUzsgcmV0dXJuIHt9OyB9XG4gIGlmIChyLm9rKSB7XG4gICAgY29uc3QgaiA9IGF3YWl0IHIuanNvbigpIGFzIHsgZGF0ZT86IHN0cmluZyB9O1xuICAgIGNvbnN0IGQgPSB0b0lzbyhqLmRhdGUpO1xuICAgIGlmIChkKSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IGQsIGNvbW1pdENvdW50OiAxIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYGNvbW1pdFRpbWVzdGFtcGAgKyBgY29tbWl0Q291bnRgIGZvciBhIHNvdXJjZS9kZXBsb3kgZXZlbnQsIGluLWFjY291bnQsXG4gKiBiZXN0LWVmZm9ydC4gQ29tcHV0ZWQgb25jZSBwZXIgKHBpcGVsaW5lSWQsIHNoYSk7IGFkdmFuY2VzIHRoZSBwaXBlbGluZSdzIHJhbmdlXG4gKiBib3VuZGFyeSBvbmx5IG9uIHN1Y2Nlc3MuIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7fSBvbiBhbnkgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb21taXRJbmZvKHBpcGVsaW5lSWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZyB8IG51bGwsIHJlZ2lvbjogc3RyaW5nLCBzcmM6IFNvdXJjZVJlZik6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBpZiAoc3JjLnByb3ZpZGVyID09PSAndW5rbm93bicpIHJldHVybiB7fTtcbiAgY29uc3QgcmtleSA9IGAke3BpcGVsaW5lSWR9fCR7c3JjLnNoYX1gO1xuICBjb25zdCBjYWNoZWQgPSBjb21taXRSZXN1bHRDYWNoZS5nZXQocmtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgY29uc3QgcHJldiA9IGxhc3RTaGFCeVBpcGVsaW5lLmdldChwaXBlbGluZUlkKTtcbiAgY29uc3Qgc2luY2VTaGEgPSBwcmV2ICYmIHByZXYgIT09IHNyYy5zaGEgPyBwcmV2IDogdW5kZWZpbmVkO1xuXG4gIGxldCBpbmZvOiBDb21taXRJbmZvID0ge307XG4gIHRyeSB7XG4gICAgaWYgKHNyYy5wcm92aWRlciA9PT0gJ2NvZGVjb21taXQnICYmIHNyYy5yZXBvc2l0b3J5TmFtZSkge1xuICAgICAgaW5mbyA9IGF3YWl0IHJlc29sdmVDb2RlQ29tbWl0KHJlZ2lvbiwgc3JjLnJlcG9zaXRvcnlOYW1lLCBzcmMuc2hhLCBzaW5jZVNoYSk7XG4gICAgfSBlbHNlIGlmIChzcmMucHJvdmlkZXIgPT09ICdnaXRodWInICYmIHNyYy5vd25lciAmJiBzcmMucmVwbykge1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gc2NtQ29vbGRvd25VbnRpbCkgaW5mbyA9IGF3YWl0IHJlc29sdmVHaXRIdWIoc3JjLm93bmVyLCBzcmMucmVwbywgc3JjLnNoYSwgc2luY2VTaGEsIG9yZ0lkKTtcbiAgICB9IGVsc2UgaWYgKHNyYy5wcm92aWRlciA9PT0gJ2JpdGJ1Y2tldCcgJiYgc3JjLm93bmVyICYmIHNyYy5yZXBvKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBzY21Db29sZG93blVudGlsKSBpbmZvID0gYXdhaXQgcmVzb2x2ZUJpdGJ1Y2tldChzcmMub3duZXIsIHNyYy5yZXBvLCBzcmMuc2hhKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZy53YXJuKCdDb21taXQgcmVzb2x1dGlvbiBmYWlsZWQgKG9taXR0aW5nIGNvbW1pdFRpbWVzdGFtcC9jb21taXRDb3VudCknLCB7IHByb3ZpZGVyOiBzcmMucHJvdmlkZXIsIGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSB9KTtcbiAgICBpbmZvID0ge307XG4gIH1cblxuICBpZiAoaW5mby5jb21taXRUaW1lc3RhbXApIHtcbiAgICBjb21taXRSZXN1bHRDYWNoZS5zZXQocmtleSwgaW5mbyk7XG4gICAgbGFzdFNoYUJ5UGlwZWxpbmUuc2V0KHBpcGVsaW5lSWQsIHNyYy5zaGEpO1xuICB9XG4gIHJldHVybiBpbmZvO1xufVxuXG4vKiogQGludGVybmFsIFRlc3Qtb25seTogZm9yZ2V0IHJlc29sdmVkIGNvbW1pdHMsIFNDTSBjb29sZG93biBhbmQgY2FjaGVkIHRva2Vucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRTY21Gb3JUZXN0cygpOiB2b2lkIHtcbiAgY29tbWl0UmVzdWx0Q2FjaGUuY2xlYXIoKTtcbiAgbGFzdFNoYUJ5UGlwZWxpbmUuY2xlYXIoKTtcbiAgY29tbWl0TWV0YUNhY2hlLmNsZWFyKCk7XG4gIHNjbUNvb2xkb3duVW50aWwgPSAwO1xuICBnaXRodWJUb2tlbkJ5T3JnLmNsZWFyKCk7XG59XG4iXX0=
328
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NjbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDekMsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBOEIxRixvRkFBb0Y7QUFDcEYsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxnRkFBZ0Y7QUFDaEYseUNBQXlDO0FBQ3pDLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxVQUFVLENBQXFCLGlCQUFpQixDQUFDLENBQUM7QUFDaEYscUZBQXFGO0FBQ3JGLG1GQUFtRjtBQUNuRiwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDBEQUEwRDtBQUMxRCxNQUFNLGlCQUFpQixHQUFHLElBQUksVUFBVSxDQUFpQixpQkFBaUIsQ0FBQyxDQUFDO0FBQzVFLGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsdUNBQXVDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztBQUMzQywyRUFBMkU7QUFDM0UsTUFBTSxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQWdELGlCQUFpQixDQUFDLENBQUM7QUFDekcsZ0ZBQWdGO0FBQ2hGLElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3RDLHNGQUFzRjtBQUN0RixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7QUFDM0Isa0ZBQWtGO0FBQ2xGLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDO0FBRWxDLCtFQUErRTtBQUMv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RUFBRSxDQUFDO0lBQzFCLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QixnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDckIsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgeyBnZXRBdXRoVG9rZW4gfSBmcm9tICcuL2F1dGguanMnO1xuaW1wb3J0IHsgQm91bmRlZE1hcCwgQ0FDSEVfTUFYX0VOVFJJRVMsIGZldGNoV2l0aFRpbWVvdXQsIGxvYWRTZGssIGxvZyB9IGZyb20gJy4vdXRpbC5qcyc7XG5cbi8vIEluLWFjY291bnQgY29tbWl0LXJhbmdlIHJlc29sdXRpb24uXG4vLyBGb3IgYSBzb3VyY2UvZGVwbG95IGV2ZW50IGNhcnJ5aW5nIGEgY29tbWl0U2hhIHdlIHJlc29sdmUgdGhlIGNvbW1pdCB0aW1lc3RhbXBcbi8vIChhbmQgaG93IG1hbnkgY29tbWl0cyBzaGlwcGVkKSBmb3IgdGhlIHJhbmdlIHNpbmNlIHRoZSBsYXN0IHJlc29sdmVkIHNoYSBvZiB0aGVcbi8vIHNhbWUgcGlwZWxpbmUg4oCUIGVudGlyZWx5IElOLUFDQ09VTlQsIHBlciBzb3VyY2UgdHlwZTpcbi8vICAg4oCiIENvZGVDb21taXQgIOKGkiBBV1MgU0RLIEdldENvbW1pdCAod2FsayBmaXJzdC1wYXJlbnRzIGJhY2sgdG8gdGhlIGJvdW5kYXJ5KS5cbi8vICAg4oCiIEdpdEh1Yi9Db2RlQ29ubmVjdGlvbnMtR2l0SHViIOKGkiBHaXRIdWIgUkVTVCBjb21wYXJlL2NvbW1pdHMgQVBJLiBBdXRoZW50aWNhdGVkXG4vLyAgICAgd2l0aCB0aGUgb3JnJ3MgYHBpcGVsaW5lLWJ1aWxkZXIve29yZ0lkfS9naXRodWItdG9rZW5gIHNlY3JldCB3aGVuIHByZXNlbnRcbi8vICAgICAoZGVyaXZlZCBmcm9tIFBMQVRGT1JNX1NFQ1JFVF9OQU1FKSwgb3RoZXJ3aXNlIGJlc3QtZWZmb3J0IHVuYXV0aGVudGljYXRlZC5cbi8vICAg4oCiIEJpdGJ1Y2tldCAgIOKGkiBCaXRidWNrZXQgUkVTVCBjb21taXQgQVBJIChzaW5nbGUtY29tbWl0OyByYW5nZSB3YWxrIG9taXR0ZWQpLlxuLy8gVGhlIG9sZGVzdCB1bnNoaXBwZWQgY29tbWl0J3MgdGltZXN0YW1wIOKGkiBgY29tbWl0VGltZXN0YW1wYDsgdGhlIG51bWJlciBvZiBjb21taXRzXG4vLyBpbiB0aGUgcmFuZ2Ug4oaSIGBjb21taXRDb3VudGAuIEV2ZXJ5dGhpbmcgaGVyZSBpcyBCRVNULUVGRk9SVDogb24gYW55IGZhaWx1cmUgdGhlXG4vLyBmaWVsZHMgYXJlIHNpbXBseSBvbWl0dGVkIChyZXBvcnRpbmcgZmFsbHMgYmFjayB0byBgdW5rbm93bmApLiBJdCBtdXN0IE5FVkVSIGZhaWxcbi8vIHRoZSBiYXRjaC5cbi8vXG4vLyBJQU0gcmVxdWlyZWQgYnkgdGhpcyBwYXRoIChkb2N1bWVudCBvbmx5IOKAlCBncmFudGVkIG9uIHRoZSBldmVudHMgc3RhY2spOlxuLy8gICDigKIgY29kZWNvbW1pdDpHZXRDb21taXQgICAgICAgICAgICAoQ29kZUNvbW1pdCBzb3VyY2VzKVxuLy8gICDigKIgc2VjcmV0c21hbmFnZXI6R2V0U2VjcmV0VmFsdWUgb24gYHBpcGVsaW5lLWJ1aWxkZXIvKi9naXRodWItdG9rZW5gICh0b2tlbiBTQ00gc291cmNlcylcblxudHlwZSBTb3VyY2VQcm92aWRlciA9ICdnaXRodWInIHwgJ2JpdGJ1Y2tldCcgfCAnY29kZWNvbW1pdCcgfCAndW5rbm93bic7XG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVJlZiB7XG4gIHNoYTogc3RyaW5nO1xuICBwcm92aWRlcjogU291cmNlUHJvdmlkZXI7XG4gIG93bmVyPzogc3RyaW5nO1xuICByZXBvPzogc3RyaW5nO1xuICByZXBvc2l0b3J5TmFtZT86IHN0cmluZztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWl0SW5mbyB7IGNvbW1pdFRpbWVzdGFtcD86IHN0cmluZzsgY29tbWl0Q291bnQ/OiBudW1iZXIgfVxuXG4vLyBQZXItKHBpcGVsaW5lLHNoYSkgcmVzb2x2ZWQgcmVzdWx0IOKAlCBjb21wdXRlZCBvbmNlLCByZXVzZWQgYWNyb3NzIHRoZSBtYW55IGV2ZW50c1xuLy8gKFBJUEVMSU5FL1NUQUdFL0FDVElPTikgdGhhdCBzaGFyZSBhIHNvdXJjZSByZXZpc2lvbiBhbmQgYWNyb3NzIHJlZGVsaXZlcmllcy5cbi8vIE9ubHkgUkVTT0xWRUQgcmVzdWx0cyBhcmUgY2FjaGVkIOKAlCBhbiBlbXB0eSBge31gIChTQ00gY29vbGRvd24sIGEgdGltZW91dCwgYVxuLy8gNDA0IGZyb20gYSByZXBvIHdob3NlIHRva2VuIHdhcyBqdXN0IGFkZGVkKSBtdXN0IG5vdCBwaW4gXCJubyBjb21taXQgaW5mb1wiIGZvclxuLy8gdGhhdCBzaGEgZm9yIHRoZSBjb250YWluZXIncyBsaWZldGltZS5cbmNvbnN0IGNvbW1pdFJlc3VsdENhY2hlID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCBDb21taXRJbmZvPihDQUNIRV9NQVhfRU5UUklFUyk7XG4vLyBMYXN0IHNoYSB3ZSBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgcGVyIHBpcGVsaW5lIOKAlCB0aGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kIGZvciB0aGVcbi8vIG5leHQgcmFuZ2UgKFwiY29tbWl0cyBzaW5jZSB0aGUgbGFzdCBkZXBsb3lcIikuIEluLW1lbW9yeSwgc28gYSBjb2xkIHN0YXJ0IGVtcHRpZXNcbi8vIGl0OyBgZmV0Y2hMYXN0RGVwbG95ZWRTaGFgIHRoZW4gcmVhZHMgdGhlIGJvdW5kIGJhY2sgZnJvbSB0aGUgcmVwb3J0aW5nIEFQSSxcbi8vIGJlY2F1c2UgcmVzb2x2aW5nIGFzIGEgc2luZ2xlIGNvbW1pdCBtYWRlIGxlYWQgdGltZSBhbmQgY29tbWl0Q291bnQgZmFyIHRvb1xuLy8gc21hbGwgb24gZXZlcnkgZnJlc2ggY29udGFpbmVyIOKAlCB3aGljaCBpcyBtb3N0IG9mIHRoZW0uXG5jb25zdCBsYXN0U2hhQnlQaXBlbGluZSA9IG5ldyBCb3VuZGVkTWFwPHN0cmluZywgc3RyaW5nPihDQUNIRV9NQVhfRU5UUklFUyk7XG4vLyBQaXBlbGluZXMgd2hvc2UgYm91bmQgd2UgYWxyZWFkeSBhc2tlZCB0aGUgcmVwb3J0aW5nIEFQSSBmb3IgYW5kIGl0IGhhZCBub25lLlxuLy8gV2l0aG91dCB0aGlzLCBhIHBpcGVsaW5lIHRoYXQgZ2VudWluZWx5IGhhcyBuZXZlciBkZXBsb3llZCByZS1hc2tzIG9uIGV2ZXJ5XG4vLyBldmVudCBmb3IgdGhlIGxpZmUgb2YgdGhlIGNvbnRhaW5lci5cbmNvbnN0IG5vUmVjb3JkZWREZXBsb3kgPSBuZXcgU2V0PHN0cmluZz4oKTtcbi8vIFBlci1zaGEgQ29kZUNvbW1pdCBtZXRhZGF0YSBjYWNoZSAoZGF0ZSArIGZpcnN0LXBhcmVudCkgZm9yIHJhbmdlIHdhbGtzLlxuY29uc3QgY29tbWl0TWV0YUNhY2hlID0gbmV3IEJvdW5kZWRNYXA8c3RyaW5nLCB7IGRhdGU/OiBzdHJpbmc7IHBhcmVudHM/OiBzdHJpbmdbXSB9PihDQUNIRV9NQVhfRU5UUklFUyk7XG4vLyBTQ00gcmF0ZS1saW1pdCBjb29sZG93bjogYWZ0ZXIgYSA0MDMvNDI5IHdlIHN0b3AgY2FsbGluZyB0aGUgU0NNIGZvciBhIHdoaWxlLlxubGV0IHNjbUNvb2xkb3duVW50aWwgPSAwO1xuY29uc3QgU0NNX0NPT0xET1dOX01TID0gMiAqIDYwICogMTAwMDtcbi8vIENhcCB0aGUgQ29kZUNvbW1pdCBmaXJzdC1wYXJlbnQgd2FsayBzbyBhIGxvbmcgcmFuZ2UgY2FuJ3QgYmxvdyB0aGUgTGFtYmRhIHRpbWVvdXQuXG5jb25zdCBNQVhfQ09NTUlUX1dBTEsgPSA1MDtcbi8vIFBlci1yZXF1ZXN0IHRpbWVvdXQgZm9yIGV4dGVybmFsIFNDTSBjYWxscyAoZGVmZW5zaXZlIGFnYWluc3Qgc2xvdy9odW5nIGhvc3RzKS5cbmNvbnN0IFNDTV9GRVRDSF9USU1FT1VUX01TID0gMzAwMDtcblxuLy8gVGhlIGZvcndhcmRlciBpcyBhIGZsZWV0IExhbWJkYTogb25lIHdhcm0gY29udGFpbmVyIHJlc29sdmVzIGV2ZW50cyBmb3IgTUFOWVxuLy8gb3Jncywgc28gdGhlIEdpdEh1YiB0b2tlbiBNVVNUIGJlIGtleWVkIGJ5IHRoZSBldmVudCdzIHJlc29sdmVkIG9yZyAobm90IGEgc2luZ2xlXG4vLyBjb250YWluZXItZ2xvYmFsIHRva2VuKS4gRWFjaCBvcmcncyB0b2tlbiBsaXZlcyBhdCBgPHByZWZpeD4vPG9yZ0lkPi9naXRodWItdG9rZW5gLFxuLy8gZGVyaXZlZCBmcm9tIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIChgPHByZWZpeD4vPGNvbnRhaW5lck9yZz4vcGxhdGZvcm1gKS4gbnVsbCBjYWNoZXNcbi8vIGEgZGVmaW5pdGl2ZSBtaXNzIChubyBzZWNyZXQgLyByZWFkIGZhaWxlZCkg4oaSIHVuYXV0aGVudGljYXRlZCBiZXN0LWVmZm9ydC5cbmNvbnN0IGdpdGh1YlRva2VuQnlPcmcgPSBuZXcgQm91bmRlZE1hcDxzdHJpbmcsIHN0cmluZyB8IG51bGw+KENBQ0hFX01BWF9FTlRSSUVTKTtcblxuLyoqXG4gKiBEZXJpdmUgYSBzcGVjaWZpYyBvcmcncyBnaXRodWItdG9rZW4gc2VjcmV0IG5hbWUgZnJvbSBQTEFURk9STV9TRUNSRVRfTkFNRVxuICogKGA8cHJlZml4Pi88Y29udGFpbmVyT3JnPi9wbGF0Zm9ybWApLiBXaXRoIGFuIGBvcmdJZGAgd2Ugc3dhcCB0aGUgb3JnIHNlZ21lbnRcbiAqIChgPHByZWZpeD4vPG9yZ0lkPi9naXRodWItdG9rZW5gKTsgd2l0aG91dCBvbmUgKHBpcGVsaW5lIGNhcnJpZWQgbm8gT3JnSWQgdGFnKSB3ZVxuICogZmFsbCBiYWNrIHRvIHRoZSBjb250YWluZXIncyBvd24gc2libGluZyBzZWNyZXQuIFJldHVybnMgdW5kZWZpbmVkIHdoZW5cbiAqIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIGlzbid0IHRoZSBleHBlY3RlZCBgLi4uL3BsYXRmb3JtYCBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gZ2l0aHViVG9rZW5TZWNyZXROYW1lKG9yZ0lkOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbmFtZSA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1NFQ1JFVF9OQU1FO1xuICBpZiAoIW5hbWUgfHwgIW5hbWUuZW5kc1dpdGgoJy9wbGF0Zm9ybScpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBiYXNlID0gbmFtZS5zbGljZSgwLCAtJy9wbGF0Zm9ybScubGVuZ3RoKTsgLy8gPHByZWZpeD4vPGNvbnRhaW5lck9yZz5cbiAgaWYgKG9yZ0lkKSB7XG4gICAgY29uc3Qgc2xhc2ggPSBiYXNlLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgY29uc3QgcHJlZml4ID0gc2xhc2ggPiAwID8gYmFzZS5zbGljZSgwLCBzbGFzaCkgOiBiYXNlO1xuICAgIHJldHVybiBgJHtwcmVmaXh9LyR7b3JnSWR9L2dpdGh1Yi10b2tlbmA7XG4gIH1cbiAgcmV0dXJuIGAke2Jhc2V9L2dpdGh1Yi10b2tlbmA7XG59XG5cbi8qKiBSZWFkIChhbmQgY2FjaGUsIHBlciBvcmcpIHRoZSBvcmcgZ2l0aHViIHRva2VuOyBudWxsIOKGkiB1bmF1dGhlbnRpY2F0ZWQgYmVzdC1lZmZvcnQuICovXG5hc3luYyBmdW5jdGlvbiBnZXRHaXRIdWJUb2tlbihvcmdJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBrZXkgPSBvcmdJZCA/PyAnJztcbiAgY29uc3QgY2FjaGVkID0gZ2l0aHViVG9rZW5CeU9yZy5nZXQoa2V5KTtcbiAgaWYgKGNhY2hlZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gY2FjaGVkO1xuICBjb25zdCBzZWNyZXROYW1lID0gZ2l0aHViVG9rZW5TZWNyZXROYW1lKG9yZ0lkKTtcbiAgaWYgKCFzZWNyZXROYW1lKSB7IGdpdGh1YlRva2VuQnlPcmcuc2V0KGtleSwgbnVsbCk7IHJldHVybiBudWxsOyB9XG4gIGxldCB0b2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgdHJ5IHtcbiAgICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG4gICAgLy8gVGhlIGdpdGh1Yi10b2tlbiBzZWNyZXQgaXMgYSBSQVcgdG9rZW4gc3RyaW5nIChub3QgSlNPTiDigJQgQ0RLIHJlc29sdmVzIGl0IHZpYVxuICAgIC8vIHRoZSBkZWZhdWx0IFNlY3JldFN0cmluZyB3aXRoIG5vIGtleSkuXG4gICAgdG9rZW4gPSByZXMuU2VjcmV0U3RyaW5nICYmIHJlcy5TZWNyZXRTdHJpbmcubGVuZ3RoID4gMCA/IHJlcy5TZWNyZXRTdHJpbmcudHJpbSgpIDogbnVsbDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ05vIGdpdGh1Yi10b2tlbiBzZWNyZXQg4oCUIEdpdEh1YiBjb21taXQgcmVzb2x1dGlvbiB3aWxsIGJlIHVuYXV0aGVudGljYXRlZCcsIHsgb3JnSWQsIGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSB9KTtcbiAgICB0b2tlbiA9IG51bGw7XG4gIH1cbiAgZ2l0aHViVG9rZW5CeU9yZy5zZXQoa2V5LCB0b2tlbik7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuLyoqIE5vcm1hbGl6ZSBhIGNvbW1pdCBkYXRlIHRvIElTTyA4NjAxLiBBY2NlcHRzIElTTyBzdHJpbmdzIGFuZCBDb2RlQ29tbWl0J3NcbiAqICBcIjxlcG9jaC1zZWNvbmRzPiArWlpaWlwiIGZvcm0uIFJldHVybnMgdW5kZWZpbmVkIHdoZW4gdW5wYXJzZWFibGUuICovXG5mdW5jdGlvbiB0b0lzbyh2YWx1ZTogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXBvY2ggPSAvXihcXGR7OSx9KVxcYi8uZXhlYyh2YWx1ZS50cmltKCkpO1xuICBpZiAoZXBvY2gpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoTnVtYmVyKGVwb2NoWzFdKSAqIDEwMDApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xuICB9XG4gIGNvbnN0IGQgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZC5nZXRUaW1lKCkpID8gdW5kZWZpbmVkIDogZC50b0lTT1N0cmluZygpO1xufVxuXG4vKiogQ2xhc3NpZnkgYSBzb3VyY2UtcmV2aXNpb24gVVJMIGludG8gYSBwcm92aWRlciArIHJlcG8gY29vcmRpbmF0ZXMuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NpZnlTb3VyY2UodXJsOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBPbWl0PFNvdXJjZVJlZiwgJ3NoYSc+IHtcbiAgaWYgKCF1cmwpIHJldHVybiB7IHByb3ZpZGVyOiAndW5rbm93bicgfTtcbiAgdHJ5IHtcbiAgICBjb25zdCB1ID0gbmV3IFVSTCh1cmwpO1xuICAgIGNvbnN0IGhvc3QgPSB1Lmhvc3RuYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKGhvc3QgPT09ICdnaXRodWIuY29tJyB8fCBob3N0LmVuZHNXaXRoKCcuZ2l0aHViLmNvbScpKSB7XG4gICAgICBjb25zdCBwYXJ0cyA9IHUucGF0aG5hbWUuc3BsaXQoJy8nKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgICBpZiAocGFydHMubGVuZ3RoID49IDIpIHJldHVybiB7IHByb3ZpZGVyOiAnZ2l0aHViJywgb3duZXI6IHBhcnRzWzBdLCByZXBvOiBwYXJ0c1sxXS5yZXBsYWNlKC9cXC5naXQkLywgJycpIH07XG4gICAgfVxuICAgIGlmIChob3N0ID09PSAnYml0YnVja2V0Lm9yZycpIHtcbiAgICAgIGNvbnN0IHBhcnRzID0gdS5wYXRobmFtZS5zcGxpdCgnLycpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPj0gMikgcmV0dXJuIHsgcHJvdmlkZXI6ICdiaXRidWNrZXQnLCBvd25lcjogcGFydHNbMF0sIHJlcG86IHBhcnRzWzFdLnJlcGxhY2UoL1xcLmdpdCQvLCAnJykgfTtcbiAgICB9XG4gICAgaWYgKHUucGF0aG5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnY29kZWNvbW1pdCcpIHx8IHUuaGFzaC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdjb2RlY29tbWl0JykgfHwgdS5wYXRobmFtZS5pbmNsdWRlcygnL3JlcG9zaXRvcmllcy8nKSkge1xuICAgICAgY29uc3QgbSA9IC9yZXBvc2l0b3IoPzp5fGllcylcXC8oW14vIz9dKykvLmV4ZWModS5wYXRobmFtZSArIHUuaGFzaCk7XG4gICAgICBpZiAobSkgcmV0dXJuIHsgcHJvdmlkZXI6ICdjb2RlY29tbWl0JywgcmVwb3NpdG9yeU5hbWU6IGRlY29kZVVSSUNvbXBvbmVudChtWzFdKSB9O1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gbm90IGEgVVJMIOKGkiB1bmtub3duXG4gIH1cbiAgcmV0dXJuIHsgcHJvdmlkZXI6ICd1bmtub3duJyB9O1xufVxuXG5sZXQgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbjogTWFwPHN0cmluZywgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPHVua25vd24+IH0+IHwgdW5kZWZpbmVkO1xuaW50ZXJmYWNlIENvZGVDb21taXRNb2R1bGUge1xuICBDb2RlQ29tbWl0Q2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiB7IHNlbmQoY29tbWFuZDogdW5rbm93bik6IFByb21pc2U8dW5rbm93bj4gfTtcbiAgR2V0Q29tbWl0Q29tbWFuZDogbmV3IChpbnB1dDogeyByZXBvc2l0b3J5TmFtZTogc3RyaW5nOyBjb21taXRJZDogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZWNvbW1pdE1vZDogQ29kZUNvbW1pdE1vZHVsZSB8IHVuZGVmaW5lZDtcbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRDbGllbnQocmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB9PiB7XG4gIGlmICghY29kZWNvbW1pdE1vZCkgY29kZWNvbW1pdE1vZCA9IGF3YWl0IGxvYWRTZGs8Q29kZUNvbW1pdE1vZHVsZT4oJ0Bhd3Mtc2RrL2NsaWVudC1jb2RlY29tbWl0Jyk7XG4gIGlmICghY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbikgY29kZWNvbW1pdENsaWVudHNCeVJlZ2lvbiA9IG5ldyBNYXAoKTtcbiAgbGV0IGNsaWVudCA9IGNvZGVjb21taXRDbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY2xpZW50ID0gbmV3IGNvZGVjb21taXRNb2QuQ29kZUNvbW1pdENsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjb2RlY29tbWl0Q2xpZW50c0J5UmVnaW9uLnNldChyZWdpb24sIGNsaWVudCk7XG4gIH1cbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqIEZldGNoIChjYWNoZWQpIGEgc2luZ2xlIENvZGVDb21taXQgY29tbWl0J3MgZGF0ZSArIGZpcnN0IHBhcmVudHMgdmlhIEdldENvbW1pdC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvZGVDb21taXRNZXRhKHJlZ2lvbjogc3RyaW5nLCByZXBvc2l0b3J5TmFtZTogc3RyaW5nLCBjb21taXRJZDogc3RyaW5nKTogUHJvbWlzZTx7IGRhdGU/OiBzdHJpbmc7IHBhcmVudHM/OiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGNvbW1pdE1ldGFDYWNoZS5nZXQoY29tbWl0SWQpO1xuICBpZiAoY2FjaGVkKSByZXR1cm4gY2FjaGVkO1xuICBpZiAoIWNvZGVjb21taXRNb2QpIGNvZGVjb21taXRNb2QgPSBhd2FpdCBsb2FkU2RrPENvZGVDb21taXRNb2R1bGU+KCdAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdCcpO1xuICBjb25zdCBjbGllbnQgPSBhd2FpdCBjb2RlQ29tbWl0Q2xpZW50KHJlZ2lvbik7XG4gIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBjb2RlY29tbWl0TW9kLkdldENvbW1pdENvbW1hbmQoeyByZXBvc2l0b3J5TmFtZSwgY29tbWl0SWQgfSkpIGFzIHtcbiAgICBjb21taXQ/OiB7IGNvbW1pdHRlcj86IHsgZGF0ZT86IHN0cmluZyB9OyBhdXRob3I/OiB7IGRhdGU/OiBzdHJpbmcgfTsgcGFyZW50cz86IHN0cmluZ1tdIH07XG4gIH07XG4gIGNvbnN0IGNvbW1pdCA9IG91dC5jb21taXQ7XG4gIGNvbnN0IG1ldGEgPSB7IGRhdGU6IHRvSXNvKGNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGNvbW1pdD8uYXV0aG9yPy5kYXRlKSwgcGFyZW50czogY29tbWl0Py5wYXJlbnRzIH07XG4gIGNvbW1pdE1ldGFDYWNoZS5zZXQoY29tbWl0SWQsIG1ldGEpO1xuICByZXR1cm4gbWV0YTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvZGVDb21taXQocmVnaW9uOiBzdHJpbmcsIHJlcG9zaXRvcnlOYW1lOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYT86IHN0cmluZyk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBsZXQgY3VyOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBzaGE7XG4gIGxldCBjb3VudCA9IDA7XG4gIGxldCBvbGRlc3Q6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRydW5jYXRlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgOyBpKyspIHtcbiAgICBpZiAoIWN1cikgYnJlYWs7IC8vIHJlYWNoZWQgaGlzdG9yeSByb290IOKAlCB0aGUgd2hvbGUgcmFuZ2UgaXMgY292ZXJlZFxuICAgIGlmIChzaW5jZVNoYSAmJiBjdXIgPT09IHNpbmNlU2hhKSBicmVhazsgLy8gcmVhY2hlZCB0aGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kXG4gICAgaWYgKGkgPj0gTUFYX0NPTU1JVF9XQUxLKSB7IHRydW5jYXRlZCA9IHRydWU7IGJyZWFrOyB9IC8vIGhpdCB0aGUgY2FwIGJlZm9yZSB0aGUgYm91bmRhcnlcbiAgICBjb25zdCBtZXRhID0gYXdhaXQgY29kZUNvbW1pdE1ldGEocmVnaW9uLCByZXBvc2l0b3J5TmFtZSwgY3VyKTtcbiAgICBpZiAoIW1ldGE/LmRhdGUpIGJyZWFrO1xuICAgIGNvdW50Kys7XG4gICAgb2xkZXN0ID0gbWV0YS5kYXRlO1xuICAgIGlmICghc2luY2VTaGEpIGJyZWFrOyAvLyBubyByYW5nZSDihpIgc2luZ2xlIGNvbW1pdFxuICAgIGN1ciA9IG1ldGEucGFyZW50cz8uWzBdO1xuICB9XG4gIC8vIEEgdHJ1bmNhdGVkIHdhbGsgeWllbGRzIGEgY29tbWl0IE5FV0VSIHRoYW4gdGhlIHRydWUgb2xkZXN0LXVuc2hpcHBlZCBjb21taXQsXG4gIC8vIHdoaWNoIHdvdWxkIFVOREVSU1RBVEUgbGVhZCB0aW1lIOKAlCBvbWl0IHRoZSBmaWVsZHMgZW50aXJlbHkgcmF0aGVyIHRoYW4gcmVwb3J0IGFcbiAgLy8gd3JvbmcgKHRvby1zbWFsbCkgdmFsdWUuIFJlcG9ydGluZyBmYWxscyBiYWNrIHRvIGB1bmtub3duYC5cbiAgaWYgKHRydW5jYXRlZCkgcmV0dXJuIHt9O1xuICByZXR1cm4gb2xkZXN0ID8geyBjb21taXRUaW1lc3RhbXA6IG9sZGVzdCwgY29tbWl0Q291bnQ6IGNvdW50IH0gOiB7fTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUdpdEh1Yihvd25lcjogc3RyaW5nLCByZXBvOiBzdHJpbmcsIHNoYTogc3RyaW5nLCBzaW5jZVNoYTogc3RyaW5nIHwgdW5kZWZpbmVkLCBvcmdJZDogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEdpdEh1YlRva2VuKG9yZ0lkKTtcbiAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL3ZuZC5naXRodWIranNvbicsXG4gICAgJ1VzZXItQWdlbnQnOiAncGlwZWxpbmUtYnVpbGRlci1mb3J3YXJkZXInLFxuICAgICdYLUdpdEh1Yi1BcGktVmVyc2lvbic6ICcyMDIyLTExLTI4JyxcbiAgfTtcbiAgaWYgKHRva2VuKSBoZWFkZXJzLkF1dGhvcml6YXRpb24gPSBgQmVhcmVyICR7dG9rZW59YDtcbiAgY29uc3QgcmF0ZUxpbWl0ZWQgPSAocjogUmVzcG9uc2UpID0+IHIuc3RhdHVzID09PSA0MDMgfHwgci5zdGF0dXMgPT09IDQyOTtcblxuICBpZiAoc2luY2VTaGEpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2hXaXRoVGltZW91dChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke293bmVyfS8ke3JlcG99L2NvbXBhcmUvJHtzaW5jZVNoYX0uLi4ke3NoYX1gLCB7IGhlYWRlcnMgfSwgU0NNX0ZFVENIX1RJTUVPVVRfTVMpO1xuICAgIGlmIChyYXRlTGltaXRlZChyKSkgeyBzY21Db29sZG93blVudGlsID0gRGF0ZS5ub3coKSArIFNDTV9DT09MRE9XTl9NUzsgcmV0dXJuIHt9OyB9XG4gICAgaWYgKHIub2spIHtcbiAgICAgIGNvbnN0IGogPSBhd2FpdCByLmpzb24oKSBhcyB7IGNvbW1pdHM/OiBBcnJheTx7IGNvbW1pdD86IHsgY29tbWl0dGVyPzogeyBkYXRlPzogc3RyaW5nIH07IGF1dGhvcj86IHsgZGF0ZT86IHN0cmluZyB9IH0gfT4gfTtcbiAgICAgIGNvbnN0IGNvbW1pdHMgPSBBcnJheS5pc0FycmF5KGouY29tbWl0cykgPyBqLmNvbW1pdHMgOiBbXTtcbiAgICAgIGlmIChjb21taXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3Qgb2xkZXN0ID0gdG9Jc28oY29tbWl0c1swXT8uY29tbWl0Py5jb21taXR0ZXI/LmRhdGUgPz8gY29tbWl0c1swXT8uY29tbWl0Py5hdXRob3I/LmRhdGUpO1xuICAgICAgICBpZiAob2xkZXN0KSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IG9sZGVzdCwgY29tbWl0Q291bnQ6IGNvbW1pdHMubGVuZ3RoIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIGZhbGwgdGhyb3VnaCB0byBzaW5nbGUtY29tbWl0IHJlc29sdXRpb25cbiAgfVxuICBjb25zdCByMiA9IGF3YWl0IGZldGNoV2l0aFRpbWVvdXQoYGh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvJHtvd25lcn0vJHtyZXBvfS9jb21taXRzLyR7c2hhfWAsIHsgaGVhZGVycyB9LCBTQ01fRkVUQ0hfVElNRU9VVF9NUyk7XG4gIGlmIChyYXRlTGltaXRlZChyMikpIHsgc2NtQ29vbGRvd25VbnRpbCA9IERhdGUubm93KCkgKyBTQ01fQ09PTERPV05fTVM7IHJldHVybiB7fTsgfVxuICBpZiAocjIub2spIHtcbiAgICBjb25zdCBqID0gYXdhaXQgcjIuanNvbigpIGFzIHsgY29tbWl0PzogeyBjb21taXR0ZXI/OiB7IGRhdGU/OiBzdHJpbmcgfTsgYXV0aG9yPzogeyBkYXRlPzogc3RyaW5nIH0gfSB9O1xuICAgIGNvbnN0IGQgPSB0b0lzbyhqLmNvbW1pdD8uY29tbWl0dGVyPy5kYXRlID8/IGouY29tbWl0Py5hdXRob3I/LmRhdGUpO1xuICAgIGlmIChkKSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IGQsIGNvbW1pdENvdW50OiAxIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQml0YnVja2V0KG93bmVyOiBzdHJpbmcsIHJlcG86IHN0cmluZywgc2hhOiBzdHJpbmcpOiBQcm9taXNlPENvbW1pdEluZm8+IHtcbiAgY29uc3QgciA9IGF3YWl0IGZldGNoV2l0aFRpbWVvdXQoYGh0dHBzOi8vYXBpLmJpdGJ1Y2tldC5vcmcvMi4wL3JlcG9zaXRvcmllcy8ke293bmVyfS8ke3JlcG99L2NvbW1pdC8ke3NoYX1gLCB7XG4gICAgaGVhZGVyczogeyAnVXNlci1BZ2VudCc6ICdwaXBlbGluZS1idWlsZGVyLWZvcndhcmRlcicsICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgfSwgU0NNX0ZFVENIX1RJTUVPVVRfTVMpO1xuICBpZiAoci5zdGF0dXMgPT09IDQyOSkgeyBzY21Db29sZG93blVudGlsID0gRGF0ZS5ub3coKSArIFNDTV9DT09MRE9XTl9NUzsgcmV0dXJuIHt9OyB9XG4gIGlmIChyLm9rKSB7XG4gICAgY29uc3QgaiA9IGF3YWl0IHIuanNvbigpIGFzIHsgZGF0ZT86IHN0cmluZyB9O1xuICAgIGNvbnN0IGQgPSB0b0lzbyhqLmRhdGUpO1xuICAgIGlmIChkKSByZXR1cm4geyBjb21taXRUaW1lc3RhbXA6IGQsIGNvbW1pdENvdW50OiAxIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYGNvbW1pdFRpbWVzdGFtcGAgKyBgY29tbWl0Q291bnRgIGZvciBhIHNvdXJjZS9kZXBsb3kgZXZlbnQsIGluLWFjY291bnQsXG4gKiBiZXN0LWVmZm9ydC4gQ29tcHV0ZWQgb25jZSBwZXIgKHBpcGVsaW5lSWQsIHNoYSk7IGFkdmFuY2VzIHRoZSBwaXBlbGluZSdzIHJhbmdlXG4gKiBib3VuZGFyeSBvbmx5IG9uIHN1Y2Nlc3MuIE5ldmVyIHRocm93cyDigJQgcmV0dXJucyB7fSBvbiBhbnkgZmFpbHVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDb21taXRJbmZvKHBpcGVsaW5lSWQ6IHN0cmluZywgb3JnSWQ6IHN0cmluZyB8IG51bGwsIHJlZ2lvbjogc3RyaW5nLCBzcmM6IFNvdXJjZVJlZik6IFByb21pc2U8Q29tbWl0SW5mbz4ge1xuICBpZiAoc3JjLnByb3ZpZGVyID09PSAndW5rbm93bicpIHJldHVybiB7fTtcbiAgY29uc3QgcmtleSA9IGAke3BpcGVsaW5lSWR9fCR7c3JjLnNoYX1gO1xuICBjb25zdCBjYWNoZWQgPSBjb21taXRSZXN1bHRDYWNoZS5nZXQocmtleSk7XG4gIGlmIChjYWNoZWQpIHJldHVybiBjYWNoZWQ7XG5cbiAgLy8gQ29sZC1zdGFydCByZWNvdmVyeTogbm90aGluZyBpbiB0aGlzIGNvbnRhaW5lcidzIG1lbW9yeSwgc28gYXNrIHRoZSByZXBvcnRpbmdcbiAgLy8gQVBJIHdoYXQgdGhpcyBwaXBlbGluZSBsYXN0IHNoaXBwZWQuIFdpdGhvdXQgaXQgdGhlIHJhbmdlIGJlbG93IGNvbGxhcHNlcyB0b1xuICAvLyB0aGUgc2luZ2xlIG5ld2VzdCBjb21taXQuXG4gIGNvbnN0IHByZXYgPSBsYXN0U2hhQnlQaXBlbGluZS5nZXQocGlwZWxpbmVJZCkgPz8gYXdhaXQgZmV0Y2hMYXN0RGVwbG95ZWRTaGEocGlwZWxpbmVJZCk7XG4gIGNvbnN0IHNpbmNlU2hhID0gcHJldiAmJiBwcmV2ICE9PSBzcmMuc2hhID8gcHJldiA6IHVuZGVmaW5lZDtcblxuICBsZXQgaW5mbzogQ29tbWl0SW5mbyA9IHt9O1xuICB0cnkge1xuICAgIGlmIChzcmMucHJvdmlkZXIgPT09ICdjb2RlY29tbWl0JyAmJiBzcmMucmVwb3NpdG9yeU5hbWUpIHtcbiAgICAgIGluZm8gPSBhd2FpdCByZXNvbHZlQ29kZUNvbW1pdChyZWdpb24sIHNyYy5yZXBvc2l0b3J5TmFtZSwgc3JjLnNoYSwgc2luY2VTaGEpO1xuICAgIH0gZWxzZSBpZiAoc3JjLnByb3ZpZGVyID09PSAnZ2l0aHViJyAmJiBzcmMub3duZXIgJiYgc3JjLnJlcG8pIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID49IHNjbUNvb2xkb3duVW50aWwpIGluZm8gPSBhd2FpdCByZXNvbHZlR2l0SHViKHNyYy5vd25lciwgc3JjLnJlcG8sIHNyYy5zaGEsIHNpbmNlU2hhLCBvcmdJZCk7XG4gICAgfSBlbHNlIGlmIChzcmMucHJvdmlkZXIgPT09ICdiaXRidWNrZXQnICYmIHNyYy5vd25lciAmJiBzcmMucmVwbykge1xuICAgICAgaWYgKERhdGUubm93KCkgPj0gc2NtQ29vbGRvd25VbnRpbCkgaW5mbyA9IGF3YWl0IHJlc29sdmVCaXRidWNrZXQoc3JjLm93bmVyLCBzcmMucmVwbywgc3JjLnNoYSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2cud2FybignQ29tbWl0IHJlc29sdXRpb24gZmFpbGVkIChvbWl0dGluZyBjb21taXRUaW1lc3RhbXAvY29tbWl0Q291bnQpJywgeyBwcm92aWRlcjogc3JjLnByb3ZpZGVyLCBlcnJvcjogKGVyciBhcyB7IG5hbWU/OiBzdHJpbmcgfSk/Lm5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgaW5mbyA9IHt9O1xuICB9XG5cbiAgaWYgKGluZm8uY29tbWl0VGltZXN0YW1wKSB7XG4gICAgY29tbWl0UmVzdWx0Q2FjaGUuc2V0KHJrZXksIGluZm8pO1xuICAgIGxhc3RTaGFCeVBpcGVsaW5lLnNldChwaXBlbGluZUlkLCBzcmMuc2hhKTtcbiAgfVxuICByZXR1cm4gaW5mbztcbn1cblxuLyoqXG4gKiBUaGUgZXhjbHVzaXZlIGxvd2VyIGJvdW5kIGZyb20gZHVyYWJsZSBzdG9yYWdlLCBmb3IgYSBjb250YWluZXIgd2hvc2UgbWVtb3J5IGlzXG4gKiBlbXB0eS4gQmVzdC1lZmZvcnQ6IG9uIEFOWSBmYWlsdXJlIHRoaXMgcmV0dXJucyB1bmRlZmluZWQgYW5kIHRoZSBjYWxsZXIgcmVzb2x2ZXNcbiAqIGEgc2luZ2xlIGNvbW1pdCBleGFjdGx5IGFzIGJlZm9yZSwgc28gYSByZXBvcnRpbmctQVBJIGJsaXAgZGVncmFkZXMgbGVhZCB0aW1lXG4gKiByYXRoZXIgdGhhbiBmYWlsaW5nIHRoZSBiYXRjaCAod2hpY2ggd291bGQgcmVkZWxpdmVyIGFscmVhZHktZm9yd2FyZGVkIGV2ZW50cykuXG4gKlxuICogTm8gYGVudmlyb25tZW50YCBpcyBzZW50OiB0aGlzIHJ1bnMgd2hpbGUgaGFuZGxpbmcgdGhlIFNPVVJDRSBldmVudCwgYW5kIHRoZVxuICogZXhlY3V0aW9uIGhhcyBub3QgcmVhY2hlZCBhIGRlcGxveSBzdGFnZSB5ZXQsIHNvIHRoZSBlbnZpcm9ubWVudCBpcyBub3QgeWV0XG4gKiBrbm93bi4gVGhlIEFQSSB0aGVuIGFuc3dlcnMgXCJsYXN0IHNoaXBwZWQgYW55d2hlcmVcIiwgd2hpY2ggaXMgdGhlIGNvcnJlY3QgYm91bmRcbiAqIGZvciBhbiBTQ00gcmFuZ2Ugd2Fsay5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hMYXN0RGVwbG95ZWRTaGEocGlwZWxpbmVJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgYmFzZVVybCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMO1xuICBpZiAoIWJhc2VVcmwgfHwgbm9SZWNvcmRlZERlcGxveS5oYXMocGlwZWxpbmVJZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgLy8gVGhlIHBhY2thZ2UncyBSRVBPUlRJTkcgYnVkZ2V0LCBkZWxpYmVyYXRlbHksIG5vdCBTQ01fRkVUQ0hfVElNRU9VVF9NUzogdGhpcyBpcyBhXG4gICAgLy8gY2FsbCB0byBvdXIgb3duIHJlcG9ydGluZyBzZXJ2aWNlLCBhbmQgdGhlIHRpZ2h0ZXIgU0NNIGRlYWRsaW5lIGV4aXN0cyBmb3JcbiAgICAvLyB0aGlyZC1wYXJ0eSBmb3JnZXMgd2UgY2Fubm90IHJlYXNvbiBhYm91dC5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaFdpdGhUaW1lb3V0KFxuICAgICAgYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzL2xhc3QtZGVwbG95LWNvbW1pdD9waXBlbGluZUlkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBpcGVsaW5lSWQpfWAsXG4gICAgICB7IGhlYWRlcnM6IHsgQXV0aG9yaXphdGlvbjogYEJlYXJlciAke2F3YWl0IGdldEF1dGhUb2tlbigpfWAsIEFjY2VwdDogJ2FwcGxpY2F0aW9uL2pzb24nIH0gfSxcbiAgICApO1xuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBsb2cud2FybignTGFzdC1kZXBsb3ktY29tbWl0IGxvb2t1cCBmYWlsZWQ7IHJlc29sdmluZyBhIHNpbmdsZSBjb21taXQnLCB7IHN0YXR1czogcmVzLnN0YXR1cyB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXMuanNvbigpIGFzIHsgZGF0YT86IHsgY29tbWl0U2hhPzogc3RyaW5nIHwgbnVsbCB9IH07XG4gICAgY29uc3Qgc2hhID0gYm9keS5kYXRhPy5jb21taXRTaGEgPz8gdW5kZWZpbmVkO1xuICAgIGlmICghc2hhKSB7XG4gICAgICAvLyBBIHJlYWwgXCJuZXZlciBkZXBsb3llZFwiIGFuc3dlciDigJQgcmVtZW1iZXIgaXQgc28gd2UgYXNrIG9uY2UgcGVyIGNvbnRhaW5lci5cbiAgICAgIG5vUmVjb3JkZWREZXBsb3kuYWRkKHBpcGVsaW5lSWQpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgbGFzdFNoYUJ5UGlwZWxpbmUuc2V0KHBpcGVsaW5lSWQsIHNoYSk7XG4gICAgcmV0dXJuIHNoYTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ0xhc3QtZGVwbG95LWNvbW1pdCBsb29rdXAgZXJyb3JlZDsgcmVzb2x2aW5nIGEgc2luZ2xlIGNvbW1pdCcsIHtcbiAgICAgIGVycm9yOiAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZSA/PyBTdHJpbmcoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKiBAaW50ZXJuYWwgVGVzdC1vbmx5OiBmb3JnZXQgcmVzb2x2ZWQgY29tbWl0cywgU0NNIGNvb2xkb3duIGFuZCBjYWNoZWQgdG9rZW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldFNjbUZvclRlc3RzKCk6IHZvaWQge1xuICBjb21taXRSZXN1bHRDYWNoZS5jbGVhcigpO1xuICBsYXN0U2hhQnlQaXBlbGluZS5jbGVhcigpO1xuICBub1JlY29yZGVkRGVwbG95LmNsZWFyKCk7XG4gIGNvbW1pdE1ldGFDYWNoZS5jbGVhcigpO1xuICBzY21Db29sZG93blVudGlsID0gMDtcbiAgZ2l0aHViVG9rZW5CeU9yZy5jbGVhcigpO1xufVxuIl19
package/lib/util.d.ts CHANGED
@@ -19,3 +19,24 @@ export declare class BoundedMap<K, V> extends Map<K, V> {
19
19
  /** Upper bound for every per-key cache below. */
20
20
  export declare const CACHE_MAX_ENTRIES = 5000;
21
21
  export declare function loadSdk<T>(pkg: string): Promise<T>;
22
+ /**
23
+ * How long one outbound call to the reporting service may take.
24
+ *
25
+ * A Lambda has no supervisor to notice it is stuck: an untimed `fetch` against a wedged
26
+ * reporting service holds the invocation until the FUNCTION's own timeout, which burns
27
+ * the whole budget, returns no batch response, and lets SQS redeliver the same records
28
+ * to the same wedged endpoint. A bounded call fails fast, reports the batch as failed,
29
+ * and lets the retry happen on SQS's schedule rather than by exhausting the clock.
30
+ *
31
+ * Default 5s, well inside a typical 30s function timeout even with one auth retry.
32
+ */
33
+ export declare const FETCH_TIMEOUT_MS: number;
34
+ /**
35
+ * `fetch` with a deadline.
36
+ *
37
+ * `AbortSignal.timeout` rather than a hand-rolled controller: it is one call, it cannot
38
+ * leak the timer, and it rejects with a `TimeoutError` the callers already treat as a
39
+ * failed POST. Every outbound call in this package goes through here so a new one cannot
40
+ * be added without a deadline by simply forgetting.
41
+ */
42
+ export declare function fetchWithTimeout(url: string, init?: RequestInit, timeoutMs?: number): Promise<Response>;
package/lib/util.js CHANGED
@@ -40,4 +40,27 @@ export const CACHE_MAX_ENTRIES = 5000;
40
40
  export async function loadSdk(pkg) {
41
41
  return (await import(pkg));
42
42
  }
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsOERBQThEO0FBRTlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRztJQUNqQixJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxLQUFLLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUM1SSxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFVBQWlCLFNBQVEsR0FBUztJQUNoQixHQUFHO0lBQWhDLFlBQTZCLEdBQVc7UUFBSSxLQUFLLEVBQUUsQ0FBQzttQkFBdkIsR0FBRztJQUFxQixDQUFDO0lBQzdDLEdBQUcsQ0FBQyxHQUFNLEVBQUUsS0FBUTtRQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO1FBQ3ZDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFdEMsaUZBQWlGO0FBQ2pGLGlGQUFpRjtBQUNqRiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFJLEdBQVc7SUFDMUMsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFNLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogU2hhcmVkIHBsdW1iaW5nIGZvciB0aGUgZXZlbnQtaW5nZXN0aW9uIExhbWJkYSBtb2R1bGVzLiAqL1xuXG5leHBvcnQgY29uc3QgbG9nID0ge1xuICBpbmZvOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnSU5GTycsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIHdhcm46IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdXQVJOJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgZXJyb3I6IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0VSUk9SJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbn07XG5cbi8qKlxuICogQSBNYXAgdGhhdCBob2xkcyBhdCBtb3N0IGBtYXhgIGVudHJpZXMsIGV2aWN0aW5nIHRoZSBsZWFzdCByZWNlbnRseSBTRVQgb25lLlxuICogRXZlcnkgcGVyLWtleSBjYWNoZSBpbiB0aGlzIG1vZHVsZSBpcyBrZXllZCBieSBzb21ldGhpbmcgdW5ib3VuZGVkIChwaXBlbGluZVxuICogQVJOLCBwaXBlbGluZSDDlyBjb21taXQsIG9yZyksIGFuZCBhIGZsZWV0IGZvcndhcmRlcidzIHdhcm0gY29udGFpbmVyIGNhbiBsaXZlXG4gKiBmb3IgaG91cnMgYWNyb3NzIHRob3VzYW5kcyBvZiBwaXBlbGluZXMg4oCUIGFuIHVuYm91bmRlZCBNYXAgaXMgYSBzbG93IGxlYWsgdGhhdFxuICogZW5kcyBpbiBhbiBPT00ta2lsbGVkIExhbWJkYSBhbmQgYSByZWRlbGl2ZXJlZCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdW5kZWRNYXA8SywgVj4gZXh0ZW5kcyBNYXA8SywgVj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heDogbnVtYmVyKSB7IHN1cGVyKCk7IH1cbiAgb3ZlcnJpZGUgc2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICBpZiAoc3VwZXIuaGFzKGtleSkpIHtcbiAgICAgIHN1cGVyLmRlbGV0ZShrZXkpOyAvLyByZWZyZXNoIHJlY2VuY3lcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSBzdXBlci5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogVXBwZXIgYm91bmQgZm9yIGV2ZXJ5IHBlci1rZXkgY2FjaGUgYmVsb3cuICovXG5leHBvcnQgY29uc3QgQ0FDSEVfTUFYX0VOVFJJRVMgPSA1MDAwO1xuXG4vLyBWYXJpYWJsZS1zcGVjaWZpZXIgbG9hZGVyIGZvciBTREsgY2xpZW50cyB0aGF0IGFyZSBOT1QgZGV2RGVwZW5kZW5jaWVzIG9mIHRoaXNcbi8vIHBhY2thZ2UgKGBAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdGAsIGBAYXdzLXNkay9jbGllbnQtc3FzYCDigJQgcHJlc2VudCBvbmx5IGluXG4vLyB0aGUgTGFtYmRhIHJ1bnRpbWUgLyBqZXN0IG1vY2tzKS4gQSBgc3RyaW5nYCBzcGVjaWZpZXIga2VlcHMgYHRzY2AgZnJvbVxuLy8gcmVzb2x2aW5nIHRoZW0gYXQgYnVpbGQgdGltZSwgYW5kIHRoZSBidW5kbGUgbGVhdmVzIGBAYXdzLXNkay8qYCBleHRlcm5hbC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU2RrPFQ+KHBrZzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KHBrZykpIGFzIFQ7XG59XG4iXX0=
43
+ /**
44
+ * How long one outbound call to the reporting service may take.
45
+ *
46
+ * A Lambda has no supervisor to notice it is stuck: an untimed `fetch` against a wedged
47
+ * reporting service holds the invocation until the FUNCTION's own timeout, which burns
48
+ * the whole budget, returns no batch response, and lets SQS redeliver the same records
49
+ * to the same wedged endpoint. A bounded call fails fast, reports the batch as failed,
50
+ * and lets the retry happen on SQS's schedule rather than by exhausting the clock.
51
+ *
52
+ * Default 5s, well inside a typical 30s function timeout even with one auth retry.
53
+ */
54
+ export const FETCH_TIMEOUT_MS = Number(process.env.REPORTING_FETCH_TIMEOUT_MS ?? 5000) || 5000;
55
+ /**
56
+ * `fetch` with a deadline.
57
+ *
58
+ * `AbortSignal.timeout` rather than a hand-rolled controller: it is one call, it cannot
59
+ * leak the timer, and it rejects with a `TimeoutError` the callers already treat as a
60
+ * failed POST. Every outbound call in this package goes through here so a new one cannot
61
+ * be added without a deadline by simply forgetting.
62
+ */
63
+ export function fetchWithTimeout(url, init = {}, timeoutMs = FETCH_TIMEOUT_MS) {
64
+ return fetch(url, { ...init, signal: AbortSignal.timeout(timeoutMs) });
65
+ }
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsOERBQThEO0FBRTlELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRztJQUNqQixJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxJQUFJLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN2SSxLQUFLLEVBQUUsQ0FBQyxHQUFXLEVBQUUsSUFBYyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztDQUM1SSxDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLFVBQWlCLFNBQVEsR0FBUztJQUNoQixHQUFHO0lBQWhDLFlBQTZCLEdBQVc7UUFBSSxLQUFLLEVBQUUsQ0FBQzttQkFBdkIsR0FBRztJQUFxQixDQUFDO0lBQzdDLEdBQUcsQ0FBQyxHQUFNLEVBQUUsS0FBUTtRQUMzQixJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNuQixLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsa0JBQWtCO1FBQ3ZDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDeEMsSUFBSSxNQUFNLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUM7Q0FDRjtBQUVELGlEQUFpRDtBQUNqRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFFdEMsaUZBQWlGO0FBQ2pGLGlGQUFpRjtBQUNqRiwwRUFBMEU7QUFDMUUsNkVBQTZFO0FBQzdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsT0FBTyxDQUFJLEdBQVc7SUFDMUMsT0FBTyxDQUFDLE1BQU0sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFNLENBQUM7QUFDbEMsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7QUFFL0Y7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsSUFBSSxHQUFnQixFQUFFLEVBQUUsU0FBUyxHQUFHLGdCQUFnQjtJQUNoRyxPQUFPLEtBQUssQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG4vKiogU2hhcmVkIHBsdW1iaW5nIGZvciB0aGUgZXZlbnQtaW5nZXN0aW9uIExhbWJkYSBtb2R1bGVzLiAqL1xuXG5leHBvcnQgY29uc3QgbG9nID0ge1xuICBpbmZvOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnSU5GTycsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIHdhcm46IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdXQVJOJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbiAgZXJyb3I6IChtc2c6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IGNvbnNvbGUuZXJyb3IoSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0VSUk9SJywgbWVzc2FnZTogbXNnLCBkYXRhLCB0czogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH0pKSxcbn07XG5cbi8qKlxuICogQSBNYXAgdGhhdCBob2xkcyBhdCBtb3N0IGBtYXhgIGVudHJpZXMsIGV2aWN0aW5nIHRoZSBsZWFzdCByZWNlbnRseSBTRVQgb25lLlxuICogRXZlcnkgcGVyLWtleSBjYWNoZSBpbiB0aGlzIG1vZHVsZSBpcyBrZXllZCBieSBzb21ldGhpbmcgdW5ib3VuZGVkIChwaXBlbGluZVxuICogQVJOLCBwaXBlbGluZSDDlyBjb21taXQsIG9yZyksIGFuZCBhIGZsZWV0IGZvcndhcmRlcidzIHdhcm0gY29udGFpbmVyIGNhbiBsaXZlXG4gKiBmb3IgaG91cnMgYWNyb3NzIHRob3VzYW5kcyBvZiBwaXBlbGluZXMg4oCUIGFuIHVuYm91bmRlZCBNYXAgaXMgYSBzbG93IGxlYWsgdGhhdFxuICogZW5kcyBpbiBhbiBPT00ta2lsbGVkIExhbWJkYSBhbmQgYSByZWRlbGl2ZXJlZCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdW5kZWRNYXA8SywgVj4gZXh0ZW5kcyBNYXA8SywgVj4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1heDogbnVtYmVyKSB7IHN1cGVyKCk7IH1cbiAgb3ZlcnJpZGUgc2V0KGtleTogSywgdmFsdWU6IFYpOiB0aGlzIHtcbiAgICBpZiAoc3VwZXIuaGFzKGtleSkpIHtcbiAgICAgIHN1cGVyLmRlbGV0ZShrZXkpOyAvLyByZWZyZXNoIHJlY2VuY3lcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2l6ZSA+PSB0aGlzLm1heCkge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gdGhpcy5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCAhPT0gdW5kZWZpbmVkKSBzdXBlci5kZWxldGUob2xkZXN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKiogVXBwZXIgYm91bmQgZm9yIGV2ZXJ5IHBlci1rZXkgY2FjaGUgYmVsb3cuICovXG5leHBvcnQgY29uc3QgQ0FDSEVfTUFYX0VOVFJJRVMgPSA1MDAwO1xuXG4vLyBWYXJpYWJsZS1zcGVjaWZpZXIgbG9hZGVyIGZvciBTREsgY2xpZW50cyB0aGF0IGFyZSBOT1QgZGV2RGVwZW5kZW5jaWVzIG9mIHRoaXNcbi8vIHBhY2thZ2UgKGBAYXdzLXNkay9jbGllbnQtY29kZWNvbW1pdGAsIGBAYXdzLXNkay9jbGllbnQtc3FzYCDigJQgcHJlc2VudCBvbmx5IGluXG4vLyB0aGUgTGFtYmRhIHJ1bnRpbWUgLyBqZXN0IG1vY2tzKS4gQSBgc3RyaW5nYCBzcGVjaWZpZXIga2VlcHMgYHRzY2AgZnJvbVxuLy8gcmVzb2x2aW5nIHRoZW0gYXQgYnVpbGQgdGltZSwgYW5kIHRoZSBidW5kbGUgbGVhdmVzIGBAYXdzLXNkay8qYCBleHRlcm5hbC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkU2RrPFQ+KHBrZzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiAoYXdhaXQgaW1wb3J0KHBrZykpIGFzIFQ7XG59XG5cbi8qKlxuICogSG93IGxvbmcgb25lIG91dGJvdW5kIGNhbGwgdG8gdGhlIHJlcG9ydGluZyBzZXJ2aWNlIG1heSB0YWtlLlxuICpcbiAqIEEgTGFtYmRhIGhhcyBubyBzdXBlcnZpc29yIHRvIG5vdGljZSBpdCBpcyBzdHVjazogYW4gdW50aW1lZCBgZmV0Y2hgIGFnYWluc3QgYSB3ZWRnZWRcbiAqIHJlcG9ydGluZyBzZXJ2aWNlIGhvbGRzIHRoZSBpbnZvY2F0aW9uIHVudGlsIHRoZSBGVU5DVElPTidzIG93biB0aW1lb3V0LCB3aGljaCBidXJuc1xuICogdGhlIHdob2xlIGJ1ZGdldCwgcmV0dXJucyBubyBiYXRjaCByZXNwb25zZSwgYW5kIGxldHMgU1FTIHJlZGVsaXZlciB0aGUgc2FtZSByZWNvcmRzXG4gKiB0byB0aGUgc2FtZSB3ZWRnZWQgZW5kcG9pbnQuIEEgYm91bmRlZCBjYWxsIGZhaWxzIGZhc3QsIHJlcG9ydHMgdGhlIGJhdGNoIGFzIGZhaWxlZCxcbiAqIGFuZCBsZXRzIHRoZSByZXRyeSBoYXBwZW4gb24gU1FTJ3Mgc2NoZWR1bGUgcmF0aGVyIHRoYW4gYnkgZXhoYXVzdGluZyB0aGUgY2xvY2suXG4gKlxuICogRGVmYXVsdCA1cywgd2VsbCBpbnNpZGUgYSB0eXBpY2FsIDMwcyBmdW5jdGlvbiB0aW1lb3V0IGV2ZW4gd2l0aCBvbmUgYXV0aCByZXRyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEZFVENIX1RJTUVPVVRfTVMgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUkVQT1JUSU5HX0ZFVENIX1RJTUVPVVRfTVMgPz8gNTAwMCkgfHwgNTAwMDtcblxuLyoqXG4gKiBgZmV0Y2hgIHdpdGggYSBkZWFkbGluZS5cbiAqXG4gKiBgQWJvcnRTaWduYWwudGltZW91dGAgcmF0aGVyIHRoYW4gYSBoYW5kLXJvbGxlZCBjb250cm9sbGVyOiBpdCBpcyBvbmUgY2FsbCwgaXQgY2Fubm90XG4gKiBsZWFrIHRoZSB0aW1lciwgYW5kIGl0IHJlamVjdHMgd2l0aCBhIGBUaW1lb3V0RXJyb3JgIHRoZSBjYWxsZXJzIGFscmVhZHkgdHJlYXQgYXMgYVxuICogZmFpbGVkIFBPU1QuIEV2ZXJ5IG91dGJvdW5kIGNhbGwgaW4gdGhpcyBwYWNrYWdlIGdvZXMgdGhyb3VnaCBoZXJlIHNvIGEgbmV3IG9uZSBjYW5ub3RcbiAqIGJlIGFkZGVkIHdpdGhvdXQgYSBkZWFkbGluZSBieSBzaW1wbHkgZm9yZ2V0dGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoV2l0aFRpbWVvdXQodXJsOiBzdHJpbmcsIGluaXQ6IFJlcXVlc3RJbml0ID0ge30sIHRpbWVvdXRNcyA9IEZFVENIX1RJTUVPVVRfTVMpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBmZXRjaCh1cmwsIHsgLi4uaW5pdCwgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KHRpbWVvdXRNcykgfSk7XG59XG4iXX0=
package/package.json CHANGED
@@ -23,7 +23,7 @@
23
23
  "jest-junit": "^17",
24
24
  "ts-jest": "29.4.12",
25
25
  "typescript": "npm:@typescript/typescript6@^6.0.2",
26
- "@pipeline-builder/pipeline-core": "4.1.24"
26
+ "@pipeline-builder/pipeline-core": "4.1.26"
27
27
  },
28
28
  "keywords": [
29
29
  "ci-cd",
@@ -63,7 +63,7 @@
63
63
  "cli"
64
64
  ],
65
65
  "engines": {
66
- "node": ">= 24.14.0"
66
+ "node": ">= 24.21.0"
67
67
  },
68
68
  "devEngines": {
69
69
  "packageManager": {
@@ -79,7 +79,7 @@
79
79
  "access": "public",
80
80
  "registry": "https://registry.npmjs.org/"
81
81
  },
82
- "version": "4.0.19",
82
+ "version": "4.0.21",
83
83
  "bugs": {
84
84
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
85
85
  },