@pipeline-builder/pipeline-events 3.4.68 → 3.4.70

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/lib/index.js +54 -20
  2. package/package.json +1 -1
package/lib/index.js CHANGED
@@ -16,12 +16,12 @@ async function loadCodePipeline() {
16
16
  *
17
17
  * Authentication:
18
18
  * - PLATFORM_TOKEN env var (preferred — no Secrets Manager call)
19
- * - PLATFORM_SECRET_NAME env var → reads accessToken from Secrets Manager
19
+ * - PLATFORM_SECRET_NAME env var → reads the JWT (password) from Secrets Manager
20
20
  *
21
21
  * Environment variables:
22
22
  * - PLATFORM_BASE_URL — Base URL of the platform
23
23
  * - PLATFORM_TOKEN — JWT token (set directly, or)
24
- * - PLATFORM_SECRET_NAME — Secrets Manager secret containing { accessToken }
24
+ * - PLATFORM_SECRET_NAME — Secrets Manager secret containing { password: <JWT> }
25
25
  */
26
26
  const log = {
27
27
  info: (msg, data) => console.log(JSON.stringify({ level: 'INFO', message: msg, data, ts: new Date().toISOString() })),
@@ -39,7 +39,11 @@ const log = {
39
39
  // "not yet registered" (skip).
40
40
  const PIPELINE_EVENT_ID_TAG = 'PIPELINE_EVENT_ID';
41
41
  const clientsByRegion = new Map();
42
- const eventIdByArn = new Map(); // null = resolved-but-untagged (negative cache)
42
+ // tag=null is a negative cache (resolved-but-untagged); `ts` lets negatives
43
+ // expire so a pipeline tagged AFTER its first event becomes resolvable without
44
+ // recycling the warm container. Positive results stay cached for the lifetime.
45
+ const eventIdByArn = new Map();
46
+ const NEG_CACHE_TTL_MS = 5 * 60 * 1000;
43
47
  async function pipelineClient(region) {
44
48
  let client = clientsByRegion.get(region);
45
49
  if (!client) {
@@ -56,8 +60,12 @@ async function pipelineClient(region) {
56
60
  * dropping every event.
57
61
  */
58
62
  async function resolvePipelineEventId(arn, region) {
59
- if (eventIdByArn.has(arn))
60
- return eventIdByArn.get(arn);
63
+ const cached = eventIdByArn.get(arn);
64
+ // Serve a positive hit for the container lifetime; serve a negative hit only
65
+ // until it expires (then re-resolve, in case the pipeline was since tagged).
66
+ if (cached && (cached.tag !== null || Date.now() - cached.ts < NEG_CACHE_TTL_MS)) {
67
+ return cached.tag;
68
+ }
61
69
  try {
62
70
  const client = await pipelineClient(region);
63
71
  const { ListTagsForResourceCommand } = await loadCodePipeline();
@@ -65,7 +73,7 @@ async function resolvePipelineEventId(arn, region) {
65
73
  const tag = out.tags?.find(t => t.key === PIPELINE_EVENT_ID_TAG)?.value ?? null;
66
74
  if (!tag)
67
75
  log.warn('Pipeline missing PIPELINE_EVENT_ID tag — skipping (register it?)', { arn });
68
- eventIdByArn.set(arn, tag);
76
+ eventIdByArn.set(arn, { tag, ts: Date.now() });
69
77
  return tag;
70
78
  }
71
79
  catch (err) {
@@ -101,10 +109,14 @@ async function getAuthToken() {
101
109
  if (!response.SecretString)
102
110
  throw new Error(`Secret "${secretName}" is empty`);
103
111
  const secret = JSON.parse(response.SecretString);
104
- if (!secret.accessToken) {
105
- throw new Error('Secret missing accessToken run "pipeline-manager store-token" to generate');
112
+ // store-token writes the JWT in `password` (the canonical field — also used by
113
+ // CodeBuild secretsManagerCredentials, the plugin-lookup Lambda, and token-renew).
114
+ // Accept legacy `accessToken` as a fallback.
115
+ const token = secret.password || secret.accessToken;
116
+ if (!token) {
117
+ throw new Error('Secret missing JWT (password) — run "pipeline-manager store-token" to generate');
106
118
  }
107
- cachedToken = secret.accessToken;
119
+ cachedToken = token;
108
120
  log.info('Using stored JWT token from Secrets Manager');
109
121
  return cachedToken;
110
122
  }
@@ -117,13 +129,28 @@ function classifyEvent(detailType) {
117
129
  return { eventType: 'STAGE', eventSource: 'codepipeline' };
118
130
  if (detailType.includes('Action Execution'))
119
131
  return { eventType: 'ACTION', eventSource: 'codepipeline' };
132
+ // CodeBuild "Build State" events identify a build *project*, not a pipeline, so
133
+ // parseRecord drops them on the `eventSource !== 'codepipeline'` check below —
134
+ // the 'BUILD' eventType is never persisted here (plugin BUILD events are
135
+ // recorded directly by the plugin service). The 'codebuild' source is what
136
+ // routes the drop; keep this branch only for that.
120
137
  if (detailType.includes('Build State'))
121
138
  return { eventType: 'BUILD', eventSource: 'codebuild' };
122
139
  return { eventType: 'PIPELINE', eventSource: 'codepipeline' };
123
140
  }
124
141
  /** Parse + resolve one record to a reportable event, or null to skip it. */
125
142
  async function parseRecord(record) {
126
- const event = JSON.parse(record.body);
143
+ let event;
144
+ // A malformed body is a dead message (retrying won't help) — log + skip it so
145
+ // it can't fail the whole batch. Resolution errors below (e.g. AccessDenied)
146
+ // are NOT caught here: those are transient/infra and must propagate to retry.
147
+ try {
148
+ event = JSON.parse(record.body);
149
+ }
150
+ catch (err) {
151
+ log.warn('Skipping SQS record with unparseable body', { messageId: record.messageId, error: String(err) });
152
+ return null;
153
+ }
127
154
  const { eventType, eventSource } = classifyEvent(event['detail-type']);
128
155
  const detail = { ...event.detail };
129
156
  // The raw account never needs to leave AWS now — drop it from the payload.
@@ -187,24 +214,31 @@ export const handler = async (event) => {
187
214
  const baseUrl = process.env.PLATFORM_BASE_URL;
188
215
  if (!baseUrl)
189
216
  throw new Error('PLATFORM_BASE_URL environment variable is required');
190
- // Parse + resolve all records (tag lookups run concurrently); drop skips.
217
+ // Parse + resolve all records (tag lookups run concurrently); drop intentional
218
+ // skips (null). A malformed record BODY is handled inside parseRecord (logged +
219
+ // skipped) so one bad message can't fail the whole batch — while genuine infra
220
+ // errors (e.g. AccessDenied on the tag lookup) still propagate so a missing IAM
221
+ // grant surfaces and SQS retries the batch.
191
222
  const events = (await Promise.all(event.Records.map(parseRecord)))
192
223
  .filter((e) => e !== null);
193
224
  if (events.length === 0) {
194
225
  log.info('No resolvable CodePipeline events in batch');
195
226
  return;
196
227
  }
197
- // Authenticate
198
- const token = await getAuthToken();
199
- // POST batch to reporting service
200
- const res = await fetch(`${baseUrl}/api/reports/events`, {
228
+ // POST batch to reporting service. On a 401/403 the cached JWT has likely
229
+ // expired drop it, re-fetch, and retry ONCE so an expired token doesn't
230
+ // permanently brick a warm container.
231
+ const post = (token) => fetch(`${baseUrl}/api/reports/events`, {
201
232
  method: 'POST',
202
- headers: {
203
- 'Content-Type': 'application/json',
204
- 'Authorization': `Bearer ${token}`,
205
- },
233
+ headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
206
234
  body: JSON.stringify({ events }),
207
235
  });
236
+ let res = await post(await getAuthToken());
237
+ if (res.status === 401 || res.status === 403) {
238
+ log.warn('Reporting API auth failed; refreshing token and retrying once', { status: res.status });
239
+ cachedToken = null;
240
+ res = await post(await getAuthToken());
241
+ }
208
242
  if (!res.ok) {
209
243
  const body = await res.text().catch(() => '');
210
244
  log.error(`Reporting API returned ${res.status}`, { body });
@@ -213,4 +247,4 @@ export const handler = async (event) => {
213
247
  const result = await res.json();
214
248
  log.info(`Ingested ${events.length} events`, { inserted: result.data });
215
249
  };
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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LEVBQUUsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyJztcbmltcG9ydCB0eXBlIHsgU1FTRXZlbnQsIFNRU1JlY29yZCB9IGZyb20gJ2F3cy1sYW1iZGEnO1xuXG4vLyBBV1MgTGFtYmRhJ3MgTm9kZSBydW50aW1lIGJ1bmRsZXMgQGF3cy1zZGsgdjMsIHNvIHRoZSBDb2RlUGlwZWxpbmUgY2xpZW50IGlzXG4vLyBsb2FkZWQgbGF6aWx5IHZpYSBkeW5hbWljIGltcG9ydCgpIOKAlCBhIHN0YXRpYyB3b3Jrc3BhY2UgZGVwZW5kZW5jeSBvblxuLy8gQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZSB3b3VsZCBwZXJ0dXJiIHRoZSBzaGFyZWQgQGF3cy1zZGsgdmVyc2lvbiB0cmVlXG4vLyBhbmQgYnJlYWsgb3RoZXIgcGFja2FnZXMnIHR5cGluZ3MuIFRoZSBkeW5hbWljIGltcG9ydCBrZWVwcyBpdCBvdXQgb2YgdGhlXG4vLyBzdGF0aWMgZ3JhcGggd2hpbGUgc3RheWluZyBFU00tY29ycmVjdCAobm8gYHJlcXVpcmVgIGluIGEgdHlwZTptb2R1bGUgcGFja2FnZSlcbi8vIGFuZCBtb2NrYWJsZS4gTWluaW1hbCBsb2NhbCB0eXBlcyBrZWVwIHRoZSBjYWxsIHNpdGVzIHR5cGUtY2hlY2tlZC5cbmludGVyZmFjZSBMaXN0VGFnc091dHB1dCB7IHRhZ3M/OiBBcnJheTx7IGtleT86IHN0cmluZzsgdmFsdWU/OiBzdHJpbmcgfT4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZUNsaWVudExpa2UgeyBzZW5kKGNvbW1hbmQ6IHVua25vd24pOiBQcm9taXNlPExpc3RUYWdzT3V0cHV0PiB9XG5pbnRlcmZhY2UgQ29kZVBpcGVsaW5lTW9kdWxlIHtcbiAgQ29kZVBpcGVsaW5lQ2xpZW50OiBuZXcgKGNvbmZpZzogeyByZWdpb246IHN0cmluZyB9KSA9PiBDb2RlUGlwZWxpbmVDbGllbnRMaWtlO1xuICBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZDogbmV3IChpbnB1dDogeyByZXNvdXJjZUFybjogc3RyaW5nIH0pID0+IHVua25vd247XG59XG5sZXQgY29kZXBpcGVsaW5lTW9kOiBDb2RlUGlwZWxpbmVNb2R1bGUgfCB1bmRlZmluZWQ7XG5hc3luYyBmdW5jdGlvbiBsb2FkQ29kZVBpcGVsaW5lKCk6IFByb21pc2U8Q29kZVBpcGVsaW5lTW9kdWxlPiB7XG4gIGlmICghY29kZXBpcGVsaW5lTW9kKSBjb2RlcGlwZWxpbmVNb2QgPSAoYXdhaXQgaW1wb3J0KCdAYXdzLXNkay9jbGllbnQtY29kZXBpcGVsaW5lJykpIGFzIHVua25vd24gYXMgQ29kZVBpcGVsaW5lTW9kdWxlO1xuICByZXR1cm4gY29kZXBpcGVsaW5lTW9kO1xufVxuXG4vKipcbiAqIFBpcGVsaW5lIGV2ZW50IGluZ2VzdGlvbiBMYW1iZGEgaGFuZGxlci5cbiAqXG4gKiBSZWNlaXZlcyBDb2RlUGlwZWxpbmUvQ29kZUJ1aWxkIGV2ZW50cyBmcm9tIFNRUyAoc291cmNlZCBieSBFdmVudEJyaWRnZSksXG4gKiBwYXJzZXMgdGhlbSBpbnRvIGEgbm9ybWFsaXplZCBmb3JtYXQsIGFuZCBQT1NUcyB0aGVtIHRvIHRoZSByZXBvcnRpbmcgc2VydmljZVxuICogdmlhIFBMQVRGT1JNX0JBU0VfVVJMLlxuICpcbiAqIEF1dGhlbnRpY2F0aW9uOlxuICogLSBQTEFURk9STV9UT0tFTiBlbnYgdmFyIChwcmVmZXJyZWQg4oCUIG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSBlbnYgdmFyIOKGkiByZWFkcyBhY2Nlc3NUb2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlclxuICpcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlczpcbiAqIC0gUExBVEZPUk1fQkFTRV9VUkwg4oCUIEJhc2UgVVJMIG9mIHRoZSBwbGF0Zm9ybVxuICogLSBQTEFURk9STV9UT0tFTiDigJQgSldUIHRva2VuIChzZXQgZGlyZWN0bHksIG9yKVxuICogLSBQTEFURk9STV9TRUNSRVRfTkFNRSDigJQgU2VjcmV0cyBNYW5hZ2VyIHNlY3JldCBjb250YWluaW5nIHsgYWNjZXNzVG9rZW4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nIHwgbnVsbD4oKTsgLy8gbnVsbCA9IHJlc29sdmVkLWJ1dC11bnRhZ2dlZCAobmVnYXRpdmUgY2FjaGUpXG5cbmFzeW5jIGZ1bmN0aW9uIHBpcGVsaW5lQ2xpZW50KHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxDb2RlUGlwZWxpbmVDbGllbnRMaWtlPiB7XG4gIGxldCBjbGllbnQgPSBjbGllbnRzQnlSZWdpb24uZ2V0KHJlZ2lvbik7XG4gIGlmICghY2xpZW50KSB7XG4gICAgY29uc3QgeyBDb2RlUGlwZWxpbmVDbGllbnQgfSA9IGF3YWl0IGxvYWRDb2RlUGlwZWxpbmUoKTtcbiAgICBjbGllbnQgPSBuZXcgQ29kZVBpcGVsaW5lQ2xpZW50KHsgcmVnaW9uIH0pO1xuICAgIGNsaWVudHNCeVJlZ2lvbi5zZXQocmVnaW9uLCBjbGllbnQpO1xuICB9XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIENvZGVQaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDihpIgdGhlIHBsYXRmb3JtIHBpcGVsaW5lSWQuXG4gKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcGlwZWxpbmUgaGFzIG5vIHN1Y2ggdGFnICh1bnJlZ2lzdGVyZWQpLiBUaHJvd3Mgb25cbiAqIEFjY2Vzc0RlbmllZCBzbyBhIG1pc3NpbmcgSUFNIGdyYW50IHN1cmZhY2VzIGxvdWRseSBpbnN0ZWFkIG9mIHNpbGVudGx5XG4gKiBkcm9wcGluZyBldmVyeSBldmVudC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVBpcGVsaW5lRXZlbnRJZChhcm46IHN0cmluZywgcmVnaW9uOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgaWYgKGV2ZW50SWRCeUFybi5oYXMoYXJuKSkgcmV0dXJuIGV2ZW50SWRCeUFybi5nZXQoYXJuKSE7XG4gIHRyeSB7XG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgcGlwZWxpbmVDbGllbnQocmVnaW9uKTtcbiAgICBjb25zdCB7IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kIH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgY2xpZW50LnNlbmQobmV3IExpc3RUYWdzRm9yUmVzb3VyY2VDb21tYW5kKHsgcmVzb3VyY2VBcm46IGFybiB9KSk7XG4gICAgY29uc3QgdGFnID0gb3V0LnRhZ3M/LmZpbmQodCA9PiB0LmtleSA9PT0gUElQRUxJTkVfRVZFTlRfSURfVEFHKT8udmFsdWUgPz8gbnVsbDtcbiAgICBpZiAoIXRhZykgbG9nLndhcm4oJ1BpcGVsaW5lIG1pc3NpbmcgUElQRUxJTkVfRVZFTlRfSUQgdGFnIOKAlCBza2lwcGluZyAocmVnaXN0ZXIgaXQ/KScsIHsgYXJuIH0pO1xuICAgIGV2ZW50SWRCeUFybi5zZXQoYXJuLCB0YWcpO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIGlmICghc2VjcmV0LmFjY2Vzc1Rva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbWlzc2luZyBhY2Nlc3NUb2tlbiDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlblwiIHRvIGdlbmVyYXRlJyk7XG4gIH1cblxuICBjYWNoZWRUb2tlbiA9IHNlY3JldC5hY2Nlc3NUb2tlbjtcbiAgbG9nLmluZm8oJ1VzaW5nIHN0b3JlZCBKV1QgdG9rZW4gZnJvbSBTZWNyZXRzIE1hbmFnZXInKTtcbiAgcmV0dXJuIGNhY2hlZFRva2VuO1xufVxuXG4vLyDilIDilIDilIAgRXZlbnQgUGFyc2luZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIFBhcnNlZEV2ZW50IHtcbiAgcGlwZWxpbmVJZDogc3RyaW5nO1xuICBldmVudFNvdXJjZTogc3RyaW5nO1xuICBldmVudFR5cGU6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkPzogc3RyaW5nO1xuICBzdGFnZU5hbWU/OiBzdHJpbmc7XG4gIGFjdGlvbk5hbWU/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBmYWlsdXJlIHJlYXNvbiwgZnJvbSBhbiBBY3Rpb24gZXZlbnQnc1xuICAgKiAgYGV4ZWN1dGlvbi1yZXN1bHQuZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnlgLiBUaGUgbG9nIFVSTCArIGVycm9yLWNvZGVcbiAgICogIHN0YXkgaW4gYGRldGFpbGAgZm9yIGRyaWxsLWRvd24uICovXG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbiAgc3RhcnRlZEF0Pzogc3RyaW5nO1xuICBjb21wbGV0ZWRBdD86IHN0cmluZztcbiAgZHVyYXRpb25Ncz86IG51bWJlcjtcbiAgZGV0YWlsOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqIENhcCBvbiB0aGUgc3RvcmVkIGZhaWx1cmUgc3VtbWFyeSDigJQgQ29kZUJ1aWxkL0RlcGxveSBzdW1tYXJpZXMgY2FuIGJlIGxvbmcuICovXG5jb25zdCBNQVhfRVJST1JfTUVTU0FHRSA9IDQwMDA7XG5cbmZ1bmN0aW9uIGNsYXNzaWZ5RXZlbnQoZGV0YWlsVHlwZTogc3RyaW5nKTogeyBldmVudFR5cGU6IHN0cmluZzsgZXZlbnRTb3VyY2U6IHN0cmluZyB9IHtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ1BpcGVsaW5lIEV4ZWN1dGlvbicpKSByZXR1cm4geyBldmVudFR5cGU6ICdQSVBFTElORScsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnU3RhZ2UgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1NUQUdFJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdBY3Rpb24gRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ0FDVElPTicsIGV2ZW50U291cmNlOiAnY29kZXBpcGVsaW5lJyB9O1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UocmVjb3JkLmJvZHkpIGFzIHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcblxuICBjb25zdCB7IGV2ZW50VHlwZSwgZXZlbnRTb3VyY2UgfSA9IGNsYXNzaWZ5RXZlbnQoZXZlbnRbJ2RldGFpbC10eXBlJ10pO1xuICBjb25zdCBkZXRhaWwgPSB7IC4uLmV2ZW50LmRldGFpbCB9O1xuICAvLyBUaGUgcmF3IGFjY291bnQgbmV2ZXIgbmVlZHMgdG8gbGVhdmUgQVdTIG5vdyDigJQgZHJvcCBpdCBmcm9tIHRoZSBwYXlsb2FkLlxuICBkZWxldGUgZGV0YWlsLmFjY291bnQ7XG5cbiAgLy8gQ29kZUJ1aWxkIFwiQnVpbGQgU3RhdGVcIiBldmVudHMgaWRlbnRpZnkgYSBidWlsZCAqcHJvamVjdCosIG5vdCBhIHBpcGVsaW5lLFxuICAvLyBhbmQgYSBwcm9qZWN0IGNhbiBiZSBzaGFyZWQgYWNyb3NzIHBpcGVsaW5lcyDigJQgdGhlcmUncyBubyBjbGVhbiAxOjEgbWFwcGluZ1xuICAvLyB0byBhIFBJUEVMSU5FX0VWRU5UX0lELCBzbyBza2lwIHRoZW0gKHRoZXkgd2VyZSBlZmZlY3RpdmVseSBkcm9wcGVkIGJlZm9yZVxuICAvLyB0b28sIHNpbmNlIGRldGFpbC5waXBlbGluZSB3YXMgdW5kZWZpbmVkIGFuZCBuZXZlciBtYXRjaGVkIHRoZSByZWdpc3RyeSkuXG4gIGlmIChldmVudFNvdXJjZSAhPT0gJ2NvZGVwaXBlbGluZScpIHtcbiAgICBsb2cud2FybignU2tpcHBpbmcgbm9uLUNvZGVQaXBlbGluZSBldmVudCAobm8gcGlwZWxpbmUgdGFnIHRvIHJlc29sdmUpJywgeyBkZXRhaWxUeXBlOiBldmVudFsnZGV0YWlsLXR5cGUnXSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBpcGVsaW5lTmFtZSA9IGRldGFpbC5waXBlbGluZSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmICghcGlwZWxpbmVOYW1lKSB7XG4gICAgbG9nLndhcm4oJ0NvZGVQaXBlbGluZSBldmVudCBtaXNzaW5nIHBpcGVsaW5lIG5hbWUg4oCUIHNraXBwaW5nJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBSZXNvbHZlIHRoZSBwaXBlbGluZSdzIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyAoPSBwbGF0Zm9ybSBwaXBlbGluZUlkKS4gVGhlXG4gIC8vIEFSTiBpcyBvbmx5IGEgdHJhbnNpZW50IGhhbmRsZSBmb3IgdGhlIHRhZyBsb29rdXA7IGl0IGlzIG5ldmVyIHN0b3JlZC5cbiAgY29uc3QgYXJuID0gYGFybjphd3M6Y29kZXBpcGVsaW5lOiR7ZXZlbnQucmVnaW9ufToke2V2ZW50LmFjY291bnR9OiR7cGlwZWxpbmVOYW1lfWA7XG4gIGNvbnN0IHBpcGVsaW5lSWQgPSBhd2FpdCByZXNvbHZlUGlwZWxpbmVFdmVudElkKGFybiwgZXZlbnQucmVnaW9uKTtcbiAgaWYgKCFwaXBlbGluZUlkKSByZXR1cm4gbnVsbDsgLy8gdW50YWdnZWQgLyB1bnJlZ2lzdGVyZWQg4oaSIHNraXBcblxuICBjb25zdCBzdGFydGVkQXQgPSAoZGV0YWlsWydzdGFydC10aW1lJ10gYXMgc3RyaW5nKSB8fCBldmVudC50aW1lO1xuICBjb25zdCBzdGF0ZSA9IGRldGFpbC5zdGF0ZSBhcyBzdHJpbmc7XG5cbiAgbGV0IGR1cmF0aW9uTXM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgbGV0IGNvbXBsZXRlZEF0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKFsnU1VDQ0VFREVEJywgJ0ZBSUxFRCcsICdDQU5DRUxFRCcsICdTVE9QUEVEJ10uaW5jbHVkZXMoc3RhdGUpKSB7XG4gICAgY29tcGxldGVkQXQgPSBldmVudC50aW1lO1xuICAgIGlmIChzdGFydGVkQXQgJiYgY29tcGxldGVkQXQpIHtcbiAgICAgIGNvbnN0IG1zID0gbmV3IERhdGUoY29tcGxldGVkQXQpLmdldFRpbWUoKSAtIG5ldyBEYXRlKHN0YXJ0ZWRBdCkuZ2V0VGltZSgpO1xuICAgICAgaWYgKG1zID49IDApIGR1cmF0aW9uTXMgPSBtcztcbiAgICB9XG4gIH1cblxuICAvLyBQcm9tb3RlIHRoZSBmYWlsdXJlIHJlYXNvbiB0byBhIHR5cGVkIGZpZWxkLiBPbiBBY3Rpb24gZXZlbnRzIEFXUyBwdXRzIHRoZVxuICAvLyBodW1hbi1yZWFkYWJsZSBzdW1tYXJ5IChhbmQgYSBsb2cgVVJMICsgZXJyb3ItY29kZSwgd2hpY2ggc3RheSBpbiBgZGV0YWlsYClcbiAgLy8gdW5kZXIgYGV4ZWN1dGlvbi1yZXN1bHRgLlxuICBjb25zdCByZXN1bHQgPSBkZXRhaWxbJ2V4ZWN1dGlvbi1yZXN1bHQnXSBhcyB7ICdleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSc/OiB1bmtub3duIH0gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHN1bW1hcnkgPSByZXN1bHQ/LlsnZXh0ZXJuYWwtZXhlY3V0aW9uLXN1bW1hcnknXTtcbiAgY29uc3QgZXJyb3JNZXNzYWdlID0gdHlwZW9mIHN1bW1hcnkgPT09ICdzdHJpbmcnICYmIHN1bW1hcnkubGVuZ3RoID4gMFxuICAgID8gc3VtbWFyeS5zbGljZSgwLCBNQVhfRVJST1JfTUVTU0FHRSlcbiAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIHBpcGVsaW5lSWQsXG4gICAgZXZlbnRTb3VyY2UsXG4gICAgZXZlbnRUeXBlLFxuICAgIHN0YXR1czogc3RhdGUsXG4gICAgZXhlY3V0aW9uSWQ6IGRldGFpbFsnZXhlY3V0aW9uLWlkJ10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHN0YWdlTmFtZTogZGV0YWlsLnN0YWdlIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY3Rpb25OYW1lOiBkZXRhaWwuYWN0aW9uIGFzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBlcnJvck1lc3NhZ2UsXG4gICAgc3RhcnRlZEF0LFxuICAgIGNvbXBsZXRlZEF0LFxuICAgIGR1cmF0aW9uTXMsXG4gICAgZGV0YWlsLFxuICB9O1xufVxuXG4vLyDilIDilIDilIAgSGFuZGxlciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZXZlbnQ6IFNRU0V2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gIGNvbnN0IGJhc2VVcmwgPSBwcm9jZXNzLmVudi5QTEFURk9STV9CQVNFX1VSTDtcbiAgaWYgKCFiYXNlVXJsKSB0aHJvdyBuZXcgRXJyb3IoJ1BMQVRGT1JNX0JBU0VfVVJMIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHJlcXVpcmVkJyk7XG5cbiAgLy8gUGFyc2UgKyByZXNvbHZlIGFsbCByZWNvcmRzICh0YWcgbG9va3VwcyBydW4gY29uY3VycmVudGx5KTsgZHJvcCBza2lwcy5cbiAgY29uc3QgZXZlbnRzID0gKGF3YWl0IFByb21pc2UuYWxsKGV2ZW50LlJlY29yZHMubWFwKHBhcnNlUmVjb3JkKSkpXG4gICAgLmZpbHRlcigoZSk6IGUgaXMgUGFyc2VkRXZlbnQgPT4gZSAhPT0gbnVsbCk7XG4gIGlmIChldmVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nLmluZm8oJ05vIHJlc29sdmFibGUgQ29kZVBpcGVsaW5lIGV2ZW50cyBpbiBiYXRjaCcpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIEF1dGhlbnRpY2F0ZVxuICBjb25zdCB0b2tlbiA9IGF3YWl0IGdldEF1dGhUb2tlbigpO1xuXG4gIC8vIFBPU1QgYmF0Y2ggdG8gcmVwb3J0aW5nIHNlcnZpY2VcbiAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYCR7YmFzZVVybH0vYXBpL3JlcG9ydHMvZXZlbnRzYCwge1xuICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0b2tlbn1gLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBldmVudHMgfSksXG4gIH0pO1xuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWU5RixJQUFJLGVBQStDLENBQUM7QUFDcEQsS0FBSyxVQUFVLGdCQUFnQjtJQUM3QixJQUFJLENBQUMsZUFBZTtRQUFFLGVBQWUsR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLDhCQUE4QixDQUFDLENBQWtDLENBQUM7SUFDeEgsT0FBTyxlQUFlLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sR0FBRyxHQUFHO0lBQ1YsSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksSUFBSSxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDdkksS0FBSyxFQUFFLENBQUMsR0FBVyxFQUFFLElBQWMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxP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RyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBNkIsQ0FBQztJQUMzRCxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksTUFBTSxDQUFDLE1BQU0sU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlcic7XG5pbXBvcnQgdHlwZSB7IFNRU0V2ZW50LCBTUVNSZWNvcmQgfSBmcm9tICdhd3MtbGFtYmRhJztcblxuLy8gQVdTIExhbWJkYSdzIE5vZGUgcnVudGltZSBidW5kbGVzIEBhd3Mtc2RrIHYzLCBzbyB0aGUgQ29kZVBpcGVsaW5lIGNsaWVudCBpc1xuLy8gbG9hZGVkIGxhemlseSB2aWEgZHluYW1pYyBpbXBvcnQoKSDigJQgYSBzdGF0aWMgd29ya3NwYWNlIGRlcGVuZGVuY3kgb25cbi8vIEBhd3Mtc2RrL2NsaWVudC1jb2RlcGlwZWxpbmUgd291bGQgcGVydHVyYiB0aGUgc2hhcmVkIEBhd3Mtc2RrIHZlcnNpb24gdHJlZVxuLy8gYW5kIGJyZWFrIG90aGVyIHBhY2thZ2VzJyB0eXBpbmdzLiBUaGUgZHluYW1pYyBpbXBvcnQga2VlcHMgaXQgb3V0IG9mIHRoZVxuLy8gc3RhdGljIGdyYXBoIHdoaWxlIHN0YXlpbmcgRVNNLWNvcnJlY3QgKG5vIGByZXF1aXJlYCBpbiBhIHR5cGU6bW9kdWxlIHBhY2thZ2UpXG4vLyBhbmQgbW9ja2FibGUuIE1pbmltYWwgbG9jYWwgdHlwZXMga2VlcCB0aGUgY2FsbCBzaXRlcyB0eXBlLWNoZWNrZWQuXG5pbnRlcmZhY2UgTGlzdFRhZ3NPdXRwdXQgeyB0YWdzPzogQXJyYXk8eyBrZXk/OiBzdHJpbmc7IHZhbHVlPzogc3RyaW5nIH0+IH1cbmludGVyZmFjZSBDb2RlUGlwZWxpbmVDbGllbnRMaWtlIHsgc2VuZChjb21tYW5kOiB1bmtub3duKTogUHJvbWlzZTxMaXN0VGFnc091dHB1dD4gfVxuaW50ZXJmYWNlIENvZGVQaXBlbGluZU1vZHVsZSB7XG4gIENvZGVQaXBlbGluZUNsaWVudDogbmV3IChjb25maWc6IHsgcmVnaW9uOiBzdHJpbmcgfSkgPT4gQ29kZVBpcGVsaW5lQ2xpZW50TGlrZTtcbiAgTGlzdFRhZ3NGb3JSZXNvdXJjZUNvbW1hbmQ6IG5ldyAoaW5wdXQ6IHsgcmVzb3VyY2VBcm46IHN0cmluZyB9KSA9PiB1bmtub3duO1xufVxubGV0IGNvZGVwaXBlbGluZU1vZDogQ29kZVBpcGVsaW5lTW9kdWxlIHwgdW5kZWZpbmVkO1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvZGVQaXBlbGluZSgpOiBQcm9taXNlPENvZGVQaXBlbGluZU1vZHVsZT4ge1xuICBpZiAoIWNvZGVwaXBlbGluZU1vZCkgY29kZXBpcGVsaW5lTW9kID0gKGF3YWl0IGltcG9ydCgnQGF3cy1zZGsvY2xpZW50LWNvZGVwaXBlbGluZScpKSBhcyB1bmtub3duIGFzIENvZGVQaXBlbGluZU1vZHVsZTtcbiAgcmV0dXJuIGNvZGVwaXBlbGluZU1vZDtcbn1cblxuLyoqXG4gKiBQaXBlbGluZSBldmVudCBpbmdlc3Rpb24gTGFtYmRhIGhhbmRsZXIuXG4gKlxuICogUmVjZWl2ZXMgQ29kZVBpcGVsaW5lL0NvZGVCdWlsZCBldmVudHMgZnJvbSBTUVMgKHNvdXJjZWQgYnkgRXZlbnRCcmlkZ2UpLFxuICogcGFyc2VzIHRoZW0gaW50byBhIG5vcm1hbGl6ZWQgZm9ybWF0LCBhbmQgUE9TVHMgdGhlbSB0byB0aGUgcmVwb3J0aW5nIHNlcnZpY2VcbiAqIHZpYSBQTEFURk9STV9CQVNFX1VSTC5cbiAqXG4gKiBBdXRoZW50aWNhdGlvbjpcbiAqIC0gUExBVEZPUk1fVE9LRU4gZW52IHZhciAocHJlZmVycmVkIOKAlCBubyBTZWNyZXRzIE1hbmFnZXIgY2FsbClcbiAqIC0gUExBVEZPUk1fU0VDUkVUX05BTUUgZW52IHZhciDihpIgcmVhZHMgdGhlIEpXVCAocGFzc3dvcmQpIGZyb20gU2VjcmV0cyBNYW5hZ2VyXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBQTEFURk9STV9CQVNFX1VSTCDigJQgQmFzZSBVUkwgb2YgdGhlIHBsYXRmb3JtXG4gKiAtIFBMQVRGT1JNX1RPS0VOIOKAlCBKV1QgdG9rZW4gKHNldCBkaXJlY3RseSwgb3IpXG4gKiAtIFBMQVRGT1JNX1NFQ1JFVF9OQU1FIOKAlCBTZWNyZXRzIE1hbmFnZXIgc2VjcmV0IGNvbnRhaW5pbmcgeyBwYXNzd29yZDogPEpXVD4gfVxuICovXG5cbmNvbnN0IGxvZyA9IHtcbiAgaW5mbzogKG1zZzogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoeyBsZXZlbDogJ0lORk8nLCBtZXNzYWdlOiBtc2csIGRhdGEsIHRzOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSkpLFxuICB3YXJuOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeSh7IGxldmVsOiAnV0FSTicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG4gIGVycm9yOiAobXNnOiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiBjb25zb2xlLmVycm9yKEpTT04uc3RyaW5naWZ5KHsgbGV2ZWw6ICdFUlJPUicsIG1lc3NhZ2U6IG1zZywgZGF0YSwgdHM6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9KSksXG59O1xuXG4vLyDilIDilIAgUElQRUxJTkVfRVZFTlRfSUQgcmVzb2x1dGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBpcGVsaW5lcyBhcmUgdGFnZ2VkIGBQSVBFTElORV9FVkVOVF9JRD08cGlwZWxpbmVJZD5gIGF0IENESyBzeW50aC4gV2UgcmVzb2x2ZVxuLy8gdGhhdCB0YWcgZnJvbSB0aGUgbGl2ZSBDb2RlUGlwZWxpbmUgKHJlZ2lvbi1hd2FyZSkgYW5kIHJlcG9ydCBhZ2FpbnN0IHRoZSBpZCDigJRcbi8vIHRoZSBBUk4vYWNjb3VudCBuZXZlciBsZWF2ZSBBV1MsIHNvIHRoZXJlJ3Mgbm8gbWFza2luZy4gQ2FjaGVkIHBlciBBUk5cbi8vICh3YXJtLWNvbnRhaW5lcikgdG8gYXZvaWQgaGFtbWVyaW5nIHRoZSBMaXN0VGFncyBBUEkuXG4vL1xuLy8gUmVxdWlyZXMgdGhlIExhbWJkYSBleGVjdXRpb24gcm9sZSB0byBhbGxvdyBgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2VgLlxuLy8gQWNjZXNzRGVuaWVkIGlzIGEgY29uZmlnIGVycm9yIChhbGVydCBsb3VkbHkpOyBhIG1pc3NpbmcgdGFnIGlzIHRyZWF0ZWQgYXNcbi8vIFwibm90IHlldCByZWdpc3RlcmVkXCIgKHNraXApLlxuXG5jb25zdCBQSVBFTElORV9FVkVOVF9JRF9UQUcgPSAnUElQRUxJTkVfRVZFTlRfSUQnO1xuY29uc3QgY2xpZW50c0J5UmVnaW9uID0gbmV3IE1hcDxzdHJpbmcsIENvZGVQaXBlbGluZUNsaWVudExpa2U+KCk7XG4vLyB0YWc9bnVsbCBpcyBhIG5lZ2F0aXZlIGNhY2hlIChyZXNvbHZlZC1idXQtdW50YWdnZWQpOyBgdHNgIGxldHMgbmVnYXRpdmVzXG4vLyBleHBpcmUgc28gYSBwaXBlbGluZSB0YWdnZWQgQUZURVIgaXRzIGZpcnN0IGV2ZW50IGJlY29tZXMgcmVzb2x2YWJsZSB3aXRob3V0XG4vLyByZWN5Y2xpbmcgdGhlIHdhcm0gY29udGFpbmVyLiBQb3NpdGl2ZSByZXN1bHRzIHN0YXkgY2FjaGVkIGZvciB0aGUgbGlmZXRpbWUuXG5jb25zdCBldmVudElkQnlBcm4gPSBuZXcgTWFwPHN0cmluZywgeyB0YWc6IHN0cmluZyB8IG51bGw7IHRzOiBudW1iZXIgfT4oKTtcbmNvbnN0IE5FR19DQUNIRV9UVExfTVMgPSA1ICogNjAgKiAxMDAwO1xuXG5hc3luYyBmdW5jdGlvbiBwaXBlbGluZUNsaWVudChyZWdpb246IHN0cmluZyk6IFByb21pc2U8Q29kZVBpcGVsaW5lQ2xpZW50TGlrZT4ge1xuICBsZXQgY2xpZW50ID0gY2xpZW50c0J5UmVnaW9uLmdldChyZWdpb24pO1xuICBpZiAoIWNsaWVudCkge1xuICAgIGNvbnN0IHsgQ29kZVBpcGVsaW5lQ2xpZW50IH0gPSBhd2FpdCBsb2FkQ29kZVBpcGVsaW5lKCk7XG4gICAgY2xpZW50ID0gbmV3IENvZGVQaXBlbGluZUNsaWVudCh7IHJlZ2lvbiB9KTtcbiAgICBjbGllbnRzQnlSZWdpb24uc2V0KHJlZ2lvbiwgY2xpZW50KTtcbiAgfVxuICByZXR1cm4gY2xpZW50O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBDb2RlUGlwZWxpbmUncyBQSVBFTElORV9FVkVOVF9JRCB0YWcg4oaSIHRoZSBwbGF0Zm9ybSBwaXBlbGluZUlkLlxuICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHBpcGVsaW5lIGhhcyBubyBzdWNoIHRhZyAodW5yZWdpc3RlcmVkKS4gVGhyb3dzIG9uXG4gKiBBY2Nlc3NEZW5pZWQgc28gYSBtaXNzaW5nIElBTSBncmFudCBzdXJmYWNlcyBsb3VkbHkgaW5zdGVhZCBvZiBzaWxlbnRseVxuICogZHJvcHBpbmcgZXZlcnkgZXZlbnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVQaXBlbGluZUV2ZW50SWQoYXJuOiBzdHJpbmcsIHJlZ2lvbjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG4gIGNvbnN0IGNhY2hlZCA9IGV2ZW50SWRCeUFybi5nZXQoYXJuKTtcbiAgLy8gU2VydmUgYSBwb3NpdGl2ZSBoaXQgZm9yIHRoZSBjb250YWluZXIgbGlmZXRpbWU7IHNlcnZlIGEgbmVnYXRpdmUgaGl0IG9ubHlcbiAgLy8gdW50aWwgaXQgZXhwaXJlcyAodGhlbiByZS1yZXNvbHZlLCBpbiBjYXNlIHRoZSBwaXBlbGluZSB3YXMgc2luY2UgdGFnZ2VkKS5cbiAgaWYgKGNhY2hlZCAmJiAoY2FjaGVkLnRhZyAhPT0gbnVsbCB8fCBEYXRlLm5vdygpIC0gY2FjaGVkLnRzIDwgTkVHX0NBQ0hFX1RUTF9NUykpIHtcbiAgICByZXR1cm4gY2FjaGVkLnRhZztcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHBpcGVsaW5lQ2xpZW50KHJlZ2lvbik7XG4gICAgY29uc3QgeyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCB9ID0gYXdhaXQgbG9hZENvZGVQaXBlbGluZSgpO1xuICAgIGNvbnN0IG91dCA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBMaXN0VGFnc0ZvclJlc291cmNlQ29tbWFuZCh7IHJlc291cmNlQXJuOiBhcm4gfSkpO1xuICAgIGNvbnN0IHRhZyA9IG91dC50YWdzPy5maW5kKHQgPT4gdC5rZXkgPT09IFBJUEVMSU5FX0VWRU5UX0lEX1RBRyk/LnZhbHVlID8/IG51bGw7XG4gICAgaWYgKCF0YWcpIGxvZy53YXJuKCdQaXBlbGluZSBtaXNzaW5nIFBJUEVMSU5FX0VWRU5UX0lEIHRhZyDigJQgc2tpcHBpbmcgKHJlZ2lzdGVyIGl0PyknLCB7IGFybiB9KTtcbiAgICBldmVudElkQnlBcm4uc2V0KGFybiwgeyB0YWcsIHRzOiBEYXRlLm5vdygpIH0pO1xuICAgIHJldHVybiB0YWc7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnN0IG5hbWUgPSAoZXJyIGFzIHsgbmFtZT86IHN0cmluZyB9KT8ubmFtZTtcbiAgICBpZiAobmFtZSA9PT0gJ0FjY2Vzc0RlbmllZEV4Y2VwdGlvbicpIHtcbiAgICAgIC8vIERvbid0IGNhY2hlIOKAlCB0aGlzIGlzIGEgZml4YWJsZSBtaXNjb25maWcsIG5vdCBhIHByb3BlcnR5IG9mIHRoZSBwaXBlbGluZS5cbiAgICAgIGxvZy5lcnJvcignQWNjZXNzRGVuaWVkIGNhbGxpbmcgY29kZXBpcGVsaW5lOkxpc3RUYWdzRm9yUmVzb3VyY2Ug4oCUIGdyYW50IGl0IHRvIHRoZSBMYW1iZGEgcm9sZScsIHsgYXJuLCBlcnJvcjogbmFtZSB9KTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBQSVBFTElORV9FVkVOVF9JRCB0YWcnLCB7IGFybiwgZXJyb3I6IG5hbWUgPz8gU3RyaW5nKGVycikgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLy8g4pSA4pSA4pSAIEF1dGgg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmxldCBjYWNoZWRUb2tlbjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEF1dGhUb2tlbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoY2FjaGVkVG9rZW4pIHJldHVybiBjYWNoZWRUb2tlbjtcblxuICAvLyBQYXRoIDE6IFBMQVRGT1JNX1RPS0VOIGVudiB2YXIgKG5vIFNlY3JldHMgTWFuYWdlciBjYWxsKVxuICBpZiAocHJvY2Vzcy5lbnYuUExBVEZPUk1fVE9LRU4pIHtcbiAgICBjYWNoZWRUb2tlbiA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX1RPS0VOO1xuICAgIGxvZy5pbmZvKCdVc2luZyBQTEFURk9STV9UT0tFTiBmcm9tIGVudmlyb25tZW50Jyk7XG4gICAgcmV0dXJuIGNhY2hlZFRva2VuO1xuICB9XG5cbiAgLy8gUGF0aCAyOiBQTEFURk9STV9TRUNSRVRfTkFNRSDihpIgcmVhZCBmcm9tIFNlY3JldHMgTWFuYWdlclxuICBjb25zdCBzZWNyZXROYW1lID0gcHJvY2Vzcy5lbnYuUExBVEZPUk1fU0VDUkVUX05BTUU7XG4gIGlmICghc2VjcmV0TmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fVE9LRU4gb3IgUExBVEZPUk1fU0VDUkVUX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBGZXRjaGluZyB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcjogJHtzZWNyZXROYW1lfWApO1xuICBjb25zdCBjbGllbnQgPSBuZXcgU2VjcmV0c01hbmFnZXJDbGllbnQoe30pO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNsaWVudC5zZW5kKG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoeyBTZWNyZXRJZDogc2VjcmV0TmFtZSB9KSk7XG5cbiAgaWYgKCFyZXNwb25zZS5TZWNyZXRTdHJpbmcpIHRocm93IG5ldyBFcnJvcihgU2VjcmV0IFwiJHtzZWNyZXROYW1lfVwiIGlzIGVtcHR5YCk7XG5cbiAgY29uc3Qgc2VjcmV0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5TZWNyZXRTdHJpbmcpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8vIHN0b3JlLXRva2VuIHdyaXRlcyB0aGUgSldUIGluIGBwYXNzd29yZGAgKHRoZSBjYW5vbmljYWwgZmllbGQg4oCUIGFsc28gdXNlZCBieVxuICAvLyBDb2RlQnVpbGQgc2VjcmV0c01hbmFnZXJDcmVkZW50aWFscywgdGhlIHBsdWdpbi1sb29rdXAgTGFtYmRhLCBhbmQgdG9rZW4tcmVuZXcpLlxuICAvLyBBY2NlcHQgbGVnYWN5IGBhY2Nlc3NUb2tlbmAgYXMgYSBmYWxsYmFjay5cbiAgY29uc3QgdG9rZW4gPSBzZWNyZXQucGFzc3dvcmQgfHwgc2VjcmV0LmFjY2Vzc1Rva2VuO1xuICBpZiAoIXRva2VuKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTZWNyZXQgbWlzc2luZyBKV1QgKHBhc3N3b3JkKSDigJQgcnVuIFwicGlwZWxpbmUtbWFuYWdlciBzdG9yZS10b2tlblwiIHRvIGdlbmVyYXRlJyk7XG4gIH1cblxuICBjYWNoZWRUb2tlbiA9IHRva2VuO1xuICBsb2cuaW5mbygnVXNpbmcgc3RvcmVkIEpXVCB0b2tlbiBmcm9tIFNlY3JldHMgTWFuYWdlcicpO1xuICByZXR1cm4gY2FjaGVkVG9rZW47XG59XG5cbi8vIOKUgOKUgOKUgCBFdmVudCBQYXJzaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgUGFyc2VkRXZlbnQge1xuICBwaXBlbGluZUlkOiBzdHJpbmc7XG4gIGV2ZW50U291cmNlOiBzdHJpbmc7XG4gIGV2ZW50VHlwZTogc3RyaW5nO1xuICBzdGF0dXM6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ/OiBzdHJpbmc7XG4gIHN0YWdlTmFtZT86IHN0cmluZztcbiAgYWN0aW9uTmFtZT86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIGZhaWx1cmUgcmVhc29uLCBmcm9tIGFuIEFjdGlvbiBldmVudCdzXG4gICAqICBgZXhlY3V0aW9uLXJlc3VsdC5leHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeWAuIFRoZSBsb2cgVVJMICsgZXJyb3ItY29kZVxuICAgKiAgc3RheSBpbiBgZGV0YWlsYCBmb3IgZHJpbGwtZG93bi4gKi9cbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG4gIGNvbXBsZXRlZEF0Pzogc3RyaW5nO1xuICBkdXJhdGlvbk1zPzogbnVtYmVyO1xuICBkZXRhaWw6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG4vKiogQ2FwIG9uIHRoZSBzdG9yZWQgZmFpbHVyZSBzdW1tYXJ5IOKAlCBDb2RlQnVpbGQvRGVwbG95IHN1bW1hcmllcyBjYW4gYmUgbG9uZy4gKi9cbmNvbnN0IE1BWF9FUlJPUl9NRVNTQUdFID0gNDAwMDtcblxuZnVuY3Rpb24gY2xhc3NpZnlFdmVudChkZXRhaWxUeXBlOiBzdHJpbmcpOiB7IGV2ZW50VHlwZTogc3RyaW5nOyBldmVudFNvdXJjZTogc3RyaW5nIH0ge1xuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnUGlwZWxpbmUgRXhlY3V0aW9uJykpIHJldHVybiB7IGV2ZW50VHlwZTogJ1BJUEVMSU5FJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIGlmIChkZXRhaWxUeXBlLmluY2x1ZGVzKCdTdGFnZSBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnU1RBR0UnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbiAgaWYgKGRldGFpbFR5cGUuaW5jbHVkZXMoJ0FjdGlvbiBFeGVjdXRpb24nKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQUNUSU9OJywgZXZlbnRTb3VyY2U6ICdjb2RlcGlwZWxpbmUnIH07XG4gIC8vIENvZGVCdWlsZCBcIkJ1aWxkIFN0YXRlXCIgZXZlbnRzIGlkZW50aWZ5IGEgYnVpbGQgKnByb2plY3QqLCBub3QgYSBwaXBlbGluZSwgc29cbiAgLy8gcGFyc2VSZWNvcmQgZHJvcHMgdGhlbSBvbiB0aGUgYGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJ2AgY2hlY2sgYmVsb3cg4oCUXG4gIC8vIHRoZSAnQlVJTEQnIGV2ZW50VHlwZSBpcyBuZXZlciBwZXJzaXN0ZWQgaGVyZSAocGx1Z2luIEJVSUxEIGV2ZW50cyBhcmVcbiAgLy8gcmVjb3JkZWQgZGlyZWN0bHkgYnkgdGhlIHBsdWdpbiBzZXJ2aWNlKS4gVGhlICdjb2RlYnVpbGQnIHNvdXJjZSBpcyB3aGF0XG4gIC8vIHJvdXRlcyB0aGUgZHJvcDsga2VlcCB0aGlzIGJyYW5jaCBvbmx5IGZvciB0aGF0LlxuICBpZiAoZGV0YWlsVHlwZS5pbmNsdWRlcygnQnVpbGQgU3RhdGUnKSkgcmV0dXJuIHsgZXZlbnRUeXBlOiAnQlVJTEQnLCBldmVudFNvdXJjZTogJ2NvZGVidWlsZCcgfTtcbiAgcmV0dXJuIHsgZXZlbnRUeXBlOiAnUElQRUxJTkUnLCBldmVudFNvdXJjZTogJ2NvZGVwaXBlbGluZScgfTtcbn1cblxuLyoqIFBhcnNlICsgcmVzb2x2ZSBvbmUgcmVjb3JkIHRvIGEgcmVwb3J0YWJsZSBldmVudCwgb3IgbnVsbCB0byBza2lwIGl0LiAqL1xuYXN5bmMgZnVuY3Rpb24gcGFyc2VSZWNvcmQocmVjb3JkOiBTUVNSZWNvcmQpOiBQcm9taXNlPFBhcnNlZEV2ZW50IHwgbnVsbD4ge1xuICBsZXQgZXZlbnQ6IHtcbiAgICAnZGV0YWlsLXR5cGUnOiBzdHJpbmc7XG4gICAgJ3NvdXJjZSc6IHN0cmluZztcbiAgICAnZGV0YWlsJzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgJ3RpbWUnOiBzdHJpbmc7XG4gICAgJ3JlZ2lvbic6IHN0cmluZztcbiAgICAnYWNjb3VudCc6IHN0cmluZztcbiAgfTtcbiAgLy8gQSBtYWxmb3JtZWQgYm9keSBpcyBhIGRlYWQgbWVzc2FnZSAocmV0cnlpbmcgd29uJ3QgaGVscCkg4oCUIGxvZyArIHNraXAgaXQgc29cbiAgLy8gaXQgY2FuJ3QgZmFpbCB0aGUgd2hvbGUgYmF0Y2guIFJlc29sdXRpb24gZXJyb3JzIGJlbG93IChlLmcuIEFjY2Vzc0RlbmllZClcbiAgLy8gYXJlIE5PVCBjYXVnaHQgaGVyZTogdGhvc2UgYXJlIHRyYW5zaWVudC9pbmZyYSBhbmQgbXVzdCBwcm9wYWdhdGUgdG8gcmV0cnkuXG4gIHRyeSB7XG4gICAgZXZlbnQgPSBKU09OLnBhcnNlKHJlY29yZC5ib2R5KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nLndhcm4oJ1NraXBwaW5nIFNRUyByZWNvcmQgd2l0aCB1bnBhcnNlYWJsZSBib2R5JywgeyBtZXNzYWdlSWQ6IHJlY29yZC5tZXNzYWdlSWQsIGVycm9yOiBTdHJpbmcoZXJyKSB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHsgZXZlbnRUeXBlLCBldmVudFNvdXJjZSB9ID0gY2xhc3NpZnlFdmVudChldmVudFsnZGV0YWlsLXR5cGUnXSk7XG4gIGNvbnN0IGRldGFpbCA9IHsgLi4uZXZlbnQuZGV0YWlsIH07XG4gIC8vIFRoZSByYXcgYWNjb3VudCBuZXZlciBuZWVkcyB0byBsZWF2ZSBBV1Mgbm93IOKAlCBkcm9wIGl0IGZyb20gdGhlIHBheWxvYWQuXG4gIGRlbGV0ZSBkZXRhaWwuYWNjb3VudDtcblxuICAvLyBDb2RlQnVpbGQgXCJCdWlsZCBTdGF0ZVwiIGV2ZW50cyBpZGVudGlmeSBhIGJ1aWxkICpwcm9qZWN0Kiwgbm90IGEgcGlwZWxpbmUsXG4gIC8vIGFuZCBhIHByb2plY3QgY2FuIGJlIHNoYXJlZCBhY3Jvc3MgcGlwZWxpbmVzIOKAlCB0aGVyZSdzIG5vIGNsZWFuIDE6MSBtYXBwaW5nXG4gIC8vIHRvIGEgUElQRUxJTkVfRVZFTlRfSUQsIHNvIHNraXAgdGhlbSAodGhleSB3ZXJlIGVmZmVjdGl2ZWx5IGRyb3BwZWQgYmVmb3JlXG4gIC8vIHRvbywgc2luY2UgZGV0YWlsLnBpcGVsaW5lIHdhcyB1bmRlZmluZWQgYW5kIG5ldmVyIG1hdGNoZWQgdGhlIHJlZ2lzdHJ5KS5cbiAgaWYgKGV2ZW50U291cmNlICE9PSAnY29kZXBpcGVsaW5lJykge1xuICAgIGxvZy53YXJuKCdTa2lwcGluZyBub24tQ29kZVBpcGVsaW5lIGV2ZW50IChubyBwaXBlbGluZSB0YWcgdG8gcmVzb2x2ZSknLCB7IGRldGFpbFR5cGU6IGV2ZW50WydkZXRhaWwtdHlwZSddIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgcGlwZWxpbmVOYW1lID0gZGV0YWlsLnBpcGVsaW5lIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgaWYgKCFwaXBlbGluZU5hbWUpIHtcbiAgICBsb2cud2FybignQ29kZVBpcGVsaW5lIGV2ZW50IG1pc3NpbmcgcGlwZWxpbmUgbmFtZSDigJQgc2tpcHBpbmcnKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFJlc29sdmUgdGhlIHBpcGVsaW5lJ3MgUElQRUxJTkVfRVZFTlRfSUQgdGFnICg9IHBsYXRmb3JtIHBpcGVsaW5lSWQpLiBUaGVcbiAgLy8gQVJOIGlzIG9ubHkgYSB0cmFuc2llbnQgaGFuZGxlIGZvciB0aGUgdGFnIGxvb2t1cDsgaXQgaXMgbmV2ZXIgc3RvcmVkLlxuICBjb25zdCBhcm4gPSBgYXJuOmF3czpjb2RlcGlwZWxpbmU6JHtldmVudC5yZWdpb259OiR7ZXZlbnQuYWNjb3VudH06JHtwaXBlbGluZU5hbWV9YDtcbiAgY29uc3QgcGlwZWxpbmVJZCA9IGF3YWl0IHJlc29sdmVQaXBlbGluZUV2ZW50SWQoYXJuLCBldmVudC5yZWdpb24pO1xuICBpZiAoIXBpcGVsaW5lSWQpIHJldHVybiBudWxsOyAvLyB1bnRhZ2dlZCAvIHVucmVnaXN0ZXJlZCDihpIgc2tpcFxuXG4gIGNvbnN0IHN0YXJ0ZWRBdCA9IChkZXRhaWxbJ3N0YXJ0LXRpbWUnXSBhcyBzdHJpbmcpIHx8IGV2ZW50LnRpbWU7XG4gIGNvbnN0IHN0YXRlID0gZGV0YWlsLnN0YXRlIGFzIHN0cmluZztcblxuICBsZXQgZHVyYXRpb25NczogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICBsZXQgY29tcGxldGVkQXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoWydTVUNDRUVERUQnLCAnRkFJTEVEJywgJ0NBTkNFTEVEJywgJ1NUT1BQRUQnXS5pbmNsdWRlcyhzdGF0ZSkpIHtcbiAgICBjb21wbGV0ZWRBdCA9IGV2ZW50LnRpbWU7XG4gICAgaWYgKHN0YXJ0ZWRBdCAmJiBjb21wbGV0ZWRBdCkge1xuICAgICAgY29uc3QgbXMgPSBuZXcgRGF0ZShjb21wbGV0ZWRBdCkuZ2V0VGltZSgpIC0gbmV3IERhdGUoc3RhcnRlZEF0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAobXMgPj0gMCkgZHVyYXRpb25NcyA9IG1zO1xuICAgIH1cbiAgfVxuXG4gIC8vIFByb21vdGUgdGhlIGZhaWx1cmUgcmVhc29uIHRvIGEgdHlwZWQgZmllbGQuIE9uIEFjdGlvbiBldmVudHMgQVdTIHB1dHMgdGhlXG4gIC8vIGh1bWFuLXJlYWRhYmxlIHN1bW1hcnkgKGFuZCBhIGxvZyBVUkwgKyBlcnJvci1jb2RlLCB3aGljaCBzdGF5IGluIGBkZXRhaWxgKVxuICAvLyB1bmRlciBgZXhlY3V0aW9uLXJlc3VsdGAuXG4gIGNvbnN0IHJlc3VsdCA9IGRldGFpbFsnZXhlY3V0aW9uLXJlc3VsdCddIGFzIHsgJ2V4dGVybmFsLWV4ZWN1dGlvbi1zdW1tYXJ5Jz86IHVua25vd24gfSB8IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3VtbWFyeSA9IHJlc3VsdD8uWydleHRlcm5hbC1leGVjdXRpb24tc3VtbWFyeSddO1xuICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0eXBlb2Ygc3VtbWFyeSA9PT0gJ3N0cmluZycgJiYgc3VtbWFyeS5sZW5ndGggPiAwXG4gICAgPyBzdW1tYXJ5LnNsaWNlKDAsIE1BWF9FUlJPUl9NRVNTQUdFKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgcGlwZWxpbmVJZCxcbiAgICBldmVudFNvdXJjZSxcbiAgICBldmVudFR5cGUsXG4gICAgc3RhdHVzOiBzdGF0ZSxcbiAgICBleGVjdXRpb25JZDogZGV0YWlsWydleGVjdXRpb24taWQnXSBhcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3RhZ2VOYW1lOiBkZXRhaWwuc3RhZ2UgYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjdGlvbk5hbWU6IGRldGFpbC5hY3Rpb24gYXMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGVycm9yTWVzc2FnZSxcbiAgICBzdGFydGVkQXQsXG4gICAgY29tcGxldGVkQXQsXG4gICAgZHVyYXRpb25NcyxcbiAgICBkZXRhaWwsXG4gIH07XG59XG5cbi8vIOKUgOKUgOKUgCBIYW5kbGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogU1FTRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgY29uc3QgYmFzZVVybCA9IHByb2Nlc3MuZW52LlBMQVRGT1JNX0JBU0VfVVJMO1xuICBpZiAoIWJhc2VVcmwpIHRocm93IG5ldyBFcnJvcignUExBVEZPUk1fQkFTRV9VUkwgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgcmVxdWlyZWQnKTtcblxuICAvLyBQYXJzZSArIHJlc29sdmUgYWxsIHJlY29yZHMgKHRhZyBsb29rdXBzIHJ1biBjb25jdXJyZW50bHkpOyBkcm9wIGludGVudGlvbmFsXG4gIC8vIHNraXBzIChudWxsKS4gQSBtYWxmb3JtZWQgcmVjb3JkIEJPRFkgaXMgaGFuZGxlZCBpbnNpZGUgcGFyc2VSZWNvcmQgKGxvZ2dlZCArXG4gIC8vIHNraXBwZWQpIHNvIG9uZSBiYWQgbWVzc2FnZSBjYW4ndCBmYWlsIHRoZSB3aG9sZSBiYXRjaCDigJQgd2hpbGUgZ2VudWluZSBpbmZyYVxuICAvLyBlcnJvcnMgKGUuZy4gQWNjZXNzRGVuaWVkIG9uIHRoZSB0YWcgbG9va3VwKSBzdGlsbCBwcm9wYWdhdGUgc28gYSBtaXNzaW5nIElBTVxuICAvLyBncmFudCBzdXJmYWNlcyBhbmQgU1FTIHJldHJpZXMgdGhlIGJhdGNoLlxuICBjb25zdCBldmVudHMgPSAoYXdhaXQgUHJvbWlzZS5hbGwoZXZlbnQuUmVjb3Jkcy5tYXAocGFyc2VSZWNvcmQpKSlcbiAgICAuZmlsdGVyKChlKTogZSBpcyBQYXJzZWRFdmVudCA9PiBlICE9PSBudWxsKTtcbiAgaWYgKGV2ZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2cuaW5mbygnTm8gcmVzb2x2YWJsZSBDb2RlUGlwZWxpbmUgZXZlbnRzIGluIGJhdGNoJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gUE9TVCBiYXRjaCB0byByZXBvcnRpbmcgc2VydmljZS4gT24gYSA0MDEvNDAzIHRoZSBjYWNoZWQgSldUIGhhcyBsaWtlbHlcbiAgLy8gZXhwaXJlZCDigJQgZHJvcCBpdCwgcmUtZmV0Y2gsIGFuZCByZXRyeSBPTkNFIHNvIGFuIGV4cGlyZWQgdG9rZW4gZG9lc24ndFxuICAvLyBwZXJtYW5lbnRseSBicmljayBhIHdhcm0gY29udGFpbmVyLlxuICBjb25zdCBwb3N0ID0gKHRva2VuOiBzdHJpbmcpID0+IGZldGNoKGAke2Jhc2VVcmx9L2FwaS9yZXBvcnRzL2V2ZW50c2AsIHtcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsICdBdXRob3JpemF0aW9uJzogYEJlYXJlciAke3Rva2VufWAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGV2ZW50cyB9KSxcbiAgfSk7XG4gIGxldCByZXMgPSBhd2FpdCBwb3N0KGF3YWl0IGdldEF1dGhUb2tlbigpKTtcbiAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICBsb2cud2FybignUmVwb3J0aW5nIEFQSSBhdXRoIGZhaWxlZDsgcmVmcmVzaGluZyB0b2tlbiBhbmQgcmV0cnlpbmcgb25jZScsIHsgc3RhdHVzOiByZXMuc3RhdHVzIH0pO1xuICAgIGNhY2hlZFRva2VuID0gbnVsbDtcbiAgICByZXMgPSBhd2FpdCBwb3N0KGF3YWl0IGdldEF1dGhUb2tlbigpKTtcbiAgfVxuXG4gIGlmICghcmVzLm9rKSB7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCkuY2F0Y2goKCkgPT4gJycpO1xuICAgIGxvZy5lcnJvcihgUmVwb3J0aW5nIEFQSSByZXR1cm5lZCAke3Jlcy5zdGF0dXN9YCwgeyBib2R5IH0pO1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVwb3J0aW5nIEFQSSBmYWlsZWQ6ICR7cmVzLnN0YXR1c31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGxvZy5pbmZvKGBJbmdlc3RlZCAke2V2ZW50cy5sZW5ndGh9IGV2ZW50c2AsIHsgaW5zZXJ0ZWQ6IHJlc3VsdC5kYXRhIH0pO1xufTtcbiJdfQ==
package/package.json CHANGED
@@ -76,7 +76,7 @@
76
76
  "access": "public",
77
77
  "registry": "https://registry.npmjs.org/"
78
78
  },
79
- "version": "3.4.68",
79
+ "version": "3.4.70",
80
80
  "bugs": {
81
81
  "url": "https://github.com/mwashburn160/pipeline-builder/issues"
82
82
  },