const __vite_ssr_import_0__ = await __vite_ssr_import__("/node_modules/vitest/dist/index.js", {"importedNames":["beforeAll","describe","expect","it","vi"]});
const __vite_ssr_import_1__ = await __vite_ssr_import__("/app/lib/crypto.server.ts", {"importedNames":["encrypt"]});
const __vite_ssr_import_2__ = await __vite_ssr_import__("/app/lib/tracking.server.ts", {"importedNames":["processPaidOrder","processRefund"]});



(0,__vite_ssr_import_0__.beforeAll)(() => {
  process.env.ENCRYPTION_KEY = Buffer.alloc(32, 7).toString("base64");
});
const order = {
  id: 42,
  email: "a@b.pl",
  currency: "PLN",
  subtotal_price: "10.00",
  note_attributes: [{ name: "fp_tid", value: "tid-1" }]
};
function setup(overrides = {}, outcome = { outcome: "tracked", status: 200 }) {
  const logs = [];
  const track = __vite_ssr_import_0__.vi.fn().mockResolvedValue(outcome);
  const settings = {
    accountId: "acc1",
    apiKeyEnc: (0,__vite_ssr_import_1__.encrypt)("my-api-key"),
    trackCoupons: true,
    couponPriority: "link",
    trackSales: true,
    trackRefunds: true,
    ...overrides
  };
  return {
    logs,
    track,
    deps: {
      getSettings: __vite_ssr_import_0__.vi.fn().mockResolvedValue(settings),
      logEvent: async (e) => void logs.push(e),
      track
    }
  };
}
(0,__vite_ssr_import_0__.describe)("processPaidOrder", () => {
  (0,__vite_ssr_import_0__.it)("decrypts the key, calls FirstPromoter and logs the result", async () => {
    const { deps, logs, track } = setup();
    const result = await (0,__vite_ssr_import_2__.processPaidOrder)("shop.myshopify.com", order, deps);
    (0,__vite_ssr_import_0__.expect)(result.retry).toBe(false);
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledWith(
      "sale",
      { accountId: "acc1", apiKey: "my-api-key" },
      __vite_ssr_import_0__.expect.objectContaining({ uid: "42", tid: "tid-1", amount: 1e3 }),
      __vite_ssr_import_0__.expect.anything()
    );
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "tracked", httpStatus: 200, type: "sale" });
  });
  (0,__vite_ssr_import_0__.it)("does not call FirstPromoter for orders without a referral", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", { ...order, note_attributes: [] }, deps);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "skipped", message: "no_link_or_code" });
  });
  (0,__vite_ssr_import_0__.it)("skips when the shop is not configured", async () => {
    const { deps, logs, track } = setup();
    deps.getSettings.mockResolvedValue(null);
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, deps);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0].message).toBe("not_configured");
  });
  (0,__vite_ssr_import_0__.it)("asks Shopify to redeliver when FirstPromoter is down", async () => {
    const { deps, logs } = setup({}, { outcome: "retry", status: 502 });
    (0,__vite_ssr_import_0__.expect)((await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, deps)).retry).toBe(true);
    (0,__vite_ssr_import_0__.expect)(logs[0].status).toBe("retrying");
  });
  (0,__vite_ssr_import_0__.it)("does not retry client errors but records them", async () => {
    const { deps, logs } = setup({}, { outcome: "error", status: 401, message: "bad key" });
    (0,__vite_ssr_import_0__.expect)((await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, deps)).retry).toBe(false);
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "error", httpStatus: 401 });
  });
  (0,__vite_ssr_import_0__.it)("logs unreadable credentials instead of throwing", async () => {
    const { deps, logs } = setup({ apiKeyEnc: "garbage" });
    (0,__vite_ssr_import_0__.expect)((await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, deps)).retry).toBe(false);
    (0,__vite_ssr_import_0__.expect)(logs[0].message).toBe("credentials_unreadable");
  });
  (0,__vite_ssr_import_0__.it)("respects the trackSales switch", async () => {
    const { deps, track } = setup({ trackSales: false });
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, deps);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
  });
});
(0,__vite_ssr_import_0__.describe)("processPaidOrder with coupon codes", () => {
  const withCode = { ...order, discount_codes: [{ code: "ANNA10" }] };
  const codeOnly = { ...withCode, note_attributes: [] };
  (0,__vite_ssr_import_0__.it)("sends the code with the order number as uid", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", codeOnly, deps);
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledTimes(1);
    const [kind, , body] = track.mock.calls[0];
    (0,__vite_ssr_import_0__.expect)(kind).toBe("sale");
    (0,__vite_ssr_import_0__.expect)(body).toMatchObject({ uid: "42", email: "a@b.pl", promo_code: "ANNA10", event_id: "42", amount: 1e3 });
    (0,__vite_ssr_import_0__.expect)(body.ref_id).toBeUndefined();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "tracked", message: "via code ANNA10" });
  });
  (0,__vite_ssr_import_0__.it)("falls back to the code when the link is not an affiliate's", async () => {
    const { deps, logs, track } = setup();
    track.mockResolvedValueOnce({ outcome: "no_referral", status: 404 }).mockResolvedValueOnce({ outcome: "tracked", status: 200 });
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", withCode, deps);
    (0,__vite_ssr_import_0__.expect)(track.mock.calls[0][2]).toMatchObject({ tid: "tid-1" });
    (0,__vite_ssr_import_0__.expect)(track.mock.calls[1][2]).toMatchObject({ promo_code: "ANNA10" });
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({
      status: "tracked",
      message: "via code ANNA10 (link is not a referral)"
    });
  });
  (0,__vite_ssr_import_0__.it)("stops after the first signal that FirstPromoter accepts", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", withCode, deps);
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledTimes(1);
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "tracked", message: "via link" });
  });
  (0,__vite_ssr_import_0__.it)("tries the code first when the priority says so", async () => {
    const { deps, track } = setup({ couponPriority: "code" });
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", withCode, deps);
    (0,__vite_ssr_import_0__.expect)(track.mock.calls[0][2]).toMatchObject({ promo_code: "ANNA10" });
  });
  (0,__vite_ssr_import_0__.it)("shows both attempts when the code fails and the link works", async () => {
    const { deps, logs, track } = setup({ couponPriority: "code" });
    track.mockResolvedValueOnce({ outcome: "no_referral", status: 404 }).mockResolvedValueOnce({ outcome: "tracked", status: 200 });
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", withCode, deps);
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({
      status: "tracked",
      message: "via link (code ANNA10 is not a referral)"
    });
  });
  (0,__vite_ssr_import_0__.it)("reports no referral only after every signal was rejected", async () => {
    const { deps, logs, track } = setup({}, { outcome: "no_referral", status: 404 });
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", withCode, deps);
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledTimes(2);
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({
      status: "no_referral",
      message: "link is not a referral; code ANNA10 is not a referral"
    });
  });
});
const tx = (amount) => [{ kind: "refund", status: "success", amount, currency: "PLN" }];
(0,__vite_ssr_import_0__.describe)("processRefund of a sale that was not tracked", () => {
  const refund = { id: 9, order_id: 42, refund_line_items: [], transactions: tx("4.00") };
  __vite_ssr_import_0__.it.each(["skipped", "no_referral"])("skips the refund when the sale was %s", async (status) => {
    const { deps, logs, track } = setup();
    const result = await (0,__vite_ssr_import_2__.processRefund)("s", refund, {
      ...deps,
      getSaleRecord: async () => ({ status, message: null })
    });
    (0,__vite_ssr_import_0__.expect)(result.retry).toBe(false);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ type: "refund", status: "skipped", message: "sale_not_tracked" });
  });
});
(0,__vite_ssr_import_0__.describe)("processRefund", () => {
  const refund = {
    id: 9,
    order_id: 42,
    refund_line_items: [{ subtotal_set: { shop_money: { amount: "4.00", currency_code: "PLN" } } }]
  };
  (0,__vite_ssr_import_0__.it)("sends a refund linked to the original sale", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processRefund)("s", refund, deps);
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledWith(
      "refund",
      __vite_ssr_import_0__.expect.anything(),
      { uid: "42", event_id: "refund-9", sale_event_id: "42", amount: "400", currency: "PLN" }
    );
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ type: "refund", eventId: "refund-9" });
  });
  (0,__vite_ssr_import_0__.it)("uses the order number looked up for the order as uid", async () => {
    const { deps, track } = setup();
    const getOrderName = __vite_ssr_import_0__.vi.fn().mockResolvedValue("#1003");
    await (0,__vite_ssr_import_2__.processRefund)("s", refund, { ...deps, getOrderName });
    (0,__vite_ssr_import_0__.expect)(getOrderName).toHaveBeenCalledWith("s", "42");
    (0,__vite_ssr_import_0__.expect)(track).toHaveBeenCalledWith(
      "refund",
      __vite_ssr_import_0__.expect.anything(),
      __vite_ssr_import_0__.expect.objectContaining({ uid: "#1003", sale_event_id: "42" })
    );
  });
  (0,__vite_ssr_import_0__.it)("asks Shopify to redeliver when the order lookup fails", async () => {
    const { deps, track, logs } = setup();
    const getOrderName = __vite_ssr_import_0__.vi.fn().mockRejectedValue(new Error("boom"));
    const result = await (0,__vite_ssr_import_2__.processRefund)("s", refund, { ...deps, getOrderName });
    (0,__vite_ssr_import_0__.expect)(result.retry).toBe(true);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({
      status: "retrying",
      message: "order_lookup_failed: boom"
    });
  });
  (0,__vite_ssr_import_0__.it)("respects the trackRefunds switch", async () => {
    const { deps, track } = setup({ trackRefunds: false });
    await (0,__vite_ssr_import_2__.processRefund)("s", refund, deps);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
  });
});
(0,__vite_ssr_import_0__.describe)("one delivery reaches FirstPromoter", () => {
  (0,__vite_ssr_import_0__.it)("does not send a sale another delivery already handled", async () => {
    const { deps, logs, track } = setup();
    const claim = __vite_ssr_import_0__.vi.fn().mockResolvedValue(false);
    (0,__vite_ssr_import_0__.expect)((await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, { ...deps, claim })).retry).toBe(false);
    (0,__vite_ssr_import_0__.expect)(claim).toHaveBeenCalledWith("s", "sale", "42", "42");
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs).toHaveLength(0);
  });
  (0,__vite_ssr_import_0__.it)("asks for a redelivery when the reservation cannot be made", async () => {
    const { deps, track } = setup();
    const claim = __vite_ssr_import_0__.vi.fn().mockRejectedValue(new Error("db down"));
    (0,__vite_ssr_import_0__.expect)((await (0,__vite_ssr_import_2__.processPaidOrder)("s", order, { ...deps, claim })).retry).toBe(true);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
  });
  (0,__vite_ssr_import_0__.it)("logs the amounts sent with the sale", async () => {
    const { deps, logs } = setup();
    await (0,__vite_ssr_import_2__.processPaidOrder)("s", { ...order, total_price: "12.30" }, { ...deps, claim: async () => true });
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "tracked", amount: 1e3, goodsPaid: 1230 });
  });
});
(0,__vite_ssr_import_0__.describe)("processRefund against the recorded sale", () => {
  const refund = { id: 9, order_id: 42, refund_line_items: [], transactions: tx("12.30") };
  const tracked = { status: "tracked", amount: 1e3, goodsPaid: 1230 };
  (0,__vite_ssr_import_0__.it)("waits for the sale when the refund comes first", async () => {
    const { deps, logs, track } = setup();
    const result = await (0,__vite_ssr_import_2__.processRefund)("s", refund, { ...deps, getSaleRecord: async () => null });
    (0,__vite_ssr_import_0__.expect)(result.retry).toBe(true);
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "retrying", message: "waiting_for_sale" });
  });
  (0,__vite_ssr_import_0__.it)("scales the refund to the commission base", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processRefund)("s", refund, { ...deps, getSaleRecord: async () => tracked, getRefundedAmount: async () => 0 });
    (0,__vite_ssr_import_0__.expect)(track.mock.calls[0][2]).toMatchObject({ amount: "1000" });
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "tracked", amount: 1e3 });
  });
  (0,__vite_ssr_import_0__.it)("skips a refund when earlier refunds used up the sale", async () => {
    const { deps, logs, track } = setup();
    await (0,__vite_ssr_import_2__.processRefund)("s", refund, { ...deps, getSaleRecord: async () => tracked, getRefundedAmount: async () => 1e3 });
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "skipped", message: "nothing_left_to_refund" });
  });
  (0,__vite_ssr_import_0__.it)("skips restock-only refunds without asking FirstPromoter", async () => {
    const { deps, logs, track } = setup();
    const restock = { id: 9, order_id: 42, refund_line_items: [{ subtotal: 5 }], transactions: [] };
    await (0,__vite_ssr_import_2__.processRefund)("s", restock, { ...deps, getSaleRecord: async () => tracked });
    (0,__vite_ssr_import_0__.expect)(track).not.toHaveBeenCalled();
    (0,__vite_ssr_import_0__.expect)(logs[0]).toMatchObject({ status: "skipped", message: "no_money_refunded" });
  });
});
//# sourceMappingSource=vite-generated
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOzs7O0dBT0EsaUNBQVUsTUFBTTtBQUNkLFVBQVEsSUFBSSxpQkFBaUIsT0FBTyxNQUFNLElBQUksQ0FBQyxFQUFFLFNBQVMsUUFBUTtBQUNwRSxDQUFDO0FBRUQsTUFBTSxRQUFRO0FBQUEsRUFDWixJQUFJO0FBQUEsRUFDSixPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUEsRUFDVixnQkFBZ0I7QUFBQSxFQUNoQixpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sVUFBVSxPQUFPLFFBQVEsQ0FBQztBQUN0RDtBQUVBLFNBQVMsTUFBTSxZQUFxQyxDQUFDLEdBQUcsVUFBa0IsRUFBRSxTQUFTLFdBQVcsUUFBUSxJQUFJLEdBQUc7QUFDN0csUUFBTSxPQUF3QixDQUFDO0FBQy9CLFFBQU0sUUFBUSx5QkFBRyxHQUFHLEVBQUUsa0JBQWtCLE9BQU87QUFDL0MsUUFBTSxXQUEyQjtBQUFBLElBQy9CLFdBQVc7QUFBQSxJQUNYLGNBQVcsK0JBQVEsWUFBWTtBQUFBLElBQy9CLGNBQWM7QUFBQSxJQUNkLGdCQUFnQjtBQUFBLElBQ2hCLFlBQVk7QUFBQSxJQUNaLGNBQWM7QUFBQSxJQUNkLEdBQUc7QUFBQSxFQUNMO0FBQ0EsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixhQUFhLHlCQUFHLEdBQUcsRUFBRSxrQkFBa0IsUUFBUTtBQUFBLE1BQy9DLFVBQVUsT0FBTyxNQUFxQixLQUFLLEtBQUssS0FBSyxDQUFDO0FBQUEsTUFDdEQ7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0dBRUEsZ0NBQVMsb0JBQW9CLE1BQU07QUFDakMsK0JBQUcsNkRBQTZELFlBQVk7QUFDMUUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTTtBQUNwQyxVQUFNLFNBQVMsU0FBTSx3Q0FBaUIsc0JBQXNCLE9BQU8sSUFBSTtBQUN2RSxxQ0FBTyxPQUFPLEtBQUssRUFBRSxLQUFLLEtBQUs7QUFDL0IscUNBQU8sS0FBSyxFQUFFO0FBQUEsTUFDWjtBQUFBLE1BQ0EsRUFBRSxXQUFXLFFBQVEsUUFBUSxhQUFhO0FBQUEsTUFDMUMsNkJBQU8saUJBQWlCLEVBQUUsS0FBSyxNQUFNLEtBQUssU0FBUyxRQUFRLElBQUssQ0FBQztBQUFBLE1BQ2pFLDZCQUFPLFNBQVM7QUFBQSxJQUNsQjtBQUNBLHFDQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsV0FBVyxZQUFZLEtBQUssTUFBTSxPQUFPLENBQUM7QUFBQSxFQUNwRixDQUFDO0FBQ0QsK0JBQUcsNkRBQTZELFlBQVk7QUFDMUUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTTtBQUNwQyxhQUFNLHdDQUFpQixLQUFLLEVBQUUsR0FBRyxPQUFPLGlCQUFpQixDQUFDLEVBQUUsR0FBRyxJQUFJO0FBQ25FLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUNuQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLFdBQVcsU0FBUyxrQkFBa0IsQ0FBQztBQUFBLEVBQ2pGLENBQUM7QUFDRCwrQkFBRyx5Q0FBeUMsWUFBWTtBQUN0RCxVQUFNLEVBQUUsTUFBTSxNQUFNLE1BQU0sSUFBSSxNQUFNO0FBQ3BDLFNBQUssWUFBWSxrQkFBa0IsSUFBSTtBQUN2QyxhQUFNLHdDQUFpQixLQUFLLE9BQU8sSUFBSTtBQUN2QyxxQ0FBTyxLQUFLLEVBQUUsSUFBSSxpQkFBaUI7QUFDbkMscUNBQU8sS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssZ0JBQWdCO0FBQUEsRUFDL0MsQ0FBQztBQUNELCtCQUFHLHdEQUF3RCxZQUFZO0FBQ3JFLFVBQU0sRUFBRSxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLFNBQVMsU0FBUyxRQUFRLElBQUksQ0FBQztBQUNsRSxzQ0FBUSxTQUFNLHdDQUFpQixLQUFLLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLElBQUk7QUFDbEUscUNBQU8sS0FBSyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssVUFBVTtBQUFBLEVBQ3hDLENBQUM7QUFDRCwrQkFBRyxpREFBaUQsWUFBWTtBQUM5RCxVQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLFNBQVMsUUFBUSxLQUFLLFNBQVMsVUFBVSxDQUFDO0FBQ3RGLHNDQUFRLFNBQU0sd0NBQWlCLEtBQUssT0FBTyxJQUFJLEdBQUcsS0FBSyxFQUFFLEtBQUssS0FBSztBQUNuRSxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLFNBQVMsWUFBWSxJQUFJLENBQUM7QUFBQSxFQUNwRSxDQUFDO0FBQ0QsK0JBQUcsbURBQW1ELFlBQVk7QUFDaEUsVUFBTSxFQUFFLE1BQU0sS0FBSyxJQUFJLE1BQU0sRUFBRSxXQUFXLFVBQVUsQ0FBQztBQUNyRCxzQ0FBUSxTQUFNLHdDQUFpQixLQUFLLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRSxLQUFLLEtBQUs7QUFDbkUscUNBQU8sS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssd0JBQXdCO0FBQUEsRUFDdkQsQ0FBQztBQUNELCtCQUFHLGtDQUFrQyxZQUFZO0FBQy9DLFVBQU0sRUFBRSxNQUFNLE1BQU0sSUFBSSxNQUFNLEVBQUUsWUFBWSxNQUFNLENBQUM7QUFDbkQsYUFBTSx3Q0FBaUIsS0FBSyxPQUFPLElBQUk7QUFDdkMscUNBQU8sS0FBSyxFQUFFLElBQUksaUJBQWlCO0FBQUEsRUFDckMsQ0FBQztBQUNILENBQUM7R0FFRCxnQ0FBUyxzQ0FBc0MsTUFBTTtBQUNuRCxRQUFNLFdBQVcsRUFBRSxHQUFHLE9BQU8sZ0JBQWdCLENBQUMsRUFBRSxNQUFNLFNBQVMsQ0FBQyxFQUFFO0FBQ2xFLFFBQU0sV0FBVyxFQUFFLEdBQUcsVUFBVSxpQkFBaUIsQ0FBQyxFQUFFO0FBQ3BELCtCQUFHLCtDQUErQyxZQUFZO0FBQzVELFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDcEMsYUFBTSx3Q0FBaUIsS0FBSyxVQUFVLElBQUk7QUFDMUMscUNBQU8sS0FBSyxFQUFFLHNCQUFzQixDQUFDO0FBQ3JDLFVBQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLE1BQU0sS0FBSyxNQUFNLENBQUM7QUFDekMscUNBQU8sSUFBSSxFQUFFLEtBQUssTUFBTTtBQUN4QixxQ0FBTyxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssTUFBTSxPQUFPLFVBQVUsWUFBWSxVQUFVLFVBQVUsTUFBTSxRQUFRLElBQUssQ0FBQztBQUM3RyxxQ0FBTyxLQUFLLE1BQU0sRUFBRSxjQUFjO0FBQ2xDLHFDQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsV0FBVyxTQUFTLGtCQUFrQixDQUFDO0FBQUEsRUFDakYsQ0FBQztBQUNELCtCQUFHLDhEQUE4RCxZQUFZO0FBQzNFLFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDcEMsVUFDRyxzQkFBc0IsRUFBRSxTQUFTLGVBQWUsUUFBUSxJQUFJLENBQUMsRUFDN0Qsc0JBQXNCLEVBQUUsU0FBUyxXQUFXLFFBQVEsSUFBSSxDQUFDO0FBQzVELGFBQU0sd0NBQWlCLEtBQUssVUFBVSxJQUFJO0FBQzFDLHFDQUFPLE1BQU0sS0FBSyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsS0FBSyxRQUFRLENBQUM7QUFDN0QscUNBQU8sTUFBTSxLQUFLLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxZQUFZLFNBQVMsQ0FBQztBQUNyRSxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWM7QUFBQSxNQUM1QixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0QsK0JBQUcsMkRBQTJELFlBQVk7QUFDeEUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTTtBQUNwQyxhQUFNLHdDQUFpQixLQUFLLFVBQVUsSUFBSTtBQUMxQyxxQ0FBTyxLQUFLLEVBQUUsc0JBQXNCLENBQUM7QUFDckMscUNBQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxXQUFXLFNBQVMsV0FBVyxDQUFDO0FBQUEsRUFDMUUsQ0FBQztBQUNELCtCQUFHLGtEQUFrRCxZQUFZO0FBQy9ELFVBQU0sRUFBRSxNQUFNLE1BQU0sSUFBSSxNQUFNLEVBQUUsZ0JBQWdCLE9BQU8sQ0FBQztBQUN4RCxhQUFNLHdDQUFpQixLQUFLLFVBQVUsSUFBSTtBQUMxQyxxQ0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFlBQVksU0FBUyxDQUFDO0FBQUEsRUFDdkUsQ0FBQztBQUNELCtCQUFHLDhEQUE4RCxZQUFZO0FBQzNFLFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxnQkFBZ0IsT0FBTyxDQUFDO0FBQzlELFVBQ0csc0JBQXNCLEVBQUUsU0FBUyxlQUFlLFFBQVEsSUFBSSxDQUFDLEVBQzdELHNCQUFzQixFQUFFLFNBQVMsV0FBVyxRQUFRLElBQUksQ0FBQztBQUM1RCxhQUFNLHdDQUFpQixLQUFLLFVBQVUsSUFBSTtBQUMxQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWM7QUFBQSxNQUM1QixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0QsK0JBQUcsNERBQTRELFlBQVk7QUFDekUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLGVBQWUsUUFBUSxJQUFJLENBQUM7QUFDL0UsYUFBTSx3Q0FBaUIsS0FBSyxVQUFVLElBQUk7QUFDMUMscUNBQU8sS0FBSyxFQUFFLHNCQUFzQixDQUFDO0FBQ3JDLHFDQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYztBQUFBLE1BQzVCLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxJQUNYLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxLQUFLLENBQUMsV0FBbUIsQ0FBQyxFQUFFLE1BQU0sVUFBVSxRQUFRLFdBQVcsUUFBUSxVQUFVLE1BQU0sQ0FBQztHQUU5RixnQ0FBUyxnREFBZ0QsTUFBTTtBQUM3RCxRQUFNLFNBQVMsRUFBRSxJQUFJLEdBQUcsVUFBVSxJQUFJLG1CQUFtQixDQUFDLEdBQUcsY0FBYyxHQUFHLE1BQU0sRUFBRTtBQUN0RiwyQkFBRyxLQUFLLENBQUMsV0FBVyxhQUFhLENBQVUsRUFBRSx5Q0FBeUMsT0FBTyxXQUFXO0FBQ3RHLFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDcEMsVUFBTSxTQUFTLFNBQU0scUNBQWMsS0FBSyxRQUFRO0FBQUEsTUFDOUMsR0FBRztBQUFBLE1BQ0gsZUFBZSxhQUFhLEVBQUUsUUFBUSxTQUFTLEtBQUs7QUFBQSxJQUN0RCxDQUFDO0FBQ0QscUNBQU8sT0FBTyxLQUFLLEVBQUUsS0FBSyxLQUFLO0FBQy9CLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUNuQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsUUFBUSxXQUFXLFNBQVMsbUJBQW1CLENBQUM7QUFBQSxFQUNsRyxDQUFDO0FBQ0gsQ0FBQztHQUVELGdDQUFTLGlCQUFpQixNQUFNO0FBQzlCLFFBQU0sU0FBUztBQUFBLElBQ2IsSUFBSTtBQUFBLElBQ0osVUFBVTtBQUFBLElBQ1YsbUJBQW1CLENBQUMsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLFFBQVEsUUFBUSxlQUFlLE1BQU0sRUFBRSxFQUFFLENBQUM7QUFBQSxFQUNoRztBQUNBLCtCQUFHLDhDQUE4QyxZQUFZO0FBQzNELFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDcEMsYUFBTSxxQ0FBYyxLQUFLLFFBQVEsSUFBSTtBQUNyQyxxQ0FBTyxLQUFLLEVBQUU7QUFBQSxNQUNaO0FBQUEsTUFDQSw2QkFBTyxTQUFTO0FBQUEsTUFDaEIsRUFBRSxLQUFLLE1BQU0sVUFBVSxZQUFZLGVBQWUsTUFBTSxRQUFRLE9BQU8sVUFBVSxNQUFNO0FBQUEsSUFDekY7QUFDQSxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLFVBQVUsU0FBUyxXQUFXLENBQUM7QUFBQSxFQUN2RSxDQUFDO0FBQ0QsK0JBQUcsd0RBQXdELFlBQVk7QUFDckUsVUFBTSxFQUFFLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDOUIsVUFBTSxlQUFlLHlCQUFHLEdBQUcsRUFBRSxrQkFBa0IsT0FBTztBQUN0RCxhQUFNLHFDQUFjLEtBQUssUUFBUSxFQUFFLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFDMUQscUNBQU8sWUFBWSxFQUFFLHFCQUFxQixLQUFLLElBQUk7QUFDbkQscUNBQU8sS0FBSyxFQUFFO0FBQUEsTUFDWjtBQUFBLE1BQ0EsNkJBQU8sU0FBUztBQUFBLE1BQ2hCLDZCQUFPLGlCQUFpQixFQUFFLEtBQUssU0FBUyxlQUFlLEtBQUssQ0FBQztBQUFBLElBQy9EO0FBQUEsRUFDRixDQUFDO0FBQ0QsK0JBQUcseURBQXlELFlBQVk7QUFDdEUsVUFBTSxFQUFFLE1BQU0sT0FBTyxLQUFLLElBQUksTUFBTTtBQUNwQyxVQUFNLGVBQWUseUJBQUcsR0FBRyxFQUFFLGtCQUFrQixJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLFVBQU0sU0FBUyxTQUFNLHFDQUFjLEtBQUssUUFBUSxFQUFFLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFDekUscUNBQU8sT0FBTyxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQzlCLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUNuQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWM7QUFBQSxNQUM1QixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsSUFDWCxDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0QsK0JBQUcsb0NBQW9DLFlBQVk7QUFDakQsVUFBTSxFQUFFLE1BQU0sTUFBTSxJQUFJLE1BQU0sRUFBRSxjQUFjLE1BQU0sQ0FBQztBQUNyRCxhQUFNLHFDQUFjLEtBQUssUUFBUSxJQUFJO0FBQ3JDLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUFBLEVBQ3JDLENBQUM7QUFDSCxDQUFDO0dBRUQsZ0NBQVMsc0NBQXNDLE1BQU07QUFDbkQsK0JBQUcseURBQXlELFlBQVk7QUFDdEUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTTtBQUNwQyxVQUFNLFFBQVEseUJBQUcsR0FBRyxFQUFFLGtCQUFrQixLQUFLO0FBQzdDLHNDQUFRLFNBQU0sd0NBQWlCLEtBQUssT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxLQUFLO0FBQ2pGLHFDQUFPLEtBQUssRUFBRSxxQkFBcUIsS0FBSyxRQUFRLE1BQU0sSUFBSTtBQUMxRCxxQ0FBTyxLQUFLLEVBQUUsSUFBSSxpQkFBaUI7QUFDbkMscUNBQU8sSUFBSSxFQUFFLGFBQWEsQ0FBQztBQUFBLEVBQzdCLENBQUM7QUFDRCwrQkFBRyw2REFBNkQsWUFBWTtBQUMxRSxVQUFNLEVBQUUsTUFBTSxNQUFNLElBQUksTUFBTTtBQUM5QixVQUFNLFFBQVEseUJBQUcsR0FBRyxFQUFFLGtCQUFrQixJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQzVELHNDQUFRLFNBQU0sd0NBQWlCLEtBQUssT0FBTyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQ2hGLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUFBLEVBQ3JDLENBQUM7QUFDRCwrQkFBRyx1Q0FBdUMsWUFBWTtBQUNwRCxVQUFNLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTTtBQUM3QixhQUFNLHdDQUFpQixLQUFLLEVBQUUsR0FBRyxPQUFPLGFBQWEsUUFBUSxHQUFHLEVBQUUsR0FBRyxNQUFNLE9BQU8sWUFBWSxLQUFLLENBQUM7QUFDcEcscUNBQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxXQUFXLFFBQVEsS0FBTSxXQUFXLEtBQUssQ0FBQztBQUFBLEVBQ3BGLENBQUM7QUFDSCxDQUFDO0dBRUQsZ0NBQVMsMkNBQTJDLE1BQU07QUFDeEQsUUFBTSxTQUFTLEVBQUUsSUFBSSxHQUFHLFVBQVUsSUFBSSxtQkFBbUIsQ0FBQyxHQUFHLGNBQWMsR0FBRyxPQUFPLEVBQUU7QUFDdkYsUUFBTSxVQUFVLEVBQUUsUUFBUSxXQUFvQixRQUFRLEtBQU0sV0FBVyxLQUFLO0FBQzVFLCtCQUFHLGtEQUFrRCxZQUFZO0FBQy9ELFVBQU0sRUFBRSxNQUFNLE1BQU0sTUFBTSxJQUFJLE1BQU07QUFDcEMsVUFBTSxTQUFTLFNBQU0scUNBQWMsS0FBSyxRQUFRLEVBQUUsR0FBRyxNQUFNLGVBQWUsWUFBWSxLQUFLLENBQUM7QUFDNUYscUNBQU8sT0FBTyxLQUFLLEVBQUUsS0FBSyxJQUFJO0FBQzlCLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUNuQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLFlBQVksU0FBUyxtQkFBbUIsQ0FBQztBQUFBLEVBQ25GLENBQUM7QUFDRCwrQkFBRyw0Q0FBNEMsWUFBWTtBQUN6RCxVQUFNLEVBQUUsTUFBTSxNQUFNLE1BQU0sSUFBSSxNQUFNO0FBQ3BDLGFBQU0scUNBQWMsS0FBSyxRQUFRLEVBQUUsR0FBRyxNQUFNLGVBQWUsWUFBWSxTQUFTLG1CQUFtQixZQUFZLEVBQUUsQ0FBQztBQUNsSCxxQ0FBTyxNQUFNLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsT0FBTyxDQUFDO0FBQy9ELHFDQUFPLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsV0FBVyxRQUFRLElBQUssQ0FBQztBQUFBLEVBQ25FLENBQUM7QUFDRCwrQkFBRyx3REFBd0QsWUFBWTtBQUNyRSxVQUFNLEVBQUUsTUFBTSxNQUFNLE1BQU0sSUFBSSxNQUFNO0FBQ3BDLGFBQU0scUNBQWMsS0FBSyxRQUFRLEVBQUUsR0FBRyxNQUFNLGVBQWUsWUFBWSxTQUFTLG1CQUFtQixZQUFZLElBQUssQ0FBQztBQUNySCxxQ0FBTyxLQUFLLEVBQUUsSUFBSSxpQkFBaUI7QUFDbkMscUNBQU8sS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsUUFBUSxXQUFXLFNBQVMseUJBQXlCLENBQUM7QUFBQSxFQUN4RixDQUFDO0FBQ0QsK0JBQUcsMkRBQTJELFlBQVk7QUFDeEUsVUFBTSxFQUFFLE1BQU0sTUFBTSxNQUFNLElBQUksTUFBTTtBQUNwQyxVQUFNLFVBQVUsRUFBRSxJQUFJLEdBQUcsVUFBVSxJQUFJLG1CQUFtQixDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRTtBQUM5RixhQUFNLHFDQUFjLEtBQUssU0FBUyxFQUFFLEdBQUcsTUFBTSxlQUFlLFlBQVksUUFBUSxDQUFDO0FBQ2pGLHFDQUFPLEtBQUssRUFBRSxJQUFJLGlCQUFpQjtBQUNuQyxxQ0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxRQUFRLFdBQVcsU0FBUyxvQkFBb0IsQ0FBQztBQUFBLEVBQ25GLENBQUM7QUFDSCxDQUFDIiwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlcyI6WyJ0cmFja2luZy50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGJlZm9yZUFsbCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSBcInZpdGVzdFwiO1xuaW1wb3J0IHsgZW5jcnlwdCB9IGZyb20gXCIuLi9hcHAvbGliL2NyeXB0by5zZXJ2ZXJcIjtcbmltcG9ydCB7XG4gIHByb2Nlc3NQYWlkT3JkZXIsXG4gIHByb2Nlc3NSZWZ1bmQsXG4gIHR5cGUgRXZlbnRMb2dFbnRyeSxcbiAgdHlwZSBTdG9yZWRTZXR0aW5ncyxcbn0gZnJvbSBcIi4uL2FwcC9saWIvdHJhY2tpbmcuc2VydmVyXCI7XG5cbmJlZm9yZUFsbCgoKSA9PiB7XG4gIHByb2Nlc3MuZW52LkVOQ1JZUFRJT05fS0VZID0gQnVmZmVyLmFsbG9jKDMyLCA3KS50b1N0cmluZyhcImJhc2U2NFwiKTtcbn0pO1xuXG5jb25zdCBvcmRlciA9IHtcbiAgaWQ6IDQyLFxuICBlbWFpbDogXCJhQGIucGxcIixcbiAgY3VycmVuY3k6IFwiUExOXCIsXG4gIHN1YnRvdGFsX3ByaWNlOiBcIjEwLjAwXCIsXG4gIG5vdGVfYXR0cmlidXRlczogW3sgbmFtZTogXCJmcF90aWRcIiwgdmFsdWU6IFwidGlkLTFcIiB9XSxcbn07XG5cbmZ1bmN0aW9uIHNldHVwKG92ZXJyaWRlczogUGFydGlhbDxTdG9yZWRTZXR0aW5ncz4gPSB7fSwgb3V0Y29tZTogb2JqZWN0ID0geyBvdXRjb21lOiBcInRyYWNrZWRcIiwgc3RhdHVzOiAyMDAgfSkge1xuICBjb25zdCBsb2dzOiBFdmVudExvZ0VudHJ5W10gPSBbXTtcbiAgY29uc3QgdHJhY2sgPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKG91dGNvbWUpO1xuICBjb25zdCBzZXR0aW5nczogU3RvcmVkU2V0dGluZ3MgPSB7XG4gICAgYWNjb3VudElkOiBcImFjYzFcIixcbiAgICBhcGlLZXlFbmM6IGVuY3J5cHQoXCJteS1hcGkta2V5XCIpLFxuICAgIHRyYWNrQ291cG9uczogdHJ1ZSxcbiAgICBjb3Vwb25Qcmlvcml0eTogXCJsaW5rXCIsXG4gICAgdHJhY2tTYWxlczogdHJ1ZSxcbiAgICB0cmFja1JlZnVuZHM6IHRydWUsXG4gICAgLi4ub3ZlcnJpZGVzLFxuICB9O1xuICByZXR1cm4ge1xuICAgIGxvZ3MsXG4gICAgdHJhY2ssXG4gICAgZGVwczoge1xuICAgICAgZ2V0U2V0dGluZ3M6IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoc2V0dGluZ3MpLFxuICAgICAgbG9nRXZlbnQ6IGFzeW5jIChlOiBFdmVudExvZ0VudHJ5KSA9PiB2b2lkIGxvZ3MucHVzaChlKSxcbiAgICAgIHRyYWNrOiB0cmFjayBhcyBuZXZlcixcbiAgICB9LFxuICB9O1xufVxuXG5kZXNjcmliZShcInByb2Nlc3NQYWlkT3JkZXJcIiwgKCkgPT4ge1xuICBpdChcImRlY3J5cHRzIHRoZSBrZXksIGNhbGxzIEZpcnN0UHJvbW90ZXIgYW5kIGxvZ3MgdGhlIHJlc3VsdFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzUGFpZE9yZGVyKFwic2hvcC5teXNob3BpZnkuY29tXCIsIG9yZGVyLCBkZXBzKTtcbiAgICBleHBlY3QocmVzdWx0LnJldHJ5KS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QodHJhY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgXCJzYWxlXCIsXG4gICAgICB7IGFjY291bnRJZDogXCJhY2MxXCIsIGFwaUtleTogXCJteS1hcGkta2V5XCIgfSxcbiAgICAgIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgdWlkOiBcIjQyXCIsIHRpZDogXCJ0aWQtMVwiLCBhbW91bnQ6IDEwMDAgfSksXG4gICAgICBleHBlY3QuYW55dGhpbmcoKSxcbiAgICApO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgc3RhdHVzOiBcInRyYWNrZWRcIiwgaHR0cFN0YXR1czogMjAwLCB0eXBlOiBcInNhbGVcIiB9KTtcbiAgfSk7XG4gIGl0KFwiZG9lcyBub3QgY2FsbCBGaXJzdFByb21vdGVyIGZvciBvcmRlcnMgd2l0aG91dCBhIHJlZmVycmFsXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIHsgLi4ub3JkZXIsIG5vdGVfYXR0cmlidXRlczogW10gfSwgZGVwcyk7XG4gICAgZXhwZWN0KHRyYWNrKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgc3RhdHVzOiBcInNraXBwZWRcIiwgbWVzc2FnZTogXCJub19saW5rX29yX2NvZGVcIiB9KTtcbiAgfSk7XG4gIGl0KFwic2tpcHMgd2hlbiB0aGUgc2hvcCBpcyBub3QgY29uZmlndXJlZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoKTtcbiAgICBkZXBzLmdldFNldHRpbmdzLm1vY2tSZXNvbHZlZFZhbHVlKG51bGwpO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIG9yZGVyLCBkZXBzKTtcbiAgICBleHBlY3QodHJhY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KGxvZ3NbMF0ubWVzc2FnZSkudG9CZShcIm5vdF9jb25maWd1cmVkXCIpO1xuICB9KTtcbiAgaXQoXCJhc2tzIFNob3BpZnkgdG8gcmVkZWxpdmVyIHdoZW4gRmlyc3RQcm9tb3RlciBpcyBkb3duXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MgfSA9IHNldHVwKHt9LCB7IG91dGNvbWU6IFwicmV0cnlcIiwgc3RhdHVzOiA1MDIgfSk7XG4gICAgZXhwZWN0KChhd2FpdCBwcm9jZXNzUGFpZE9yZGVyKFwic1wiLCBvcmRlciwgZGVwcykpLnJldHJ5KS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChsb2dzWzBdLnN0YXR1cykudG9CZShcInJldHJ5aW5nXCIpO1xuICB9KTtcbiAgaXQoXCJkb2VzIG5vdCByZXRyeSBjbGllbnQgZXJyb3JzIGJ1dCByZWNvcmRzIHRoZW1cIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgbG9ncyB9ID0gc2V0dXAoe30sIHsgb3V0Y29tZTogXCJlcnJvclwiLCBzdGF0dXM6IDQwMSwgbWVzc2FnZTogXCJiYWQga2V5XCIgfSk7XG4gICAgZXhwZWN0KChhd2FpdCBwcm9jZXNzUGFpZE9yZGVyKFwic1wiLCBvcmRlciwgZGVwcykpLnJldHJ5KS50b0JlKGZhbHNlKTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7IHN0YXR1czogXCJlcnJvclwiLCBodHRwU3RhdHVzOiA0MDEgfSk7XG4gIH0pO1xuICBpdChcImxvZ3MgdW5yZWFkYWJsZSBjcmVkZW50aWFscyBpbnN0ZWFkIG9mIHRocm93aW5nXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MgfSA9IHNldHVwKHsgYXBpS2V5RW5jOiBcImdhcmJhZ2VcIiB9KTtcbiAgICBleHBlY3QoKGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIG9yZGVyLCBkZXBzKSkucmV0cnkpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChsb2dzWzBdLm1lc3NhZ2UpLnRvQmUoXCJjcmVkZW50aWFsc191bnJlYWRhYmxlXCIpO1xuICB9KTtcbiAgaXQoXCJyZXNwZWN0cyB0aGUgdHJhY2tTYWxlcyBzd2l0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgdHJhY2sgfSA9IHNldHVwKHsgdHJhY2tTYWxlczogZmFsc2UgfSk7XG4gICAgYXdhaXQgcHJvY2Vzc1BhaWRPcmRlcihcInNcIiwgb3JkZXIsIGRlcHMpO1xuICAgIGV4cGVjdCh0cmFjaykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJwcm9jZXNzUGFpZE9yZGVyIHdpdGggY291cG9uIGNvZGVzXCIsICgpID0+IHtcbiAgY29uc3Qgd2l0aENvZGUgPSB7IC4uLm9yZGVyLCBkaXNjb3VudF9jb2RlczogW3sgY29kZTogXCJBTk5BMTBcIiB9XSB9O1xuICBjb25zdCBjb2RlT25seSA9IHsgLi4ud2l0aENvZGUsIG5vdGVfYXR0cmlidXRlczogW10gfTtcbiAgaXQoXCJzZW5kcyB0aGUgY29kZSB3aXRoIHRoZSBvcmRlciBudW1iZXIgYXMgdWlkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIGNvZGVPbmx5LCBkZXBzKTtcbiAgICBleHBlY3QodHJhY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBjb25zdCBba2luZCwgLCBib2R5XSA9IHRyYWNrLm1vY2suY2FsbHNbMF07XG4gICAgZXhwZWN0KGtpbmQpLnRvQmUoXCJzYWxlXCIpO1xuICAgIGV4cGVjdChib2R5KS50b01hdGNoT2JqZWN0KHsgdWlkOiBcIjQyXCIsIGVtYWlsOiBcImFAYi5wbFwiLCBwcm9tb19jb2RlOiBcIkFOTkExMFwiLCBldmVudF9pZDogXCI0MlwiLCBhbW91bnQ6IDEwMDAgfSk7XG4gICAgZXhwZWN0KGJvZHkucmVmX2lkKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KGxvZ3NbMF0pLnRvTWF0Y2hPYmplY3QoeyBzdGF0dXM6IFwidHJhY2tlZFwiLCBtZXNzYWdlOiBcInZpYSBjb2RlIEFOTkExMFwiIH0pO1xuICB9KTtcbiAgaXQoXCJmYWxscyBiYWNrIHRvIHRoZSBjb2RlIHdoZW4gdGhlIGxpbmsgaXMgbm90IGFuIGFmZmlsaWF0ZSdzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIHRyYWNrXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgb3V0Y29tZTogXCJub19yZWZlcnJhbFwiLCBzdGF0dXM6IDQwNCB9KVxuICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSh7IG91dGNvbWU6IFwidHJhY2tlZFwiLCBzdGF0dXM6IDIwMCB9KTtcbiAgICBhd2FpdCBwcm9jZXNzUGFpZE9yZGVyKFwic1wiLCB3aXRoQ29kZSwgZGVwcyk7XG4gICAgZXhwZWN0KHRyYWNrLm1vY2suY2FsbHNbMF1bMl0pLnRvTWF0Y2hPYmplY3QoeyB0aWQ6IFwidGlkLTFcIiB9KTtcbiAgICBleHBlY3QodHJhY2subW9jay5jYWxsc1sxXVsyXSkudG9NYXRjaE9iamVjdCh7IHByb21vX2NvZGU6IFwiQU5OQTEwXCIgfSk7XG4gICAgZXhwZWN0KGxvZ3NbMF0pLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgc3RhdHVzOiBcInRyYWNrZWRcIixcbiAgICAgIG1lc3NhZ2U6IFwidmlhIGNvZGUgQU5OQTEwIChsaW5rIGlzIG5vdCBhIHJlZmVycmFsKVwiLFxuICAgIH0pO1xuICB9KTtcbiAgaXQoXCJzdG9wcyBhZnRlciB0aGUgZmlyc3Qgc2lnbmFsIHRoYXQgRmlyc3RQcm9tb3RlciBhY2NlcHRzXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIHdpdGhDb2RlLCBkZXBzKTtcbiAgICBleHBlY3QodHJhY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7IHN0YXR1czogXCJ0cmFja2VkXCIsIG1lc3NhZ2U6IFwidmlhIGxpbmtcIiB9KTtcbiAgfSk7XG4gIGl0KFwidHJpZXMgdGhlIGNvZGUgZmlyc3Qgd2hlbiB0aGUgcHJpb3JpdHkgc2F5cyBzb1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCB0cmFjayB9ID0gc2V0dXAoeyBjb3Vwb25Qcmlvcml0eTogXCJjb2RlXCIgfSk7XG4gICAgYXdhaXQgcHJvY2Vzc1BhaWRPcmRlcihcInNcIiwgd2l0aENvZGUsIGRlcHMpO1xuICAgIGV4cGVjdCh0cmFjay5tb2NrLmNhbGxzWzBdWzJdKS50b01hdGNoT2JqZWN0KHsgcHJvbW9fY29kZTogXCJBTk5BMTBcIiB9KTtcbiAgfSk7XG4gIGl0KFwic2hvd3MgYm90aCBhdHRlbXB0cyB3aGVuIHRoZSBjb2RlIGZhaWxzIGFuZCB0aGUgbGluayB3b3Jrc1wiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoeyBjb3Vwb25Qcmlvcml0eTogXCJjb2RlXCIgfSk7XG4gICAgdHJhY2tcbiAgICAgIC5tb2NrUmVzb2x2ZWRWYWx1ZU9uY2UoeyBvdXRjb21lOiBcIm5vX3JlZmVycmFsXCIsIHN0YXR1czogNDA0IH0pXG4gICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHsgb3V0Y29tZTogXCJ0cmFja2VkXCIsIHN0YXR1czogMjAwIH0pO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIHdpdGhDb2RlLCBkZXBzKTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBzdGF0dXM6IFwidHJhY2tlZFwiLFxuICAgICAgbWVzc2FnZTogXCJ2aWEgbGluayAoY29kZSBBTk5BMTAgaXMgbm90IGEgcmVmZXJyYWwpXCIsXG4gICAgfSk7XG4gIH0pO1xuICBpdChcInJlcG9ydHMgbm8gcmVmZXJyYWwgb25seSBhZnRlciBldmVyeSBzaWduYWwgd2FzIHJlamVjdGVkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MsIHRyYWNrIH0gPSBzZXR1cCh7fSwgeyBvdXRjb21lOiBcIm5vX3JlZmVycmFsXCIsIHN0YXR1czogNDA0IH0pO1xuICAgIGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIHdpdGhDb2RlLCBkZXBzKTtcbiAgICBleHBlY3QodHJhY2spLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygyKTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBzdGF0dXM6IFwibm9fcmVmZXJyYWxcIixcbiAgICAgIG1lc3NhZ2U6IFwibGluayBpcyBub3QgYSByZWZlcnJhbDsgY29kZSBBTk5BMTAgaXMgbm90IGEgcmVmZXJyYWxcIixcbiAgICB9KTtcbiAgfSk7XG59KTtcblxuY29uc3QgdHggPSAoYW1vdW50OiBzdHJpbmcpID0+IFt7IGtpbmQ6IFwicmVmdW5kXCIsIHN0YXR1czogXCJzdWNjZXNzXCIsIGFtb3VudCwgY3VycmVuY3k6IFwiUExOXCIgfV07XG5cbmRlc2NyaWJlKFwicHJvY2Vzc1JlZnVuZCBvZiBhIHNhbGUgdGhhdCB3YXMgbm90IHRyYWNrZWRcIiwgKCkgPT4ge1xuICBjb25zdCByZWZ1bmQgPSB7IGlkOiA5LCBvcmRlcl9pZDogNDIsIHJlZnVuZF9saW5lX2l0ZW1zOiBbXSwgdHJhbnNhY3Rpb25zOiB0eChcIjQuMDBcIikgfTtcbiAgaXQuZWFjaChbXCJza2lwcGVkXCIsIFwibm9fcmVmZXJyYWxcIl0gYXMgY29uc3QpKFwic2tpcHMgdGhlIHJlZnVuZCB3aGVuIHRoZSBzYWxlIHdhcyAlc1wiLCBhc3luYyAoc3RhdHVzKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzUmVmdW5kKFwic1wiLCByZWZ1bmQsIHtcbiAgICAgIC4uLmRlcHMsXG4gICAgICBnZXRTYWxlUmVjb3JkOiBhc3luYyAoKSA9PiAoeyBzdGF0dXMsIG1lc3NhZ2U6IG51bGwgfSksXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlc3VsdC5yZXRyeSkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KHRyYWNrKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgdHlwZTogXCJyZWZ1bmRcIiwgc3RhdHVzOiBcInNraXBwZWRcIiwgbWVzc2FnZTogXCJzYWxlX25vdF90cmFja2VkXCIgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicHJvY2Vzc1JlZnVuZFwiLCAoKSA9PiB7XG4gIGNvbnN0IHJlZnVuZCA9IHtcbiAgICBpZDogOSxcbiAgICBvcmRlcl9pZDogNDIsXG4gICAgcmVmdW5kX2xpbmVfaXRlbXM6IFt7IHN1YnRvdGFsX3NldDogeyBzaG9wX21vbmV5OiB7IGFtb3VudDogXCI0LjAwXCIsIGN1cnJlbmN5X2NvZGU6IFwiUExOXCIgfSB9IH1dLFxuICB9O1xuICBpdChcInNlbmRzIGEgcmVmdW5kIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgc2FsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoKTtcbiAgICBhd2FpdCBwcm9jZXNzUmVmdW5kKFwic1wiLCByZWZ1bmQsIGRlcHMpO1xuICAgIGV4cGVjdCh0cmFjaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcInJlZnVuZFwiLFxuICAgICAgZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICB7IHVpZDogXCI0MlwiLCBldmVudF9pZDogXCJyZWZ1bmQtOVwiLCBzYWxlX2V2ZW50X2lkOiBcIjQyXCIsIGFtb3VudDogXCI0MDBcIiwgY3VycmVuY3k6IFwiUExOXCIgfSxcbiAgICApO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgdHlwZTogXCJyZWZ1bmRcIiwgZXZlbnRJZDogXCJyZWZ1bmQtOVwiIH0pO1xuICB9KTtcbiAgaXQoXCJ1c2VzIHRoZSBvcmRlciBudW1iZXIgbG9va2VkIHVwIGZvciB0aGUgb3JkZXIgYXMgdWlkXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIGNvbnN0IGdldE9yZGVyTmFtZSA9IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoXCIjMTAwM1wiKTtcbiAgICBhd2FpdCBwcm9jZXNzUmVmdW5kKFwic1wiLCByZWZ1bmQsIHsgLi4uZGVwcywgZ2V0T3JkZXJOYW1lIH0pO1xuICAgIGV4cGVjdChnZXRPcmRlck5hbWUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFwic1wiLCBcIjQyXCIpO1xuICAgIGV4cGVjdCh0cmFjaykudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcInJlZnVuZFwiLFxuICAgICAgZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7IHVpZDogXCIjMTAwM1wiLCBzYWxlX2V2ZW50X2lkOiBcIjQyXCIgfSksXG4gICAgKTtcbiAgfSk7XG4gIGl0KFwiYXNrcyBTaG9waWZ5IHRvIHJlZGVsaXZlciB3aGVuIHRoZSBvcmRlciBsb29rdXAgZmFpbHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgdHJhY2ssIGxvZ3MgfSA9IHNldHVwKCk7XG4gICAgY29uc3QgZ2V0T3JkZXJOYW1lID0gdmkuZm4oKS5tb2NrUmVqZWN0ZWRWYWx1ZShuZXcgRXJyb3IoXCJib29tXCIpKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm9jZXNzUmVmdW5kKFwic1wiLCByZWZ1bmQsIHsgLi4uZGVwcywgZ2V0T3JkZXJOYW1lIH0pO1xuICAgIGV4cGVjdChyZXN1bHQucmV0cnkpLnRvQmUodHJ1ZSk7XG4gICAgZXhwZWN0KHRyYWNrKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIHN0YXR1czogXCJyZXRyeWluZ1wiLFxuICAgICAgbWVzc2FnZTogXCJvcmRlcl9sb29rdXBfZmFpbGVkOiBib29tXCIsXG4gICAgfSk7XG4gIH0pO1xuICBpdChcInJlc3BlY3RzIHRoZSB0cmFja1JlZnVuZHMgc3dpdGNoXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIHRyYWNrIH0gPSBzZXR1cCh7IHRyYWNrUmVmdW5kczogZmFsc2UgfSk7XG4gICAgYXdhaXQgcHJvY2Vzc1JlZnVuZChcInNcIiwgcmVmdW5kLCBkZXBzKTtcbiAgICBleHBlY3QodHJhY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwib25lIGRlbGl2ZXJ5IHJlYWNoZXMgRmlyc3RQcm9tb3RlclwiLCAoKSA9PiB7XG4gIGl0KFwiZG9lcyBub3Qgc2VuZCBhIHNhbGUgYW5vdGhlciBkZWxpdmVyeSBhbHJlYWR5IGhhbmRsZWRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgbG9ncywgdHJhY2sgfSA9IHNldHVwKCk7XG4gICAgY29uc3QgY2xhaW0gPSB2aS5mbigpLm1vY2tSZXNvbHZlZFZhbHVlKGZhbHNlKTtcbiAgICBleHBlY3QoKGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIG9yZGVyLCB7IC4uLmRlcHMsIGNsYWltIH0pKS5yZXRyeSkudG9CZShmYWxzZSk7XG4gICAgZXhwZWN0KGNsYWltKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcInNcIiwgXCJzYWxlXCIsIFwiNDJcIiwgXCI0MlwiKTtcbiAgICBleHBlY3QodHJhY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KGxvZ3MpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG4gIGl0KFwiYXNrcyBmb3IgYSByZWRlbGl2ZXJ5IHdoZW4gdGhlIHJlc2VydmF0aW9uIGNhbm5vdCBiZSBtYWRlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIHRyYWNrIH0gPSBzZXR1cCgpO1xuICAgIGNvbnN0IGNsYWltID0gdmkuZm4oKS5tb2NrUmVqZWN0ZWRWYWx1ZShuZXcgRXJyb3IoXCJkYiBkb3duXCIpKTtcbiAgICBleHBlY3QoKGF3YWl0IHByb2Nlc3NQYWlkT3JkZXIoXCJzXCIsIG9yZGVyLCB7IC4uLmRlcHMsIGNsYWltIH0pKS5yZXRyeSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3QodHJhY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuICBpdChcImxvZ3MgdGhlIGFtb3VudHMgc2VudCB3aXRoIHRoZSBzYWxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlcHMsIGxvZ3MgfSA9IHNldHVwKCk7XG4gICAgYXdhaXQgcHJvY2Vzc1BhaWRPcmRlcihcInNcIiwgeyAuLi5vcmRlciwgdG90YWxfcHJpY2U6IFwiMTIuMzBcIiB9LCB7IC4uLmRlcHMsIGNsYWltOiBhc3luYyAoKSA9PiB0cnVlIH0pO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgc3RhdHVzOiBcInRyYWNrZWRcIiwgYW1vdW50OiAxMDAwLCBnb29kc1BhaWQ6IDEyMzAgfSk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwicHJvY2Vzc1JlZnVuZCBhZ2FpbnN0IHRoZSByZWNvcmRlZCBzYWxlXCIsICgpID0+IHtcbiAgY29uc3QgcmVmdW5kID0geyBpZDogOSwgb3JkZXJfaWQ6IDQyLCByZWZ1bmRfbGluZV9pdGVtczogW10sIHRyYW5zYWN0aW9uczogdHgoXCIxMi4zMFwiKSB9O1xuICBjb25zdCB0cmFja2VkID0geyBzdGF0dXM6IFwidHJhY2tlZFwiIGFzIGNvbnN0LCBhbW91bnQ6IDEwMDAsIGdvb2RzUGFpZDogMTIzMCB9O1xuICBpdChcIndhaXRzIGZvciB0aGUgc2FsZSB3aGVuIHRoZSByZWZ1bmQgY29tZXMgZmlyc3RcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgbG9ncywgdHJhY2sgfSA9IHNldHVwKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvY2Vzc1JlZnVuZChcInNcIiwgcmVmdW5kLCB7IC4uLmRlcHMsIGdldFNhbGVSZWNvcmQ6IGFzeW5jICgpID0+IG51bGwgfSk7XG4gICAgZXhwZWN0KHJlc3VsdC5yZXRyeSkudG9CZSh0cnVlKTtcbiAgICBleHBlY3QodHJhY2spLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgZXhwZWN0KGxvZ3NbMF0pLnRvTWF0Y2hPYmplY3QoeyBzdGF0dXM6IFwicmV0cnlpbmdcIiwgbWVzc2FnZTogXCJ3YWl0aW5nX2Zvcl9zYWxlXCIgfSk7XG4gIH0pO1xuICBpdChcInNjYWxlcyB0aGUgcmVmdW5kIHRvIHRoZSBjb21taXNzaW9uIGJhc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgbG9ncywgdHJhY2sgfSA9IHNldHVwKCk7XG4gICAgYXdhaXQgcHJvY2Vzc1JlZnVuZChcInNcIiwgcmVmdW5kLCB7IC4uLmRlcHMsIGdldFNhbGVSZWNvcmQ6IGFzeW5jICgpID0+IHRyYWNrZWQsIGdldFJlZnVuZGVkQW1vdW50OiBhc3luYyAoKSA9PiAwIH0pO1xuICAgIGV4cGVjdCh0cmFjay5tb2NrLmNhbGxzWzBdWzJdKS50b01hdGNoT2JqZWN0KHsgYW1vdW50OiBcIjEwMDBcIiB9KTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7IHN0YXR1czogXCJ0cmFja2VkXCIsIGFtb3VudDogMTAwMCB9KTtcbiAgfSk7XG4gIGl0KFwic2tpcHMgYSByZWZ1bmQgd2hlbiBlYXJsaWVyIHJlZnVuZHMgdXNlZCB1cCB0aGUgc2FsZVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZXBzLCBsb2dzLCB0cmFjayB9ID0gc2V0dXAoKTtcbiAgICBhd2FpdCBwcm9jZXNzUmVmdW5kKFwic1wiLCByZWZ1bmQsIHsgLi4uZGVwcywgZ2V0U2FsZVJlY29yZDogYXN5bmMgKCkgPT4gdHJhY2tlZCwgZ2V0UmVmdW5kZWRBbW91bnQ6IGFzeW5jICgpID0+IDEwMDAgfSk7XG4gICAgZXhwZWN0KHRyYWNrKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIGV4cGVjdChsb2dzWzBdKS50b01hdGNoT2JqZWN0KHsgc3RhdHVzOiBcInNraXBwZWRcIiwgbWVzc2FnZTogXCJub3RoaW5nX2xlZnRfdG9fcmVmdW5kXCIgfSk7XG4gIH0pO1xuICBpdChcInNraXBzIHJlc3RvY2stb25seSByZWZ1bmRzIHdpdGhvdXQgYXNraW5nIEZpcnN0UHJvbW90ZXJcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVwcywgbG9ncywgdHJhY2sgfSA9IHNldHVwKCk7XG4gICAgY29uc3QgcmVzdG9jayA9IHsgaWQ6IDksIG9yZGVyX2lkOiA0MiwgcmVmdW5kX2xpbmVfaXRlbXM6IFt7IHN1YnRvdGFsOiA1IH1dLCB0cmFuc2FjdGlvbnM6IFtdIH07XG4gICAgYXdhaXQgcHJvY2Vzc1JlZnVuZChcInNcIiwgcmVzdG9jaywgeyAuLi5kZXBzLCBnZXRTYWxlUmVjb3JkOiBhc3luYyAoKSA9PiB0cmFja2VkIH0pO1xuICAgIGV4cGVjdCh0cmFjaykubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QobG9nc1swXSkudG9NYXRjaE9iamVjdCh7IHN0YXR1czogXCJza2lwcGVkXCIsIG1lc3NhZ2U6IFwibm9fbW9uZXlfcmVmdW5kZWRcIiB9KTtcbiAgfSk7XG59KTtcbiJdLCJmaWxlIjoiL3Rlc3RzL3RyYWNraW5nLnRlc3QudHMifQ==

//# vitestCache=W3siZmlsZSI6IjEiLCJpZCI6IjEiLCJ1cmwiOiIyIiwiaW1wb3J0cyI6IjMiLCJtYXBwaW5ncyI6ZmFsc2UsImRlcHMiOiI0IiwiZHluYW1pY0RlcHMiOiI1Iiwic3RhdGljTW9ja3MiOm51bGx9LCIvVXNlcnMvZGF3aWQvRGVza3RvcC9maXJzdHByb21vdGVyLXNob3BpZnktYXBwL3Rlc3RzL3RyYWNraW5nLnRlc3QudHMiLCIvdGVzdHMvdHJhY2tpbmcudGVzdC50cyIseyJ1cmxzIjoiNiIsImlkcyI6IjcifSxbIjgiLCI5IiwiMTAiXSxbXSxbIjgiLCI5IiwiMTAiXSx7fSwiL25vZGVfbW9kdWxlcy92aXRlc3QvZGlzdC9pbmRleC5qcyIsIi9hcHAvbGliL2NyeXB0by5zZXJ2ZXIudHMiLCIvYXBwL2xpYi90cmFja2luZy5zZXJ2ZXIudHMiXQ==