@johnmorrisdotca/hoshi-stars 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [0.2.0] - 2026-11-08
6
+
7
+ - New entry point `@johnmorrisdotca/hoshi-stars/milky-way`: a brightness map of the Milky Way (about 11 kB of numbers) with the bright core toward Sagittarius and the Great Rift, the Coalsack and the Cygnus Rift as dimmer places. `milkyWayBrightness(point)` gives 0 to 1 toward a point of the sky, `milkyWayBands(levels, { step })` cuts it into ribbons of sky points to fill as soft bands, and `toGalactic` and `fromGalactic` change between right ascension and declination and galactic longitude and latitude. Made by `scripts/make-milky-way-data.py` from SAO star counts (NASA HEASARC; no licence stated, used with credit and removed on request), the IRAS 100 micron and COBE DIRBE dust maps (NASA, public domain) and a bulge of our own figures; see `NOTICE.md`.
8
+ - The demo: a **Milky Way** (天の川) button draws the band under the stars and the lines, in every projection, on by default; `layers=milky` is in the address and in the embed page's.
9
+
5
10
  ## [0.1.0] - 2026-11-08
6
11
 
7
12
  - New `Star.nameJa`: the katakana name (`シリウス`, `ベテルギウス`) of each of the 136 named stars, which `starByName` also finds. The spellings are the IAU names written in Japanese letters by hand, with the usual Japanese forms; see `NOTICE.md`.
package/NOTICE.md CHANGED
@@ -29,6 +29,15 @@ Hoshi Stars is original work by John Morris, under the MIT licence in `LICENSE`.
29
29
 
30
30
  - **Projections (`@johnmorrisdotca/hoshi-stars/projection`)**: stereographic, orthographic, gnomonic, azimuthal equidistant, equirectangular, Mollweide and Hammer, written from the formulas in J. P. Snyder, "Map Projections: A Working Manual", U.S. Geological Survey Professional Paper 1395 (1987), a U.S. Government work in the public domain. The formulas are mathematics; no library's code is copied.
31
31
 
32
+ ## The Milky Way
33
+
34
+ - **Milky Way brightness (`@johnmorrisdotca/hoshi-stars/milky-way`)**: a grid of 360 by 120 numbers of 0 to 31 (1 degree of galactic longitude by 0.5 degree of latitude, within 30 degrees of the plane) in `src/data/milky-way.ts`, written by `scripts/make-milky-way-data.py` from three sources. No image of the sky is read, copied or traced.
35
+ - **Star counts: the SAO Star Catalog** (Smithsonian Astrophysical Observatory Star Catalog, 258,944 stars to about visual magnitude 9.3; catalogue I/131A at the CDS), as NASA's HEASARC serves it (table `sao`, https://heasarc.gsfc.nasa.gov/W3Browse/star-catalog/sao.html, file https://heasarc.gsfc.nasa.gov/FTP/heasarc/dbase/tdat_files/heasarc_sao.tdat.gz, read 2026-11-08). **No licence is stated for this catalogue: it is used with credit to the Smithsonian Astrophysical Observatory and NASA's HEASARC, and removed on request.** Only the stars of visual magnitude 7.0 to 9.0 are counted, on an equal-area grid, and only the counts (a handful of smoothed numbers per square degree) are kept: no star of the catalogue is in the package. The counts show where the Milky Way's stars are thick and, where the catalogue falls short of its surroundings, where near dust (the Coalsack) hides the stars behind it.
36
+ - **Dust: the IRAS Sky Survey Atlas, 100 micron** (NASA/IPAC Infrared Science Archive; IRAS was a NASA, Dutch and British mission), as NASA's SkyView serves it (https://skyview.gsfc.nasa.gov, survey `IRAS 100`, read 2026-11-08), which labels the survey "Copyright: Public Domain" and its provenance "NASA IPAC/Jet Propulsion Laboratory". Where the atlas has unobserved strips, **COBE DIRBE's zodi-subtracted mission-average 100 micron map** (the COBE Team, NASA Goddard; SkyView survey `COBE DIRBE/ZSMA`, labelled "Copyright: Public Domain") fills them, on a scale matched in the plane. The map's glow compared with the glow around it says where the dust lanes are (the Great Rift, the Cygnus Rift); it is not an image of them. "IRAS" in SkyView is the ISSA atlas, not the Schlegel, Finkbeiner and Davis map nor IRIS, which others derived from it and which are not used.
37
+ - **The bulge and the disk: our own figures.** The bright core toward Sagittarius is a Gaussian some 8 degrees along the plane and 3.5 across, and the glow along the plane follows an exponential disk (scale length 2.6 kpc, the Sun 8.2 kpc from the centre) added up along each line of sight: round, published values of the Galaxy's size, not a copy of any map or model. The counts change the disk's glow only by how much each direction is richer or poorer than its neighbourhood.
38
+ - **Galactic frame**: the IAU's (north galactic pole at right ascension 192.85948 and declination 27.12825 degrees, and the north celestial pole at galactic longitude 122.93192 degrees, J2000), written as formulas.
39
+ - **Not used**: any photograph or drawing of the Milky Way (ESO's panorama, NASA's and ESA's pictures and Gaia's colour map were looked at, nowhere in the data or code, only to judge the result by eye); Planck's maps; the Schlegel, Finkbeiner and Davis dust map; Stellarium's textures (GPL) and anyone's artwork.
40
+
32
41
  ## Your sky
33
42
 
34
43
  - **Horizon view (`@johnmorrisdotca/hoshi-stars/sky`)**: written from the formulas in J. Meeus, "Astronomical Algorithms", 2nd ed. (Willmann-Bell, 1998): Greenwich mean sidereal time (the IAU 1982 expression, chapter 12), equatorial to horizontal coordinates (chapter 13), atmospheric refraction (Saemundsson's formula, chapter 16) and precession from J2000 (the IAU 1976 constants, chapter 21). The formulas are mathematics and the worked examples (12.a, 12.b, 13.b, 21.b) are used only as test values; no book text or library code is copied.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Hoshi Stars 星
2
2
 
3
+ <p>Part of <strong>SpaceProgramX (SPX)</strong>, the space packages: <a href="https://github.com/johnmorrisdotca/wakusei-planets">Wakusei Planets</a> · <a href="https://github.com/johnmorrisdotca/hoshi-stars">Hoshi Stars</a> · <a href="https://github.com/johnmorrisdotca/chikyu-earth">Chikyu Earth</a> · <a href="https://github.com/johnmorrisdotca/uchusen-rockets">Uchusen Rockets</a></p>
4
+
3
5
  **[Try the demo](https://johnmorrisdotca.github.io/hoshi-stars/)**: a sky chart you turn, zoom and search, in English and Japanese.
4
6
 
5
7
  The stars you can see without a telescope: 5,080 of them, with names, positions, proper motion, distance and colour. Typed, no dependencies, about 100 kB gzipped. Hoshi (星) is the Japanese word for a star.
@@ -179,6 +181,19 @@ An object has `id`, `messier`, `ngc`, `ic` (each a string such as `"NGC 224"`),
179
181
  - **Magnitudes and sizes of the Messier objects** are the published visual magnitudes and major axes of NASA HEASARC's Messier table, because Wikidata's V-band magnitudes for 14 of them are more than a magnitude off (the central star's, for the four planetary nebulae). The NGC and IC magnitudes are Wikidata's, except that a planetary nebula has none (Wikidata's is its central star's); about four in ten have none, and almost none has a size.
180
182
  - **Positions** are Wikidata's. Every Messier object was compared with NED and a sample of the others too; the objects that were more than an arc-minute apart are listed in [NOTICE.md](NOTICE.md), and where Wikidata was wrong the table has NED's position.
181
183
 
184
+ ## The Milky Way
185
+
186
+ `@johnmorrisdotca/hoshi-stars/milky-way` is a brightness map of the Milky Way in about 11 kB: the band along the galactic equator, the bright core toward Sagittarius, and the Great Rift, the Coalsack and the Cygnus Rift as dimmer places. It is made by `scripts/make-milky-way-data.py` from SAO star counts, NASA's IRAS 100 micron dust map and a bulge of our own figures (see [NOTICE.md](NOTICE.md)); no picture of the sky is traced.
187
+
188
+ ```ts
189
+ import { milkyWayBands, milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
190
+
191
+ console.log(milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 }) > 0.7); // true: the core, in Sagittarius
192
+ console.log(milkyWayBands([0.2, 0.5]).map((band) => band.strips.length)); // ribbons of sky points to fill as soft bands
193
+ ```
194
+
195
+ `milkyWayBrightness(point)` is 0 (dark sky) to 1 (the core); `milkyWayBands(levels, { step })` gives ribbons of sky points for `project`; `toGalactic` and `fromGalactic` change the frame. The demo draws it as soft bands under the stars, in every projection, and its **Milky Way** button turns it off.
196
+
182
197
  ## Put a chart in a page
183
198
 
184
199
  The package gives numbers; a chart is a few lines of SVG. In React, for example (Vue, Svelte, Angular, Vite, webpack, a plain `<script type="module">` from a CDN, Node and TypeScript are in the [guides](https://johnmorrisdotca.github.io/hoshi-stars/docs/)):
@@ -241,11 +256,11 @@ Docs: https://johnmorrisdotca.github.io/hoshi-stars/docs/ , with a Japanese page
241
256
 
242
257
  ## Where the data comes from
243
258
 
244
- The Yale Bright Star Catalogue (Hoffleit and Warren 1991), credited in [NOTICE.md](NOTICE.md). The larger catalogues (Hipparcos, Tycho, Gaia) are ESA's, licensed for non-commercial use only, so an MIT package cannot pass them on. Stars fainter than magnitude 6.0 are not in this package. The deep-sky objects are Wikidata's (CC0), with NASA HEASARC's Messier table and NED as checks.
259
+ The Yale Bright Star Catalogue (Hoffleit and Warren 1991), credited in [NOTICE.md](NOTICE.md). The larger catalogues (Hipparcos, Tycho, Gaia) are ESA's, licensed for non-commercial use only, so an MIT package cannot pass them on. Stars fainter than magnitude 6.0 are not in this package. The deep-sky objects are Wikidata's (CC0), with NASA HEASARC's Messier table and NED as checks. The Milky Way's brightness comes from SAO star counts (NASA HEASARC; no licence stated, used with credit and removed on request) and NASA's IRAS and COBE dust maps.
245
260
 
246
261
  ## Coming
247
262
 
248
- A Milky Way outline and a star-chart function, each its own import. This package is the sky behind [wakusei-planets](https://github.com/johnmorrisdotca/wakusei-planets); it does not depend on it.
263
+ A star-chart function as its own import. This package is the sky behind [wakusei-planets](https://github.com/johnmorrisdotca/wakusei-planets); it does not depend on it.
249
264
 
250
265
  ## The family
251
266
 
@@ -0,0 +1,5 @@
1
+ export declare const MILKY_WAY_COLUMNS = 360;
2
+ export declare const MILKY_WAY_ROWS = 120;
3
+ export declare const MILKY_WAY_LATITUDE = 30;
4
+ export declare const MILKY_WAY_LEVELS = 31;
5
+ export declare const MILKY_WAY_PACKED = "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECQcHCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMLBAgCCgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEIBAwCDwcHBwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcJAw0CDwsHBwIKAQkHBwcHAwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECwINAQ8NBwQIAgsBCQMJBgkHBwQJAAkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcMAg0ADw8HAw8BCQMKAwsECQcJAQ4CCAMIBggHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcEDwEPDw8HAg8IAAkCCwINAQwGDwgACQEKAAoFCAcHBwcCCAcHBwcHBwcHBwcDCAcHBwcIBwcHBwcHBwcHBwcBDw8PDwsHAQ8MAQ8MAQwCCQIPDwsECAcHBwcCCQcHBwcHBwcHBwkHAQoHBAkHBQkHBwcHBwcHBwcHBwAPDw8PDgUPCgALAA8PDAEJAg8PDQEJBwUJAgkHBAoCCAcHBwcHBwUJBwILBwAPAgkACAAJBwUJBwcHBwcHBwcHBwcADw8PDw4DDwsBDw8PDQIPDw4ACQMJBQwBCQcDCwEKBwcHBwcHBAoHAQsCCQAIAQ8BDAAJAQkFCAMIBwcHBwcHBwcHBwcPDw8PDwgBDwwADw8PDwAPDw8ACQILBAwCCQAIAA0BCwEKBwcHBwcHAA8PDQIIAAkADwEPAAoECgIJAQsHBwcHBwcHBwcHAA8PDw8PDw8PDw8PCAAPDw8KAQ4BDw8PCQAOBwIJBwcHBwAPDwgHAQkCDw8KBAsCCgEKBwcHBwcHBwcHBw8PDBIPDw8PDw8PDw8PDw8PDw8PDwsHAQkHAQgHBwQPDwgHAQoBDw8LAg0BDAAKBwcHBwcHBwcHBg8PDRMPDw8PDw8PDw8PDw8PDw8PDwsBCAQKBwEIBwcDDw8KBwAPDw8IAg0ADwoHBwcHBwcHBwcEDw8NFQ8PDw8PDw8PDw8PDw8PDw8PDgMLBwcHBA8PCwYPDw8PDw8BCgcHBwcHBwcHBw8PEQsVDw8PDw8PDw8PDw8PDw8PDw8PAgwBCQcHBg8PDQEPDw8PDw8PCQcHBwcHBwcHBQ8PEwkWDxAPDw8PDw8PDw8PDw8PDw8PDwAOAAoHBwQPDw8PDw8PDw8PCwcHBwcHBwcHBA8NFQkXCREPDw8PDw8PDw0QDw8PDw8PDw8PDwkHBwMPDw8PDw8PDw8PCwcHBwcHBwcHAw8OFxcJEQkQCRAPDw8PDw8PDw8PDw8PDw8PDw8KBwcDDw8PDw8PDw8PDwsHBwcHBwcHBwEPCBAIEAsXEhgXFQ8PDwsQDwoQDw8PCBAPDw8PDw8PDw8PDAcACgMPDw8PDw8PDw8PCwcHBwcHBwcHDwwRCBcUGRcVDxAPDwkRCBILEw4RDw4QDhAPDw8PDw8PDw8MBwsDDw4QDAAPDw8PDw8PDQcHBwcHBwcEDw0XFxEZFxUJEAoTDhIMFxAKFAsUDRELEgwUDw8PDw8PDw8PCwUNAg8PDw8PDw8PDw8MAggHBwcHBggHCAIIAA8PFxceFxcWChUKFxcRChUNEgoSDRQJEA8PDw8PDw8PDwUNAQ8PDw8PDw8PDw8PCgcHBwcCDAcCDw8J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EA8PDw8PDw8PDxALEAkRCRAPDxEKFA8KEA8PDwcHBwQPDw8PChcTHx0TGRMKFAsXFxQKEAoQCxcVCRcRDREMEQ8PDw8PDw8PDw8PDw8PDw8NEw8PDw8KBwcHBwEPDw8OFxMfHBQYEg0TCxcXEQ8OFxUJFw8RDBAPDw8PDw8PDw8PDw8PDw8PDRAIEQ8PDw8HBwcHBg8JAwkADw4XExgRHRcRDw4XFxAPDwgVCRQJEAgSDwoRDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwcHBwcGCQEMBw8PFxUcFxIPDxcVDhAPChAJEAwSChAIEQ8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDQcHBwcHCAcHAw8KFQkWGBcUDw8OFQ8IEA8PDBEKEAgQDw8PDw8PDw8PDw8PCgEPDw8PDw8PDw8PDQAJBwcHBwcHBwUJAw0TChcXFA8PDhIPDw8PCRAPDw8PDw8PDw8PDw8LAAsDDw8PDw8PDw8PDwsHBwcHBwcHBwcOEgoSChcQDw8PDw8PDw8JEA8PDw8PDw8PDw8NAA8JBwQPDw8PDw8PCgEPDw0HBwcHBwcHBwcPEAsRCxYPDw8PDw8PDw8PDw8PDw8PDw8PCQIMBwcBDw8PDw8PDwgCDw8MBwcHBwcHBwcHAA8PCxEPDw8PDw8PDw8PDw8PDw8PDw8IAQkCDAMLBwcGDw8PDw8PDQIPDwsHBwcHBwcHBwcADw8LEA8PDw8PDw8PDw8PDw8NAAgBDw8BDwwHDAQKBwcGDw8PDw8PDQIPDwoHBwcHBwcHBwcBDw8PDw8PDw8PDw8PDw8PDgIIBA8PAQ8KBwELBggHBwcPDw8PCQEJAA8NAg8PCgcHBwcHBwcHBwEPDQAPDw8PDw8PDw8PDw8PCgIIBwEPCQEMAQ8JBwIKBwcHBwIIAAwADw8NAg8PCAIIAg8KAQkHBwcHBwcHBwcBDw0ADw8PDw8PDw8PDw8PDwoCCAcBDAYMAQ4ACQcHBwcHBwQJAg8PCAAKAg8DDAYPCQIIBwcHBwcHBwcHAg8NAA8PDwEIAQ8PDwwGDw8PDw8IAgkDCAQMBwsBDQcHBwcHBwcGDwwACAEKBA0DDQUPCQcHBwcHBwcHBwcPDAAPDw8FDw8PCwcPDw8PDgQIAwgGCAcCDgcHBwcHBwcHAgkBDgcFCAAMAggACgYKBAgHBwcHBwcHBwcHAQ8LAAoADw0ACgcPDw8LBw8PDwwADwUIAwgHBwIMBwcHBwcHBwYJAwkDCAcHBAgACgEIAQkHCQcHBwcHBwcHBwcHDw4BDw0ACAcBDw8PCwcADwwADgAMBAkBCAcHBwYLBwcHBwcHBwcHAQgACAcHBgkHBwkHBwcHBwcHBwcHBwIPCgIPDAEIBwIPAQ8PCAcBDQELAQ0BCgUJAQgHBwcHCgcHBwcHBwcHBwcHBwQIBwcJBwcHBwcHBwcHBwcCCAEPAw8LAQgHAg4CDAAMAggHBAwBDAcHBQgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAA8EDwQIBwIJAQoDCAMLBwcCCwELBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCDQUOBAgHAgkHBQkHBwUKAgoHBwYIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwIMBgwGCQcHBwEJBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAgsGCwcACAcHBwcHBwIIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCCwUMBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEKBQ4HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHCAYOBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcACAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==";
@@ -0,0 +1,7 @@
1
+ // Written by scripts/make-milky-way-data.py: do not edit by hand.
2
+ // The Milky Way's brightness in galactic coordinates. SAO star counts (NASA HEASARC), the IRAS 100 micron dust map and COBE DIRBE (NASA), and a bulge of our own; see NOTICE.md.
3
+ export const MILKY_WAY_COLUMNS = 360;
4
+ export const MILKY_WAY_ROWS = 120;
5
+ export const MILKY_WAY_LATITUDE = 30.0;
6
+ export const MILKY_WAY_LEVELS = 31;
7
+ export const MILKY_WAY_PACKED = "BwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECQcHCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwMLBAgCCgcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEIBAwCDwcHBwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcJAw0CDwsHBwIKAQkHBwcHAwgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcECwINAQ8NBwQIAgsBCQMJBgkHBwQJAAkHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcMAg0ADw8HAw8BCQMKAwsECQcJAQ4CCAMIBggHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcEDwEPDw8HAg8IAAkCCwINAQwGDwgACQEKAAoFCAcHBwcCCAcHBwcHBwcHBwcDCAcHBwcIBwcHBwcHBwcHBwcBDw8PDwsHAQ8MAQ8MAQwCCQIPDwsECAcHBwcCCQcHBwcHBwcHBwkHAQoHBAkHBQkHBwcHBwcHBwcHBwAPDw8PDgUPCgALAA8PDAEJAg8PDQEJBwUJAgkHBAoCCAcHBwcHBwUJBwILBwAPAgkACAAJBwUJBwcHBwcHBwcHBwcADw8PDw4DDwsBDw8PDQIPDw4ACQMJBQwBCQcDCwEKBwcHBwcHBAoHAQsCCQAIAQ8BDAAJAQkFCAMIBwcHBwcHBwcHBwcPDw8PDwgBDwwADw8PDwAPDw8ACQILBAwCCQAIAA0BCwEKBwcHBwcHAA8PDQIIAAkADwEPAAoECgIJAQsHBwcHBwcHBwcHAA8PDw8PDw8PDw8PCAAPDw8KAQ4BDw8PCQAOBwIJBwcHBwAPDwgHAQkCDw8KBAsCCgEKBwcHBwcHBwcHBw8PDBIPDw8PDw8PDw8PDw8PDw8PDwsHAQkHAQgHBwQPDwgHAQoBDw8LAg0BDAAKBwcHBwcHBwcHBg8PDRMPDw8PDw8PDw8PDw8PDw8PDwsBCAQKBwEIBwcDDw8KBwAPDw8IAg0ADwoHBwcHBwcHBwcEDw8NFQ8PDw8PDw8PDw8PDw8PDw8PDgMLBwcHBA8PCwYPDw8PDw8BCgcHBwcHBwcHBw8PEQsVDw8PDw8PDw8PDw8PDw8PDw8PAgwBCQcHBg8PDQEPDw8PDw8PCQcHBwcHBwcHBQ8PEwkWDxAPDw8PDw8PDw8PDw8PDw8PDwAOAAoHBwQPDw8PDw8PDw8PCwcHBwcHBwcHBA8NFQkXCREPDw8PDw8PDw0QDw8PDw8PDw8PDwkHBwMPDw8PDw8PDw8PCwcHBwcHBwcHAw8OFxcJEQkQCRAPDw8PDw8PDw8PDw8PDw8PDw8KBwcDDw8PDw8PDw8PDwsHBwcHBwcHBwEPCBAIEAsXEhgXFQ8PDwsQDwoQDw8PCBAPDw8PDw8PDw8PDAcACgMPDw8PDw8PDw8PCwcHBwcHBwcHDwwRCBcUGRcVDxAPDwkRCBILEw4RDw4QDhAPDw8PDw8PDw8MBwsDDw4QDAAPDw8PDw8PDQcHBwcHBwcEDw0XFxEZFxUJEAoTDhIMFxAKFAsUDRELEgwUDw8PDw8PDw8PCwUNAg8PDw8PDw8PDw8MAggHBwcHBggHCAIIAA8PFxceFxcWChUKFxcRChUNEgoSDRQJEA8PDw8PDw8PDwUNAQ8PDw8PDw8PDw8PCgcHBwcCDAcCDw8JFxQfGhcXFggXCRcXEggWDBMKEg0UCBEOEAkQDw8PDw8PDw8IAQ4ADwwQDw8PCBEPDw8PDw8JBwcHBwAPCQMIAg8PCRYYFB8aFxcXFxcXFxULFAkSCREJFxILFAwRDw8PDw8PDw8PDhEPDw8SDwkRDw8MEA8PCAAIBwcHBA8LAQ8PDhYYFB4hGxcXFxcXFxUaEwgXFAgSCBcSChYKEw4RCxAPDw8PDw8PDBAJEggRDwwRDBIMEAkTCBIOEA8TDw8JBwcHDw8PDw4XGhMbJR0RGBcXFxMaFBgXEhsXFxAIFxcXFw0SDxAIEAkRDw8LEg8PDwsVCBEPCxMKFAsXFwgRDxQPDwsHBwMPDw8PDRcRGhEYEBkgGCYcEBkVGBcXEx8aFxIbFxgTGRAIFxcXFxEKEwoXFQ8PFQ8PDwkXEQ0TCRQJFAoXFxMPFA8PDAcBDgEPDw8PChcYFBsgGSUoIh8YExoQGRcWHxwUGBQaExkQGxEZFxcXFxQJEwgXFxAPEQwVDw8PCRcXFAgUCRQJFxcUChEKFQ8PDAUPCQAPDw8PChQdEh0hKCApISkhHxgTHxgVGBQZIB8aEhoTGhIfGBAaERgXExkXFxIIFxcWDxMIEAgVDwwRDhAIFxcXFAgWCBcXFxEIFxAPDw0CDw8PDw8MFR4RHykyKyEZIR0RHxoTGhMYIRkgGyEaEBwRGxIfGiAYEBkSGRMfGBcXFxcVCBMKFwgUDwwRDRcXFxcIFxcSGxcXFQ8PDw8PDw8PDBQdIRsgKCMoMDgwKDArJBkiGBEfGhIbEhkhGSAbIB8fEh0hGiAcERkSHxkVGRcWGRcUCBMKFxYMEQwQDRcUGhAYFxYIFxUbEB0XERgXEQoQCRAPDw8PDw4RCBQJFx0gKCAZIjAoITA6KTArJBkiGBEfGhEfGSQaIR8fGBAdIxgiGxEdIB8UHhQYFBkQGhcQCBQJFxcQChILEAwXFB4XFxAaFx8cFBkQHhcTDw8PDw8MFxcRGiUpGCIxKjhBODQtIRggKCAfGCEfGycZJB8fGicgKCAfGyAfGBIfFBkTHxYIFAgXFxcQChALFxIfGRcZFRwTHx4VHxoXEwkTDw8JEgsTCxIIFxcRGicjKDkwKDBLQDA4MysjKRsnHxkjKSchHiQfISgkKRkgHiIfGBAYEB8aERoSGCEYIBoXFxIYERoXFg0XHyUYExgRGRIfGBEfHxQdIB0XFxEJEA8NFQgUCRcYFxQbJSgiMCgwQEk4STBRWEA6MiolGycgHyEtICkmGicnISgkMCgZJBojGSAfHCAdERoRGCEYIhkRGBcVHxcRGRIMEBsSGiciGhAeEB4gHxkhHCEYFB8dFxcQCBUPCBcVCBYZERwVGyApISogKDgwOEBIUVhIMEhYYEI6MCkwKCUaIiggKCMeICwwLCEqIRgiKicjKSArMScYISgiGCEeIRkiGiEdEBghGCMbFBoRGREfGBAZFBsRCxEcERknIx8fGiEfGCEaJBgTHCAfGBMYEBkXFxEMExkXEAgRGBMfGRMcISggLTxIWGBAOFBgSFBYSEBRMCkxKSMaIS4gHiArMi8qIiwnIC8oMSghKSAoIiklGSAaIRoiGiIZIRonGhMfHiEZEBsSHBEIEhogHCciKCEfHiciGiEaJBoRGyEZIB4SHxcVCRAIERwVGBQZER8fGyEqMSkwPEBoYEhAWUh5aFBgWDgyOTAoIDAoIBgiLiAdISozLjEvLiEoICowLTAoISgwKiEpJyQaJBgnGiQpIBoRHx8YIR8bIRgVGSMaISghKyEpIB8dJyApIh0iKSAZERskHxgQHCAbEh0XEBwUGhIcIhskGCAcIio0OENIUVhIWFBYiXBocGBIQUhBSCk4MCAYIS8hGCUoODJAODQpNCgwKyAvKjEsIDAoISgwKiEuJxogKCIYISggGCIaICswKSAfHxsjHxkiGRQZIxkhLywgHxshKCUqIh0hKiEdJRwhHiIbEB8ZFRwUGhIcKSAYIigkKBkgGCEYICozOEFLUFlIUEhYiJCAiHBgaEhQSlAwOEA4KCIoMSgwKicpOTA4SEAxODEpMjkyLDQpMCk4QDEqIDAoISgyKCAoMSwhKSAoIRkgKSUoIRglKzApIB8fGCMpIxknGhAcIxkhLjApMCkhHxgiKiMpMCgYIhwhLCAcIighHCAoIB0jHiEcER8YFB0hGCEpIygwKCApMCEoMCQoODFBOEFIYVFgaVJggHCImHhxaFhQQVA5SEA4ISlAODBAOCkjLDE5QFBIOzEoMjswLDE4Mis4QTgoMCkxKjA5MCk4MCkwKiAsIRggKicYIyoxKDApIB8QHiMsJyQeISglKCEqNSgiHiEtICoxKCAYIhsgKzAoIBsgKSAoIhogKSAdICkhGCAaICkgKCEbIB0VGSAZICgkKSEoMDgqOSgwOTA4KkBJQEhQQUhgaVBYaHiQWFBYaHBokKiYkIBwWFBAMFFASUAoICgwTDgoIzA4QDI6QjtAOCkxQDhAODEqMjspMUBJOCgwKTIoMUE4MTg0LyEYICsjKSMrMzgpIB8QHiIsMC4mGSUpJyApNCoiHSEtICowKCEYICkjKzEoJCogKCYqIBkgGSApIxkoMigwIhkgMCgjGBQZIygwJCsyODBASUBJQDlAOEhRSVBYQVBgcFBYYHCQmGhhcHhwoLGYkIBQSThhUUA4KTA4TTgwKjhASDlAOUE6QVBAODNDODU4QTkwODJKMigyOkI4MDgwKDMrMCkjLCEuNzEpIBsgHxkiKzQoMSgmGSEtJiozODAoMSYaIC8pMCgiKiMoNCghKzEpJSowKBkgGSokKDA8KiEwODAgKSAYEhsgKDI4KCEpMDgwPFZIQEhRWGBASFBAUEBIWFBYSFhoeJigmIhwgIiowLiwmZBgUGBYcGhYSDhIOEA4QEhUSEEwKEBJQEhYQklAOFJIKDkxQEhBODE6MDhCMTgwSDBAUEhAOEAwOkE5SUA4MSkwODAqMygiLCEpNDo0OTAoIRohGyIZIiswODYoICgjGCEvISkgKjM5MygnISgwKyAoMyghMiEqNCo1KSApIikxIBwgKSIoICg5QzsoOEgwKTAoGBEaITA4QTBAMCs4QDA5QUhbYVhQSFBYYFhQOUA4QEhYcElQWGiAoai4gKDA0biwmKF4YHB4gHBgSWBYUEFIW1BJQDlJUFhAWUlpUDhQWUAwQTlIQjgxO0E4SDgwODBIMDhRSFBAMEE4SUA4SUA5MCkwOTAoMTgxKCEsMCggKTAoMkE4MzowKSAbIBonISkxOTUoICojLywgKDAoMD0wLSAoJCwhMDsoICgwODArMTg1OTQsICoxIBwgLSAoMDhBSEBSSDhASDAoMEA4IBkjKEs4QDApMThAODBAWmBsYFhAWGlIQDtAUFiAWXBocKCwmLDIsOLYsKiQmKCQcYF4YEhYaGBQQUhZYFhRSkBRWGBRaVhxYEhQWUhASjhAOykwQThBPDA6SThQMThJUUg4SUA1OTYoISsxKTApMDpBMSkwOjEoIBggGSAZIRkjGCIoPDQqMSIvKzAqODA8QjAgKDIrIygxKSAwOUEwKTA4MSgwOzE/KDIqMC0gHCgwLCEoMklZUEg6KDBAOEAoICgwQSg4UkpAMDhJQDkwSGJocmpgSFhxWEhESGCIgHiJmLC4oKjQ4PHowJiQgIiYiHBogWhRaHBoUEA4QFBYYFhQSlFIQFhiaHhweHBgWFBZSUBJOEE4QDApMDhBSEA6QjhAMEg4QFA6SVBYSEFIQDE/OzEgKDApMDgwKTEoMDpAODIoMDgwQDgxKCEYIRojKCEYIjBGOjAoMDgwKzAoICsxKTApMDgwOkQwGCg5MCkwKSAYICgyKTA5QTgoMTgyQTowO0A5QDgpODUoICogGiAoNiAZKDA4UEhRSEA4KjBKODFASThIWUlQSlJAOEg4UGlxeXBrWWhwaFloYWhQYIl5iJiwwKCQsPD48NCoiHhwgXhoYHlYSFBYYFBAODFASFBJQUhYUDlIYVBYYlhQSEBJQDgwOEA4QEg4QDgpMDhASFBIOUBKOEA5MFBYQDgwQFFYSEI4MDhBOzA7MigwOkE4MjgwPTA5MTgwQDgwOCgkGSAoISkkKDBATUIwKTkqMSggKTE5KTAoMjhDOEFIQCFBODMoIBggKDA5MjhBSDgpMDgwOUQ7QEhAOEEpOTQpIDAoIBkgKDI8MCEoMDhIQjswOlBIQDJAS1BBSEBLQDlAOEhQaHNoYWhhUGBoYFhoenBgaXBgWHCYuZiAmNiZiHhoWWFYUVk6QTgwKCEoMDowKDhBMCg4QTA6QDkzKCEpMDgzKjhASUA6SkIwOEhQOSg4UkhAOEA5Qjs1KDEoOEhASUA4MDpAOTM5MCg4KDA6MCgjGCEtIygwQUlQSUIyOEAwKDIoISgxODAhKTI4QzhBSTFIQDkyKCEpMUA5MDhCOCogKDA4QDlAODA4QDhASEA4QSk5MisgKRgQGCArMDpAMCkgKDkoOjBDSDkxIBggKDkxODE4MSgxKjI4SlBYUEpRQEhYSEBQYlpIUEg4UHCRgHGASFNIQUk5MSswKSAaISghGCAoISkgKDA4NCgwKSAYIig1KDA6QDowQEs4MTkyOEhRSDgzOEA5MDowKTEoMSgwQUhCPTApMTkoICggMDgyKCMYISwjKjA4QEpAOjA6QDApMSghKDE4KBggKTI8MDlBOUA4MykhKTE6MDhCODAiKDE4MTkwOTA4QDlBKTgyKSQoGBAZICowODA5MSgYIDAoIDA4QCAwOUk4MCkZIiokKCUoMCgwOCkwQDAqMSkyOEhCOEI4MDhQaWFJQThJOTA5MSkgKiEfGyAZICghMDgoICgwICgwJCowODE4Mj0xOEhRSDIqMThASUAwKjA5MzkwICkwKTAoMDlDODUpMTkwIig4KDEoIxgiKCAoJCw4QjoxODE4MCwgKTE4KCEoICgzOTAoMTkwOTAoMikiKTM6QTgwKCEqMCk5MDkwO0A4GCAzKSIYJBghKTA5MDgwKRkoGCAwQSAwQkg4ICkZIRggKRwhECAaKDAoMSggKDAoJSkgKDA5MTlAODJAWFBIUEk5MDoyQDEoITIiGBEfGyAYIDkoISsbKjIgKDgoMjwxOEBJQC0xOEI4KCIwOTEoMDkoICogKjA9My4wODAYICkwKiAYJBgkGSEpIig5MDgxKDEpMC8yODAYICggKjI4MCApMjgwKjArISoyODE4QDEoIBggKCAoICgwKCA5MjshKDIpIRojGCEpMDkyKDAgGiA4QTA4SEI4ICkgGCgZICkZEhggEBsoMCcgGSYoMCgxKDIpMEhoUEM6SFBgWEBIaFBIMUE4MCg5KBwiGSUwQDhAODBBODApGSgyKSAoODE5MDkwODAoOUhAMCowKCA5MDowIRggMTgxKTEoISkjMDgxODIoMCgiKzA4MBkwICslHCEZICkjKDQqIjAoJCkzKBggKSAqMyAqMTgwLykhKzI5MSggGCUpIDY5KjEoICghGiIZIigwOTM4MCkgMDhAOUE4MDgwKDAoGSgYECAxIBgQGSAoGCAoISkwKCAaIRghKSAqOUA4QDlBUDAoMEiAWEBRQHhgWHCAiIBweIB4cFBJQTFASDgxODI5MTwwOEA4SFNJQDgpMDgpODE6MDoyODAoOUA4MCghOCggNSggGSAoMighKDAoIxkgKDA4MiwjKTQZMCAqJB8aISgjLygiKCUqMCkgGCApISoyKCEoMDkwLCEpIyozODEhGCYpMSoxODArMSAoGCAYERgiGCIpMSkxODAqMTswKTApMCgYICggGCAxKCAYICwwKzhAOCgiKTE6QjhAUUgwUGJIQFBYiHmImIhwYXCIkIiCeHBYUEhBMUExPzlHSFJKQDgxOSgwOzI4MDgzKThBODEoIDAsMCkhGSAoMSghGCgxKCIZICgxKycqMxggMCkwKCEYIB8bJi8oIBkhGiEsIBkoJSshGCgxODAsJyEpMjgwKicoMSszLDAoMCEYERkhGSItMiswKTEoIC0hKSEoMS4xKSAoMEIwKDA5MCg7QDlAUGBIOFhgWGBoeWiAiJCpkGBQWGh4gXpwYFBJQTgwODApMDk1OUFIQDhBS0M4MTgwKDc6MCgyKDhAOTEhMywgGiAoMCkgGSgxKCEYIBktJyMrICwjHhMZJy8gHyYQGCcrGSgzKiEZIxgiKzEsIBkjLCEsIikxKCAfGCctISghKSUoJi4gLCIoOkM4MCg2OFBYUEhQWFBYaICIgYiQmYBYQEhgcHlwaWBQSEM4MSo0KDEoMThCOUJIQDwyKjIqMDgwODAoMiA5MDgwOCAoMCgxKyEaICsaKTAoIBkhGCAsGSUYJCkiKiMZEhkTGiciKSEYEB8aIRgRIhsmKTEqIhkiGyApIC8gGiMrISskKiEfGyAYJyMdJBknKCUpIBogMT0wLzBIUUpASGBweIB4gIpwUEBIWGhxaGBYUEA5QjgxKCEsICkgKDE6MDpBODcoIC8zKDNAODMsMCoiGiAqIBogKiAYECEYISgiGiQcJigjGhIZFRknJRgQGhIfESIbJSowKSMbIBwlKCEqIBonIiohGCYZIBwQHiEYIB8QHxwgGSciHCk1KyAoISk4SkA4MDhYaHFoeIBxYEhBUGBpYFFIODE7MCgiLCIYICg1OzArMikiKiAqMSswOjA4MCkiLCIZICohGiAqIBgQGCAZIRoRGCQdIRkjHhEaFBkhHCQeExkQGxEiHCQsIh8bJyAqIBkjGSIZICogGyMeEBgQGhEfGxYaEx8YIhwSGCAvJyAoOEA4MSgwSGJYaHBgWUA5SFlRSEA4MzgyKCciGCAqNzAoIigxKCQpIy02KSUoIBonGiAqIBgRHxIYIxoQHSIfGBAaFB8aIB8UGRAaEiIZEBkhGCErIx8bJyQaIhohGSEpIB8bFxMbFxcVGRIfGhMYJychMDgwKjBAU2FSOTBAUUlAODEpMCwnIBogLzEpJCogGCcgKSEuMSghGCQbJxgiKSEYER8SGSIaEB0iGBAeEBoVHx8aFxkTGCAfGiYcER4iHCMbIB8jHxwQGBcXFxcXExoXEBonGCEZIigwKCIoOElASFFCODE4SEI4MCwnIR8gLzAoJyAbJyIpISgiMCggGiEbIBgkGCAZJhEYEBgTGRIaIRoRHxIbFxMcERwUGBcWHxwjHxEZERsgHyAfHSMZEx4XFwoXCBUJFxcSCBEfGCAfGCAoIyg4QklAOEA4MjhAOjAsIRojHREZIi4nIRsmGiApISggGSghGiEbIBgiHiQYERgQGBMaERogGxEfEhoXFBwSGhcXFRsQHxkgHRAYFxEbEBgQHRIfHRYcFxQPCRAOEAwXFxAJEh8fGiEYISgwOkE7MCkwODIoICsgHCEaFhgiKiQZJhsgGCAeISgjGSEbIBwgGSAdEBgiGxYbEh4RGhcXFxcXFxcSGRQfGxEYFxEaEx0TGREfGBYbEwkQCBEPDw8LFQgXCxcRHxkQGyIyPTAqMDgwKiEpIBkRHBcQGSEqIx8fHRAYISggGSAfIBshHRMfFxoTHhAZFgkXEggXFxcXFxYfGhcWGBMdFx8YFhkUDBEPDw8MEAwUDhcXFhohKTM5MSggKDEqIikgGBMbFxAaJh8fHBIZIRogHxwhGxcZFxMaFRkQGBIYFQoUCRIKFxcVCxQJFxUcEBsXFxQcFxQYEBgXFQ8PDw8PDBAPCBcXEwgRGyAqNSgiKDAoJxgUGRcRGyQaEBwQHxYfHxwgGxQJFxYYFxcWCxEPChcXCREPDBcWGRMYFQgQCRcUGhcVGBYJFQ8PDw8PDw8IEgsXEQoRGyAqMyoiKSIYIxkXFxEbIxkRGBAaExsWHx8fFwkXEBgXFxcQCBMPDwoVCRQPDwkSCRcQGBQYFAkQCxEIFxEYEggXFxAKFA8PDw8PDw8PCRcQCxEaIi8iKSEaIBsXFh8ZIBkUGBQZFxAYEB8fHBcQCRUIERkXFxcIEw8PCxMJFA8PChIKFxcTDhALFxIKFxcLEw8PCQAPDw8PDw8JFQsTGSMrIRkhKCEfFxIIEhoQHxgXFxQZEBoQHhIZEBoXFxcQCBMKFxcSDw8MEQsSDw8PCRcXEw4QDRcQCxcVDREPDwgDCwEPDw8PDw8QCxMaIykiGSMfFxMJERoUHBcXFB0RGxMZERgSCRcXFQ8IFQgVCBMPDwwQDw8PDwsRChcVDREMFxAMFxQOEA8NBwcGDw8PDw4RCBUbJRojGREbFxIKERgXGBcXFxAYFRkWGBUKEAgWCBQIEw8KEwwRChEPDw8PDw8PDxEKFxANEQ0TCRENEwoSDw8OBwcHAQ8PDw8MFxAcIhsjGRMaEwkUChcXFxcJFxIYFxUNFQgSCxAPDRAMEA8PDw8PDw8PDxALEAkRCRAPDxEKFA8KEA8PDwcHBwQPDw8PChcTHx0TGRMKFAsXFxQKEAoQCxcVCRcRDREMEQ8PDw8PDw8PDw8PDw8PDw8NEw8PDw8KBwcHBwEPDw8OFxMfHBQYEg0TCxcXEQ8OFxUJFw8RDBAPDw8PDw8PDw8PDw8PDw8PDRAIEQ8PDw8HBwcHBg8JAwkADw4XExgRHRcRDw4XFxAPDwgVCRQJEAgSDwoRDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwcHBwcGCQEMBw8PFxUcFxIPDxcVDhAPChAJEAwSChAIEQ8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDQcHBwcHCAcHAw8KFQkWGBcUDw8OFQ8IEA8PDBEKEAgQDw8PDw8PDw8PDw8PCgEPDw8PDw8PDw8PDQAJBwcHBwcHBwUJAw0TChcXFA8PDhIPDw8PCRAPDw8PDw8PDw8PDw8LAAsDDw8PDw8PDw8PDwsHBwcHBwcHBwcOEgoSChcQDw8PDw8PDw8JEA8PDw8PDw8PDw8NAA8JBwQPDw8PDw8PCgEPDw0HBwcHBwcHBwcPEAsRCxYPDw8PDw8PDw8PDw8PDw8PDw8PCQIMBwcBDw8PDw8PDwgCDw8MBwcHBwcHBwcHAA8PCxEPDw8PDw8PDw8PDw8PDw8PDw8IAQkCDAMLBwcGDw8PDw8PDQIPDwsHBwcHBwcHBwcADw8LEA8PDw8PDw8PDw8PDw8NAAgBDw8BDwwHDAQKBwcGDw8PDw8PDQIPDwoHBwcHBwcHBwcBDw8PDw8PDw8PDw8PDw8PDgIIBA8PAQ8KBwELBggHBwcPDw8PCQEJAA8NAg8PCgcHBwcHBwcHBwEPDQAPDw8PDw8PDw8PDw8PCgIIBwEPCQEMAQ8JBwIKBwcHBwIIAAwADw8NAg8PCAIIAg8KAQkHBwcHBwcHBwcBDw0ADw8PDw8PDw8PDw8PDwoCCAcBDAYMAQ4ACQcHBwcHBwQJAg8PCAAKAg8DDAYPCQIIBwcHBwcHBwcHAg8NAA8PDwEIAQ8PDwwGDw8PDw8IAgkDCAQMBwsBDQcHBwcHBwcGDwwACAEKBA0DDQUPCQcHBwcHBwcHBwcPDAAPDw8FDw8PCwcPDw8PDgQIAwgGCAcCDgcHBwcHBwcHAgkBDgcFCAAMAggACgYKBAgHBwcHBwcHBwcHAQ8LAAoADw0ACgcPDw8LBw8PDwwADwUIAwgHBwIMBwcHBwcHBwYJAwkDCAcHBAgACgEIAQkHCQcHBwcHBwcHBwcHDw4BDw0ACAcBDw8PCwcADwwADgAMBAkBCAcHBwYLBwcHBwcHBwcHAQgACAcHBgkHBwkHBwcHBwcHBwcHBwIPCgIPDAEIBwIPAQ8PCAcBDQELAQ0BCgUJAQgHBwcHCgcHBwcHBwcHBwcHBwQIBwcJBwcHBwcHBwcHBwcCCAEPAw8LAQgHAg4CDAAMAggHBAwBDAcHBQgHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAA8EDwQIBwIJAQoDCAMLBwcCCwELBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCDQUOBAgHAgkHBQkHBwUKAgoHBwYIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwIMBgwGCQcHBwEJBwcGCAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHAgsGCwcACAcHBwcHBwIIBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcCCwUMBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwEKBQ4HBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHCAYOBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcACAcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBwcHBw==";
@@ -0,0 +1,144 @@
1
+ import type { SkyPoint } from "./projection.ts";
2
+ export type { SkyPoint };
3
+ /**
4
+ * A point in galactic coordinates, in degrees.
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * import type { GalacticPoint } from "@johnmorrisdotca/hoshi-stars/milky-way";
9
+ *
10
+ * const centre: GalacticPoint = { longitude: 0, latitude: 0 };
11
+ * console.log(centre.longitude);
12
+ * ```
13
+ */
14
+ export interface GalacticPoint {
15
+ /** Galactic longitude, 0 (toward the Galactic centre in Sagittarius) up to but not including 360. */
16
+ longitude: number;
17
+ /** Galactic latitude, -90 to 90: 0 is the plane of the Milky Way. */
18
+ latitude: number;
19
+ }
20
+ /**
21
+ * A ribbon of the Milky Way at one brightness level: two chains of sky points of the same length, the upper edge and the lower, each pair at the same galactic longitude. Draw the ribbon as
22
+ * the polygon `upper` forward then `lower` backward. A strip stops where the band splits or ends (a dust lane, the end of a bright patch), so one level is several strips.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * import { milkyWayBands, type MilkyWayStrip } from "@johnmorrisdotca/hoshi-stars/milky-way";
27
+ *
28
+ * const strip: MilkyWayStrip = milkyWayBands()[0]!.strips[0]!;
29
+ * console.log(strip.upper.length === strip.lower.length);
30
+ * ```
31
+ */
32
+ export interface MilkyWayStrip {
33
+ /** The edge toward the galactic north, from low longitude to high. */
34
+ upper: SkyPoint[];
35
+ /** The edge toward the galactic south, at the same longitudes as `upper`. */
36
+ lower: SkyPoint[];
37
+ }
38
+ /**
39
+ * Everywhere the Milky Way is brighter than one level.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * import { milkyWayBands, type MilkyWayBand } from "@johnmorrisdotca/hoshi-stars/milky-way";
44
+ *
45
+ * const band: MilkyWayBand = milkyWayBands([0.5])[0]!;
46
+ * console.log(band.level, band.strips.length);
47
+ * ```
48
+ */
49
+ export interface MilkyWayBand {
50
+ /** The level, 0 (dark sky) to 1 (the brightest part of the core), as `milkyWayBrightness` gives it. */
51
+ level: number;
52
+ /** The ribbons where the brightness is above the level. */
53
+ strips: MilkyWayStrip[];
54
+ }
55
+ /**
56
+ * Where to cut the bands, and how finely.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { milkyWayBands, type MilkyWayBandsOptions } from "@johnmorrisdotca/hoshi-stars/milky-way";
61
+ *
62
+ * const options: MilkyWayBandsOptions = { step: 2 };
63
+ * console.log(milkyWayBands([0.3, 0.6], options).length);
64
+ * ```
65
+ */
66
+ export interface MilkyWayBandsOptions {
67
+ /** Degrees of galactic longitude between points along a strip; a multiple of the grid's 0.5, default 1. */
68
+ step?: number;
69
+ }
70
+ /**
71
+ * The galactic longitude and latitude of a point of the sky (J2000, the IAU's galactic frame).
72
+ *
73
+ * @param point - A right ascension and declination in degrees.
74
+ * @returns Longitude 0 up to but not including 360, latitude -90 to 90.
75
+ * @throws TypeError if the right ascension or declination is not a finite number.
76
+ *
77
+ * @example
78
+ * ```ts
79
+ * import { toGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
80
+ *
81
+ * // Sagittarius A*, the centre of the Galaxy, is at the origin
82
+ * console.log(toGalactic({ rightAscension: 266.4168, declination: -29.0078 })); // about { longitude: 0, latitude: 0 }
83
+ * ```
84
+ */
85
+ export declare function toGalactic(point: SkyPoint): GalacticPoint;
86
+ /**
87
+ * The right ascension and declination (J2000) of a point given in galactic coordinates.
88
+ *
89
+ * @param point - A galactic longitude and latitude in degrees.
90
+ * @returns Right ascension 0 up to but not including 360, declination -90 to 90.
91
+ * @throws TypeError if the longitude or latitude is not a finite number.
92
+ *
93
+ * @example
94
+ * ```ts
95
+ * import { fromGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
96
+ *
97
+ * console.log(fromGalactic({ longitude: 0, latitude: 0 })); // about { rightAscension: 266.4, declination: -28.9 }
98
+ * ```
99
+ */
100
+ export declare function fromGalactic(point: GalacticPoint): SkyPoint;
101
+ /**
102
+ * How bright the Milky Way is toward a point, as a display value from 0 (dark sky) to 1 (the brightest part of the core, in Sagittarius). It follows the band along the galactic equator, is brightest
103
+ * toward the Galactic centre, and is dimmer where the dust lanes cross it (the Great Rift, the Coalsack, the Cygnus Rift). The grid is 0.5 degrees on a side near the plane and holds thirty-two levels, so
104
+ * it is a smooth map for shading a chart or a texture, not a measurement; beyond 30 degrees of the plane it is 0. The values are already shaped for the eye (a gamma of about 0.45), so use them as a pixel's
105
+ * brightness directly.
106
+ *
107
+ * @param point - A right ascension and declination in degrees (J2000).
108
+ * @returns A number from 0 to 1.
109
+ * @throws TypeError if the right ascension or declination is not a finite number.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
114
+ *
115
+ * const sagittarius = milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 });
116
+ * const pole = milkyWayBrightness({ rightAscension: 192.9, declination: 27.1 });
117
+ * console.log(sagittarius > pole); // true
118
+ * ```
119
+ */
120
+ export declare function milkyWayBrightness(point: SkyPoint): number;
121
+ /**
122
+ * The Milky Way cut at some brightness levels, as ribbons of sky points for drawing soft bands (a polygon per strip, filled with a low opacity so the levels build up). Each strip runs along
123
+ * the galactic equator; a dust lane that splits the band ends the strips on either side of it, so the lane shows as a gap. The points are in right ascension and declination, ready for
124
+ * `project` from `@johnmorrisdotca/hoshi-stars/projection`; a strip crossing a map's seam or the far side is the caller's to cut (compare the longitudes of neighbouring points).
125
+ *
126
+ * @param levels - Levels from 0 to 1, as `milkyWayBrightness` measures them. Default `[0.2, 0.42, 0.68]`: the glow, the band and the core. Each must be a number above 0 and below 1.
127
+ * @param options - `step`: degrees of longitude between points along a strip (a multiple of 0.5, default 1).
128
+ * @returns One band per level, in the order given.
129
+ * @throws RangeError if a level is not between 0 and 1 (exclusive) or `step` is not a positive multiple of 0.5. TypeError if a level is not a number.
130
+ *
131
+ * @example
132
+ * ```ts
133
+ * import { milkyWayBands } from "@johnmorrisdotca/hoshi-stars/milky-way";
134
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
135
+ *
136
+ * for (const band of milkyWayBands()) {
137
+ * for (const strip of band.strips) {
138
+ * const polygon = [...strip.upper, ...strip.lower.slice().reverse()].map((p) => project("hammer", p, { centre: { rightAscension: 0, declination: 0 } }));
139
+ * console.log(band.level, polygon.length);
140
+ * }
141
+ * }
142
+ * ```
143
+ */
144
+ export declare function milkyWayBands(levels?: readonly number[], options?: MilkyWayBandsOptions): MilkyWayBand[];
@@ -0,0 +1,242 @@
1
+ // The Milky Way as a small brightness grid in galactic coordinates (the milky-way tier, `@johnmorrisdotca/hoshi-stars/milky-way`): about 5 kB of data, made by
2
+ // scripts/make-milky-way-data.py from SAO star counts, the IRAS 100 micron dust map and a bulge of our own (see NOTICE.md). Pure: no DOM, no clock, no state beyond the unpacked grid.
3
+ import { MILKY_WAY_COLUMNS, MILKY_WAY_LATITUDE, MILKY_WAY_LEVELS, MILKY_WAY_PACKED, MILKY_WAY_ROWS } from "./data/milky-way.js";
4
+ const RAD = Math.PI / 180;
5
+ const DEG = 180 / Math.PI;
6
+ // The J2000 galactic frame: the north galactic pole's right ascension and declination, and the galactic longitude of the north celestial pole (IAU 1958 as set in ICRS by the Hipparcos catalogue's documentation, 192.85948, 27.12825 and 122.93192 degrees).
7
+ const POLE_RA = 192.85948 * RAD;
8
+ const POLE_DEC = 27.12825 * RAD;
9
+ const POLE_L = 122.93192 * RAD;
10
+ const COLUMNS = MILKY_WAY_COLUMNS;
11
+ const ROWS = MILKY_WAY_ROWS;
12
+ const STEP_L = 360 / COLUMNS;
13
+ const STEP_B = (2 * MILKY_WAY_LATITUDE) / ROWS;
14
+ let grid;
15
+ function unpack() {
16
+ if (grid === undefined) {
17
+ const text = atob(MILKY_WAY_PACKED);
18
+ const out = new Float32Array(COLUMNS * ROWS);
19
+ let at = 0;
20
+ for (let i = 0; i < text.length; i++) {
21
+ const byte = text.charCodeAt(i);
22
+ const value = (byte >> 3) / MILKY_WAY_LEVELS;
23
+ for (let n = (byte & 7) + 1; n > 0; n--)
24
+ out[at++] = value;
25
+ }
26
+ grid = out;
27
+ }
28
+ return grid;
29
+ }
30
+ /**
31
+ * The galactic longitude and latitude of a point of the sky (J2000, the IAU's galactic frame).
32
+ *
33
+ * @param point - A right ascension and declination in degrees.
34
+ * @returns Longitude 0 up to but not including 360, latitude -90 to 90.
35
+ * @throws TypeError if the right ascension or declination is not a finite number.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * import { toGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
40
+ *
41
+ * // Sagittarius A*, the centre of the Galaxy, is at the origin
42
+ * console.log(toGalactic({ rightAscension: 266.4168, declination: -29.0078 })); // about { longitude: 0, latitude: 0 }
43
+ * ```
44
+ */
45
+ export function toGalactic(point) {
46
+ finite("rightAscension", point?.rightAscension);
47
+ finite("declination", point?.declination);
48
+ const ra = point.rightAscension * RAD;
49
+ const dec = point.declination * RAD;
50
+ const sinB = Math.sin(dec) * Math.sin(POLE_DEC) + Math.cos(dec) * Math.cos(POLE_DEC) * Math.cos(ra - POLE_RA);
51
+ const y = Math.cos(dec) * Math.sin(ra - POLE_RA);
52
+ const x = Math.sin(dec) * Math.cos(POLE_DEC) - Math.cos(dec) * Math.sin(POLE_DEC) * Math.cos(ra - POLE_RA);
53
+ const longitude = (((POLE_L - Math.atan2(y, x)) * DEG) % 360 + 360) % 360;
54
+ return { longitude: longitude >= 360 ? 0 : longitude, latitude: Math.asin(Math.max(-1, Math.min(1, sinB))) * DEG };
55
+ }
56
+ /**
57
+ * The right ascension and declination (J2000) of a point given in galactic coordinates.
58
+ *
59
+ * @param point - A galactic longitude and latitude in degrees.
60
+ * @returns Right ascension 0 up to but not including 360, declination -90 to 90.
61
+ * @throws TypeError if the longitude or latitude is not a finite number.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * import { fromGalactic } from "@johnmorrisdotca/hoshi-stars/milky-way";
66
+ *
67
+ * console.log(fromGalactic({ longitude: 0, latitude: 0 })); // about { rightAscension: 266.4, declination: -28.9 }
68
+ * ```
69
+ */
70
+ export function fromGalactic(point) {
71
+ finite("longitude", point?.longitude);
72
+ finite("latitude", point?.latitude);
73
+ const b = point.latitude * RAD;
74
+ const dl = POLE_L - point.longitude * RAD;
75
+ const sinDec = Math.sin(b) * Math.sin(POLE_DEC) + Math.cos(b) * Math.cos(POLE_DEC) * Math.cos(dl);
76
+ const y = Math.cos(b) * Math.sin(dl);
77
+ const x = Math.sin(b) * Math.cos(POLE_DEC) - Math.cos(b) * Math.sin(POLE_DEC) * Math.cos(dl);
78
+ const rightAscension = ((POLE_RA + Math.atan2(y, x)) * DEG % 360 + 360) % 360;
79
+ return { rightAscension: rightAscension >= 360 ? 0 : rightAscension, declination: Math.asin(Math.max(-1, Math.min(1, sinDec))) * DEG };
80
+ }
81
+ function finite(name, value) {
82
+ if (typeof value !== "number" || !Number.isFinite(value))
83
+ throw new TypeError(`${name} must be a finite number, got ${String(value)}`);
84
+ }
85
+ function cell(column, row) {
86
+ return unpack()[(((column % COLUMNS) + COLUMNS) % COLUMNS) + Math.max(0, Math.min(ROWS - 1, row)) * COLUMNS];
87
+ }
88
+ function brightnessAt(longitude, latitude) {
89
+ if (latitude <= -MILKY_WAY_LATITUDE || latitude >= MILKY_WAY_LATITUDE)
90
+ return 0;
91
+ const x = longitude / STEP_L - 0.5;
92
+ const y = (latitude + MILKY_WAY_LATITUDE) / STEP_B - 0.5;
93
+ const c = Math.floor(x);
94
+ const r = Math.floor(y);
95
+ const fx = x - c;
96
+ const fy = y - r;
97
+ const top = cell(c, r + 1) * (1 - fx) + cell(c + 1, r + 1) * fx;
98
+ const bottom = cell(c, r) * (1 - fx) + cell(c + 1, r) * fx;
99
+ return bottom * (1 - fy) + top * fy;
100
+ }
101
+ /**
102
+ * How bright the Milky Way is toward a point, as a display value from 0 (dark sky) to 1 (the brightest part of the core, in Sagittarius). It follows the band along the galactic equator, is brightest
103
+ * toward the Galactic centre, and is dimmer where the dust lanes cross it (the Great Rift, the Coalsack, the Cygnus Rift). The grid is 0.5 degrees on a side near the plane and holds thirty-two levels, so
104
+ * it is a smooth map for shading a chart or a texture, not a measurement; beyond 30 degrees of the plane it is 0. The values are already shaped for the eye (a gamma of about 0.45), so use them as a pixel's
105
+ * brightness directly.
106
+ *
107
+ * @param point - A right ascension and declination in degrees (J2000).
108
+ * @returns A number from 0 to 1.
109
+ * @throws TypeError if the right ascension or declination is not a finite number.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { milkyWayBrightness } from "@johnmorrisdotca/hoshi-stars/milky-way";
114
+ *
115
+ * const sagittarius = milkyWayBrightness({ rightAscension: 266.4, declination: -28.9 });
116
+ * const pole = milkyWayBrightness({ rightAscension: 192.9, declination: 27.1 });
117
+ * console.log(sagittarius > pole); // true
118
+ * ```
119
+ */
120
+ export function milkyWayBrightness(point) {
121
+ const g = toGalactic(point);
122
+ return brightnessAt(g.longitude, g.latitude);
123
+ }
124
+ /** The latitudes where one column of the grid is above a level, as spans, with the crossing between two rows found by a straight line. */
125
+ function spans(column, level) {
126
+ const out = [];
127
+ let start;
128
+ const latitude = (row) => -MILKY_WAY_LATITUDE + (row + 0.5) * STEP_B;
129
+ for (let row = 0; row < ROWS; row++) {
130
+ const v = cell(column, row);
131
+ const above = v > level;
132
+ if (above && start === undefined) {
133
+ if (row === 0)
134
+ start = -MILKY_WAY_LATITUDE;
135
+ else {
136
+ const u = cell(column, row - 1);
137
+ start = latitude(row - 1) + ((level - u) / (v - u)) * STEP_B;
138
+ }
139
+ }
140
+ else if (!above && start !== undefined) {
141
+ const u = cell(column, row - 1);
142
+ out.push({ low: start, high: latitude(row - 1) + ((u - level) / (u - v)) * STEP_B });
143
+ start = undefined;
144
+ }
145
+ }
146
+ if (start !== undefined)
147
+ out.push({ low: start, high: MILKY_WAY_LATITUDE });
148
+ return out;
149
+ }
150
+ const overlaps = (a, b) => a.low < b.high && b.low < a.high;
151
+ /**
152
+ * The Milky Way cut at some brightness levels, as ribbons of sky points for drawing soft bands (a polygon per strip, filled with a low opacity so the levels build up). Each strip runs along
153
+ * the galactic equator; a dust lane that splits the band ends the strips on either side of it, so the lane shows as a gap. The points are in right ascension and declination, ready for
154
+ * `project` from `@johnmorrisdotca/hoshi-stars/projection`; a strip crossing a map's seam or the far side is the caller's to cut (compare the longitudes of neighbouring points).
155
+ *
156
+ * @param levels - Levels from 0 to 1, as `milkyWayBrightness` measures them. Default `[0.2, 0.42, 0.68]`: the glow, the band and the core. Each must be a number above 0 and below 1.
157
+ * @param options - `step`: degrees of longitude between points along a strip (a multiple of 0.5, default 1).
158
+ * @returns One band per level, in the order given.
159
+ * @throws RangeError if a level is not between 0 and 1 (exclusive) or `step` is not a positive multiple of 0.5. TypeError if a level is not a number.
160
+ *
161
+ * @example
162
+ * ```ts
163
+ * import { milkyWayBands } from "@johnmorrisdotca/hoshi-stars/milky-way";
164
+ * import { project } from "@johnmorrisdotca/hoshi-stars/projection";
165
+ *
166
+ * for (const band of milkyWayBands()) {
167
+ * for (const strip of band.strips) {
168
+ * const polygon = [...strip.upper, ...strip.lower.slice().reverse()].map((p) => project("hammer", p, { centre: { rightAscension: 0, declination: 0 } }));
169
+ * console.log(band.level, polygon.length);
170
+ * }
171
+ * }
172
+ * ```
173
+ */
174
+ export function milkyWayBands(levels = [0.2, 0.42, 0.68], options = {}) {
175
+ const step = options.step ?? 1;
176
+ if (typeof step !== "number" || !(step >= STEP_L) || Math.abs(step / STEP_L - Math.round(step / STEP_L)) > 1e-9)
177
+ throw new RangeError(`step must be a positive multiple of ${STEP_L}, got ${String(step)}`);
178
+ const stride = Math.round(step / STEP_L);
179
+ for (const level of levels) {
180
+ finite("level", level);
181
+ if (!(level > 0 && level < 1))
182
+ throw new RangeError(`a level must be above 0 and below 1, got ${level}`);
183
+ }
184
+ return levels.map((level) => ({ level, strips: stripsAt(level, stride) }));
185
+ }
186
+ function stripsAt(level, stride) {
187
+ const count = COLUMNS / stride;
188
+ const longitude = (k) => (k * stride + 0.5) * STEP_L;
189
+ // columns 0 to count: the last is the first again, so that the band is cut once, at longitude 0
190
+ const columns = Array.from({ length: count + 1 }, (_, k) => spans((k % count) * stride, level));
191
+ const forward = columns.map((c, k) => c.map((a) => (k < count ? columns[k + 1].flatMap((b, i) => (overlaps(a, b) ? [i] : [])) : [])));
192
+ const backward = columns.map((c, k) => c.map((b) => (k > 0 ? columns[k - 1].flatMap((a, i) => (overlaps(a, b) ? [i] : [])) : [])));
193
+ const joined = (k, a) => {
194
+ const next = forward[k][a];
195
+ return next.length === 1 && backward[k + 1][next[0]].length === 1 ? next[0] : undefined;
196
+ };
197
+ const strips = [];
198
+ const make = (members, pinchStart, pinchEnd) => {
199
+ const upper = [];
200
+ const lower = [];
201
+ const half = (stride * STEP_L) / 2;
202
+ const first = members[0];
203
+ const last = members[members.length - 1];
204
+ const mid = (s) => (s.low + s.high) / 2;
205
+ if (pinchStart) {
206
+ const p = fromGalactic({ longitude: longitude(first[0]) - half, latitude: mid(first[1]) });
207
+ upper.push(p);
208
+ lower.push(p);
209
+ }
210
+ for (const [k, s] of members) {
211
+ upper.push(fromGalactic({ longitude: longitude(k), latitude: s.high }));
212
+ lower.push(fromGalactic({ longitude: longitude(k), latitude: s.low }));
213
+ }
214
+ if (pinchEnd) {
215
+ const p = fromGalactic({ longitude: longitude(last[0]) + half, latitude: mid(last[1]) });
216
+ upper.push(p);
217
+ lower.push(p);
218
+ }
219
+ strips.push({ upper, lower });
220
+ };
221
+ for (let k = 0; k <= count; k++) {
222
+ for (let a = 0; a < columns[k].length; a++) {
223
+ const before = backward[k][a];
224
+ if (k > 0 && before.length === 1 && joined(k - 1, before[0]) === a)
225
+ continue;
226
+ const members = [[k, columns[k][a]]];
227
+ let ci = k;
228
+ let ai = a;
229
+ for (let next = joined(ci, ai); next !== undefined; next = joined(ci, ai)) {
230
+ ci += 1;
231
+ ai = next;
232
+ members.push([ci, columns[ci][ai]]);
233
+ }
234
+ make(members, k > 0 && before.length === 0, ci < count && forward[ci][ai].length === 0);
235
+ // where the band branches or merges, the pairs that are not joined get a strip of their own
236
+ for (const d of forward[ci][ai])
237
+ if (joined(ci, ai) !== d)
238
+ make([[ci, columns[ci][ai]], [ci + 1, columns[ci + 1][d]]], false, false);
239
+ }
240
+ }
241
+ return strips;
242
+ }
package/package.json CHANGED
@@ -1,9 +1,10 @@
1
1
  {
2
2
  "name": "@johnmorrisdotca/hoshi-stars",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Hoshi 星: stars you can see without a telescope, as data and as sky charts. 5,080 stars with names, distance and colour, the 88 constellations with lines and boundaries, the Messier objects and seven map projections. Typed, no dependencies.",
5
5
  "keywords": [
6
6
  "stars",
7
+ "milky-way",
7
8
  "star-catalog",
8
9
  "bright-star-catalogue",
9
10
  "yale",
@@ -17,7 +18,40 @@
17
18
  "javascript",
18
19
  "typescript",
19
20
  "zero-dependencies",
20
- "itsutsu"
21
+ "itsutsu",
22
+ "spaceprogramx",
23
+ "spx",
24
+ "space",
25
+ "star",
26
+ "star-chart",
27
+ "star-map",
28
+ "starmap",
29
+ "sky-chart",
30
+ "sky-map",
31
+ "night-sky",
32
+ "sky",
33
+ "planetarium",
34
+ "celestial",
35
+ "celestial-sphere",
36
+ "astrometry",
37
+ "cartography",
38
+ "visualization",
39
+ "map-projection",
40
+ "stereographic",
41
+ "svg",
42
+ "constellation",
43
+ "star-names",
44
+ "galaxies",
45
+ "nebulae",
46
+ "star-clusters",
47
+ "observer",
48
+ "altitude",
49
+ "azimuth",
50
+ "horizon",
51
+ "sidereal-time",
52
+ "precession",
53
+ "japanese",
54
+ "katakana"
21
55
  ],
22
56
  "homepage": "https://johnmorrisdotca.github.io/hoshi-stars/",
23
57
  "repository": {
@@ -70,6 +104,11 @@
70
104
  "import": "./dist/projection.js",
71
105
  "default": "./dist/projection.js"
72
106
  },
107
+ "./milky-way": {
108
+ "types": "./dist/milky-way.d.ts",
109
+ "import": "./dist/milky-way.js",
110
+ "default": "./dist/milky-way.js"
111
+ },
73
112
  "./sky": {
74
113
  "types": "./dist/sky.d.ts",
75
114
  "import": "./dist/sky.js",