@knitli/docs-components 1.3.2 → 1.3.5

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.
@@ -0,0 +1,289 @@
1
+ ---
2
+ // SPDX-FileCopyrightText: 2025 Knitli Inc.
3
+ // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
+ //
5
+ // SPDX-License-Identifier: MIT OR Apache-2.0
6
+ //
7
+ // Product card for the documentation homepage. Renders a single product
8
+ // from the product catalog with status-driven behavior (clickable link
9
+ // vs static card with "coming soon" stamp).
10
+
11
+ import { Image } from "astro:assets";
12
+ // @ts-expect-error: 2604
13
+ import { Icon } from "@astrojs/starlight/components";
14
+ import type { StarlightIcon } from "@astrojs/starlight/types";
15
+ import * as logos from "@knitli/shared-layouts";
16
+ import type { ImageMetadata } from "astro";
17
+ import type { Product } from "../data/products.js";
18
+
19
+ interface Props {
20
+ /** Product data from the catalog */
21
+ product: Product;
22
+ /** Optional Starlight icon (overrides logo) */
23
+ icon?: StarlightIcon;
24
+ }
25
+
26
+ const { product, icon } = Astro.props;
27
+
28
+ /** Resolve a logo key string to an actual ImageMetadata asset from shared-layouts */
29
+ const resolveLogoAsset = (key: string): ImageMetadata | undefined =>
30
+ (logos as Record<string, ImageMetadata>)[key];
31
+
32
+ const logo = product.logo ? resolveLogoAsset(product.logo) : undefined;
33
+ const darkLogo = product.darkLogo
34
+ ? resolveLogoAsset(product.darkLogo)
35
+ : undefined;
36
+ const isClickable = product.docsUrl && product.status !== "coming-soon";
37
+
38
+ const imageAttrs = {
39
+ loading: "eager" as const,
40
+ decoding: "async" as const,
41
+ width: 48,
42
+ height: 48,
43
+ alt: `${product.name} logo`,
44
+ };
45
+ ---
46
+
47
+ {isClickable ? (
48
+ <a
49
+ href={product.docsUrl}
50
+ target={product.external ? "_blank" : "_self"}
51
+ rel={product.external ? "noopener noreferrer" : undefined}
52
+ >
53
+ <article class="card sl-flex linkcard" aria-label="button" tabindex="0">
54
+ <div class="title-row sl-flex">
55
+ {(logo || darkLogo) && (
56
+ <div class="product-logo">
57
+ {darkLogo && (
58
+ <Image
59
+ src={darkLogo}
60
+ {...imageAttrs}
61
+ class:list={{ "light:sl-hidden": Boolean(logo) }}
62
+ />
63
+ )}
64
+ {logo && (
65
+ <Image
66
+ src={logo}
67
+ {...imageAttrs}
68
+ class="dark:sl-hidden"
69
+ />
70
+ )}
71
+ </div>
72
+ )}
73
+ <p class="title sl-flex">
74
+ {icon && <Icon name={icon} class="icon" size="1.333em" />}
75
+ <span>{product.name}</span>
76
+ </p>
77
+ </div>
78
+ <div class="body">
79
+ <p>
80
+ {product.description}
81
+ {product.highlight && (
82
+ <>
83
+ <br /><br />
84
+ <strong>{product.highlight}</strong>
85
+ </>
86
+ )}
87
+ {product.footnote && (
88
+ <>
89
+ <br /><br />
90
+ <em>{product.footnote}</em>
91
+ </>
92
+ )}
93
+ </p>
94
+ <slot />
95
+ </div>
96
+ </article>
97
+ </a>
98
+ ) : (
99
+ <article class="card sl-flex">
100
+ <div class="title-row sl-flex">
101
+ {(logo || darkLogo) && (
102
+ <div class="product-logo">
103
+ {darkLogo && (
104
+ <Image
105
+ src={darkLogo}
106
+ {...imageAttrs}
107
+ class:list={{ "light:sl-hidden": Boolean(logo) }}
108
+ />
109
+ )}
110
+ {logo && (
111
+ <Image
112
+ src={logo}
113
+ {...imageAttrs}
114
+ class="dark:sl-hidden"
115
+ />
116
+ )}
117
+ </div>
118
+ )}
119
+ <p class="title sl-flex">
120
+ {icon && <Icon name={icon} class="icon" size="1.333em" />}
121
+ <span>{product.name}</span>
122
+ </p>
123
+ </div>
124
+ <div class="body">
125
+ <p>
126
+ {product.description}
127
+ {product.highlight && (
128
+ <>
129
+ <br /><br />
130
+ <strong>{product.highlight}</strong>
131
+ </>
132
+ )}
133
+ {product.footnote && (
134
+ <>
135
+ <br /><br />
136
+ <em>{product.footnote}</em>
137
+ </>
138
+ )}
139
+ </p>
140
+ <slot />
141
+ </div>
142
+ {product.status === "coming-soon" && (
143
+ <span class="status-badge">Docs coming soon</span>
144
+ )}
145
+ </article>
146
+ )}
147
+
148
+ <style>
149
+ @layer starlight.components {
150
+ .card {
151
+ --sl-card-border: var(--knitli-aubergine);
152
+ --sl-card-bg: var(--sl-color-purple-low);
153
+ border: 1px solid var(--sl-color-gray-5);
154
+ background-color: var(--sl-color-black);
155
+ padding: clamp(1rem, calc(0.125rem + 3vw), 2.5rem);
156
+ flex-direction: column;
157
+ gap: clamp(0.5rem, calc(0.125rem + 1vw), 1rem);
158
+ height: 100%;
159
+ position: relative;
160
+ overflow: hidden;
161
+ }
162
+ .title {
163
+ font-weight: 600;
164
+ font-size: var(--sl-text-h4);
165
+ color: var(--sl-color-white);
166
+ line-height: var(--sl-line-height-headings);
167
+ text-decoration: none;
168
+ gap: 1rem;
169
+ align-items: center;
170
+ margin: 0;
171
+ }
172
+ .card .body {
173
+ margin: 0;
174
+ text-decoration: none;
175
+ font-size: clamp(
176
+ var(--sl-text-sm),
177
+ calc(0.5rem + 1vw),
178
+ var(--sl-text-body)
179
+ );
180
+ display: flex;
181
+ flex-direction: column;
182
+ }
183
+ .card .body > p {
184
+ flex: 1;
185
+ line-height: 1.6;
186
+ }
187
+ /* Clickable card styles */
188
+ a {
189
+ text-decoration: none !important;
190
+ color: var(--sl-color-text) !important;
191
+ }
192
+ a:hover {
193
+ text-decoration: none !important;
194
+ color: var(--sl-color-text) !important;
195
+ cursor: pointer;
196
+ }
197
+ a .linkcard {
198
+ transition:
199
+ background-color 0.3s,
200
+ border-color 0.3s;
201
+ cursor: pointer;
202
+ }
203
+ a .linkcard:hover,
204
+ a:hover .linkcard {
205
+ background-color: var(--sl-color-bg-inline-code);
206
+ border: 0.1rem solid var(--knitli-rust);
207
+ scale: 1.02;
208
+ transition: transform 0.3s ease;
209
+ }
210
+
211
+ /* Remove text decoration from all elements inside linked cards */
212
+ a .linkcard *,
213
+ a .linkcard .title,
214
+ a .linkcard .body,
215
+ a .linkcard .body p {
216
+ text-decoration: none !important;
217
+ color: inherit;
218
+ }
219
+
220
+ a .linkcard .title {
221
+ color: var(--sl-color-white);
222
+ }
223
+ .title-row {
224
+ gap: 1rem;
225
+ align-items: center;
226
+ margin-bottom: 1rem;
227
+ }
228
+
229
+ .card .icon {
230
+ border: 1px solid var(--sl-card-border);
231
+ background-color: var(--sl-card-bg);
232
+ padding: 0.2em;
233
+ border-radius: 0.25rem;
234
+ flex-shrink: 0;
235
+ }
236
+
237
+ /* Add padding when stamp is present so description doesn't overlap */
238
+ .card:has(.status-badge) .body {
239
+ padding-bottom: 3rem;
240
+ }
241
+
242
+ .product-logo {
243
+ width: 60px;
244
+ height: 60px;
245
+ display: flex;
246
+ align-items: center;
247
+ justify-content: center;
248
+ flex-shrink: 0;
249
+ }
250
+ .product-logo img {
251
+ width: 100%;
252
+ height: 100%;
253
+ object-fit: contain;
254
+ }
255
+ .product-logo img:hover {
256
+ scale: 1.05;
257
+ transition: transform 0.3s ease;
258
+ }
259
+ .status-badge {
260
+ position: absolute;
261
+ bottom: 1.25rem;
262
+ right: 1.75rem;
263
+ transform: rotate(-8deg);
264
+ transform-origin: center;
265
+
266
+ /* Double-border rubber stamp effect */
267
+ border: 2px solid var(--sl-color-accent);
268
+ outline: 1px solid var(--sl-color-accent);
269
+ outline-offset: 3px;
270
+ border-radius: 1px;
271
+
272
+ color: var(--sl-color-accent);
273
+ background: transparent;
274
+
275
+ font-size: 0.6rem;
276
+ font-weight: 800;
277
+ text-transform: uppercase;
278
+ letter-spacing: 0.18em;
279
+ padding: 0.3em 0.75em;
280
+
281
+ /* Worn ink look */
282
+ opacity: 0.75;
283
+ white-space: nowrap;
284
+ z-index: 10;
285
+ pointer-events: none;
286
+ user-select: none;
287
+ }
288
+ }
289
+ </style>
@@ -0,0 +1,54 @@
1
+ ---
2
+ // SPDX-FileCopyrightText: 2025 Knitli Inc.
3
+ // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
+ //
5
+ // SPDX-License-Identifier: MIT OR Apache-2.0
6
+ //
7
+ // Product grid layout — 3-column on desktop with optional staggered offset.
8
+
9
+ interface Props {
10
+ staggered?: boolean;
11
+ stagger?: boolean;
12
+ }
13
+
14
+ const { staggered, stagger = staggered ?? false } = Astro.props;
15
+ ---
16
+
17
+ <div class:list={["card-grid", { stagger }]}><slot /></div>
18
+
19
+ <style>
20
+ /** biome-ignore: lint/complexity/noImportantStyles */
21
+ @layer starlight.components {
22
+ .card-grid {
23
+ display: grid;
24
+ grid-template-columns: 100%;
25
+ gap: 1rem;
26
+ }
27
+
28
+ .card-grid > :global(*) {
29
+ margin-top: 0 !important;
30
+ }
31
+
32
+ @media (min-width: 50rem) {
33
+ .card-grid {
34
+ grid-template-columns: 1fr 1fr 1fr;
35
+ gap: 1.5rem;
36
+ }
37
+ .stagger {
38
+ --stagger-height: 2.5rem;
39
+ padding-top: var(--stagger-height);
40
+ }
41
+
42
+ /* Pattern: Up, Baseline, Up */
43
+ .stagger > :global(*):nth-child(3n + 1) {
44
+ transform: translateY(calc(-1 * var(--stagger-height)));
45
+ }
46
+ .stagger > :global(*):nth-child(3n + 2) {
47
+ transform: translateY(0);
48
+ }
49
+ .stagger > :global(*):nth-child(3n + 3) {
50
+ transform: translateY(calc(-1 * var(--stagger-height)));
51
+ }
52
+ }
53
+ }
54
+ </style>
@@ -0,0 +1,22 @@
1
+ ---
2
+ // SPDX-FileCopyrightText: 2025 Knitli Inc.
3
+ // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
+ //
5
+ // SPDX-License-Identifier: MIT OR Apache-2.0
6
+ //
7
+ // Composite component that renders the full product showcase grid
8
+ // from the product catalog. Requires zero configuration — just
9
+ // import and use: <ProductShowcase />
10
+
11
+ import { featuredProducts } from "../data/products.js";
12
+ import ProductCard from "./ProductCard.astro";
13
+ import ProductGrid from "./ProductGrid.astro";
14
+
15
+ const products = featuredProducts();
16
+ ---
17
+
18
+ <ProductGrid staggered>
19
+ {products.map((product) => (
20
+ <ProductCard key={product.name} product={product} />
21
+ ))}
22
+ </ProductGrid>
@@ -0,0 +1,53 @@
1
+ ---
2
+ // SPDX-FileCopyrightText: 2026 Knitli Inc.
3
+ // SPDX-FileContributor: Adam Poulemanos <adam@knit.li>
4
+ //
5
+ // SPDX-License-Identifier: MIT OR Apache-2.0
6
+ //
7
+ // Knitli-branded wrapper around astro-seo-meta Seo component.
8
+ // Pre-applies brand theme color, color scheme, and OG defaults.
9
+ //
10
+ // Usage:
11
+ // <SeoMeta title="Getting Started" description="..." />
12
+ // <SeoMeta title="API Reference" twitter={{ card: "summary" }} />
13
+
14
+ import { Seo } from "astro-seo-meta";
15
+
16
+ type ColorScheme = "normal" | "light dark" | "dark light" | "only light";
17
+
18
+ export interface Props {
19
+ title?: string;
20
+ description?: string;
21
+ keywords?: string[];
22
+ icon?: string;
23
+ /** Theme color for browser chrome. Defaults to Knitli aubergine. */
24
+ themeColor?: string;
25
+ colorScheme?: ColorScheme;
26
+ facebook?: {
27
+ image?: string;
28
+ type?: string;
29
+ url?: string;
30
+ };
31
+ twitter?: {
32
+ image?: string;
33
+ card?: string;
34
+ site?: string;
35
+ };
36
+ robots?: string;
37
+ }
38
+
39
+ const {
40
+ themeColor = "#1e061b",
41
+ colorScheme = "light dark",
42
+ twitter = {},
43
+ ...rest
44
+ } = Astro.props;
45
+
46
+ const mergedTwitter = {
47
+ card: "summary_large_image",
48
+ site: "@knitli_inc",
49
+ ...twitter,
50
+ };
51
+ ---
52
+
53
+ <Seo themeColor={themeColor} colorScheme={colorScheme} twitter={mergedTwitter} {...rest} />
package/dist/index.js CHANGED
@@ -1,10 +1,177 @@
1
- export { availableProducts, featuredProducts, getProduct, getProductByName, getProductSitemaps, productNames, products } from './data/products.js';
2
- import { faviconSvg, faviconIco } from './assets/favicon/index.js';
3
- import { knitliWordmark, headlineLogoLight, headlineLogoDark, threadLogoLight, threadLogoDark, codeweaverReverse, codeweaverPrimary, recocoLogoXl, recocoLogoXs, recocoLogoLg, recocoLogoSm, recocoLogoMed, knitliLogo } from './assets/logos/index.js';
4
- import { variables, codeweaverTheme } from './assets/styles/index.js';
5
- import { docsStyle } from './styles/index.js';
1
+ var __create = Object.create;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __toESM = (mod, isNodeMode, target) => {
7
+ target = mod != null ? __create(__getProtoOf(mod)) : {};
8
+ const to = isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target;
9
+ for (let key of __getOwnPropNames(mod))
10
+ if (!__hasOwnProp.call(to, key))
11
+ __defProp(to, key, {
12
+ get: () => mod[key],
13
+ enumerable: true
14
+ });
15
+ return to;
16
+ };
17
+ var __commonJS = (cb, mod) => () => (mod || cb((mod = { exports: {} }).exports, mod), mod.exports);
18
+
19
+ // src/components/DocsBreadcrumb.astro
20
+ var require_DocsBreadcrumb = __commonJS((exports, module) => {
21
+ module.exports = "./DocsBreadcrumb-120137a7.astro";
22
+ });
23
+
24
+ // src/components/Footer.astro
25
+ var require_Footer = __commonJS((exports, module) => {
26
+ module.exports = "./Footer-eayrt0r3.astro";
27
+ });
28
+
29
+ // src/components/PageFrame.astro
30
+ var require_PageFrame = __commonJS((exports, module) => {
31
+ module.exports = "./PageFrame-y7qynxws.astro";
32
+ });
33
+
34
+ // src/components/Contributors.astro
35
+ var require_Contributors = __commonJS((exports, module) => {
36
+ module.exports = "./Contributors-he0tpj6t.astro";
37
+ });
38
+
39
+ // src/components/AllContributors.astro
40
+ var require_AllContributors = __commonJS((exports, module) => {
41
+ module.exports = "./AllContributors-7n8pafkm.astro";
42
+ });
43
+
44
+ // src/components/SeoMeta.astro
45
+ var require_SeoMeta = __commonJS((exports, module) => {
46
+ module.exports = "./SeoMeta-h32x587e.astro";
47
+ });
48
+
49
+ // src/components/ProductCard.astro
50
+ var require_ProductCard = __commonJS((exports, module) => {
51
+ module.exports = "./ProductCard-gebg6mpp.astro";
52
+ });
53
+
54
+ // src/components/ProductGrid.astro
55
+ var require_ProductGrid = __commonJS((exports, module) => {
56
+ module.exports = "./ProductGrid-j9rxskvp.astro";
57
+ });
6
58
 
7
- const DocsAssets = {
59
+ // src/components/ProductShowcase.astro
60
+ var require_ProductShowcase = __commonJS((exports, module) => {
61
+ module.exports = "./ProductShowcase-xjwdmd15.astro";
62
+ });
63
+
64
+ // src/data/products.json
65
+ var products_default = [
66
+ {
67
+ slug: "recoco",
68
+ name: "Recoco",
69
+ tagline: "Intelligent data pipelines",
70
+ description: "Build intelligent data pipelines and ETL workflows. Only process changed data.",
71
+ highlight: "Pure Rust, minimal dependencies, maximum efficiency.",
72
+ status: "available",
73
+ docsUrl: "/recoco/",
74
+ external: false,
75
+ logo: "recocoLogoSm",
76
+ darkLogo: "recocoLogoSm",
77
+ order: 1,
78
+ featured: true
79
+ },
80
+ {
81
+ slug: "codeweaver",
82
+ name: "CodeWeaver",
83
+ tagline: "AI code context engine",
84
+ description: "Your AI code assistants can do better.",
85
+ highlight: "CodeWeaver gives AI agents tailored code context and project understanding, stopping hallucinations, cutting token waste, and supercharging your AI coding workflows.",
86
+ footnote: "Now in Alpha.",
87
+ status: "coming-soon",
88
+ external: false,
89
+ logo: "codeweaverPrimary",
90
+ darkLogo: "codeweaverReverse",
91
+ order: 2,
92
+ featured: true
93
+ },
94
+ {
95
+ slug: "thread",
96
+ name: "Thread",
97
+ tagline: "Ultra-fast codebase analysis",
98
+ description: "An ultra-fast, Rust-native, codebase analysis platform.",
99
+ highlight: "Real-time code understanding and navigation for the largest codebases. Delivers 50x+ speed improvements over comparable tools with minimal resource usage. Works locally, on the edge, or in the cloud.",
100
+ footnote: "Limited features available now, full release coming soon.",
101
+ status: "available",
102
+ docsUrl: "https://docs.rs/thread",
103
+ external: true,
104
+ logo: "threadLogoLight",
105
+ darkLogo: "threadLogoDark",
106
+ order: 3,
107
+ featured: true
108
+ }
109
+ ];
110
+
111
+ // src/data/products.ts
112
+ var products = products_default;
113
+ function featuredProducts() {
114
+ return products.filter((p) => p.featured !== false).sort((a, b) => a.order - b.order);
115
+ }
116
+ function availableProducts() {
117
+ return products.filter((p) => p.status !== "coming-soon");
118
+ }
119
+ function getProduct(slug) {
120
+ return products.find((p) => p.slug === slug);
121
+ }
122
+ function getProductByName(name) {
123
+ return products.find((p) => p.name === name);
124
+ }
125
+ function productNames() {
126
+ return products.map((p) => p.name);
127
+ }
128
+ function getProductSitemaps(baseUrl = "https://docs.knitli.com") {
129
+ return products.filter((p) => p.docsUrl && !p.external && p.status !== "coming-soon").map((p) => `${baseUrl}/${p.slug}/sitemap-index.xml`);
130
+ }
131
+ // src/assets/favicon/index.ts
132
+ import { dirname, join } from "node:path";
133
+ import { fileURLToPath } from "node:url";
134
+ var __dirname2 = dirname(fileURLToPath(import.meta.url));
135
+ var faviconIco = join(__dirname2, "favicon.ico");
136
+ var faviconSvg = join(__dirname2, "favicon.svg");
137
+
138
+ // src/assets/logos/index.ts
139
+ import { dirname as dirname2, join as join2 } from "node:path";
140
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
141
+ var __dirname3 = dirname2(fileURLToPath2(import.meta.url));
142
+ var knitliLogo = join2(__dirname3, "knitli_logo.svg");
143
+ var headlineLogoLight = join2(__dirname3, "headline_logo.webp");
144
+ var headlineLogoDark = join2(__dirname3, "headline_logo_dark.webp");
145
+ var codeweaverPrimary = join2(__dirname3, "codeweaver-primary.svg");
146
+ var codeweaverReverse = join2(__dirname3, "codeweaver-reverse.svg");
147
+ var knitliWordmark = join2(__dirname3, "knitli_wordmark.svg");
148
+ var recocoLogoXl = join2(__dirname3, "recoco-xl.webp");
149
+ var recocoLogoLg = join2(__dirname3, "recoco-lg.webp");
150
+ var recocoLogoMed = join2(__dirname3, "recoco-med.webp");
151
+ var recocoLogoSm = join2(__dirname3, "recoco-sm.webp");
152
+ var recocoLogoXs = join2(__dirname3, "recoco-xs.webp");
153
+ var threadLogoDark = join2(__dirname3, "Thread_vector_mono_parchment.svg");
154
+ var threadLogoLight = join2(__dirname3, "Thread_vector_mono_aubergine.svg");
155
+
156
+ // src/assets/styles/index.ts
157
+ import { dirname as dirname3, join as join3 } from "node:path";
158
+ import { fileURLToPath as fileURLToPath3 } from "node:url";
159
+ var __dirname4 = dirname3(fileURLToPath3(import.meta.url));
160
+ var codeweaverTheme = join3(__dirname4, "codeweaver-theme.css");
161
+ var globalStyles = join3(__dirname4, "global.css");
162
+ var knitliTheme = join3(__dirname4, "knitli-theme.css");
163
+ var textures = join3(__dirname4, "textures.css");
164
+ var typography = join3(__dirname4, "typography.css");
165
+ var variables = join3(__dirname4, "variables.css");
166
+
167
+ // src/styles/index.ts
168
+ import { dirname as dirname4, join as join4 } from "node:path";
169
+ import { fileURLToPath as fileURLToPath4 } from "node:url";
170
+ var __dirname5 = dirname4(fileURLToPath4(import.meta.url));
171
+ var docsStyle = join4(__dirname5, "custom.css");
172
+
173
+ // src/index.ts
174
+ var DocsAssets = {
8
175
  knitliLogo,
9
176
  recocoLogoMed,
10
177
  recocoLogoSm,
@@ -24,20 +191,32 @@ const DocsAssets = {
24
191
  faviconSvg,
25
192
  docsStyle
26
193
  };
27
- const components = {
28
- DocsBreadcrumb: async () => await import('./components/DocsBreadcrumb.astro'),
29
- DocsFooter: async () => await import('./components/Footer.astro'),
30
- PageFrame: async () => await import('./components/PageFrame.astro'),
31
- Contributors: async () => await import('./components/Contributors.astro'),
32
- AllContributors: async () => await import('./components/AllContributors.astro'),
33
- SeoMeta: async () => await import('./components/SeoMeta.astro'),
34
- ProductCard: async () => await import('./components/ProductCard.astro'),
35
- ProductGrid: async () => await import('./components/ProductGrid.astro'),
36
- ProductShowcase: async () => await import('./components/ProductShowcase.astro')
194
+ var components = {
195
+ DocsBreadcrumb: async () => await Promise.resolve().then(() => __toESM(require_DocsBreadcrumb(), 1)),
196
+ DocsFooter: async () => await Promise.resolve().then(() => __toESM(require_Footer(), 1)),
197
+ PageFrame: async () => await Promise.resolve().then(() => __toESM(require_PageFrame(), 1)),
198
+ Contributors: async () => await Promise.resolve().then(() => __toESM(require_Contributors(), 1)),
199
+ AllContributors: async () => await Promise.resolve().then(() => __toESM(require_AllContributors(), 1)),
200
+ SeoMeta: async () => await Promise.resolve().then(() => __toESM(require_SeoMeta(), 1)),
201
+ ProductCard: async () => await Promise.resolve().then(() => __toESM(require_ProductCard(), 1)),
202
+ ProductGrid: async () => await Promise.resolve().then(() => __toESM(require_ProductGrid(), 1)),
203
+ ProductShowcase: async () => await Promise.resolve().then(() => __toESM(require_ProductShowcase(), 1))
37
204
  };
38
- const index = {
205
+ var src_default = {
39
206
  ...components,
40
207
  DocsAssets
41
208
  };
209
+ export {
210
+ products,
211
+ productNames,
212
+ getProductSitemaps,
213
+ getProductByName,
214
+ getProduct,
215
+ featuredProducts,
216
+ src_default as default,
217
+ availableProducts,
218
+ DocsAssets
219
+ };
42
220
 
43
- export { DocsAssets, index as default };
221
+ //# debugId=D99B31DD950B055464756E2164756E21
222
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2RhdGEvcHJvZHVjdHMudHMiLCAiLi4vc3JjL2Fzc2V0cy9mYXZpY29uL2luZGV4LnRzIiwgIi4uL3NyYy9hc3NldHMvbG9nb3MvaW5kZXgudHMiLCAiLi4vc3JjL2Fzc2V0cy9zdHlsZXMvaW5kZXgudHMiLCAiLi4vc3JjL3N0eWxlcy9pbmRleC50cyIsICIuLi9zcmMvaW5kZXgudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IEFkYW0gUG91bGVtYW5vcyA8YWRhbUBrbml0LmxpPlxuLy9cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgT1IgQXBhY2hlLTIuMFxuLy9cbi8vIFByb2R1Y3QgY2F0YWxvZyDigJQgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgYWxsIEtuaXRsaSBwcm9kdWN0IG1ldGFkYXRhLlxuLy8gRWRpdCBwcm9kdWN0cy5qc29uIHRvIGFkZCwgcmVtb3ZlLCByZW9yZGVyLCBvciB1cGRhdGUgcHJvZHVjdHMuXG5cbmltcG9ydCBjYXRhbG9nRGF0YSBmcm9tIFwiLi9wcm9kdWN0cy5qc29uXCIgd2l0aCB7IHR5cGU6IFwianNvblwiIH07XG5cbmV4cG9ydCB0eXBlIFByb2R1Y3RTdGF0dXMgPSBcImF2YWlsYWJsZVwiIHwgXCJjb21pbmctc29vblwiIHwgXCJhbHBoYVwiIHwgXCJiZXRhXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvZHVjdCB7XG4gIC8qKiBVUkwgc2x1ZyB1c2VkIGluIGRvY3MgcGF0aHMsIGUuZy4gXCJyZWNvY29cIiAqL1xuICBzbHVnOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2hvcnQgdGFnbGluZSBmb3IgY2FyZHMvbmF2ICovXG4gIHRhZ2xpbmU6IHN0cmluZztcbiAgLyoqIFByaW1hcnkgZGVzY3JpcHRpb24gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqIEJvbGQvZW1waGFzaXplZCBjYWxsb3V0IHRleHQgKi9cbiAgaGlnaGxpZ2h0Pzogc3RyaW5nO1xuICAvKiogSXRhbGljaXplZCBmb290bm90ZSAoZS5nLiBcIk5vdyBpbiBBbHBoYS5cIikgKi9cbiAgZm9vdG5vdGU/OiBzdHJpbmc7XG4gIC8qKiBQcm9kdWN0IHN0YXR1cyDigJQgZHJpdmVzIGNhcmQgcmVuZGVyaW5nIGFuZCBmb290ZXIgbGlua3MgKi9cbiAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzO1xuICAvKiogRG9jcyBVUkwg4oCUIHJlbGF0aXZlIGZvciBob3N0ZWQgZG9jcywgYWJzb2x1dGUgZm9yIGV4dGVybmFsICovXG4gIGRvY3NVcmw/OiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIGRvY3MgYXJlIGhvc3RlZCBleHRlcm5hbGx5IChlLmcuIGRvY3MucnMpICovXG4gIGV4dGVybmFsPzogYm9vbGVhbjtcbiAgLyoqIExvZ28gYXNzZXQga2V5IGZyb20gRG9jc0Fzc2V0cyAqL1xuICBsb2dvOiBzdHJpbmc7XG4gIC8qKiBEYXJrLW1vZGUgbG9nbyBhc3NldCBrZXkgZnJvbSBEb2NzQXNzZXRzICovXG4gIGRhcmtMb2dvPzogc3RyaW5nO1xuICAvKiogU29ydCBvcmRlciBmb3IgZGlzcGxheSAqL1xuICBvcmRlcjogbnVtYmVyO1xuICAvKiogU2V0IGZhbHNlIHRvIGhpZGUgZnJvbSBkb2NzLWhvbWUgd2l0aG91dCBkZWxldGluZyAqL1xuICBmZWF0dXJlZD86IGJvb2xlYW47XG59XG5cbi8qKiBBbGwgcHJvZHVjdHMgZnJvbSB0aGUgY2F0YWxvZyAqL1xuZXhwb3J0IGNvbnN0IHByb2R1Y3RzOiBQcm9kdWN0W10gPSBjYXRhbG9nRGF0YSBhcyBQcm9kdWN0W107XG5cbi8qKiBQcm9kdWN0cyBtYXJrZWQgYXMgZmVhdHVyZWQgKG9yIG5vdCBleHBsaWNpdGx5IHVuZmVhdHVyZWQpLCBzb3J0ZWQgYnkgb3JkZXIgKi9cbmV4cG9ydCBmdW5jdGlvbiBmZWF0dXJlZFByb2R1Y3RzKCk6IFByb2R1Y3RbXSB7XG4gIHJldHVybiBwcm9kdWN0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuZmVhdHVyZWQgIT09IGZhbHNlKVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcik7XG59XG5cbi8qKiBQcm9kdWN0cyB3aXRoIGF2YWlsYWJsZSBkb2N1bWVudGF0aW9uIChub3QgY29taW5nLXNvb24pICovXG5leHBvcnQgZnVuY3Rpb24gYXZhaWxhYmxlUHJvZHVjdHMoKTogUHJvZHVjdFtdIHtcbiAgcmV0dXJuIHByb2R1Y3RzLmZpbHRlcigocCkgPT4gcC5zdGF0dXMgIT09IFwiY29taW5nLXNvb25cIik7XG59XG5cbi8qKiBMb29rIHVwIGEgc2luZ2xlIHByb2R1Y3QgYnkgc2x1ZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFByb2R1Y3Qoc2x1Zzogc3RyaW5nKTogUHJvZHVjdCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBwcm9kdWN0cy5maW5kKChwKSA9PiBwLnNsdWcgPT09IHNsdWcpO1xufVxuXG4vKiogTG9vayB1cCBhIHByb2R1Y3QgYnkgZGlzcGxheSBuYW1lICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZHVjdEJ5TmFtZShuYW1lOiBzdHJpbmcpOiBQcm9kdWN0IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHByb2R1Y3RzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gbmFtZSk7XG59XG5cbi8qKiBBbGwgdmFsaWQgcHJvZHVjdCBkaXNwbGF5IG5hbWVzLCBkZXJpdmVkIGZyb20gY2F0YWxvZyAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2R1Y3ROYW1lcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwcm9kdWN0cy5tYXAoKHApID0+IHAubmFtZSk7XG59XG5cbi8qKiBHZW5lcmF0ZSBzaXRlbWFwIFVSTHMgZm9yIHByb2R1Y3RzIHdpdGggaG9zdGVkIChub24tZXh0ZXJuYWwpIGRvY3MgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9kdWN0U2l0ZW1hcHMoXG4gIGJhc2VVcmwgPSBcImh0dHBzOi8vZG9jcy5rbml0bGkuY29tXCIsXG4pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBwcm9kdWN0c1xuICAgIC5maWx0ZXIoKHApID0+IHAuZG9jc1VybCAmJiAhcC5leHRlcm5hbCAmJiBwLnN0YXR1cyAhPT0gXCJjb21pbmctc29vblwiKVxuICAgIC5tYXAoKHApID0+IGAke2Jhc2VVcmx9LyR7cC5zbHVnfS9zaXRlbWFwLWluZGV4LnhtbGApO1xufVxuIiwKICAgICIvLyBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiAyMDI1IEtuaXRsaSBJbmMuXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUIE9SIEFwYWNoZS0yLjBcbi8vXG4vLyBMb2NhbCBsb2dvIGFzc2V0IGV4cG9ydHMgLSBmaWxlcyBhcmUgY29waWVkIGZyb20gQGtuaXRsaS9zaGFyZWQtbGF5b3V0cyBkdXJpbmcgYnVpbGQuXG4vLyBEbyBub3QgZWRpdCBwYXRocyBoZXJlOyBydW4gYGJ1biBydW4gY29weS1hc3NldHNgIHRvIHJlZnJlc2ggZnJvbSBzb3VyY2UuXG5cbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGNvbnN0IGZhdmljb25JY28gPSBqb2luKF9fZGlybmFtZSwgXCJmYXZpY29uLmljb1wiKTtcbmV4cG9ydCBjb25zdCBmYXZpY29uU3ZnID0gam9pbihfX2Rpcm5hbWUsIFwiZmF2aWNvbi5zdmdcIik7XG5cbmV4cG9ydCB0eXBlIEZhdmljb25Bc3NldHMgPSB7XG4gIGZhdmljb25JY286IHN0cmluZztcbiAgZmF2aWNvblN2Zzogc3RyaW5nO1xufTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCBPUiBBcGFjaGUtMi4wXG4vL1xuLy8gTG9jYWwgbG9nbyBhc3NldCBleHBvcnRzIC0gZmlsZXMgYXJlIGNvcGllZCBmcm9tIEBrbml0bGkvc2hhcmVkLWxheW91dHMgZHVyaW5nIGJ1aWxkLlxuLy8gRG8gbm90IGVkaXQgcGF0aHMgaGVyZTsgcnVuIGBidW4gcnVuIGNvcHktYXNzZXRzYCB0byByZWZyZXNoIGZyb20gc291cmNlLlxuXG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG5jb25zdCBfX2Rpcm5hbWUgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5cbmV4cG9ydCBjb25zdCBrbml0bGlMb2dvID0gam9pbihfX2Rpcm5hbWUsIFwia25pdGxpX2xvZ28uc3ZnXCIpO1xuZXhwb3J0IGNvbnN0IGhlYWRsaW5lTG9nb0xpZ2h0ID0gam9pbihfX2Rpcm5hbWUsIFwiaGVhZGxpbmVfbG9nby53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IGhlYWRsaW5lTG9nb0RhcmsgPSBqb2luKF9fZGlybmFtZSwgXCJoZWFkbGluZV9sb2dvX2Rhcmsud2VicFwiKTtcbmV4cG9ydCBjb25zdCBjb2Rld2VhdmVyUHJpbWFyeSA9IGpvaW4oX19kaXJuYW1lLCBcImNvZGV3ZWF2ZXItcHJpbWFyeS5zdmdcIik7XG5leHBvcnQgY29uc3QgY29kZXdlYXZlclJldmVyc2UgPSBqb2luKF9fZGlybmFtZSwgXCJjb2Rld2VhdmVyLXJldmVyc2Uuc3ZnXCIpO1xuZXhwb3J0IGNvbnN0IGtuaXRsaVdvcmRtYXJrID0gam9pbihfX2Rpcm5hbWUsIFwia25pdGxpX3dvcmRtYXJrLnN2Z1wiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvWGwgPSBqb2luKF9fZGlybmFtZSwgXCJyZWNvY28teGwud2VicFwiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvTGcgPSBqb2luKF9fZGlybmFtZSwgXCJyZWNvY28tbGcud2VicFwiKTtcbmV4cG9ydCBjb25zdCByZWNvY29Mb2dvTWVkID0gam9pbihfX2Rpcm5hbWUsIFwicmVjb2NvLW1lZC53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHJlY29jb0xvZ29TbSA9IGpvaW4oX19kaXJuYW1lLCBcInJlY29jby1zbS53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHJlY29jb0xvZ29YcyA9IGpvaW4oX19kaXJuYW1lLCBcInJlY29jby14cy53ZWJwXCIpO1xuZXhwb3J0IGNvbnN0IHRocmVhZExvZ29EYXJrID0gam9pbihcbiAgX19kaXJuYW1lLFxuICBcIlRocmVhZF92ZWN0b3JfbW9ub19wYXJjaG1lbnQuc3ZnXCIsXG4pO1xuZXhwb3J0IGNvbnN0IHRocmVhZExvZ29MaWdodCA9IGpvaW4oXG4gIF9fZGlybmFtZSxcbiAgXCJUaHJlYWRfdmVjdG9yX21vbm9fYXViZXJnaW5lLnN2Z1wiLFxuKTtcblxuZXhwb3J0IHR5cGUgTG9nb0Fzc2V0cyA9IHtcbiAga25pdGxpTG9nbzogc3RyaW5nO1xuICBoZWFkbGluZUxvZ29EYXJrOiBzdHJpbmc7XG4gIGhlYWRsaW5lTG9nb0xpZ2h0OiBzdHJpbmc7XG4gIGNvZGV3ZWF2ZXJQcmltYXJ5OiBzdHJpbmc7XG4gIGNvZGV3ZWF2ZXJSZXZlcnNlOiBzdHJpbmc7XG4gIGtuaXRsaVdvcmRtYXJrOiBzdHJpbmc7XG4gIHJlY29jb0xvZ29YbDogc3RyaW5nO1xuICByZWNvY29Mb2dvTGc6IHN0cmluZztcbiAgcmVjb2NvTG9nb01lZDogc3RyaW5nO1xuICByZWNvY29Mb2dvU206IHN0cmluZztcbiAgcmVjb2NvTG9nb1hzOiBzdHJpbmc7XG4gIHRocmVhZExvZ29EYXJrOiBzdHJpbmc7XG4gIHRocmVhZExvZ29MaWdodDogc3RyaW5nO1xufTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVCBPUiBBcGFjaGUtMi4wXG4vL1xuLy8gTG9jYWwgc3R5bGUgYXNzZXQgcGF0aCBleHBvcnRzIC0gQ1NTIGZpbGVzIGFyZSBjb3BpZWQgZnJvbSBAa25pdGxpL3NoYXJlZC1sYXlvdXRzIGR1cmluZyBidWlsZC5cbi8vIERvIG5vdCBlZGl0OyBydW4gYGJ1biBydW4gY29weS1hc3NldHNgIHRvIHJlZnJlc2ggZnJvbSBzb3VyY2UuXG5cbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSBcIm5vZGU6dXJsXCI7XG5cbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcblxuZXhwb3J0IGNvbnN0IGNvZGV3ZWF2ZXJUaGVtZSA9IGpvaW4oX19kaXJuYW1lLCBcImNvZGV3ZWF2ZXItdGhlbWUuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IGdsb2JhbFN0eWxlcyA9IGpvaW4oX19kaXJuYW1lLCBcImdsb2JhbC5jc3NcIik7XG5leHBvcnQgY29uc3Qga25pdGxpVGhlbWUgPSBqb2luKF9fZGlybmFtZSwgXCJrbml0bGktdGhlbWUuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IHRleHR1cmVzID0gam9pbihfX2Rpcm5hbWUsIFwidGV4dHVyZXMuY3NzXCIpO1xuZXhwb3J0IGNvbnN0IHR5cG9ncmFwaHkgPSBqb2luKF9fZGlybmFtZSwgXCJ0eXBvZ3JhcGh5LmNzc1wiKTtcbmV4cG9ydCBjb25zdCB2YXJpYWJsZXMgPSBqb2luKF9fZGlybmFtZSwgXCJ2YXJpYWJsZXMuY3NzXCIpO1xuXG5leHBvcnQgdHlwZSBTdHlsZUFzc2V0cyA9IHtcbiAgY29kZXdlYXZlclRoZW1lOiBzdHJpbmc7XG4gIGdsb2JhbFN0eWxlczogc3RyaW5nO1xuICBrbml0bGlUaGVtZTogc3RyaW5nO1xuICB0ZXh0dXJlczogc3RyaW5nO1xuICB0eXBvZ3JhcGh5OiBzdHJpbmc7XG4gIHZhcmlhYmxlczogc3RyaW5nO1xufTtcbiIsCiAgICAiaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuY29uc3QgX19kaXJuYW1lID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuXG5leHBvcnQgY29uc3QgZG9jc1N0eWxlID0gam9pbihfX2Rpcm5hbWUsIFwiY3VzdG9tLmNzc1wiKTtcbiIsCiAgICAiLy8gU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogMjAyNSBLbml0bGkgSW5jLlxuLy8gU1BEWC1GaWxlQ29udHJpYnV0b3I6IEFkYW0gUG91bGVtYW5vcyA8YWRhbUBrbml0LmxpPlxuLy9cbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQgT1IgQXBhY2hlLTIuMFxuLy9cbi8vIE1haW4gZXhwb3J0cyBmb3IgQGtuaXRsaS9kb2NzLWNvbXBvbmVudHMgcGFja2FnZVxuXG5leHBvcnQgKiBmcm9tIFwiLi9kYXRhL3Byb2R1Y3RzLmpzXCI7XG4vLyBFeHBvcnQgdHlwZSBkZWZpbml0aW9ucyBhbmQgcHJvZHVjdCBjYXRhbG9nXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlcy9pbmRleC5qc1wiO1xuXG5pbXBvcnQgeyBmYXZpY29uSWNvLCBmYXZpY29uU3ZnIH0gZnJvbSBcIi4vYXNzZXRzL2Zhdmljb24vaW5kZXguanNcIjtcbmltcG9ydCB7XG4gIGNvZGV3ZWF2ZXJQcmltYXJ5LFxuICBjb2Rld2VhdmVyUmV2ZXJzZSxcbiAgaGVhZGxpbmVMb2dvRGFyayxcbiAgaGVhZGxpbmVMb2dvTGlnaHQsXG4gIGtuaXRsaUxvZ28sXG4gIGtuaXRsaVdvcmRtYXJrLFxuICByZWNvY29Mb2dvTGcsXG4gIHJlY29jb0xvZ29NZWQsXG4gIHJlY29jb0xvZ29TbSxcbiAgcmVjb2NvTG9nb1hsLFxuICByZWNvY29Mb2dvWHMsXG4gIHRocmVhZExvZ29EYXJrLFxuICB0aHJlYWRMb2dvTGlnaHQsXG59IGZyb20gXCIuL2Fzc2V0cy9sb2dvcy9pbmRleC5qc1wiO1xuXG5pbXBvcnQgeyBjb2Rld2VhdmVyVGhlbWUsIHZhcmlhYmxlcyB9IGZyb20gXCIuL2Fzc2V0cy9zdHlsZXMvaW5kZXguanNcIjtcblxuaW1wb3J0IHsgZG9jc1N0eWxlIH0gZnJvbSBcIi4vc3R5bGVzL2luZGV4LmpzXCI7XG5cbmV4cG9ydCBjb25zdCBEb2NzQXNzZXRzID0ge1xuICBrbml0bGlMb2dvLFxuICByZWNvY29Mb2dvTWVkLFxuICByZWNvY29Mb2dvU20sXG4gIHJlY29jb0xvZ29MZyxcbiAgcmVjb2NvTG9nb1hzLFxuICByZWNvY29Mb2dvWGwsXG4gIGNvZGV3ZWF2ZXJQcmltYXJ5LFxuICBjb2Rld2VhdmVyUmV2ZXJzZSxcbiAgY29kZXdlYXZlclRoZW1lLFxuICB2YXJpYWJsZXMsXG4gIHRocmVhZExvZ29EYXJrLFxuICB0aHJlYWRMb2dvTGlnaHQsXG4gIGhlYWRsaW5lTG9nb0RhcmssXG4gIGhlYWRsaW5lTG9nb0xpZ2h0LFxuICBrbml0bGlXb3JkbWFyayxcbiAgZmF2aWNvbkljbyxcbiAgZmF2aWNvblN2ZyxcbiAgZG9jc1N0eWxlLFxufTtcblxuY29uc3QgY29tcG9uZW50cyA9IHtcbiAgRG9jc0JyZWFkY3J1bWI6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Eb2NzQnJlYWRjcnVtYi5hc3Ryb1wiKSxcbiAgRG9jc0Zvb3RlcjogYXN5bmMgKCkgPT4gYXdhaXQgaW1wb3J0KFwiLi9jb21wb25lbnRzL0Zvb3Rlci5hc3Ryb1wiKSxcbiAgUGFnZUZyYW1lOiBhc3luYyAoKSA9PiBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvUGFnZUZyYW1lLmFzdHJvXCIpLFxuICBDb250cmlidXRvcnM6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Db250cmlidXRvcnMuYXN0cm9cIiksXG4gIEFsbENvbnRyaWJ1dG9yczogYXN5bmMgKCkgPT5cbiAgICBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvQWxsQ29udHJpYnV0b3JzLmFzdHJvXCIpLFxuICBTZW9NZXRhOiBhc3luYyAoKSA9PiBhd2FpdCBpbXBvcnQoXCIuL2NvbXBvbmVudHMvU2VvTWV0YS5hc3Ryb1wiKSxcbiAgUHJvZHVjdENhcmQ6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0Q2FyZC5hc3Ryb1wiKSxcbiAgUHJvZHVjdEdyaWQ6IGFzeW5jICgpID0+IGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0R3JpZC5hc3Ryb1wiKSxcbiAgUHJvZHVjdFNob3djYXNlOiBhc3luYyAoKSA9PlxuICAgIGF3YWl0IGltcG9ydChcIi4vY29tcG9uZW50cy9Qcm9kdWN0U2hvd2Nhc2UuYXN0cm9cIiksXG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIC4uLmNvbXBvbmVudHMsXG4gIERvY3NBc3NldHMsXG59O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENPLElBQU0sV0FBc0I7QUFHNUIsU0FBUyxnQkFBZ0IsR0FBYztBQUFBLEVBQzVDLE9BQU8sU0FDSixPQUFPLENBQUMsTUFBTSxFQUFFLGFBQWEsS0FBSyxFQUNsQyxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUs7QUFBQTtBQUk5QixTQUFTLGlCQUFpQixHQUFjO0FBQUEsRUFDN0MsT0FBTyxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsV0FBVyxhQUFhO0FBQUE7QUFJbkQsU0FBUyxVQUFVLENBQUMsTUFBbUM7QUFBQSxFQUM1RCxPQUFPLFNBQVMs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