OverageCreditUpsell.tsx
components/LogoV2/OverageCreditUpsell.tsx
166
Lines
18347
Bytes
7
Exports
12
Imports
10
Keywords
What this is
This page documents one file from the repository and includes its full source so you can read it without leaving the docs site.
Beginner explanation
This file is one piece of the larger system. Its name, directory, imports, and exports show where it fits. Start by reading the exports and related files first.
How it is used
Start from the exports list and related files. Those are the easiest clues for where this file fits into the system.
Expert explanation
Architecturally, this file intersects with ui-flow. It contains 166 lines, 12 detected imports, and 7 detected exports.
Important relationships
Detected exports
isEligibleForOverageCreditGrantshouldShowOverageCreditUpsellmaybeRefreshOverageCreditCacheuseShowOverageCreditUpsellincrementOverageCreditUpsellSeenCountOverageCreditUpsellcreateOverageCreditFeed
Keywords
textinfoamountmaxwidthtitlereactcopygetcachedoveragecreditgrantconfigusage
Detected imports
react/compiler-runtimereactreact../../ink.js../../services/analytics/index.js../../services/api/overageCreditGrant.js../../utils/config.js../../utils/format.js./Feed.jsOC & Bulk Overages copyOC & Bulk Overages copyOC & Bulk Overages copy
Source notes
This page embeds the full file contents. Small or leaf files are still indexed honestly instead of being over-explained.
Full source
import { c as _c } from "react/compiler-runtime";
import * as React from 'react';
import { useState } from 'react';
import { Text } from '../../ink.js';
import { logEvent } from '../../services/analytics/index.js';
import { formatGrantAmount, getCachedOverageCreditGrant, refreshOverageCreditGrantCache } from '../../services/api/overageCreditGrant.js';
import { getGlobalConfig, saveGlobalConfig } from '../../utils/config.js';
import { truncate } from '../../utils/format.js';
import type { FeedConfig } from './Feed.js';
const MAX_IMPRESSIONS = 3;
/**
* Whether to show the overage credit upsell on any surface.
*
* Eligibility comes entirely from the backend GET /overage_credit_grant
* response — the CLI doesn't replicate tier/threshold/role checks. The
* backend returns available: false for Team members who aren't admins,
* so they don't see an upsell they can't act on.
*
* isEligibleForOverageCreditGrant — just the backend eligibility. Use for
* persistent reference surfaces (/usage) where the info should show
* whenever eligible, no impression cap.
* shouldShowOverageCreditUpsell — adds the 3-impression cap and
* hasVisitedExtraUsage dismiss. Use for promotional surfaces
* (welcome feed, tips).
*/
export function isEligibleForOverageCreditGrant(): boolean {
const info = getCachedOverageCreditGrant();
if (!info || !info.available || info.granted) return false;
return formatGrantAmount(info) !== null;
}
export function shouldShowOverageCreditUpsell(): boolean {
if (!isEligibleForOverageCreditGrant()) return false;
const config = getGlobalConfig();
if (config.hasVisitedExtraUsage) return false;
if ((config.overageCreditUpsellSeenCount ?? 0) >= MAX_IMPRESSIONS) return false;
return true;
}
/**
* Kick off a background fetch if the cache is empty. Safe to call
* unconditionally on mount — it no-ops if cache is fresh.
*/
export function maybeRefreshOverageCreditCache(): void {
if (getCachedOverageCreditGrant() !== null) return;
void refreshOverageCreditGrantCache();
}
export function useShowOverageCreditUpsell() {
const [show] = useState(_temp);
return show;
}
function _temp() {
maybeRefreshOverageCreditCache();
return shouldShowOverageCreditUpsell();
}
export function incrementOverageCreditUpsellSeenCount(): void {
let newCount = 0;
saveGlobalConfig(prev => {
newCount = (prev.overageCreditUpsellSeenCount ?? 0) + 1;
return {
...prev,
overageCreditUpsellSeenCount: newCount
};
});
logEvent('tengu_overage_credit_upsell_shown', {
seen_count: newCount
});
}
// Copy from "OC & Bulk Overages copy" doc (#6 — CLI /usage)
function getUsageText(amount: string): string {
return `${amount} in extra usage for third-party apps · /extra-usage`;
}
// Copy from "OC & Bulk Overages copy" doc (#4 — CLI Welcome screen).
// Char budgets: title ≤19, subtitle ≤48.
const FEED_SUBTITLE = 'On us. Works on third-party apps · /extra-usage';
function getFeedTitle(amount: string): string {
return `${amount} in extra usage`;
}
type Props = {
maxWidth?: number;
twoLine?: boolean;
};
export function OverageCreditUpsell(t0) {
const $ = _c(8);
const {
maxWidth,
twoLine
} = t0;
let t1;
let t2;
if ($[0] !== maxWidth || $[1] !== twoLine) {
t2 = Symbol.for("react.early_return_sentinel");
bb0: {
const info = getCachedOverageCreditGrant();
if (!info) {
t2 = null;
break bb0;
}
const amount = formatGrantAmount(info);
if (!amount) {
t2 = null;
break bb0;
}
if (twoLine) {
const title = getFeedTitle(amount);
let t3;
if ($[4] !== maxWidth) {
t3 = maxWidth ? truncate(FEED_SUBTITLE, maxWidth) : FEED_SUBTITLE;
$[4] = maxWidth;
$[5] = t3;
} else {
t3 = $[5];
}
let t4;
if ($[6] !== t3) {
t4 = <Text dimColor={true}>{t3}</Text>;
$[6] = t3;
$[7] = t4;
} else {
t4 = $[7];
}
t2 = <><Text color="claude">{maxWidth ? truncate(title, maxWidth) : title}</Text>{t4}</>;
break bb0;
}
const text = getUsageText(amount);
const display = maxWidth ? truncate(text, maxWidth) : text;
const highlightLen = Math.min(getFeedTitle(amount).length, display.length);
t1 = <Text dimColor={true}><Text color="claude">{display.slice(0, highlightLen)}</Text>{display.slice(highlightLen)}</Text>;
}
$[0] = maxWidth;
$[1] = twoLine;
$[2] = t1;
$[3] = t2;
} else {
t1 = $[2];
t2 = $[3];
}
if (t2 !== Symbol.for("react.early_return_sentinel")) {
return t2;
}
return t1;
}
/**
* Feed config for the homescreen rotating feed. Mirrors
* createGuestPassesFeed in feedConfigs.tsx.
*
* Copy from "OC & Bulk Overages copy" doc (#4 — CLI Welcome screen).
* Char budgets: title ≤19, subtitle ≤48.
*/
export function createOverageCreditFeed(): FeedConfig {
const info = getCachedOverageCreditGrant();
const amount = info ? formatGrantAmount(info) : null;
const title = amount ? getFeedTitle(amount) : 'extra usage credit';
return {
title,
lines: [],
customContent: {
content: <Text dimColor>{FEED_SUBTITLE}</Text>,
width: Math.max(title.length, FEED_SUBTITLE.length)
}
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsInVzZVN0YXRlIiwiVGV4dCIsImxvZ0V2ZW50IiwiZm9ybWF0R3JhbnRBbW91bnQiLCJnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQiLCJyZWZyZXNoT3ZlcmFnZUNyZWRpdEdyYW50Q2FjaGUiLCJnZXRHbG9iYWxDb25maWciLCJzYXZlR2xvYmFsQ29uZmlnIiwidHJ1bmNhdGUiLCJGZWVkQ29uZmlnIiwiTUFYX0lNUFJFU1NJT05TIiwiaXNFbGlnaWJsZUZvck92ZXJhZ2VDcmVkaXRHcmFudCIsImluZm8iLCJhdmFpbGFibGUiLCJncmFudGVkIiwic2hvdWxkU2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwiLCJjb25maWciLCJoYXNWaXNpdGVkRXh0cmFVc2FnZSIsIm92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQiLCJtYXliZVJlZnJlc2hPdmVyYWdlQ3JlZGl0Q2FjaGUiLCJ1c2VTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCIsInNob3ciLCJfdGVtcCIsImluY3JlbWVudE92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQiLCJuZXdDb3VudCIsInByZXYiLCJzZWVuX2NvdW50IiwiZ2V0VXNhZ2VUZXh0IiwiYW1vdW50IiwiRkVFRF9TVUJUSVRMRSIsImdldEZlZWRUaXRsZSIsIlByb3BzIiwibWF4V2lkdGgiLCJ0d29MaW5lIiwiT3ZlcmFnZUNyZWRpdFVwc2VsbCIsInQwIiwiJCIsIl9jIiwidDEiLCJ0MiIsIlN5bWJvbCIsImZvciIsImJiMCIsInRpdGxlIiwidDMiLCJ0NCIsInRleHQiLCJkaXNwbGF5IiwiaGlnaGxpZ2h0TGVuIiwiTWF0aCIsIm1pbiIsImxlbmd0aCIsInNsaWNlIiwiY3JlYXRlT3ZlcmFnZUNyZWRpdEZlZWQiLCJsaW5lcyIsImN1c3RvbUNvbnRlbnQiLCJjb250ZW50Iiwid2lkdGgiLCJtYXgiXSwic291cmNlcyI6WyJPdmVyYWdlQ3JlZGl0VXBzZWxsLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnLi4vLi4vaW5rLmpzJ1xuaW1wb3J0IHsgbG9nRXZlbnQgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hbmFseXRpY3MvaW5kZXguanMnXG5pbXBvcnQge1xuICBmb3JtYXRHcmFudEFtb3VudCxcbiAgZ2V0Q2FjaGVkT3ZlcmFnZUNyZWRpdEdyYW50LFxuICByZWZyZXNoT3ZlcmFnZUNyZWRpdEdyYW50Q2FjaGUsXG59IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FwaS9vdmVyYWdlQ3JlZGl0R3JhbnQuanMnXG5pbXBvcnQgeyBnZXRHbG9iYWxDb25maWcsIHNhdmVHbG9iYWxDb25maWcgfSBmcm9tICcuLi8uLi91dGlscy9jb25maWcuanMnXG5pbXBvcnQgeyB0cnVuY2F0ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2Zvcm1hdC5qcydcbmltcG9ydCB0eXBlIHsgRmVlZENvbmZpZyB9IGZyb20gJy4vRmVlZC5qcydcblxuY29uc3QgTUFYX0lNUFJFU1NJT05TID0gM1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gc2hvdyB0aGUgb3ZlcmFnZSBjcmVkaXQgdXBzZWxsIG9uIGFueSBzdXJmYWNlLlxuICpcbiAqIEVsaWdpYmlsaXR5IGNvbWVzIGVudGlyZWx5IGZyb20gdGhlIGJhY2tlbmQgR0VUIC9vdmVyYWdlX2NyZWRpdF9ncmFudFxuICogcmVzcG9uc2Ug4oCUIHRoZSBDTEkgZG9lc24ndCByZXBsaWNhdGUgdGllci90aHJlc2hvbGQvcm9sZSBjaGVja3MuIFRoZVxuICogYmFja2VuZCByZXR1cm5zIGF2YWlsYWJsZTogZmFsc2UgZm9yIFRlYW0gbWVtYmVycyB3aG8gYXJlbid0IGFkbWlucyxcbiAqIHNvIHRoZXkgZG9uJ3Qgc2VlIGFuIHVwc2VsbCB0aGV5IGNhbid0IGFjdCBvbi5cbiAqXG4gKiBpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50IOKAlCBqdXN0IHRoZSBiYWNrZW5kIGVsaWdpYmlsaXR5LiBVc2UgZm9yXG4gKiAgIHBlcnNpc3RlbnQgcmVmZXJlbmNlIHN1cmZhY2VzICgvdXNhZ2UpIHdoZXJlIHRoZSBpbmZvIHNob3VsZCBzaG93XG4gKiAgIHdoZW5ldmVyIGVsaWdpYmxlLCBubyBpbXByZXNzaW9uIGNhcC5cbiAqIHNob3VsZFNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsIOKAlCBhZGRzIHRoZSAzLWltcHJlc3Npb24gY2FwIGFuZFxuICogICBoYXNWaXNpdGVkRXh0cmFVc2FnZSBkaXNtaXNzLiBVc2UgZm9yIHByb21vdGlvbmFsIHN1cmZhY2VzXG4gKiAgICh3ZWxjb21lIGZlZWQsIHRpcHMpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbGlnaWJsZUZvck92ZXJhZ2VDcmVkaXRHcmFudCgpOiBib29sZWFuIHtcbiAgY29uc3QgaW5mbyA9IGdldENhY2hlZE92ZXJhZ2VDcmVkaXRHcmFudCgpXG4gIGlmICghaW5mbyB8fCAhaW5mby5hdmFpbGFibGUgfHwgaW5mby5ncmFudGVkKSByZXR1cm4gZmFsc2VcbiAgcmV0dXJuIGZvcm1hdEdyYW50QW1vdW50KGluZm8pICE9PSBudWxsXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRTaG93T3ZlcmFnZUNyZWRpdFVwc2VsbCgpOiBib29sZWFuIHtcbiAgaWYgKCFpc0VsaWdpYmxlRm9yT3ZlcmFnZUNyZWRpdEdyYW50KCkpIHJldHVybiBmYWxzZVxuXG4gIGNvbnN0IGNvbmZpZyA9IGdldEdsb2JhbENvbmZpZygpXG4gIGlmIChjb25maWcuaGFzVmlzaXRlZEV4dHJhVXNhZ2UpIHJldHVybiBmYWxzZVxuICBpZiAoKGNvbmZpZy5vdmVyYWdlQ3JlZGl0VXBzZWxsU2VlbkNvdW50ID8/IDApID49IE1BWF9JTVBSRVNTSU9OUylcbiAgICByZXR1cm4gZmFsc2VcblxuICByZXR1cm4gdHJ1ZVxufVxuXG4vKipcbiAqIEtpY2sgb2ZmIGEgYmFja2dyb3VuZCBmZXRjaCBpZiB0aGUgY2FjaGUgaXMgZW1wdHkuIFNhZmUgdG8gY2FsbFxuICogdW5jb25kaXRpb25hbGx5IG9uIG1vdW50IOKAlCBpdCBuby1vcHMgaWYgY2FjaGUgaXMgZnJlc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXliZVJlZnJlc2hPdmVyYWdlQ3JlZGl0Q2FjaGUoKTogdm9pZCB7XG4gIGlmIChnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQoKSAhPT0gbnVsbCkgcmV0dXJuXG4gIHZvaWQgcmVmcmVzaE92ZXJhZ2VDcmVkaXRHcmFudENhY2hlKClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNob3dPdmVyYWdlQ3JlZGl0VXBzZWxsKCk6IGJvb2xlYW4ge1xuICBjb25zdCBbc2hvd10gPSB1c2VTdGF0ZSgoKSA9PiB7XG4gICAgbWF5YmVSZWZyZXNoT3ZlcmFnZUNyZWRpdENhY2hlKClcbiAgICByZXR1cm4gc2hvdWxkU2hvd092ZXJhZ2VDcmVkaXRVcHNlbGwoKVxuICB9KVxuICByZXR1cm4gc2hvd1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5jcmVtZW50T3ZlcmFnZUNyZWRpdFVwc2VsbFNlZW5Db3VudCgpOiB2b2lkIHtcbiAgbGV0IG5ld0NvdW50ID0gMFxuICBzYXZlR2xvYmFsQ29uZmlnKHByZXYgPT4ge1xuICAgIG5ld0NvdW50ID0gKHByZXYub3ZlcmFnZUNyZWRpdFVwc2VsbFNlZW5Db3VudCA/PyAwKSArIDFcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucHJldixcbiAgICAgIG92ZXJhZ2VDcmVkaXRVcHNlbGxTZWVuQ291bnQ6IG5ld0NvdW50LFxuICAgIH1cbiAgfSlcbiAgbG9nRXZlbnQoJ3Rlbmd1X292ZXJhZ2VfY3JlZGl0X3Vwc2VsbF9zaG93bicsIHsgc2Vlbl9jb3VudDogbmV3Q291bnQgfSlcbn1cblxuLy8gQ29weSBmcm9tIFwiT0MgJiBCdWxrIE92ZXJhZ2VzIGNvcHlcIiBkb2MgKCM2IOKAlCBDTEkgL3VzYWdlKVxuZnVuY3Rpb24gZ2V0VXNhZ2VUZXh0KGFtb3VudDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke2Ftb3VudH0gaW4gZXh0cmEgdXNhZ2UgZm9yIHRoaXJkLXBhcnR5IGFwcHMgwrcgL2V4dHJhLXVzYWdlYFxufVxuXG4vLyBDb3B5IGZyb20gXCJPQyAmIEJ1bGsgT3ZlcmFnZXMgY29weVwiIGRvYyAoIzQg4oCUIENMSSBXZWxjb21lIHNjcmVlbikuXG4vLyBDaGFyIGJ1ZGdldHM6IHRpdGxlIOKJpDE5LCBzdWJ0aXRsZSDiiaQ0OC5cbmNvbnN0IEZFRURfU1VCVElUTEUgPSAnT24gdXMuIFdvcmtzIG9uIHRoaXJkLXBhcnR5IGFwcHMgwrcgL2V4dHJhLXVzYWdlJ1xuXG5mdW5jdGlvbiBnZXRGZWVkVGl0bGUoYW1vdW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7YW1vdW50fSBpbiBleHRyYSB1c2FnZWBcbn1cblxudHlwZSBQcm9wcyA9IHsgbWF4V2lkdGg/OiBudW1iZXI7IHR3b0xpbmU/OiBib29sZWFuIH1cblxuZXhwb3J0IGZ1bmN0aW9uIE92ZXJhZ2VDcmVkaXRVcHNlbGwoe1xuICBtYXhXaWR0aCxcbiAgdHdvTGluZSxcbn06IFByb3BzKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgY29uc3QgaW5mbyA9IGdldENhY2hlZE92ZXJhZ2VDcmVkaXRHcmFudCgpXG4gIGlmICghaW5mbykgcmV0dXJuIG51bGxcbiAgY29uc3QgYW1vdW50ID0gZm9ybWF0R3JhbnRBbW91bnQoaW5mbylcbiAgaWYgKCFhbW91bnQpIHJldHVybiBudWxsXG5cbiAgaWYgKHR3b0xpbmUpIHtcbiAgICBjb25zdCB0aXRsZSA9IGdldEZlZWRUaXRsZShhbW91bnQpXG4gICAgcmV0dXJuIChcbiAgICAgIDw+XG4gICAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+XG4gICAgICAgICAge21heFdpZHRoID8gdHJ1bmNhdGUodGl0bGUsIG1heFdpZHRoKSA6IHRpdGxlfVxuICAgICAgICA8L1RleHQ+XG4gICAgICAgIDxUZXh0IGRpbUNvbG9yPlxuICAgICAgICAgIHttYXhXaWR0aCA/IHRydW5jYXRlKEZFRURfU1VCVElUTEUsIG1heFdpZHRoKSA6IEZFRURfU1VCVElUTEV9XG4gICAgICAgIDwvVGV4dD5cbiAgICAgIDwvPlxuICAgIClcbiAgfVxuXG4gIGNvbnN0IHRleHQgPSBnZXRVc2FnZVRleHQoYW1vdW50KVxuICBjb25zdCBkaXNwbGF5ID0gbWF4V2lkdGggPyB0cnVuY2F0ZSh0ZXh0LCBtYXhXaWR0aCkgOiB0ZXh0XG4gIGNvbnN0IGhpZ2hsaWdodExlbiA9IE1hdGgubWluKGdldEZlZWRUaXRsZShhbW91bnQpLmxlbmd0aCwgZGlzcGxheS5sZW5ndGgpXG5cbiAgcmV0dXJuIChcbiAgICA8VGV4dCBkaW1Db2xvcj5cbiAgICAgIDxUZXh0IGNvbG9yPVwiY2xhdWRlXCI+e2Rpc3BsYXkuc2xpY2UoMCwgaGlnaGxpZ2h0TGVuKX08L1RleHQ+XG4gICAgICB7ZGlzcGxheS5zbGljZShoaWdobGlnaHRMZW4pfVxuICAgIDwvVGV4dD5cbiAgKVxufVxuXG4vKipcbiAqIEZlZWQgY29uZmlnIGZvciB0aGUgaG9tZXNjcmVlbiByb3RhdGluZyBmZWVkLiBNaXJyb3JzXG4gKiBjcmVhdGVHdWVzdFBhc3Nlc0ZlZWQgaW4gZmVlZENvbmZpZ3MudHN4LlxuICpcbiAqIENvcHkgZnJvbSBcIk9DICYgQnVsayBPdmVyYWdlcyBjb3B5XCIgZG9jICgjNCDigJQgQ0xJIFdlbGNvbWUgc2NyZWVuKS5cbiAqIENoYXIgYnVkZ2V0czogdGl0bGUg4omkMTksIHN1YnRpdGxlIOKJpDQ4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT3ZlcmFnZUNyZWRpdEZlZWQoKTogRmVlZENvbmZpZyB7XG4gIGNvbnN0IGluZm8gPSBnZXRDYWNoZWRPdmVyYWdlQ3JlZGl0R3JhbnQoKVxuICBjb25zdCBhbW91bnQgPSBpbmZvID8gZm9ybWF0R3JhbnRBbW91bnQoaW5mbykgOiBudWxsXG4gIGNvbnN0IHRpdGxlID0gYW1vdW50ID8gZ2V0RmVlZFRpdGxlKGFtb3VudCkgOiAnZXh0cmEgdXNhZ2UgY3JlZGl0J1xuICByZXR1cm4ge1xuICAgIHRpdGxlLFxuICAgIGxpbmVzOiBbXSxcbiAgICBjdXN0b21Db250ZW50OiB7XG4gICAgICBjb250ZW50OiA8VGV4dCBkaW1Db2xvcj57RkVFRF9TVUJUSVRMRX08L1RleHQ+LFxuICAgICAgd2lkdGg6IE1hdGgubWF4KHRpdGxlLmxlbmd0aCwgRkVFRF9TVUJUSVRMRS5sZW5ndGgpLFxuICAgIH0sXG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sS0FBS0EsS0FBSyxNQUFNLE9BQU87QUFDOUIsU0FBU0MsUUFBUSxRQUFRLE9BQU87QUFDaEMsU0FBU0MsSUFBSSxRQUFRLGNBQWM7QUFDbkMsU0FBU0MsUUFBUSxRQUFRLG1DQUFtQztBQUM1RCxTQUNFQyxpQkFBaUIsRUFDakJDLDJCQUEyQixFQUMzQkMsOEJBQThCLFFBQ3pCLDBDQUEwQztBQUNqRCxTQUFTQyxlQUFlLEVBQUVDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUN6RSxTQUFTQyxRQUFRLFFBQVEsdUJBQXVCO0FBQ2hELGNBQWNDLFVBQVUsUUFBUSxXQUFXO0FBRTNDLE1BQU1DLGVBQWUsR0FBRyxDQUFDOztBQUV6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLFNBQVNDLCtCQUErQkEsQ0FBQSxDQUFFLEVBQUUsT0FBTyxDQUFDO0VBQ3pELE1BQU1DLElBQUksR0FBR1IsMkJBQTJCLENBQUMsQ0FBQztFQUMxQyxJQUFJLENBQUNRLElBQUksSUFBSSxDQUFDQSxJQUFJLENBQUNDLFNBQVMsSUFBSUQsSUFBSSxDQUFDRSxPQUFPLEVBQUUsT0FBTyxLQUFLO0VBQzFELE9BQU9YLGlCQUFpQixDQUFDUyxJQUFJLENBQUMsS0FBSyxJQUFJO0FBQ3pDO0FBRUEsT0FBTyxTQUFTRyw2QkFBNkJBLENBQUEsQ0FBRSxFQUFFLE9BQU8sQ0FBQztFQUN2RCxJQUFJLENBQUNKLCtCQUErQixDQUFDLENB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