+26
.gitignore
+26
.gitignore
···
1
+
# Logs
2
+
logs
3
+
*.log
4
+
npm-debug.log*
5
+
yarn-debug.log*
6
+
yarn-error.log*
7
+
pnpm-debug.log*
8
+
lerna-debug.log*
9
+
10
+
node_modules
11
+
dist
12
+
lib-dist
13
+
dist-ssr
14
+
*.local
15
+
*.zip
16
+
17
+
# Editor directories and files
18
+
.vscode/*
19
+
!.vscode/extensions.json
20
+
.idea
21
+
.DS_Store
22
+
*.suo
23
+
*.ntvs*
24
+
*.njsproj
25
+
*.sln
26
+
*.sw?
+131
README.md
+131
README.md
···
1
+
# atproto-ui
2
+
3
+
atproto-ui is a component library and set of hooks for rendering records from the AT Protocol (Bluesky, Leaflet, and friends) in React applications. It handles DID resolution, PDS endpoint discovery, and record fetching so you can focus on UI.
4
+
5
+
## Features
6
+
7
+
- Drop-in components for common record types (`BlueskyPost`, `BlueskyProfile`, `TangledString`, etc.).
8
+
- Hooks and helpers for composing your own renderers for your own applications, (PRs welcome!)
9
+
- Built on the lightweight [`@atcute/*`](https://github.com/atcute) clients.
10
+
11
+
## Installation
12
+
13
+
```bash
14
+
npm install atproto-ui
15
+
```
16
+
17
+
## Quick start
18
+
19
+
1. Wrap your app (once) with the `AtProtoProvider`.
20
+
2. Drop any of the ready-made components inside that provider.
21
+
3. Use the hooks to prefetch handles, blobs, or latest records when you want to control the render flow yourself.
22
+
23
+
```tsx
24
+
import { AtProtoProvider, BlueskyPost } from 'atproto-ui';
25
+
26
+
export function App() {
27
+
return (
28
+
<AtProtoProvider>
29
+
<BlueskyPost did="did:plc:example" rkey="3k2aexample" />
30
+
{/* you can use handles in the components as well. */}
31
+
<LeafletDocument did="nekomimi.pet" rkey="3m2seagm2222c" />
32
+
</AtProtoProvider>
33
+
);
34
+
}
35
+
```
36
+
37
+
### Available building blocks
38
+
39
+
| Component / Hook | What it does |
40
+
| --- | --- |
41
+
| `AtProtoProvider` | Configures PLC directory (defaults to `https://plc.directory`) and shares protocol clients via React context. |
42
+
| `BlueskyProfile` | Renders a profile card for a DID/handle. Accepts `fallback`, `loadingIndicator`, `renderer`, and `colorScheme`. |
43
+
| `BlueskyPost` / `BlueskyQuotePost` | Shows a single Bluesky post, with quotation support, custom renderer overrides, and the same loading/fallback knobs. |
44
+
| `BlueskyPostList` | Lists the latest posts with built-in pagination (defaults: 5 per page, pagination controls on). |
45
+
| `TangledString` | Renders a Tangled string (gist-like record) with optional renderer overrides. |
46
+
| `LeafletDocument` | Displays long-form Leaflet documents with blocks, theme support, and renderer overrides. |
47
+
| `useDidResolution`, `useLatestRecord`, `usePaginatedRecords`, … | Hook-level access to records if you want to own the markup or prefill components. |
48
+
49
+
All components accept a `colorScheme` of `'light' | 'dark' | 'system'` so they can blend into your design. They also accept `fallback` and `loadingIndicator` props to control what renders before or during network work, and most expose a `renderer` override when you need total control of the final markup.
50
+
51
+
### Prefill components with the latest record
52
+
53
+
`useLatestRecord` gives you the most recent record for any collection along with its `rkey`. You can use that key to pre-populate components like `BlueskyPost`, `LeafletDocument`, or `TangledString`.
54
+
55
+
```tsx
56
+
import { useLatestRecord, BlueskyPost } from 'atproto-ui';
57
+
import type { FeedPostRecord } from 'atproto-ui';
58
+
59
+
const LatestBlueskyPost: React.FC<{ did: string }> = ({ did }) => {
60
+
const { rkey, loading, error, empty } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
61
+
62
+
if (loading) return <p>Fetching latest post…</p>;
63
+
if (error) return <p>Could not load: {error.message}</p>;
64
+
if (empty || !rkey) return <p>No posts yet.</p>;
65
+
66
+
return (
67
+
<BlueskyPost
68
+
did={did}
69
+
rkey={rkey}
70
+
colorScheme="system"
71
+
/>
72
+
);
73
+
};
74
+
```
75
+
76
+
The same pattern works for other components: swap the collection NSID and the component you render once you have an `rkey`.
77
+
78
+
```tsx
79
+
const LatestLeafletDocument: React.FC<{ did: string }> = ({ did }) => {
80
+
const { rkey } = useLatestRecord(did, 'pub.leaflet.document');
81
+
return rkey ? <LeafletDocument did={did} rkey={rkey} colorScheme="light" /> : null;
82
+
};
83
+
```
84
+
85
+
## Compose your own component
86
+
87
+
The helpers let you stitch together custom experiences without reimplementing protocol plumbing. The example below pulls a creator’s latest post and renders a minimal summary:
88
+
89
+
```tsx
90
+
import { useLatestRecord, useColorScheme, AtProtoRecord } from 'atproto-ui';
91
+
import type { FeedPostRecord } from 'atproto-ui';
92
+
93
+
const LatestPostSummary: React.FC<{ did: string }> = ({ did }) => {
94
+
const scheme = useColorScheme('system');
95
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
96
+
97
+
if (loading) return <span>Loading…</span>;
98
+
if (error || !rkey) return <span>No post yet.</span>;
99
+
100
+
return (
101
+
<AtProtoRecord<FeedPostRecord>
102
+
did={did}
103
+
collection="app.bsky.feed.post"
104
+
rkey={rkey}
105
+
renderer={({ record }) => (
106
+
<article data-color-scheme={scheme}>
107
+
<strong>{record?.text ?? 'Empty post'}</strong>
108
+
</article>
109
+
)}
110
+
/>
111
+
);
112
+
};
113
+
```
114
+
115
+
There is a [demo](https://wisp.place/s/ana.pds.nkp.pet/ATComponents) where you can see the components in live action.
116
+
117
+
## Running the demo locally
118
+
119
+
```bash
120
+
npm install
121
+
npm run dev
122
+
```
123
+
124
+
Then open the printed Vite URL and try entering a Bluesky handle to see the components in action.
125
+
126
+
## Next steps
127
+
128
+
- Expand renderer coverage (e.g., Grain.social photos).
129
+
- Expand documentation with TypeScript API references and theming guidelines.
130
+
131
+
Contributions and ideas are welcome—feel free to open an issue or PR!
+23
eslint.config.js
+23
eslint.config.js
···
1
+
import js from '@eslint/js'
2
+
import globals from 'globals'
3
+
import reactHooks from 'eslint-plugin-react-hooks'
4
+
import reactRefresh from 'eslint-plugin-react-refresh'
5
+
import tseslint from 'typescript-eslint'
6
+
import { defineConfig, globalIgnores } from 'eslint/config'
7
+
8
+
export default defineConfig([
9
+
globalIgnores(['dist']),
10
+
{
11
+
files: ['**/*.{ts,tsx}'],
12
+
extends: [
13
+
js.configs.recommended,
14
+
tseslint.configs.recommended,
15
+
reactHooks.configs['recommended-latest'],
16
+
reactRefresh.configs.vite,
17
+
],
18
+
languageOptions: {
19
+
ecmaVersion: 2020,
20
+
globals: globals.browser,
21
+
},
22
+
},
23
+
])
+1
global.d.ts
+1
global.d.ts
···
1
+
declare module '*.css';
+13
index.html
+13
index.html
···
1
+
<!doctype html>
2
+
<html lang="en">
3
+
<head>
4
+
<meta charset="UTF-8" />
5
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
6
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7
+
<title>atproto-ui</title>
8
+
</head>
9
+
<body>
10
+
<div id="root"></div>
11
+
<script type="module" src="/src/main.tsx"></script>
12
+
</body>
13
+
</html>
+50
lib/components/BlueskyIcon.tsx
+50
lib/components/BlueskyIcon.tsx
···
1
+
import React from 'react';
2
+
3
+
/**
4
+
* Configuration for the `BlueskyIcon` component.
5
+
*/
6
+
export interface BlueskyIconProps {
7
+
/**
8
+
* Pixel dimensions applied to both the width and height of the SVG element.
9
+
* Defaults to `16`.
10
+
*/
11
+
size?: number;
12
+
/**
13
+
* Hex, RGB, or any valid CSS color string used to fill the icon path.
14
+
* Defaults to the standard Bluesky blue `#1185fe`.
15
+
*/
16
+
color?: string;
17
+
/**
18
+
* Accessible title that will be exposed via `aria-label` for screen readers.
19
+
* Defaults to `'Bluesky'`.
20
+
*/
21
+
title?: string;
22
+
}
23
+
24
+
/**
25
+
* Renders the Bluesky butterfly glyph as a scalable, accessible SVG.
26
+
*
27
+
* @param size - Pixel dimensions applied to both width and height of the SVG.
28
+
* @param color - CSS color string used to fill the icon path.
29
+
* @param title - Accessible label exposed via `aria-label`.
30
+
* @returns A JSX `<svg>` element suitable for inline usage.
31
+
*/
32
+
export const BlueskyIcon: React.FC<BlueskyIconProps> = ({ size = 16, color = '#1185fe', title = 'Bluesky' }) => (
33
+
<svg
34
+
xmlns="http://www.w3.org/2000/svg"
35
+
width={size}
36
+
height={size}
37
+
viewBox="0 0 16 16"
38
+
role="img"
39
+
aria-label={title}
40
+
focusable="false"
41
+
style={{ display: 'block' }}
42
+
>
43
+
<path
44
+
fill={color}
45
+
d="M3.468 1.948C5.303 3.325 7.276 6.118 8 7.616c.725-1.498 2.698-4.29 4.532-5.668C13.855.955 16 .186 16 2.632c0 .489-.28 4.105-.444 4.692-.572 2.04-2.653 2.561-4.504 2.246 3.236.551 4.06 2.375 2.281 4.2-3.376 3.464-4.852-.87-5.23-1.98-.07-.204-.103-.3-.103-.218 0-.081-.033.014-.102.218-.379 1.11-1.855 5.444-5.231 1.98-1.778-1.825-.955-3.65 2.28-4.2-1.85.315-3.932-.205-4.503-2.246C.28 6.737 0 3.12 0 2.632 0 .186 2.145.955 3.468 1.948"
46
+
/>
47
+
</svg>
48
+
);
49
+
50
+
export default BlueskyIcon;
+159
lib/components/BlueskyPost.tsx
+159
lib/components/BlueskyPost.tsx
···
1
+
import React from 'react';
2
+
import { AtProtoRecord } from '../core/AtProtoRecord';
3
+
import { BlueskyPostRenderer } from '../renderers/BlueskyPostRenderer';
4
+
import type { FeedPostRecord, ProfileRecord } from '../types/bluesky';
5
+
import { useDidHandle } from '../hooks/useDidHandle';
6
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
7
+
import { useBlob } from '../hooks/useBlob';
8
+
import { BLUESKY_PROFILE_COLLECTION } from './BlueskyProfile';
9
+
import { getAvatarCid } from '../utils/profile';
10
+
11
+
/**
12
+
* Props for rendering a single Bluesky post with optional customization hooks.
13
+
*/
14
+
export interface BlueskyPostProps {
15
+
/**
16
+
* Decentralized identifier for the repository that owns the post.
17
+
*/
18
+
did: string;
19
+
/**
20
+
* Record key identifying the specific post within the collection.
21
+
*/
22
+
rkey: string;
23
+
/**
24
+
* Custom renderer component that receives resolved post data and status flags.
25
+
*/
26
+
renderer?: React.ComponentType<BlueskyPostRendererInjectedProps>;
27
+
/**
28
+
* React node shown while the post query has not yet produced data or an error.
29
+
*/
30
+
fallback?: React.ReactNode;
31
+
/**
32
+
* React node displayed while the post fetch is actively loading.
33
+
*/
34
+
loadingIndicator?: React.ReactNode;
35
+
/**
36
+
* Preferred color scheme to pass through to renderers.
37
+
*/
38
+
colorScheme?: 'light' | 'dark' | 'system';
39
+
/**
40
+
* Whether the default renderer should show the Bluesky icon.
41
+
* Defaults to `true`.
42
+
*/
43
+
showIcon?: boolean;
44
+
/**
45
+
* Placement strategy for the icon when it is rendered.
46
+
* Defaults to `'timestamp'`.
47
+
*/
48
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
49
+
}
50
+
51
+
/**
52
+
* Values injected by `BlueskyPost` into a downstream renderer component.
53
+
*/
54
+
export type BlueskyPostRendererInjectedProps = {
55
+
/**
56
+
* Resolved record payload for the post.
57
+
*/
58
+
record: FeedPostRecord;
59
+
/**
60
+
* `true` while network operations are in-flight.
61
+
*/
62
+
loading: boolean;
63
+
/**
64
+
* Error encountered during loading, if any.
65
+
*/
66
+
error?: Error;
67
+
/**
68
+
* The author's public handle derived from the DID.
69
+
*/
70
+
authorHandle: string;
71
+
/**
72
+
* The DID that owns the post record.
73
+
*/
74
+
authorDid: string;
75
+
/**
76
+
* Resolved URL for the author's avatar blob, if available.
77
+
*/
78
+
avatarUrl?: string;
79
+
/**
80
+
* Preferred color scheme bubbled down to children.
81
+
*/
82
+
colorScheme?: 'light' | 'dark' | 'system';
83
+
/**
84
+
* Placement strategy for the Bluesky icon.
85
+
*/
86
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
87
+
/**
88
+
* Controls whether the icon should render at all.
89
+
*/
90
+
showIcon?: boolean;
91
+
/**
92
+
* Fully qualified AT URI of the post.
93
+
*/
94
+
atUri: string;
95
+
/**
96
+
* Optional override for the rendered embed contents.
97
+
*/
98
+
embed?: React.ReactNode;
99
+
};
100
+
101
+
/** NSID for the canonical Bluesky feed post collection. */
102
+
export const BLUESKY_POST_COLLECTION = 'app.bsky.feed.post';
103
+
104
+
/**
105
+
* Fetches a Bluesky feed post, resolves metadata such as author handle and avatar,
106
+
* and renders it via a customizable renderer component.
107
+
*
108
+
* @param did - DID of the repository that stores the post.
109
+
* @param rkey - Record key for the post within the feed collection.
110
+
* @param renderer - Optional renderer component to override the default.
111
+
* @param fallback - Node rendered before the first fetch attempt resolves.
112
+
* @param loadingIndicator - Node rendered while the post is loading.
113
+
* @param colorScheme - Preferred color scheme forwarded to downstream components.
114
+
* @param showIcon - Controls whether the Bluesky icon should render alongside the post. Defaults to `true`.
115
+
* @param iconPlacement - Determines where the icon is positioned in the rendered post. Defaults to `'timestamp'`.
116
+
* @returns A component that renders loading/fallback states and the resolved post.
117
+
*/
118
+
export const BlueskyPost: React.FC<BlueskyPostProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme, showIcon = true, iconPlacement = 'timestamp' }) => {
119
+
const { handle, loading: handleLoading } = useDidHandle(did);
120
+
const { record: profile } = useAtProtoRecord<ProfileRecord>({ did, collection: BLUESKY_PROFILE_COLLECTION, rkey: 'self' });
121
+
const avatarCid = getAvatarCid(profile);
122
+
const { url: avatarUrl } = useBlob(did, avatarCid);
123
+
124
+
const Comp: React.ComponentType<BlueskyPostRendererInjectedProps> = renderer ?? ((props) => <BlueskyPostRenderer {...props} />);
125
+
126
+
if (!handle && handleLoading) {
127
+
return <div style={{ padding: 8 }}>Resolving handle…</div>;
128
+
}
129
+
if (!handle) {
130
+
return <div style={{ padding: 8, color: 'crimson' }}>Could not resolve handle.</div>;
131
+
}
132
+
133
+
const atUri = `at://${did}/${BLUESKY_POST_COLLECTION}/${rkey}`;
134
+
135
+
const Wrapped: React.FC<{ record: FeedPostRecord; loading: boolean; error?: Error }> = (props) => (
136
+
<Comp
137
+
{...props}
138
+
authorHandle={handle}
139
+
authorDid={did}
140
+
avatarUrl={avatarUrl}
141
+
colorScheme={colorScheme}
142
+
iconPlacement={iconPlacement}
143
+
showIcon={showIcon}
144
+
atUri={atUri}
145
+
/>
146
+
);
147
+
return (
148
+
<AtProtoRecord<FeedPostRecord>
149
+
did={did}
150
+
collection={BLUESKY_POST_COLLECTION}
151
+
rkey={rkey}
152
+
renderer={Wrapped}
153
+
fallback={fallback}
154
+
loadingIndicator={loadingIndicator}
155
+
/>
156
+
);
157
+
};
158
+
159
+
export default BlueskyPost;
+421
lib/components/BlueskyPostList.tsx
+421
lib/components/BlueskyPostList.tsx
···
1
+
import React, { useMemo } from 'react';
2
+
import { usePaginatedRecords } from '../hooks/usePaginatedRecords';
3
+
import { useColorScheme } from '../hooks/useColorScheme';
4
+
import type { FeedPostRecord } from '../types/bluesky';
5
+
import { useDidHandle } from '../hooks/useDidHandle';
6
+
import { BlueskyIcon } from './BlueskyIcon';
7
+
8
+
/**
9
+
* Options for rendering a paginated list of Bluesky posts.
10
+
*/
11
+
export interface BlueskyPostListProps {
12
+
/**
13
+
* DID whose feed posts should be fetched.
14
+
*/
15
+
did: string;
16
+
/**
17
+
* Maximum number of records to list per page. Defaults to `5`.
18
+
*/
19
+
limit?: number;
20
+
/**
21
+
* Enables pagination controls when `true`. Defaults to `true`.
22
+
*/
23
+
enablePagination?: boolean;
24
+
/**
25
+
* Preferred color scheme passed through to styling helpers.
26
+
* Defaults to `'system'` which follows the OS preference.
27
+
*/
28
+
colorScheme?: 'light' | 'dark' | 'system';
29
+
}
30
+
31
+
/**
32
+
* Fetches a DID's feed posts and renders them with rich pagination and theming.
33
+
*
34
+
* @param did - DID whose posts should be displayed.
35
+
* @param limit - Maximum number of posts per page. Default `5`.
36
+
* @param enablePagination - Whether pagination controls should render. Default `true`.
37
+
* @param colorScheme - Preferred color scheme used for styling. Default `'system'`.
38
+
* @returns A card-like list element with loading, empty, and error handling.
39
+
*/
40
+
export const BlueskyPostList: React.FC<BlueskyPostListProps> = ({ did, limit = 5, enablePagination = true, colorScheme = 'system' }) => {
41
+
const scheme = useColorScheme(colorScheme);
42
+
const palette: ListPalette = scheme === 'dark' ? darkPalette : lightPalette;
43
+
const { handle } = useDidHandle(did);
44
+
45
+
const { records, loading, error, hasNext, hasPrev, loadNext, loadPrev, pageIndex, pagesCount } = usePaginatedRecords<FeedPostRecord>({ did, collection: 'app.bsky.feed.post', limit });
46
+
47
+
const pageLabel = useMemo(() => {
48
+
const knownTotal = Math.max(pageIndex + 1, pagesCount);
49
+
if (!enablePagination) return undefined;
50
+
if (hasNext && knownTotal === pageIndex + 1) return `${pageIndex + 1}/…`;
51
+
return `${pageIndex + 1}/${knownTotal}`;
52
+
}, [enablePagination, hasNext, pageIndex, pagesCount]);
53
+
54
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load posts.</div>;
55
+
56
+
return (
57
+
<div style={{ ...listStyles.card, ...palette.card }}>
58
+
<div style={{ ...listStyles.header, ...palette.header }}>
59
+
<div style={listStyles.headerInfo}>
60
+
<div style={listStyles.headerIcon}>
61
+
<BlueskyIcon size={20} />
62
+
</div>
63
+
<div style={listStyles.headerText}>
64
+
<span style={listStyles.title}>Latest Posts</span>
65
+
<span style={{ ...listStyles.subtitle, ...palette.subtitle }}>@{handle ?? formatDid(did)}</span>
66
+
</div>
67
+
</div>
68
+
{pageLabel && <span style={{ ...listStyles.pageMeta, ...palette.pageMeta }}>{pageLabel}</span>}
69
+
</div>
70
+
<div style={listStyles.items}>
71
+
{loading && records.length === 0 && <div style={{ ...listStyles.empty, ...palette.empty }}>Loading posts…</div>}
72
+
{records.map((record, idx) => (
73
+
<ListRow
74
+
key={record.rkey}
75
+
record={record.value}
76
+
rkey={record.rkey}
77
+
did={did}
78
+
palette={palette}
79
+
hasDivider={idx < records.length - 1}
80
+
/>
81
+
))}
82
+
{!loading && records.length === 0 && <div style={{ ...listStyles.empty, ...palette.empty }}>No posts found.</div>}
83
+
</div>
84
+
{enablePagination && (
85
+
<div style={{ ...listStyles.footer, ...palette.footer }}>
86
+
<button
87
+
type="button"
88
+
style={{
89
+
...listStyles.navButton,
90
+
...palette.navButton,
91
+
cursor: hasPrev ? 'pointer' : 'not-allowed',
92
+
opacity: hasPrev ? 1 : 0.5
93
+
}}
94
+
onClick={loadPrev}
95
+
disabled={!hasPrev}
96
+
>
97
+
‹ Prev
98
+
</button>
99
+
<div style={listStyles.pageChips}>
100
+
<span style={{ ...listStyles.pageChipActive, ...palette.pageChipActive }}>{pageIndex + 1}</span>
101
+
{(hasNext || pagesCount > pageIndex + 1) && (
102
+
<span style={{ ...listStyles.pageChip, ...palette.pageChip }}>{pageIndex + 2}</span>
103
+
)}
104
+
</div>
105
+
<button
106
+
type="button"
107
+
style={{
108
+
...listStyles.navButton,
109
+
...palette.navButton,
110
+
cursor: hasNext ? 'pointer' : 'not-allowed',
111
+
opacity: hasNext ? 1 : 0.5
112
+
}}
113
+
onClick={loadNext}
114
+
disabled={!hasNext}
115
+
>
116
+
Next ›
117
+
</button>
118
+
</div>
119
+
)}
120
+
{loading && records.length > 0 && <div style={{ ...listStyles.loadingBar, ...palette.loadingBar }}>Updating…</div>}
121
+
</div>
122
+
);
123
+
};
124
+
125
+
interface ListRowProps {
126
+
record: FeedPostRecord;
127
+
rkey: string;
128
+
did: string;
129
+
palette: ListPalette;
130
+
hasDivider: boolean;
131
+
}
132
+
133
+
const ListRow: React.FC<ListRowProps> = ({ record, rkey, did, palette, hasDivider }) => {
134
+
const text = record.text?.trim() ?? '';
135
+
const relative = record.createdAt ? formatRelativeTime(record.createdAt) : undefined;
136
+
const absolute = record.createdAt ? new Date(record.createdAt).toLocaleString() : undefined;
137
+
const href = `https://bsky.app/profile/${did}/post/${rkey}`;
138
+
139
+
return (
140
+
<a href={href} target="_blank" rel="noopener noreferrer" style={{ ...listStyles.row, ...palette.row, borderBottom: hasDivider ? `1px solid ${palette.divider}` : 'none' }}>
141
+
{relative && (
142
+
<span style={{ ...listStyles.rowTime, ...palette.rowTime }} title={absolute}>
143
+
{relative}
144
+
</span>
145
+
)}
146
+
{text && <p style={{ ...listStyles.rowBody, ...palette.rowBody }}>{text}</p>}
147
+
{!text && <p style={{ ...listStyles.rowBody, ...palette.rowBody, fontStyle: 'italic' }}>No text content.</p>}
148
+
</a>
149
+
);
150
+
};
151
+
152
+
function formatDid(did: string) {
153
+
return did.replace(/^did:(plc:)?/, '');
154
+
}
155
+
156
+
function formatRelativeTime(iso: string): string {
157
+
const date = new Date(iso);
158
+
const diffSeconds = (date.getTime() - Date.now()) / 1000;
159
+
const absSeconds = Math.abs(diffSeconds);
160
+
const thresholds: Array<{ limit: number; unit: Intl.RelativeTimeFormatUnit; divisor: number }> = [
161
+
{ limit: 60, unit: 'second', divisor: 1 },
162
+
{ limit: 3600, unit: 'minute', divisor: 60 },
163
+
{ limit: 86400, unit: 'hour', divisor: 3600 },
164
+
{ limit: 604800, unit: 'day', divisor: 86400 },
165
+
{ limit: 2629800, unit: 'week', divisor: 604800 },
166
+
{ limit: 31557600, unit: 'month', divisor: 2629800 },
167
+
{ limit: Infinity, unit: 'year', divisor: 31557600 }
168
+
];
169
+
const threshold = thresholds.find(t => absSeconds < t.limit) ?? thresholds[thresholds.length - 1];
170
+
const value = diffSeconds / threshold.divisor;
171
+
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
172
+
return rtf.format(Math.round(value), threshold.unit);
173
+
}
174
+
175
+
interface ListPalette {
176
+
card: { background: string; borderColor: string };
177
+
header: { borderBottomColor: string; color: string };
178
+
pageMeta: { color: string };
179
+
subtitle: { color: string };
180
+
empty: { color: string };
181
+
row: { color: string };
182
+
rowTime: { color: string };
183
+
rowBody: { color: string };
184
+
divider: string;
185
+
footer: { borderTopColor: string; color: string };
186
+
navButton: { color: string; background: string };
187
+
pageChip: { color: string; borderColor: string; background: string };
188
+
pageChipActive: { color: string; background: string; borderColor: string };
189
+
loadingBar: { color: string };
190
+
}
191
+
192
+
const listStyles = {
193
+
card: {
194
+
borderRadius: 16,
195
+
border: '1px solid transparent',
196
+
boxShadow: '0 8px 18px -12px rgba(15, 23, 42, 0.25)',
197
+
overflow: 'hidden',
198
+
display: 'flex',
199
+
flexDirection: 'column'
200
+
} satisfies React.CSSProperties,
201
+
header: {
202
+
display: 'flex',
203
+
alignItems: 'center',
204
+
justifyContent: 'space-between',
205
+
padding: '14px 18px',
206
+
fontSize: 14,
207
+
fontWeight: 500,
208
+
borderBottom: '1px solid transparent'
209
+
} satisfies React.CSSProperties,
210
+
headerInfo: {
211
+
display: 'flex',
212
+
alignItems: 'center',
213
+
gap: 12
214
+
} satisfies React.CSSProperties,
215
+
headerIcon: {
216
+
width: 28,
217
+
height: 28,
218
+
display: 'flex',
219
+
alignItems: 'center',
220
+
justifyContent: 'center',
221
+
//background: 'rgba(17, 133, 254, 0.14)',
222
+
borderRadius: '50%'
223
+
} satisfies React.CSSProperties,
224
+
headerText: {
225
+
display: 'flex',
226
+
flexDirection: 'column',
227
+
gap: 2
228
+
} satisfies React.CSSProperties,
229
+
title: {
230
+
fontSize: 15,
231
+
fontWeight: 600
232
+
} satisfies React.CSSProperties,
233
+
subtitle: {
234
+
fontSize: 12,
235
+
fontWeight: 500
236
+
} satisfies React.CSSProperties,
237
+
pageMeta: {
238
+
fontSize: 12
239
+
} satisfies React.CSSProperties,
240
+
items: {
241
+
display: 'flex',
242
+
flexDirection: 'column'
243
+
} satisfies React.CSSProperties,
244
+
empty: {
245
+
padding: '24px 18px',
246
+
fontSize: 13,
247
+
textAlign: 'center'
248
+
} satisfies React.CSSProperties,
249
+
row: {
250
+
padding: '18px',
251
+
textDecoration: 'none',
252
+
display: 'flex',
253
+
flexDirection: 'column',
254
+
gap: 6,
255
+
transition: 'background-color 120ms ease'
256
+
} satisfies React.CSSProperties,
257
+
rowHeader: {
258
+
display: 'flex',
259
+
gap: 6,
260
+
alignItems: 'baseline',
261
+
fontSize: 13
262
+
} satisfies React.CSSProperties,
263
+
rowTime: {
264
+
fontSize: 12,
265
+
fontWeight: 500
266
+
} satisfies React.CSSProperties,
267
+
rowBody: {
268
+
margin: 0,
269
+
whiteSpace: 'pre-wrap',
270
+
fontSize: 14,
271
+
lineHeight: 1.45
272
+
} satisfies React.CSSProperties,
273
+
footer: {
274
+
display: 'flex',
275
+
alignItems: 'center',
276
+
justifyContent: 'space-between',
277
+
padding: '12px 18px',
278
+
borderTop: '1px solid transparent',
279
+
fontSize: 13
280
+
} satisfies React.CSSProperties,
281
+
navButton: {
282
+
border: 'none',
283
+
borderRadius: 999,
284
+
padding: '6px 12px',
285
+
fontSize: 13,
286
+
fontWeight: 500,
287
+
background: 'transparent',
288
+
display: 'flex',
289
+
alignItems: 'center',
290
+
gap: 4,
291
+
transition: 'background-color 120ms ease'
292
+
} satisfies React.CSSProperties,
293
+
pageChips: {
294
+
display: 'flex',
295
+
gap: 6,
296
+
alignItems: 'center'
297
+
} satisfies React.CSSProperties,
298
+
pageChip: {
299
+
padding: '4px 10px',
300
+
borderRadius: 999,
301
+
fontSize: 13,
302
+
border: '1px solid transparent'
303
+
} satisfies React.CSSProperties,
304
+
pageChipActive: {
305
+
padding: '4px 10px',
306
+
borderRadius: 999,
307
+
fontSize: 13,
308
+
fontWeight: 600,
309
+
border: '1px solid transparent'
310
+
} satisfies React.CSSProperties,
311
+
loadingBar: {
312
+
padding: '4px 18px 14px',
313
+
fontSize: 12,
314
+
textAlign: 'right',
315
+
color: '#64748b'
316
+
} satisfies React.CSSProperties
317
+
};
318
+
319
+
const lightPalette: ListPalette = {
320
+
card: {
321
+
background: '#ffffff',
322
+
borderColor: '#e2e8f0'
323
+
},
324
+
header: {
325
+
borderBottomColor: '#e2e8f0',
326
+
color: '#0f172a'
327
+
},
328
+
pageMeta: {
329
+
color: '#64748b'
330
+
},
331
+
subtitle: {
332
+
color: '#475569'
333
+
},
334
+
empty: {
335
+
color: '#64748b'
336
+
},
337
+
row: {
338
+
color: '#0f172a'
339
+
},
340
+
rowTime: {
341
+
color: '#94a3b8'
342
+
},
343
+
rowBody: {
344
+
color: '#0f172a'
345
+
},
346
+
divider: '#e2e8f0',
347
+
footer: {
348
+
borderTopColor: '#e2e8f0',
349
+
color: '#0f172a'
350
+
},
351
+
navButton: {
352
+
color: '#0f172a',
353
+
background: '#f1f5f9'
354
+
},
355
+
pageChip: {
356
+
color: '#475569',
357
+
borderColor: '#e2e8f0',
358
+
background: '#ffffff'
359
+
},
360
+
pageChipActive: {
361
+
color: '#ffffff',
362
+
background: '#0f172a',
363
+
borderColor: '#0f172a'
364
+
},
365
+
loadingBar: {
366
+
color: '#64748b'
367
+
}
368
+
};
369
+
370
+
const darkPalette: ListPalette = {
371
+
card: {
372
+
background: '#0f172a',
373
+
borderColor: '#1e293b'
374
+
},
375
+
header: {
376
+
borderBottomColor: '#1e293b',
377
+
color: '#e2e8f0'
378
+
},
379
+
pageMeta: {
380
+
color: '#94a3b8'
381
+
},
382
+
subtitle: {
383
+
color: '#94a3b8'
384
+
},
385
+
empty: {
386
+
color: '#94a3b8'
387
+
},
388
+
row: {
389
+
color: '#e2e8f0'
390
+
},
391
+
rowTime: {
392
+
color: '#94a3b8'
393
+
},
394
+
rowBody: {
395
+
color: '#e2e8f0'
396
+
},
397
+
divider: '#1e293b',
398
+
footer: {
399
+
borderTopColor: '#1e293b',
400
+
color: '#e2e8f0'
401
+
},
402
+
navButton: {
403
+
color: '#e2e8f0',
404
+
background: '#111c31'
405
+
},
406
+
pageChip: {
407
+
color: '#cbd5f5',
408
+
borderColor: '#1e293b',
409
+
background: '#0f172a'
410
+
},
411
+
pageChipActive: {
412
+
color: '#0f172a',
413
+
background: '#38bdf8',
414
+
borderColor: '#38bdf8'
415
+
},
416
+
loadingBar: {
417
+
color: '#94a3b8'
418
+
}
419
+
};
420
+
421
+
export default BlueskyPostList;
+112
lib/components/BlueskyProfile.tsx
+112
lib/components/BlueskyProfile.tsx
···
1
+
import React from 'react';
2
+
import { AtProtoRecord } from '../core/AtProtoRecord';
3
+
import { BlueskyProfileRenderer } from '../renderers/BlueskyProfileRenderer';
4
+
import type { ProfileRecord } from '../types/bluesky';
5
+
import { useBlob } from '../hooks/useBlob';
6
+
import { getAvatarCid } from '../utils/profile';
7
+
8
+
/**
9
+
* Props used to render a Bluesky actor profile record.
10
+
*/
11
+
export interface BlueskyProfileProps {
12
+
/**
13
+
* DID of the target actor whose profile should be loaded.
14
+
*/
15
+
did: string;
16
+
/**
17
+
* Record key within the profile collection. Typically `'self'`.
18
+
*/
19
+
rkey?: string;
20
+
/**
21
+
* Optional renderer override for custom presentation.
22
+
*/
23
+
renderer?: React.ComponentType<BlueskyProfileRendererInjectedProps>;
24
+
/**
25
+
* Fallback node shown before a request begins yielding data.
26
+
*/
27
+
fallback?: React.ReactNode;
28
+
/**
29
+
* Loading indicator shown during in-flight fetches.
30
+
*/
31
+
loadingIndicator?: React.ReactNode;
32
+
/**
33
+
* Pre-resolved handle to display when available externally.
34
+
*/
35
+
handle?: string;
36
+
/**
37
+
* Preferred color scheme forwarded to renderer implementations.
38
+
*/
39
+
colorScheme?: 'light' | 'dark' | 'system';
40
+
}
41
+
42
+
/**
43
+
* Props injected into custom profile renderer implementations.
44
+
*/
45
+
export type BlueskyProfileRendererInjectedProps = {
46
+
/**
47
+
* Loaded profile record value.
48
+
*/
49
+
record: ProfileRecord;
50
+
/**
51
+
* Indicates whether the record is currently being fetched.
52
+
*/
53
+
loading: boolean;
54
+
/**
55
+
* Any error encountered while fetching the profile.
56
+
*/
57
+
error?: Error;
58
+
/**
59
+
* DID associated with the profile.
60
+
*/
61
+
did: string;
62
+
/**
63
+
* Human-readable handle for the DID, when known.
64
+
*/
65
+
handle?: string;
66
+
/**
67
+
* Blob URL for the user's avatar, when available.
68
+
*/
69
+
avatarUrl?: string;
70
+
/**
71
+
* Preferred color scheme for theming downstream components.
72
+
*/
73
+
colorScheme?: 'light' | 'dark' | 'system';
74
+
};
75
+
76
+
/** NSID for the canonical Bluesky profile collection. */
77
+
export const BLUESKY_PROFILE_COLLECTION = 'app.bsky.actor.profile';
78
+
79
+
/**
80
+
* Fetches and renders a Bluesky actor profile, optionally injecting custom presentation
81
+
* and providing avatar resolution support.
82
+
*
83
+
* @param did - DID whose profile record should be fetched.
84
+
* @param rkey - Record key within the profile collection (default `'self'`).
85
+
* @param renderer - Optional component override for custom rendering.
86
+
* @param fallback - Node rendered prior to loading state initialization.
87
+
* @param loadingIndicator - Node rendered while the profile request is in-flight.
88
+
* @param handle - Optional pre-resolved handle to display.
89
+
* @param colorScheme - Preferred color scheme forwarded to the renderer.
90
+
* @returns A rendered profile component with loading/error states handled.
91
+
*/
92
+
export const BlueskyProfile: React.FC<BlueskyProfileProps> = ({ did, rkey = 'self', renderer, fallback, loadingIndicator, handle, colorScheme }) => {
93
+
const Component: React.ComponentType<BlueskyProfileRendererInjectedProps> = renderer ?? ((props) => <BlueskyProfileRenderer {...props} />);
94
+
95
+
const Wrapped: React.FC<{ record: ProfileRecord; loading: boolean; error?: Error }> = (props) => {
96
+
const avatarCid = getAvatarCid(props.record);
97
+
const { url: avatarUrl } = useBlob(did, avatarCid);
98
+
return <Component {...props} did={did} handle={handle} avatarUrl={avatarUrl} colorScheme={colorScheme} />;
99
+
};
100
+
return (
101
+
<AtProtoRecord<ProfileRecord>
102
+
did={did}
103
+
collection={BLUESKY_PROFILE_COLLECTION}
104
+
rkey={rkey}
105
+
renderer={Wrapped}
106
+
fallback={fallback}
107
+
loadingIndicator={loadingIndicator}
108
+
/>
109
+
);
110
+
};
111
+
112
+
export default BlueskyProfile;
+110
lib/components/BlueskyQuotePost.tsx
+110
lib/components/BlueskyQuotePost.tsx
···
1
+
import React, { useMemo } from 'react';
2
+
import { BlueskyPost, type BlueskyPostRendererInjectedProps, BLUESKY_POST_COLLECTION } from './BlueskyPost';
3
+
import { BlueskyPostRenderer } from '../renderers/BlueskyPostRenderer';
4
+
import type { FeedPostRecord } from '../types/bluesky';
5
+
import { parseAtUri } from '../utils/at-uri';
6
+
7
+
/**
8
+
* Props for rendering a Bluesky post that quotes another Bluesky post.
9
+
*/
10
+
export interface BlueskyQuotePostProps {
11
+
/**
12
+
* DID of the repository that owns the parent post.
13
+
*/
14
+
did: string;
15
+
/**
16
+
* Record key of the parent post.
17
+
*/
18
+
rkey: string;
19
+
/**
20
+
* Preferred color scheme propagated to nested renders.
21
+
*/
22
+
colorScheme?: 'light' | 'dark' | 'system';
23
+
/**
24
+
* Custom renderer override applied to the parent post.
25
+
*/
26
+
renderer?: React.ComponentType<BlueskyPostRendererInjectedProps>;
27
+
/**
28
+
* Fallback content rendered before any request completes.
29
+
*/
30
+
fallback?: React.ReactNode;
31
+
/**
32
+
* Loading indicator rendered while the parent post is resolving.
33
+
*/
34
+
loadingIndicator?: React.ReactNode;
35
+
/**
36
+
* Controls whether the Bluesky icon is shown. Defaults to `true`.
37
+
*/
38
+
showIcon?: boolean;
39
+
/**
40
+
* Placement for the Bluesky icon. Defaults to `'timestamp'`.
41
+
*/
42
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
43
+
}
44
+
45
+
/**
46
+
* Renders a Bluesky post while embedding its quoted post inline via a nested `BlueskyPost`.
47
+
*
48
+
* @param did - DID that owns the quoted parent post.
49
+
* @param rkey - Record key identifying the parent post.
50
+
* @param colorScheme - Preferred color scheme for both parent and quoted posts.
51
+
* @param renderer - Optional renderer override applied to the parent post.
52
+
* @param fallback - Node rendered before parent post data loads.
53
+
* @param loadingIndicator - Node rendered while the parent post request is in-flight.
54
+
* @param showIcon - Controls whether the Bluesky icon renders. Defaults to `true`.
55
+
* @param iconPlacement - Placement location for the icon. Defaults to `'timestamp'`.
56
+
* @returns A `BlueskyPost` element configured with an augmented renderer.
57
+
*/
58
+
export const BlueskyQuotePost: React.FC<BlueskyQuotePostProps> = ({ did, rkey, colorScheme, renderer, fallback, loadingIndicator, showIcon = true, iconPlacement = 'timestamp' }) => {
59
+
const BaseRenderer = renderer ?? BlueskyPostRenderer;
60
+
const Renderer = useMemo(() => {
61
+
const QuoteRenderer: React.FC<BlueskyPostRendererInjectedProps> = (props) => {
62
+
const embedNode = createQuoteEmbed(props.record, props.colorScheme ?? colorScheme);
63
+
return <BaseRenderer {...props} embed={embedNode} />;
64
+
};
65
+
QuoteRenderer.displayName = 'BlueskyQuotePostRenderer';
66
+
return QuoteRenderer;
67
+
}, [BaseRenderer, colorScheme]);
68
+
69
+
return (
70
+
<BlueskyPost
71
+
did={did}
72
+
rkey={rkey}
73
+
colorScheme={colorScheme}
74
+
renderer={Renderer}
75
+
fallback={fallback}
76
+
loadingIndicator={loadingIndicator}
77
+
showIcon={showIcon}
78
+
iconPlacement={iconPlacement}
79
+
/>
80
+
);
81
+
};
82
+
83
+
/**
84
+
* Builds the quoted post embed node when the parent record contains a record embed.
85
+
*
86
+
* @param record - Feed post containing a possible quote reference.
87
+
* @param colorScheme - Desired visual theme for the nested quote.
88
+
* @returns A nested `BlueskyPost` or `null` if no compatible embed exists.
89
+
*/
90
+
function createQuoteEmbed(record: FeedPostRecord, colorScheme?: 'light' | 'dark' | 'system') {
91
+
const embed = record.embed as { $type?: string; record?: { uri?: string } } | undefined;
92
+
if (!embed || embed.$type !== 'app.bsky.embed.record') return null;
93
+
const quoted = embed.record;
94
+
const quotedUri = quoted?.uri;
95
+
const parsed = parseAtUri(quotedUri);
96
+
if (!parsed || parsed.collection !== BLUESKY_POST_COLLECTION) return null;
97
+
return (
98
+
<div style={quoteWrapperStyle}>
99
+
<BlueskyPost did={parsed.did} rkey={parsed.rkey} colorScheme={colorScheme} showIcon={false} />
100
+
</div>
101
+
);
102
+
}
103
+
104
+
const quoteWrapperStyle: React.CSSProperties = {
105
+
display: 'flex',
106
+
flexDirection: 'column',
107
+
gap: 8
108
+
};
109
+
110
+
export default BlueskyQuotePost;
+116
lib/components/ColorSchemeToggle.tsx
+116
lib/components/ColorSchemeToggle.tsx
···
1
+
import React from 'react';
2
+
import type { ColorSchemePreference } from '../hooks/useColorScheme';
3
+
4
+
/**
5
+
* Props for the `ColorSchemeToggle` segmented control.
6
+
*/
7
+
export interface ColorSchemeToggleProps {
8
+
/**
9
+
* Current color scheme preference selection.
10
+
*/
11
+
value: ColorSchemePreference;
12
+
/**
13
+
* Change handler invoked when the user selects a new scheme.
14
+
*/
15
+
onChange: (value: ColorSchemePreference) => void;
16
+
/**
17
+
* Theme used to style the control itself; defaults to `'light'`.
18
+
*/
19
+
scheme?: 'light' | 'dark';
20
+
}
21
+
22
+
const options: Array<{ label: string; value: ColorSchemePreference; description: string }> = [
23
+
{ label: 'System', value: 'system', description: 'Follow OS preference' },
24
+
{ label: 'Light', value: 'light', description: 'Always light mode' },
25
+
{ label: 'Dark', value: 'dark', description: 'Always dark mode' }
26
+
];
27
+
28
+
/**
29
+
* A button group that lets users choose between light, dark, or system color modes.
30
+
*
31
+
* @param value - Current scheme selection displayed as active.
32
+
* @param onChange - Callback fired when a new option is selected.
33
+
* @param scheme - Theme used to style the control itself. Defaults to `'light'`.
34
+
* @returns A fully keyboard-accessible toggle rendered as a radio group.
35
+
*/
36
+
export const ColorSchemeToggle: React.FC<ColorSchemeToggleProps> = ({ value, onChange, scheme = 'light' }) => {
37
+
const palette = scheme === 'dark' ? darkTheme : lightTheme;
38
+
39
+
return (
40
+
<div aria-label="Color scheme" role="radiogroup" style={{ ...containerStyle, ...palette.container }}>
41
+
{options.map(option => {
42
+
const isActive = option.value === value;
43
+
const activeStyles = isActive ? palette.active : undefined;
44
+
return (
45
+
<button
46
+
key={option.value}
47
+
role="radio"
48
+
aria-checked={isActive}
49
+
type="button"
50
+
onClick={() => onChange(option.value)}
51
+
style={{
52
+
...buttonStyle,
53
+
...palette.button,
54
+
...(activeStyles ?? {})
55
+
}}
56
+
title={option.description}
57
+
>
58
+
{option.label}
59
+
</button>
60
+
);
61
+
})}
62
+
</div>
63
+
);
64
+
};
65
+
66
+
const containerStyle: React.CSSProperties = {
67
+
display: 'inline-flex',
68
+
borderRadius: 999,
69
+
padding: 4,
70
+
gap: 4,
71
+
border: '1px solid transparent',
72
+
background: '#f8fafc'
73
+
};
74
+
75
+
const buttonStyle: React.CSSProperties = {
76
+
border: '1px solid transparent',
77
+
borderRadius: 999,
78
+
padding: '4px 12px',
79
+
fontSize: 12,
80
+
fontWeight: 500,
81
+
cursor: 'pointer',
82
+
background: 'transparent',
83
+
transition: 'background-color 160ms ease, border-color 160ms ease, color 160ms ease'
84
+
};
85
+
86
+
const lightTheme = {
87
+
container: {
88
+
borderColor: '#e2e8f0',
89
+
background: 'rgba(241, 245, 249, 0.8)'
90
+
},
91
+
button: {
92
+
color: '#334155'
93
+
},
94
+
active: {
95
+
background: '#2563eb',
96
+
borderColor: '#2563eb',
97
+
color: '#f8fafc'
98
+
}
99
+
} satisfies Record<string, React.CSSProperties>;
100
+
101
+
const darkTheme = {
102
+
container: {
103
+
borderColor: '#2e3540ff',
104
+
background: 'rgba(30, 38, 49, 0.6)'
105
+
},
106
+
button: {
107
+
color: '#e2e8f0'
108
+
},
109
+
active: {
110
+
background: '#38bdf8',
111
+
borderColor: '#38bdf8',
112
+
color: '#020617'
113
+
}
114
+
} satisfies Record<string, React.CSSProperties>;
115
+
116
+
export default ColorSchemeToggle;
+117
lib/components/LeafletDocument.tsx
+117
lib/components/LeafletDocument.tsx
···
1
+
import React, { useMemo } from 'react';
2
+
import { AtProtoRecord } from '../core/AtProtoRecord';
3
+
import { LeafletDocumentRenderer, type LeafletDocumentRendererProps } from '../renderers/LeafletDocumentRenderer';
4
+
import type { LeafletDocumentRecord, LeafletPublicationRecord } from '../types/leaflet';
5
+
import type { ColorSchemePreference } from '../hooks/useColorScheme';
6
+
import { parseAtUri, toBlueskyPostUrl, leafletRkeyUrl, normalizeLeafletBasePath } from '../utils/at-uri';
7
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
8
+
9
+
/**
10
+
* Props for rendering a Leaflet document record.
11
+
*/
12
+
export interface LeafletDocumentProps {
13
+
/**
14
+
* DID of the Leaflet publisher.
15
+
*/
16
+
did: string;
17
+
/**
18
+
* Record key of the document within the Leaflet collection.
19
+
*/
20
+
rkey: string;
21
+
/**
22
+
* Optional custom renderer for advanced layouts.
23
+
*/
24
+
renderer?: React.ComponentType<LeafletDocumentRendererInjectedProps>;
25
+
/**
26
+
* React node rendered before data begins loading.
27
+
*/
28
+
fallback?: React.ReactNode;
29
+
/**
30
+
* Indicator rendered while data is being fetched from the PDS.
31
+
*/
32
+
loadingIndicator?: React.ReactNode;
33
+
/**
34
+
* Preferred color scheme to forward to the renderer.
35
+
*/
36
+
colorScheme?: ColorSchemePreference;
37
+
}
38
+
39
+
/**
40
+
* Props provided to renderer overrides for Leaflet documents.
41
+
*/
42
+
export type LeafletDocumentRendererInjectedProps = LeafletDocumentRendererProps;
43
+
44
+
/** NSID for Leaflet document records. */
45
+
export const LEAFLET_DOCUMENT_COLLECTION = 'pub.leaflet.document';
46
+
47
+
/**
48
+
* Loads a Leaflet document along with its associated publication record and renders it
49
+
* using the provided or default renderer.
50
+
*
51
+
* @param did - DID of the Leaflet publisher.
52
+
* @param rkey - Record key of the Leaflet document.
53
+
* @param renderer - Optional renderer override used in place of the default.
54
+
* @param fallback - Node rendered before loading begins.
55
+
* @param loadingIndicator - Node rendered while the document or publication records are loading.
56
+
* @param colorScheme - Preferred color scheme forwarded to the renderer.
57
+
* @returns A JSX subtree that renders a Leaflet document with contextual metadata.
58
+
*/
59
+
export const LeafletDocument: React.FC<LeafletDocumentProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme }) => {
60
+
const Comp: React.ComponentType<LeafletDocumentRendererInjectedProps> = renderer ?? ((props) => <LeafletDocumentRenderer {...props} />);
61
+
62
+
const Wrapped: React.FC<{ record: LeafletDocumentRecord; loading: boolean; error?: Error }> = (props) => {
63
+
const publicationUri = useMemo(() => parseAtUri(props.record.publication), [props.record.publication]);
64
+
const { record: publicationRecord } = useAtProtoRecord<LeafletPublicationRecord>({
65
+
did: publicationUri?.did,
66
+
collection: publicationUri?.collection ?? 'pub.leaflet.publication',
67
+
rkey: publicationUri?.rkey ?? ''
68
+
});
69
+
const publicationBaseUrl = normalizeLeafletBasePath(publicationRecord?.base_path);
70
+
const canonicalUrl = resolveCanonicalUrl(props.record, did, rkey, publicationRecord?.base_path);
71
+
return (
72
+
<Comp
73
+
{...props}
74
+
colorScheme={colorScheme}
75
+
did={did}
76
+
rkey={rkey}
77
+
canonicalUrl={canonicalUrl}
78
+
publicationBaseUrl={publicationBaseUrl}
79
+
publicationRecord={publicationRecord}
80
+
/>
81
+
);
82
+
};
83
+
84
+
return (
85
+
<AtProtoRecord<LeafletDocumentRecord>
86
+
did={did}
87
+
collection={LEAFLET_DOCUMENT_COLLECTION}
88
+
rkey={rkey}
89
+
renderer={Wrapped}
90
+
fallback={fallback}
91
+
loadingIndicator={loadingIndicator}
92
+
/>
93
+
);
94
+
};
95
+
96
+
/**
97
+
* Determines the best canonical URL to expose for a Leaflet document.
98
+
*
99
+
* @param record - Leaflet document record under review.
100
+
* @param did - Publisher DID.
101
+
* @param rkey - Record key for the document.
102
+
* @param publicationBasePath - Optional base path configured by the publication.
103
+
* @returns A URL to use for canonical links.
104
+
*/
105
+
function resolveCanonicalUrl(record: LeafletDocumentRecord, did: string, rkey: string, publicationBasePath?: string): string {
106
+
const publicationUrl = leafletRkeyUrl(publicationBasePath, rkey);
107
+
if (publicationUrl) return publicationUrl;
108
+
const postUri = record.postRef?.uri;
109
+
if (postUri) {
110
+
const parsed = parseAtUri(postUri);
111
+
const href = parsed ? toBlueskyPostUrl(parsed) : undefined;
112
+
if (href) return href;
113
+
}
114
+
return `https://bsky.app/leaflet/${encodeURIComponent(did)}/${encodeURIComponent(rkey)}`;
115
+
}
116
+
117
+
export default LeafletDocument;
+81
lib/components/TangledString.tsx
+81
lib/components/TangledString.tsx
···
1
+
import React from 'react';
2
+
import { AtProtoRecord } from '../core/AtProtoRecord';
3
+
import { TangledStringRenderer } from '../renderers/TangledStringRenderer';
4
+
import type { TangledStringRecord } from '../renderers/TangledStringRenderer';
5
+
6
+
/**
7
+
* Props for rendering Tangled String records.
8
+
*/
9
+
export interface TangledStringProps {
10
+
/** DID of the repository that stores the string record. */
11
+
did: string;
12
+
/** Record key within the `sh.tangled.string` collection. */
13
+
rkey: string;
14
+
/** Optional renderer override for custom presentation. */
15
+
renderer?: React.ComponentType<TangledStringRendererInjectedProps>;
16
+
/** Fallback node displayed before loading begins. */
17
+
fallback?: React.ReactNode;
18
+
/** Indicator node shown while data is loading. */
19
+
loadingIndicator?: React.ReactNode;
20
+
/** Preferred color scheme for theming. */
21
+
colorScheme?: 'light' | 'dark' | 'system';
22
+
}
23
+
24
+
/**
25
+
* Values injected into custom Tangled String renderer implementations.
26
+
*/
27
+
export type TangledStringRendererInjectedProps = {
28
+
/** Loaded Tangled String record value. */
29
+
record: TangledStringRecord;
30
+
/** Indicates whether the record is currently loading. */
31
+
loading: boolean;
32
+
/** Fetch error, if any. */
33
+
error?: Error;
34
+
/** Preferred color scheme for downstream components. */
35
+
colorScheme?: 'light' | 'dark' | 'system';
36
+
/** DID associated with the record. */
37
+
did: string;
38
+
/** Record key for the string. */
39
+
rkey: string;
40
+
/** Canonical external URL for linking to the string. */
41
+
canonicalUrl: string;
42
+
};
43
+
44
+
/** NSID for Tangled String records. */
45
+
export const TANGLED_COLLECTION = 'sh.tangled.string';
46
+
47
+
/**
48
+
* Resolves a Tangled String record and renders it with optional overrides while computing a canonical link.
49
+
*
50
+
* @param did - DID whose Tangled String should be fetched.
51
+
* @param rkey - Record key within the Tangled String collection.
52
+
* @param renderer - Optional component override that will receive injected props.
53
+
* @param fallback - Node rendered before the first load begins.
54
+
* @param loadingIndicator - Node rendered while the Tangled String is loading.
55
+
* @param colorScheme - Preferred color scheme for theming the renderer.
56
+
* @returns A JSX subtree representing the Tangled String record with loading states handled.
57
+
*/
58
+
export const TangledString: React.FC<TangledStringProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme }) => {
59
+
const Comp: React.ComponentType<TangledStringRendererInjectedProps> = renderer ?? ((props) => <TangledStringRenderer {...props} />);
60
+
const Wrapped: React.FC<{ record: TangledStringRecord; loading: boolean; error?: Error }> = (props) => (
61
+
<Comp
62
+
{...props}
63
+
colorScheme={colorScheme}
64
+
did={did}
65
+
rkey={rkey}
66
+
canonicalUrl={`https://tangled.org/strings/${did}/${encodeURIComponent(rkey)}`}
67
+
/>
68
+
);
69
+
return (
70
+
<AtProtoRecord<TangledStringRecord>
71
+
did={did}
72
+
collection={TANGLED_COLLECTION}
73
+
rkey={rkey}
74
+
renderer={Wrapped}
75
+
fallback={fallback}
76
+
loadingIndicator={loadingIndicator}
77
+
/>
78
+
);
79
+
};
80
+
81
+
export default TangledString;
+25
lib/core/AtProtoRecord.tsx
+25
lib/core/AtProtoRecord.tsx
···
1
+
import React from 'react';
2
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
3
+
import { useDidResolution } from '../hooks/useDidResolution';
4
+
5
+
export interface AtProtoRecordProps<T = unknown> {
6
+
did: string;
7
+
collection: string;
8
+
rkey: string;
9
+
renderer?: React.ComponentType<{ record: T; loading: boolean; error?: Error }>;
10
+
fallback?: React.ReactNode;
11
+
loadingIndicator?: React.ReactNode;
12
+
}
13
+
14
+
export function AtProtoRecord<T = unknown>({ did: handleOrDid, collection, rkey, renderer: Renderer, fallback = null, loadingIndicator = 'Loading…' }: AtProtoRecordProps<T>) {
15
+
const { did, error: resolutionError, loading: resolving } = useDidResolution(handleOrDid);
16
+
const { record, error: recordError, loading: recordLoading } = useAtProtoRecord<T>({ did, collection, rkey });
17
+
18
+
const loading = resolving || recordLoading;
19
+
const error = resolutionError || recordError;
20
+
21
+
if (error) return <>{fallback}</>;
22
+
if (!record) return <>{loading ? loadingIndicator : fallback}</>;
23
+
if (Renderer) return <Renderer record={record} loading={loading} error={error} />;
24
+
return <pre style={{ fontSize: 12, padding: 8, background: '#f5f5f5', overflow: 'auto' }}>{JSON.stringify(record, null, 2)}</pre>;
25
+
}
+65
lib/hooks/useAtProtoRecord.ts
+65
lib/hooks/useAtProtoRecord.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { usePdsEndpoint } from './usePdsEndpoint';
3
+
import { createAtprotoClient } from '../utils/atproto-client';
4
+
5
+
/**
6
+
* Identifier trio required to address an AT Protocol record.
7
+
*/
8
+
export interface AtProtoRecordKey {
9
+
/** Repository DID (or handle prior to resolution) containing the record. */
10
+
did?: string;
11
+
/** NSID collection in which the record resides. */
12
+
collection: string;
13
+
/** Record key string uniquely identifying the record within the collection. */
14
+
rkey: string;
15
+
}
16
+
17
+
/**
18
+
* Loading state returned by {@link useAtProtoRecord}.
19
+
*/
20
+
export interface AtProtoRecordState<T = unknown> {
21
+
/** Resolved record value when fetch succeeds. */
22
+
record?: T;
23
+
/** Error thrown while loading, if any. */
24
+
error?: Error;
25
+
/** Indicates whether the hook is in a loading state. */
26
+
loading: boolean;
27
+
}
28
+
29
+
/**
30
+
* React hook that fetches a single AT Protocol record and tracks loading/error state.
31
+
*
32
+
* @param did - DID (or handle before resolution) that owns the record.
33
+
* @param collection - NSID collection from which to fetch the record.
34
+
* @param rkey - Record key identifying the record within the collection.
35
+
* @returns {AtProtoRecordState<T>} Object containing the resolved record, any error, and a loading flag.
36
+
*/
37
+
export function useAtProtoRecord<T = unknown>({ did, collection, rkey }: AtProtoRecordKey): AtProtoRecordState<T> {
38
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
39
+
const [state, setState] = useState<AtProtoRecordState<T>>({ loading: !!did });
40
+
41
+
useEffect(() => {
42
+
let cancelled = false;
43
+
async function load() {
44
+
if (!did || !endpoint) return;
45
+
setState(s => ({ ...s, loading: true }));
46
+
try {
47
+
const { rpc } = await createAtprotoClient({ service: endpoint });
48
+
// Type of getRecord lexicon not available in generic Client here, so cast through unknown.
49
+
const res = await (rpc as unknown as { get: (nsid: string, opts: { params: { repo: string; collection: string; rkey: string } }) => Promise<{ ok: boolean; data: { value: T } }> }).get('com.atproto.repo.getRecord', {
50
+
params: { repo: did, collection, rkey }
51
+
});
52
+
if (!res.ok) throw new Error('Failed to load record');
53
+
const record = (res.data as { value: T }).value;
54
+
if (!cancelled) setState({ record, loading: false });
55
+
} catch (e) {
56
+
if (!cancelled) setState({ error: e as Error, loading: false });
57
+
}
58
+
}
59
+
load();
60
+
return () => { cancelled = true; };
61
+
}, [did, endpoint, collection, rkey]);
62
+
63
+
if (endpointError && !state.error) return { ...state, error: endpointError };
64
+
return state;
65
+
}
+51
lib/hooks/useBlob.ts
+51
lib/hooks/useBlob.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { usePdsEndpoint } from './usePdsEndpoint';
3
+
4
+
/**
5
+
* Status returned by {@link useBlob} containing blob URL and metadata flags.
6
+
*/
7
+
export interface UseBlobState {
8
+
/** Object URL pointing to the fetched blob, when available. */
9
+
url?: string;
10
+
/** Indicates whether a fetch is in progress. */
11
+
loading: boolean;
12
+
/** Error encountered while fetching the blob. */
13
+
error?: Error;
14
+
}
15
+
16
+
/**
17
+
* Fetches a blob from the DID's PDS, exposes it as an object URL, and cleans up on unmount.
18
+
*
19
+
* @param did - DID whose PDS hosts the blob.
20
+
* @param cid - Content identifier for the desired blob.
21
+
* @returns {UseBlobState} Object containing the object URL, loading flag, and any error.
22
+
*/
23
+
export function useBlob(did: string | undefined, cid: string | undefined): UseBlobState {
24
+
const { endpoint } = usePdsEndpoint(did);
25
+
const [state, setState] = useState<UseBlobState>({ loading: !!(did && cid) });
26
+
27
+
useEffect(() => {
28
+
let cancelled = false;
29
+
let objectUrl: string | undefined;
30
+
async function run() {
31
+
if (!did || !cid || !endpoint) { setState({ loading: false }); return; }
32
+
setState(s => ({ ...s, loading: true }));
33
+
try {
34
+
const res = await fetch(`${endpoint}/xrpc/com.atproto.sync.getBlob?did=${encodeURIComponent(did)}&cid=${encodeURIComponent(cid)}`);
35
+
if (!res.ok) throw new Error('Blob fetch failed');
36
+
const blob = await res.blob();
37
+
objectUrl = URL.createObjectURL(blob);
38
+
if (!cancelled) setState({ url: objectUrl, loading: false });
39
+
} catch (e) {
40
+
if (!cancelled) setState({ error: e as Error, loading: false });
41
+
}
42
+
}
43
+
run();
44
+
return () => {
45
+
cancelled = true;
46
+
if (objectUrl) URL.revokeObjectURL(objectUrl);
47
+
};
48
+
}, [did, cid, endpoint]);
49
+
50
+
return state;
51
+
}
+61
lib/hooks/useBlueskyProfile.ts
+61
lib/hooks/useBlueskyProfile.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { usePdsEndpoint } from './usePdsEndpoint';
3
+
import { createAtprotoClient } from '../utils/atproto-client';
4
+
5
+
/**
6
+
* Minimal profile fields returned by the Bluesky actor profile endpoint.
7
+
*/
8
+
export interface BlueskyProfileData {
9
+
/** Actor DID. */
10
+
did: string;
11
+
/** Actor handle. */
12
+
handle: string;
13
+
/** Display name configured by the actor. */
14
+
displayName?: string;
15
+
/** Profile description/bio. */
16
+
description?: string;
17
+
/** Avatar blob (CID reference). */
18
+
avatar?: string;
19
+
/** Banner image blob (CID reference). */
20
+
banner?: string;
21
+
/** Creation timestamp for the profile. */
22
+
createdAt?: string;
23
+
}
24
+
25
+
/**
26
+
* Fetches a Bluesky actor profile for a DID and exposes loading/error state.
27
+
*
28
+
* @param did - Actor DID whose profile should be retrieved.
29
+
* @returns {{ data: BlueskyProfileData | undefined; loading: boolean; error: Error | undefined }} Object exposing the profile payload, loading flag, and any error.
30
+
*/
31
+
export function useBlueskyProfile(did: string | undefined) {
32
+
const { endpoint } = usePdsEndpoint(did);
33
+
const [data, setData] = useState<BlueskyProfileData | undefined>();
34
+
const [loading, setLoading] = useState<boolean>(!!did);
35
+
const [error, setError] = useState<Error | undefined>();
36
+
37
+
useEffect(() => {
38
+
let cancelled = false;
39
+
async function run() {
40
+
if (!did || !endpoint) return;
41
+
setLoading(true);
42
+
try {
43
+
const { rpc } = await createAtprotoClient({ service: endpoint });
44
+
const client = rpc as unknown as {
45
+
get: (nsid: string, options: { params: { actor: string } }) => Promise<{ ok: boolean; data: unknown }>;
46
+
};
47
+
const res = await client.get('app.bsky.actor.getProfile', { params: { actor: did } });
48
+
if (!res.ok) throw new Error('Profile request failed');
49
+
if (!cancelled) setData(res.data as BlueskyProfileData);
50
+
} catch (e) {
51
+
if (!cancelled) setError(e as Error);
52
+
} finally {
53
+
if (!cancelled) setLoading(false);
54
+
}
55
+
}
56
+
run();
57
+
return () => { cancelled = true; };
58
+
}, [did, endpoint]);
59
+
60
+
return { data, loading, error };
61
+
}
+56
lib/hooks/useColorScheme.ts
+56
lib/hooks/useColorScheme.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
3
+
/**
4
+
* Possible user-facing color scheme preferences.
5
+
*/
6
+
export type ColorSchemePreference = 'light' | 'dark' | 'system';
7
+
8
+
const MEDIA_QUERY = '(prefers-color-scheme: dark)';
9
+
10
+
/**
11
+
* Resolves a persisted preference into an explicit light/dark value.
12
+
*
13
+
* @param pref - Stored preference value (`light`, `dark`, or `system`).
14
+
* @returns Explicit light/dark scheme suitable for rendering.
15
+
*/
16
+
function resolveScheme(pref: ColorSchemePreference): 'light' | 'dark' {
17
+
if (pref === 'light' || pref === 'dark') return pref;
18
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
19
+
return 'light';
20
+
}
21
+
return window.matchMedia(MEDIA_QUERY).matches ? 'dark' : 'light';
22
+
}
23
+
24
+
/**
25
+
* React hook that returns the effective light/dark scheme, respecting system preferences.
26
+
*
27
+
* @param preference - User preference; defaults to following the OS setting.
28
+
* @returns {'light' | 'dark'} Explicit scheme that should be used for rendering.
29
+
*/
30
+
export function useColorScheme(preference: ColorSchemePreference = 'system'): 'light' | 'dark' {
31
+
const [scheme, setScheme] = useState<'light' | 'dark'>(() => resolveScheme(preference));
32
+
33
+
useEffect(() => {
34
+
if (preference === 'light' || preference === 'dark') {
35
+
setScheme(preference);
36
+
return;
37
+
}
38
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
39
+
setScheme('light');
40
+
return;
41
+
}
42
+
const media = window.matchMedia(MEDIA_QUERY);
43
+
const update = (event: MediaQueryListEvent | MediaQueryList) => {
44
+
setScheme(event.matches ? 'dark' : 'light');
45
+
};
46
+
update(media);
47
+
if (typeof media.addEventListener === 'function') {
48
+
media.addEventListener('change', update);
49
+
return () => media.removeEventListener('change', update);
50
+
}
51
+
media.addListener(update);
52
+
return () => media.removeListener(update);
53
+
}, [preference]);
54
+
55
+
return scheme;
56
+
}
+41
lib/hooks/useDidHandle.ts
+41
lib/hooks/useDidHandle.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { useAtProto } from '../providers/AtProtoProvider';
3
+
4
+
/**
5
+
* Resolves a DID document and extracts the associated Bluesky handle from `alsoKnownAs`.
6
+
*
7
+
* @param did - DID to resolve.
8
+
* @returns {{ handle: string | undefined; loading: boolean }} Object containing the derived handle and a loading flag.
9
+
*/
10
+
export function useDidHandle(did: string | undefined) {
11
+
const { resolver } = useAtProto();
12
+
const [handle, setHandle] = useState<string | undefined>();
13
+
const [loading, setLoading] = useState<boolean>(!!did);
14
+
15
+
useEffect(() => {
16
+
let cancelled = false;
17
+
if (!did) {
18
+
setHandle(undefined);
19
+
setLoading(false);
20
+
return () => { cancelled = true; };
21
+
}
22
+
setLoading(true);
23
+
const input = did;
24
+
async function run() {
25
+
try {
26
+
const doc = await resolver.resolveDidDoc(input);
27
+
const aka = doc.alsoKnownAs?.find(a => a.startsWith('at://'));
28
+
const extracted = aka ? aka.replace('at://', '') : undefined;
29
+
if (!cancelled) setHandle(extracted);
30
+
} catch {
31
+
if (!cancelled) setHandle(undefined);
32
+
} finally {
33
+
if (!cancelled) setLoading(false);
34
+
}
35
+
}
36
+
run();
37
+
return () => { cancelled = true; };
38
+
}, [did, resolver]);
39
+
40
+
return { handle, loading };
41
+
}
+46
lib/hooks/useDidResolution.ts
+46
lib/hooks/useDidResolution.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { useAtProto } from '../providers/AtProtoProvider';
3
+
4
+
/**
5
+
* Resolves a handle to its DID, or returns the DID immediately when provided.
6
+
*
7
+
* @param handleOrDid - Bluesky handle or DID string.
8
+
* @returns {{ did: string | undefined; error: Error | undefined; loading: boolean }} Object containing the resolved DID, error (if any), and loading state.
9
+
*/
10
+
export function useDidResolution(handleOrDid: string | undefined) {
11
+
const { resolver } = useAtProto();
12
+
const [did, setDid] = useState<string | undefined>();
13
+
const [error, setError] = useState<Error | undefined>();
14
+
const [loading, setLoading] = useState(false);
15
+
16
+
useEffect(() => {
17
+
let cancelled = false;
18
+
if (!handleOrDid) {
19
+
setDid(undefined);
20
+
setLoading(false);
21
+
return () => { cancelled = true; };
22
+
}
23
+
setLoading(true);
24
+
setError(undefined);
25
+
const input = handleOrDid;
26
+
async function run() {
27
+
try {
28
+
if (input.startsWith('did:')) {
29
+
if (!cancelled) setDid(input);
30
+
} else {
31
+
const resolved = await resolver.resolveHandle(input);
32
+
if (!cancelled) setDid(resolved);
33
+
}
34
+
} catch (e) {
35
+
if (!cancelled) setError(e as Error);
36
+
if (!cancelled) setDid(undefined);
37
+
} finally {
38
+
if (!cancelled) setLoading(false);
39
+
}
40
+
}
41
+
run();
42
+
return () => { cancelled = true; };
43
+
}, [handleOrDid, resolver]);
44
+
45
+
return { did, error, loading };
46
+
}
+67
lib/hooks/useLatestRecord.ts
+67
lib/hooks/useLatestRecord.ts
···
1
+
import { usePdsEndpoint } from './usePdsEndpoint';
2
+
import { createAtprotoClient } from '../utils/atproto-client';
3
+
import { useEffect, useState } from 'react';
4
+
5
+
/**
6
+
* Shape of the state returned by {@link useLatestRecord}.
7
+
*/
8
+
export interface LatestRecordState<T = unknown> {
9
+
/** Latest record value if one exists. */
10
+
record?: T;
11
+
/** Record key for the fetched record, when derivable. */
12
+
rkey?: string;
13
+
/** Error encountered while fetching. */
14
+
error?: Error;
15
+
/** Indicates whether a fetch is in progress. */
16
+
loading: boolean;
17
+
/** `true` when the collection has zero records. */
18
+
empty: boolean;
19
+
}
20
+
21
+
/**
22
+
* Fetches the most recent record from a collection using `listRecords(limit=1)`.
23
+
*
24
+
* @param did - DID that owns the collection.
25
+
* @param collection - NSID of the collection to query.
26
+
* @returns {LatestRecordState<T>} Object reporting the latest record value, derived rkey, loading status, emptiness, and any error.
27
+
*/
28
+
export function useLatestRecord<T = unknown>(did: string | undefined, collection: string): LatestRecordState<T> {
29
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
30
+
const [state, setState] = useState<LatestRecordState<T>>({ loading: !!did, empty: false });
31
+
// simple one-shot fetch; no refresh logic
32
+
33
+
useEffect(() => {
34
+
let cancelled = false;
35
+
async function run() {
36
+
if (!did || !endpoint) return;
37
+
setState(s => ({ ...s, loading: true }));
38
+
try {
39
+
const { rpc } = await createAtprotoClient({ service: endpoint });
40
+
const res = await (rpc as unknown as { get: (nsid: string, opts: { params: Record<string, string | number | boolean> }) => Promise<{ ok: boolean; data: { records: Array<{ uri: string; rkey?: string; value: T }> } }> }).get('com.atproto.repo.listRecords', {
41
+
params: { repo: did, collection, limit: 1, reverse: false }
42
+
});
43
+
if (!res.ok) throw new Error('Failed to list records');
44
+
const list = res.data.records;
45
+
if (list.length === 0) {
46
+
if (!cancelled) setState({ loading: false, empty: true });
47
+
return;
48
+
}
49
+
const first = list[0];
50
+
// derive rkey if not present
51
+
let rkey = first.rkey;
52
+
if (!rkey && first.uri) {
53
+
const parts = first.uri.split('/');
54
+
rkey = parts[parts.length - 1];
55
+
}
56
+
if (!cancelled) setState({ record: first.value, rkey, loading: false, empty: false });
57
+
} catch (e) {
58
+
if (!cancelled) setState({ error: e as Error, loading: false, empty: false });
59
+
}
60
+
}
61
+
run();
62
+
return () => { cancelled = true; };
63
+
}, [did, endpoint, collection]);
64
+
65
+
if (endpointError && !state.error) return { ...state, error: endpointError };
66
+
return state;
67
+
}
+186
lib/hooks/usePaginatedRecords.ts
+186
lib/hooks/usePaginatedRecords.ts
···
1
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+
import { usePdsEndpoint } from './usePdsEndpoint';
3
+
import { createAtprotoClient } from '../utils/atproto-client';
4
+
5
+
/**
6
+
* Record envelope returned by paginated AT Protocol queries.
7
+
*/
8
+
export interface PaginatedRecord<T> {
9
+
/** Fully qualified AT URI for the record. */
10
+
uri: string;
11
+
/** Record key extracted from the URI or provided by the API. */
12
+
rkey: string;
13
+
/** Raw record value. */
14
+
value: T;
15
+
}
16
+
17
+
interface PageData<T> {
18
+
records: PaginatedRecord<T>[];
19
+
cursor?: string;
20
+
}
21
+
22
+
/**
23
+
* Options accepted by {@link usePaginatedRecords}.
24
+
*/
25
+
export interface UsePaginatedRecordsOptions {
26
+
/** DID whose repository should be queried. */
27
+
did?: string;
28
+
/** NSID collection containing the target records. */
29
+
collection: string;
30
+
/** Maximum page size to request; defaults to `5`. */
31
+
limit?: number;
32
+
}
33
+
34
+
/**
35
+
* Result returned from {@link usePaginatedRecords} describing records and pagination state.
36
+
*/
37
+
export interface UsePaginatedRecordsResult<T> {
38
+
/** Records for the active page. */
39
+
records: PaginatedRecord<T>[];
40
+
/** Indicates whether a page load is in progress. */
41
+
loading: boolean;
42
+
/** Error produced during the latest fetch, if any. */
43
+
error?: Error;
44
+
/** `true` when another page can be fetched forward. */
45
+
hasNext: boolean;
46
+
/** `true` when a previous page exists in memory. */
47
+
hasPrev: boolean;
48
+
/** Requests the next page (if available). */
49
+
loadNext: () => void;
50
+
/** Returns to the previous page when possible. */
51
+
loadPrev: () => void;
52
+
/** Index of the currently displayed page. */
53
+
pageIndex: number;
54
+
/** Number of pages fetched so far (or inferred total when known). */
55
+
pagesCount: number;
56
+
}
57
+
58
+
/**
59
+
* React hook that fetches a repository collection with cursor-based pagination and prefetching.
60
+
*
61
+
* @param did - DID whose repository should be queried.
62
+
* @param collection - NSID collection to read from.
63
+
* @param limit - Maximum number of records to request per page. Defaults to `5`.
64
+
* @returns {UsePaginatedRecordsResult<T>} Object containing the current page, pagination metadata, and navigation callbacks.
65
+
*/
66
+
export function usePaginatedRecords<T>({ did, collection, limit = 5 }: UsePaginatedRecordsOptions): UsePaginatedRecordsResult<T> {
67
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
68
+
const [pages, setPages] = useState<PageData<T>[]>([]);
69
+
const [pageIndex, setPageIndex] = useState(0);
70
+
const [loading, setLoading] = useState(false);
71
+
const [error, setError] = useState<Error | undefined>(undefined);
72
+
const inFlight = useRef<Set<string>>(new Set());
73
+
74
+
const resetState = useCallback(() => {
75
+
setPages([]);
76
+
setPageIndex(0);
77
+
setError(undefined);
78
+
}, []);
79
+
80
+
const fetchPage = useCallback(async (cursor: string | undefined, targetIndex: number, mode: 'active' | 'prefetch') => {
81
+
if (!did || !endpoint) return;
82
+
const key = `${targetIndex}:${cursor ?? 'start'}`;
83
+
if (inFlight.current.has(key)) return;
84
+
inFlight.current.add(key);
85
+
if (mode === 'active') {
86
+
setLoading(true);
87
+
setError(undefined);
88
+
}
89
+
try {
90
+
const { rpc } = await createAtprotoClient({ service: endpoint });
91
+
const res = await (rpc as unknown as {
92
+
get: (
93
+
nsid: string,
94
+
opts: { params: Record<string, string | number | boolean | undefined> }
95
+
) => Promise<{ ok: boolean; data: { records: Array<{ uri: string; rkey?: string; value: T }>; cursor?: string } }>;
96
+
}).get('com.atproto.repo.listRecords', {
97
+
params: {
98
+
repo: did,
99
+
collection,
100
+
limit,
101
+
cursor,
102
+
reverse: false
103
+
}
104
+
});
105
+
if (!res.ok) throw new Error('Failed to list records');
106
+
const { records, cursor: nextCursor } = res.data;
107
+
const mapped: PaginatedRecord<T>[] = records.map((item) => ({
108
+
uri: item.uri,
109
+
rkey: item.rkey ?? extractRkey(item.uri),
110
+
value: item.value
111
+
}));
112
+
setPages(prev => {
113
+
const next = [...prev];
114
+
next[targetIndex] = { records: mapped, cursor: nextCursor };
115
+
return next;
116
+
});
117
+
if (mode === 'active') setPageIndex(targetIndex);
118
+
return nextCursor;
119
+
} catch (e) {
120
+
if (mode === 'active') setError(e as Error);
121
+
} finally {
122
+
if (mode === 'active') setLoading(false);
123
+
inFlight.current.delete(key);
124
+
}
125
+
return undefined;
126
+
}, [did, endpoint, collection, limit]);
127
+
128
+
useEffect(() => {
129
+
resetState();
130
+
if (!did || !endpoint) return;
131
+
fetchPage(undefined, 0, 'active').catch(() => {
132
+
/* error handled in state */
133
+
});
134
+
}, [did, endpoint, fetchPage, resetState]);
135
+
136
+
const currentPage = pages[pageIndex];
137
+
const hasNext = !!currentPage?.cursor || !!pages[pageIndex + 1];
138
+
const hasPrev = pageIndex > 0;
139
+
140
+
const loadNext = useCallback(() => {
141
+
const page = pages[pageIndex];
142
+
if (!page?.cursor && !pages[pageIndex + 1]) return;
143
+
if (pages[pageIndex + 1]) {
144
+
setPageIndex(pageIndex + 1);
145
+
return;
146
+
}
147
+
fetchPage(page.cursor, pageIndex + 1, 'active').catch(() => {
148
+
/* handled via error state */
149
+
});
150
+
}, [fetchPage, pageIndex, pages]);
151
+
152
+
const loadPrev = useCallback(() => {
153
+
if (pageIndex === 0) return;
154
+
setPageIndex(pageIndex - 1);
155
+
}, [pageIndex]);
156
+
157
+
const records = useMemo(() => currentPage?.records ?? [], [currentPage]);
158
+
159
+
const effectiveError = error ?? (endpointError as Error | undefined);
160
+
161
+
useEffect(() => {
162
+
const cursor = pages[pageIndex]?.cursor;
163
+
if (!cursor) return;
164
+
if (pages[pageIndex + 1]) return;
165
+
fetchPage(cursor, pageIndex + 1, 'prefetch').catch(() => {
166
+
/* ignore prefetch errors */
167
+
});
168
+
}, [fetchPage, pageIndex, pages]);
169
+
170
+
return {
171
+
records,
172
+
loading,
173
+
error: effectiveError,
174
+
hasNext,
175
+
hasPrev,
176
+
loadNext,
177
+
loadPrev,
178
+
pageIndex,
179
+
pagesCount: pages.length || (currentPage ? pageIndex + 1 : 0)
180
+
};
181
+
}
182
+
183
+
function extractRkey(uri: string): string {
184
+
const parts = uri.split('/');
185
+
return parts[parts.length - 1];
186
+
}
+28
lib/hooks/usePdsEndpoint.ts
+28
lib/hooks/usePdsEndpoint.ts
···
1
+
import { useEffect, useState } from 'react';
2
+
import { useAtProto } from '../providers/AtProtoProvider';
3
+
4
+
/**
5
+
* Resolves the PDS service endpoint for a given DID and tracks loading state.
6
+
*
7
+
* @param did - DID whose PDS endpoint should be discovered.
8
+
* @returns {{ endpoint: string | undefined; error: Error | undefined; loading: boolean }} Object containing the resolved endpoint, error (if any), and loading flag.
9
+
*/
10
+
export function usePdsEndpoint(did: string | undefined) {
11
+
const { resolver } = useAtProto();
12
+
const [endpoint, setEndpoint] = useState<string | undefined>();
13
+
const [error, setError] = useState<Error | undefined>();
14
+
const [loading, setLoading] = useState(false);
15
+
16
+
useEffect(() => {
17
+
let cancelled = false;
18
+
if (!did) return;
19
+
setLoading(true);
20
+
resolver.pdsEndpointForDid(did)
21
+
.then(url => { if (!cancelled) setEndpoint(url); })
22
+
.catch(e => { if (!cancelled) setError(e as Error); })
23
+
.finally(() => { if (!cancelled) setLoading(false); });
24
+
return () => { cancelled = true; };
25
+
}, [did, resolver]);
26
+
27
+
return { endpoint, error, loading };
28
+
}
+41
lib/index.ts
+41
lib/index.ts
···
1
+
// Master exporter for the AT React component library.
2
+
3
+
// Providers & core primitives
4
+
export * from './providers/AtProtoProvider';
5
+
export * from './core/AtProtoRecord';
6
+
7
+
// Components
8
+
export * from './components/BlueskyIcon';
9
+
export * from './components/BlueskyPost';
10
+
export * from './components/BlueskyPostList';
11
+
export * from './components/BlueskyProfile';
12
+
export * from './components/BlueskyQuotePost';
13
+
export * from './components/ColorSchemeToggle';
14
+
export * from './components/LeafletDocument';
15
+
export * from './components/TangledString';
16
+
17
+
// Hooks
18
+
export * from './hooks/useAtProtoRecord';
19
+
export * from './hooks/useBlob';
20
+
export * from './hooks/useBlueskyProfile';
21
+
export * from './hooks/useColorScheme';
22
+
export * from './hooks/useDidHandle';
23
+
export * from './hooks/useDidResolution';
24
+
export * from './hooks/useLatestRecord';
25
+
export * from './hooks/usePaginatedRecords';
26
+
export * from './hooks/usePdsEndpoint';
27
+
28
+
// Renderers
29
+
export * from './renderers/BlueskyPostRenderer';
30
+
export * from './renderers/BlueskyProfileRenderer';
31
+
export * from './renderers/LeafletDocumentRenderer';
32
+
export * from './renderers/TangledStringRenderer';
33
+
34
+
// Types
35
+
export * from './types/bluesky';
36
+
export * from './types/leaflet';
37
+
38
+
// Utilities
39
+
export * from './utils/at-uri';
40
+
export * from './utils/atproto-client';
41
+
export * from './utils/profile';
+24
lib/lexicons/pub/leaflet/blocks/blockquote.json
+24
lib/lexicons/pub/leaflet/blocks/blockquote.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.blockquote",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"plaintext"
9
+
],
10
+
"properties": {
11
+
"plaintext": {
12
+
"type": "string"
13
+
},
14
+
"facets": {
15
+
"type": "array",
16
+
"items": {
17
+
"type": "ref",
18
+
"ref": "pub.leaflet.richtext.facet"
19
+
}
20
+
}
21
+
}
22
+
}
23
+
}
24
+
}
+18
lib/lexicons/pub/leaflet/blocks/bskyPost.json
+18
lib/lexicons/pub/leaflet/blocks/bskyPost.json
+23
lib/lexicons/pub/leaflet/blocks/code.json
+23
lib/lexicons/pub/leaflet/blocks/code.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.code",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"plaintext"
9
+
],
10
+
"properties": {
11
+
"plaintext": {
12
+
"type": "string"
13
+
},
14
+
"language": {
15
+
"type": "string"
16
+
},
17
+
"syntaxHighlightingTheme": {
18
+
"type": "string"
19
+
}
20
+
}
21
+
}
22
+
}
23
+
}
+29
lib/lexicons/pub/leaflet/blocks/header.json
+29
lib/lexicons/pub/leaflet/blocks/header.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.header",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"plaintext"
9
+
],
10
+
"properties": {
11
+
"level": {
12
+
"type": "integer",
13
+
"minimum": 1,
14
+
"maximum": 6
15
+
},
16
+
"plaintext": {
17
+
"type": "string"
18
+
},
19
+
"facets": {
20
+
"type": "array",
21
+
"items": {
22
+
"type": "ref",
23
+
"ref": "pub.leaflet.richtext.facet"
24
+
}
25
+
}
26
+
}
27
+
}
28
+
}
29
+
}
+11
lib/lexicons/pub/leaflet/blocks/horizontalRule.json
+11
lib/lexicons/pub/leaflet/blocks/horizontalRule.json
+23
lib/lexicons/pub/leaflet/blocks/iframe.json
+23
lib/lexicons/pub/leaflet/blocks/iframe.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.iframe",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"url"
9
+
],
10
+
"properties": {
11
+
"url": {
12
+
"type": "string",
13
+
"format": "uri"
14
+
},
15
+
"height": {
16
+
"type": "integer",
17
+
"minimum": 16,
18
+
"maximum": 1600
19
+
}
20
+
}
21
+
}
22
+
}
23
+
}
+45
lib/lexicons/pub/leaflet/blocks/image.json
+45
lib/lexicons/pub/leaflet/blocks/image.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.image",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"image",
9
+
"aspectRatio"
10
+
],
11
+
"properties": {
12
+
"image": {
13
+
"type": "blob",
14
+
"accept": [
15
+
"image/*"
16
+
],
17
+
"maxSize": 1000000
18
+
},
19
+
"alt": {
20
+
"type": "string",
21
+
"description": "Alt text description of the image, for accessibility."
22
+
},
23
+
"aspectRatio": {
24
+
"type": "ref",
25
+
"ref": "#aspectRatio"
26
+
}
27
+
}
28
+
},
29
+
"aspectRatio": {
30
+
"type": "object",
31
+
"required": [
32
+
"width",
33
+
"height"
34
+
],
35
+
"properties": {
36
+
"width": {
37
+
"type": "integer"
38
+
},
39
+
"height": {
40
+
"type": "integer"
41
+
}
42
+
}
43
+
}
44
+
}
45
+
}
+17
lib/lexicons/pub/leaflet/blocks/math.json
+17
lib/lexicons/pub/leaflet/blocks/math.json
+24
lib/lexicons/pub/leaflet/blocks/text.json
+24
lib/lexicons/pub/leaflet/blocks/text.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.text",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"plaintext"
9
+
],
10
+
"properties": {
11
+
"plaintext": {
12
+
"type": "string"
13
+
},
14
+
"facets": {
15
+
"type": "array",
16
+
"items": {
17
+
"type": "ref",
18
+
"ref": "pub.leaflet.richtext.facet"
19
+
}
20
+
}
21
+
}
22
+
}
23
+
}
24
+
}
+44
lib/lexicons/pub/leaflet/blocks/unorderedList.json
+44
lib/lexicons/pub/leaflet/blocks/unorderedList.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.unorderedList",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"children"
9
+
],
10
+
"properties": {
11
+
"children": {
12
+
"type": "array",
13
+
"items": {
14
+
"type": "ref",
15
+
"ref": "#listItem"
16
+
}
17
+
}
18
+
}
19
+
},
20
+
"listItem": {
21
+
"type": "object",
22
+
"required": [
23
+
"content"
24
+
],
25
+
"properties": {
26
+
"content": {
27
+
"type": "union",
28
+
"refs": [
29
+
"pub.leaflet.blocks.text",
30
+
"pub.leaflet.blocks.header",
31
+
"pub.leaflet.blocks.image"
32
+
]
33
+
},
34
+
"children": {
35
+
"type": "array",
36
+
"items": {
37
+
"type": "ref",
38
+
"ref": "#listItem"
39
+
}
40
+
}
41
+
}
42
+
}
43
+
}
44
+
}
+31
lib/lexicons/pub/leaflet/blocks/website.json
+31
lib/lexicons/pub/leaflet/blocks/website.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.blocks.website",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"src"
9
+
],
10
+
"properties": {
11
+
"previewImage": {
12
+
"type": "blob",
13
+
"accept": [
14
+
"image/*"
15
+
],
16
+
"maxSize": 1000000
17
+
},
18
+
"title": {
19
+
"type": "string"
20
+
},
21
+
"description": {
22
+
"type": "string"
23
+
},
24
+
"src": {
25
+
"type": "string",
26
+
"format": "uri"
27
+
}
28
+
}
29
+
}
30
+
}
31
+
}
+80
lib/lexicons/pub/leaflet/comment.json
+80
lib/lexicons/pub/leaflet/comment.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.comment",
4
+
"revision": 1,
5
+
"description": "A lexicon for comments on documents",
6
+
"defs": {
7
+
"main": {
8
+
"type": "record",
9
+
"key": "tid",
10
+
"description": "Record containing a comment",
11
+
"record": {
12
+
"type": "object",
13
+
"required": [
14
+
"subject",
15
+
"plaintext",
16
+
"createdAt"
17
+
],
18
+
"properties": {
19
+
"subject": {
20
+
"type": "string",
21
+
"format": "at-uri"
22
+
},
23
+
"createdAt": {
24
+
"type": "string",
25
+
"format": "datetime"
26
+
},
27
+
"reply": {
28
+
"type": "ref",
29
+
"ref": "#replyRef"
30
+
},
31
+
"plaintext": {
32
+
"type": "string"
33
+
},
34
+
"facets": {
35
+
"type": "array",
36
+
"items": {
37
+
"type": "ref",
38
+
"ref": "pub.leaflet.richtext.facet"
39
+
}
40
+
},
41
+
"attachment": {
42
+
"type": "union",
43
+
"refs": [
44
+
"#linearDocumentQuote"
45
+
]
46
+
}
47
+
}
48
+
}
49
+
},
50
+
"linearDocumentQuote": {
51
+
"type": "object",
52
+
"required": [
53
+
"document",
54
+
"quote"
55
+
],
56
+
"properties": {
57
+
"document": {
58
+
"type": "string",
59
+
"format": "at-uri"
60
+
},
61
+
"quote": {
62
+
"type": "ref",
63
+
"ref": "pub.leaflet.pages.linearDocument#quote"
64
+
}
65
+
}
66
+
},
67
+
"replyRef": {
68
+
"type": "object",
69
+
"required": [
70
+
"parent"
71
+
],
72
+
"properties": {
73
+
"parent": {
74
+
"type": "string",
75
+
"format": "at-uri"
76
+
}
77
+
}
78
+
}
79
+
}
80
+
}
+59
lib/lexicons/pub/leaflet/document.json
+59
lib/lexicons/pub/leaflet/document.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.document",
4
+
"revision": 1,
5
+
"description": "A lexicon for long form rich media documents",
6
+
"defs": {
7
+
"main": {
8
+
"type": "record",
9
+
"key": "tid",
10
+
"description": "Record containing a document",
11
+
"record": {
12
+
"type": "object",
13
+
"required": [
14
+
"pages",
15
+
"author",
16
+
"title",
17
+
"publication"
18
+
],
19
+
"properties": {
20
+
"title": {
21
+
"type": "string",
22
+
"maxLength": 1280,
23
+
"maxGraphemes": 128
24
+
},
25
+
"postRef": {
26
+
"type": "ref",
27
+
"ref": "com.atproto.repo.strongRef"
28
+
},
29
+
"description": {
30
+
"type": "string",
31
+
"maxLength": 3000,
32
+
"maxGraphemes": 300
33
+
},
34
+
"publishedAt": {
35
+
"type": "string",
36
+
"format": "datetime"
37
+
},
38
+
"publication": {
39
+
"type": "string",
40
+
"format": "at-uri"
41
+
},
42
+
"author": {
43
+
"type": "string",
44
+
"format": "at-identifier"
45
+
},
46
+
"pages": {
47
+
"type": "array",
48
+
"items": {
49
+
"type": "union",
50
+
"refs": [
51
+
"pub.leaflet.pages.linearDocument"
52
+
]
53
+
}
54
+
}
55
+
}
56
+
}
57
+
}
58
+
}
59
+
}
+23
lib/lexicons/pub/leaflet/graph/subscription.json
+23
lib/lexicons/pub/leaflet/graph/subscription.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.graph.subscription",
4
+
"defs": {
5
+
"main": {
6
+
"type": "record",
7
+
"key": "tid",
8
+
"description": "Record declaring a subscription to a publication",
9
+
"record": {
10
+
"type": "object",
11
+
"required": [
12
+
"publication"
13
+
],
14
+
"properties": {
15
+
"publication": {
16
+
"type": "string",
17
+
"format": "at-uri"
18
+
}
19
+
}
20
+
}
21
+
}
22
+
}
23
+
}
+95
lib/lexicons/pub/leaflet/pages/linearDocument.json
+95
lib/lexicons/pub/leaflet/pages/linearDocument.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.pages.linearDocument",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"properties": {
8
+
"blocks": {
9
+
"type": "array",
10
+
"items": {
11
+
"type": "ref",
12
+
"ref": "#block"
13
+
}
14
+
}
15
+
}
16
+
},
17
+
"block": {
18
+
"type": "object",
19
+
"required": [
20
+
"block"
21
+
],
22
+
"properties": {
23
+
"block": {
24
+
"type": "union",
25
+
"refs": [
26
+
"pub.leaflet.blocks.iframe",
27
+
"pub.leaflet.blocks.text",
28
+
"pub.leaflet.blocks.blockquote",
29
+
"pub.leaflet.blocks.header",
30
+
"pub.leaflet.blocks.image",
31
+
"pub.leaflet.blocks.unorderedList",
32
+
"pub.leaflet.blocks.website",
33
+
"pub.leaflet.blocks.math",
34
+
"pub.leaflet.blocks.code",
35
+
"pub.leaflet.blocks.horizontalRule",
36
+
"pub.leaflet.blocks.bskyPost"
37
+
]
38
+
},
39
+
"alignment": {
40
+
"type": "string",
41
+
"knownValues": [
42
+
"#textAlignLeft",
43
+
"#textAlignCenter",
44
+
"#textAlignRight",
45
+
"#textAlignJustify"
46
+
]
47
+
}
48
+
}
49
+
},
50
+
"textAlignLeft": {
51
+
"type": "token"
52
+
},
53
+
"textAlignCenter": {
54
+
"type": "token"
55
+
},
56
+
"textAlignRight": {
57
+
"type": "token"
58
+
},
59
+
"quote": {
60
+
"type": "object",
61
+
"required": [
62
+
"start",
63
+
"end"
64
+
],
65
+
"properties": {
66
+
"start": {
67
+
"type": "ref",
68
+
"ref": "#position"
69
+
},
70
+
"end": {
71
+
"type": "ref",
72
+
"ref": "#position"
73
+
}
74
+
}
75
+
},
76
+
"position": {
77
+
"type": "object",
78
+
"required": [
79
+
"block",
80
+
"offset"
81
+
],
82
+
"properties": {
83
+
"block": {
84
+
"type": "array",
85
+
"items": {
86
+
"type": "integer"
87
+
}
88
+
},
89
+
"offset": {
90
+
"type": "integer"
91
+
}
92
+
}
93
+
}
94
+
}
95
+
}
+107
lib/lexicons/pub/leaflet/publication.json
+107
lib/lexicons/pub/leaflet/publication.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.publication",
4
+
"defs": {
5
+
"main": {
6
+
"type": "record",
7
+
"key": "tid",
8
+
"description": "Record declaring a publication",
9
+
"record": {
10
+
"type": "object",
11
+
"required": [
12
+
"name"
13
+
],
14
+
"properties": {
15
+
"name": {
16
+
"type": "string",
17
+
"maxLength": 2000
18
+
},
19
+
"base_path": {
20
+
"type": "string",
21
+
"format": "uri"
22
+
},
23
+
"description": {
24
+
"type": "string",
25
+
"maxLength": 2000
26
+
},
27
+
"icon": {
28
+
"type": "blob",
29
+
"accept": [
30
+
"image/*"
31
+
],
32
+
"maxSize": 1000000
33
+
},
34
+
"theme": {
35
+
"type": "ref",
36
+
"ref": "#theme"
37
+
},
38
+
"preferences": {
39
+
"type": "ref",
40
+
"ref": "#preferences"
41
+
}
42
+
}
43
+
}
44
+
},
45
+
"preferences": {
46
+
"type": "object",
47
+
"properties": {
48
+
"showInDiscover": {
49
+
"type": "boolean",
50
+
"default": true
51
+
},
52
+
"showComments": {
53
+
"type": "boolean",
54
+
"default": true
55
+
}
56
+
}
57
+
},
58
+
"theme": {
59
+
"type": "object",
60
+
"properties": {
61
+
"backgroundColor": {
62
+
"type": "union",
63
+
"refs": [
64
+
"pub.leaflet.theme.color#rgba",
65
+
"pub.leaflet.theme.color#rgb"
66
+
]
67
+
},
68
+
"backgroundImage": {
69
+
"type": "ref",
70
+
"ref": "pub.leaflet.theme.backgroundImage"
71
+
},
72
+
"primary": {
73
+
"type": "union",
74
+
"refs": [
75
+
"pub.leaflet.theme.color#rgba",
76
+
"pub.leaflet.theme.color#rgb"
77
+
]
78
+
},
79
+
"pageBackground": {
80
+
"type": "union",
81
+
"refs": [
82
+
"pub.leaflet.theme.color#rgba",
83
+
"pub.leaflet.theme.color#rgb"
84
+
]
85
+
},
86
+
"showPageBackground": {
87
+
"type": "boolean",
88
+
"default": false
89
+
},
90
+
"accentBackground": {
91
+
"type": "union",
92
+
"refs": [
93
+
"pub.leaflet.theme.color#rgba",
94
+
"pub.leaflet.theme.color#rgb"
95
+
]
96
+
},
97
+
"accentText": {
98
+
"type": "union",
99
+
"refs": [
100
+
"pub.leaflet.theme.color#rgba",
101
+
"pub.leaflet.theme.color#rgb"
102
+
]
103
+
}
104
+
}
105
+
}
106
+
}
107
+
}
+112
lib/lexicons/pub/leaflet/richtext/facet.json
+112
lib/lexicons/pub/leaflet/richtext/facet.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.richtext.facet",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"description": "Annotation of a sub-string within rich text.",
8
+
"required": [
9
+
"index",
10
+
"features"
11
+
],
12
+
"properties": {
13
+
"index": {
14
+
"type": "ref",
15
+
"ref": "#byteSlice"
16
+
},
17
+
"features": {
18
+
"type": "array",
19
+
"items": {
20
+
"type": "union",
21
+
"refs": [
22
+
"#link",
23
+
"#code",
24
+
"#highlight",
25
+
"#underline",
26
+
"#strikethrough",
27
+
"#id",
28
+
"#bold",
29
+
"#italic"
30
+
]
31
+
}
32
+
}
33
+
}
34
+
},
35
+
"byteSlice": {
36
+
"type": "object",
37
+
"description": "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.",
38
+
"required": [
39
+
"byteStart",
40
+
"byteEnd"
41
+
],
42
+
"properties": {
43
+
"byteStart": {
44
+
"type": "integer",
45
+
"minimum": 0
46
+
},
47
+
"byteEnd": {
48
+
"type": "integer",
49
+
"minimum": 0
50
+
}
51
+
}
52
+
},
53
+
"link": {
54
+
"type": "object",
55
+
"description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.",
56
+
"required": [
57
+
"uri"
58
+
],
59
+
"properties": {
60
+
"uri": {
61
+
"type": "string"
62
+
}
63
+
}
64
+
},
65
+
"code": {
66
+
"type": "object",
67
+
"description": "Facet feature for inline code.",
68
+
"required": [],
69
+
"properties": {}
70
+
},
71
+
"highlight": {
72
+
"type": "object",
73
+
"description": "Facet feature for highlighted text.",
74
+
"required": [],
75
+
"properties": {}
76
+
},
77
+
"underline": {
78
+
"type": "object",
79
+
"description": "Facet feature for underline markup",
80
+
"required": [],
81
+
"properties": {}
82
+
},
83
+
"strikethrough": {
84
+
"type": "object",
85
+
"description": "Facet feature for strikethrough markup",
86
+
"required": [],
87
+
"properties": {}
88
+
},
89
+
"id": {
90
+
"type": "object",
91
+
"description": "Facet feature for an identifier. Used for linking to a segment",
92
+
"required": [],
93
+
"properties": {
94
+
"id": {
95
+
"type": "string"
96
+
}
97
+
}
98
+
},
99
+
"bold": {
100
+
"type": "object",
101
+
"description": "Facet feature for bold text",
102
+
"required": [],
103
+
"properties": {}
104
+
},
105
+
"italic": {
106
+
"type": "object",
107
+
"description": "Facet feature for italic text",
108
+
"required": [],
109
+
"properties": {}
110
+
}
111
+
}
112
+
}
+27
lib/lexicons/pub/leaflet/theme/backgroundImage.json
+27
lib/lexicons/pub/leaflet/theme/backgroundImage.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.theme.backgroundImage",
4
+
"defs": {
5
+
"main": {
6
+
"type": "object",
7
+
"required": [
8
+
"image"
9
+
],
10
+
"properties": {
11
+
"image": {
12
+
"type": "blob",
13
+
"accept": [
14
+
"image/*"
15
+
],
16
+
"maxSize": 1000000
17
+
},
18
+
"width": {
19
+
"type": "integer"
20
+
},
21
+
"repeat": {
22
+
"type": "boolean"
23
+
}
24
+
}
25
+
}
26
+
}
27
+
}
+62
lib/lexicons/pub/leaflet/theme/color.json
+62
lib/lexicons/pub/leaflet/theme/color.json
···
1
+
{
2
+
"lexicon": 1,
3
+
"id": "pub.leaflet.theme.color",
4
+
"defs": {
5
+
"rgba": {
6
+
"type": "object",
7
+
"required": [
8
+
"r",
9
+
"g",
10
+
"b",
11
+
"a"
12
+
],
13
+
"properties": {
14
+
"r": {
15
+
"type": "integer",
16
+
"maximum": 255,
17
+
"minimum": 0
18
+
},
19
+
"g": {
20
+
"type": "integer",
21
+
"maximum": 255,
22
+
"minimum": 0
23
+
},
24
+
"b": {
25
+
"type": "integer",
26
+
"maximum": 255,
27
+
"minimum": 0
28
+
},
29
+
"a": {
30
+
"type": "integer",
31
+
"maximum": 100,
32
+
"minimum": 0
33
+
}
34
+
}
35
+
},
36
+
"rgb": {
37
+
"type": "object",
38
+
"required": [
39
+
"r",
40
+
"g",
41
+
"b"
42
+
],
43
+
"properties": {
44
+
"r": {
45
+
"type": "integer",
46
+
"maximum": 255,
47
+
"minimum": 0
48
+
},
49
+
"g": {
50
+
"type": "integer",
51
+
"maximum": 255,
52
+
"minimum": 0
53
+
},
54
+
"b": {
55
+
"type": "integer",
56
+
"maximum": 255,
57
+
"minimum": 0
58
+
}
59
+
}
60
+
}
61
+
}
62
+
}
+28
lib/providers/AtProtoProvider.tsx
+28
lib/providers/AtProtoProvider.tsx
···
1
+
/* eslint-disable react-refresh/only-export-components */
2
+
import React, { createContext, useContext, useMemo } from 'react';
3
+
import { ServiceResolver, normalizeBaseUrl } from '../utils/atproto-client';
4
+
5
+
export interface AtProtoProviderProps {
6
+
children: React.ReactNode;
7
+
plcDirectory?: string;
8
+
}
9
+
10
+
interface AtProtoContextValue {
11
+
resolver: ServiceResolver;
12
+
plcDirectory: string;
13
+
}
14
+
15
+
const AtProtoContext = createContext<AtProtoContextValue | undefined>(undefined);
16
+
17
+
export function AtProtoProvider({ children, plcDirectory }: AtProtoProviderProps) {
18
+
const normalizedPlc = useMemo(() => normalizeBaseUrl(plcDirectory && plcDirectory.trim() ? plcDirectory : 'https://plc.directory'), [plcDirectory]);
19
+
const resolver = useMemo(() => new ServiceResolver({ plcDirectory: normalizedPlc }), [normalizedPlc]);
20
+
const value = useMemo<AtProtoContextValue>(() => ({ resolver, plcDirectory: normalizedPlc }), [resolver, normalizedPlc]);
21
+
return <AtProtoContext.Provider value={value}>{children}</AtProtoContext.Provider>;
22
+
}
23
+
24
+
export function useAtProto() {
25
+
const ctx = useContext(AtProtoContext);
26
+
if (!ctx) throw new Error('useAtProto must be used within AtProtoProvider');
27
+
return ctx;
28
+
}
+472
lib/renderers/BlueskyPostRenderer.tsx
+472
lib/renderers/BlueskyPostRenderer.tsx
···
1
+
import React from 'react';
2
+
import type { FeedPostRecord } from '../types/bluesky';
3
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
4
+
import { parseAtUri, toBlueskyPostUrl, formatDidForLabel, type ParsedAtUri } from '../utils/at-uri';
5
+
import { useDidHandle } from '../hooks/useDidHandle';
6
+
import { useBlob } from '../hooks/useBlob';
7
+
import { BlueskyIcon } from '../components/BlueskyIcon';
8
+
9
+
export interface BlueskyPostRendererProps {
10
+
record: FeedPostRecord;
11
+
loading: boolean;
12
+
error?: Error;
13
+
// Optionally pass in actor display info if pre-fetched
14
+
authorHandle?: string;
15
+
authorDisplayName?: string;
16
+
avatarUrl?: string;
17
+
colorScheme?: ColorSchemePreference;
18
+
authorDid?: string;
19
+
embed?: React.ReactNode;
20
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
21
+
showIcon?: boolean;
22
+
atUri?: string;
23
+
}
24
+
25
+
export const BlueskyPostRenderer: React.FC<BlueskyPostRendererProps> = ({ record, loading, error, authorDisplayName, authorHandle, avatarUrl, colorScheme = 'system', authorDid, embed, iconPlacement = 'timestamp', showIcon = true, atUri }) => {
26
+
const scheme = useColorScheme(colorScheme);
27
+
const replyParentUri = record.reply?.parent?.uri;
28
+
const replyTarget = replyParentUri ? parseAtUri(replyParentUri) : undefined;
29
+
const { handle: parentHandle, loading: parentHandleLoading } = useDidHandle(replyTarget?.did);
30
+
31
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load post.</div>;
32
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
33
+
34
+
const palette = scheme === 'dark' ? themeStyles.dark : themeStyles.light;
35
+
36
+
const text = record.text;
37
+
const createdDate = new Date(record.createdAt);
38
+
const created = createdDate.toLocaleString(undefined, {
39
+
dateStyle: 'medium',
40
+
timeStyle: 'short'
41
+
});
42
+
const primaryName = authorDisplayName || authorHandle || '…';
43
+
const replyHref = replyTarget ? toBlueskyPostUrl(replyTarget) : undefined;
44
+
const replyLabel = replyTarget ? formatReplyLabel(replyTarget, parentHandle, parentHandleLoading) : undefined;
45
+
46
+
const makeIcon = () => (showIcon ? <BlueskyIcon size={16} /> : null);
47
+
const resolvedEmbed = embed ?? createAutoEmbed(record, authorDid, scheme);
48
+
const parsedSelf = atUri ? parseAtUri(atUri) : undefined;
49
+
const postUrl = parsedSelf ? toBlueskyPostUrl(parsedSelf) : undefined;
50
+
const cardPadding = typeof baseStyles.card.padding === 'number' ? baseStyles.card.padding : 12;
51
+
const cardStyle: React.CSSProperties = {
52
+
...baseStyles.card,
53
+
...palette.card,
54
+
...(iconPlacement === 'cardBottomRight' && showIcon ? { paddingBottom: cardPadding + 16 } : {})
55
+
};
56
+
57
+
return (
58
+
<article style={cardStyle} aria-busy={loading}>
59
+
<header style={baseStyles.header}>
60
+
{avatarUrl ? (
61
+
<img src={avatarUrl} alt="avatar" style={baseStyles.avatarImg} />
62
+
) : (
63
+
<div style={{ ...baseStyles.avatarPlaceholder, ...palette.avatarPlaceholder }} aria-hidden />
64
+
)}
65
+
<div style={{ display: 'flex', flexDirection: 'column' }}>
66
+
<strong style={{ fontSize: 14 }}>{primaryName}</strong>
67
+
{authorDisplayName && authorHandle && <span style={{ ...baseStyles.handle, ...palette.handle }}>@{authorHandle}</span>}
68
+
</div>
69
+
{iconPlacement === 'timestamp' && showIcon && (
70
+
<div style={baseStyles.headerIcon}>{makeIcon()}</div>
71
+
)}
72
+
</header>
73
+
{replyHref && replyLabel && (
74
+
<div style={{ ...baseStyles.replyLine, ...palette.replyLine }}>
75
+
Replying to{' '}
76
+
<a href={replyHref} target="_blank" rel="noopener noreferrer" style={{ ...baseStyles.replyLink, ...palette.replyLink }}>
77
+
{replyLabel}
78
+
</a>
79
+
</div>
80
+
)}
81
+
<div style={baseStyles.body}>
82
+
<p style={{ ...baseStyles.text, ...palette.text }}>{text}</p>
83
+
{record.facets && record.facets.length > 0 && (
84
+
<div style={baseStyles.facets}>
85
+
{record.facets.map((_, idx) => (
86
+
<span key={idx} style={{ ...baseStyles.facetTag, ...palette.facetTag }}>facet</span>
87
+
))}
88
+
</div>
89
+
)}
90
+
<div style={baseStyles.timestampRow}>
91
+
<time style={{ ...baseStyles.time, ...palette.time }} dateTime={record.createdAt}>{created}</time>
92
+
{postUrl && (
93
+
<span style={baseStyles.linkWithIcon}>
94
+
<a href={postUrl} target="_blank" rel="noopener noreferrer" style={{ ...baseStyles.postLink, ...palette.postLink }}>
95
+
View on Bluesky
96
+
</a>
97
+
{iconPlacement === 'linkInline' && showIcon && (
98
+
<span style={baseStyles.inlineIcon} aria-hidden>
99
+
{makeIcon()}
100
+
</span>
101
+
)}
102
+
</span>
103
+
)}
104
+
</div>
105
+
{resolvedEmbed && (
106
+
<div style={{ ...baseStyles.embedContainer, ...palette.embedContainer }}>
107
+
{resolvedEmbed}
108
+
</div>
109
+
)}
110
+
</div>
111
+
{iconPlacement === 'cardBottomRight' && showIcon && (
112
+
<div style={baseStyles.iconCorner} aria-hidden>
113
+
{makeIcon()}
114
+
</div>
115
+
)}
116
+
</article>
117
+
);
118
+
};
119
+
120
+
const baseStyles: Record<string, React.CSSProperties> = {
121
+
card: {
122
+
borderRadius: 12,
123
+
padding: 12,
124
+
fontFamily: 'system-ui, sans-serif',
125
+
display: 'flex',
126
+
flexDirection: 'column',
127
+
gap: 8,
128
+
maxWidth: 600,
129
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease',
130
+
position: 'relative'
131
+
},
132
+
header: {
133
+
display: 'flex',
134
+
alignItems: 'center',
135
+
gap: 8
136
+
},
137
+
headerIcon: {
138
+
marginLeft: 'auto',
139
+
display: 'flex',
140
+
alignItems: 'center'
141
+
},
142
+
avatarPlaceholder: {
143
+
width: 40,
144
+
height: 40,
145
+
borderRadius: '50%'
146
+
},
147
+
avatarImg: {
148
+
width: 40,
149
+
height: 40,
150
+
borderRadius: '50%',
151
+
objectFit: 'cover'
152
+
},
153
+
handle: {
154
+
fontSize: 12
155
+
},
156
+
time: {
157
+
fontSize: 11
158
+
},
159
+
timestampIcon: {
160
+
display: 'flex',
161
+
alignItems: 'center',
162
+
justifyContent: 'center'
163
+
},
164
+
body: {
165
+
fontSize: 14,
166
+
lineHeight: 1.4
167
+
},
168
+
text: {
169
+
margin: 0,
170
+
whiteSpace: 'pre-wrap'
171
+
},
172
+
facets: {
173
+
marginTop: 8,
174
+
display: 'flex',
175
+
gap: 4
176
+
},
177
+
embedContainer: {
178
+
marginTop: 12,
179
+
padding: 8,
180
+
borderRadius: 12,
181
+
display: 'flex',
182
+
flexDirection: 'column',
183
+
gap: 8
184
+
},
185
+
timestampRow: {
186
+
display: 'flex',
187
+
justifyContent: 'flex-end',
188
+
alignItems: 'center',
189
+
gap: 12,
190
+
marginTop: 12,
191
+
flexWrap: 'wrap'
192
+
},
193
+
linkWithIcon: {
194
+
display: 'inline-flex',
195
+
alignItems: 'center',
196
+
gap: 6
197
+
},
198
+
postLink: {
199
+
fontSize: 11,
200
+
textDecoration: 'none',
201
+
fontWeight: 600
202
+
},
203
+
inlineIcon: {
204
+
display: 'inline-flex',
205
+
alignItems: 'center'
206
+
},
207
+
facetTag: {
208
+
padding: '2px 6px',
209
+
borderRadius: 4,
210
+
fontSize: 11
211
+
},
212
+
replyLine: {
213
+
fontSize: 12
214
+
},
215
+
replyLink: {
216
+
textDecoration: 'none',
217
+
fontWeight: 500
218
+
},
219
+
iconCorner: {
220
+
position: 'absolute',
221
+
right: 12,
222
+
bottom: 12,
223
+
display: 'flex',
224
+
alignItems: 'center',
225
+
justifyContent: 'flex-end'
226
+
}
227
+
};
228
+
229
+
const themeStyles = {
230
+
light: {
231
+
card: {
232
+
border: '1px solid #e2e8f0',
233
+
background: '#ffffff',
234
+
color: '#0f172a'
235
+
},
236
+
avatarPlaceholder: {
237
+
background: '#cbd5e1'
238
+
},
239
+
handle: {
240
+
color: '#64748b'
241
+
},
242
+
time: {
243
+
color: '#94a3b8'
244
+
},
245
+
text: {
246
+
color: '#0f172a'
247
+
},
248
+
facetTag: {
249
+
background: '#f1f5f9',
250
+
color: '#475569'
251
+
},
252
+
replyLine: {
253
+
color: '#475569'
254
+
},
255
+
replyLink: {
256
+
color: '#2563eb'
257
+
},
258
+
embedContainer: {
259
+
border: '1px solid #e2e8f0',
260
+
borderRadius: 12,
261
+
background: '#f8fafc'
262
+
},
263
+
postLink: {
264
+
color: '#2563eb'
265
+
}
266
+
},
267
+
dark: {
268
+
card: {
269
+
border: '1px solid #1e293b',
270
+
background: '#0f172a',
271
+
color: '#e2e8f0'
272
+
},
273
+
avatarPlaceholder: {
274
+
background: '#1e293b'
275
+
},
276
+
handle: {
277
+
color: '#cbd5f5'
278
+
},
279
+
time: {
280
+
color: '#94a3ff'
281
+
},
282
+
text: {
283
+
color: '#e2e8f0'
284
+
},
285
+
facetTag: {
286
+
background: '#1e293b',
287
+
color: '#e0f2fe'
288
+
},
289
+
replyLine: {
290
+
color: '#cbd5f5'
291
+
},
292
+
replyLink: {
293
+
color: '#38bdf8'
294
+
},
295
+
embedContainer: {
296
+
border: '1px solid #1e293b',
297
+
borderRadius: 12,
298
+
background: '#0b1120'
299
+
},
300
+
postLink: {
301
+
color: '#38bdf8'
302
+
}
303
+
}
304
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
305
+
306
+
function formatReplyLabel(target: ParsedAtUri, resolvedHandle?: string, loading?: boolean): string {
307
+
if (resolvedHandle) return `@${resolvedHandle}`;
308
+
if (loading) return '…';
309
+
return `@${formatDidForLabel(target.did)}`;
310
+
}
311
+
312
+
function createAutoEmbed(record: FeedPostRecord, authorDid: string | undefined, scheme: 'light' | 'dark'): React.ReactNode {
313
+
const embed = record.embed as { $type?: string } | undefined;
314
+
if (!embed) return null;
315
+
if (embed.$type === 'app.bsky.embed.images') {
316
+
return <ImagesEmbed embed={embed as ImagesEmbedType} did={authorDid} scheme={scheme} />;
317
+
}
318
+
if (embed.$type === 'app.bsky.embed.recordWithMedia') {
319
+
const media = (embed as RecordWithMediaEmbed).media;
320
+
if (media?.$type === 'app.bsky.embed.images') {
321
+
return <ImagesEmbed embed={media as ImagesEmbedType} did={authorDid} scheme={scheme} />;
322
+
}
323
+
}
324
+
return null;
325
+
}
326
+
327
+
type ImagesEmbedType = {
328
+
$type: 'app.bsky.embed.images';
329
+
images: Array<{
330
+
alt?: string;
331
+
mime?: string;
332
+
size?: number;
333
+
image?: {
334
+
$type?: string;
335
+
ref?: { $link?: string };
336
+
cid?: string;
337
+
};
338
+
aspectRatio?: {
339
+
width: number;
340
+
height: number;
341
+
};
342
+
}>;
343
+
};
344
+
345
+
type RecordWithMediaEmbed = {
346
+
$type: 'app.bsky.embed.recordWithMedia';
347
+
record?: unknown;
348
+
media?: { $type?: string };
349
+
};
350
+
351
+
interface ImagesEmbedProps {
352
+
embed: ImagesEmbedType;
353
+
did?: string;
354
+
scheme: 'light' | 'dark';
355
+
}
356
+
357
+
const ImagesEmbed: React.FC<ImagesEmbedProps> = ({ embed, did, scheme }) => {
358
+
if (!embed.images || embed.images.length === 0) return null;
359
+
const palette = scheme === 'dark' ? imagesPalette.dark : imagesPalette.light;
360
+
const columns = embed.images.length > 1 ? 'repeat(auto-fit, minmax(160px, 1fr))' : '1fr';
361
+
return (
362
+
<div style={{ ...imagesBase.container, ...palette.container, gridTemplateColumns: columns }}>
363
+
{embed.images.map((image, idx) => (
364
+
<PostImage key={idx} image={image} did={did} scheme={scheme} />
365
+
))}
366
+
</div>
367
+
);
368
+
};
369
+
370
+
interface PostImageProps {
371
+
image: ImagesEmbedType['images'][number];
372
+
did?: string;
373
+
scheme: 'light' | 'dark';
374
+
}
375
+
376
+
const PostImage: React.FC<PostImageProps> = ({ image, did, scheme }) => {
377
+
const cid = image.image?.ref?.$link ?? image.image?.cid;
378
+
const { url, loading, error } = useBlob(did, cid);
379
+
const alt = image.alt?.trim() || 'Bluesky attachment';
380
+
const palette = scheme === 'dark' ? imagesPalette.dark : imagesPalette.light;
381
+
const aspect = image.aspectRatio && image.aspectRatio.height > 0
382
+
? `${image.aspectRatio.width} / ${image.aspectRatio.height}`
383
+
: undefined;
384
+
385
+
return (
386
+
<figure style={{ ...imagesBase.item, ...palette.item }}>
387
+
<div style={{ ...imagesBase.media, ...palette.media, aspectRatio: aspect }}>
388
+
{url ? (
389
+
<img src={url} alt={alt} style={imagesBase.img} />
390
+
) : (
391
+
<div style={{ ...imagesBase.placeholder, ...palette.placeholder }}>
392
+
{loading ? 'Loading image…' : error ? 'Image failed to load' : 'Image unavailable'}
393
+
</div>
394
+
)}
395
+
</div>
396
+
{image.alt && image.alt.trim().length > 0 && (
397
+
<figcaption style={{ ...imagesBase.caption, ...palette.caption }}>{image.alt}</figcaption>
398
+
)}
399
+
</figure>
400
+
);
401
+
};
402
+
403
+
const imagesBase = {
404
+
container: {
405
+
display: 'grid',
406
+
gap: 8,
407
+
width: '100%'
408
+
} satisfies React.CSSProperties,
409
+
item: {
410
+
margin: 0,
411
+
display: 'flex',
412
+
flexDirection: 'column',
413
+
gap: 4
414
+
} satisfies React.CSSProperties,
415
+
media: {
416
+
position: 'relative',
417
+
width: '100%',
418
+
borderRadius: 12,
419
+
overflow: 'hidden'
420
+
} satisfies React.CSSProperties,
421
+
img: {
422
+
width: '100%',
423
+
height: '100%',
424
+
objectFit: 'cover'
425
+
} satisfies React.CSSProperties,
426
+
placeholder: {
427
+
display: 'flex',
428
+
alignItems: 'center',
429
+
justifyContent: 'center',
430
+
width: '100%',
431
+
height: '100%'
432
+
} satisfies React.CSSProperties,
433
+
caption: {
434
+
fontSize: 12,
435
+
lineHeight: 1.3
436
+
} satisfies React.CSSProperties
437
+
};
438
+
439
+
const imagesPalette = {
440
+
light: {
441
+
container: {
442
+
padding: 0
443
+
} satisfies React.CSSProperties,
444
+
item: {},
445
+
media: {
446
+
background: '#e2e8f0'
447
+
} satisfies React.CSSProperties,
448
+
placeholder: {
449
+
color: '#475569'
450
+
} satisfies React.CSSProperties,
451
+
caption: {
452
+
color: '#475569'
453
+
} satisfies React.CSSProperties
454
+
},
455
+
dark: {
456
+
container: {
457
+
padding: 0
458
+
} satisfies React.CSSProperties,
459
+
item: {},
460
+
media: {
461
+
background: '#1e293b'
462
+
} satisfies React.CSSProperties,
463
+
placeholder: {
464
+
color: '#cbd5f5'
465
+
} satisfies React.CSSProperties,
466
+
caption: {
467
+
color: '#94a3b8'
468
+
} satisfies React.CSSProperties
469
+
}
470
+
} as const;
471
+
472
+
export default BlueskyPostRenderer;
+190
lib/renderers/BlueskyProfileRenderer.tsx
+190
lib/renderers/BlueskyProfileRenderer.tsx
···
1
+
import React from 'react';
2
+
import type { ProfileRecord } from '../types/bluesky';
3
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
4
+
import { BlueskyIcon } from '../components/BlueskyIcon';
5
+
6
+
export interface BlueskyProfileRendererProps {
7
+
record: ProfileRecord;
8
+
loading: boolean;
9
+
error?: Error;
10
+
did: string;
11
+
handle?: string;
12
+
avatarUrl?: string;
13
+
colorScheme?: ColorSchemePreference;
14
+
}
15
+
16
+
export const BlueskyProfileRenderer: React.FC<BlueskyProfileRendererProps> = ({ record, loading, error, did, handle, avatarUrl, colorScheme = 'system' }) => {
17
+
const scheme = useColorScheme(colorScheme);
18
+
19
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load profile.</div>;
20
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
21
+
22
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
23
+
const profileUrl = `https://bsky.app/profile/${encodeURIComponent(did)}`;
24
+
const rawWebsite = record.website?.trim();
25
+
const websiteHref = rawWebsite ? (rawWebsite.match(/^https?:\/\//i) ? rawWebsite : `https://${rawWebsite}`) : undefined;
26
+
const websiteLabel = rawWebsite ? rawWebsite.replace(/^https?:\/\//i, '') : undefined;
27
+
28
+
return (
29
+
<div style={{ ...base.card, ...palette.card }}>
30
+
<div style={base.header}>
31
+
{avatarUrl ? <img src={avatarUrl} alt="avatar" style={base.avatarImg} /> : <div style={{ ...base.avatar, ...palette.avatar }} aria-label="avatar" />}
32
+
<div style={{ flex: 1 }}>
33
+
<div style={{ ...base.display, ...palette.display }}>{record.displayName ?? handle ?? did}</div>
34
+
<div style={{ ...base.handleLine, ...palette.handleLine }}>@{handle ?? did}</div>
35
+
{record.pronouns && <div style={{ ...base.pronouns, ...palette.pronouns }}>{record.pronouns}</div>}
36
+
</div>
37
+
</div>
38
+
{record.description && <p style={{ ...base.desc, ...palette.desc }}>{record.description}</p>}
39
+
{record.createdAt && <div style={{ ...base.meta, ...palette.meta }}>Joined {new Date(record.createdAt).toLocaleDateString()}</div>}
40
+
<div style={base.links}>
41
+
{websiteHref && websiteLabel && (
42
+
<a href={websiteHref} target="_blank" rel="noopener noreferrer" style={{ ...base.link, ...palette.link }}>
43
+
{websiteLabel}
44
+
</a>
45
+
)}
46
+
<a href={profileUrl} target="_blank" rel="noopener noreferrer" style={{ ...base.link, ...palette.link }}>
47
+
View on Bluesky
48
+
</a>
49
+
</div>
50
+
<div style={base.iconCorner} aria-hidden>
51
+
<BlueskyIcon size={18} />
52
+
</div>
53
+
</div>
54
+
);
55
+
};
56
+
57
+
const base: Record<string, React.CSSProperties> = {
58
+
card: {
59
+
borderRadius: 12,
60
+
padding: 16,
61
+
fontFamily: 'system-ui, sans-serif',
62
+
maxWidth: 480,
63
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease',
64
+
position: 'relative'
65
+
},
66
+
header: {
67
+
display: 'flex',
68
+
gap: 12,
69
+
marginBottom: 8
70
+
},
71
+
avatar: {
72
+
width: 64,
73
+
height: 64,
74
+
borderRadius: '50%'
75
+
},
76
+
avatarImg: {
77
+
width: 64,
78
+
height: 64,
79
+
borderRadius: '50%',
80
+
objectFit: 'cover'
81
+
},
82
+
display: {
83
+
fontSize: 20,
84
+
fontWeight: 600
85
+
},
86
+
handleLine: {
87
+
fontSize: 13
88
+
},
89
+
desc: {
90
+
whiteSpace: 'pre-wrap',
91
+
fontSize: 14,
92
+
lineHeight: 1.4
93
+
},
94
+
meta: {
95
+
marginTop: 12,
96
+
fontSize: 12
97
+
},
98
+
pronouns: {
99
+
display: 'inline-flex',
100
+
alignItems: 'center',
101
+
gap: 4,
102
+
fontSize: 12,
103
+
fontWeight: 500,
104
+
borderRadius: 999,
105
+
padding: '2px 8px',
106
+
marginTop: 6
107
+
},
108
+
links: {
109
+
display: 'flex',
110
+
flexDirection: 'column',
111
+
gap: 8,
112
+
marginTop: 12
113
+
},
114
+
link: {
115
+
display: 'inline-flex',
116
+
alignItems: 'center',
117
+
gap: 4,
118
+
fontSize: 12,
119
+
fontWeight: 600,
120
+
textDecoration: 'none'
121
+
},
122
+
iconCorner: {
123
+
position: 'absolute',
124
+
right: 12,
125
+
bottom: 12
126
+
}
127
+
};
128
+
129
+
const theme = {
130
+
light: {
131
+
card: {
132
+
border: '1px solid #e2e8f0',
133
+
background: '#ffffff',
134
+
color: '#0f172a'
135
+
},
136
+
avatar: {
137
+
background: '#cbd5e1'
138
+
},
139
+
display: {
140
+
color: '#0f172a'
141
+
},
142
+
handleLine: {
143
+
color: '#64748b'
144
+
},
145
+
desc: {
146
+
color: '#0f172a'
147
+
},
148
+
meta: {
149
+
color: '#94a3b8'
150
+
},
151
+
pronouns: {
152
+
background: '#e2e8f0',
153
+
color: '#1e293b'
154
+
},
155
+
link: {
156
+
color: '#2563eb'
157
+
}
158
+
},
159
+
dark: {
160
+
card: {
161
+
border: '1px solid #1e293b',
162
+
background: '#0b1120',
163
+
color: '#e2e8f0'
164
+
},
165
+
avatar: {
166
+
background: '#1e293b'
167
+
},
168
+
display: {
169
+
color: '#e2e8f0'
170
+
},
171
+
handleLine: {
172
+
color: '#cbd5f5'
173
+
},
174
+
desc: {
175
+
color: '#e2e8f0'
176
+
},
177
+
meta: {
178
+
color: '#a5b4fc'
179
+
},
180
+
pronouns: {
181
+
background: '#1e293b',
182
+
color: '#e2e8f0'
183
+
},
184
+
link: {
185
+
color: '#38bdf8'
186
+
}
187
+
}
188
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
189
+
190
+
export default BlueskyProfileRenderer;
+944
lib/renderers/LeafletDocumentRenderer.tsx
+944
lib/renderers/LeafletDocumentRenderer.tsx
···
1
+
import React, { useMemo, useRef } from 'react';
2
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
3
+
import { useDidHandle } from '../hooks/useDidHandle';
4
+
import { useBlob } from '../hooks/useBlob';
5
+
import { parseAtUri, formatDidForLabel, toBlueskyPostUrl, leafletRkeyUrl, normalizeLeafletBasePath } from '../utils/at-uri';
6
+
import { BlueskyPost } from '../components/BlueskyPost';
7
+
import type {
8
+
LeafletDocumentRecord,
9
+
LeafletLinearDocumentPage,
10
+
LeafletLinearDocumentBlock,
11
+
LeafletBlock,
12
+
LeafletTextBlock,
13
+
LeafletHeaderBlock,
14
+
LeafletBlockquoteBlock,
15
+
LeafletImageBlock,
16
+
LeafletUnorderedListBlock,
17
+
LeafletListItem,
18
+
LeafletWebsiteBlock,
19
+
LeafletIFrameBlock,
20
+
LeafletMathBlock,
21
+
LeafletCodeBlock,
22
+
LeafletBskyPostBlock,
23
+
LeafletAlignmentValue,
24
+
LeafletRichTextFacet,
25
+
LeafletRichTextFeature,
26
+
LeafletPublicationRecord
27
+
} from '../types/leaflet';
28
+
29
+
export interface LeafletDocumentRendererProps {
30
+
record: LeafletDocumentRecord;
31
+
loading: boolean;
32
+
error?: Error;
33
+
colorScheme?: ColorSchemePreference;
34
+
did: string;
35
+
rkey: string;
36
+
canonicalUrl?: string;
37
+
publicationBaseUrl?: string;
38
+
publicationRecord?: LeafletPublicationRecord;
39
+
}
40
+
41
+
export const LeafletDocumentRenderer: React.FC<LeafletDocumentRendererProps> = ({ record, loading, error, colorScheme = 'system', did, rkey, canonicalUrl, publicationBaseUrl, publicationRecord }) => {
42
+
const scheme = useColorScheme(colorScheme);
43
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
44
+
const authorDid = record.author?.startsWith('did:') ? record.author : undefined;
45
+
const publicationUri = useMemo(() => parseAtUri(record.publication), [record.publication]);
46
+
const postUrl = useMemo(() => {
47
+
const postRefUri = record.postRef?.uri;
48
+
if (!postRefUri) return undefined;
49
+
const parsed = parseAtUri(postRefUri);
50
+
return parsed ? toBlueskyPostUrl(parsed) : undefined;
51
+
}, [record.postRef?.uri]);
52
+
const { handle: publicationHandle } = useDidHandle(publicationUri?.did);
53
+
const fallbackAuthorLabel = useAuthorLabel(record.author, authorDid);
54
+
const resolvedPublicationLabel = publicationRecord?.name?.trim()
55
+
?? (publicationHandle ? `@${publicationHandle}` : publicationUri ? formatDidForLabel(publicationUri.did) : undefined);
56
+
const authorLabel = resolvedPublicationLabel ?? fallbackAuthorLabel;
57
+
const authorHref = publicationUri ? `https://bsky.app/profile/${publicationUri.did}` : undefined;
58
+
59
+
if (error) return <div style={{ padding: 12, color: 'crimson' }}>Failed to load leaflet.</div>;
60
+
if (loading && !record) return <div style={{ padding: 12 }}>Loading leaflet…</div>;
61
+
if (!record) return <div style={{ padding: 12, color: 'crimson' }}>Leaflet record missing.</div>;
62
+
63
+
const publishedAt = record.publishedAt ? new Date(record.publishedAt) : undefined;
64
+
const publishedLabel = publishedAt ? publishedAt.toLocaleString(undefined, { dateStyle: 'long', timeStyle: 'short' }) : undefined;
65
+
const fallbackLeafletUrl = `https://bsky.app/leaflet/${encodeURIComponent(did)}/${encodeURIComponent(rkey)}`;
66
+
const publicationRoot = publicationBaseUrl ?? (publicationRecord?.base_path ?? undefined);
67
+
const resolvedPublicationRoot = publicationRoot ? normalizeLeafletBasePath(publicationRoot) : undefined;
68
+
const publicationLeafletUrl = leafletRkeyUrl(publicationRoot, rkey);
69
+
const viewUrl = canonicalUrl ?? publicationLeafletUrl ?? postUrl ?? (publicationUri ? `https://bsky.app/profile/${publicationUri.did}` : undefined) ?? fallbackLeafletUrl;
70
+
71
+
const metaItems: React.ReactNode[] = [];
72
+
if (authorLabel) {
73
+
const authorNode = authorHref
74
+
? (
75
+
<a href={authorHref} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
76
+
{authorLabel}
77
+
</a>
78
+
)
79
+
: authorLabel;
80
+
metaItems.push(<span>By {authorNode}</span>);
81
+
}
82
+
if (publishedLabel) metaItems.push(<time dateTime={record.publishedAt}>{publishedLabel}</time>);
83
+
if (resolvedPublicationRoot) {
84
+
metaItems.push(
85
+
<a href={resolvedPublicationRoot} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
86
+
{resolvedPublicationRoot.replace(/^https?:\/\//, '')}
87
+
</a>
88
+
);
89
+
}
90
+
if (viewUrl) {
91
+
metaItems.push(
92
+
<a href={viewUrl} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
93
+
View source
94
+
</a>
95
+
);
96
+
}
97
+
98
+
return (
99
+
<article style={{ ...base.container, ...palette.container }}>
100
+
<header style={{ ...base.header, ...palette.header }}>
101
+
<div style={base.headerContent}>
102
+
<h1 style={{ ...base.title, ...palette.title }}>{record.title}</h1>
103
+
{record.description && (
104
+
<p style={{ ...base.subtitle, ...palette.subtitle }}>{record.description}</p>
105
+
)}
106
+
</div>
107
+
<div style={{ ...base.meta, ...palette.meta }}>
108
+
{metaItems.map((item, idx) => (
109
+
<React.Fragment key={`meta-${idx}`}>
110
+
{idx > 0 && <span style={palette.metaSeparator}>•</span>}
111
+
{item}
112
+
</React.Fragment>
113
+
))}
114
+
</div>
115
+
</header>
116
+
<div style={base.body}>
117
+
{record.pages?.map((page, pageIndex) => (
118
+
<LeafletPageRenderer
119
+
key={`page-${pageIndex}`}
120
+
page={page}
121
+
documentDid={did}
122
+
colorScheme={scheme}
123
+
/>
124
+
))}
125
+
</div>
126
+
</article>
127
+
);
128
+
};
129
+
130
+
const LeafletPageRenderer: React.FC<{ page: LeafletLinearDocumentPage; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ page, documentDid, colorScheme }) => {
131
+
if (!page.blocks?.length) return null;
132
+
return (
133
+
<div style={base.page}>
134
+
{page.blocks.map((blockWrapper, idx) => (
135
+
<LeafletBlockRenderer
136
+
key={`block-${idx}`}
137
+
wrapper={blockWrapper}
138
+
documentDid={documentDid}
139
+
colorScheme={colorScheme}
140
+
isFirst={idx === 0}
141
+
/>
142
+
))}
143
+
</div>
144
+
);
145
+
};
146
+
147
+
interface LeafletBlockRendererProps {
148
+
wrapper: LeafletLinearDocumentBlock;
149
+
documentDid: string;
150
+
colorScheme: 'light' | 'dark';
151
+
isFirst?: boolean;
152
+
}
153
+
154
+
const LeafletBlockRenderer: React.FC<LeafletBlockRendererProps> = ({ wrapper, documentDid, colorScheme, isFirst }) => {
155
+
const block = wrapper.block;
156
+
if (!block || !('$type' in block) || !block.$type) {
157
+
return null;
158
+
}
159
+
const alignment = alignmentValue(wrapper.alignment);
160
+
161
+
switch (block.$type) {
162
+
case 'pub.leaflet.blocks.header':
163
+
return <LeafletHeaderBlockView block={block} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
164
+
case 'pub.leaflet.blocks.blockquote':
165
+
return <LeafletBlockquoteBlockView block={block} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
166
+
case 'pub.leaflet.blocks.image':
167
+
return <LeafletImageBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
168
+
case 'pub.leaflet.blocks.unorderedList':
169
+
return <LeafletListBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
170
+
case 'pub.leaflet.blocks.website':
171
+
return <LeafletWebsiteBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
172
+
case 'pub.leaflet.blocks.iframe':
173
+
return <LeafletIframeBlockView block={block} alignment={alignment} />;
174
+
case 'pub.leaflet.blocks.math':
175
+
return <LeafletMathBlockView block={block} alignment={alignment} colorScheme={colorScheme} />;
176
+
case 'pub.leaflet.blocks.code':
177
+
return <LeafletCodeBlockView block={block} alignment={alignment} colorScheme={colorScheme} />;
178
+
case 'pub.leaflet.blocks.horizontalRule':
179
+
return <LeafletHorizontalRuleBlockView alignment={alignment} colorScheme={colorScheme} />;
180
+
case 'pub.leaflet.blocks.bskyPost':
181
+
return <LeafletBskyPostBlockView block={block} colorScheme={colorScheme} />;
182
+
case 'pub.leaflet.blocks.text':
183
+
default:
184
+
return <LeafletTextBlockView block={block as LeafletTextBlock} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
185
+
}
186
+
};
187
+
188
+
const LeafletTextBlockView: React.FC<{ block: LeafletTextBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
189
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
190
+
const textContent = block.plaintext ?? '';
191
+
if (!textContent.trim() && segments.length === 0) {
192
+
return null;
193
+
}
194
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
195
+
const style: React.CSSProperties = {
196
+
...base.paragraph,
197
+
...palette.paragraph,
198
+
...(alignment ? { textAlign: alignment } : undefined),
199
+
...(isFirst ? { marginTop: 0 } : undefined)
200
+
};
201
+
return (
202
+
<p style={style}>
203
+
{segments.map((segment, idx) => (
204
+
<React.Fragment key={`text-${idx}`}>
205
+
{renderSegment(segment, colorScheme)}
206
+
</React.Fragment>
207
+
))}
208
+
</p>
209
+
);
210
+
};
211
+
212
+
const LeafletHeaderBlockView: React.FC<{ block: LeafletHeaderBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
213
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
214
+
const level = block.level && block.level >= 1 && block.level <= 6 ? block.level : 2;
215
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
216
+
const normalizedLevel = Math.min(Math.max(level, 1), 6) as 1 | 2 | 3 | 4 | 5 | 6;
217
+
const headingTag = (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const)[normalizedLevel - 1];
218
+
const headingStyles = palette.heading[normalizedLevel];
219
+
const style: React.CSSProperties = {
220
+
...base.heading,
221
+
...headingStyles,
222
+
...(alignment ? { textAlign: alignment } : undefined),
223
+
...(isFirst ? { marginTop: 0 } : undefined)
224
+
};
225
+
226
+
return React.createElement(
227
+
headingTag,
228
+
{ style },
229
+
segments.map((segment, idx) => (
230
+
<React.Fragment key={`header-${idx}`}>
231
+
{renderSegment(segment, colorScheme)}
232
+
</React.Fragment>
233
+
))
234
+
);
235
+
};
236
+
237
+
const LeafletBlockquoteBlockView: React.FC<{ block: LeafletBlockquoteBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
238
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
239
+
const textContent = block.plaintext ?? '';
240
+
if (!textContent.trim() && segments.length === 0) {
241
+
return null;
242
+
}
243
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
244
+
return (
245
+
<blockquote style={{ ...base.blockquote, ...palette.blockquote, ...(alignment ? { textAlign: alignment } : undefined), ...(isFirst ? { marginTop: 0 } : undefined) }}>
246
+
{segments.map((segment, idx) => (
247
+
<React.Fragment key={`quote-${idx}`}>
248
+
{renderSegment(segment, colorScheme)}
249
+
</React.Fragment>
250
+
))}
251
+
</blockquote>
252
+
);
253
+
};
254
+
255
+
const LeafletImageBlockView: React.FC<{ block: LeafletImageBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
256
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
257
+
const cid = block.image?.ref?.$link ?? block.image?.cid;
258
+
const { url, loading, error } = useBlob(documentDid, cid);
259
+
const aspectRatio = block.aspectRatio?.height && block.aspectRatio?.width
260
+
? `${block.aspectRatio.width} / ${block.aspectRatio.height}`
261
+
: undefined;
262
+
263
+
return (
264
+
<figure style={{ ...base.figure, ...palette.figure, ...(alignment ? { textAlign: alignment } : undefined) }}>
265
+
<div style={{ ...base.imageWrapper, ...palette.imageWrapper, ...(aspectRatio ? { aspectRatio } : {}) }}>
266
+
{url && !error ? (
267
+
<img src={url} alt={block.alt ?? ''} style={{ ...base.image, ...palette.image }} />
268
+
) : (
269
+
<div style={{ ...base.imagePlaceholder, ...palette.imagePlaceholder }}>
270
+
{loading ? 'Loading image…' : error ? 'Image unavailable' : 'No image'}
271
+
</div>
272
+
)}
273
+
</div>
274
+
{block.alt && block.alt.trim().length > 0 && (
275
+
<figcaption style={{ ...base.caption, ...palette.caption }}>{block.alt}</figcaption>
276
+
)}
277
+
</figure>
278
+
);
279
+
};
280
+
281
+
const LeafletListBlockView: React.FC<{ block: LeafletUnorderedListBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
282
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
283
+
return (
284
+
<ul style={{ ...base.list, ...palette.list, ...(alignment ? { textAlign: alignment } : undefined) }}>
285
+
{block.children?.map((child, idx) => (
286
+
<LeafletListItemRenderer
287
+
key={`list-item-${idx}`}
288
+
item={child}
289
+
documentDid={documentDid}
290
+
colorScheme={colorScheme}
291
+
alignment={alignment}
292
+
/>
293
+
))}
294
+
</ul>
295
+
);
296
+
};
297
+
298
+
const LeafletListItemRenderer: React.FC<{ item: LeafletListItem; documentDid: string; colorScheme: 'light' | 'dark'; alignment?: React.CSSProperties['textAlign'] }> = ({ item, documentDid, colorScheme, alignment }) => {
299
+
return (
300
+
<li style={{ ...base.listItem, ...(alignment ? { textAlign: alignment } : undefined) }}>
301
+
<div>
302
+
<LeafletInlineBlock block={item.content} colorScheme={colorScheme} documentDid={documentDid} alignment={alignment} />
303
+
</div>
304
+
{item.children && item.children.length > 0 && (
305
+
<ul style={{ ...base.nestedList, ...(alignment ? { textAlign: alignment } : undefined) }}>
306
+
{item.children.map((child, idx) => (
307
+
<LeafletListItemRenderer key={`nested-${idx}`} item={child} documentDid={documentDid} colorScheme={colorScheme} alignment={alignment} />
308
+
))}
309
+
</ul>
310
+
)}
311
+
</li>
312
+
);
313
+
};
314
+
315
+
const LeafletInlineBlock: React.FC<{ block: LeafletBlock; colorScheme: 'light' | 'dark'; documentDid: string; alignment?: React.CSSProperties['textAlign'] }> = ({ block, colorScheme, documentDid, alignment }) => {
316
+
switch (block.$type) {
317
+
case 'pub.leaflet.blocks.header':
318
+
return <LeafletHeaderBlockView block={block as LeafletHeaderBlock} colorScheme={colorScheme} alignment={alignment} />;
319
+
case 'pub.leaflet.blocks.blockquote':
320
+
return <LeafletBlockquoteBlockView block={block as LeafletBlockquoteBlock} colorScheme={colorScheme} alignment={alignment} />;
321
+
case 'pub.leaflet.blocks.image':
322
+
return <LeafletImageBlockView block={block as LeafletImageBlock} documentDid={documentDid} colorScheme={colorScheme} alignment={alignment} />;
323
+
default:
324
+
return <LeafletTextBlockView block={block as LeafletTextBlock} colorScheme={colorScheme} alignment={alignment} />;
325
+
}
326
+
};
327
+
328
+
const LeafletWebsiteBlockView: React.FC<{ block: LeafletWebsiteBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
329
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
330
+
const previewCid = block.previewImage?.ref?.$link ?? block.previewImage?.cid;
331
+
const { url, loading, error } = useBlob(documentDid, previewCid);
332
+
333
+
return (
334
+
<a href={block.src} target="_blank" rel="noopener noreferrer" style={{ ...base.linkCard, ...palette.linkCard, ...(alignment ? { textAlign: alignment } : undefined) }}>
335
+
{url && !error ? (
336
+
<img src={url} alt={block.title ?? 'Website preview'} style={{ ...base.linkPreview, ...palette.linkPreview }} />
337
+
) : (
338
+
<div style={{ ...base.linkPreviewPlaceholder, ...palette.linkPreviewPlaceholder }}>
339
+
{loading ? 'Loading preview…' : 'Open link'}
340
+
</div>
341
+
)}
342
+
<div style={base.linkContent}>
343
+
{block.title && <strong style={palette.linkTitle}>{block.title}</strong>}
344
+
{block.description && <p style={palette.linkDescription}>{block.description}</p>}
345
+
<span style={palette.linkUrl}>{block.src}</span>
346
+
</div>
347
+
</a>
348
+
);
349
+
};
350
+
351
+
const LeafletIframeBlockView: React.FC<{ block: LeafletIFrameBlock; alignment?: React.CSSProperties['textAlign'] }> = ({ block, alignment }) => {
352
+
return (
353
+
<div style={{ ...(alignment ? { textAlign: alignment } : undefined) }}>
354
+
<iframe
355
+
src={block.url}
356
+
title={block.url}
357
+
style={{ ...base.iframe, ...(block.height ? { height: Math.min(Math.max(block.height, 120), 800) } : {}) }}
358
+
loading="lazy"
359
+
allowFullScreen
360
+
/>
361
+
</div>
362
+
);
363
+
};
364
+
365
+
const LeafletMathBlockView: React.FC<{ block: LeafletMathBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ block, alignment, colorScheme }) => {
366
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
367
+
return (
368
+
<pre style={{ ...base.math, ...palette.math, ...(alignment ? { textAlign: alignment } : undefined) }}>{block.tex}</pre>
369
+
);
370
+
};
371
+
372
+
const LeafletCodeBlockView: React.FC<{ block: LeafletCodeBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ block, alignment, colorScheme }) => {
373
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
374
+
const codeRef = useRef<HTMLElement | null>(null);
375
+
const langClass = block.language ? `language-${block.language.toLowerCase()}` : undefined;
376
+
return (
377
+
<pre style={{ ...base.code, ...palette.code, ...(alignment ? { textAlign: alignment } : undefined) }}>
378
+
<code ref={codeRef} className={langClass}>{block.plaintext}</code>
379
+
</pre>
380
+
);
381
+
};
382
+
383
+
const LeafletHorizontalRuleBlockView: React.FC<{ alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ alignment, colorScheme }) => {
384
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
385
+
return <hr style={{ ...base.hr, ...palette.hr, marginLeft: alignment ? 'auto' : undefined, marginRight: alignment ? 'auto' : undefined }} />;
386
+
};
387
+
388
+
const LeafletBskyPostBlockView: React.FC<{ block: LeafletBskyPostBlock; colorScheme: 'light' | 'dark' }> = ({ block, colorScheme }) => {
389
+
const parsed = parseAtUri(block.postRef?.uri);
390
+
if (!parsed) {
391
+
return <div style={base.embedFallback}>Referenced post unavailable.</div>;
392
+
}
393
+
return <BlueskyPost did={parsed.did} rkey={parsed.rkey} colorScheme={colorScheme} iconPlacement="linkInline" />;
394
+
};
395
+
396
+
function alignmentValue(value?: LeafletAlignmentValue): React.CSSProperties['textAlign'] | undefined {
397
+
if (!value) return undefined;
398
+
let normalized = value.startsWith('#') ? value.slice(1) : value;
399
+
if (normalized.includes('#')) {
400
+
normalized = normalized.split('#').pop() ?? normalized;
401
+
}
402
+
if (normalized.startsWith('lex:')) {
403
+
normalized = normalized.split(':').pop() ?? normalized;
404
+
}
405
+
switch (normalized) {
406
+
case 'textAlignLeft':
407
+
return 'left';
408
+
case 'textAlignCenter':
409
+
return 'center';
410
+
case 'textAlignRight':
411
+
return 'right';
412
+
case 'textAlignJustify':
413
+
return 'justify';
414
+
default:
415
+
return undefined;
416
+
}
417
+
}
418
+
419
+
function useAuthorLabel(author: string | undefined, authorDid: string | undefined): string | undefined {
420
+
const { handle } = useDidHandle(authorDid);
421
+
if (!author) return undefined;
422
+
if (handle) return `@${handle}`;
423
+
if (authorDid) return formatDidForLabel(authorDid);
424
+
return author;
425
+
}
426
+
427
+
interface Segment {
428
+
text: string;
429
+
features: LeafletRichTextFeature[];
430
+
}
431
+
432
+
function createFacetedSegments(plaintext: string, facets?: LeafletRichTextFacet[]): Segment[] {
433
+
if (!facets?.length) {
434
+
return [{ text: plaintext, features: [] }];
435
+
}
436
+
const prefix = buildBytePrefix(plaintext);
437
+
const startEvents = new Map<number, LeafletRichTextFeature[]>();
438
+
const endEvents = new Map<number, LeafletRichTextFeature[]>();
439
+
const boundaries = new Set<number>([0, prefix.length - 1]);
440
+
for (const facet of facets) {
441
+
const { byteStart, byteEnd } = facet.index ?? {};
442
+
if (typeof byteStart !== 'number' || typeof byteEnd !== 'number' || byteStart >= byteEnd) continue;
443
+
const start = byteOffsetToCharIndex(prefix, byteStart);
444
+
const end = byteOffsetToCharIndex(prefix, byteEnd);
445
+
if (start >= end) continue;
446
+
boundaries.add(start);
447
+
boundaries.add(end);
448
+
if (facet.features?.length) {
449
+
startEvents.set(start, [...(startEvents.get(start) ?? []), ...facet.features]);
450
+
endEvents.set(end, [...(endEvents.get(end) ?? []), ...facet.features]);
451
+
}
452
+
}
453
+
const sortedBounds = [...boundaries].sort((a, b) => a - b);
454
+
const segments: Segment[] = [];
455
+
let active: LeafletRichTextFeature[] = [];
456
+
for (let i = 0; i < sortedBounds.length - 1; i++) {
457
+
const boundary = sortedBounds[i];
458
+
const next = sortedBounds[i + 1];
459
+
const endFeatures = endEvents.get(boundary);
460
+
if (endFeatures?.length) {
461
+
active = active.filter((feature) => !endFeatures.includes(feature));
462
+
}
463
+
const startFeatures = startEvents.get(boundary);
464
+
if (startFeatures?.length) {
465
+
active = [...active, ...startFeatures];
466
+
}
467
+
if (boundary === next) continue;
468
+
const text = sliceByCharRange(plaintext, boundary, next);
469
+
segments.push({ text, features: active.slice() });
470
+
}
471
+
return segments;
472
+
}
473
+
474
+
function buildBytePrefix(text: string): number[] {
475
+
const encoder = new TextEncoder();
476
+
const prefix: number[] = [0];
477
+
let byteCount = 0;
478
+
for (let i = 0; i < text.length;) {
479
+
const codePoint = text.codePointAt(i)!;
480
+
const char = String.fromCodePoint(codePoint);
481
+
const encoded = encoder.encode(char);
482
+
byteCount += encoded.length;
483
+
prefix.push(byteCount);
484
+
i += codePoint > 0xffff ? 2 : 1;
485
+
}
486
+
return prefix;
487
+
}
488
+
489
+
function byteOffsetToCharIndex(prefix: number[], byteOffset: number): number {
490
+
for (let i = 0; i < prefix.length; i++) {
491
+
if (prefix[i] === byteOffset) return i;
492
+
if (prefix[i] > byteOffset) return Math.max(0, i - 1);
493
+
}
494
+
return prefix.length - 1;
495
+
}
496
+
497
+
function sliceByCharRange(text: string, start: number, end: number): string {
498
+
if (start <= 0 && end >= text.length) return text;
499
+
let result = '';
500
+
let charIndex = 0;
501
+
for (let i = 0; i < text.length && charIndex < end;) {
502
+
const codePoint = text.codePointAt(i)!;
503
+
const char = String.fromCodePoint(codePoint);
504
+
if (charIndex >= start && charIndex < end) result += char;
505
+
i += codePoint > 0xffff ? 2 : 1;
506
+
charIndex++;
507
+
}
508
+
return result;
509
+
}
510
+
511
+
function renderSegment(segment: Segment, colorScheme: 'light' | 'dark'): React.ReactNode {
512
+
const parts = segment.text.split('\n');
513
+
return parts.flatMap((part, idx) => {
514
+
const key = `${segment.text}-${idx}-${part.length}`;
515
+
const wrapped = applyFeatures(part.length ? part : '\u00a0', segment.features, key, colorScheme);
516
+
if (idx === parts.length - 1) return wrapped;
517
+
return [wrapped, <br key={`${key}-br`} />];
518
+
});
519
+
}
520
+
521
+
function applyFeatures(content: React.ReactNode, features: LeafletRichTextFeature[], key: string, colorScheme: 'light' | 'dark'): React.ReactNode {
522
+
if (!features?.length) return <React.Fragment key={key}>{content}</React.Fragment>;
523
+
return (
524
+
<React.Fragment key={key}>
525
+
{features.reduce<React.ReactNode>((child, feature, idx) => wrapFeature(child, feature, `${key}-feature-${idx}`, colorScheme), content)}
526
+
</React.Fragment>
527
+
);
528
+
}
529
+
530
+
function wrapFeature(child: React.ReactNode, feature: LeafletRichTextFeature, key: string, colorScheme: 'light' | 'dark'): React.ReactNode {
531
+
switch (feature.$type) {
532
+
case 'pub.leaflet.richtext.facet#link':
533
+
return <a key={key} href={feature.uri} target="_blank" rel="noopener noreferrer" style={linkStyles[colorScheme]}>{child}</a>;
534
+
case 'pub.leaflet.richtext.facet#code':
535
+
return <code key={key} style={inlineCodeStyles[colorScheme]}>{child}</code>;
536
+
case 'pub.leaflet.richtext.facet#highlight':
537
+
return <mark key={key} style={highlightStyles[colorScheme]}>{child}</mark>;
538
+
case 'pub.leaflet.richtext.facet#underline':
539
+
return <span key={key} style={{ textDecoration: 'underline' }}>{child}</span>;
540
+
case 'pub.leaflet.richtext.facet#strikethrough':
541
+
return <span key={key} style={{ textDecoration: 'line-through' }}>{child}</span>;
542
+
case 'pub.leaflet.richtext.facet#bold':
543
+
return <strong key={key}>{child}</strong>;
544
+
case 'pub.leaflet.richtext.facet#italic':
545
+
return <em key={key}>{child}</em>;
546
+
case 'pub.leaflet.richtext.facet#id':
547
+
return <span key={key} id={feature.id}>{child}</span>;
548
+
default:
549
+
return <span key={key}>{child}</span>;
550
+
}
551
+
}
552
+
553
+
const base: Record<string, React.CSSProperties> = {
554
+
container: {
555
+
display: 'flex',
556
+
flexDirection: 'column',
557
+
gap: 24,
558
+
padding: '24px 28px',
559
+
borderRadius: 20,
560
+
border: '1px solid transparent',
561
+
maxWidth: 720,
562
+
width: '100%',
563
+
fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
564
+
},
565
+
header: {
566
+
display: 'flex',
567
+
flexDirection: 'column',
568
+
gap: 16
569
+
},
570
+
headerContent: {
571
+
display: 'flex',
572
+
flexDirection: 'column',
573
+
gap: 8
574
+
},
575
+
title: {
576
+
fontSize: 32,
577
+
margin: 0,
578
+
lineHeight: 1.15
579
+
},
580
+
subtitle: {
581
+
margin: 0,
582
+
fontSize: 16,
583
+
lineHeight: 1.5
584
+
},
585
+
meta: {
586
+
display: 'flex',
587
+
flexWrap: 'wrap',
588
+
gap: 8,
589
+
alignItems: 'center',
590
+
fontSize: 14
591
+
},
592
+
body: {
593
+
display: 'flex',
594
+
flexDirection: 'column',
595
+
gap: 18
596
+
},
597
+
page: {
598
+
display: 'flex',
599
+
flexDirection: 'column',
600
+
gap: 18
601
+
},
602
+
paragraph: {
603
+
margin: '1em 0 0',
604
+
lineHeight: 1.65,
605
+
fontSize: 16
606
+
},
607
+
heading: {
608
+
margin: '0.5em 0 0',
609
+
fontWeight: 700
610
+
},
611
+
blockquote: {
612
+
margin: '1em 0 0',
613
+
padding: '0.6em 1em',
614
+
borderLeft: '4px solid'
615
+
},
616
+
figure: {
617
+
margin: '1.2em 0 0',
618
+
display: 'flex',
619
+
flexDirection: 'column',
620
+
gap: 12
621
+
},
622
+
imageWrapper: {
623
+
borderRadius: 16,
624
+
overflow: 'hidden',
625
+
width: '100%',
626
+
position: 'relative',
627
+
background: '#e2e8f0'
628
+
},
629
+
image: {
630
+
width: '100%',
631
+
height: '100%',
632
+
objectFit: 'cover',
633
+
display: 'block'
634
+
},
635
+
imagePlaceholder: {
636
+
width: '100%',
637
+
padding: '24px 16px',
638
+
textAlign: 'center'
639
+
},
640
+
caption: {
641
+
fontSize: 13,
642
+
lineHeight: 1.4
643
+
},
644
+
list: {
645
+
paddingLeft: 28,
646
+
margin: '1em 0 0',
647
+
listStyleType: 'disc',
648
+
listStylePosition: 'outside'
649
+
},
650
+
nestedList: {
651
+
paddingLeft: 20,
652
+
marginTop: 8,
653
+
listStyleType: 'circle',
654
+
listStylePosition: 'outside'
655
+
},
656
+
listItem: {
657
+
marginTop: 8,
658
+
display: 'list-item'
659
+
},
660
+
linkCard: {
661
+
borderRadius: 16,
662
+
border: '1px solid',
663
+
display: 'flex',
664
+
flexDirection: 'column',
665
+
overflow: 'hidden',
666
+
textDecoration: 'none'
667
+
},
668
+
linkPreview: {
669
+
width: '100%',
670
+
height: 180,
671
+
objectFit: 'cover'
672
+
},
673
+
linkPreviewPlaceholder: {
674
+
width: '100%',
675
+
height: 180,
676
+
display: 'flex',
677
+
alignItems: 'center',
678
+
justifyContent: 'center',
679
+
fontSize: 14
680
+
},
681
+
linkContent: {
682
+
display: 'flex',
683
+
flexDirection: 'column',
684
+
gap: 6,
685
+
padding: '16px 18px'
686
+
},
687
+
iframe: {
688
+
width: '100%',
689
+
height: 360,
690
+
border: '1px solid #cbd5f5',
691
+
borderRadius: 16
692
+
},
693
+
math: {
694
+
margin: '1em 0 0',
695
+
padding: '14px 16px',
696
+
borderRadius: 12,
697
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
698
+
overflowX: 'auto'
699
+
},
700
+
code: {
701
+
margin: '1em 0 0',
702
+
padding: '14px 16px',
703
+
borderRadius: 12,
704
+
overflowX: 'auto',
705
+
fontSize: 14
706
+
},
707
+
hr: {
708
+
border: 0,
709
+
borderTop: '1px solid',
710
+
margin: '24px 0 0'
711
+
},
712
+
embedFallback: {
713
+
padding: '12px 16px',
714
+
borderRadius: 12,
715
+
border: '1px solid #e2e8f0',
716
+
fontSize: 14
717
+
}
718
+
};
719
+
720
+
const theme = {
721
+
light: {
722
+
container: {
723
+
background: '#ffffff',
724
+
borderColor: '#e2e8f0',
725
+
color: '#0f172a',
726
+
boxShadow: '0 4px 18px rgba(15, 23, 42, 0.06)'
727
+
},
728
+
header: {},
729
+
title: {
730
+
color: '#0f172a'
731
+
},
732
+
subtitle: {
733
+
color: '#475569'
734
+
},
735
+
meta: {
736
+
color: '#64748b'
737
+
},
738
+
metaLink: {
739
+
color: '#2563eb',
740
+
textDecoration: 'none'
741
+
} satisfies React.CSSProperties,
742
+
metaSeparator: {
743
+
margin: '0 4px'
744
+
} satisfies React.CSSProperties,
745
+
paragraph: {
746
+
color: '#1f2937'
747
+
},
748
+
heading: {
749
+
1: { color: '#0f172a', fontSize: 30 },
750
+
2: { color: '#0f172a', fontSize: 28 },
751
+
3: { color: '#0f172a', fontSize: 24 },
752
+
4: { color: '#0f172a', fontSize: 20 },
753
+
5: { color: '#0f172a', fontSize: 18 },
754
+
6: { color: '#0f172a', fontSize: 16 }
755
+
} satisfies Record<number, React.CSSProperties>,
756
+
blockquote: {
757
+
background: '#f8fafc',
758
+
borderColor: '#cbd5f5',
759
+
color: '#1f2937'
760
+
},
761
+
figure: {},
762
+
imageWrapper: {
763
+
background: '#e2e8f0'
764
+
},
765
+
image: {},
766
+
imagePlaceholder: {
767
+
color: '#475569'
768
+
},
769
+
caption: {
770
+
color: '#475569'
771
+
},
772
+
list: {
773
+
color: '#1f2937'
774
+
},
775
+
linkCard: {
776
+
borderColor: '#e2e8f0',
777
+
background: '#f8fafc',
778
+
color: '#0f172a'
779
+
},
780
+
linkPreview: {},
781
+
linkPreviewPlaceholder: {
782
+
background: '#e2e8f0',
783
+
color: '#475569'
784
+
},
785
+
linkTitle: {
786
+
fontSize: 16,
787
+
color: '#0f172a'
788
+
} satisfies React.CSSProperties,
789
+
linkDescription: {
790
+
margin: 0,
791
+
fontSize: 14,
792
+
color: '#475569',
793
+
lineHeight: 1.5
794
+
} satisfies React.CSSProperties,
795
+
linkUrl: {
796
+
fontSize: 13,
797
+
color: '#2563eb',
798
+
wordBreak: 'break-all'
799
+
} satisfies React.CSSProperties,
800
+
math: {
801
+
background: '#f1f5f9',
802
+
color: '#1f2937',
803
+
border: '1px solid #e2e8f0'
804
+
},
805
+
code: {
806
+
background: '#0f172a',
807
+
color: '#e2e8f0'
808
+
},
809
+
hr: {
810
+
borderColor: '#e2e8f0'
811
+
}
812
+
},
813
+
dark: {
814
+
container: {
815
+
background: 'rgba(15, 23, 42, 0.6)',
816
+
borderColor: 'rgba(148, 163, 184, 0.3)',
817
+
color: '#e2e8f0',
818
+
backdropFilter: 'blur(8px)',
819
+
boxShadow: '0 10px 40px rgba(2, 6, 23, 0.45)'
820
+
},
821
+
header: {},
822
+
title: {
823
+
color: '#f8fafc'
824
+
},
825
+
subtitle: {
826
+
color: '#cbd5f5'
827
+
},
828
+
meta: {
829
+
color: '#94a3b8'
830
+
},
831
+
metaLink: {
832
+
color: '#38bdf8',
833
+
textDecoration: 'none'
834
+
} satisfies React.CSSProperties,
835
+
metaSeparator: {
836
+
margin: '0 4px'
837
+
} satisfies React.CSSProperties,
838
+
paragraph: {
839
+
color: '#e2e8f0'
840
+
},
841
+
heading: {
842
+
1: { color: '#f8fafc', fontSize: 30 },
843
+
2: { color: '#f8fafc', fontSize: 28 },
844
+
3: { color: '#f8fafc', fontSize: 24 },
845
+
4: { color: '#e2e8f0', fontSize: 20 },
846
+
5: { color: '#e2e8f0', fontSize: 18 },
847
+
6: { color: '#e2e8f0', fontSize: 16 }
848
+
} satisfies Record<number, React.CSSProperties>,
849
+
blockquote: {
850
+
background: 'rgba(30, 41, 59, 0.6)',
851
+
borderColor: '#38bdf8',
852
+
color: '#e2e8f0'
853
+
},
854
+
figure: {},
855
+
imageWrapper: {
856
+
background: '#1e293b'
857
+
},
858
+
image: {},
859
+
imagePlaceholder: {
860
+
color: '#94a3b8'
861
+
},
862
+
caption: {
863
+
color: '#94a3b8'
864
+
},
865
+
list: {
866
+
color: '#f1f5f9'
867
+
},
868
+
linkCard: {
869
+
borderColor: 'rgba(148, 163, 184, 0.3)',
870
+
background: 'rgba(15, 23, 42, 0.8)',
871
+
color: '#e2e8f0'
872
+
},
873
+
linkPreview: {},
874
+
linkPreviewPlaceholder: {
875
+
background: '#1e293b',
876
+
color: '#94a3b8'
877
+
},
878
+
linkTitle: {
879
+
fontSize: 16,
880
+
color: '#e0f2fe'
881
+
} satisfies React.CSSProperties,
882
+
linkDescription: {
883
+
margin: 0,
884
+
fontSize: 14,
885
+
color: '#cbd5f5',
886
+
lineHeight: 1.5
887
+
} satisfies React.CSSProperties,
888
+
linkUrl: {
889
+
fontSize: 13,
890
+
color: '#38bdf8',
891
+
wordBreak: 'break-all'
892
+
} satisfies React.CSSProperties,
893
+
math: {
894
+
background: 'rgba(15, 23, 42, 0.8)',
895
+
color: '#e2e8f0',
896
+
border: '1px solid rgba(148, 163, 184, 0.35)'
897
+
},
898
+
code: {
899
+
background: '#020617',
900
+
color: '#e2e8f0'
901
+
},
902
+
hr: {
903
+
borderColor: 'rgba(148, 163, 184, 0.3)'
904
+
}
905
+
}
906
+
} as const;
907
+
908
+
const linkStyles = {
909
+
light: {
910
+
color: '#2563eb',
911
+
textDecoration: 'underline'
912
+
} satisfies React.CSSProperties,
913
+
dark: {
914
+
color: '#38bdf8',
915
+
textDecoration: 'underline'
916
+
} satisfies React.CSSProperties
917
+
} as const;
918
+
919
+
const inlineCodeStyles = {
920
+
light: {
921
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
922
+
background: '#f1f5f9',
923
+
padding: '0 4px',
924
+
borderRadius: 4
925
+
} satisfies React.CSSProperties,
926
+
dark: {
927
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
928
+
background: '#1e293b',
929
+
padding: '0 4px',
930
+
borderRadius: 4
931
+
} satisfies React.CSSProperties
932
+
} as const;
933
+
934
+
const highlightStyles = {
935
+
light: {
936
+
background: '#fef08a'
937
+
} satisfies React.CSSProperties,
938
+
dark: {
939
+
background: '#facc15',
940
+
color: '#0f172a'
941
+
} satisfies React.CSSProperties
942
+
} as const;
943
+
944
+
export default LeafletDocumentRenderer;
+166
lib/renderers/TangledStringRenderer.tsx
+166
lib/renderers/TangledStringRenderer.tsx
···
1
+
import React from 'react';
2
+
import type { ShTangledString } from '@atcute/tangled';
3
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
4
+
5
+
export type TangledStringRecord = ShTangledString.Main;
6
+
7
+
export interface TangledStringRendererProps {
8
+
record: TangledStringRecord;
9
+
error?: Error;
10
+
loading: boolean;
11
+
colorScheme?: ColorSchemePreference;
12
+
did: string;
13
+
rkey: string;
14
+
canonicalUrl?: string;
15
+
}
16
+
17
+
export const TangledStringRenderer: React.FC<TangledStringRendererProps> = ({ record, error, loading, colorScheme = 'system', did, rkey, canonicalUrl }) => {
18
+
const scheme = useColorScheme(colorScheme);
19
+
20
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load snippet.</div>;
21
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
22
+
23
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
24
+
const viewUrl = canonicalUrl ?? `https://tangled.org/strings/${did}/${encodeURIComponent(rkey)}`;
25
+
const timestamp = new Date(record.createdAt).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });
26
+
return (
27
+
<div style={{ ...base.container, ...palette.container }}>
28
+
<div style={{ ...base.header, ...palette.header }}>
29
+
<strong style={{ ...base.filename, ...palette.filename }}>{record.filename}</strong>
30
+
<div style={{ ...base.headerRight, ...palette.headerRight }}>
31
+
<time style={{ ...base.timestamp, ...palette.timestamp }} dateTime={record.createdAt}>{timestamp}</time>
32
+
<a href={viewUrl} target="_blank" rel="noopener noreferrer" style={{ ...base.headerLink, ...palette.headerLink }}>
33
+
View on Tangled
34
+
</a>
35
+
</div>
36
+
</div>
37
+
{record.description && (
38
+
<div style={{ ...base.description, ...palette.description }}>{record.description}</div>
39
+
)}
40
+
<pre style={{ ...base.codeBlock, ...palette.codeBlock }}>
41
+
<code>{record.contents}</code>
42
+
</pre>
43
+
</div>
44
+
);
45
+
};
46
+
47
+
const base: Record<string, React.CSSProperties> = {
48
+
container: {
49
+
fontFamily: 'system-ui, sans-serif',
50
+
borderRadius: 6,
51
+
overflow: 'hidden',
52
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease, box-shadow 180ms ease',
53
+
width: '100%'
54
+
},
55
+
header: {
56
+
padding: '10px 16px',
57
+
display: 'flex',
58
+
justifyContent: 'space-between',
59
+
alignItems: 'center',
60
+
gap: 12
61
+
},
62
+
headerRight: {
63
+
display: 'flex',
64
+
alignItems: 'center',
65
+
gap: 12,
66
+
flexWrap: 'wrap',
67
+
justifyContent: 'flex-end'
68
+
},
69
+
filename: {
70
+
fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace',
71
+
fontSize: 13,
72
+
wordBreak: 'break-all'
73
+
},
74
+
timestamp: {
75
+
fontSize: 12
76
+
},
77
+
headerLink: {
78
+
fontSize: 12,
79
+
fontWeight: 600,
80
+
textDecoration: 'none'
81
+
},
82
+
description: {
83
+
padding: '10px 16px',
84
+
fontSize: 13,
85
+
borderTop: '1px solid transparent'
86
+
},
87
+
codeBlock: {
88
+
margin: 0,
89
+
padding: '16px',
90
+
fontSize: 13,
91
+
overflowX: 'auto',
92
+
borderTop: '1px solid transparent',
93
+
fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace'
94
+
}
95
+
};
96
+
97
+
const theme = {
98
+
light: {
99
+
container: {
100
+
border: '1px solid #d0d7de',
101
+
background: '#f6f8fa',
102
+
color: '#1f2328',
103
+
boxShadow: '0 1px 2px rgba(31,35,40,0.05)'
104
+
},
105
+
header: {
106
+
background: '#f6f8fa',
107
+
borderBottom: '1px solid #d0d7de'
108
+
},
109
+
headerRight: {},
110
+
filename: {
111
+
color: '#1f2328'
112
+
},
113
+
timestamp: {
114
+
color: '#57606a'
115
+
},
116
+
headerLink: {
117
+
color: '#2563eb'
118
+
},
119
+
description: {
120
+
background: '#ffffff',
121
+
borderBottom: '1px solid #d0d7de',
122
+
borderTopColor: '#d0d7de',
123
+
color: '#1f2328'
124
+
},
125
+
codeBlock: {
126
+
background: '#ffffff',
127
+
color: '#1f2328',
128
+
borderTopColor: '#d0d7de'
129
+
}
130
+
},
131
+
dark: {
132
+
container: {
133
+
border: '1px solid #30363d',
134
+
background: '#0d1117',
135
+
color: '#c9d1d9',
136
+
boxShadow: '0 0 0 1px rgba(1,4,9,0.3) inset'
137
+
},
138
+
header: {
139
+
background: '#161b22',
140
+
borderBottom: '1px solid #30363d'
141
+
},
142
+
headerRight: {},
143
+
filename: {
144
+
color: '#c9d1d9'
145
+
},
146
+
timestamp: {
147
+
color: '#8b949e'
148
+
},
149
+
headerLink: {
150
+
color: '#58a6ff'
151
+
},
152
+
description: {
153
+
background: '#161b22',
154
+
borderBottom: '1px solid #30363d',
155
+
borderTopColor: '#30363d',
156
+
color: '#c9d1d9'
157
+
},
158
+
codeBlock: {
159
+
background: '#0d1117',
160
+
color: '#c9d1d9',
161
+
borderTopColor: '#30363d'
162
+
}
163
+
}
164
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
165
+
166
+
export default TangledStringRenderer;
+120
lib/styles/highlight.css
+120
lib/styles/highlight.css
···
1
+
:root {
2
+
--hljs-foreground: #1f2328;
3
+
--hljs-background: transparent;
4
+
--hljs-comment: #6e7781;
5
+
--hljs-keyword: #cf222e;
6
+
--hljs-attr: #0550ae;
7
+
--hljs-string: #0a3069;
8
+
--hljs-title: #24292f;
9
+
--hljs-number: #953800;
10
+
--hljs-addition: #116329;
11
+
--hljs-deletion: #cf222e;
12
+
}
13
+
14
+
:root[data-color-scheme='light'],
15
+
[data-color-scheme='light'] {
16
+
--hljs-foreground: #1f2328;
17
+
--hljs-background: rgba(15, 23, 42, 0.03);
18
+
--hljs-comment: #6e7781;
19
+
--hljs-keyword: #0f59d1;
20
+
--hljs-attr: #1d4ed8;
21
+
--hljs-string: #0f766e;
22
+
--hljs-title: #1f2937;
23
+
--hljs-number: #b45309;
24
+
--hljs-addition: #15803d;
25
+
--hljs-deletion: #dc2626;
26
+
}
27
+
28
+
:root[data-color-scheme='dark'],
29
+
[data-color-scheme='dark'] {
30
+
--hljs-foreground: #c9d1d9;
31
+
--hljs-background: rgba(8, 16, 32, 0.55);
32
+
--hljs-comment: #8b949e;
33
+
--hljs-keyword: #ff7b72;
34
+
--hljs-attr: #79c0ff;
35
+
--hljs-string: #a5d6ff;
36
+
--hljs-title: #d2a8ff;
37
+
--hljs-number: #ffa657;
38
+
--hljs-addition: #1a7f37;
39
+
--hljs-deletion: #ff7b72;
40
+
}
41
+
42
+
:root:not([data-color-scheme]),
43
+
[data-color-scheme]:not([data-color-scheme='light']):not([data-color-scheme='dark']) {
44
+
--hljs-foreground: #1f2328;
45
+
--hljs-background: transparent;
46
+
--hljs-comment: #6e7781;
47
+
--hljs-keyword: #cf222e;
48
+
--hljs-attr: #0550ae;
49
+
--hljs-string: #0a3069;
50
+
--hljs-title: #24292f;
51
+
--hljs-number: #953800;
52
+
--hljs-addition: #116329;
53
+
--hljs-deletion: #cf222e;
54
+
}
55
+
56
+
.hljs {
57
+
display: block;
58
+
overflow-x: auto;
59
+
padding: 0;
60
+
background: var(--hljs-background);
61
+
color: var(--hljs-foreground);
62
+
}
63
+
64
+
.hljs-comment,
65
+
.hljs-quote {
66
+
color: var(--hljs-comment);
67
+
font-style: italic;
68
+
}
69
+
70
+
.hljs-keyword,
71
+
.hljs-selector-tag,
72
+
.hljs-literal {
73
+
color: var(--hljs-keyword);
74
+
}
75
+
76
+
.hljs-attr,
77
+
.hljs-attribute,
78
+
.hljs-symbol,
79
+
.hljs-bullet,
80
+
.hljs-built_in,
81
+
.hljs-link,
82
+
.hljs-meta,
83
+
.hljs-selector-attr,
84
+
.hljs-selector-pseudo {
85
+
color: var(--hljs-attr);
86
+
}
87
+
88
+
.hljs-number,
89
+
.hljs-variable,
90
+
.hljs-template-variable,
91
+
.hljs-title,
92
+
.hljs-name,
93
+
.hljs-tag {
94
+
color: var(--hljs-number);
95
+
}
96
+
97
+
.hljs-string,
98
+
.hljs-doctag,
99
+
.hljs-regexp,
100
+
.hljs-addition {
101
+
color: var(--hljs-string);
102
+
}
103
+
104
+
.hljs-type,
105
+
.hljs-class .hljs-title {
106
+
color: var(--hljs-title);
107
+
font-weight: 600;
108
+
}
109
+
110
+
.hljs-deletion {
111
+
color: var(--hljs-deletion);
112
+
}
113
+
114
+
.hljs-emphasis {
115
+
font-style: italic;
116
+
}
117
+
118
+
.hljs-strong {
119
+
font-weight: 600;
120
+
}
+6
lib/types/bluesky.ts
+6
lib/types/bluesky.ts
···
1
+
// Re-export precise lexicon types from @atcute/bluesky instead of redefining.
2
+
import type { AppBskyFeedPost, AppBskyActorProfile } from '@atcute/bluesky';
3
+
4
+
// The atcute lexicon modules expose Main interface for record input shapes.
5
+
export type FeedPostRecord = AppBskyFeedPost.Main;
6
+
export type ProfileRecord = AppBskyActorProfile.Main;
+240
lib/types/leaflet.ts
+240
lib/types/leaflet.ts
···
1
+
export interface StrongRef {
2
+
uri: string;
3
+
cid: string;
4
+
}
5
+
6
+
export interface LeafletDocumentRecord {
7
+
$type?: "pub.leaflet.document";
8
+
title: string;
9
+
postRef?: StrongRef;
10
+
description?: string;
11
+
publishedAt?: string;
12
+
publication: string;
13
+
author: string;
14
+
pages: LeafletDocumentPage[];
15
+
}
16
+
17
+
export type LeafletDocumentPage = LeafletLinearDocumentPage;
18
+
19
+
export interface LeafletLinearDocumentPage {
20
+
$type?: "pub.leaflet.pages.linearDocument";
21
+
blocks?: LeafletLinearDocumentBlock[];
22
+
}
23
+
24
+
export type LeafletAlignmentValue =
25
+
| "#textAlignLeft"
26
+
| "#textAlignCenter"
27
+
| "#textAlignRight"
28
+
| "#textAlignJustify"
29
+
| "textAlignLeft"
30
+
| "textAlignCenter"
31
+
| "textAlignRight"
32
+
| "textAlignJustify";
33
+
34
+
export interface LeafletLinearDocumentBlock {
35
+
block: LeafletBlock;
36
+
alignment?: LeafletAlignmentValue;
37
+
}
38
+
39
+
export type LeafletBlock =
40
+
| LeafletTextBlock
41
+
| LeafletHeaderBlock
42
+
| LeafletBlockquoteBlock
43
+
| LeafletImageBlock
44
+
| LeafletUnorderedListBlock
45
+
| LeafletWebsiteBlock
46
+
| LeafletIFrameBlock
47
+
| LeafletMathBlock
48
+
| LeafletCodeBlock
49
+
| LeafletHorizontalRuleBlock
50
+
| LeafletBskyPostBlock;
51
+
52
+
export interface LeafletBaseTextBlock {
53
+
plaintext: string;
54
+
facets?: LeafletRichTextFacet[];
55
+
}
56
+
57
+
export interface LeafletTextBlock extends LeafletBaseTextBlock {
58
+
$type?: "pub.leaflet.blocks.text";
59
+
}
60
+
61
+
export interface LeafletHeaderBlock extends LeafletBaseTextBlock {
62
+
$type?: "pub.leaflet.blocks.header";
63
+
level?: number;
64
+
}
65
+
66
+
export interface LeafletBlockquoteBlock extends LeafletBaseTextBlock {
67
+
$type?: "pub.leaflet.blocks.blockquote";
68
+
}
69
+
70
+
export interface LeafletImageBlock {
71
+
$type?: "pub.leaflet.blocks.image";
72
+
image: LeafletBlobRef;
73
+
alt?: string;
74
+
aspectRatio: {
75
+
width: number;
76
+
height: number;
77
+
};
78
+
}
79
+
80
+
export interface LeafletUnorderedListBlock {
81
+
$type?: "pub.leaflet.blocks.unorderedList";
82
+
children: LeafletListItem[];
83
+
}
84
+
85
+
export interface LeafletListItem {
86
+
content: LeafletListContent;
87
+
children?: LeafletListItem[];
88
+
}
89
+
90
+
export type LeafletListContent = LeafletTextBlock | LeafletHeaderBlock | LeafletImageBlock;
91
+
92
+
export interface LeafletWebsiteBlock {
93
+
$type?: "pub.leaflet.blocks.website";
94
+
src: string;
95
+
title?: string;
96
+
description?: string;
97
+
previewImage?: LeafletBlobRef;
98
+
}
99
+
100
+
export interface LeafletIFrameBlock {
101
+
$type?: "pub.leaflet.blocks.iframe";
102
+
url: string;
103
+
height?: number;
104
+
}
105
+
106
+
export interface LeafletMathBlock {
107
+
$type?: "pub.leaflet.blocks.math";
108
+
tex: string;
109
+
}
110
+
111
+
export interface LeafletCodeBlock {
112
+
$type?: "pub.leaflet.blocks.code";
113
+
plaintext: string;
114
+
language?: string;
115
+
syntaxHighlightingTheme?: string;
116
+
}
117
+
118
+
export interface LeafletHorizontalRuleBlock {
119
+
$type?: "pub.leaflet.blocks.horizontalRule";
120
+
}
121
+
122
+
export interface LeafletBskyPostBlock {
123
+
$type?: "pub.leaflet.blocks.bskyPost";
124
+
postRef: StrongRef;
125
+
}
126
+
127
+
export interface LeafletRichTextFacet {
128
+
index: LeafletByteSlice;
129
+
features: LeafletRichTextFeature[];
130
+
}
131
+
132
+
export interface LeafletByteSlice {
133
+
byteStart: number;
134
+
byteEnd: number;
135
+
}
136
+
137
+
export type LeafletRichTextFeature =
138
+
| LeafletRichTextLinkFeature
139
+
| LeafletRichTextCodeFeature
140
+
| LeafletRichTextHighlightFeature
141
+
| LeafletRichTextUnderlineFeature
142
+
| LeafletRichTextStrikethroughFeature
143
+
| LeafletRichTextIdFeature
144
+
| LeafletRichTextBoldFeature
145
+
| LeafletRichTextItalicFeature;
146
+
147
+
export interface LeafletRichTextLinkFeature {
148
+
$type: "pub.leaflet.richtext.facet#link";
149
+
uri: string;
150
+
}
151
+
152
+
export interface LeafletRichTextCodeFeature {
153
+
$type: "pub.leaflet.richtext.facet#code";
154
+
}
155
+
156
+
export interface LeafletRichTextHighlightFeature {
157
+
$type: "pub.leaflet.richtext.facet#highlight";
158
+
}
159
+
160
+
export interface LeafletRichTextUnderlineFeature {
161
+
$type: "pub.leaflet.richtext.facet#underline";
162
+
}
163
+
164
+
export interface LeafletRichTextStrikethroughFeature {
165
+
$type: "pub.leaflet.richtext.facet#strikethrough";
166
+
}
167
+
168
+
export interface LeafletRichTextIdFeature {
169
+
$type: "pub.leaflet.richtext.facet#id";
170
+
id?: string;
171
+
}
172
+
173
+
export interface LeafletRichTextBoldFeature {
174
+
$type: "pub.leaflet.richtext.facet#bold";
175
+
}
176
+
177
+
export interface LeafletRichTextItalicFeature {
178
+
$type: "pub.leaflet.richtext.facet#italic";
179
+
}
180
+
181
+
export interface LeafletBlobRef {
182
+
$type?: string;
183
+
ref?: {
184
+
$link?: string;
185
+
};
186
+
cid?: string;
187
+
mimeType?: string;
188
+
size?: number;
189
+
}
190
+
191
+
export interface LeafletPublicationRecord {
192
+
$type?: "pub.leaflet.publication";
193
+
name: string;
194
+
base_path?: string;
195
+
description?: string;
196
+
icon?: LeafletBlobRef;
197
+
theme?: LeafletTheme;
198
+
preferences?: LeafletPublicationPreferences;
199
+
}
200
+
201
+
export interface LeafletPublicationPreferences {
202
+
showInDiscover?: boolean;
203
+
showComments?: boolean;
204
+
}
205
+
206
+
export interface LeafletTheme {
207
+
backgroundColor?: LeafletThemeColor;
208
+
backgroundImage?: LeafletThemeBackgroundImage;
209
+
primary?: LeafletThemeColor;
210
+
pageBackground?: LeafletThemeColor;
211
+
showPageBackground?: boolean;
212
+
accentBackground?: LeafletThemeColor;
213
+
accentText?: LeafletThemeColor;
214
+
}
215
+
216
+
export type LeafletThemeColor = LeafletThemeColorRgb | LeafletThemeColorRgba;
217
+
218
+
export interface LeafletThemeColorRgb {
219
+
$type?: "pub.leaflet.theme.color#rgb";
220
+
r: number;
221
+
g: number;
222
+
b: number;
223
+
}
224
+
225
+
export interface LeafletThemeColorRgba {
226
+
$type?: "pub.leaflet.theme.color#rgba";
227
+
r: number;
228
+
g: number;
229
+
b: number;
230
+
a: number;
231
+
}
232
+
233
+
export interface LeafletThemeBackgroundImage {
234
+
$type?: "pub.leaflet.theme.backgroundImage";
235
+
image: LeafletBlobRef;
236
+
width?: number;
237
+
repeat?: boolean;
238
+
}
239
+
240
+
export type LeafletInlineRenderable = LeafletTextBlock | LeafletHeaderBlock | LeafletBlockquoteBlock;
+44
lib/utils/at-uri.ts
+44
lib/utils/at-uri.ts
···
1
+
export interface ParsedAtUri {
2
+
did: string;
3
+
collection: string;
4
+
rkey: string;
5
+
}
6
+
7
+
export function parseAtUri(uri?: string): ParsedAtUri | undefined {
8
+
if (!uri || !uri.startsWith('at://')) return undefined;
9
+
const withoutScheme = uri.slice('at://'.length);
10
+
const [did, collection, rkey] = withoutScheme.split('/');
11
+
if (!did || !collection || !rkey) return undefined;
12
+
return { did, collection, rkey };
13
+
}
14
+
15
+
export function toBlueskyPostUrl(target: ParsedAtUri): string | undefined {
16
+
if (target.collection !== 'app.bsky.feed.post') return undefined;
17
+
return `https://bsky.app/profile/${target.did}/post/${target.rkey}`;
18
+
}
19
+
20
+
export function formatDidForLabel(did: string): string {
21
+
return did.replace(/^did:(plc:)?/, '');
22
+
}
23
+
24
+
const ABSOLUTE_URL_PATTERN = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
25
+
26
+
export function normalizeLeafletBasePath(basePath?: string): string | undefined {
27
+
if (!basePath) return undefined;
28
+
const trimmed = basePath.trim();
29
+
if (!trimmed) return undefined;
30
+
const withScheme = ABSOLUTE_URL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;
31
+
try {
32
+
const url = new URL(withScheme);
33
+
url.hash = '';
34
+
return url.href.replace(/\/?$/, '');
35
+
} catch {
36
+
return undefined;
37
+
}
38
+
}
39
+
40
+
export function leafletRkeyUrl(basePath: string | undefined, rkey: string): string | undefined {
41
+
const normalized = normalizeLeafletBasePath(basePath);
42
+
if (!normalized) return undefined;
43
+
return `${normalized}/${encodeURIComponent(rkey)}`;
44
+
}
+90
lib/utils/atproto-client.ts
+90
lib/utils/atproto-client.ts
···
1
+
import { Client, simpleFetchHandler } from '@atcute/client';
2
+
import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver, XrpcHandleResolver } from '@atcute/identity-resolver';
3
+
import type { DidDocument } from '@atcute/identity';
4
+
import type { Did, Handle } from '@atcute/lexicons/syntax';
5
+
import type {} from '@atcute/tangled';
6
+
import type {} from '@atcute/atproto';
7
+
8
+
export interface ServiceResolverOptions {
9
+
plcDirectory?: string;
10
+
identityService?: string;
11
+
fetch?: typeof fetch;
12
+
}
13
+
14
+
const DEFAULT_PLC = 'https://plc.directory';
15
+
const DEFAULT_IDENTITY_SERVICE = 'https://public.api.bsky.app';
16
+
const ABSOLUTE_URL_RE = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
17
+
const SUPPORTED_DID_METHODS = ['plc', 'web'] as const;
18
+
type SupportedDidMethod = (typeof SUPPORTED_DID_METHODS)[number];
19
+
type SupportedDid = Did<SupportedDidMethod>;
20
+
21
+
export const normalizeBaseUrl = (input: string): string => {
22
+
const trimmed = input.trim();
23
+
if (!trimmed) throw new Error('Service URL cannot be empty');
24
+
const withScheme = ABSOLUTE_URL_RE.test(trimmed) ? trimmed : `https://${trimmed.replace(/^\/+/, '')}`;
25
+
const url = new URL(withScheme);
26
+
const pathname = url.pathname.replace(/\/+$/, '');
27
+
return pathname ? `${url.origin}${pathname}` : url.origin;
28
+
};
29
+
30
+
export class ServiceResolver {
31
+
private plc: string;
32
+
private didResolver: CompositeDidDocumentResolver<SupportedDidMethod>;
33
+
private handleResolver: XrpcHandleResolver;
34
+
constructor(opts: ServiceResolverOptions = {}) {
35
+
const plcSource = opts.plcDirectory && opts.plcDirectory.trim() ? opts.plcDirectory : DEFAULT_PLC;
36
+
const identitySource = opts.identityService && opts.identityService.trim() ? opts.identityService : DEFAULT_IDENTITY_SERVICE;
37
+
this.plc = normalizeBaseUrl(plcSource);
38
+
const identityBase = normalizeBaseUrl(identitySource);
39
+
const fetchImpl = opts.fetch ?? fetch;
40
+
const plcResolver = new PlcDidDocumentResolver({ apiUrl: this.plc, fetch: fetchImpl });
41
+
const webResolver = new WebDidDocumentResolver({ fetch: fetchImpl });
42
+
this.didResolver = new CompositeDidDocumentResolver({ methods: { plc: plcResolver, web: webResolver } });
43
+
this.handleResolver = new XrpcHandleResolver({ serviceUrl: identityBase, fetch: fetchImpl });
44
+
}
45
+
46
+
async resolveDidDoc(did: string): Promise<DidDocument> {
47
+
const trimmed = did.trim();
48
+
if (!trimmed.startsWith('did:')) throw new Error(`Invalid DID ${did}`);
49
+
const methodEnd = trimmed.indexOf(':', 4);
50
+
const method = (methodEnd === -1 ? trimmed.slice(4) : trimmed.slice(4, methodEnd)) as string;
51
+
if (!SUPPORTED_DID_METHODS.includes(method as SupportedDidMethod)) {
52
+
throw new Error(`Unsupported DID method ${method ?? '<unknown>'}`);
53
+
}
54
+
return this.didResolver.resolve(trimmed as SupportedDid);
55
+
}
56
+
57
+
async pdsEndpointForDid(did: string): Promise<string> {
58
+
const doc = await this.resolveDidDoc(did);
59
+
const svc = doc.service?.find(s => s.type === 'AtprotoPersonalDataServer');
60
+
if (!svc || !svc.serviceEndpoint || typeof svc.serviceEndpoint !== 'string') {
61
+
throw new Error(`No PDS endpoint in DID doc for ${did}`);
62
+
}
63
+
return svc.serviceEndpoint.replace(/\/$/, '');
64
+
}
65
+
66
+
async resolveHandle(handle: string): Promise<string> {
67
+
const normalized = handle.trim().toLowerCase();
68
+
if (!normalized) throw new Error('Handle cannot be empty');
69
+
return this.handleResolver.resolve(normalized as Handle);
70
+
}
71
+
}
72
+
73
+
export interface CreateClientOptions extends ServiceResolverOptions {
74
+
did?: string; // optional to create a DID-scoped client
75
+
service?: string; // override service base url
76
+
}
77
+
78
+
export async function createAtprotoClient(opts: CreateClientOptions = {}) {
79
+
let service = opts.service;
80
+
const resolver = new ServiceResolver(opts);
81
+
if (!service && opts.did) {
82
+
service = await resolver.pdsEndpointForDid(opts.did);
83
+
}
84
+
if (!service) throw new Error('service or did required');
85
+
const handler = simpleFetchHandler({ service: normalizeBaseUrl(service) });
86
+
const rpc = new Client({ handler });
87
+
return { rpc, service, resolver };
88
+
}
89
+
90
+
export type AtprotoClient = Awaited<ReturnType<typeof createAtprotoClient>>['rpc'];
+13
lib/utils/profile.ts
+13
lib/utils/profile.ts
···
1
+
import type { ProfileRecord } from '../types/bluesky';
2
+
3
+
interface LegacyBlobRef {
4
+
ref?: { $link?: string };
5
+
cid?: string;
6
+
}
7
+
8
+
export function getAvatarCid(record: ProfileRecord | undefined): string | undefined {
9
+
const avatar = record?.avatar as LegacyBlobRef | undefined;
10
+
if (!avatar) return undefined;
11
+
if (typeof avatar.cid === 'string') return avatar.cid;
12
+
return avatar.ref?.$link;
13
+
}
+2863
package-lock.json
+2863
package-lock.json
···
1
+
{
2
+
"name": "atproto-ui",
3
+
"version": "0.1.1",
4
+
"lockfileVersion": 3,
5
+
"requires": true,
6
+
"packages": {
7
+
"": {
8
+
"name": "atproto-ui",
9
+
"version": "0.1.0",
10
+
"dependencies": {
11
+
"@atcute/atproto": "^3.1.7",
12
+
"@atcute/bluesky": "^3.2.3",
13
+
"@atcute/client": "^4.0.3",
14
+
"@atcute/identity-resolver": "^1.1.3",
15
+
"@atcute/tangled": "^1.0.6"
16
+
},
17
+
"devDependencies": {
18
+
"@eslint/js": "^9.36.0",
19
+
"@types/node": "^24.6.0",
20
+
"@types/react": "^19.1.16",
21
+
"@types/react-dom": "^19.1.9",
22
+
"@vitejs/plugin-react": "^5.0.4",
23
+
"eslint": "^9.36.0",
24
+
"eslint-plugin-react-hooks": "^5.2.0",
25
+
"eslint-plugin-react-refresh": "^0.4.22",
26
+
"globals": "^16.4.0",
27
+
"react": "^19.1.1",
28
+
"react-dom": "^19.1.1",
29
+
"typescript": "~5.9.3",
30
+
"typescript-eslint": "^8.45.0",
31
+
"vite": "npm:rolldown-vite@7.1.14"
32
+
},
33
+
"peerDependencies": {
34
+
"react": "^18.2.0 || ^19.0.0",
35
+
"react-dom": "^18.2.0 || ^19.0.0"
36
+
},
37
+
"peerDependenciesMeta": {
38
+
"react-dom": {
39
+
"optional": true
40
+
}
41
+
}
42
+
},
43
+
"node_modules/@atcute/atproto": {
44
+
"version": "3.1.7",
45
+
"resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-3.1.7.tgz",
46
+
"integrity": "sha512-3Ym8qaVZg2vf8qw0KO1aue39z/5oik5J+UDoSes1vr8ddw40UVLA5sV4bXSKmLnhzQHiLLgoVZXe4zaKfozPoQ==",
47
+
"license": "0BSD",
48
+
"dependencies": {
49
+
"@atcute/lexicons": "^1.2.2"
50
+
}
51
+
},
52
+
"node_modules/@atcute/bluesky": {
53
+
"version": "3.2.3",
54
+
"resolved": "https://registry.npmjs.org/@atcute/bluesky/-/bluesky-3.2.3.tgz",
55
+
"integrity": "sha512-IdPQQ54F1BLhW5z49k81ZUC/GQl/tVygZ+CzLHYvQySHA6GJRcvPzwEf8aV21u0SZOJF+yF4CWEGNgtryyxPmg==",
56
+
"license": "0BSD",
57
+
"dependencies": {
58
+
"@atcute/atproto": "^3.1.4",
59
+
"@atcute/lexicons": "^1.1.1"
60
+
}
61
+
},
62
+
"node_modules/@atcute/client": {
63
+
"version": "4.0.3",
64
+
"resolved": "https://registry.npmjs.org/@atcute/client/-/client-4.0.3.tgz",
65
+
"integrity": "sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==",
66
+
"license": "MIT",
67
+
"dependencies": {
68
+
"@atcute/identity": "^1.0.2",
69
+
"@atcute/lexicons": "^1.0.3"
70
+
}
71
+
},
72
+
"node_modules/@atcute/identity": {
73
+
"version": "1.1.0",
74
+
"resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.0.tgz",
75
+
"integrity": "sha512-6vRvRqJatDB+JUQsb+UswYmtBGQnSZcqC3a2y6H5DB/v5KcIh+6nFFtc17G0+3W9rxdk7k9M4KkgkdKf/YDNoQ==",
76
+
"license": "0BSD",
77
+
"dependencies": {
78
+
"@atcute/lexicons": "^1.1.1",
79
+
"@badrap/valita": "^0.4.5"
80
+
}
81
+
},
82
+
"node_modules/@atcute/identity-resolver": {
83
+
"version": "1.1.4",
84
+
"resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-1.1.4.tgz",
85
+
"integrity": "sha512-/SVh8vf2cXFJenmBnGeYF2aY3WGQm3cJeew5NWTlkqoy3LvJ5wkvKq9PWu4Tv653VF40rPOp6LOdVr9Fa+q5rA==",
86
+
"license": "0BSD",
87
+
"dependencies": {
88
+
"@atcute/lexicons": "^1.2.2",
89
+
"@atcute/util-fetch": "^1.0.3",
90
+
"@badrap/valita": "^0.4.6"
91
+
},
92
+
"peerDependencies": {
93
+
"@atcute/identity": "^1.0.0"
94
+
}
95
+
},
96
+
"node_modules/@atcute/lexicons": {
97
+
"version": "1.2.2",
98
+
"resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-1.2.2.tgz",
99
+
"integrity": "sha512-bgEhJq5Z70/0TbK5sx+tAkrR8FsCODNiL2gUEvS5PuJfPxmFmRYNWaMGehxSPaXWpU2+Oa9ckceHiYbrItDTkA==",
100
+
"license": "0BSD",
101
+
"dependencies": {
102
+
"@standard-schema/spec": "^1.0.0",
103
+
"esm-env": "^1.2.2"
104
+
}
105
+
},
106
+
"node_modules/@atcute/tangled": {
107
+
"version": "1.0.6",
108
+
"resolved": "https://registry.npmjs.org/@atcute/tangled/-/tangled-1.0.6.tgz",
109
+
"integrity": "sha512-eEOtrKRbjKfeLYtb5hmkhE45w8h4sV6mT4E2CQzJmhOMGCiK31GX7Vqfh59rhNLb9AlbW72RcQTV737pxx+ksw==",
110
+
"license": "0BSD",
111
+
"dependencies": {
112
+
"@atcute/atproto": "^3.1.4",
113
+
"@atcute/lexicons": "^1.1.1"
114
+
}
115
+
},
116
+
"node_modules/@atcute/util-fetch": {
117
+
"version": "1.0.3",
118
+
"resolved": "https://registry.npmjs.org/@atcute/util-fetch/-/util-fetch-1.0.3.tgz",
119
+
"integrity": "sha512-f8zzTb/xlKIwv2OQ31DhShPUNCmIIleX6p7qIXwWwEUjX6x8skUtpdISSjnImq01LXpltGV5y8yhV4/Mlb7CRQ==",
120
+
"license": "0BSD",
121
+
"dependencies": {
122
+
"@badrap/valita": "^0.4.6"
123
+
}
124
+
},
125
+
"node_modules/@babel/code-frame": {
126
+
"version": "7.27.1",
127
+
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
128
+
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
129
+
"dev": true,
130
+
"license": "MIT",
131
+
"dependencies": {
132
+
"@babel/helper-validator-identifier": "^7.27.1",
133
+
"js-tokens": "^4.0.0",
134
+
"picocolors": "^1.1.1"
135
+
},
136
+
"engines": {
137
+
"node": ">=6.9.0"
138
+
}
139
+
},
140
+
"node_modules/@babel/compat-data": {
141
+
"version": "7.28.4",
142
+
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
143
+
"integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
144
+
"dev": true,
145
+
"license": "MIT",
146
+
"engines": {
147
+
"node": ">=6.9.0"
148
+
}
149
+
},
150
+
"node_modules/@babel/core": {
151
+
"version": "7.28.4",
152
+
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
153
+
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
154
+
"dev": true,
155
+
"license": "MIT",
156
+
"dependencies": {
157
+
"@babel/code-frame": "^7.27.1",
158
+
"@babel/generator": "^7.28.3",
159
+
"@babel/helper-compilation-targets": "^7.27.2",
160
+
"@babel/helper-module-transforms": "^7.28.3",
161
+
"@babel/helpers": "^7.28.4",
162
+
"@babel/parser": "^7.28.4",
163
+
"@babel/template": "^7.27.2",
164
+
"@babel/traverse": "^7.28.4",
165
+
"@babel/types": "^7.28.4",
166
+
"@jridgewell/remapping": "^2.3.5",
167
+
"convert-source-map": "^2.0.0",
168
+
"debug": "^4.1.0",
169
+
"gensync": "^1.0.0-beta.2",
170
+
"json5": "^2.2.3",
171
+
"semver": "^6.3.1"
172
+
},
173
+
"engines": {
174
+
"node": ">=6.9.0"
175
+
},
176
+
"funding": {
177
+
"type": "opencollective",
178
+
"url": "https://opencollective.com/babel"
179
+
}
180
+
},
181
+
"node_modules/@babel/generator": {
182
+
"version": "7.28.3",
183
+
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
184
+
"integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
185
+
"dev": true,
186
+
"license": "MIT",
187
+
"dependencies": {
188
+
"@babel/parser": "^7.28.3",
189
+
"@babel/types": "^7.28.2",
190
+
"@jridgewell/gen-mapping": "^0.3.12",
191
+
"@jridgewell/trace-mapping": "^0.3.28",
192
+
"jsesc": "^3.0.2"
193
+
},
194
+
"engines": {
195
+
"node": ">=6.9.0"
196
+
}
197
+
},
198
+
"node_modules/@babel/helper-compilation-targets": {
199
+
"version": "7.27.2",
200
+
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
201
+
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
202
+
"dev": true,
203
+
"license": "MIT",
204
+
"dependencies": {
205
+
"@babel/compat-data": "^7.27.2",
206
+
"@babel/helper-validator-option": "^7.27.1",
207
+
"browserslist": "^4.24.0",
208
+
"lru-cache": "^5.1.1",
209
+
"semver": "^6.3.1"
210
+
},
211
+
"engines": {
212
+
"node": ">=6.9.0"
213
+
}
214
+
},
215
+
"node_modules/@babel/helper-globals": {
216
+
"version": "7.28.0",
217
+
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
218
+
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
219
+
"dev": true,
220
+
"license": "MIT",
221
+
"engines": {
222
+
"node": ">=6.9.0"
223
+
}
224
+
},
225
+
"node_modules/@babel/helper-module-imports": {
226
+
"version": "7.27.1",
227
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
228
+
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
229
+
"dev": true,
230
+
"license": "MIT",
231
+
"dependencies": {
232
+
"@babel/traverse": "^7.27.1",
233
+
"@babel/types": "^7.27.1"
234
+
},
235
+
"engines": {
236
+
"node": ">=6.9.0"
237
+
}
238
+
},
239
+
"node_modules/@babel/helper-module-transforms": {
240
+
"version": "7.28.3",
241
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
242
+
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
243
+
"dev": true,
244
+
"license": "MIT",
245
+
"dependencies": {
246
+
"@babel/helper-module-imports": "^7.27.1",
247
+
"@babel/helper-validator-identifier": "^7.27.1",
248
+
"@babel/traverse": "^7.28.3"
249
+
},
250
+
"engines": {
251
+
"node": ">=6.9.0"
252
+
},
253
+
"peerDependencies": {
254
+
"@babel/core": "^7.0.0"
255
+
}
256
+
},
257
+
"node_modules/@babel/helper-plugin-utils": {
258
+
"version": "7.27.1",
259
+
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
260
+
"integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
261
+
"dev": true,
262
+
"license": "MIT",
263
+
"engines": {
264
+
"node": ">=6.9.0"
265
+
}
266
+
},
267
+
"node_modules/@babel/helper-string-parser": {
268
+
"version": "7.27.1",
269
+
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
270
+
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
271
+
"dev": true,
272
+
"license": "MIT",
273
+
"engines": {
274
+
"node": ">=6.9.0"
275
+
}
276
+
},
277
+
"node_modules/@babel/helper-validator-identifier": {
278
+
"version": "7.27.1",
279
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
280
+
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
281
+
"dev": true,
282
+
"license": "MIT",
283
+
"engines": {
284
+
"node": ">=6.9.0"
285
+
}
286
+
},
287
+
"node_modules/@babel/helper-validator-option": {
288
+
"version": "7.27.1",
289
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
290
+
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
291
+
"dev": true,
292
+
"license": "MIT",
293
+
"engines": {
294
+
"node": ">=6.9.0"
295
+
}
296
+
},
297
+
"node_modules/@babel/helpers": {
298
+
"version": "7.28.4",
299
+
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
300
+
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
301
+
"dev": true,
302
+
"license": "MIT",
303
+
"dependencies": {
304
+
"@babel/template": "^7.27.2",
305
+
"@babel/types": "^7.28.4"
306
+
},
307
+
"engines": {
308
+
"node": ">=6.9.0"
309
+
}
310
+
},
311
+
"node_modules/@babel/parser": {
312
+
"version": "7.28.4",
313
+
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
314
+
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
315
+
"dev": true,
316
+
"license": "MIT",
317
+
"dependencies": {
318
+
"@babel/types": "^7.28.4"
319
+
},
320
+
"bin": {
321
+
"parser": "bin/babel-parser.js"
322
+
},
323
+
"engines": {
324
+
"node": ">=6.0.0"
325
+
}
326
+
},
327
+
"node_modules/@babel/plugin-transform-react-jsx-self": {
328
+
"version": "7.27.1",
329
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
330
+
"integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
331
+
"dev": true,
332
+
"license": "MIT",
333
+
"dependencies": {
334
+
"@babel/helper-plugin-utils": "^7.27.1"
335
+
},
336
+
"engines": {
337
+
"node": ">=6.9.0"
338
+
},
339
+
"peerDependencies": {
340
+
"@babel/core": "^7.0.0-0"
341
+
}
342
+
},
343
+
"node_modules/@babel/plugin-transform-react-jsx-source": {
344
+
"version": "7.27.1",
345
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
346
+
"integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
347
+
"dev": true,
348
+
"license": "MIT",
349
+
"dependencies": {
350
+
"@babel/helper-plugin-utils": "^7.27.1"
351
+
},
352
+
"engines": {
353
+
"node": ">=6.9.0"
354
+
},
355
+
"peerDependencies": {
356
+
"@babel/core": "^7.0.0-0"
357
+
}
358
+
},
359
+
"node_modules/@babel/template": {
360
+
"version": "7.27.2",
361
+
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
362
+
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
363
+
"dev": true,
364
+
"license": "MIT",
365
+
"dependencies": {
366
+
"@babel/code-frame": "^7.27.1",
367
+
"@babel/parser": "^7.27.2",
368
+
"@babel/types": "^7.27.1"
369
+
},
370
+
"engines": {
371
+
"node": ">=6.9.0"
372
+
}
373
+
},
374
+
"node_modules/@babel/traverse": {
375
+
"version": "7.28.4",
376
+
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
377
+
"integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
378
+
"dev": true,
379
+
"license": "MIT",
380
+
"dependencies": {
381
+
"@babel/code-frame": "^7.27.1",
382
+
"@babel/generator": "^7.28.3",
383
+
"@babel/helper-globals": "^7.28.0",
384
+
"@babel/parser": "^7.28.4",
385
+
"@babel/template": "^7.27.2",
386
+
"@babel/types": "^7.28.4",
387
+
"debug": "^4.3.1"
388
+
},
389
+
"engines": {
390
+
"node": ">=6.9.0"
391
+
}
392
+
},
393
+
"node_modules/@babel/types": {
394
+
"version": "7.28.4",
395
+
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
396
+
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
397
+
"dev": true,
398
+
"license": "MIT",
399
+
"dependencies": {
400
+
"@babel/helper-string-parser": "^7.27.1",
401
+
"@babel/helper-validator-identifier": "^7.27.1"
402
+
},
403
+
"engines": {
404
+
"node": ">=6.9.0"
405
+
}
406
+
},
407
+
"node_modules/@badrap/valita": {
408
+
"version": "0.4.6",
409
+
"resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.4.6.tgz",
410
+
"integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==",
411
+
"license": "MIT",
412
+
"engines": {
413
+
"node": ">= 18"
414
+
}
415
+
},
416
+
"node_modules/@eslint-community/eslint-utils": {
417
+
"version": "4.9.0",
418
+
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
419
+
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
420
+
"dev": true,
421
+
"license": "MIT",
422
+
"dependencies": {
423
+
"eslint-visitor-keys": "^3.4.3"
424
+
},
425
+
"engines": {
426
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
427
+
},
428
+
"funding": {
429
+
"url": "https://opencollective.com/eslint"
430
+
},
431
+
"peerDependencies": {
432
+
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
433
+
}
434
+
},
435
+
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
436
+
"version": "3.4.3",
437
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
438
+
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
439
+
"dev": true,
440
+
"license": "Apache-2.0",
441
+
"engines": {
442
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
443
+
},
444
+
"funding": {
445
+
"url": "https://opencollective.com/eslint"
446
+
}
447
+
},
448
+
"node_modules/@eslint-community/regexpp": {
449
+
"version": "4.12.1",
450
+
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
451
+
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
452
+
"dev": true,
453
+
"license": "MIT",
454
+
"engines": {
455
+
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
456
+
}
457
+
},
458
+
"node_modules/@eslint/config-array": {
459
+
"version": "0.21.0",
460
+
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
461
+
"integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
462
+
"dev": true,
463
+
"license": "Apache-2.0",
464
+
"dependencies": {
465
+
"@eslint/object-schema": "^2.1.6",
466
+
"debug": "^4.3.1",
467
+
"minimatch": "^3.1.2"
468
+
},
469
+
"engines": {
470
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
471
+
}
472
+
},
473
+
"node_modules/@eslint/config-helpers": {
474
+
"version": "0.4.0",
475
+
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
476
+
"integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
477
+
"dev": true,
478
+
"license": "Apache-2.0",
479
+
"dependencies": {
480
+
"@eslint/core": "^0.16.0"
481
+
},
482
+
"engines": {
483
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
484
+
}
485
+
},
486
+
"node_modules/@eslint/core": {
487
+
"version": "0.16.0",
488
+
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
489
+
"integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
490
+
"dev": true,
491
+
"license": "Apache-2.0",
492
+
"dependencies": {
493
+
"@types/json-schema": "^7.0.15"
494
+
},
495
+
"engines": {
496
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
497
+
}
498
+
},
499
+
"node_modules/@eslint/eslintrc": {
500
+
"version": "3.3.1",
501
+
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
502
+
"integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
503
+
"dev": true,
504
+
"license": "MIT",
505
+
"dependencies": {
506
+
"ajv": "^6.12.4",
507
+
"debug": "^4.3.2",
508
+
"espree": "^10.0.1",
509
+
"globals": "^14.0.0",
510
+
"ignore": "^5.2.0",
511
+
"import-fresh": "^3.2.1",
512
+
"js-yaml": "^4.1.0",
513
+
"minimatch": "^3.1.2",
514
+
"strip-json-comments": "^3.1.1"
515
+
},
516
+
"engines": {
517
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
518
+
},
519
+
"funding": {
520
+
"url": "https://opencollective.com/eslint"
521
+
}
522
+
},
523
+
"node_modules/@eslint/eslintrc/node_modules/globals": {
524
+
"version": "14.0.0",
525
+
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
526
+
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
527
+
"dev": true,
528
+
"license": "MIT",
529
+
"engines": {
530
+
"node": ">=18"
531
+
},
532
+
"funding": {
533
+
"url": "https://github.com/sponsors/sindresorhus"
534
+
}
535
+
},
536
+
"node_modules/@eslint/js": {
537
+
"version": "9.37.0",
538
+
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz",
539
+
"integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
540
+
"dev": true,
541
+
"license": "MIT",
542
+
"engines": {
543
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
544
+
},
545
+
"funding": {
546
+
"url": "https://eslint.org/donate"
547
+
}
548
+
},
549
+
"node_modules/@eslint/object-schema": {
550
+
"version": "2.1.6",
551
+
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
552
+
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
553
+
"dev": true,
554
+
"license": "Apache-2.0",
555
+
"engines": {
556
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
557
+
}
558
+
},
559
+
"node_modules/@eslint/plugin-kit": {
560
+
"version": "0.4.0",
561
+
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
562
+
"integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
563
+
"dev": true,
564
+
"license": "Apache-2.0",
565
+
"dependencies": {
566
+
"@eslint/core": "^0.16.0",
567
+
"levn": "^0.4.1"
568
+
},
569
+
"engines": {
570
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
571
+
}
572
+
},
573
+
"node_modules/@humanfs/core": {
574
+
"version": "0.19.1",
575
+
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
576
+
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
577
+
"dev": true,
578
+
"license": "Apache-2.0",
579
+
"engines": {
580
+
"node": ">=18.18.0"
581
+
}
582
+
},
583
+
"node_modules/@humanfs/node": {
584
+
"version": "0.16.7",
585
+
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
586
+
"integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
587
+
"dev": true,
588
+
"license": "Apache-2.0",
589
+
"dependencies": {
590
+
"@humanfs/core": "^0.19.1",
591
+
"@humanwhocodes/retry": "^0.4.0"
592
+
},
593
+
"engines": {
594
+
"node": ">=18.18.0"
595
+
}
596
+
},
597
+
"node_modules/@humanwhocodes/module-importer": {
598
+
"version": "1.0.1",
599
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
600
+
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
601
+
"dev": true,
602
+
"license": "Apache-2.0",
603
+
"engines": {
604
+
"node": ">=12.22"
605
+
},
606
+
"funding": {
607
+
"type": "github",
608
+
"url": "https://github.com/sponsors/nzakas"
609
+
}
610
+
},
611
+
"node_modules/@humanwhocodes/retry": {
612
+
"version": "0.4.3",
613
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
614
+
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
615
+
"dev": true,
616
+
"license": "Apache-2.0",
617
+
"engines": {
618
+
"node": ">=18.18"
619
+
},
620
+
"funding": {
621
+
"type": "github",
622
+
"url": "https://github.com/sponsors/nzakas"
623
+
}
624
+
},
625
+
"node_modules/@jridgewell/gen-mapping": {
626
+
"version": "0.3.13",
627
+
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
628
+
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
629
+
"dev": true,
630
+
"license": "MIT",
631
+
"dependencies": {
632
+
"@jridgewell/sourcemap-codec": "^1.5.0",
633
+
"@jridgewell/trace-mapping": "^0.3.24"
634
+
}
635
+
},
636
+
"node_modules/@jridgewell/remapping": {
637
+
"version": "2.3.5",
638
+
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
639
+
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
640
+
"dev": true,
641
+
"license": "MIT",
642
+
"dependencies": {
643
+
"@jridgewell/gen-mapping": "^0.3.5",
644
+
"@jridgewell/trace-mapping": "^0.3.24"
645
+
}
646
+
},
647
+
"node_modules/@jridgewell/resolve-uri": {
648
+
"version": "3.1.2",
649
+
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
650
+
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
651
+
"dev": true,
652
+
"license": "MIT",
653
+
"engines": {
654
+
"node": ">=6.0.0"
655
+
}
656
+
},
657
+
"node_modules/@jridgewell/sourcemap-codec": {
658
+
"version": "1.5.5",
659
+
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
660
+
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
661
+
"dev": true,
662
+
"license": "MIT"
663
+
},
664
+
"node_modules/@jridgewell/trace-mapping": {
665
+
"version": "0.3.31",
666
+
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
667
+
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
668
+
"dev": true,
669
+
"license": "MIT",
670
+
"dependencies": {
671
+
"@jridgewell/resolve-uri": "^3.1.0",
672
+
"@jridgewell/sourcemap-codec": "^1.4.14"
673
+
}
674
+
},
675
+
"node_modules/@nodelib/fs.scandir": {
676
+
"version": "2.1.5",
677
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
678
+
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
679
+
"dev": true,
680
+
"license": "MIT",
681
+
"dependencies": {
682
+
"@nodelib/fs.stat": "2.0.5",
683
+
"run-parallel": "^1.1.9"
684
+
},
685
+
"engines": {
686
+
"node": ">= 8"
687
+
}
688
+
},
689
+
"node_modules/@nodelib/fs.stat": {
690
+
"version": "2.0.5",
691
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
692
+
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
693
+
"dev": true,
694
+
"license": "MIT",
695
+
"engines": {
696
+
"node": ">= 8"
697
+
}
698
+
},
699
+
"node_modules/@nodelib/fs.walk": {
700
+
"version": "1.2.8",
701
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
702
+
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
703
+
"dev": true,
704
+
"license": "MIT",
705
+
"dependencies": {
706
+
"@nodelib/fs.scandir": "2.1.5",
707
+
"fastq": "^1.6.0"
708
+
},
709
+
"engines": {
710
+
"node": ">= 8"
711
+
}
712
+
},
713
+
"node_modules/@oxc-project/runtime": {
714
+
"version": "0.92.0",
715
+
"resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.92.0.tgz",
716
+
"integrity": "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==",
717
+
"dev": true,
718
+
"license": "MIT",
719
+
"engines": {
720
+
"node": "^20.19.0 || >=22.12.0"
721
+
}
722
+
},
723
+
"node_modules/@oxc-project/types": {
724
+
"version": "0.93.0",
725
+
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.93.0.tgz",
726
+
"integrity": "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==",
727
+
"dev": true,
728
+
"license": "MIT",
729
+
"funding": {
730
+
"url": "https://github.com/sponsors/Boshen"
731
+
}
732
+
},
733
+
"node_modules/@rolldown/binding-darwin-arm64": {
734
+
"version": "1.0.0-beta.41",
735
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.41.tgz",
736
+
"integrity": "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==",
737
+
"cpu": [
738
+
"arm64"
739
+
],
740
+
"dev": true,
741
+
"license": "MIT",
742
+
"optional": true,
743
+
"os": [
744
+
"darwin"
745
+
],
746
+
"engines": {
747
+
"node": "^20.19.0 || >=22.12.0"
748
+
}
749
+
},
750
+
"node_modules/@rolldown/pluginutils": {
751
+
"version": "1.0.0-beta.38",
752
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz",
753
+
"integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==",
754
+
"dev": true,
755
+
"license": "MIT"
756
+
},
757
+
"node_modules/@standard-schema/spec": {
758
+
"version": "1.0.0",
759
+
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
760
+
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
761
+
"license": "MIT"
762
+
},
763
+
"node_modules/@types/babel__core": {
764
+
"version": "7.20.5",
765
+
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
766
+
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
767
+
"dev": true,
768
+
"license": "MIT",
769
+
"dependencies": {
770
+
"@babel/parser": "^7.20.7",
771
+
"@babel/types": "^7.20.7",
772
+
"@types/babel__generator": "*",
773
+
"@types/babel__template": "*",
774
+
"@types/babel__traverse": "*"
775
+
}
776
+
},
777
+
"node_modules/@types/babel__generator": {
778
+
"version": "7.27.0",
779
+
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
780
+
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
781
+
"dev": true,
782
+
"license": "MIT",
783
+
"dependencies": {
784
+
"@babel/types": "^7.0.0"
785
+
}
786
+
},
787
+
"node_modules/@types/babel__template": {
788
+
"version": "7.4.4",
789
+
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
790
+
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
791
+
"dev": true,
792
+
"license": "MIT",
793
+
"dependencies": {
794
+
"@babel/parser": "^7.1.0",
795
+
"@babel/types": "^7.0.0"
796
+
}
797
+
},
798
+
"node_modules/@types/babel__traverse": {
799
+
"version": "7.28.0",
800
+
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
801
+
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
802
+
"dev": true,
803
+
"license": "MIT",
804
+
"dependencies": {
805
+
"@babel/types": "^7.28.2"
806
+
}
807
+
},
808
+
"node_modules/@types/estree": {
809
+
"version": "1.0.8",
810
+
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
811
+
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
812
+
"dev": true,
813
+
"license": "MIT"
814
+
},
815
+
"node_modules/@types/json-schema": {
816
+
"version": "7.0.15",
817
+
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
818
+
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
819
+
"dev": true,
820
+
"license": "MIT"
821
+
},
822
+
"node_modules/@types/node": {
823
+
"version": "24.7.0",
824
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz",
825
+
"integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==",
826
+
"dev": true,
827
+
"license": "MIT",
828
+
"dependencies": {
829
+
"undici-types": "~7.14.0"
830
+
}
831
+
},
832
+
"node_modules/@types/react": {
833
+
"version": "19.2.2",
834
+
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
835
+
"integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
836
+
"dev": true,
837
+
"license": "MIT",
838
+
"dependencies": {
839
+
"csstype": "^3.0.2"
840
+
}
841
+
},
842
+
"node_modules/@types/react-dom": {
843
+
"version": "19.2.1",
844
+
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.1.tgz",
845
+
"integrity": "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==",
846
+
"dev": true,
847
+
"license": "MIT",
848
+
"peerDependencies": {
849
+
"@types/react": "^19.2.0"
850
+
}
851
+
},
852
+
"node_modules/@typescript-eslint/eslint-plugin": {
853
+
"version": "8.46.0",
854
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
855
+
"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
856
+
"dev": true,
857
+
"license": "MIT",
858
+
"dependencies": {
859
+
"@eslint-community/regexpp": "^4.10.0",
860
+
"@typescript-eslint/scope-manager": "8.46.0",
861
+
"@typescript-eslint/type-utils": "8.46.0",
862
+
"@typescript-eslint/utils": "8.46.0",
863
+
"@typescript-eslint/visitor-keys": "8.46.0",
864
+
"graphemer": "^1.4.0",
865
+
"ignore": "^7.0.0",
866
+
"natural-compare": "^1.4.0",
867
+
"ts-api-utils": "^2.1.0"
868
+
},
869
+
"engines": {
870
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
871
+
},
872
+
"funding": {
873
+
"type": "opencollective",
874
+
"url": "https://opencollective.com/typescript-eslint"
875
+
},
876
+
"peerDependencies": {
877
+
"@typescript-eslint/parser": "^8.46.0",
878
+
"eslint": "^8.57.0 || ^9.0.0",
879
+
"typescript": ">=4.8.4 <6.0.0"
880
+
}
881
+
},
882
+
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
883
+
"version": "7.0.5",
884
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
885
+
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
886
+
"dev": true,
887
+
"license": "MIT",
888
+
"engines": {
889
+
"node": ">= 4"
890
+
}
891
+
},
892
+
"node_modules/@typescript-eslint/parser": {
893
+
"version": "8.46.0",
894
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
895
+
"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
896
+
"dev": true,
897
+
"license": "MIT",
898
+
"dependencies": {
899
+
"@typescript-eslint/scope-manager": "8.46.0",
900
+
"@typescript-eslint/types": "8.46.0",
901
+
"@typescript-eslint/typescript-estree": "8.46.0",
902
+
"@typescript-eslint/visitor-keys": "8.46.0",
903
+
"debug": "^4.3.4"
904
+
},
905
+
"engines": {
906
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
907
+
},
908
+
"funding": {
909
+
"type": "opencollective",
910
+
"url": "https://opencollective.com/typescript-eslint"
911
+
},
912
+
"peerDependencies": {
913
+
"eslint": "^8.57.0 || ^9.0.0",
914
+
"typescript": ">=4.8.4 <6.0.0"
915
+
}
916
+
},
917
+
"node_modules/@typescript-eslint/project-service": {
918
+
"version": "8.46.0",
919
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
920
+
"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
921
+
"dev": true,
922
+
"license": "MIT",
923
+
"dependencies": {
924
+
"@typescript-eslint/tsconfig-utils": "^8.46.0",
925
+
"@typescript-eslint/types": "^8.46.0",
926
+
"debug": "^4.3.4"
927
+
},
928
+
"engines": {
929
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
930
+
},
931
+
"funding": {
932
+
"type": "opencollective",
933
+
"url": "https://opencollective.com/typescript-eslint"
934
+
},
935
+
"peerDependencies": {
936
+
"typescript": ">=4.8.4 <6.0.0"
937
+
}
938
+
},
939
+
"node_modules/@typescript-eslint/scope-manager": {
940
+
"version": "8.46.0",
941
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
942
+
"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
943
+
"dev": true,
944
+
"license": "MIT",
945
+
"dependencies": {
946
+
"@typescript-eslint/types": "8.46.0",
947
+
"@typescript-eslint/visitor-keys": "8.46.0"
948
+
},
949
+
"engines": {
950
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
951
+
},
952
+
"funding": {
953
+
"type": "opencollective",
954
+
"url": "https://opencollective.com/typescript-eslint"
955
+
}
956
+
},
957
+
"node_modules/@typescript-eslint/tsconfig-utils": {
958
+
"version": "8.46.0",
959
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
960
+
"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
961
+
"dev": true,
962
+
"license": "MIT",
963
+
"engines": {
964
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
965
+
},
966
+
"funding": {
967
+
"type": "opencollective",
968
+
"url": "https://opencollective.com/typescript-eslint"
969
+
},
970
+
"peerDependencies": {
971
+
"typescript": ">=4.8.4 <6.0.0"
972
+
}
973
+
},
974
+
"node_modules/@typescript-eslint/type-utils": {
975
+
"version": "8.46.0",
976
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
977
+
"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
978
+
"dev": true,
979
+
"license": "MIT",
980
+
"dependencies": {
981
+
"@typescript-eslint/types": "8.46.0",
982
+
"@typescript-eslint/typescript-estree": "8.46.0",
983
+
"@typescript-eslint/utils": "8.46.0",
984
+
"debug": "^4.3.4",
985
+
"ts-api-utils": "^2.1.0"
986
+
},
987
+
"engines": {
988
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
989
+
},
990
+
"funding": {
991
+
"type": "opencollective",
992
+
"url": "https://opencollective.com/typescript-eslint"
993
+
},
994
+
"peerDependencies": {
995
+
"eslint": "^8.57.0 || ^9.0.0",
996
+
"typescript": ">=4.8.4 <6.0.0"
997
+
}
998
+
},
999
+
"node_modules/@typescript-eslint/types": {
1000
+
"version": "8.46.0",
1001
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
1002
+
"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
1003
+
"dev": true,
1004
+
"license": "MIT",
1005
+
"engines": {
1006
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1007
+
},
1008
+
"funding": {
1009
+
"type": "opencollective",
1010
+
"url": "https://opencollective.com/typescript-eslint"
1011
+
}
1012
+
},
1013
+
"node_modules/@typescript-eslint/typescript-estree": {
1014
+
"version": "8.46.0",
1015
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
1016
+
"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
1017
+
"dev": true,
1018
+
"license": "MIT",
1019
+
"dependencies": {
1020
+
"@typescript-eslint/project-service": "8.46.0",
1021
+
"@typescript-eslint/tsconfig-utils": "8.46.0",
1022
+
"@typescript-eslint/types": "8.46.0",
1023
+
"@typescript-eslint/visitor-keys": "8.46.0",
1024
+
"debug": "^4.3.4",
1025
+
"fast-glob": "^3.3.2",
1026
+
"is-glob": "^4.0.3",
1027
+
"minimatch": "^9.0.4",
1028
+
"semver": "^7.6.0",
1029
+
"ts-api-utils": "^2.1.0"
1030
+
},
1031
+
"engines": {
1032
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1033
+
},
1034
+
"funding": {
1035
+
"type": "opencollective",
1036
+
"url": "https://opencollective.com/typescript-eslint"
1037
+
},
1038
+
"peerDependencies": {
1039
+
"typescript": ">=4.8.4 <6.0.0"
1040
+
}
1041
+
},
1042
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
1043
+
"version": "2.0.2",
1044
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
1045
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
1046
+
"dev": true,
1047
+
"license": "MIT",
1048
+
"dependencies": {
1049
+
"balanced-match": "^1.0.0"
1050
+
}
1051
+
},
1052
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
1053
+
"version": "9.0.5",
1054
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1055
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1056
+
"dev": true,
1057
+
"license": "ISC",
1058
+
"dependencies": {
1059
+
"brace-expansion": "^2.0.1"
1060
+
},
1061
+
"engines": {
1062
+
"node": ">=16 || 14 >=14.17"
1063
+
},
1064
+
"funding": {
1065
+
"url": "https://github.com/sponsors/isaacs"
1066
+
}
1067
+
},
1068
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
1069
+
"version": "7.7.3",
1070
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
1071
+
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
1072
+
"dev": true,
1073
+
"license": "ISC",
1074
+
"bin": {
1075
+
"semver": "bin/semver.js"
1076
+
},
1077
+
"engines": {
1078
+
"node": ">=10"
1079
+
}
1080
+
},
1081
+
"node_modules/@typescript-eslint/utils": {
1082
+
"version": "8.46.0",
1083
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
1084
+
"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
1085
+
"dev": true,
1086
+
"license": "MIT",
1087
+
"dependencies": {
1088
+
"@eslint-community/eslint-utils": "^4.7.0",
1089
+
"@typescript-eslint/scope-manager": "8.46.0",
1090
+
"@typescript-eslint/types": "8.46.0",
1091
+
"@typescript-eslint/typescript-estree": "8.46.0"
1092
+
},
1093
+
"engines": {
1094
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1095
+
},
1096
+
"funding": {
1097
+
"type": "opencollective",
1098
+
"url": "https://opencollective.com/typescript-eslint"
1099
+
},
1100
+
"peerDependencies": {
1101
+
"eslint": "^8.57.0 || ^9.0.0",
1102
+
"typescript": ">=4.8.4 <6.0.0"
1103
+
}
1104
+
},
1105
+
"node_modules/@typescript-eslint/visitor-keys": {
1106
+
"version": "8.46.0",
1107
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
1108
+
"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
1109
+
"dev": true,
1110
+
"license": "MIT",
1111
+
"dependencies": {
1112
+
"@typescript-eslint/types": "8.46.0",
1113
+
"eslint-visitor-keys": "^4.2.1"
1114
+
},
1115
+
"engines": {
1116
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1117
+
},
1118
+
"funding": {
1119
+
"type": "opencollective",
1120
+
"url": "https://opencollective.com/typescript-eslint"
1121
+
}
1122
+
},
1123
+
"node_modules/@vitejs/plugin-react": {
1124
+
"version": "5.0.4",
1125
+
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz",
1126
+
"integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==",
1127
+
"dev": true,
1128
+
"license": "MIT",
1129
+
"dependencies": {
1130
+
"@babel/core": "^7.28.4",
1131
+
"@babel/plugin-transform-react-jsx-self": "^7.27.1",
1132
+
"@babel/plugin-transform-react-jsx-source": "^7.27.1",
1133
+
"@rolldown/pluginutils": "1.0.0-beta.38",
1134
+
"@types/babel__core": "^7.20.5",
1135
+
"react-refresh": "^0.17.0"
1136
+
},
1137
+
"engines": {
1138
+
"node": "^20.19.0 || >=22.12.0"
1139
+
},
1140
+
"peerDependencies": {
1141
+
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
1142
+
}
1143
+
},
1144
+
"node_modules/acorn": {
1145
+
"version": "8.15.0",
1146
+
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
1147
+
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
1148
+
"dev": true,
1149
+
"license": "MIT",
1150
+
"bin": {
1151
+
"acorn": "bin/acorn"
1152
+
},
1153
+
"engines": {
1154
+
"node": ">=0.4.0"
1155
+
}
1156
+
},
1157
+
"node_modules/acorn-jsx": {
1158
+
"version": "5.3.2",
1159
+
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
1160
+
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
1161
+
"dev": true,
1162
+
"license": "MIT",
1163
+
"peerDependencies": {
1164
+
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
1165
+
}
1166
+
},
1167
+
"node_modules/ajv": {
1168
+
"version": "6.12.6",
1169
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
1170
+
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
1171
+
"dev": true,
1172
+
"license": "MIT",
1173
+
"dependencies": {
1174
+
"fast-deep-equal": "^3.1.1",
1175
+
"fast-json-stable-stringify": "^2.0.0",
1176
+
"json-schema-traverse": "^0.4.1",
1177
+
"uri-js": "^4.2.2"
1178
+
},
1179
+
"funding": {
1180
+
"type": "github",
1181
+
"url": "https://github.com/sponsors/epoberezkin"
1182
+
}
1183
+
},
1184
+
"node_modules/ansi-styles": {
1185
+
"version": "4.3.0",
1186
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
1187
+
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
1188
+
"dev": true,
1189
+
"license": "MIT",
1190
+
"dependencies": {
1191
+
"color-convert": "^2.0.1"
1192
+
},
1193
+
"engines": {
1194
+
"node": ">=8"
1195
+
},
1196
+
"funding": {
1197
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
1198
+
}
1199
+
},
1200
+
"node_modules/ansis": {
1201
+
"version": "4.2.0",
1202
+
"resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
1203
+
"integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
1204
+
"dev": true,
1205
+
"license": "ISC",
1206
+
"engines": {
1207
+
"node": ">=14"
1208
+
}
1209
+
},
1210
+
"node_modules/argparse": {
1211
+
"version": "2.0.1",
1212
+
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1213
+
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
1214
+
"dev": true,
1215
+
"license": "Python-2.0"
1216
+
},
1217
+
"node_modules/balanced-match": {
1218
+
"version": "1.0.2",
1219
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
1220
+
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
1221
+
"dev": true,
1222
+
"license": "MIT"
1223
+
},
1224
+
"node_modules/baseline-browser-mapping": {
1225
+
"version": "2.8.13",
1226
+
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz",
1227
+
"integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==",
1228
+
"dev": true,
1229
+
"license": "Apache-2.0",
1230
+
"bin": {
1231
+
"baseline-browser-mapping": "dist/cli.js"
1232
+
}
1233
+
},
1234
+
"node_modules/brace-expansion": {
1235
+
"version": "1.1.12",
1236
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
1237
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
1238
+
"dev": true,
1239
+
"license": "MIT",
1240
+
"dependencies": {
1241
+
"balanced-match": "^1.0.0",
1242
+
"concat-map": "0.0.1"
1243
+
}
1244
+
},
1245
+
"node_modules/braces": {
1246
+
"version": "3.0.3",
1247
+
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
1248
+
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
1249
+
"dev": true,
1250
+
"license": "MIT",
1251
+
"dependencies": {
1252
+
"fill-range": "^7.1.1"
1253
+
},
1254
+
"engines": {
1255
+
"node": ">=8"
1256
+
}
1257
+
},
1258
+
"node_modules/browserslist": {
1259
+
"version": "4.26.3",
1260
+
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
1261
+
"integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
1262
+
"dev": true,
1263
+
"funding": [
1264
+
{
1265
+
"type": "opencollective",
1266
+
"url": "https://opencollective.com/browserslist"
1267
+
},
1268
+
{
1269
+
"type": "tidelift",
1270
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
1271
+
},
1272
+
{
1273
+
"type": "github",
1274
+
"url": "https://github.com/sponsors/ai"
1275
+
}
1276
+
],
1277
+
"license": "MIT",
1278
+
"dependencies": {
1279
+
"baseline-browser-mapping": "^2.8.9",
1280
+
"caniuse-lite": "^1.0.30001746",
1281
+
"electron-to-chromium": "^1.5.227",
1282
+
"node-releases": "^2.0.21",
1283
+
"update-browserslist-db": "^1.1.3"
1284
+
},
1285
+
"bin": {
1286
+
"browserslist": "cli.js"
1287
+
},
1288
+
"engines": {
1289
+
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
1290
+
}
1291
+
},
1292
+
"node_modules/callsites": {
1293
+
"version": "3.1.0",
1294
+
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
1295
+
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
1296
+
"dev": true,
1297
+
"license": "MIT",
1298
+
"engines": {
1299
+
"node": ">=6"
1300
+
}
1301
+
},
1302
+
"node_modules/caniuse-lite": {
1303
+
"version": "1.0.30001748",
1304
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz",
1305
+
"integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==",
1306
+
"dev": true,
1307
+
"funding": [
1308
+
{
1309
+
"type": "opencollective",
1310
+
"url": "https://opencollective.com/browserslist"
1311
+
},
1312
+
{
1313
+
"type": "tidelift",
1314
+
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
1315
+
},
1316
+
{
1317
+
"type": "github",
1318
+
"url": "https://github.com/sponsors/ai"
1319
+
}
1320
+
],
1321
+
"license": "CC-BY-4.0"
1322
+
},
1323
+
"node_modules/chalk": {
1324
+
"version": "4.1.2",
1325
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
1326
+
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
1327
+
"dev": true,
1328
+
"license": "MIT",
1329
+
"dependencies": {
1330
+
"ansi-styles": "^4.1.0",
1331
+
"supports-color": "^7.1.0"
1332
+
},
1333
+
"engines": {
1334
+
"node": ">=10"
1335
+
},
1336
+
"funding": {
1337
+
"url": "https://github.com/chalk/chalk?sponsor=1"
1338
+
}
1339
+
},
1340
+
"node_modules/color-convert": {
1341
+
"version": "2.0.1",
1342
+
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1343
+
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1344
+
"dev": true,
1345
+
"license": "MIT",
1346
+
"dependencies": {
1347
+
"color-name": "~1.1.4"
1348
+
},
1349
+
"engines": {
1350
+
"node": ">=7.0.0"
1351
+
}
1352
+
},
1353
+
"node_modules/color-name": {
1354
+
"version": "1.1.4",
1355
+
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1356
+
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1357
+
"dev": true,
1358
+
"license": "MIT"
1359
+
},
1360
+
"node_modules/concat-map": {
1361
+
"version": "0.0.1",
1362
+
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
1363
+
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
1364
+
"dev": true,
1365
+
"license": "MIT"
1366
+
},
1367
+
"node_modules/convert-source-map": {
1368
+
"version": "2.0.0",
1369
+
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
1370
+
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
1371
+
"dev": true,
1372
+
"license": "MIT"
1373
+
},
1374
+
"node_modules/cross-spawn": {
1375
+
"version": "7.0.6",
1376
+
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1377
+
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1378
+
"dev": true,
1379
+
"license": "MIT",
1380
+
"dependencies": {
1381
+
"path-key": "^3.1.0",
1382
+
"shebang-command": "^2.0.0",
1383
+
"which": "^2.0.1"
1384
+
},
1385
+
"engines": {
1386
+
"node": ">= 8"
1387
+
}
1388
+
},
1389
+
"node_modules/csstype": {
1390
+
"version": "3.1.3",
1391
+
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
1392
+
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
1393
+
"dev": true,
1394
+
"license": "MIT"
1395
+
},
1396
+
"node_modules/debug": {
1397
+
"version": "4.4.3",
1398
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
1399
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
1400
+
"dev": true,
1401
+
"license": "MIT",
1402
+
"dependencies": {
1403
+
"ms": "^2.1.3"
1404
+
},
1405
+
"engines": {
1406
+
"node": ">=6.0"
1407
+
},
1408
+
"peerDependenciesMeta": {
1409
+
"supports-color": {
1410
+
"optional": true
1411
+
}
1412
+
}
1413
+
},
1414
+
"node_modules/deep-is": {
1415
+
"version": "0.1.4",
1416
+
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
1417
+
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
1418
+
"dev": true,
1419
+
"license": "MIT"
1420
+
},
1421
+
"node_modules/detect-libc": {
1422
+
"version": "2.1.2",
1423
+
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
1424
+
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
1425
+
"dev": true,
1426
+
"license": "Apache-2.0",
1427
+
"engines": {
1428
+
"node": ">=8"
1429
+
}
1430
+
},
1431
+
"node_modules/electron-to-chromium": {
1432
+
"version": "1.5.232",
1433
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz",
1434
+
"integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==",
1435
+
"dev": true,
1436
+
"license": "ISC"
1437
+
},
1438
+
"node_modules/escalade": {
1439
+
"version": "3.2.0",
1440
+
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1441
+
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1442
+
"dev": true,
1443
+
"license": "MIT",
1444
+
"engines": {
1445
+
"node": ">=6"
1446
+
}
1447
+
},
1448
+
"node_modules/escape-string-regexp": {
1449
+
"version": "4.0.0",
1450
+
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1451
+
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1452
+
"dev": true,
1453
+
"license": "MIT",
1454
+
"engines": {
1455
+
"node": ">=10"
1456
+
},
1457
+
"funding": {
1458
+
"url": "https://github.com/sponsors/sindresorhus"
1459
+
}
1460
+
},
1461
+
"node_modules/eslint": {
1462
+
"version": "9.37.0",
1463
+
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz",
1464
+
"integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
1465
+
"dev": true,
1466
+
"license": "MIT",
1467
+
"dependencies": {
1468
+
"@eslint-community/eslint-utils": "^4.8.0",
1469
+
"@eslint-community/regexpp": "^4.12.1",
1470
+
"@eslint/config-array": "^0.21.0",
1471
+
"@eslint/config-helpers": "^0.4.0",
1472
+
"@eslint/core": "^0.16.0",
1473
+
"@eslint/eslintrc": "^3.3.1",
1474
+
"@eslint/js": "9.37.0",
1475
+
"@eslint/plugin-kit": "^0.4.0",
1476
+
"@humanfs/node": "^0.16.6",
1477
+
"@humanwhocodes/module-importer": "^1.0.1",
1478
+
"@humanwhocodes/retry": "^0.4.2",
1479
+
"@types/estree": "^1.0.6",
1480
+
"@types/json-schema": "^7.0.15",
1481
+
"ajv": "^6.12.4",
1482
+
"chalk": "^4.0.0",
1483
+
"cross-spawn": "^7.0.6",
1484
+
"debug": "^4.3.2",
1485
+
"escape-string-regexp": "^4.0.0",
1486
+
"eslint-scope": "^8.4.0",
1487
+
"eslint-visitor-keys": "^4.2.1",
1488
+
"espree": "^10.4.0",
1489
+
"esquery": "^1.5.0",
1490
+
"esutils": "^2.0.2",
1491
+
"fast-deep-equal": "^3.1.3",
1492
+
"file-entry-cache": "^8.0.0",
1493
+
"find-up": "^5.0.0",
1494
+
"glob-parent": "^6.0.2",
1495
+
"ignore": "^5.2.0",
1496
+
"imurmurhash": "^0.1.4",
1497
+
"is-glob": "^4.0.0",
1498
+
"json-stable-stringify-without-jsonify": "^1.0.1",
1499
+
"lodash.merge": "^4.6.2",
1500
+
"minimatch": "^3.1.2",
1501
+
"natural-compare": "^1.4.0",
1502
+
"optionator": "^0.9.3"
1503
+
},
1504
+
"bin": {
1505
+
"eslint": "bin/eslint.js"
1506
+
},
1507
+
"engines": {
1508
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1509
+
},
1510
+
"funding": {
1511
+
"url": "https://eslint.org/donate"
1512
+
},
1513
+
"peerDependencies": {
1514
+
"jiti": "*"
1515
+
},
1516
+
"peerDependenciesMeta": {
1517
+
"jiti": {
1518
+
"optional": true
1519
+
}
1520
+
}
1521
+
},
1522
+
"node_modules/eslint-plugin-react-hooks": {
1523
+
"version": "5.2.0",
1524
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
1525
+
"integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
1526
+
"dev": true,
1527
+
"license": "MIT",
1528
+
"engines": {
1529
+
"node": ">=10"
1530
+
},
1531
+
"peerDependencies": {
1532
+
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
1533
+
}
1534
+
},
1535
+
"node_modules/eslint-plugin-react-refresh": {
1536
+
"version": "0.4.23",
1537
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.23.tgz",
1538
+
"integrity": "sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==",
1539
+
"dev": true,
1540
+
"license": "MIT",
1541
+
"peerDependencies": {
1542
+
"eslint": ">=8.40"
1543
+
}
1544
+
},
1545
+
"node_modules/eslint-scope": {
1546
+
"version": "8.4.0",
1547
+
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
1548
+
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
1549
+
"dev": true,
1550
+
"license": "BSD-2-Clause",
1551
+
"dependencies": {
1552
+
"esrecurse": "^4.3.0",
1553
+
"estraverse": "^5.2.0"
1554
+
},
1555
+
"engines": {
1556
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1557
+
},
1558
+
"funding": {
1559
+
"url": "https://opencollective.com/eslint"
1560
+
}
1561
+
},
1562
+
"node_modules/eslint-visitor-keys": {
1563
+
"version": "4.2.1",
1564
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
1565
+
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
1566
+
"dev": true,
1567
+
"license": "Apache-2.0",
1568
+
"engines": {
1569
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1570
+
},
1571
+
"funding": {
1572
+
"url": "https://opencollective.com/eslint"
1573
+
}
1574
+
},
1575
+
"node_modules/esm-env": {
1576
+
"version": "1.2.2",
1577
+
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
1578
+
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
1579
+
"license": "MIT"
1580
+
},
1581
+
"node_modules/espree": {
1582
+
"version": "10.4.0",
1583
+
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
1584
+
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
1585
+
"dev": true,
1586
+
"license": "BSD-2-Clause",
1587
+
"dependencies": {
1588
+
"acorn": "^8.15.0",
1589
+
"acorn-jsx": "^5.3.2",
1590
+
"eslint-visitor-keys": "^4.2.1"
1591
+
},
1592
+
"engines": {
1593
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1594
+
},
1595
+
"funding": {
1596
+
"url": "https://opencollective.com/eslint"
1597
+
}
1598
+
},
1599
+
"node_modules/esquery": {
1600
+
"version": "1.6.0",
1601
+
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
1602
+
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
1603
+
"dev": true,
1604
+
"license": "BSD-3-Clause",
1605
+
"dependencies": {
1606
+
"estraverse": "^5.1.0"
1607
+
},
1608
+
"engines": {
1609
+
"node": ">=0.10"
1610
+
}
1611
+
},
1612
+
"node_modules/esrecurse": {
1613
+
"version": "4.3.0",
1614
+
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
1615
+
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
1616
+
"dev": true,
1617
+
"license": "BSD-2-Clause",
1618
+
"dependencies": {
1619
+
"estraverse": "^5.2.0"
1620
+
},
1621
+
"engines": {
1622
+
"node": ">=4.0"
1623
+
}
1624
+
},
1625
+
"node_modules/estraverse": {
1626
+
"version": "5.3.0",
1627
+
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
1628
+
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
1629
+
"dev": true,
1630
+
"license": "BSD-2-Clause",
1631
+
"engines": {
1632
+
"node": ">=4.0"
1633
+
}
1634
+
},
1635
+
"node_modules/esutils": {
1636
+
"version": "2.0.3",
1637
+
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1638
+
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1639
+
"dev": true,
1640
+
"license": "BSD-2-Clause",
1641
+
"engines": {
1642
+
"node": ">=0.10.0"
1643
+
}
1644
+
},
1645
+
"node_modules/fast-deep-equal": {
1646
+
"version": "3.1.3",
1647
+
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1648
+
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1649
+
"dev": true,
1650
+
"license": "MIT"
1651
+
},
1652
+
"node_modules/fast-glob": {
1653
+
"version": "3.3.3",
1654
+
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1655
+
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1656
+
"dev": true,
1657
+
"license": "MIT",
1658
+
"dependencies": {
1659
+
"@nodelib/fs.stat": "^2.0.2",
1660
+
"@nodelib/fs.walk": "^1.2.3",
1661
+
"glob-parent": "^5.1.2",
1662
+
"merge2": "^1.3.0",
1663
+
"micromatch": "^4.0.8"
1664
+
},
1665
+
"engines": {
1666
+
"node": ">=8.6.0"
1667
+
}
1668
+
},
1669
+
"node_modules/fast-glob/node_modules/glob-parent": {
1670
+
"version": "5.1.2",
1671
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1672
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1673
+
"dev": true,
1674
+
"license": "ISC",
1675
+
"dependencies": {
1676
+
"is-glob": "^4.0.1"
1677
+
},
1678
+
"engines": {
1679
+
"node": ">= 6"
1680
+
}
1681
+
},
1682
+
"node_modules/fast-json-stable-stringify": {
1683
+
"version": "2.1.0",
1684
+
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1685
+
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1686
+
"dev": true,
1687
+
"license": "MIT"
1688
+
},
1689
+
"node_modules/fast-levenshtein": {
1690
+
"version": "2.0.6",
1691
+
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1692
+
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
1693
+
"dev": true,
1694
+
"license": "MIT"
1695
+
},
1696
+
"node_modules/fastq": {
1697
+
"version": "1.19.1",
1698
+
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
1699
+
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
1700
+
"dev": true,
1701
+
"license": "ISC",
1702
+
"dependencies": {
1703
+
"reusify": "^1.0.4"
1704
+
}
1705
+
},
1706
+
"node_modules/file-entry-cache": {
1707
+
"version": "8.0.0",
1708
+
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
1709
+
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
1710
+
"dev": true,
1711
+
"license": "MIT",
1712
+
"dependencies": {
1713
+
"flat-cache": "^4.0.0"
1714
+
},
1715
+
"engines": {
1716
+
"node": ">=16.0.0"
1717
+
}
1718
+
},
1719
+
"node_modules/fill-range": {
1720
+
"version": "7.1.1",
1721
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1722
+
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1723
+
"dev": true,
1724
+
"license": "MIT",
1725
+
"dependencies": {
1726
+
"to-regex-range": "^5.0.1"
1727
+
},
1728
+
"engines": {
1729
+
"node": ">=8"
1730
+
}
1731
+
},
1732
+
"node_modules/find-up": {
1733
+
"version": "5.0.0",
1734
+
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1735
+
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1736
+
"dev": true,
1737
+
"license": "MIT",
1738
+
"dependencies": {
1739
+
"locate-path": "^6.0.0",
1740
+
"path-exists": "^4.0.0"
1741
+
},
1742
+
"engines": {
1743
+
"node": ">=10"
1744
+
},
1745
+
"funding": {
1746
+
"url": "https://github.com/sponsors/sindresorhus"
1747
+
}
1748
+
},
1749
+
"node_modules/flat-cache": {
1750
+
"version": "4.0.1",
1751
+
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
1752
+
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
1753
+
"dev": true,
1754
+
"license": "MIT",
1755
+
"dependencies": {
1756
+
"flatted": "^3.2.9",
1757
+
"keyv": "^4.5.4"
1758
+
},
1759
+
"engines": {
1760
+
"node": ">=16"
1761
+
}
1762
+
},
1763
+
"node_modules/flatted": {
1764
+
"version": "3.3.3",
1765
+
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
1766
+
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
1767
+
"dev": true,
1768
+
"license": "ISC"
1769
+
},
1770
+
"node_modules/fsevents": {
1771
+
"version": "2.3.3",
1772
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1773
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1774
+
"dev": true,
1775
+
"hasInstallScript": true,
1776
+
"license": "MIT",
1777
+
"optional": true,
1778
+
"os": [
1779
+
"darwin"
1780
+
],
1781
+
"engines": {
1782
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1783
+
}
1784
+
},
1785
+
"node_modules/gensync": {
1786
+
"version": "1.0.0-beta.2",
1787
+
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
1788
+
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
1789
+
"dev": true,
1790
+
"license": "MIT",
1791
+
"engines": {
1792
+
"node": ">=6.9.0"
1793
+
}
1794
+
},
1795
+
"node_modules/glob-parent": {
1796
+
"version": "6.0.2",
1797
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1798
+
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1799
+
"dev": true,
1800
+
"license": "ISC",
1801
+
"dependencies": {
1802
+
"is-glob": "^4.0.3"
1803
+
},
1804
+
"engines": {
1805
+
"node": ">=10.13.0"
1806
+
}
1807
+
},
1808
+
"node_modules/globals": {
1809
+
"version": "16.4.0",
1810
+
"resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
1811
+
"integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
1812
+
"dev": true,
1813
+
"license": "MIT",
1814
+
"engines": {
1815
+
"node": ">=18"
1816
+
},
1817
+
"funding": {
1818
+
"url": "https://github.com/sponsors/sindresorhus"
1819
+
}
1820
+
},
1821
+
"node_modules/graphemer": {
1822
+
"version": "1.4.0",
1823
+
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
1824
+
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
1825
+
"dev": true,
1826
+
"license": "MIT"
1827
+
},
1828
+
"node_modules/has-flag": {
1829
+
"version": "4.0.0",
1830
+
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1831
+
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1832
+
"dev": true,
1833
+
"license": "MIT",
1834
+
"engines": {
1835
+
"node": ">=8"
1836
+
}
1837
+
},
1838
+
"node_modules/ignore": {
1839
+
"version": "5.3.2",
1840
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
1841
+
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
1842
+
"dev": true,
1843
+
"license": "MIT",
1844
+
"engines": {
1845
+
"node": ">= 4"
1846
+
}
1847
+
},
1848
+
"node_modules/import-fresh": {
1849
+
"version": "3.3.1",
1850
+
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
1851
+
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
1852
+
"dev": true,
1853
+
"license": "MIT",
1854
+
"dependencies": {
1855
+
"parent-module": "^1.0.0",
1856
+
"resolve-from": "^4.0.0"
1857
+
},
1858
+
"engines": {
1859
+
"node": ">=6"
1860
+
},
1861
+
"funding": {
1862
+
"url": "https://github.com/sponsors/sindresorhus"
1863
+
}
1864
+
},
1865
+
"node_modules/imurmurhash": {
1866
+
"version": "0.1.4",
1867
+
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1868
+
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
1869
+
"dev": true,
1870
+
"license": "MIT",
1871
+
"engines": {
1872
+
"node": ">=0.8.19"
1873
+
}
1874
+
},
1875
+
"node_modules/is-extglob": {
1876
+
"version": "2.1.1",
1877
+
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1878
+
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1879
+
"dev": true,
1880
+
"license": "MIT",
1881
+
"engines": {
1882
+
"node": ">=0.10.0"
1883
+
}
1884
+
},
1885
+
"node_modules/is-glob": {
1886
+
"version": "4.0.3",
1887
+
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1888
+
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1889
+
"dev": true,
1890
+
"license": "MIT",
1891
+
"dependencies": {
1892
+
"is-extglob": "^2.1.1"
1893
+
},
1894
+
"engines": {
1895
+
"node": ">=0.10.0"
1896
+
}
1897
+
},
1898
+
"node_modules/is-number": {
1899
+
"version": "7.0.0",
1900
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1901
+
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1902
+
"dev": true,
1903
+
"license": "MIT",
1904
+
"engines": {
1905
+
"node": ">=0.12.0"
1906
+
}
1907
+
},
1908
+
"node_modules/isexe": {
1909
+
"version": "2.0.0",
1910
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1911
+
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1912
+
"dev": true,
1913
+
"license": "ISC"
1914
+
},
1915
+
"node_modules/js-tokens": {
1916
+
"version": "4.0.0",
1917
+
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1918
+
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1919
+
"dev": true,
1920
+
"license": "MIT"
1921
+
},
1922
+
"node_modules/js-yaml": {
1923
+
"version": "4.1.0",
1924
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1925
+
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1926
+
"dev": true,
1927
+
"license": "MIT",
1928
+
"dependencies": {
1929
+
"argparse": "^2.0.1"
1930
+
},
1931
+
"bin": {
1932
+
"js-yaml": "bin/js-yaml.js"
1933
+
}
1934
+
},
1935
+
"node_modules/jsesc": {
1936
+
"version": "3.1.0",
1937
+
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
1938
+
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
1939
+
"dev": true,
1940
+
"license": "MIT",
1941
+
"bin": {
1942
+
"jsesc": "bin/jsesc"
1943
+
},
1944
+
"engines": {
1945
+
"node": ">=6"
1946
+
}
1947
+
},
1948
+
"node_modules/json-buffer": {
1949
+
"version": "3.0.1",
1950
+
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
1951
+
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
1952
+
"dev": true,
1953
+
"license": "MIT"
1954
+
},
1955
+
"node_modules/json-schema-traverse": {
1956
+
"version": "0.4.1",
1957
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1958
+
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1959
+
"dev": true,
1960
+
"license": "MIT"
1961
+
},
1962
+
"node_modules/json-stable-stringify-without-jsonify": {
1963
+
"version": "1.0.1",
1964
+
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1965
+
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
1966
+
"dev": true,
1967
+
"license": "MIT"
1968
+
},
1969
+
"node_modules/json5": {
1970
+
"version": "2.2.3",
1971
+
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
1972
+
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
1973
+
"dev": true,
1974
+
"license": "MIT",
1975
+
"bin": {
1976
+
"json5": "lib/cli.js"
1977
+
},
1978
+
"engines": {
1979
+
"node": ">=6"
1980
+
}
1981
+
},
1982
+
"node_modules/keyv": {
1983
+
"version": "4.5.4",
1984
+
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
1985
+
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
1986
+
"dev": true,
1987
+
"license": "MIT",
1988
+
"dependencies": {
1989
+
"json-buffer": "3.0.1"
1990
+
}
1991
+
},
1992
+
"node_modules/levn": {
1993
+
"version": "0.4.1",
1994
+
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1995
+
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1996
+
"dev": true,
1997
+
"license": "MIT",
1998
+
"dependencies": {
1999
+
"prelude-ls": "^1.2.1",
2000
+
"type-check": "~0.4.0"
2001
+
},
2002
+
"engines": {
2003
+
"node": ">= 0.8.0"
2004
+
}
2005
+
},
2006
+
"node_modules/lightningcss": {
2007
+
"version": "1.30.2",
2008
+
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
2009
+
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
2010
+
"dev": true,
2011
+
"license": "MPL-2.0",
2012
+
"dependencies": {
2013
+
"detect-libc": "^2.0.3"
2014
+
},
2015
+
"engines": {
2016
+
"node": ">= 12.0.0"
2017
+
},
2018
+
"funding": {
2019
+
"type": "opencollective",
2020
+
"url": "https://opencollective.com/parcel"
2021
+
},
2022
+
"optionalDependencies": {
2023
+
"lightningcss-android-arm64": "1.30.2",
2024
+
"lightningcss-darwin-arm64": "1.30.2",
2025
+
"lightningcss-darwin-x64": "1.30.2",
2026
+
"lightningcss-freebsd-x64": "1.30.2",
2027
+
"lightningcss-linux-arm-gnueabihf": "1.30.2",
2028
+
"lightningcss-linux-arm64-gnu": "1.30.2",
2029
+
"lightningcss-linux-arm64-musl": "1.30.2",
2030
+
"lightningcss-linux-x64-gnu": "1.30.2",
2031
+
"lightningcss-linux-x64-musl": "1.30.2",
2032
+
"lightningcss-win32-arm64-msvc": "1.30.2",
2033
+
"lightningcss-win32-x64-msvc": "1.30.2"
2034
+
}
2035
+
},
2036
+
"node_modules/lightningcss-darwin-arm64": {
2037
+
"version": "1.30.2",
2038
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
2039
+
"integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
2040
+
"cpu": [
2041
+
"arm64"
2042
+
],
2043
+
"dev": true,
2044
+
"license": "MPL-2.0",
2045
+
"optional": true,
2046
+
"os": [
2047
+
"darwin"
2048
+
],
2049
+
"engines": {
2050
+
"node": ">= 12.0.0"
2051
+
},
2052
+
"funding": {
2053
+
"type": "opencollective",
2054
+
"url": "https://opencollective.com/parcel"
2055
+
}
2056
+
},
2057
+
"node_modules/locate-path": {
2058
+
"version": "6.0.0",
2059
+
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
2060
+
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
2061
+
"dev": true,
2062
+
"license": "MIT",
2063
+
"dependencies": {
2064
+
"p-locate": "^5.0.0"
2065
+
},
2066
+
"engines": {
2067
+
"node": ">=10"
2068
+
},
2069
+
"funding": {
2070
+
"url": "https://github.com/sponsors/sindresorhus"
2071
+
}
2072
+
},
2073
+
"node_modules/lodash.merge": {
2074
+
"version": "4.6.2",
2075
+
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
2076
+
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
2077
+
"dev": true,
2078
+
"license": "MIT"
2079
+
},
2080
+
"node_modules/lru-cache": {
2081
+
"version": "5.1.1",
2082
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
2083
+
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
2084
+
"dev": true,
2085
+
"license": "ISC",
2086
+
"dependencies": {
2087
+
"yallist": "^3.0.2"
2088
+
}
2089
+
},
2090
+
"node_modules/merge2": {
2091
+
"version": "1.4.1",
2092
+
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
2093
+
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
2094
+
"dev": true,
2095
+
"license": "MIT",
2096
+
"engines": {
2097
+
"node": ">= 8"
2098
+
}
2099
+
},
2100
+
"node_modules/micromatch": {
2101
+
"version": "4.0.8",
2102
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
2103
+
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
2104
+
"dev": true,
2105
+
"license": "MIT",
2106
+
"dependencies": {
2107
+
"braces": "^3.0.3",
2108
+
"picomatch": "^2.3.1"
2109
+
},
2110
+
"engines": {
2111
+
"node": ">=8.6"
2112
+
}
2113
+
},
2114
+
"node_modules/minimatch": {
2115
+
"version": "3.1.2",
2116
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
2117
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
2118
+
"dev": true,
2119
+
"license": "ISC",
2120
+
"dependencies": {
2121
+
"brace-expansion": "^1.1.7"
2122
+
},
2123
+
"engines": {
2124
+
"node": "*"
2125
+
}
2126
+
},
2127
+
"node_modules/ms": {
2128
+
"version": "2.1.3",
2129
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2130
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
2131
+
"dev": true,
2132
+
"license": "MIT"
2133
+
},
2134
+
"node_modules/nanoid": {
2135
+
"version": "3.3.11",
2136
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
2137
+
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
2138
+
"dev": true,
2139
+
"funding": [
2140
+
{
2141
+
"type": "github",
2142
+
"url": "https://github.com/sponsors/ai"
2143
+
}
2144
+
],
2145
+
"license": "MIT",
2146
+
"bin": {
2147
+
"nanoid": "bin/nanoid.cjs"
2148
+
},
2149
+
"engines": {
2150
+
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
2151
+
}
2152
+
},
2153
+
"node_modules/natural-compare": {
2154
+
"version": "1.4.0",
2155
+
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
2156
+
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
2157
+
"dev": true,
2158
+
"license": "MIT"
2159
+
},
2160
+
"node_modules/node-releases": {
2161
+
"version": "2.0.23",
2162
+
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
2163
+
"integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
2164
+
"dev": true,
2165
+
"license": "MIT"
2166
+
},
2167
+
"node_modules/optionator": {
2168
+
"version": "0.9.4",
2169
+
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
2170
+
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
2171
+
"dev": true,
2172
+
"license": "MIT",
2173
+
"dependencies": {
2174
+
"deep-is": "^0.1.3",
2175
+
"fast-levenshtein": "^2.0.6",
2176
+
"levn": "^0.4.1",
2177
+
"prelude-ls": "^1.2.1",
2178
+
"type-check": "^0.4.0",
2179
+
"word-wrap": "^1.2.5"
2180
+
},
2181
+
"engines": {
2182
+
"node": ">= 0.8.0"
2183
+
}
2184
+
},
2185
+
"node_modules/p-limit": {
2186
+
"version": "3.1.0",
2187
+
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
2188
+
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
2189
+
"dev": true,
2190
+
"license": "MIT",
2191
+
"dependencies": {
2192
+
"yocto-queue": "^0.1.0"
2193
+
},
2194
+
"engines": {
2195
+
"node": ">=10"
2196
+
},
2197
+
"funding": {
2198
+
"url": "https://github.com/sponsors/sindresorhus"
2199
+
}
2200
+
},
2201
+
"node_modules/p-locate": {
2202
+
"version": "5.0.0",
2203
+
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
2204
+
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
2205
+
"dev": true,
2206
+
"license": "MIT",
2207
+
"dependencies": {
2208
+
"p-limit": "^3.0.2"
2209
+
},
2210
+
"engines": {
2211
+
"node": ">=10"
2212
+
},
2213
+
"funding": {
2214
+
"url": "https://github.com/sponsors/sindresorhus"
2215
+
}
2216
+
},
2217
+
"node_modules/parent-module": {
2218
+
"version": "1.0.1",
2219
+
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
2220
+
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
2221
+
"dev": true,
2222
+
"license": "MIT",
2223
+
"dependencies": {
2224
+
"callsites": "^3.0.0"
2225
+
},
2226
+
"engines": {
2227
+
"node": ">=6"
2228
+
}
2229
+
},
2230
+
"node_modules/path-exists": {
2231
+
"version": "4.0.0",
2232
+
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
2233
+
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
2234
+
"dev": true,
2235
+
"license": "MIT",
2236
+
"engines": {
2237
+
"node": ">=8"
2238
+
}
2239
+
},
2240
+
"node_modules/path-key": {
2241
+
"version": "3.1.1",
2242
+
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
2243
+
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
2244
+
"dev": true,
2245
+
"license": "MIT",
2246
+
"engines": {
2247
+
"node": ">=8"
2248
+
}
2249
+
},
2250
+
"node_modules/picocolors": {
2251
+
"version": "1.1.1",
2252
+
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
2253
+
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
2254
+
"dev": true,
2255
+
"license": "ISC"
2256
+
},
2257
+
"node_modules/picomatch": {
2258
+
"version": "2.3.1",
2259
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
2260
+
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
2261
+
"dev": true,
2262
+
"license": "MIT",
2263
+
"engines": {
2264
+
"node": ">=8.6"
2265
+
},
2266
+
"funding": {
2267
+
"url": "https://github.com/sponsors/jonschlinkert"
2268
+
}
2269
+
},
2270
+
"node_modules/postcss": {
2271
+
"version": "8.5.6",
2272
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
2273
+
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
2274
+
"dev": true,
2275
+
"funding": [
2276
+
{
2277
+
"type": "opencollective",
2278
+
"url": "https://opencollective.com/postcss/"
2279
+
},
2280
+
{
2281
+
"type": "tidelift",
2282
+
"url": "https://tidelift.com/funding/github/npm/postcss"
2283
+
},
2284
+
{
2285
+
"type": "github",
2286
+
"url": "https://github.com/sponsors/ai"
2287
+
}
2288
+
],
2289
+
"license": "MIT",
2290
+
"dependencies": {
2291
+
"nanoid": "^3.3.11",
2292
+
"picocolors": "^1.1.1",
2293
+
"source-map-js": "^1.2.1"
2294
+
},
2295
+
"engines": {
2296
+
"node": "^10 || ^12 || >=14"
2297
+
}
2298
+
},
2299
+
"node_modules/prelude-ls": {
2300
+
"version": "1.2.1",
2301
+
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
2302
+
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
2303
+
"dev": true,
2304
+
"license": "MIT",
2305
+
"engines": {
2306
+
"node": ">= 0.8.0"
2307
+
}
2308
+
},
2309
+
"node_modules/punycode": {
2310
+
"version": "2.3.1",
2311
+
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
2312
+
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
2313
+
"dev": true,
2314
+
"license": "MIT",
2315
+
"engines": {
2316
+
"node": ">=6"
2317
+
}
2318
+
},
2319
+
"node_modules/queue-microtask": {
2320
+
"version": "1.2.3",
2321
+
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
2322
+
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
2323
+
"dev": true,
2324
+
"funding": [
2325
+
{
2326
+
"type": "github",
2327
+
"url": "https://github.com/sponsors/feross"
2328
+
},
2329
+
{
2330
+
"type": "patreon",
2331
+
"url": "https://www.patreon.com/feross"
2332
+
},
2333
+
{
2334
+
"type": "consulting",
2335
+
"url": "https://feross.org/support"
2336
+
}
2337
+
],
2338
+
"license": "MIT"
2339
+
},
2340
+
"node_modules/react": {
2341
+
"version": "19.2.0",
2342
+
"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
2343
+
"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
2344
+
"dev": true,
2345
+
"license": "MIT",
2346
+
"engines": {
2347
+
"node": ">=0.10.0"
2348
+
}
2349
+
},
2350
+
"node_modules/react-dom": {
2351
+
"version": "19.2.0",
2352
+
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
2353
+
"integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
2354
+
"dev": true,
2355
+
"license": "MIT",
2356
+
"dependencies": {
2357
+
"scheduler": "^0.27.0"
2358
+
},
2359
+
"peerDependencies": {
2360
+
"react": "^19.2.0"
2361
+
}
2362
+
},
2363
+
"node_modules/react-refresh": {
2364
+
"version": "0.17.0",
2365
+
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
2366
+
"integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
2367
+
"dev": true,
2368
+
"license": "MIT",
2369
+
"engines": {
2370
+
"node": ">=0.10.0"
2371
+
}
2372
+
},
2373
+
"node_modules/resolve-from": {
2374
+
"version": "4.0.0",
2375
+
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2376
+
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2377
+
"dev": true,
2378
+
"license": "MIT",
2379
+
"engines": {
2380
+
"node": ">=4"
2381
+
}
2382
+
},
2383
+
"node_modules/reusify": {
2384
+
"version": "1.1.0",
2385
+
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
2386
+
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
2387
+
"dev": true,
2388
+
"license": "MIT",
2389
+
"engines": {
2390
+
"iojs": ">=1.0.0",
2391
+
"node": ">=0.10.0"
2392
+
}
2393
+
},
2394
+
"node_modules/rolldown": {
2395
+
"version": "1.0.0-beta.41",
2396
+
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.41.tgz",
2397
+
"integrity": "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==",
2398
+
"dev": true,
2399
+
"license": "MIT",
2400
+
"dependencies": {
2401
+
"@oxc-project/types": "=0.93.0",
2402
+
"@rolldown/pluginutils": "1.0.0-beta.41",
2403
+
"ansis": "=4.2.0"
2404
+
},
2405
+
"bin": {
2406
+
"rolldown": "bin/cli.mjs"
2407
+
},
2408
+
"engines": {
2409
+
"node": "^20.19.0 || >=22.12.0"
2410
+
},
2411
+
"optionalDependencies": {
2412
+
"@rolldown/binding-android-arm64": "1.0.0-beta.41",
2413
+
"@rolldown/binding-darwin-arm64": "1.0.0-beta.41",
2414
+
"@rolldown/binding-darwin-x64": "1.0.0-beta.41",
2415
+
"@rolldown/binding-freebsd-x64": "1.0.0-beta.41",
2416
+
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41",
2417
+
"@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41",
2418
+
"@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41",
2419
+
"@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41",
2420
+
"@rolldown/binding-linux-x64-musl": "1.0.0-beta.41",
2421
+
"@rolldown/binding-openharmony-arm64": "1.0.0-beta.41",
2422
+
"@rolldown/binding-wasm32-wasi": "1.0.0-beta.41",
2423
+
"@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41",
2424
+
"@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41",
2425
+
"@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41"
2426
+
}
2427
+
},
2428
+
"node_modules/rolldown/node_modules/@rolldown/pluginutils": {
2429
+
"version": "1.0.0-beta.41",
2430
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.41.tgz",
2431
+
"integrity": "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==",
2432
+
"dev": true,
2433
+
"license": "MIT"
2434
+
},
2435
+
"node_modules/run-parallel": {
2436
+
"version": "1.2.0",
2437
+
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2438
+
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2439
+
"dev": true,
2440
+
"funding": [
2441
+
{
2442
+
"type": "github",
2443
+
"url": "https://github.com/sponsors/feross"
2444
+
},
2445
+
{
2446
+
"type": "patreon",
2447
+
"url": "https://www.patreon.com/feross"
2448
+
},
2449
+
{
2450
+
"type": "consulting",
2451
+
"url": "https://feross.org/support"
2452
+
}
2453
+
],
2454
+
"license": "MIT",
2455
+
"dependencies": {
2456
+
"queue-microtask": "^1.2.2"
2457
+
}
2458
+
},
2459
+
"node_modules/scheduler": {
2460
+
"version": "0.27.0",
2461
+
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
2462
+
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
2463
+
"dev": true,
2464
+
"license": "MIT"
2465
+
},
2466
+
"node_modules/semver": {
2467
+
"version": "6.3.1",
2468
+
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
2469
+
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
2470
+
"dev": true,
2471
+
"license": "ISC",
2472
+
"bin": {
2473
+
"semver": "bin/semver.js"
2474
+
}
2475
+
},
2476
+
"node_modules/shebang-command": {
2477
+
"version": "2.0.0",
2478
+
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2479
+
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2480
+
"dev": true,
2481
+
"license": "MIT",
2482
+
"dependencies": {
2483
+
"shebang-regex": "^3.0.0"
2484
+
},
2485
+
"engines": {
2486
+
"node": ">=8"
2487
+
}
2488
+
},
2489
+
"node_modules/shebang-regex": {
2490
+
"version": "3.0.0",
2491
+
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2492
+
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2493
+
"dev": true,
2494
+
"license": "MIT",
2495
+
"engines": {
2496
+
"node": ">=8"
2497
+
}
2498
+
},
2499
+
"node_modules/source-map-js": {
2500
+
"version": "1.2.1",
2501
+
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
2502
+
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
2503
+
"dev": true,
2504
+
"license": "BSD-3-Clause",
2505
+
"engines": {
2506
+
"node": ">=0.10.0"
2507
+
}
2508
+
},
2509
+
"node_modules/strip-json-comments": {
2510
+
"version": "3.1.1",
2511
+
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2512
+
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2513
+
"dev": true,
2514
+
"license": "MIT",
2515
+
"engines": {
2516
+
"node": ">=8"
2517
+
},
2518
+
"funding": {
2519
+
"url": "https://github.com/sponsors/sindresorhus"
2520
+
}
2521
+
},
2522
+
"node_modules/supports-color": {
2523
+
"version": "7.2.0",
2524
+
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
2525
+
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
2526
+
"dev": true,
2527
+
"license": "MIT",
2528
+
"dependencies": {
2529
+
"has-flag": "^4.0.0"
2530
+
},
2531
+
"engines": {
2532
+
"node": ">=8"
2533
+
}
2534
+
},
2535
+
"node_modules/tinyglobby": {
2536
+
"version": "0.2.15",
2537
+
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
2538
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
2539
+
"dev": true,
2540
+
"license": "MIT",
2541
+
"dependencies": {
2542
+
"fdir": "^6.5.0",
2543
+
"picomatch": "^4.0.3"
2544
+
},
2545
+
"engines": {
2546
+
"node": ">=12.0.0"
2547
+
},
2548
+
"funding": {
2549
+
"url": "https://github.com/sponsors/SuperchupuDev"
2550
+
}
2551
+
},
2552
+
"node_modules/tinyglobby/node_modules/fdir": {
2553
+
"version": "6.5.0",
2554
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2555
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2556
+
"dev": true,
2557
+
"license": "MIT",
2558
+
"engines": {
2559
+
"node": ">=12.0.0"
2560
+
},
2561
+
"peerDependencies": {
2562
+
"picomatch": "^3 || ^4"
2563
+
},
2564
+
"peerDependenciesMeta": {
2565
+
"picomatch": {
2566
+
"optional": true
2567
+
}
2568
+
}
2569
+
},
2570
+
"node_modules/tinyglobby/node_modules/picomatch": {
2571
+
"version": "4.0.3",
2572
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2573
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2574
+
"dev": true,
2575
+
"license": "MIT",
2576
+
"engines": {
2577
+
"node": ">=12"
2578
+
},
2579
+
"funding": {
2580
+
"url": "https://github.com/sponsors/jonschlinkert"
2581
+
}
2582
+
},
2583
+
"node_modules/to-regex-range": {
2584
+
"version": "5.0.1",
2585
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2586
+
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2587
+
"dev": true,
2588
+
"license": "MIT",
2589
+
"dependencies": {
2590
+
"is-number": "^7.0.0"
2591
+
},
2592
+
"engines": {
2593
+
"node": ">=8.0"
2594
+
}
2595
+
},
2596
+
"node_modules/ts-api-utils": {
2597
+
"version": "2.1.0",
2598
+
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
2599
+
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
2600
+
"dev": true,
2601
+
"license": "MIT",
2602
+
"engines": {
2603
+
"node": ">=18.12"
2604
+
},
2605
+
"peerDependencies": {
2606
+
"typescript": ">=4.8.4"
2607
+
}
2608
+
},
2609
+
"node_modules/type-check": {
2610
+
"version": "0.4.0",
2611
+
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2612
+
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2613
+
"dev": true,
2614
+
"license": "MIT",
2615
+
"dependencies": {
2616
+
"prelude-ls": "^1.2.1"
2617
+
},
2618
+
"engines": {
2619
+
"node": ">= 0.8.0"
2620
+
}
2621
+
},
2622
+
"node_modules/typescript": {
2623
+
"version": "5.9.3",
2624
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
2625
+
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
2626
+
"dev": true,
2627
+
"license": "Apache-2.0",
2628
+
"bin": {
2629
+
"tsc": "bin/tsc",
2630
+
"tsserver": "bin/tsserver"
2631
+
},
2632
+
"engines": {
2633
+
"node": ">=14.17"
2634
+
}
2635
+
},
2636
+
"node_modules/typescript-eslint": {
2637
+
"version": "8.46.0",
2638
+
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz",
2639
+
"integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==",
2640
+
"dev": true,
2641
+
"license": "MIT",
2642
+
"dependencies": {
2643
+
"@typescript-eslint/eslint-plugin": "8.46.0",
2644
+
"@typescript-eslint/parser": "8.46.0",
2645
+
"@typescript-eslint/typescript-estree": "8.46.0",
2646
+
"@typescript-eslint/utils": "8.46.0"
2647
+
},
2648
+
"engines": {
2649
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
2650
+
},
2651
+
"funding": {
2652
+
"type": "opencollective",
2653
+
"url": "https://opencollective.com/typescript-eslint"
2654
+
},
2655
+
"peerDependencies": {
2656
+
"eslint": "^8.57.0 || ^9.0.0",
2657
+
"typescript": ">=4.8.4 <6.0.0"
2658
+
}
2659
+
},
2660
+
"node_modules/undici-types": {
2661
+
"version": "7.14.0",
2662
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
2663
+
"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
2664
+
"dev": true,
2665
+
"license": "MIT"
2666
+
},
2667
+
"node_modules/update-browserslist-db": {
2668
+
"version": "1.1.3",
2669
+
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
2670
+
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
2671
+
"dev": true,
2672
+
"funding": [
2673
+
{
2674
+
"type": "opencollective",
2675
+
"url": "https://opencollective.com/browserslist"
2676
+
},
2677
+
{
2678
+
"type": "tidelift",
2679
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
2680
+
},
2681
+
{
2682
+
"type": "github",
2683
+
"url": "https://github.com/sponsors/ai"
2684
+
}
2685
+
],
2686
+
"license": "MIT",
2687
+
"dependencies": {
2688
+
"escalade": "^3.2.0",
2689
+
"picocolors": "^1.1.1"
2690
+
},
2691
+
"bin": {
2692
+
"update-browserslist-db": "cli.js"
2693
+
},
2694
+
"peerDependencies": {
2695
+
"browserslist": ">= 4.21.0"
2696
+
}
2697
+
},
2698
+
"node_modules/uri-js": {
2699
+
"version": "4.4.1",
2700
+
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
2701
+
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
2702
+
"dev": true,
2703
+
"license": "BSD-2-Clause",
2704
+
"dependencies": {
2705
+
"punycode": "^2.1.0"
2706
+
}
2707
+
},
2708
+
"node_modules/vite": {
2709
+
"name": "rolldown-vite",
2710
+
"version": "7.1.14",
2711
+
"resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.1.14.tgz",
2712
+
"integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==",
2713
+
"dev": true,
2714
+
"license": "MIT",
2715
+
"dependencies": {
2716
+
"@oxc-project/runtime": "0.92.0",
2717
+
"fdir": "^6.5.0",
2718
+
"lightningcss": "^1.30.1",
2719
+
"picomatch": "^4.0.3",
2720
+
"postcss": "^8.5.6",
2721
+
"rolldown": "1.0.0-beta.41",
2722
+
"tinyglobby": "^0.2.15"
2723
+
},
2724
+
"bin": {
2725
+
"vite": "bin/vite.js"
2726
+
},
2727
+
"engines": {
2728
+
"node": "^20.19.0 || >=22.12.0"
2729
+
},
2730
+
"funding": {
2731
+
"url": "https://github.com/vitejs/vite?sponsor=1"
2732
+
},
2733
+
"optionalDependencies": {
2734
+
"fsevents": "~2.3.3"
2735
+
},
2736
+
"peerDependencies": {
2737
+
"@types/node": "^20.19.0 || >=22.12.0",
2738
+
"esbuild": "^0.25.0",
2739
+
"jiti": ">=1.21.0",
2740
+
"less": "^4.0.0",
2741
+
"sass": "^1.70.0",
2742
+
"sass-embedded": "^1.70.0",
2743
+
"stylus": ">=0.54.8",
2744
+
"sugarss": "^5.0.0",
2745
+
"terser": "^5.16.0",
2746
+
"tsx": "^4.8.1",
2747
+
"yaml": "^2.4.2"
2748
+
},
2749
+
"peerDependenciesMeta": {
2750
+
"@types/node": {
2751
+
"optional": true
2752
+
},
2753
+
"esbuild": {
2754
+
"optional": true
2755
+
},
2756
+
"jiti": {
2757
+
"optional": true
2758
+
},
2759
+
"less": {
2760
+
"optional": true
2761
+
},
2762
+
"sass": {
2763
+
"optional": true
2764
+
},
2765
+
"sass-embedded": {
2766
+
"optional": true
2767
+
},
2768
+
"stylus": {
2769
+
"optional": true
2770
+
},
2771
+
"sugarss": {
2772
+
"optional": true
2773
+
},
2774
+
"terser": {
2775
+
"optional": true
2776
+
},
2777
+
"tsx": {
2778
+
"optional": true
2779
+
},
2780
+
"yaml": {
2781
+
"optional": true
2782
+
}
2783
+
}
2784
+
},
2785
+
"node_modules/vite/node_modules/fdir": {
2786
+
"version": "6.5.0",
2787
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
2788
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
2789
+
"dev": true,
2790
+
"license": "MIT",
2791
+
"engines": {
2792
+
"node": ">=12.0.0"
2793
+
},
2794
+
"peerDependencies": {
2795
+
"picomatch": "^3 || ^4"
2796
+
},
2797
+
"peerDependenciesMeta": {
2798
+
"picomatch": {
2799
+
"optional": true
2800
+
}
2801
+
}
2802
+
},
2803
+
"node_modules/vite/node_modules/picomatch": {
2804
+
"version": "4.0.3",
2805
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
2806
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
2807
+
"dev": true,
2808
+
"license": "MIT",
2809
+
"engines": {
2810
+
"node": ">=12"
2811
+
},
2812
+
"funding": {
2813
+
"url": "https://github.com/sponsors/jonschlinkert"
2814
+
}
2815
+
},
2816
+
"node_modules/which": {
2817
+
"version": "2.0.2",
2818
+
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2819
+
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2820
+
"dev": true,
2821
+
"license": "ISC",
2822
+
"dependencies": {
2823
+
"isexe": "^2.0.0"
2824
+
},
2825
+
"bin": {
2826
+
"node-which": "bin/node-which"
2827
+
},
2828
+
"engines": {
2829
+
"node": ">= 8"
2830
+
}
2831
+
},
2832
+
"node_modules/word-wrap": {
2833
+
"version": "1.2.5",
2834
+
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
2835
+
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
2836
+
"dev": true,
2837
+
"license": "MIT",
2838
+
"engines": {
2839
+
"node": ">=0.10.0"
2840
+
}
2841
+
},
2842
+
"node_modules/yallist": {
2843
+
"version": "3.1.1",
2844
+
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
2845
+
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
2846
+
"dev": true,
2847
+
"license": "ISC"
2848
+
},
2849
+
"node_modules/yocto-queue": {
2850
+
"version": "0.1.0",
2851
+
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
2852
+
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
2853
+
"dev": true,
2854
+
"license": "MIT",
2855
+
"engines": {
2856
+
"node": ">=10"
2857
+
},
2858
+
"funding": {
2859
+
"url": "https://github.com/sponsors/sindresorhus"
2860
+
}
2861
+
}
2862
+
}
2863
+
}
+67
package.json
+67
package.json
···
1
+
{
2
+
"name": "atproto-ui",
3
+
"version": "0.1.1",
4
+
"type": "module",
5
+
"description": "React components and hooks for rendering AT Protocol records.",
6
+
"main": "./lib-dist/index.js",
7
+
"module": "./lib-dist/index.js",
8
+
"types": "./lib-dist/index.d.ts",
9
+
"exports": {
10
+
".": {
11
+
"types": "./lib-dist/index.d.ts",
12
+
"import": "./lib-dist/index.js",
13
+
"default": "./lib-dist/index.js"
14
+
},
15
+
"./styles/highlight.css": "./lib/styles/highlight.css"
16
+
},
17
+
"files": [
18
+
"lib-dist",
19
+
"lib/styles",
20
+
"README.md"
21
+
],
22
+
"sideEffects": [
23
+
"./lib/styles/highlight.css"
24
+
],
25
+
"scripts": {
26
+
"dev": "vite",
27
+
"build": "tsc -b && vite build",
28
+
"lint": "eslint .",
29
+
"preview": "vite preview",
30
+
"prepublishOnly": "npm run build"
31
+
},
32
+
"peerDependencies": {
33
+
"react": "^18.2.0 || ^19.0.0",
34
+
"react-dom": "^18.2.0 || ^19.0.0"
35
+
},
36
+
"peerDependenciesMeta": {
37
+
"react-dom": {
38
+
"optional": true
39
+
}
40
+
},
41
+
"dependencies": {
42
+
"@atcute/atproto": "^3.1.7",
43
+
"@atcute/bluesky": "^3.2.3",
44
+
"@atcute/client": "^4.0.3",
45
+
"@atcute/identity-resolver": "^1.1.3",
46
+
"@atcute/tangled": "^1.0.6"
47
+
},
48
+
"devDependencies": {
49
+
"@eslint/js": "^9.36.0",
50
+
"@types/node": "^24.6.0",
51
+
"@types/react": "^19.1.16",
52
+
"@types/react-dom": "^19.1.9",
53
+
"@vitejs/plugin-react": "^5.0.4",
54
+
"eslint": "^9.36.0",
55
+
"eslint-plugin-react-hooks": "^5.2.0",
56
+
"eslint-plugin-react-refresh": "^0.4.22",
57
+
"globals": "^16.4.0",
58
+
"react": "^19.1.1",
59
+
"react-dom": "^19.1.1",
60
+
"typescript": "~5.9.3",
61
+
"typescript-eslint": "^8.45.0",
62
+
"vite": "npm:rolldown-vite@7.1.14"
63
+
},
64
+
"overrides": {
65
+
"vite": "npm:rolldown-vite@7.1.14"
66
+
}
67
+
}
+385
src/App.tsx
+385
src/App.tsx
···
1
+
import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react';
2
+
import { AtProtoProvider } from '../lib/providers/AtProtoProvider';
3
+
import { AtProtoRecord } from '../lib/core/AtProtoRecord';
4
+
import { TangledString } from '../lib/components/TangledString';
5
+
import { LeafletDocument } from '../lib/components/LeafletDocument';
6
+
import { BlueskyProfile } from '../lib/components/BlueskyProfile';
7
+
import { BlueskyPost, BLUESKY_POST_COLLECTION } from '../lib/components/BlueskyPost';
8
+
import { BlueskyPostList } from '../lib/components/BlueskyPostList';
9
+
import { BlueskyQuotePost } from '../lib/components/BlueskyQuotePost';
10
+
import { useDidResolution } from '../lib/hooks/useDidResolution';
11
+
import { useLatestRecord } from '../lib/hooks/useLatestRecord';
12
+
import { ColorSchemeToggle } from '../lib/components/ColorSchemeToggle.tsx';
13
+
import { useColorScheme, type ColorSchemePreference } from '../lib/hooks/useColorScheme';
14
+
import type { FeedPostRecord } from '../lib/types/bluesky';
15
+
16
+
const COLOR_SCHEME_STORAGE_KEY = 'atproto-ui-color-scheme';
17
+
18
+
const basicUsageSnippet = `import { AtProtoProvider, BlueskyPost } from 'atproto-ui';
19
+
20
+
export function App() {
21
+
return (
22
+
<AtProtoProvider>
23
+
<BlueskyPost did="did:plc:example" rkey="3k2aexample" />
24
+
</AtProtoProvider>
25
+
);
26
+
}`;
27
+
28
+
const customComponentSnippet = `import { useLatestRecord, useColorScheme, AtProtoRecord } from 'atproto-ui';
29
+
import type { FeedPostRecord } from 'atproto-ui';
30
+
31
+
const LatestPostSummary: React.FC<{ did: string }> = ({ did }) => {
32
+
const scheme = useColorScheme('system');
33
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
34
+
35
+
if (loading) return <span>Loading…</span>;
36
+
if (error || !rkey) return <span>No post yet.</span>;
37
+
38
+
return (
39
+
<AtProtoRecord<FeedPostRecord>
40
+
did={did}
41
+
collection="app.bsky.feed.post"
42
+
rkey={rkey}
43
+
renderer={({ record }) => (
44
+
<article data-color-scheme={scheme}>
45
+
<strong>{record?.text ?? 'Empty post'}</strong>
46
+
</article>
47
+
)}
48
+
/>
49
+
);
50
+
};`;
51
+
52
+
const codeBlockBase: React.CSSProperties = {
53
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace, monospace',
54
+
fontSize: 12,
55
+
whiteSpace: 'pre',
56
+
overflowX: 'auto',
57
+
borderRadius: 10,
58
+
padding: '12px 14px',
59
+
lineHeight: 1.6
60
+
};
61
+
62
+
const FullDemo: React.FC = () => {
63
+
const handleInputRef = useRef<HTMLInputElement | null>(null);
64
+
const [submitted, setSubmitted] = useState<string | null>(null);
65
+
const [colorSchemePreference, setColorSchemePreference] = useState<ColorSchemePreference>(() => {
66
+
if (typeof window === 'undefined') return 'system';
67
+
try {
68
+
const stored = window.localStorage.getItem(COLOR_SCHEME_STORAGE_KEY);
69
+
if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;
70
+
} catch {
71
+
/* ignore */
72
+
}
73
+
return 'system';
74
+
});
75
+
const scheme = useColorScheme(colorSchemePreference);
76
+
const { did, loading: resolvingDid } = useDidResolution(submitted ?? undefined);
77
+
const onSubmit = useCallback<React.FormEventHandler>((e) => {
78
+
e.preventDefault();
79
+
const rawValue = handleInputRef.current?.value;
80
+
const nextValue = rawValue?.trim();
81
+
if (!nextValue) return;
82
+
if (handleInputRef.current) {
83
+
handleInputRef.current.value = nextValue;
84
+
}
85
+
setSubmitted(nextValue);
86
+
}, []);
87
+
88
+
useEffect(() => {
89
+
if (typeof window === 'undefined') return;
90
+
try {
91
+
window.localStorage.setItem(COLOR_SCHEME_STORAGE_KEY, colorSchemePreference);
92
+
} catch {
93
+
/* ignore */
94
+
}
95
+
}, [colorSchemePreference]);
96
+
97
+
useEffect(() => {
98
+
if (typeof document === 'undefined') return;
99
+
const root = document.documentElement;
100
+
const body = document.body;
101
+
const prevScheme = root.dataset.colorScheme;
102
+
const prevBg = body.style.backgroundColor;
103
+
const prevColor = body.style.color;
104
+
root.dataset.colorScheme = scheme;
105
+
body.style.backgroundColor = scheme === 'dark' ? '#020617' : '#f8fafc';
106
+
body.style.color = scheme === 'dark' ? '#e2e8f0' : '#0f172a';
107
+
return () => {
108
+
root.dataset.colorScheme = prevScheme ?? '';
109
+
body.style.backgroundColor = prevBg;
110
+
body.style.color = prevColor;
111
+
};
112
+
}, [scheme]);
113
+
114
+
const showHandle = submitted && !submitted.startsWith('did:') ? submitted : undefined;
115
+
116
+
const mutedTextColor = useMemo(() => (scheme === 'dark' ? '#94a3b8' : '#555'), [scheme]);
117
+
const panelStyle = useMemo<React.CSSProperties>(() => ({
118
+
display: 'flex',
119
+
flexDirection: 'column',
120
+
gap: 8,
121
+
padding: 10,
122
+
borderRadius: 12,
123
+
borderColor: scheme === 'dark' ? '#1e293b' : '#e2e8f0',
124
+
}), [scheme]);
125
+
const baseTextColor = useMemo(() => (scheme === 'dark' ? '#e2e8f0' : '#0f172a'), [scheme]);
126
+
const gistPanelStyle = useMemo<React.CSSProperties>(() => ({
127
+
...panelStyle,
128
+
padding: 0,
129
+
border: 'none',
130
+
background: 'transparent',
131
+
backdropFilter: 'none',
132
+
marginTop: 32
133
+
}), [panelStyle]);
134
+
const leafletPanelStyle = useMemo<React.CSSProperties>(() => ({
135
+
...panelStyle,
136
+
padding: 0,
137
+
border: 'none',
138
+
background: 'transparent',
139
+
backdropFilter: 'none',
140
+
marginTop: 32,
141
+
alignItems: 'center'
142
+
}), [panelStyle]);
143
+
const primaryGridStyle = useMemo<React.CSSProperties>(() => ({
144
+
display: 'grid',
145
+
gap: 32,
146
+
gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))'
147
+
}), []);
148
+
const columnStackStyle = useMemo<React.CSSProperties>(() => ({
149
+
display: 'flex',
150
+
flexDirection: 'column',
151
+
gap: 32
152
+
}), []);
153
+
const codeBlockStyle = useMemo<React.CSSProperties>(() => ({
154
+
...codeBlockBase,
155
+
background: scheme === 'dark' ? '#0b1120' : '#f1f5f9',
156
+
border: `1px solid ${scheme === 'dark' ? '#1e293b' : '#e2e8f0'}`
157
+
}), [scheme]);
158
+
const codeTextStyle = useMemo<React.CSSProperties>(() => ({
159
+
margin: 0,
160
+
display: 'block',
161
+
fontFamily: codeBlockBase.fontFamily,
162
+
fontSize: 12,
163
+
lineHeight: 1.6,
164
+
whiteSpace: 'pre'
165
+
}), []);
166
+
const basicCodeRef = useRef<HTMLElement | null>(null);
167
+
const customCodeRef = useRef<HTMLElement | null>(null);
168
+
169
+
// Latest Bluesky post
170
+
const {
171
+
rkey: latestPostRkey,
172
+
loading: loadingLatestPost,
173
+
empty: noPosts,
174
+
error: latestPostError
175
+
} = useLatestRecord<unknown>(did, BLUESKY_POST_COLLECTION);
176
+
177
+
const quoteSampleDid = 'did:plc:ttdrpj45ibqunmfhdsb4zdwq';
178
+
const quoteSampleRkey = '3m2prlq6xxc2v';
179
+
180
+
return (
181
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 20, color: baseTextColor }}>
182
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, alignItems: 'center', justifyContent: 'space-between' }}>
183
+
<form onSubmit={onSubmit} style={{ display: 'flex', gap: 8, flexWrap: 'wrap', flex: '1 1 320px' }}>
184
+
<input
185
+
placeholder="Handle or DID (e.g. alice.bsky.social or did:plc:...)"
186
+
ref={handleInputRef}
187
+
style={{ flex: '1 1 260px', padding: '6px 8px', borderRadius: 8, border: '1px solid', borderColor: scheme === 'dark' ? '#1e293b' : '#cbd5f5', background: scheme === 'dark' ? '#0b1120' : '#fff', color: scheme === 'dark' ? '#e2e8f0' : '#0f172a' }}
188
+
/>
189
+
<button type="submit" style={{ padding: '6px 16px', borderRadius: 8, border: 'none', background: '#2563eb', color: '#fff', cursor: 'pointer' }}>Load</button>
190
+
</form>
191
+
<ColorSchemeToggle value={colorSchemePreference} onChange={setColorSchemePreference} scheme={scheme} />
192
+
</div>
193
+
{!submitted && <p style={{ color: mutedTextColor }}>Enter a handle to fetch your profile, latest Bluesky post, a Tangled string, and a Leaflet document.</p>}
194
+
{submitted && resolvingDid && <p style={{ color: mutedTextColor }}>Resolving DID…</p>}
195
+
{did && (
196
+
<>
197
+
<div style={primaryGridStyle}>
198
+
<div style={columnStackStyle}>
199
+
<section style={panelStyle}>
200
+
<h3 style={sectionHeaderStyle}>Profile</h3>
201
+
<BlueskyProfile did={did} handle={showHandle} colorScheme={colorSchemePreference} />
202
+
</section>
203
+
<section style={panelStyle}>
204
+
<h3 style={sectionHeaderStyle}>Recent Posts</h3>
205
+
<BlueskyPostList did={did} colorScheme={colorSchemePreference} />
206
+
</section>
207
+
</div>
208
+
<div style={columnStackStyle}>
209
+
<section style={panelStyle}>
210
+
<h3 style={sectionHeaderStyle}>Latest Bluesky Post</h3>
211
+
{loadingLatestPost && <div style={loadingBox}>Loading latest post…</div>}
212
+
{latestPostError && <div style={errorBox}>Failed to load latest post.</div>}
213
+
{noPosts && <div style={{ ...infoBox, color: mutedTextColor }}>No posts found.</div>}
214
+
{!loadingLatestPost && latestPostRkey && (
215
+
<BlueskyPost did={did} rkey={latestPostRkey} colorScheme={colorSchemePreference} />
216
+
)}
217
+
</section>
218
+
<section style={panelStyle}>
219
+
<h3 style={sectionHeaderStyle}>Quote Post Demo</h3>
220
+
<BlueskyQuotePost did={quoteSampleDid} rkey={quoteSampleRkey} colorScheme={colorSchemePreference} />
221
+
</section>
222
+
</div>
223
+
</div>
224
+
<section style={gistPanelStyle}>
225
+
<h3 style={sectionHeaderStyle}>A Tangled String</h3>
226
+
<TangledString did="nekomimi.pet" rkey="3m2p4gjptg522" colorScheme={colorSchemePreference} />
227
+
</section>
228
+
<section style={leafletPanelStyle}>
229
+
<h3 style={sectionHeaderStyle}>A Leaflet Document.</h3>
230
+
<div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>
231
+
<LeafletDocument did={"did:plc:ttdrpj45ibqunmfhdsb4zdwq"} rkey={"3m2seagm2222c"} colorScheme={colorSchemePreference} />
232
+
</div>
233
+
</section>
234
+
</>
235
+
)}
236
+
<section style={{ ...panelStyle, marginTop: 32 }}>
237
+
<h3 style={sectionHeaderStyle}>Build your own component</h3>
238
+
<p style={{ color: mutedTextColor, margin: '4px 0 8px' }}>
239
+
Wrap your app with the provider once and drop the ready-made components wherever you need them.
240
+
</p>
241
+
<pre style={codeBlockStyle}>
242
+
<code ref={basicCodeRef} className="language-tsx" style={codeTextStyle}>{basicUsageSnippet}</code>
243
+
</pre>
244
+
<p style={{ color: mutedTextColor, margin: '16px 0 8px' }}>
245
+
Need to make your own component? Compose your own renderer with the hooks and utilities that ship with the library.
246
+
</p>
247
+
<pre style={codeBlockStyle}>
248
+
<code ref={customCodeRef} className="language-tsx" style={codeTextStyle}>{customComponentSnippet}</code>
249
+
</pre>
250
+
{did && (
251
+
<div style={{ marginTop: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>
252
+
<p style={{ color: mutedTextColor, margin: 0 }}>
253
+
Live example with your handle:
254
+
</p>
255
+
<LatestPostSummary did={did} handle={showHandle} colorScheme={colorSchemePreference} />
256
+
</div>
257
+
)}
258
+
</section>
259
+
</div>
260
+
);
261
+
};
262
+
263
+
const LatestPostSummary: React.FC<{ did: string; handle?: string; colorScheme: ColorSchemePreference }> = ({ did, colorScheme }) => {
264
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, BLUESKY_POST_COLLECTION);
265
+
const scheme = useColorScheme(colorScheme);
266
+
const palette = scheme === 'dark' ? latestSummaryPalette.dark : latestSummaryPalette.light;
267
+
268
+
if (loading) return <div style={palette.muted}>Loading summary…</div>;
269
+
if (error) return <div style={palette.error}>Failed to load the latest post.</div>;
270
+
if (!rkey) return <div style={palette.muted}>No posts published yet.</div>;
271
+
272
+
return (
273
+
<AtProtoRecord<FeedPostRecord>
274
+
did={did}
275
+
collection="app.bsky.feed.post"
276
+
rkey={rkey}
277
+
renderer={({ record }) => (
278
+
<article data-color-scheme={scheme}>
279
+
<strong>{record?.text ?? 'Empty post'}</strong>
280
+
</article>
281
+
)}
282
+
/>
283
+
);
284
+
};
285
+
286
+
const sectionHeaderStyle: React.CSSProperties = { margin: '4px 0', fontSize: 16 };
287
+
const loadingBox: React.CSSProperties = { padding: 8 };
288
+
const errorBox: React.CSSProperties = { padding: 8, color: 'crimson' };
289
+
const infoBox: React.CSSProperties = { padding: 8, color: '#555' };
290
+
291
+
const latestSummaryPalette = {
292
+
light: {
293
+
card: {
294
+
border: '1px solid #e2e8f0',
295
+
background: '#ffffff',
296
+
borderRadius: 12,
297
+
padding: 12,
298
+
display: 'flex',
299
+
flexDirection: 'column',
300
+
gap: 8
301
+
} satisfies React.CSSProperties,
302
+
header: {
303
+
display: 'flex',
304
+
alignItems: 'baseline',
305
+
justifyContent: 'space-between',
306
+
gap: 12,
307
+
color: '#0f172a'
308
+
} satisfies React.CSSProperties,
309
+
time: {
310
+
fontSize: 12,
311
+
color: '#64748b'
312
+
} satisfies React.CSSProperties,
313
+
text: {
314
+
margin: 0,
315
+
color: '#1f2937',
316
+
whiteSpace: 'pre-wrap'
317
+
} satisfies React.CSSProperties,
318
+
link: {
319
+
color: '#2563eb',
320
+
fontWeight: 600,
321
+
fontSize: 12,
322
+
textDecoration: 'none'
323
+
} satisfies React.CSSProperties,
324
+
muted: {
325
+
color: '#64748b'
326
+
} satisfies React.CSSProperties,
327
+
error: {
328
+
color: 'crimson'
329
+
} satisfies React.CSSProperties
330
+
},
331
+
dark: {
332
+
card: {
333
+
border: '1px solid #1e293b',
334
+
background: '#0f172a',
335
+
borderRadius: 12,
336
+
padding: 12,
337
+
display: 'flex',
338
+
flexDirection: 'column',
339
+
gap: 8
340
+
} satisfies React.CSSProperties,
341
+
header: {
342
+
display: 'flex',
343
+
alignItems: 'baseline',
344
+
justifyContent: 'space-between',
345
+
gap: 12,
346
+
color: '#e2e8f0'
347
+
} satisfies React.CSSProperties,
348
+
time: {
349
+
fontSize: 12,
350
+
color: '#cbd5f5'
351
+
} satisfies React.CSSProperties,
352
+
text: {
353
+
margin: 0,
354
+
color: '#e2e8f0',
355
+
whiteSpace: 'pre-wrap'
356
+
} satisfies React.CSSProperties,
357
+
link: {
358
+
color: '#38bdf8',
359
+
fontWeight: 600,
360
+
fontSize: 12,
361
+
textDecoration: 'none'
362
+
} satisfies React.CSSProperties,
363
+
muted: {
364
+
color: '#94a3b8'
365
+
} satisfies React.CSSProperties,
366
+
error: {
367
+
color: '#f472b6'
368
+
} satisfies React.CSSProperties
369
+
}
370
+
} as const;
371
+
372
+
export const App: React.FC = () => {
373
+
return (
374
+
<AtProtoProvider>
375
+
<div style={{ maxWidth: 860, margin: '40px auto', padding: '0 20px', fontFamily: 'system-ui, sans-serif' }}>
376
+
<h1 style={{ marginTop: 0 }}>atproto-ui Demo</h1>
377
+
<p style={{ lineHeight: 1.4 }}>A component library for rendering common AT Protocol records for applications such as Bluesky and Tangled.</p>
378
+
<hr style={{ margin: '32px 0' }} />
379
+
<FullDemo />
380
+
</div>
381
+
</AtProtoProvider>
382
+
);
383
+
};
384
+
385
+
export default App;
+8
src/main.tsx
+8
src/main.tsx
+28
tsconfig.app.json
+28
tsconfig.app.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
4
+
"target": "ES2022",
5
+
"useDefineForClassFields": true,
6
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+
"module": "ESNext",
8
+
"types": ["vite/client"],
9
+
"skipLibCheck": true,
10
+
11
+
/* Bundler mode */
12
+
"moduleResolution": "bundler",
13
+
"allowImportingTsExtensions": true,
14
+
"verbatimModuleSyntax": true,
15
+
"moduleDetection": "force",
16
+
"noEmit": true,
17
+
"jsx": "react-jsx",
18
+
19
+
/* Linting */
20
+
"strict": true,
21
+
"noUnusedLocals": true,
22
+
"noUnusedParameters": true,
23
+
"erasableSyntaxOnly": true,
24
+
"noFallthroughCasesInSwitch": true,
25
+
"noUncheckedSideEffectImports": true
26
+
},
27
+
"include": ["src"]
28
+
}
+8
tsconfig.json
+8
tsconfig.json
+22
tsconfig.lib.json
+22
tsconfig.lib.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"composite": true,
4
+
"target": "ES2020",
5
+
"module": "ESNext",
6
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
7
+
"moduleResolution": "bundler",
8
+
"moduleDetection": "force",
9
+
"jsx": "react-jsx",
10
+
"strict": true,
11
+
"skipLibCheck": true,
12
+
"allowSyntheticDefaultImports": true,
13
+
"esModuleInterop": true,
14
+
"resolveJsonModule": true,
15
+
"declaration": true,
16
+
"declarationMap": false,
17
+
"sourceMap": false,
18
+
"outDir": "./lib-dist",
19
+
"rootDir": "./lib"
20
+
},
21
+
"include": ["lib/**/*.ts", "lib/**/*.tsx"]
22
+
}
+1
tsconfig.lib.tsbuildinfo
+1
tsconfig.lib.tsbuildinfo
···
1
+
{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/@atcute/lexicons/dist/syntax/did.d.ts","./node_modules/@atcute/lexicons/dist/syntax/handle.d.ts","./node_modules/@atcute/lexicons/dist/syntax/at-identifier.d.ts","./node_modules/@atcute/lexicons/dist/syntax/nsid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/record-key.d.ts","./node_modules/@atcute/lexicons/dist/utils.d.ts","./node_modules/@atcute/lexicons/dist/syntax/at-uri.d.ts","./node_modules/@atcute/lexicons/dist/syntax/cid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/datetime.d.ts","./node_modules/@atcute/lexicons/dist/syntax/language.d.ts","./node_modules/@atcute/lexicons/dist/syntax/tid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/uri.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/cid-link.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/blob.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/bytes.d.ts","./node_modules/@atcute/lexicons/dist/types/brand.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@atcute/lexicons/dist/syntax/index.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/index.d.ts","./node_modules/@atcute/lexicons/dist/validations/index.d.ts","./node_modules/@atcute/lexicons/dist/index.d.ts","./node_modules/@atcute/lexicons/dist/ambient.d.ts","./node_modules/@atcute/client/dist/fetch-handler.d.ts","./node_modules/@atcute/client/dist/client.d.ts","./node_modules/@atcute/client/dist/credential-manager.d.ts","./node_modules/@atcute/client/dist/index.d.ts","./node_modules/@badrap/valita/dist/mjs/index.d.mts","./node_modules/@atcute/identity/dist/types.d.ts","./node_modules/@atcute/identity/dist/typedefs.d.ts","./node_modules/@atcute/identity/dist/utils.d.ts","./node_modules/@atcute/identity/dist/did.d.ts","./node_modules/@atcute/identity/dist/methods/key.d.ts","./node_modules/@atcute/identity/dist/methods/plc.d.ts","./node_modules/@atcute/identity/dist/methods/web.d.ts","./node_modules/@atcute/identity/dist/index.d.ts","./node_modules/@atcute/identity-resolver/dist/types.d.ts","./node_modules/@atcute/identity-resolver/dist/did/composite.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/plc.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/web.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/xrpc.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/composite.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/doh-json.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/well-known.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/xrpc.d.ts","./node_modules/@atcute/identity-resolver/dist/errors.d.ts","./node_modules/@atcute/identity-resolver/dist/index.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/actor/profile.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/feed/reaction.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/feed/star.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/git/refupdate.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/graph/follow.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/listkeys.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/member.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/version.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/owner.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/pipeline.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/pipeline/status.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/publickey.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/addsecret.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/archive.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/artifact.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/blob.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/branch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/branches.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/collaborator.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/compare.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/create.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/delete.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/diff.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/forkstatus.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/forksync.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/getdefaultbranch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/hiddenref.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/comment.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state/closed.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state/open.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/languages.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/listsecrets.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/log.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/merge.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/mergecheck.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/comment.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/closed.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/merged.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/open.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/removesecret.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/setdefaultbranch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/tags.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/tree.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/spindle.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/spindle/member.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/string.d.ts","./node_modules/@atcute/tangled/dist/lexicons/index.d.ts","./node_modules/@atcute/tangled/dist/index.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/deleteaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/disableaccountinvites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/disableinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/enableaccountinvites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getaccountinfo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getaccountinfos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/strongref.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getsubjectstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/searchaccounts.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/sendemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccounthandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountpassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountsigningkey.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updatesubjectstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/getrecommendeddidcredentials.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/refreshidentity.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/requestplcoperationsignature.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolvedid.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolvehandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolveidentity.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/signplcoperation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/submitplcoperation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/updatehandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/querylabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/subscribelabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/lexicon/schema.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/moderation/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/moderation/createreport.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/applywrites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/createrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/deleterecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/describerepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/getrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/importrepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/listmissingblobs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/listrecords.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/putrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/uploadblob.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/activateaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/checkaccountstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/confirmemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createapppassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createinvitecode.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deactivateaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deleteaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deletesession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/describeserver.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getaccountinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getserviceauth.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/listapppasswords.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/refreshsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestaccountdelete.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestemailconfirmation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestemailupdate.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestpasswordreset.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/reservesigningkey.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/resetpassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/revokeapppassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/updateemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getblob.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getblocks.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getcheckout.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/gethead.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/gethoststatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getlatestcommit.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrepostatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listblobs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listhosts.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listrepos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listreposbycollection.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/notifyofupdate.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/requestcrawl.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/subscriberepos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/addreservedhandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/checkhandleavailability.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/checksignupqueue.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/dereferencescope.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/fetchlabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/requestphoneverification.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/revokeaccountcredentials.d.ts","./node_modules/@atcute/atproto/dist/lexicons/index.d.ts","./node_modules/@atcute/atproto/dist/index.d.ts","./lib/utils/atproto-client.ts","./lib/providers/atprotoprovider.tsx","./lib/hooks/usepdsendpoint.ts","./lib/hooks/useatprotorecord.ts","./lib/hooks/usedidresolution.ts","./lib/core/atprotorecord.tsx","./lib/components/blueskyicon.tsx","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/external.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/postgate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/threadgate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/images.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/video.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/recordwithmedia.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/record.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/richtext/facet.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getprofile.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getprofiles.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getsuggestions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/profile.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/putpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/searchactors.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/searchactorstypeahead.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/status.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/createbookmark.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/deletebookmark.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/getbookmarks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/describefeedgenerator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/generator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getactorfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getactorlikes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getauthorfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedgenerator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedgenerators.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getlikes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getlistfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getpostthread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getposts.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getquotes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getrepostedby.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getsuggestedfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/gettimeline.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/like.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/post.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/repost.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/searchposts.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/sendinteractions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/block.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/follow.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getactorstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getblocks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getfollowers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getfollows.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getknownfollowers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistblocks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistmutes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlists.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistswithmembership.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getmutes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getrelationships.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpack.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpackswithmembership.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getsuggestedfollowsbyactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/list.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/listblock.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/listitem.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/muteactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/muteactorlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/mutethread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/searchstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/starterpack.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmuteactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmuteactorlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmutethread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/verification.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/getservices.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/service.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/declaration.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/getpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/getunreadcount.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/listactivitysubscriptions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/listnotifications.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putactivitysubscription.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putpreferencesv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/registerpush.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/unregisterpush.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/updateseen.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getageassurancestate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getconfig.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpopularfeedgenerators.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpostthreadotherv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpostthreadv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedfeedsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedstarterpacksskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedusers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedusersskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestionsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettaggedsuggestions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrendingtopics.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrends.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrendsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/initageassurance.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchactorsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchpostsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchstarterpacksskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/getjobstatus.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/getuploadlimits.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/uploadvideo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/declaration.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/deleteaccount.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/exportaccountdata.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/acceptconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/addreaction.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/deletemessageforself.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvoavailability.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvoformembers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getlog.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getmessages.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/leaveconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/listconvos.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/muteconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/removereaction.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/sendmessage.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/sendmessagebatch.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/unmuteconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/updateallread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/updateread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/getactormetadata.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/getmessagecontext.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/updateactoraccess.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/index.d.ts","./node_modules/@atcute/bluesky/dist/utilities/embeds.d.ts","./node_modules/@atcute/bluesky/dist/utilities/list.d.ts","./node_modules/@atcute/bluesky/dist/utilities/profile.d.ts","./node_modules/@atcute/bluesky/dist/utilities/starterpack.d.ts","./node_modules/@atcute/bluesky/dist/index.d.ts","./lib/types/bluesky.ts","./lib/hooks/usecolorscheme.ts","./lib/utils/at-uri.ts","./lib/hooks/usedidhandle.ts","./lib/hooks/useblob.ts","./lib/renderers/blueskypostrenderer.tsx","./lib/renderers/blueskyprofilerenderer.tsx","./lib/utils/profile.ts","./lib/components/blueskyprofile.tsx","./lib/components/blueskypost.tsx","./lib/hooks/usepaginatedrecords.ts","./lib/components/blueskypostlist.tsx","./lib/components/blueskyquotepost.tsx","./lib/components/colorschemetoggle.tsx","./lib/types/leaflet.ts","./lib/renderers/leafletdocumentrenderer.tsx","./lib/components/leafletdocument.tsx","./lib/renderers/tangledstringrenderer.tsx","./lib/components/tangledstring.tsx","./lib/hooks/useblueskyprofile.ts","./lib/hooks/uselatestrecord.ts","./lib/index.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[52,53,437,491,508,509],[52,53,253,255,405,408,409,410,412,413,437,491,508,509],[52,53,256,405,406,408,415,437,491,508,509],[52,53,255,405,409,411,412,437,491,508,509],[52,53,405,407,410,414,437,491,508,509],[52,53,406,437,491,508,509],[52,53,253,255,406,407,419,420,437,491,508,509],[52,53,255,422,437,491,508,509],[52,53,253,254,437,491,508,509],[52,53,250,252,437,491,508,509],[52,53,252,437,491,508,509],[52,53,251,437,491,508,509],[53,250,251,252,253,254,255,256,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,437,491,508,509],[52,53,250,437,491,508,509],[52,53,256,405,406,407,408,409,437,491,508,509],[52,53,256,405,406,437,491,508,509],[52,53,406,407,408,409,414,419,437,491,508,509],[52,53,153,406,437,491,508,509],[53,404,437,491,508,509],[53,437,491,508,509],[53,71,79,88,99,153,249,437,491,508,509],[53,405,437,491,508,509],[248,437,491,508,509],[154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,437,491,508,509],[73,154,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,154,156,157,158,159,160,161,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,164,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,186,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,190,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,190,191,192,193,194,195,196,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,154,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[399,400,401,402,403,437,491,508,509],[257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,163,182,257,258,259,268,269,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,257,258,259,271,272,273,274,275,276,277,278,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,163,267,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,281,282,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,260,437,491,508,509],[73,163,182,257,261,262,263,264,267,268,270,437,491,508,509],[73,257,261,262,265,437,491,508,509],[73,182,257,261,262,263,265,266,268,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,271,272,273,274,275,276,277,278,279,280,282,283,284,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,257,258,259,261,262,263,265,266,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,266,267,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,186,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,264,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,264,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,267,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,265,266,375,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,437,491,508,509],[74,263,265,267,302,437,491,508,509],[399,437,491,508,509],[73,74,75,76,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[74,76,437,491,508,509],[437,491,508,509],[76,77,78,437,491,508,509],[71,88,89,437,491,508,509],[71,437,491,508,509],[71,89,437,491,508,509],[89,90,91,92,93,94,95,96,97,98,437,491,508,509],[71,88,437,491,508,509],[81,82,83,84,85,86,87,437,491,508,509],[74,437,491,508,509],[80,81,437,491,508,509],[74,81,437,491,508,509],[54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,73,437,491,508,509],[61,66,437,491,508,509],[61,437,491,508,509],[66,67,68,437,491,508,509],[54,55,437,491,508,509],[54,56,57,58,59,437,491,508,509],[54,55,56,57,58,60,61,62,63,64,65,437,491,508,509],[69,70,71,72,437,491,508,509],[152,437,491,508,509],[100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,437,491,508,509],[73,75,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[427,437,491,508,509],[427,428,429,430,431,437,491,508,509],[427,429,437,491,508,509],[437,488,489,491,508,509],[437,490,491,508,509],[491,508,509],[437,491,496,508,509,526],[437,491,492,497,502,508,509,511,523,534],[437,491,492,493,502,508,509,511],[437,491,494,508,509,535],[437,491,495,496,503,508,509,512],[437,491,496,508,509,523,531],[437,491,497,499,502,508,509,511],[437,490,491,498,508,509],[437,491,499,500,508,509],[437,491,501,502,508,509],[437,490,491,502,508,509],[437,491,502,503,504,508,509,523,534],[437,491,502,503,504,508,509,518,523,526],[437,483,491,499,502,505,508,509,511,523,534],[437,491,502,503,505,506,508,509,511,523,531,534],[437,491,505,507,508,509,523,531,534],[435,436,437,438,439,440,441,442,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540],[437,491,502,508,509],[437,491,508,509,510,534],[437,491,499,502,508,509,511,523],[437,491,508,509,512],[437,491,508,509,513],[437,490,491,508,509,514],[437,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540],[437,491,508,509,516],[437,491,508,509,517],[437,491,502,508,509,518,519],[437,491,508,509,518,520,535,537],[437,491,502,508,509,523,524,526],[437,491,508,509,525,526],[437,491,508,509,523,524],[437,491,508,509,526],[437,491,508,509,527],[437,488,491,508,509,523,528],[437,491,502,508,509,529,530],[437,491,508,509,529,530],[437,491,496,508,509,511,523,531],[437,491,508,509,532],[437,491,508,509,511,533],[437,491,505,508,509,517,534],[437,491,496,508,509,535],[437,491,508,509,523,536],[437,491,508,509,510,537],[437,491,508,509,538],[437,491,496,508,509],[437,483,491,508,509],[437,491,508,509,539],[437,483,491,502,504,508,509,514,523,526,534,536,537,539],[437,491,508,509,523,540],[52,437,491,508,509],[50,51,437,491,508,509],[437,449,452,455,456,491,508,509,534],[437,452,491,508,509,523,534],[437,452,456,491,508,509,534],[437,491,508,509,523],[437,446,491,508,509],[437,450,491,508,509],[437,448,449,452,491,508,509,534],[437,491,508,509,511,531],[437,491,508,509,541],[437,446,491,508,509,541],[437,448,452,491,508,509,511,534],[437,443,444,445,447,451,491,502,508,509,523,534],[437,452,460,468,491,508,509],[437,444,450,491,508,509],[437,452,477,478,491,508,509],[437,444,447,452,491,508,509,526,534,541],[437,452,491,508,509],[437,448,452,491,508,509,534],[437,443,491,508,509],[437,446,447,448,450,451,452,453,454,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,478,479,480,481,482,491,508,509],[437,452,470,473,491,499,508,509],[437,452,460,461,462,491,508,509],[437,450,452,461,463,491,508,509],[437,451,491,508,509],[437,444,446,452,491,508,509],[437,452,456,461,463,491,508,509],[437,456,491,508,509],[437,450,452,455,491,508,509,534],[437,444,448,452,460,491,508,509],[437,452,470,491,508,509],[437,463,491,508,509],[437,446,452,477,491,508,509,526,539,541]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"0ff1b165090b491f5e1407ae680b9a0bc3806dc56827ec85f93c57390491e732","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"ea72cc9550b89d2fd7b8ac2ab4a6ad5b179bf897de7859bba0dc7a934bbca734","impliedFormat":99},{"version":"aa45d08c94931e0b7a9a4c418b33ab895aaf240e192839b36866ad84198c062a","impliedFormat":99},{"version":"dbddbfd48c1d54d619891c895f6e8ff16d30717f4a0952e701387e8040d99f85","impliedFormat":99},{"version":"3361e3db8cb33aa91beaf33b3c79c108f2410e6414498e79d2c7da1838fdfc4d","impliedFormat":99},{"version":"4d54ec33bb701c533741e8abc4233d5f378805166d3a5999d234ae189702d93f","impliedFormat":99},{"version":"f1eed69ccd2798f31d0996306c51d648e19e6e09088f9a7f57c3dcb4367cef51","impliedFormat":99},{"version":"da276fcfe4fb73d74245eee5d1dfb7776bd450d77c591f6e03b54d60be5299b4","impliedFormat":99},{"version":"b402b88cf99c4dc208e5fd337e198e9ee703f48b239dbc8d08ec3b6389e5b55b","impliedFormat":99},{"version":"6f99fbd5ea27a199f84fbc41105525d207d8c6838d62babcbe12e5be0c4a0271","impliedFormat":99},{"version":"528939385e62838eb5631e339475ba93c2ce3ba7e3819cacd42d8ba9adfe5025","impliedFormat":99},{"version":"ef7d56a3fff2aa6476c694027c4844905d40ecc7e8b775dd8743dfd8378353fe","impliedFormat":99},{"version":"3894b5833c452b46d1c59f7d58a8c45e55bcc75a0248af65e1c9c9dd88afeac7","impliedFormat":99},{"version":"1ef2ed1e48da7d651f705bc0131d1028725841d4a97652ef0905367360ba3f73","impliedFormat":99},{"version":"47c221ec0b8802eb5887d6a1be6d7a33ddcd10116185a15c36803e0ae1c0539c","impliedFormat":99},{"version":"0d42fe6c9f1fab8c308ab1ec0ec2ad814a1bd2fb685e2f12cabc0c7732c089b9","impliedFormat":99},{"version":"74967284243720aad05a852617f2891ae384d7a6470c824169a351ad31cab9fb","impliedFormat":99},{"version":"76af14c3cce62da183aaf30375e3a4613109d16c7f16d30702f16d625a95e62c","impliedFormat":99},{"version":"19bc69921209ad7269f886c69e5f812499e133ce318e1aa5d53ac82427c1a477","impliedFormat":99},{"version":"31c17a52735cb1f6cc5a4c452857f568341f95424f07fdb5ee2fbcd6a4a4c094","impliedFormat":99},{"version":"06b419067158787fe33af288531a1df891b452a11e485896bded780b2ef70732","impliedFormat":99},{"version":"44c976b666ef022c74dc1405abb2b167346f9b8ebed3ab4bd9464711c8caa1f5","impliedFormat":99},{"version":"8e52008b516a7a7301f9d43884dc899019695eab471312b72be8a72f89850327","impliedFormat":99},{"version":"f47d865499c8b58d931d7f16e4432c69a3501cb324ead037804e8f292ff195a3","impliedFormat":99},{"version":"1e2f699820214b98d8d16c57137c7adb04b13f3ac573b4f0bbe7b7a601d09495","impliedFormat":99},{"version":"3fc902025baa4cbc0b4648466ac6be6117dc4b0e5b56d245d959839e58fdca8f","impliedFormat":99},{"version":"8ca7d6aee90a5a1d40d356c70c8d5b0ca55ab31a3d17ba73ffb51604674c48f4","impliedFormat":99},{"version":"8de5552b84830fba2143c18d43ebfc3c1289c67402c51a378c32daa7ff7adf32","impliedFormat":99},{"version":"651b59286248bd10267c630f728172866ae427f4036372bcd63f1502532454f8","impliedFormat":99},{"version":"1be150449268e28edc1a1d31acb2b9fa030aee87897a41856d50ddccc124ea53","impliedFormat":99},{"version":"ae0bff9b2245fc399295d0572519a2833ff1a47550b7fdddf96e648eca5271ea","impliedFormat":99},{"version":"0b903757cdc9fe17029ff023c454ae06941499fbf9ae0f733c5e7314555797aa","impliedFormat":99},{"version":"f7ff68ca4ababc2bea9fe21a476be0f6096b8f9f54d34f3408f921850b770e24","impliedFormat":99},{"version":"fa689046e96fc6bd92d2f6edcdb9c0c45efedcfe23443ae1fd4a470bf6e9eda3","impliedFormat":99},{"version":"cb54ec232cad4e0c94cebfd4f560de0907e65c1b55b62a7c1063ab73fe2b014d","impliedFormat":99},{"version":"39f0d3b66804b002c2f462c9ee61bfca709b607559893cccb4ade202f01028d6","impliedFormat":99},{"version":"1f0316a5da01034b17aed99fdd5ec8fe805bb65c5181587c8da353e7c1c31466","impliedFormat":99},{"version":"56442d4cc6dbee39651e056fa1497720913f1f801791b84e50e892cfbe078bd4","impliedFormat":99},{"version":"03cd861598cd715ca2bac8148c04a5f0ed2d21e90bf8db13de771be632f28c66","impliedFormat":99},{"version":"bd1578e4ca78d8de0d3dc05f95d147e45b4dfda47186ce874b3c0d7539e2098f","impliedFormat":99},{"version":"735c117db157cdfd07b4a18b777995e5ce23e535f49cbb12f5fd2c9111c5db18","impliedFormat":99},{"version":"303e57dc66fb6f7e6a79344e5135d48c73ed024cb311d2babf4df5b89fbcf3c8","impliedFormat":99},{"version":"d334f6d54e3907bf5a76f95119c4cc3f91220e96eb113487062d416c3bb70667","impliedFormat":99},{"version":"41178e3f5b546481e0a44eb7aaee78751843dffd525360d953550e8704880445","impliedFormat":99},{"version":"6d0cffb06c980b1ded7ed62302284696b2e9c88ed2608a36acee3ae30cebf88c","impliedFormat":99},{"version":"c57d47d923b6851e8880b395d0935d0b3bccc5c3691e7ce33abb247195b262ba","impliedFormat":99},{"version":"aedbbff1a84bb4cc113b3aa603afd19ea5a53e505744f971b715c412dae0505d","impliedFormat":99},{"version":"e04ad05711a15421294f32c07c87f23a99e792e44a2109700cec6e031038e5a8","impliedFormat":99},{"version":"05b4b78a0fe3f591b9f46700396ec760bf4785c238f8a27cbf78037357615994","impliedFormat":99},{"version":"54469d80797325cac80ddf053a12afe121953b9f327a3865925c1ea5fedc1e04","impliedFormat":99},{"version":"8ac43b3a5564c1b963aa0598ce3fe1d2b5673f220a2d0900a05cc03a2098433c","impliedFormat":99},{"version":"9555fc148c875680bb94cf7afd8c96cb6bd39575833f4d57755a3b8e3639937e","impliedFormat":99},{"version":"2dd5d9fe6995942adf82fff82e624e5aac2965a605587cc777c852981670f7c7","impliedFormat":99},{"version":"09ded16b94109529ea27304a7292084332eea0fec7960361650feaa57f738763","impliedFormat":99},{"version":"89bfc04207450b25e880200f4b1548391b539fc60bc2f2945fc0edfb23e23634","impliedFormat":99},{"version":"7c9600f96f56cb5356fb26046a60d5ea86f4e3a48709d316244395a8ca007029","impliedFormat":99},{"version":"8b10bff76988431e8f68b2a0dbb79df3ee0331753c4fac29b40ab62801f2aa06","impliedFormat":99},{"version":"724ce9a87bbacc89ff4ab317df599f77a55ee6545d76e056d8b36bb55f24c58b","impliedFormat":99},{"version":"79ddbd060c4878d83b491a4f8469794c8184f59ec9d1b022bc5b14c29215f590","impliedFormat":99},{"version":"c80b21e0bc14336675fe80924a468b9ecbda995c0b4705988f53c38dddf41922","impliedFormat":99},{"version":"aefa7fd02617fd165f8f06e921b8c0d8e60867af6634a622ddd017c158c5a505","impliedFormat":99},{"version":"bab81fad10b35ea3ec3886895b7b2e44716d7c73e009b1b3c6aabcff8dd28b42","impliedFormat":99},{"version":"78c2b0c973739c69dc21745ccb2c8dfaabd0bc97f27675a11eec5ddcb44f04e2","impliedFormat":99},{"version":"8883a6e862b5f07b07fccf8a0100ca73d35a2117fa2656d4368fbe089dc45ad5","impliedFormat":99},{"version":"9262edf59574bb4b69221a2289c08e9d8d9b83f51ac9838191dc43c176e26312","impliedFormat":99},{"version":"8f3e70c49f9abb6115f25ad78fc1d65edaa463f2d6d5a5a1554cc83bae5fb284","impliedFormat":99},{"version":"17aa7e05470aee99f362246e3b2fbccb3833d155b103bc85fcf3cd0166e8385d","impliedFormat":99},{"version":"c47eedce9426b4a330be6cc94f31ab0430557bf3d66b2f6fdaa8bc2a9fe3dc63","impliedFormat":99},{"version":"8fc134de25055444c3f7cf24895245a20009342b7d27fefe046a23f06050775d","impliedFormat":99},{"version":"5f291db565a8a521639a3f6414c1d7484b1692ced3fab25d5f6d9c7622412239","impliedFormat":99},{"version":"9d97d4c094e8fb4a39dc3c9c61a5ab3750df7f640f10d7cc1f0cc95254867a46","impliedFormat":99},{"version":"13b381b958471357ea0e5d55331fe8da40ef6dd444c765620f5ac6ed8604fea5","impliedFormat":99},{"version":"c7b04352ef5338a362cb852b254bcef5fd9f299611830722ca96bef2272a727d","impliedFormat":99},{"version":"5b7cc254748cfad68a29f1708899c3c053ab74088d08ab4a55488eb2a2a6ffc3","impliedFormat":99},{"version":"32d7684d69e6fb0d6b0b9526c81791c866e379d890969248ec033b76014e5ae3","impliedFormat":99},{"version":"3004fd440a0ce893bde0047ded249354f17fc5bf5f0e18cb443ad5875ce624af","impliedFormat":99},{"version":"616bd5a947e0f6c9b3b1115ff93e6bf6bde37f0f8874ad22ce1b94972210ecbb","impliedFormat":99},{"version":"e93070a564ab221196230b074e5316c1780fd97e32d134984662d77686a03da0","impliedFormat":99},{"version":"f14fb34a1756869066dcf0101061dc28a3125165a19033870b99da489aef7b8a","impliedFormat":99},{"version":"d8c6ddb39e8570cfe28b4bff78b60c3b0f8989b18f1cff11b65b3bce72cc8b7b","impliedFormat":99},{"version":"bc676aee1c0487b866e6c4879c44b4022726bd4aabdda10d8a869bfff2fc4fd1","impliedFormat":99},{"version":"94fdd74bb75c869bb49cff84e2cc0d96847e54550d07f190e6aa2f66f48df3cd","impliedFormat":99},{"version":"df87131c4e90121f3735d75f8687fd6593a2cf532f584f1c007929b2a30a5f9b","impliedFormat":99},{"version":"ede4c4fa5909299b5ef08f59bdca60f233b267dbd1cba1dad89977aca2d2a832","impliedFormat":99},{"version":"64e5054bb3a621b29863c2af6682d288c14635b2d14ffb5b446a17a63b88dd87","impliedFormat":99},{"version":"bb1fb4df5b57dd20edc2b411f0b0149f15ab5a106cdc8a953b4209f645034785","impliedFormat":99},{"version":"060c85a4fc9199e1f44449c4496e50da8803b007aa3fdd20f2285978060c33c0","impliedFormat":99},{"version":"0acc2626aeba6dec96b73ec578bc3bc823af3fce72c12c5309ac1863604c076b","impliedFormat":99},{"version":"9a761443a08143aab9c4de9693e72f6d8d23247186eb8889bcd10393dc3532c0","impliedFormat":99},{"version":"da1417971dd43589cf2f64e5f39da372a9413bbdaf4fc535b0a3bb132b1657e3","impliedFormat":99},{"version":"8889a09c6af3130c89f3447054fa5460754471e0a1f98a527e71fdfde899cb2f","impliedFormat":99},{"version":"ba77a7192b018f6e461de533baed7b4c7e574d708bb65217c42201c2ed10abfb","impliedFormat":99},{"version":"78ac78b6372510eeba34d59c12baf2f2d3e711b466161dce30d73c935340a8f7","impliedFormat":99},{"version":"a8d4f94ba30bf367db014cbef8d6ece4cb664e69aeba758567acb8c02b0bfe2c","impliedFormat":99},{"version":"8f489b6a9e3d21271875f468482bc0418341e23a0688734c3ee7e6b9ff74d7c4","impliedFormat":99},{"version":"787633e9a13f49fe7403439b33388a99637c899236a6cfbf381a063cdbe92542","impliedFormat":99},{"version":"e78023dc028d670a73c72661acbed753764a505e2f464d9d7e118046508c26bb","impliedFormat":99},{"version":"b0486c6fe4f9e68f2105cabed1c388aaf94c06774305d712013fdb5043e46bb7","impliedFormat":99},{"version":"b617febcd2b87748a5896415458836838cc7a047c9ba3c1f93e145ba972117bc","impliedFormat":99},{"version":"c2ed7a65f90e182168b8946ec12ff5aec58c10e9927b04745875843c0568846f","impliedFormat":99},{"version":"e4813e26203d7c6caee2675461cb8694d0a5a2a692fe955b3becdffb1b229726","impliedFormat":99},{"version":"90740a4740eb94a7cfa4c346de4ce38329d161423444f13d86153ad503571cc8","impliedFormat":99},{"version":"f419f04277f873a6c9cddb78465d66a7fc89453768283bc66610f4d563c1fa16","impliedFormat":99},{"version":"85c11e5e250abb4a591509a61e9db2202e7a186cadbd4184d77357f6d768ed1d","impliedFormat":99},{"version":"5fe57966bc656055ea2e4c1657dcc16edc32a08ef87dc30c09671004bdd4cc14","impliedFormat":99},{"version":"ead716385d47a7d5ee147bd5a7fdc0d156c989b4c8806a76f220649c6accde95","impliedFormat":99},{"version":"bc16ae537239eb39d5020afb0958f401befba9d0aa17bb8f895984c6c688569f","impliedFormat":99},{"version":"e551cfaaa5020ea281dbe01991d644059e60cb22b1dcc9634192db9238542723","impliedFormat":99},{"version":"21fc8b8d6387a8a5cc9e62c31fee3c8da8249fb3bc4a8ba79c5092057c892f7d","impliedFormat":99},{"version":"19082f3df1f25f7fb304a911d1a153c9391f464e3001080a524c995e4028a3c4","impliedFormat":99},{"version":"e0f6aafed1acaba5854688e6fdaf8d124383a9282c111b41e22c63f3eb3634ce","impliedFormat":99},{"version":"6562b25cdd9cf562a6d9c614d6294a5b4a5d53013a337b684198672aaa1d61e7","impliedFormat":99},{"version":"3a99f401d0459a24124f6510c9fd84c3ddc94cc9dda88bc092b2c328a2316f10","impliedFormat":99},{"version":"25f8badc9dcd1b4ed1b670442a5cb3bce3855aa2273600123ca82f7105cbd05f","impliedFormat":99},{"version":"df348ecd79b09037176daee7995ddd749a1862a11ed6ac4b0c8a3e7a27cfad27","impliedFormat":99},{"version":"36b1f70dafde83b308cf0d9605fe43900cd340320a5943c79085e39b7ce9c344","impliedFormat":99},{"version":"d5631a56aeb2279698572bf985113de7e1deee43c56cd9dd85aa2be1a41bb998","impliedFormat":99},{"version":"108a85619ed468d15c2f5ea49aa19be365c18a123d2c096cdb682533cafddee5","impliedFormat":99},{"version":"e8e65217abc06cbbd6f5d331cc2fecc278491350423f03ac47aec6978456716b","impliedFormat":99},{"version":"0ae17e04bf71b5eaa46a509bccf6d58cf793a33e39c27077820fb010d4f9521a","impliedFormat":99},{"version":"60d25f66f4b6ef80e0f66f3b2ffbdc88b9ee98d925838d5964fccaa792bb7bc6","impliedFormat":99},{"version":"fce7a2dfbc5f0e8cc50b843e3b4dc606a98832cd6d4a5ebe6ddd054a92dc2597","impliedFormat":99},{"version":"c30274fdea2366b5a293415a6a09124c85b42cc6c02b8d0fc72af5a05351f55e","impliedFormat":99},{"version":"5dd427cc3c26d8e97c7dc0b287e06297717f7a148829fb7fc5875e93bf40956c","impliedFormat":99},{"version":"3abfe64fea01a095950c9f1782ca2ef01ae5391fe5b7fe6443222e5a6adc5d08","impliedFormat":99},{"version":"17a168032c270ec761481e277ac16efeac6530b01870720c17ea6649c9db518b","impliedFormat":99},{"version":"b9e54097ce2e07b1911e42f1c578d9304ca3e2c824f989759bc2199d54e4db0a","impliedFormat":99},{"version":"52256083681cca90fcbf3796937308d94e1c8e3ced04a7974b49ec4209f2ab4f","impliedFormat":99},{"version":"7086e03c6bbd58177835da26104c3124e985afbd9a91b3a148e0cb88fbadcbf0","impliedFormat":99},{"version":"d46dc9978eefe051bc8f6679dc6b6a8be7594247effd2563ac488afee31ce9c7","impliedFormat":99},{"version":"2baba9d417f5388ecf1f2b1a9a58a4b6d4ed7df15509d60de9d7caf1f0043ba1","impliedFormat":99},{"version":"fa412c9f26d7be8ccbbd56ab3f1fad78eb9cf87af63fd8c6fb29dd0450b47622","impliedFormat":99},{"version":"4da7dcbb288a72cb7488728930efa47e46fb3dc042f25aa7d50468f0949bd1a0","impliedFormat":99},{"version":"b0b15e47e8d7e2875b28284ea08678baf6f4dcd420241046fc91743c905d0947","impliedFormat":99},{"version":"7eef51f067c640ef085973e8e13608a0b91c912297514e3264fa6596f328c9fe","impliedFormat":99},{"version":"4afc590f38f8051eec35231e6946ecf2151d7a23ad4e138047b01c800d94d9d0","impliedFormat":99},{"version":"4c42c37e1f02b327024ecb1edf1b5a12e4d45092bc51b405985a791ce32598e0","impliedFormat":99},{"version":"8adbcb728b2d3bd8282e1a657a45f6f9103a7eb43f6fbe36c554bfef17df9656","impliedFormat":99},{"version":"ae061bc7af2f9ea15a742b07e471c27fc4d82e2b940509f9e7da3f129595e03e","impliedFormat":99},{"version":"d15f78dca6c2afbdd2596cb17983fc60a79d95dc0142408d224d671f8b6564dc","impliedFormat":99},{"version":"2307f448951cae8a6b9bf7b09c114369e42d590c53fb99c99fb1cc34ead0f0dc","impliedFormat":99},{"version":"71ceec981852d2a8b0fb281799199344a6ec90aa55e13302916f38b48debd10a","impliedFormat":99},{"version":"5c943d5009f2f31841d04d8ba9e853a13201a9e81fb96234c90191f00a50a713","impliedFormat":99},{"version":"cf7f50328f9916c083247e28d938b986a9d9fd60ba956a90ce540ff676e3deff","impliedFormat":99},{"version":"9005e5cc014620c428d72c3333d6430f4be9ab113c7c41400ea4babe458907fb","impliedFormat":99},{"version":"5040c1eb043d900faf3cbc181831b7aefda2fa75bc08cac59897baefe2666e43","impliedFormat":99},{"version":"83e5ae91867c4b4d94ef5c43b9652401642b80f3a4b86af579390dc2fa97ed10","impliedFormat":99},{"version":"b87b16115bb301284968c766678ee98ab1c2276f1bc4e437945db172718a22b3","impliedFormat":99},{"version":"ec78470f53dc3905513b87992cae127a1d5b793ea42cd48c8ff809ebf576f19a","impliedFormat":99},{"version":"a22df7d38217bf9917cd51c7df7da7965d6a5f57b56b5e612f48ecb34a693c1e","impliedFormat":99},{"version":"df740e512060283334dc9f4d608bb7ddf9097b6e1613dd2b3145d1455bc4f73d","impliedFormat":99},{"version":"b7eea3116456adebb14baa549db35cd82759bdf2f5b161e8ba12768e634b10e8","impliedFormat":99},{"version":"930612d51e2a0cb1402f15a758d8bd025ee29b4c47a13d038faa3fc8ee16e3ba","impliedFormat":99},{"version":"da4d4b60a3c4a12f155b1ca908ff6500c81262168dd39bf6b7f2a632661beb4a","impliedFormat":99},{"version":"1c7a163091d67b9af010e10f5c43ceccde78320486d2901053b4d5af2b751b2a","impliedFormat":99},{"version":"6fb3541ebbb5e2a930fea38603d4c0cbfb4dfbbb7df8999396a8a90939131ef1","impliedFormat":99},{"version":"545dc958d8101a8e3c9932370a7b6c2f8599df0cd53449114fadd7f59fa9d6f6","impliedFormat":99},{"version":"cc8b39d1f46ad8e39ebbc27d5664594a82625199459a9ddbe54ef17b4239ce24","impliedFormat":99},{"version":"08c3b01490d49ce93d06bcb7593ef9ad02dc2d91cd583eb9cd0f3d2fa75e440a","impliedFormat":99},{"version":"6ba19623201e7dda0bda2eb91bc7d1ee6ed719be167f999564a42ad8535e2f9b","impliedFormat":99},{"version":"482f77de2d4972e66c7c6a3aa53b524e20eca97cdaa3220cd2ab7acd3a7a54f3","impliedFormat":99},{"version":"634708acac0aa7d170f03a37a9d8cf6a9febefad220477649f6ec3e1ac1f7adc","impliedFormat":99},{"version":"89b2f499dba3c24fdb44acef871860328553cc46a4802874e17de01d530056f8","impliedFormat":99},{"version":"0288e5f29c1d2b678afce4d682a7ce94c323b86c479f28a4a33928261a5fe4ef","impliedFormat":99},{"version":"4e0c84783c17101df536fa4018dad2c210ba3a41daca0c1df4957f7e8dbabbaf","impliedFormat":99},{"version":"bf17c4d237818052f7f3bdd00fa2433e5ee151e1dbbaa1700edd2d229bacfb03","impliedFormat":99},{"version":"862052995b61cdf46e9fdf9b83acb076975dcfe2f44e45c07b23ffa70f9dde0a","impliedFormat":99},{"version":"8a85e856fe6d7a45e4acac5406bf440ec274ac46171d08567d38a7ff36796c3b","impliedFormat":99},{"version":"b48976ad99fc88001f7c2757d84a6bcc5e8830f7e95fb3c73d774e7710b51aa0","impliedFormat":99},{"version":"40ec8dd574cfdd80de30ba61a0dda32c83d6b60b783ddd5c9afe21187a8b0353","impliedFormat":99},{"version":"4ef67ffb70b66a188eb391c50965ce59a997e5995a060cb0eb803e7937f80cc1","impliedFormat":99},{"version":"bd3f53621504b6b6fb460130652d71bedc7b48c4fe26e81a62f9976de519700a","impliedFormat":99},{"version":"1a94fffe1807952952587e8d392df98582a90f034abdce57217cdf8409a0a16d","impliedFormat":99},{"version":"b7b4608cddbb582012556d2016b1704bb77c9b320770cbde8b98ebbaccdc6056","impliedFormat":99},{"version":"7ff126c2720906e2edc4917be8a00ff52597dd050a0ba8deb82ae1dfff440432","impliedFormat":99},{"version":"53aaccfcf252817f557afc4e9aa18084dcc90e5c096411b9f60b6b7de4fcc41c","impliedFormat":99},{"version":"a7f0bf6a7172f6c4a33877693190c8dca6b5ca0bf0deb5130bfad368b61e16c8","impliedFormat":99},{"version":"fe428bc5c0d6ce416defb7a7e67fa6a10b182b7ee2c16b42419f9538cac0fe10","impliedFormat":99},{"version":"5f19171239190089286ae47ff6d0c9d6fd2b29342dfd0acf6cc6f66f9d1bb4d5","impliedFormat":99},{"version":"d2a502e2c30b775339bfea8c1d51d3dd5244980a3cd5063ba12227cfe03fef44","impliedFormat":99},{"version":"a64913d689476c4743b020c801672718d1a736ab243907396312b832b65cbdc4","impliedFormat":99},{"version":"2d7bd36015925a348793ebfbc2e2a1fbd390bf335be8b9ec780696ed6dde26d4","impliedFormat":99},{"version":"336e86ff9f1abe22105776c7e757e9580446aac47cf8429ca78e6ce980f284e9","impliedFormat":99},{"version":"1416b07f727c918e532f4134a45e3b07b0a116d9def6d9d347a00c50dc01060e","impliedFormat":99},{"version":"a44330e93e4a7f8759a73736215eef4590b74b3421d955d980ba3db8e6b5a7fe","impliedFormat":99},{"version":"ac84b7a6fdece6cbb0ee141a09b505890c3f11c83446f6304ab9d8e972eee60b","impliedFormat":99},{"version":"97ce0d7c831f1fa7934651c878f1af14090ba5d9ee471db035f465a7dc113202","impliedFormat":99},{"version":"cbcc2f6b5fa06c91e2a35cec35066fd14dacccf185dc8c64c5143381bc2d4b30","impliedFormat":99},{"version":"02bfa3730c6288cac5928a0fb08f01f8c236992b0ef57806c478f0f7bdb6eb83","impliedFormat":99},{"version":"5af40b9066886960f300ad8efd6dd8f77eddeb475903989841cf0385a1edf4c7","impliedFormat":99},{"version":"09d52052be4f3e0f4c8fd5d4954cb215a96e20bf6fade80f95706fbdd5cee318","impliedFormat":99},{"version":"f61822dc28d52652fd897fa846364a0c6e2f9d18c4488c104f4887b4627b3fb4","impliedFormat":99},{"version":"55a4f8c04961c6cb99a6d2c79a375e4ef107339c3ccfabd8d986f2a177dface2","impliedFormat":99},{"version":"a5433e2b1359ac2672f3dd287d58e0733fe778ef7dd71a4f913b01e794104119","impliedFormat":99},{"version":"19d3750d9f8f570936cea4be2a6feac27e1cb88391d7c54e3209f479019c1bb1","impliedFormat":99},{"version":"acc3dd66b849dbe92d07581baef23754c6bd3d4cc453d6d8f5d52e261304a3bc","impliedFormat":99},{"version":"e4813e26203d7c6caee2675461cb8694d0a5a2a692fe955b3becdffb1b229726","impliedFormat":99},{"version":"63e92d208753fa0737072880b8ebfc8a054b8bd4c7af89b620605b7438d7a9d7","signature":"0c1a5de0fe6a22e6065eea7dcbb344229ab4e0f07e5f92f14a9db66cf751df8d"},{"version":"1c1daf58c1c6dd6a31251c58281451563d72fef70981c26f088c175ac531bb1b","signature":"fc1a017c014bc3d02e347c6c45cbb9b2f446bcbddf1444be8885635ce9c10d55"},{"version":"cbd765214348178d45423a3d2b490ecc208c1b14161bcee412e1c675fe8f85f1","signature":"201d60dd52e618046236c6d3fcbc68b5cc0265267c6e3cf680f414666b21ab44"},{"version":"0f4d743600482c51737fda2a6595aac1673da0d2bc468bef49352d3892f9745b","signature":"f4ffdeecb5c6637cebbd072c6b157c4ddebb2de8738d7be1e5456b34bdb5e3dc"},{"version":"dd56a5146cceacc25f0da3ed5210792064e755be6b670f7c9ba0aa82a329dbed","signature":"f5086f68cea44c2b66d7bad5000fcfdbcc08d5fd0ad46461376023d966d04e23"},{"version":"077cddec2a22d3eb1ecb4455d5b488d84270858537e795ac0c51d37e3b8f4cf3","signature":"62c681fe11c849a28fd2ec36e7dd717a90b3892de59b68123594fdfa0b2f7ab0"},{"version":"959734acd7d29267ec7e15a4975ac091e0e806c65fe3367c19c791412720bd99","signature":"fb151c164a917f6ada3b9783fbee8518a8ea80695189b66920aa777aa76419af"},{"version":"b06d9380eb2fb5c35f16d03445b1963e8fef5647c592642f5d8dfbb11cebc1d0","impliedFormat":99},{"version":"33e160560eddf2de63ec16a76b8c1d91cba0f5906ff2f29819e07521d6382f6c","impliedFormat":99},{"version":"c35a50ae47731c15c54b6f359590d24776fdd74374bc85031afb800212181af0","impliedFormat":99},{"version":"f34a1a6965c0bbfa374873432849ec319413414ec186261e97ea70d5dc4d4654","impliedFormat":99},{"version":"a3f4b311af4127148f5dbb1a1ea80468a20725f10ae78001a8dada6e4a618696","impliedFormat":99},{"version":"790d03a802369d9a8ff78db3ece0cab418ec75a120dd5ab9aaeeb1c534493d3a","impliedFormat":99},{"version":"2aba871159bc6021308c5f1d05d7917e0c896c7436dcc3619038f381859fbd68","impliedFormat":99},{"version":"adaa0d941bbf9d3f11262c3739579aef70fea7af193718f8fd67e10a771fff8b","impliedFormat":99},{"version":"f178ad620e827581f2baf23c9c7fabb77d36ead92c15e149012934a30151dcf3","impliedFormat":99},{"version":"ef73187b0072b9b148b03acb62dd12615d704589772ce88e2e2e1bbf0255c802","impliedFormat":99},{"version":"417f252d9e1048c6b47d8a8a5a8e7ff5e9a4de37d6d3468152f2e8eb35b88c29","impliedFormat":99},{"version":"f3b2ef02288170cb72b7d412a7cc67dfd85dd24c168b78b77554f1ec515b5701","impliedFormat":99},{"version":"590460ef9a2cf9ab9e34504aba42d6daffe4ff7c347ded7bd8d9a989e0920c3b","impliedFormat":99},{"version":"da45f9cde46eaf3ef2d3135b5354bd3739897d72b406e0f0ec1f5455108580a1","impliedFormat":99},{"version":"cdfaab58a31962eb873192959e14bca891669fa0edfd469c9c35babc36e490a3","impliedFormat":99},{"version":"206d171772d21c82353069668d680a40df7489bde0446fb70f378256ad9d33ff","impliedFormat":99},{"version":"b6104978f6a9921d214c58df950900dc2a9319815a843d354881fd1bad7e62f0","impliedFormat":99},{"version":"1202e02184a9fcfafad7333bfac2da836eaff83653845e00c9495d9c82c9f635","impliedFormat":99},{"version":"6899200d51b7d7491d15521da878142c5fe50d711afe22e60e359f6db6c98088","impliedFormat":99},{"version":"c5e79b84695297cc596924039842c2ab7821470f1c97c4b1aa9d6a7f5f2d2e3f","impliedFormat":99},{"version":"630927db336d1990af0f696dec46f8844c44c507e3a72069f50754541dfcdf5b","impliedFormat":99},{"version":"b4e7867fcdc8d3c7a23b45cd2d705d2dc576a7f7a70156b17aadd7e01f334315","impliedFormat":99},{"version":"c89ac8740afdfc27b2166cad337e716fe843eba690167cbec823bd689f613e6b","impliedFormat":99},{"version":"23c280c11bce285e8f022b0009e083a1bdfc3839f348a38df9dde0c3c571820c","impliedFormat":99},{"version":"dd5be7220598df4a07b6281e01170d0dad5fcd74bcd27daad19619b1fdacc6e0","impliedFormat":99},{"version":"c526474a2770a981d08d9f00644e2a390475b0f9910888d426a6b2e6686b77ec","impliedFormat":99},{"version":"d5cd7c1300ee1f45cc7ef5afef746a1a34c701b94958532a88d265a9f0068063","impliedFormat":99},{"version":"a01c5aaacdd5362cda056105f2acea8b8c4699ce28ccfe641399dd0b49239419","impliedFormat":99},{"version":"6ca50db42bff8c322c4a7449cb09545ff575a1c4bd4fe6d32a9adb563f3fac2b","impliedFormat":99},{"version":"2a45ce8c09f2f343ac47fede405b833cd0ccb325f9b313fd2febfff8ccebd8bd","impliedFormat":99},{"version":"c67e3783cb681d6277dec8ada124cea535c8c7f4d99f5d6f0fed69bca38f3807","impliedFormat":99},{"version":"76ff4e5304fd22a8ebe6cb01ca297feaa0dbe14988ff43746345b55ab3504e19","impliedFormat":99},{"version":"361cb330385d846fbabf3d4db59be3655d45d7c76a483a03c71b0082014f4e9d","impliedFormat":99},{"version":"43b526d382577c18840fb6c10030753b82eb60a377c50233959437dc6493b047","impliedFormat":99},{"version":"7529eb5b698818410c1858e22ddd689fc3fb6f86d54af06872e40423574d15ab","impliedFormat":99},{"version":"3ee6957c2293a69d9f7ff232da8425d396e3115e9ba261a3e532d350e2bebdb0","impliedFormat":99},{"version":"6f70230fab4be1aebb2ef95828669b89dda35280965c55ce88aecaf94848f036","impliedFormat":99},{"version":"8d87cfe48ed90323bac6da16f46aff7fa293e32057cee38d14aab11e9f66e4c5","impliedFormat":99},{"version":"eaa88006a1ba314595330bf47f08eb4a468e7764a1060d6e133183aed7babe13","impliedFormat":99},{"version":"0645cd3e93a26c8a7c16595dc63a169d137f6b58bf50cca98449ea23b333475f","impliedFormat":99},{"version":"1586cdd29126d1a54dee78b46eae7b26c7d473bfd7eaa8bbfc5bf2a76946c545","impliedFormat":99},{"version":"accf489fbfb2dac5d38e71b2fe81687fd44d64b21b5631f6084b9acff57b4d48","impliedFormat":99},{"version":"0c5390e201ce2722d720a82c2105e07606576903e599ed3af15fb8e4e45ea2f4","impliedFormat":99},{"version":"b556cdad15c625405519814fac6ef355484a25c1cc9344e6e5dc110d57a8cdff","impliedFormat":99},{"version":"3e810c39b288e419bc933c293cf5703b948b73bbf07050527c9d73f7107c0c4e","impliedFormat":99},{"version":"9278bac0ed6d0d99fcee6f0f217399ec12edc1d10a9b3c0873c7b97a25223384","impliedFormat":99},{"version":"6f3dccb219fdfb3816c02e9a99d959c853c855c7b7beadecd3a3d3b0a374d953","impliedFormat":99},{"version":"2eeaf63552fd9c5d3ab821464d8f4a5db0de7132331acafafce577f58d871a39","impliedFormat":99},{"version":"9025d4254c18b31d9220e4d33dad5035507ee1e863d1858891e56ffe0eb2ff13","impliedFormat":99},{"version":"001a2571401e839a4b68cec0af11c6188f766ebba01cc1e1895027e3d35030b1","impliedFormat":99},{"version":"846715a4679c9be48434e2b6dfcc466588301a733f51ba0ea15e348fc7312528","impliedFormat":99},{"version":"0b77894d2bbddb9024a230e9d00eb9df633c8d190887f92959d9683a81286c39","impliedFormat":99},{"version":"fe438b40de8ec7fb4a1734f8a3c8315aafcc90dcd15512484e7dcafac310e856","impliedFormat":99},{"version":"96d53f66b4fa3ab1ef688b676450895730863e298e62dc6bc051442195aa1a5f","impliedFormat":99},{"version":"877f538909bb2120565ca0c39e93341e5a4a737bc5fda014c5148c3676fec8df","impliedFormat":99},{"version":"fba10fca31d18ed5fafacb21e2ed389ae5b347b552c5b7a69023a563e27fdf5d","impliedFormat":99},{"version":"600beaefece9011d792a4e165db46b9de5563e025e941aebd069b95cb30e7af5","impliedFormat":99},{"version":"bdc387fdccb98bd48da4cd4cbc8f29342586c2f8ac7215396547442c3b0ff8be","impliedFormat":99},{"version":"7ed291bf246832b2745528de9e68b2bd3e2fe7cdf32631665a326740c3905836","impliedFormat":99},{"version":"e61bc77843da1980c2b6851df589e730bbbdada172986ecb47101974f44aeb5a","impliedFormat":99},{"version":"00d79566e3d5682a968b44aed9eba1557b1f62c884546fee2bca88be8c477104","impliedFormat":99},{"version":"f82d26f23d5e3093ca86458544b54befaf0957a5535149f673976187a60f9e6b","impliedFormat":99},{"version":"9f0d621f43198d0db510779ba65ca3d1a8fbca37f408efa5e25ac5ca01f74875","impliedFormat":99},{"version":"9bc53a206914661c0f98bb869eeda7214778367683a5e3e0fe7c6eaa6c474556","impliedFormat":99},{"version":"71987002d6409ea81e705fbfb97afc644851c16d9fbb5e90fcb3bc3e00e4ac5d","impliedFormat":99},{"version":"70e86eda2938040292fac398debcbe47114a3b9bd6eb8f632a89dcd23ac0e2f0","impliedFormat":99},{"version":"6241345f59b24be6e85c159db51cfd937f853aa8020b38b2aac5345813b25a8d","impliedFormat":99},{"version":"583eb3b56fc84b730641e623070f6eefa3fbacae4e15a6a3f19e1b09c81a7685","impliedFormat":99},{"version":"1c96afc9b678d9f15ec1b045864ea6cff25c134fd594cdddd42d66d99c8663b5","impliedFormat":99},{"version":"cd37c2470a4ac1ad7e1bdbd29bc8953589a4da6a7326a3bfd885bb7b220ffcde","impliedFormat":99},{"version":"ce82368397e5c926481222b9adb2547e4f9e0206982ac71c301284d107e77ebb","impliedFormat":99},{"version":"602a7beeec46d5f481d8f017adc1e01314101dea37f8f9ba3debcf88c83a44d5","impliedFormat":99},{"version":"d4e62d466b6302ad6419cf38669dda1eabe141200b15928a120ec32423904fdb","impliedFormat":99},{"version":"7baac7cf35ef7ef1b049fdfaa215f66891fd677bd617ec7e9a89ca9d430406d1","impliedFormat":99},{"version":"7869a702c21d4fe08180df0919c6365d4662cbdd9e0cbfd17bae7222d10fae58","impliedFormat":99},{"version":"e2944368a3fc08ea1ecde61384f2aea35d8551f02e20373f26f19a1e15f33c01","impliedFormat":99},{"version":"1e13585db16f3406755c1f7a3b32a2003d0b04f83df215fafae61c665de938a1","impliedFormat":99},{"version":"5dbbbf480819904753f84c454eba9bebc455b19966195e97f6b365e7cdcae4b6","impliedFormat":99},{"version":"a96af1a20dbd8aeffb9dc6c2461c7d9d131979390a8b41ca6975f652e2a897a4","impliedFormat":99},{"version":"46f1bf29bd4165fe2bff54eecd23a31f45b1432ab50ba3a0304100697dce91b0","impliedFormat":99},{"version":"1b5cbd26dd659f174a672c6d81b3088c9f46ae0dfd160ce93d2afad5bb7151a6","impliedFormat":99},{"version":"261790ad96cccfe94b94e4825a11a719210f9251d430e05829ed4f0b3d90fe48","impliedFormat":99},{"version":"55eca0dcf8f3192e5906e73aa8c7b88d898b1351bba84c69f4c5c38ab4e43f6f","impliedFormat":99},{"version":"686832a82159a4ea4dd25329c3a99c0a94d9b2a83e7b4ceeb6dfa58bd6707aa6","impliedFormat":99},{"version":"ac339c5b90464b77c2f28dcc686944c9d084f62e680960619f6832471da398ef","impliedFormat":99},{"version":"5090c4c9eb11d488fe455e985891f55e90d65365933d5797b30c188fdbe8015c","impliedFormat":99},{"version":"959c4529d03aebf8f76af7e58797800a25a6a14f560228a69235edcac4e8bfde","impliedFormat":99},{"version":"e893479eb9d99a9c479248a70650f43d3630614ccd0ef07352e208a23988f7cd","impliedFormat":99},{"version":"04d51092411e37e0df07828195cf9e0462861523461eba25eb9dc52344ead7d6","impliedFormat":99},{"version":"a2bf25976a0749263db4e003c2db061217b6e63aaa674f3f2e9dbaeb75f0cf87","impliedFormat":99},{"version":"92bf26f78ac596c9f643b340974854edb633f4719c7d9ad812367883e90272b0","impliedFormat":99},{"version":"afc885e843cf91a18e1c9b674d958c5c71ad3b8d2c9762c6983025d4a30d0918","impliedFormat":99},{"version":"01ff8948288663a825d5d4b5a48fc4dd54adfd4136c00c11d2a01eaf19084340","impliedFormat":99},{"version":"fc61c6168137297ec33f5720835a8f1e7fc424b00e0faab2d24e980dd0bd03c2","impliedFormat":99},{"version":"0b1cdbb2aef2c6ce308de85e80148059f7e16bf727eb3830a2e3e744c4aba6ad","impliedFormat":99},{"version":"1568200178c3ffe44819798eab91cbede3b302ff487149b18aa814a9410645c9","impliedFormat":99},{"version":"3ccf7553bce15ff3fd0b3a0cf4ee9177e9835577aeaeff17c1c6e04a5fa60b4b","impliedFormat":99},{"version":"44182cb6be79f471d6c4a40937a8d6d183af1a87cb26a3bad310c613d006351e","impliedFormat":99},{"version":"261e48dbb899ec4e2de4b9a72b8127a3314d28828b357288bcdebf39be32c126","impliedFormat":99},{"version":"80b3a4c879b86f31611611d628c61546a3924a17609d2abce5af75ab1526bd17","impliedFormat":99},{"version":"69260d8b8cd174b1fa69eb05cad51051da0cb9bad809cf391c1d8234d4b403a6","impliedFormat":99},{"version":"79992568ff244f34b7112942a3d52eb9375885d7e1d8099fc1a17552d14c6fe5","impliedFormat":99},{"version":"dde1fa7a49e820b8801d01bfe9e9b7829d9c62e8eb82a29ef2c28f239aadb5f2","impliedFormat":99},{"version":"e0cd63cf24da521cea60545e5573cbd7eb13d024cca52cc342032e2db987e7b0","impliedFormat":99},{"version":"b1c80011f3a457bbf2e1dec4b6016e63121e60de3b4ff805f261f69016aeada5","impliedFormat":99},{"version":"0bc0511027cff18f7025fdb354850e43083e16d2af2a48da869e095b8df05616","impliedFormat":99},{"version":"70aa4b70c1ebd45e76e4dc63b414d0a7e12fd41ed860da7d9e42737e2a11559b","impliedFormat":99},{"version":"7602bb9744aa13918f0dc9713e4a84e9e97cb099317eaf164c042a636311963d","impliedFormat":99},{"version":"de557ce115571688c6a8dbd486281e4d5a8068ba9c8339ab483014d4aee792a0","impliedFormat":99},{"version":"d942ff22d0bd25a2f26c50d2cc59d6cde2bf7a6cd428e3dd26356033015391ad","impliedFormat":99},{"version":"06e3997ff9c559d21c94113cb949cd03bc44f16cd77c2d7bd42f85c9be29a70f","impliedFormat":99},{"version":"f0029f53c3acc648f4215bc446cd60d92e8c29a8e73cd4008c1e1b37f91eb811","impliedFormat":99},{"version":"b59791581c6df3f62a81a0e96fb3e833a2f5b36304bcb074d765fd79d2fba320","impliedFormat":99},{"version":"627109c27f42261a2148c5758e5529e0694e09ffb74c2cb20e86a7a3682134c5","impliedFormat":99},{"version":"233ab9a64155ad15a070b03a52f8192ace79a29c03a9d4f7cea88929afeb1d45","impliedFormat":99},{"version":"fa7781b202e5845b1609eb84653dfc54189ce4e891909259a9aea73cba9859e9","impliedFormat":99},{"version":"a54b716354950f63c6e8ad298bdc90f94dab416eaecb3d32e9c6dd1bccc79eb0","impliedFormat":99},{"version":"38e6306d5a856a848f6737da319f79b703006b16ced089b2c4e80d04efa58adf","impliedFormat":99},{"version":"0f1434bb4e24cb50e9e73f0144414af44c1610514cb1ba0665936fb4993a3db3","impliedFormat":99},{"version":"1f15564e79f492da5842d1fd5f29cae75d37737e5abb4690b3b4bb9e7e856f3b","impliedFormat":99},{"version":"91d60e5b5441b738133c095fa2d6a809a3c3c4b75556d7f13cc19df48e20de12","impliedFormat":99},{"version":"6beeccd58698b2f72df8cff766e658f4adf98ef39ce1402799d4c18db1b2d803","impliedFormat":99},{"version":"980b920f853e57fd46983d0f5a2e7164f2d2e9dac780aa04d4325aa235c0a75e","impliedFormat":99},{"version":"3a39f3263b853937eca381775fb7558b4867a2714a89d770ea98c30dd1fadaa7","impliedFormat":99},{"version":"ced0b20e13a057c20d802a11870ff310579c6e80a5e5e45166de9e5f0e88f8d3","impliedFormat":99},{"version":"62f73fab1b97e50ee8092499cd5a8b5085abf700b372c24aa53e1879a3d68979","impliedFormat":99},{"version":"a393c298d0678e3e0b610c1069e3721de31dcdf1f885d6ecd813b837330156aa","impliedFormat":99},{"version":"e4784320828932df26b306ec4839c8f9496b959173179a29b29163efe301a7b6","impliedFormat":99},{"version":"5dbb45a20780dd90e28869e05035e681c90afa007364f01c3c3cf14c4cc04467","impliedFormat":99},{"version":"c9e1e15b8ab027dbbe4a2d85c0669905497e0d55a09c702f06c79e57645e347b","impliedFormat":99},{"version":"4078ccf4490cf97463a7ff2f9e02ff30a36ed2e4b18e8566445838d0d4d603a3","impliedFormat":99},{"version":"727d10cd972ba9b52da4defa702f65739323f9ff9949a7e9c7bd55fa76c37ac5","impliedFormat":99},{"version":"9420bd92184bda15c9a04daf532afae98df4fbbb17a930983ca664e929fe6c6a","impliedFormat":99},{"version":"684ad94c713c5f22951e9f433d52786c8508447510005459b6d9764c75cd2c74","impliedFormat":99},{"version":"3e00971f3dcbbe00de774d5387485454c98b8873bb636b8e6bcd4d9915ee0a2d","impliedFormat":99},{"version":"931674e02ae4a041ad822756dd4dbd30236bb3b52e21201aabe678b734baedbf","impliedFormat":99},{"version":"940961ea4bd1da98cef1edca26d6380eeb0c3e06df2e9d7a29dcb57303fb0326","impliedFormat":99},{"version":"581f0278df053736226f58d9a4671e2bdba6508f8be23751247c846e82736a0a","impliedFormat":99},{"version":"ff7eebe9610f96732e29782294ee55529ca5ff804e2325ba992cab0c2ca4c05f","impliedFormat":99},{"version":"e0138d7c2408df5bcc623e3e3b496ffbc405421c7dd7ae6ecf897a657926e2c4","impliedFormat":99},{"version":"18bbffdecf7eed3cefa4a37f34dc879050e629231ba0bd011e2ec6f7503a6cfa","impliedFormat":99},{"version":"fd2e67b97e27962b7c2a6083a2ebf936e7dc2b2335286df2ef5cfc09eb8522b9","impliedFormat":99},{"version":"2e1ccba239f8919e62f83719bc95b4d47b1d1e0187cc6968b5481c86dbbffe3c","impliedFormat":99},{"version":"983bd1482518c10b3e7549f6fe3f51cb7b9868f38ea715cc0c19c8ad6c5c34ca","impliedFormat":99},{"version":"728cf2a025de44eb3e43b3e87d9c8bb2feafe8a34de5ba9b2158317b265125f0","impliedFormat":99},{"version":"54977f121205ea7c7a6c86b42d813dc55d7db6e69c9554a262fc64cae0c7eacf","impliedFormat":99},{"version":"2f94e898529d71f48c841206140ac13988a5ab275bddf852922ad75b7021537d","impliedFormat":99},{"version":"d27f8ee9a610635b566109a359d00923f7e8f286ab7936894671c39a006e8b1a","impliedFormat":99},{"version":"5822d798e08ca6c321c2e5deb337e3b6d6472f2133440c4a2468f0ddee71ab75","signature":"f3688333654359ade219d4e94fb2a91f12339e46c19e03e451714a21e577435c"},{"version":"8db3f96517a120bade1643b55b24ed75a18970f4d38221402d9eccdbb5106fdb","signature":"f9a16b54b8913022325e94f69c48805664e20b6556089e3f3506306b97fe129e"},{"version":"e34e93f5498ed7bc9c53a9ee97d679f90fb941b9ab4190b5ba0747184ef12ad3","signature":"6411762007a15dd690acee3a833c9d06863ca69119d48bca9527fe1f81789e17"},{"version":"826dbed35d26577d6f4b5e24f43c7872739c3f2e2710c611bd916c71e7ead76c","signature":"0fce6ce21d226f06ee4ec92d02505e204c3923a1142ca5f35b337057129b8945"},{"version":"188689411ae7835d75f866021a4ee438a20786cf2b2713ddc5ea50da56e8dcb1","signature":"77686fe8104e5c58fe273a2e8d3e7b423f26cd950395ddf4f453921c66060073"},{"version":"cecf275eda8f9503ed2596ae41c9af7bf59d56ab70f57dcd65ebfcbbb876a1c5","signature":"a0cee837e5373cf7095c21e187a4580b8216a64ecd64aa80d19a6967e6d1bb59"},{"version":"e7434e5f90aaa3c85f4658f7e3d3dbe8fc90d286ec4338c282f90d3a6bda0e60","signature":"006d76e50e7f1e25a37da6d436aad571aeb2d646c47f833f9bff146080c9605d"},{"version":"f5c96a4ee0e61f5664d81620d619f5db8aee48c11dd320d767701570438cf0f4","signature":"52a7d02b1fe8db0b42f5259d721b5c7f6bea6d862b8c5ba4331b7169d058305f"},{"version":"bbf69504a153645773109c5955c205947bab3599ee4040e23435f29b528f3b79","signature":"652b463ed1eaf99f278d254973cffb72ea7ef2e76ed166857abe2161fc04d04c"},{"version":"0dac072a14e3269d00b11eae5125b109761eb554887e30a44cc32d669643372d","signature":"ce9182df67b7ff5fd39e4b85aa35925a415d42f479d042c6798ab79a302fc3da"},{"version":"3efdcb8d23bbac7462611f4c50817e856d8e705886412a99c6c60e5fd56578db","signature":"16e36f8bdc965f654e88ae74de905ed84df7bc77cd00bf8f1cee2a20a5a77783"},{"version":"55f15686670e197a8ead330f882ab203109f0386b928bd9b19d1d7291f0f22aa","signature":"cafc2d90a1946bf6b9447683f11a384aeca03cb10c38b8945e4ceb287f8a97fb"},{"version":"695ec5bc819d592000baba9c4e6b34770a1853a60eb27ea02582412698db23f4","signature":"a15b80466a1f3ed8be589bff280561373c2b0dfa7b22f14ce7dbdd0b0d64ec49"},{"version":"64e4a36aabd778ea468c12dba55fb5990d2c711b295f1b580c6c859e667492d0","signature":"404049eff8654148369e62fb3e430ac039e762b0f5e25f1aeec5b5c35499710e"},{"version":"002a6f95435929fb339cf9495f6faecc314a30fc0b434f08b7ece78e5152339f","signature":"b46a7be2bec9c094170bd64ff5e51062de78828862893ccb070c57c58948abf4"},{"version":"f6cd17ae210c40fb0bd4105e9053842942956a8434d55755f1630313c71f658d","signature":"b0f87819f7baf6659bf4531fcf0687f9333c26d56bf86c00a5162165d68a2aeb"},{"version":"9628ac25df4cabcb3d7510fb0c46609851fd475327917bbedcd2b4f258657212","signature":"a0ad37ab2c1f847fe8bb1e9bdfef18ee4719429f1ed808f8aa543d363f23069a"},{"version":"fb7a0827a700b2998bc668b649c22d0cb606ff9557b0990672449e9f518fda72","signature":"e034180f88ee9195af896f639e7cee117b277e3b765995424f8991b3f6b4dda2"},{"version":"d6bc387f53aaf1f3d8cb4c5ea4e4c84865e4fa26d42472ee446bac50e0f7125b","signature":"b871a827a3198ec8b0e0281e1a5dad54d3a3cd2b319f4fd162d55c35833d91f8"},{"version":"ab596340e3c0d463ad4207a8c70118746d30d011de74dc13cd576754169b3b8f","signature":"842f5c6f3899cd852c58d006876c188b06c9093b7372f967948198882a9c32ba"},{"version":"2dbbbcc4278e15615c72a84c5fc531eb40c20251e1957fbc0940cb10ac54adc0","signature":"7a17b7e9cc71135e7ef3bc471a24c78944735953b2854b2f04ee038af64d1a5a"},{"version":"31cfe5c565546aa6c6499ddc519adabe52a4bb5aefcffaefb3aa87f4a9b191a5","signature":"641ebb426775fd4f2777542ad3e5d27181fb14d48d2817282d598262a540ffc4"},{"version":"a28ac3e717907284b3910b8e9b3f9844a4e0b0a861bea7b923e5adf90f620330","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"82e5a50e17833a10eb091923b7e429dc846d42f1c6161eb6beeb964288d98a15","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa83e100f0c74a06c9d24f40a096c9e9cc3c02704250d01541e22c0ae9264eda","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"00b21ef538da5a2bbe419e2144f3be50661768e1e039ef2b57bb89f96aff9b18","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"e843e840f484f7e59b2ef9488501a301e3300a8e3e56aa84a02ddf915c7ce07d","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"18f8cfbb14ba9405e67d30968ae67b8d19133867d13ebc49c8ed37ec64ce9bdb","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f68328826a275104d92bd576c796c570f66365f25ea8bbaaa208727bce132d5f","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"18334defc3d0a0e1966f5f3c23c7c83b62c77811e51045c5a7ff3883b446f81f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b17fcd63aa13734bf1d01419f4d6031b1c6a5fb2cbdb45e9839fb1762bdf0df","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"beb77fcd86c8cee62c32b2fb82753f5bc0e171d938e20af3cb0b8925db78d60b","impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"aa9224557befad144262c85b463c0a7ba8a3a0ad2a7c907349f8bb8bc3fe4abc","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"8d86c8d8c43e04cc3dde9953e571656812c8964a3651203af7b3a1df832a34df","affectsGlobalScope":true,"impliedFormat":1},{"version":"0121911fcc364eb821d058cf4c3b9339f197eccbe298098a4c6be0396b607d90","impliedFormat":1},{"version":"c6176c7b9f3769ba7f076c7a791588562c653cc0ba08fb2184f87bf78db2a87c","impliedFormat":1},{"version":"6def204d0b267101d3a42300a7363f53406c5d86b932e76e2365bf89689a85c4","impliedFormat":1},{"version":"4f766affd1281935fe5f7fd5d7af693a7c26d81adef7c1aefb84b9cd573a9cbb","impliedFormat":1},{"version":"165a0c1f95bc939c72f18a280fc707fba6f2f349539246b050cfc09eb1d9f446","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"c0bb1b65757c72bbf8ddf7eaa532223bacf58041ff16c883e76f45506596e925","impliedFormat":1},{"version":"c8b85f7aed29f8f52b813f800611406b0bfe5cf3224d20a4bdda7c7f73ce368e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7baae9bf5b50e572e7742c886c73c6f8fa50b34190bc5f0fd20dd7e706fda832","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b827f8800f42858f0a751a605c003b7ab571ff7af184436f36cef9bdfebae808","impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"6b306cd4282bbb54d4a6bb23cfb7a271160983dfc38c67b5a132504cfcc34896","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"450172a56b944c2d83f45cc11c9a388ea967cd301a21202aa0a23c34c7506a18","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"3af7d02e5d6ecbf363e61fb842ee55d3518a140fd226bdfb24a3bca6768c58df","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"7dfa742c23851808a77ec27062fbbd381c8c36bb3cfdff46cb8af6c6c233bfc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb078cfcd14dc0b1700a48272958f803f30f13f99111c5978c75c3a0aa07e40e","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"420fdd37c51263be9db3fcac35ffd836216c71e6000e6a9740bb950fb0540654","impliedFormat":1},{"version":"73b0bff83ee76e3a9320e93c7fc15596e858b33c687c39a57567e75c43f2a324","impliedFormat":1},{"version":"3c947600f6f5664cca690c07fcf8567ca58d029872b52c31c2f51d06fbdb581b","affectsGlobalScope":true,"impliedFormat":1},{"version":"493c64d062139b1849b0e9c4c3a6465e1227d2b42be9e26ec577ca728984c041","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[250,256],[405,426]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":false,"esModuleInterop":true,"jsx":4,"module":99,"outDir":"./lib-dist","rootDir":"./lib","skipLibCheck":true,"sourceMap":false,"strict":true,"target":7},"referencedMap":[[256,1],[414,2],[416,3],[413,4],[417,5],[418,6],[421,7],[423,8],[255,9],[253,10],[409,11],[424,10],[406,1],[408,12],[254,12],[425,10],[415,10],[252,12],[426,13],[251,14],[410,15],[411,16],[420,17],[422,18],[405,19],[419,20],[407,20],[250,21],[412,22],[249,23],[248,24],[155,25],[156,26],[157,27],[158,28],[159,29],[160,30],[161,31],[162,32],[164,33],[165,34],[166,35],[167,36],[168,37],[169,38],[170,39],[171,40],[172,41],[173,42],[174,43],[175,44],[176,45],[177,46],[178,47],[179,48],[180,49],[181,50],[182,41],[183,51],[184,52],[185,53],[187,54],[186,41],[189,55],[190,56],[188,41],[191,57],[192,58],[193,59],[194,60],[195,61],[196,62],[197,63],[163,41],[198,64],[199,65],[200,66],[201,67],[202,68],[203,69],[204,70],[205,71],[206,72],[207,73],[154,41],[208,74],[209,75],[210,76],[211,77],[212,78],[213,79],[214,80],[215,81],[216,82],[217,83],[218,84],[219,85],[220,86],[221,87],[222,88],[223,89],[224,41],[225,90],[226,91],[227,92],[228,93],[229,94],[230,95],[231,96],[232,97],[233,98],[234,99],[235,100],[236,101],[237,102],[238,103],[239,104],[240,105],[241,106],[242,107],[243,108],[244,109],[245,110],[246,111],[247,112],[404,113],[399,114],[270,115],[271,116],[272,117],[273,118],[274,119],[275,120],[276,121],[277,122],[278,123],[279,124],[280,125],[281,126],[282,127],[283,128],[260,41],[257,41],[261,129],[265,130],[263,131],[262,129],[267,132],[284,133],[285,134],[286,135],[287,136],[288,137],[289,138],[290,139],[291,140],[292,141],[293,142],[294,143],[296,144],[295,145],[297,146],[298,147],[299,148],[300,149],[301,150],[302,151],[258,152],[303,153],[304,154],[305,155],[259,156],[306,157],[268,158],[307,159],[308,160],[309,161],[310,162],[311,163],[312,164],[313,165],[314,166],[315,167],[316,168],[317,169],[318,170],[319,171],[320,172],[321,173],[322,174],[323,175],[324,176],[325,177],[326,178],[327,179],[328,180],[329,181],[330,182],[331,183],[332,184],[333,185],[334,186],[335,187],[264,188],[336,189],[337,190],[338,191],[269,41],[339,192],[340,193],[341,194],[342,195],[343,196],[344,197],[345,198],[346,199],[347,200],[348,201],[266,41],[349,202],[350,203],[351,204],[352,205],[353,206],[354,207],[355,208],[356,209],[357,210],[358,211],[359,212],[360,213],[361,214],[362,215],[363,216],[364,217],[365,218],[366,219],[367,220],[368,221],[369,222],[370,41],[371,223],[372,224],[373,225],[374,226],[375,227],[376,228],[377,229],[378,230],[380,231],[379,232],[381,233],[382,234],[383,235],[384,236],[385,237],[386,238],[387,239],[388,240],[389,241],[390,242],[391,243],[392,244],[393,245],[394,246],[395,247],[396,248],[397,249],[398,250],[400,251],[401,252],[402,252],[403,252],[77,253],[78,254],[76,255],[79,256],[90,257],[91,257],[92,257],[93,257],[98,258],[94,259],[95,259],[96,259],[97,259],[99,260],[89,261],[84,258],[88,262],[85,263],[86,258],[87,258],[82,264],[81,263],[83,265],[75,255],[74,266],[67,267],[68,255],[66,268],[72,269],[56,270],[60,271],[61,255],[62,255],[54,255],[55,255],[71,272],[63,255],[57,255],[58,255],[64,255],[65,255],[69,255],[59,255],[73,273],[153,274],[152,275],[100,276],[101,277],[102,278],[103,279],[104,280],[105,281],[106,282],[107,283],[108,284],[109,285],[110,286],[111,287],[112,288],[113,289],[114,290],[115,291],[116,292],[117,293],[118,294],[119,295],[120,296],[121,297],[122,298],[123,299],[124,300],[125,301],[126,302],[127,303],[128,304],[129,305],[130,306],[131,307],[132,41],[133,41],[134,308],[135,309],[136,310],[137,311],[138,312],[139,313],[140,314],[141,315],[142,41],[143,41],[144,41],[145,316],[146,317],[147,318],[148,319],[149,320],[150,321],[151,322],[429,323],[427,255],[80,255],[70,255],[432,324],[428,323],[430,325],[431,323],[433,255],[434,255],[488,326],[489,326],[490,327],[437,328],[491,329],[492,330],[493,331],[435,255],[494,332],[495,333],[496,334],[497,335],[498,336],[499,337],[500,337],[501,338],[502,339],[503,340],[504,341],[438,255],[436,255],[505,342],[506,343],[507,344],[541,345],[508,346],[509,255],[510,347],[511,348],[512,349],[513,350],[514,351],[515,352],[516,353],[517,354],[518,355],[519,355],[520,356],[521,255],[522,255],[523,357],[525,358],[524,359],[526,360],[527,361],[528,362],[529,363],[530,364],[531,365],[532,366],[533,367],[534,368],[535,369],[536,370],[537,371],[538,372],[439,255],[440,373],[441,255],[442,255],[484,374],[485,375],[486,255],[487,360],[539,376],[540,377],[542,378],[50,255],[52,379],[53,378],[51,255],[48,255],[49,255],[8,255],[9,255],[11,255],[10,255],[2,255],[12,255],[13,255],[14,255],[15,255],[16,255],[17,255],[18,255],[19,255],[3,255],[20,255],[21,255],[4,255],[22,255],[26,255],[23,255],[24,255],[25,255],[27,255],[28,255],[29,255],[5,255],[30,255],[31,255],[32,255],[33,255],[6,255],[37,255],[34,255],[35,255],[36,255],[38,255],[7,255],[39,255],[44,255],[45,255],[40,255],[41,255],[42,255],[43,255],[1,255],[46,255],[47,255],[460,380],[472,381],[458,382],[473,383],[482,384],[449,385],[450,386],[448,387],[481,388],[476,389],[480,390],[452,391],[469,392],[451,393],[479,394],[446,395],[447,389],[453,396],[454,255],[459,397],[457,396],[444,398],[483,399],[474,400],[463,401],[462,396],[464,402],[467,403],[461,404],[465,405],[477,388],[455,406],[456,407],[468,408],[445,383],[471,409],[470,396],[466,410],[475,255],[443,255],[478,411]],"latestChangedDtsFile":"./lib-dist/index.d.ts","version":"5.9.3"}
+26
tsconfig.node.json
+26
tsconfig.node.json
···
1
+
{
2
+
"compilerOptions": {
3
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
4
+
"target": "ES2023",
5
+
"lib": ["ES2023"],
6
+
"module": "ESNext",
7
+
"types": ["node"],
8
+
"skipLibCheck": true,
9
+
10
+
/* Bundler mode */
11
+
"moduleResolution": "bundler",
12
+
"allowImportingTsExtensions": true,
13
+
"verbatimModuleSyntax": true,
14
+
"moduleDetection": "force",
15
+
"noEmit": true,
16
+
17
+
/* Linting */
18
+
"strict": true,
19
+
"noUnusedLocals": true,
20
+
"noUnusedParameters": true,
21
+
"erasableSyntaxOnly": true,
22
+
"noFallthroughCasesInSwitch": true,
23
+
"noUncheckedSideEffectImports": true
24
+
},
25
+
"include": ["vite.config.ts"]
26
+
}