UNPKG

@riddance/deploy

Version:

96 lines 17.2 kB
import { jsonResponse, okResponse } from '@riddance/fetch'; import { randomUUID } from 'node:crypto'; import { isDeepStrictEqual } from 'node:util'; import { awsRequest, isNotFound } from '../lite.js'; export async function syncTriggers(env, prefix, service, functions, reflection, region, account, apiGatewayId) { const currentTriggers = await getTriggers(env, prefix, service, functions); await Promise.all(reflection.http.map(async (fn) => { const trigger = currentTriggers.find(t => t.name === fn.name); if (!trigger) { const statement = makeStatementData(region, account, apiGatewayId, functions.find(f => f.name === fn.name)?.id ?? '', fn); await addTrigger(env, prefix, service, fn.name, randomUUID(), statement); return; } const statement = makeStatementData(region, account, apiGatewayId, trigger.id, fn); let exists = false; if (trigger.statements) { for (const { Sid, ...data } of trigger.statements) { if (isDeepStrictEqual(data, statement)) { if (exists) { await deleteTrigger(env, prefix, service, fn.name, Sid); } else { exists = true; } } else { await deleteTrigger(env, prefix, service, fn.name, Sid); } } } if (!exists) { await addTrigger(env, prefix, service, fn.name, randomUUID(), statement); } })); } export async function getTriggers(env, prefix, service, functions) { return await Promise.all(functions.map(async (fn) => { try { return { id: fn.id, name: fn.name, statements: JSON.parse((await jsonResponse(awsRequest(env, 'GET', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${fn.name}/policy/`), 'Error getting triggers.')).Policy).Statement, }; } catch (e) { if (isNotFound(e)) { return { id: fn.id, name: fn.name, }; } throw e; } })); } async function addTrigger(env, prefix, service, name, id, statement) { const arn = statement.Condition.ArnLike['AWS:SourceArn']; console.log(`adding trigger ${id} to lambda ${name}`); console.log(` from ${arn}`); await okResponse(awsRequest(env, 'POST', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${name}/policy/`, { StatementId: id, Action: statement.Action, Principal: statement.Principal.Service, SourceArn: arn, }), 'Error adding triggers.'); } async function deleteTrigger(env, prefix, service, name, id) { console.log(`deleting trigger ${id} from ${name}`); await okResponse(awsRequest(env, 'DELETE', 'lambda', `/2015-03-31/functions/${prefix}-${service}-${name}/policy/${id}`), 'Error deleting triggers.'); } function makeStatementData(region, account, apiGatewayId, functionId, fn) { if (!region || !account) { throw new Error('Weird'); } let p = 0; return { Action: 'lambda:InvokeFunction', Effect: 'Allow', Principal: { Service: 'apigateway.amazonaws.com', }, Resource: functionId, Condition: { ArnLike: { 'AWS:SourceArn': `arn:aws:execute-api:${region}:${account}:${apiGatewayId}/*/*/${trimTrailingSlash(fn.pathPattern.replaceAll('*', () => `{p${++p}}`))}`, }, }, }; } function trimTrailingSlash(pathPattern) { if (pathPattern.endsWith('/')) { return pathPattern.slice(0, -1); } return pathPattern; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJpZ2dlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0cmlnZ2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBRTFELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDeEMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQzdDLE9BQU8sRUFBWSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBRTdELE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUM5QixHQUFhLEVBQ2IsTUFBYyxFQUNkLE9BQWUsRUFDZixTQUF5QyxFQUN6QyxVQUFzQixFQUN0QixNQUEwQixFQUMxQixPQUEyQixFQUMzQixZQUFvQjtJQUVwQixNQUFNLGVBQWUsR0FBRyxNQUFNLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUMxRSxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2IsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFDLEVBQUUsRUFBQyxFQUFFO1FBQzNCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUM3RCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDWCxNQUFNLFNBQVMsR0FBRyxpQkFBaUIsQ0FDL0IsTUFBTSxFQUNOLE9BQU8sRUFDUCxZQUFZLEVBQ1osU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQ2pELEVBQUUsQ0FDTCxDQUFBO1lBQ0Qs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RSxVQUFVO1FBQ3BCLFNBQVMsRUFBRTtZQUNQLE9BQU8sRUFBRTtnQkFDTCxlQUFlLEVBQUUsdUJBQXVCLE1BQU0sSUFBSSxPQUFPLElBQUksWUFBWSxRQUFRLGlCQUFpQixDQUM5RixFQUFFLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQ3BELEVBQUU7YUFDTjtTQUNKO0tBQ0osQ0FBQTtBQUNMLENBQUM7QUFFRCxTQUFTLGlCQUFpQixDQUFDLFdBQW1CO0lBQzFDLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGpzb25SZXNwb25zZSwgb2tSZXNwb25zZSB9IGZyb20gJ0ByaWRkYW5jZS9mZXRjaCdcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tICdAcmlkZGFuY2UvaG9zdC9yZWZsZWN0J1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJ1xuaW1wb3J0IHsgaXNEZWVwU3RyaWN0RXF1YWwgfSBmcm9tICdub2RlOnV0aWwnXG5pbXBvcnQgeyBMb2NhbEVudiwgYXdzUmVxdWVzdCwgaXNOb3RGb3VuZCB9IGZyb20gJy4uL2xpdGUuanMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzeW5jVHJpZ2dlcnMoXG4gICAgZW52OiBMb2NhbEVudixcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBzZXJ2aWNlOiBzdHJpbmcsXG4gICAgZnVuY3Rpb25zOiB7IGlkOiBzdHJpbmc7IG5hbWU6IHN0cmluZyB9W10sXG4gICAgcmVmbGVjdGlvbjogUmVmbGVjdGlvbixcbiAgICByZWdpb246IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhY2NvdW50OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgYXBpR2F0ZXdheUlkOiBzdHJpbmcsXG4pIHtcbiAgICBjb25zdCBjdXJyZW50VHJpZ2dlcnMgPSBhd2FpdCBnZXRUcmlnZ2VycyhlbnYsIHByZWZpeCwgc2VydmljZSwgZnVuY3Rpb25zKVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByZWZsZWN0aW9uLmh0dHAubWFwKGFzeW5jIGZuID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjdXJyZW50VHJpZ2dlcnMuZmluZCh0ID0+IHQubmFtZSA9PT0gZm4ubmFtZSlcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IG1ha2VTdGF0ZW1lbnREYXRhKFxuICAgICAgICAgICAgICAgICAgICByZWdpb24sXG4gICAgICAgICAgICAgICAgICAgIGFjY291bnQsXG4gICAgICAgICAgICAgICAgICAgIGFwaUdhdGV3YXlJZCxcbiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25zLmZpbmQoZiA9PiBmLm5hbWUgPT09IGZuLm5hbWUpPy5pZCA/PyAnJyxcbiAgICAgICAgICAgICAgICAgICAgZm4sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGF3YWl0IGFkZFRyaWdnZXIoZW52LCBwcmVmaXgsIHNlcnZpY2UsIGZuLm5hbWUsIHJhbmRvbVVVSUQoKSwgc3RhdGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc3RhdGVtZW50ID0gbWFrZVN0YXRlbWVudERhdGEocmVnaW9uLCBhY2NvdW50LCBhcGlHYXRld2F5SWQsIHRyaWdnZXIuaWQsIGZuKVxuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGZhbHNlXG4gICAgICAgICAgICBpZiAodHJpZ2dlci5zdGF0ZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IFNpZCwgLi4uZGF0YSB9IG9mIHRyaWdnZXIuc3RhdGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZWVwU3RyaWN0RXF1YWwoZGF0YSwgc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGRlbGV0ZVRyaWdnZXIoZW52LCBwcmVmaXgsIHNlcnZpY2UsIGZuLm5hbWUsIFNpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZGVsZXRlVHJpZ2dlcihlbnYsIHByZWZpeCwgc2VydmljZSwgZm4ubmFtZSwgU2lkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRUcmlnZ2VyKGVudiwgcHJlZml4LCBzZXJ2aWNlLCBmbi5uYW1lLCByYW5kb21VVUlEKCksIHN0YXRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKVxufVxuXG5leHBvcnQgdHlwZSBBd3NUcmlnZ2VyID0ge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBjb25maWc/OiB7XG4gICAgICAgIG1ldGhvZDogc3RyaW5nXG4gICAgICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmdcbiAgICB9XG4gICAgc3RhdGVtZW50cz86IEF3c1N0YXRlbWVudFtdXG59XG5cbnR5cGUgQXdzU3RhdGVtZW50ID0ge1xuICAgIFNpZDogc3RyaW5nXG4gICAgRWZmZWN0OiBzdHJpbmdcbiAgICBQcmluY2lwYWw6IHsgU2VydmljZTogc3RyaW5nIH1cbiAgICBBY3Rpb246IHN0cmluZ1xuICAgIFJlc291cmNlOiBzdHJpbmdcbiAgICBDb25kaXRpb246IHVua25vd25cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFRyaWdnZXJzKFxuICAgIGVudjogTG9jYWxFbnYsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgc2VydmljZTogc3RyaW5nLFxuICAgIGZ1bmN0aW9uczogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmcgfVtdLFxuKTogUHJvbWlzZTxBd3NUcmlnZ2VyW10+IHtcbiAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGZ1bmN0aW9ucy5tYXAoYXN5bmMgZm4gPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZm4uaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGZuLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudHM6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBqc29uUmVzcG9uc2U8eyBQb2xpY3k6IHN0cmluZyB9PihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3c1JlcXVlc3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdHRVQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW1iZGEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtwcmVmaXh9LSR7c2VydmljZX0tJHtmbi5uYW1lfS9wb2xpY3kvYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZ2V0dGluZyB0cmlnZ2Vycy4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5Qb2xpY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICApIGFzIHsgU3RhdGVtZW50OiBBd3NTdGF0ZW1lbnRbXSB9XG4gICAgICAgICAgICAgICAgICAgICkuU3RhdGVtZW50LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNOb3RGb3VuZChlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGZuLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZm4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgIClcbn1cblxuYXN5bmMgZnVuY3Rpb24gYWRkVHJpZ2dlcihcbiAgICBlbnY6IExvY2FsRW52LFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIHNlcnZpY2U6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBzdGF0ZW1lbnQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VTdGF0ZW1lbnREYXRhPixcbikge1xuICAgIGNvbnN0IGFybiA9IHN0YXRlbWVudC5Db25kaXRpb24uQXJuTGlrZVsnQVdTOlNvdXJjZUFybiddXG4gICAgY29uc29sZS5sb2coYGFkZGluZyB0cmlnZ2VyICR7aWR9IHRvIGxhbWJkYSAke25hbWV9YClcbiAgICBjb25zb2xlLmxvZyhgICBmcm9tICR7YXJufWApXG4gICAgYXdhaXQgb2tSZXNwb25zZShcbiAgICAgICAgYXdzUmVxdWVzdChcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgICdQT1NUJyxcbiAgICAgICAgICAgICdsYW1iZGEnLFxuICAgICAgICAgICAgYC8yMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke3ByZWZpeH0tJHtzZXJ2aWNlfS0ke25hbWV9L3BvbGljeS9gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIFN0YXRlbWVudElkOiBpZCxcbiAgICAgICAgICAgICAgICBBY3Rpb246IHN0YXRlbWVudC5BY3Rpb24sXG4gICAgICAgICAgICAgICAgUHJpbmNpcGFsOiBzdGF0ZW1lbnQuUHJpbmNpcGFsLlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgU291cmNlQXJuOiBhcm4sXG4gICAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgICAnRXJyb3IgYWRkaW5nIHRyaWdnZXJzLicsXG4gICAgKVxufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVUcmlnZ2VyKFxuICAgIGVudjogTG9jYWxFbnYsXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgc2VydmljZTogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBpZDogc3RyaW5nLFxuKSB7XG4gICAgY29uc29sZS5sb2coYGRlbGV0aW5nIHRyaWdnZXIgJHtpZH0gZnJvbSAke25hbWV9YClcbiAgICBhd2FpdCBva1Jlc3BvbnNlKFxuICAgICAgICBhd3NSZXF1ZXN0KFxuICAgICAgICAgICAgZW52LFxuICAgICAgICAgICAgJ0RFTEVURScsXG4gICAgICAgICAgICAnbGFtYmRhJyxcbiAgICAgICAgICAgIGAvMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtwcmVmaXh9LSR7c2VydmljZX0tJHtuYW1lfS9wb2xpY3kvJHtpZH1gLFxuICAgICAgICApLFxuICAgICAgICAnRXJyb3IgZGVsZXRpbmcgdHJpZ2dlcnMuJyxcbiAgICApXG59XG5cbmZ1bmN0aW9uIG1ha2VTdGF0ZW1lbnREYXRhKFxuICAgIHJlZ2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGFjY291bnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBhcGlHYXRld2F5SWQ6IHN0cmluZyxcbiAgICBmdW5jdGlvbklkOiBzdHJpbmcsXG4gICAgZm46IHtcbiAgICAgICAgbmFtZTogc3RyaW5nXG4gICAgICAgIG1ldGhvZDogc3RyaW5nXG4gICAgICAgIHBhdGhQYXR0ZXJuOiBzdHJpbmdcbiAgICB9LFxuKSB7XG4gICAgaWYgKCFyZWdpb24gfHwgIWFjY291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXZWlyZCcpXG4gICAgfVxuICAgIGxldCBwID0gMFxuICAgIHJldHVybiB7XG4gICAgICAgIEFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgIEVmZmVjdDogJ0FsbG93JyxcbiAgICAgICAgUHJpbmNpcGFsOiB7XG4gICAgICAgICAgICBTZXJ2aWNlOiAnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgfSxcbiAgICAgICAgUmVzb3VyY2U6IGZ1bmN0aW9uSWQsXG4gICAgICAgIENvbmRpdGlvbjoge1xuICAgICAgICAgICAgQXJuTGlrZToge1xuICAgICAgICAgICAgICAgICdBV1M6U291cmNlQXJuJzogYGFybjphd3M6ZXhlY3V0ZS1hcGk6JHtyZWdpb259OiR7YWNjb3VudH06JHthcGlHYXRld2F5SWR9LyovKi8ke3RyaW1UcmFpbGluZ1NsYXNoKFxuICAgICAgICAgICAgICAgICAgICBmbi5wYXRoUGF0dGVybi5yZXBsYWNlQWxsKCcqJywgKCkgPT4gYHtwJHsrK3B9fWApLFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfVxufVxuXG5mdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChwYXRoUGF0dGVybjogc3RyaW5nKSB7XG4gICAgaWYgKHBhdGhQYXR0ZXJuLmVuZHNXaXRoKCcvJykpIHtcbiAgICAgICAgcmV0dXJuIHBhdGhQYXR0ZXJuLnNsaWNlKDAsIC0xKVxuICAgIH1cbiAgICByZXR1cm4gcGF0aFBhdHRlcm5cbn1cbiJdfQ==