@deck.gl/geo-layers 8.8.0-beta.1 → 8.8.0-beta.2
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/dist/dist.dev.js +180 -118
- package/dist/es5/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/es5/great-circle-layer/great-circle-layer.js +12 -8
- package/dist/es5/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-cluster-layer.js +5 -4
- package/dist/es5/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/es5/h3-layers/h3-hexagon-layer.js +49 -34
- package/dist/es5/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/es5/index.js.map +1 -1
- package/dist/es5/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/es5/mesh-layer/mesh-layer.js +22 -26
- package/dist/es5/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/es5/mvt-layer/mvt-layer.js +6 -3
- package/dist/es5/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/es5/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-geometry.js.map +1 -1
- package/dist/es5/s2-layer/s2-layer.js +4 -2
- package/dist/es5/s2-layer/s2-layer.js.map +1 -1
- package/dist/es5/s2-layer/s2-utils.js.map +1 -1
- package/dist/es5/tile-3d-layer/tile-3d-layer.js +31 -16
- package/dist/es5/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/es5/tile-layer/tile-layer.js +4 -1
- package/dist/es5/tile-layer/tile-layer.js.map +1 -1
- package/dist/es5/tile-layer/tileset-2d.js.map +1 -1
- package/dist/es5/trips-layer/trips-layer.js +3 -1
- package/dist/es5/trips-layer/trips-layer.js.map +1 -1
- package/dist/esm/geo-cell-layer/GeoCellLayer.js.map +1 -1
- package/dist/esm/great-circle-layer/great-circle-layer.js +7 -3
- package/dist/esm/great-circle-layer/great-circle-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-cluster-layer.js +6 -4
- package/dist/esm/h3-layers/h3-cluster-layer.js.map +1 -1
- package/dist/esm/h3-layers/h3-hexagon-layer.js +38 -24
- package/dist/esm/h3-layers/h3-hexagon-layer.js.map +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-fragment.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js +1 -1
- package/dist/esm/mesh-layer/mesh-layer-vertex.glsl.js.map +1 -1
- package/dist/esm/mesh-layer/mesh-layer.js +15 -17
- package/dist/esm/mesh-layer/mesh-layer.js.map +1 -1
- package/dist/esm/mvt-layer/mvt-layer.js +6 -3
- package/dist/esm/mvt-layer/mvt-layer.js.map +1 -1
- package/dist/esm/quadkey-layer/quadkey-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-geometry.js.map +1 -1
- package/dist/esm/s2-layer/s2-layer.js +5 -2
- package/dist/esm/s2-layer/s2-layer.js.map +1 -1
- package/dist/esm/s2-layer/s2-utils.js.map +1 -1
- package/dist/esm/tile-3d-layer/tile-3d-layer.js +21 -10
- package/dist/esm/tile-3d-layer/tile-3d-layer.js.map +1 -1
- package/dist/esm/tile-layer/tile-layer.js +4 -1
- package/dist/esm/tile-layer/tile-layer.js.map +1 -1
- package/dist/esm/tile-layer/tileset-2d.js.map +1 -1
- package/dist/esm/trips-layer/trips-layer.js +1 -1
- package/dist/esm/trips-layer/trips-layer.js.map +1 -1
- package/dist.min.js +1 -1
- package/package.json +6 -4
- package/src/geo-cell-layer/GeoCellLayer.ts +2 -2
- package/src/great-circle-layer/{great-circle-layer.js → great-circle-layer.ts} +17 -8
- package/src/h3-layers/h3-cluster-layer.ts +60 -0
- package/src/h3-layers/{h3-hexagon-layer.js → h3-hexagon-layer.ts} +110 -42
- package/src/index.ts +4 -0
- package/src/mesh-layer/{mesh-layer-fragment.glsl.js → mesh-layer-fragment.glsl.ts} +0 -0
- package/src/mesh-layer/{mesh-layer-vertex.glsl.js → mesh-layer-vertex.glsl.ts} +2 -2
- package/src/mesh-layer/{mesh-layer.js → mesh-layer.ts} +46 -13
- package/src/mvt-layer/mvt-layer.ts +5 -3
- package/src/quadkey-layer/quadkey-layer.ts +5 -5
- package/src/s2-layer/{s2-geometry.js → s2-geometry.ts} +17 -9
- package/src/s2-layer/{s2-layer.js → s2-layer.ts} +25 -8
- package/src/s2-layer/{s2-utils.js → s2-utils.ts} +14 -7
- package/src/tile-3d-layer/{tile-3d-layer.js → tile-3d-layer.ts} +107 -36
- package/src/tile-layer/tile-layer.ts +6 -5
- package/src/tile-layer/tileset-2d.ts +1 -1
- package/src/trips-layer/trips-layer.ts +4 -4
- package/typed/geo-cell-layer/GeoCellLayer.d.ts +2 -37
- package/typed/geo-cell-layer/GeoCellLayer.d.ts.map +1 -1
- package/typed/great-circle-layer/great-circle-layer.d.ts +7 -14
- package/typed/great-circle-layer/great-circle-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-cluster-layer.d.ts +20 -14
- package/typed/h3-layers/h3-cluster-layer.d.ts.map +1 -1
- package/typed/h3-layers/h3-hexagon-layer.d.ts +55 -92
- package/typed/h3-layers/h3-hexagon-layer.d.ts.map +1 -1
- package/typed/index.d.ts +4 -0
- package/typed/index.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer-fragment.glsl.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts +1 -1
- package/typed/mesh-layer/mesh-layer-vertex.glsl.d.ts.map +1 -1
- package/typed/mesh-layer/mesh-layer.d.ts +32 -22
- package/typed/mesh-layer/mesh-layer.d.ts.map +1 -1
- package/typed/mvt-layer/mvt-layer.d.ts +2 -34
- package/typed/mvt-layer/mvt-layer.d.ts.map +1 -1
- package/typed/quadkey-layer/quadkey-layer.d.ts +4 -4
- package/typed/quadkey-layer/quadkey-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-geometry.d.ts +8 -8
- package/typed/s2-layer/s2-geometry.d.ts.map +1 -1
- package/typed/s2-layer/s2-layer.d.ts +18 -14
- package/typed/s2-layer/s2-layer.d.ts.map +1 -1
- package/typed/s2-layer/s2-utils.d.ts +3 -4
- package/typed/s2-layer/s2-utils.d.ts.map +1 -1
- package/typed/tile-3d-layer/tile-3d-layer.d.ts +58 -68
- package/typed/tile-3d-layer/tile-3d-layer.d.ts.map +1 -1
- package/typed/tile-layer/tile-layer.d.ts +3 -3
- package/typed/tile-layer/tile-layer.d.ts.map +1 -1
- package/typed/tile-layer/tileset-2d.d.ts +2 -1
- package/typed/tile-layer/tileset-2d.d.ts.map +1 -1
- package/typed/trips-layer/trips-layer.d.ts +2 -2
- package/typed/trips-layer/trips-layer.d.ts.map +1 -1
- package/src/h3-layers/h3-cluster-layer.js +0 -43
|
@@ -21,24 +21,28 @@ const MAX_LEVEL = 30;
|
|
|
21
21
|
const POS_BITS = 2 * MAX_LEVEL + 1; // 61 (60 bits of data, 1 bit lsb marker)
|
|
22
22
|
const RADIAN_TO_DEGREE = 180 / Math.PI;
|
|
23
23
|
|
|
24
|
-
export function IJToST(
|
|
24
|
+
export function IJToST(
|
|
25
|
+
ij: [number, number],
|
|
26
|
+
order: number,
|
|
27
|
+
offsets: [number, number]
|
|
28
|
+
): [number, number] {
|
|
25
29
|
const maxSize = 1 << order;
|
|
26
30
|
|
|
27
31
|
return [(ij[0] + offsets[0]) / maxSize, (ij[1] + offsets[1]) / maxSize];
|
|
28
32
|
}
|
|
29
33
|
|
|
30
|
-
function singleSTtoUV(st) {
|
|
34
|
+
function singleSTtoUV(st: number): number {
|
|
31
35
|
if (st >= 0.5) {
|
|
32
36
|
return (1 / 3.0) * (4 * st * st - 1);
|
|
33
37
|
}
|
|
34
38
|
return (1 / 3.0) * (1 - 4 * (1 - st) * (1 - st));
|
|
35
39
|
}
|
|
36
40
|
|
|
37
|
-
export function STToUV(st) {
|
|
41
|
+
export function STToUV(st: [number, number]): [number, number] {
|
|
38
42
|
return [singleSTtoUV(st[0]), singleSTtoUV(st[1])];
|
|
39
43
|
}
|
|
40
44
|
|
|
41
|
-
export function FaceUVToXYZ(face, [u, v]) {
|
|
45
|
+
export function FaceUVToXYZ(face: number, [u, v]: [number, number]): [number, number, number] {
|
|
42
46
|
switch (face) {
|
|
43
47
|
case 0:
|
|
44
48
|
return [1, u, v];
|
|
@@ -57,14 +61,14 @@ export function FaceUVToXYZ(face, [u, v]) {
|
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
63
|
|
|
60
|
-
export function XYZToLngLat([x, y, z]) {
|
|
64
|
+
export function XYZToLngLat([x, y, z]: [number, number, number]): [number, number] {
|
|
61
65
|
const lat = Math.atan2(z, Math.sqrt(x * x + y * y));
|
|
62
66
|
const lng = Math.atan2(y, x);
|
|
63
67
|
|
|
64
68
|
return [lng * RADIAN_TO_DEGREE, lat * RADIAN_TO_DEGREE];
|
|
65
69
|
}
|
|
66
70
|
|
|
67
|
-
export function toHilbertQuadkey(idS) {
|
|
71
|
+
export function toHilbertQuadkey(idS: string): string {
|
|
68
72
|
let bin = Long.fromString(idS, true, 10).toString(2);
|
|
69
73
|
|
|
70
74
|
while (bin.length < FACE_BITS + POS_BITS) {
|
|
@@ -92,7 +96,7 @@ export function toHilbertQuadkey(idS) {
|
|
|
92
96
|
return `${faceS}/${posS}`;
|
|
93
97
|
}
|
|
94
98
|
|
|
95
|
-
function rotateAndFlipQuadrant(n, point, rx, ry) {
|
|
99
|
+
function rotateAndFlipQuadrant(n: number, point: [number, number], rx: number, ry: number): void {
|
|
96
100
|
if (ry === 0) {
|
|
97
101
|
if (rx === 1) {
|
|
98
102
|
point[0] = n - 1 - point[0];
|
|
@@ -105,12 +109,16 @@ function rotateAndFlipQuadrant(n, point, rx, ry) {
|
|
|
105
109
|
}
|
|
106
110
|
}
|
|
107
111
|
|
|
108
|
-
export function FromHilbertQuadKey(hilbertQuadkey) {
|
|
112
|
+
export function FromHilbertQuadKey(hilbertQuadkey: string): {
|
|
113
|
+
face: number;
|
|
114
|
+
ij: [number, number];
|
|
115
|
+
level: number;
|
|
116
|
+
} {
|
|
109
117
|
const parts = hilbertQuadkey.split('/');
|
|
110
118
|
const face = parseInt(parts[0], 10);
|
|
111
119
|
const position = parts[1];
|
|
112
120
|
const maxLevel = position.length;
|
|
113
|
-
const point = [0, 0];
|
|
121
|
+
const point = [0, 0] as [number, number];
|
|
114
122
|
let level;
|
|
115
123
|
|
|
116
124
|
for (let i = maxLevel - 1; i >= 0; i--) {
|
|
@@ -18,25 +18,42 @@
|
|
|
18
18
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
19
|
// THE SOFTWARE.
|
|
20
20
|
|
|
21
|
-
import
|
|
21
|
+
import {AccessorFunction, DefaultProps} from '@deck.gl/core';
|
|
22
|
+
import GeoCellLayer, {GeoCellLayerProps} from '../geo-cell-layer/GeoCellLayer';
|
|
22
23
|
import {getS2Polygon} from './s2-utils';
|
|
23
24
|
|
|
24
|
-
const defaultProps = {
|
|
25
|
+
const defaultProps: DefaultProps<S2LayerProps> = {
|
|
25
26
|
getS2Token: {type: 'accessor', value: d => d.token}
|
|
26
27
|
};
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
/** All properties supported by S2Layer. */
|
|
30
|
+
export type S2LayerProps<DataT = any> = _S2LayerProps<DataT> & GeoCellLayerProps<DataT>;
|
|
31
|
+
|
|
32
|
+
/** Properties added by S2Layer. */
|
|
33
|
+
type _S2LayerProps<DataT> = {
|
|
34
|
+
/**
|
|
35
|
+
* Called for each data object to retrieve the quadkey string identifier.
|
|
36
|
+
*
|
|
37
|
+
* By default, it reads `token` property of data object.
|
|
38
|
+
*/
|
|
39
|
+
getS2Token?: AccessorFunction<DataT, string>;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export default class S2Layer<DataT = any, ExtraProps = {}> extends GeoCellLayer<
|
|
43
|
+
DataT,
|
|
44
|
+
Required<_S2LayerProps<DataT>> & ExtraProps
|
|
45
|
+
> {
|
|
46
|
+
static layerName = 'S2Layer';
|
|
47
|
+
static defaultProps = defaultProps;
|
|
48
|
+
|
|
49
|
+
indexToBounds(): Partial<GeoCellLayer['props']> | null {
|
|
30
50
|
const {data, getS2Token} = this.props;
|
|
31
51
|
|
|
32
52
|
return {
|
|
33
53
|
data,
|
|
34
54
|
_normalize: false,
|
|
35
55
|
positionFormat: 'XY',
|
|
36
|
-
getPolygon: (x, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
|
|
56
|
+
getPolygon: (x: DataT, objectInfo) => getS2Polygon(getS2Token(x, objectInfo))
|
|
37
57
|
};
|
|
38
58
|
}
|
|
39
59
|
}
|
|
40
|
-
|
|
41
|
-
S2Layer.layerName = 'S2Layer';
|
|
42
|
-
S2Layer.defaultProps = defaultProps;
|
|
@@ -14,7 +14,7 @@ import Long from 'long';
|
|
|
14
14
|
* Given an S2 token this function convert the token to 64 bit id
|
|
15
15
|
https://github.com/google/s2-geometry-library-java/blob/c04b68bf3197a9c34082327eeb3aec7ab7c85da1/src/com/google/common/geometry/S2CellId.java#L439
|
|
16
16
|
* */
|
|
17
|
-
function getIdFromToken(token) {
|
|
17
|
+
function getIdFromToken(token: string): number {
|
|
18
18
|
// pad token with zeros to make the length 16
|
|
19
19
|
const paddedToken = token.padEnd(16, '0');
|
|
20
20
|
return Long.fromString(paddedToken, 16);
|
|
@@ -24,7 +24,15 @@ const MAX_RESOLUTION = 100;
|
|
|
24
24
|
|
|
25
25
|
/* Adapted from s2-geometry's S2Cell.getCornerLatLngs */
|
|
26
26
|
/* eslint-disable max-statements */
|
|
27
|
-
function getGeoBounds({
|
|
27
|
+
function getGeoBounds({
|
|
28
|
+
face,
|
|
29
|
+
ij,
|
|
30
|
+
level
|
|
31
|
+
}: {
|
|
32
|
+
face: number;
|
|
33
|
+
ij: [number, number];
|
|
34
|
+
level: number;
|
|
35
|
+
}): Float64Array {
|
|
28
36
|
const offsets = [
|
|
29
37
|
[0, 0],
|
|
30
38
|
[0, 1],
|
|
@@ -44,7 +52,7 @@ function getGeoBounds({face, ij, level}) {
|
|
|
44
52
|
let prevLng = 0;
|
|
45
53
|
|
|
46
54
|
for (let i = 0; i < 4; i++) {
|
|
47
|
-
const offset = offsets[i].slice(0);
|
|
55
|
+
const offset = offsets[i].slice(0) as [number, number];
|
|
48
56
|
const nextOffset = offsets[i + 1];
|
|
49
57
|
const stepI = (nextOffset[0] - offset[0]) / resolution;
|
|
50
58
|
const stepJ = (nextOffset[1] - offset[1]) / resolution;
|
|
@@ -78,7 +86,7 @@ function getGeoBounds({face, ij, level}) {
|
|
|
78
86
|
}
|
|
79
87
|
/* eslint-enable max-statements */
|
|
80
88
|
|
|
81
|
-
export function getS2QuadKey(token) {
|
|
89
|
+
export function getS2QuadKey(token: string | number): string {
|
|
82
90
|
if (typeof token === 'string') {
|
|
83
91
|
if (token.indexOf('/') > 0) {
|
|
84
92
|
// is Hilbert quad key
|
|
@@ -94,11 +102,10 @@ export function getS2QuadKey(token) {
|
|
|
94
102
|
/**
|
|
95
103
|
* Get a polygon with corner coordinates for an s2 cell
|
|
96
104
|
* @param {*} cell - This can be an S2 key or token
|
|
97
|
-
* @return {
|
|
98
|
-
* - each coordinate is an array [lng, lat]
|
|
105
|
+
* @return {Float64Array} - a simple polygon in flat array format: [lng0, lat0, lng1, lat1, ...]
|
|
99
106
|
* - the polygon is closed, i.e. last coordinate is a copy of the first coordinate
|
|
100
107
|
*/
|
|
101
|
-
export function getS2Polygon(token) {
|
|
108
|
+
export function getS2Polygon(token: string | number): Float64Array {
|
|
102
109
|
const key = getS2QuadKey(token);
|
|
103
110
|
const s2cell = FromHilbertQuadKey(key);
|
|
104
111
|
|
|
@@ -1,21 +1,38 @@
|
|
|
1
1
|
import GL from '@luma.gl/constants';
|
|
2
2
|
import {Geometry} from '@luma.gl/core';
|
|
3
|
-
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Accessor,
|
|
6
|
+
Color,
|
|
7
|
+
CompositeLayer,
|
|
8
|
+
CompositeLayerProps,
|
|
9
|
+
COORDINATE_SYSTEM,
|
|
10
|
+
FilterContext,
|
|
11
|
+
GetPickingInfoParams,
|
|
12
|
+
Layer,
|
|
13
|
+
LayersList,
|
|
14
|
+
log,
|
|
15
|
+
PickingInfo,
|
|
16
|
+
UpdateParameters,
|
|
17
|
+
Viewport,
|
|
18
|
+
DefaultProps
|
|
19
|
+
} from '@deck.gl/core';
|
|
4
20
|
import {PointCloudLayer} from '@deck.gl/layers';
|
|
5
21
|
import {ScenegraphLayer} from '@deck.gl/mesh-layers';
|
|
6
|
-
import {default as
|
|
7
|
-
import {log} from '@deck.gl/core';
|
|
22
|
+
import {default as MeshLayer} from '../mesh-layer/mesh-layer';
|
|
8
23
|
|
|
9
24
|
import {load} from '@loaders.gl/core';
|
|
10
|
-
import {
|
|
25
|
+
import {MeshAttributes} from '@loaders.gl/schema';
|
|
26
|
+
import {Tileset3D, Tile3D, TILE_TYPE} from '@loaders.gl/tiles';
|
|
11
27
|
import {Tiles3DLoader} from '@loaders.gl/3d-tiles';
|
|
12
28
|
|
|
13
29
|
const SINGLE_DATA = [0];
|
|
14
30
|
|
|
15
|
-
const defaultProps = {
|
|
31
|
+
const defaultProps: DefaultProps<Tile3dLayerProps> = {
|
|
16
32
|
getPointColor: {type: 'accessor', value: [0, 0, 0, 255]},
|
|
17
33
|
pointSize: 1.0,
|
|
18
34
|
|
|
35
|
+
// @ts-expect-error Disable async data loading (handling it in _loadTileSet)
|
|
19
36
|
data: null,
|
|
20
37
|
loader: Tiles3DLoader,
|
|
21
38
|
|
|
@@ -26,7 +43,52 @@ const defaultProps = {
|
|
|
26
43
|
_getMeshColor: {type: 'function', value: tileHeader => [255, 255, 255], compare: false}
|
|
27
44
|
};
|
|
28
45
|
|
|
29
|
-
|
|
46
|
+
/** All properties supported by Tile3DLayer */
|
|
47
|
+
export type Tile3dLayerProps<DataT = any> = _Tile3dLayerProps<DataT> & CompositeLayerProps<DataT>;
|
|
48
|
+
|
|
49
|
+
/** Props added by the Tile3DLayer */
|
|
50
|
+
type _Tile3dLayerProps<DataT> = {
|
|
51
|
+
/** Color Accessor for point clouds. **/
|
|
52
|
+
getPointColor?: Accessor<DataT, Color>;
|
|
53
|
+
|
|
54
|
+
/** Global radius of all points in pixels. **/
|
|
55
|
+
pointSize?: number;
|
|
56
|
+
|
|
57
|
+
/** A loader which is used to decode the fetched tiles.
|
|
58
|
+
* @deprecated Use `loaders` instead
|
|
59
|
+
*/
|
|
60
|
+
loader?: typeof Tiles3DLoader;
|
|
61
|
+
|
|
62
|
+
/** Called when Tileset JSON file is loaded. **/
|
|
63
|
+
onTilesetLoad?: (tile: Tileset3D) => void;
|
|
64
|
+
|
|
65
|
+
/** Called when a tile in the tileset hierarchy is loaded. **/
|
|
66
|
+
onTileLoad?: (tile: Tile3D) => void;
|
|
67
|
+
|
|
68
|
+
/** Called when a tile is unloaded. **/
|
|
69
|
+
onTileUnload?: (tile: Tile3D) => void;
|
|
70
|
+
|
|
71
|
+
/** Called when a tile fails to load. **/
|
|
72
|
+
onTileError?: (tile: Tile3D, url: string, message: string) => void;
|
|
73
|
+
|
|
74
|
+
/** (Experimental) Accessor to change color of mesh based on properties. **/
|
|
75
|
+
_getMeshColor?: (tile: Tile3D) => Color;
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default class Tile3DLayer<DataT = any, ExtraPropsT = {}> extends CompositeLayer<
|
|
79
|
+
ExtraPropsT & Required<_Tile3dLayerProps<DataT>>
|
|
80
|
+
> {
|
|
81
|
+
static defaultProps = defaultProps as any;
|
|
82
|
+
static layerName = 'Tile3DLayer';
|
|
83
|
+
|
|
84
|
+
state!: {
|
|
85
|
+
activeViewports: {};
|
|
86
|
+
frameNumber?: number;
|
|
87
|
+
lastUpdatedViewports: {[viewportId: string]: Viewport} | null;
|
|
88
|
+
layerMap: {[layerId: string]: any};
|
|
89
|
+
tileset3d: Tileset3D | null;
|
|
90
|
+
};
|
|
91
|
+
|
|
30
92
|
initializeState() {
|
|
31
93
|
if ('onTileLoadFail' in this.props) {
|
|
32
94
|
log.removed('onTileLoadFail', 'onTileError')();
|
|
@@ -40,16 +102,16 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
40
102
|
};
|
|
41
103
|
}
|
|
42
104
|
|
|
43
|
-
get isLoaded() {
|
|
105
|
+
get isLoaded(): boolean {
|
|
44
106
|
const {tileset3d} = this.state;
|
|
45
|
-
return tileset3d && tileset3d.isLoaded();
|
|
107
|
+
return tileset3d !== null && tileset3d.isLoaded();
|
|
46
108
|
}
|
|
47
109
|
|
|
48
|
-
shouldUpdateState({changeFlags}) {
|
|
110
|
+
shouldUpdateState({changeFlags}: UpdateParameters<this>): boolean {
|
|
49
111
|
return changeFlags.somethingChanged;
|
|
50
112
|
}
|
|
51
113
|
|
|
52
|
-
updateState({props, oldProps, changeFlags}) {
|
|
114
|
+
updateState({props, oldProps, changeFlags}: UpdateParameters<this>): void {
|
|
53
115
|
if (props.data && props.data !== oldProps.data) {
|
|
54
116
|
this._loadTileset(props.data);
|
|
55
117
|
}
|
|
@@ -71,9 +133,9 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
71
133
|
}
|
|
72
134
|
}
|
|
73
135
|
|
|
74
|
-
activateViewport(viewport) {
|
|
136
|
+
activateViewport(viewport: Viewport): void {
|
|
75
137
|
const {activeViewports, lastUpdatedViewports} = this.state;
|
|
76
|
-
this.internalState
|
|
138
|
+
this.internalState!.viewport = viewport;
|
|
77
139
|
|
|
78
140
|
activeViewports[viewport.id] = viewport;
|
|
79
141
|
const lastViewport = lastUpdatedViewports?.[viewport.id];
|
|
@@ -83,7 +145,7 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
83
145
|
}
|
|
84
146
|
}
|
|
85
147
|
|
|
86
|
-
getPickingInfo({info, sourceLayer}) {
|
|
148
|
+
getPickingInfo({info, sourceLayer}: GetPickingInfoParams) {
|
|
87
149
|
const {layerMap} = this.state;
|
|
88
150
|
const layerId = sourceLayer && sourceLayer.id;
|
|
89
151
|
if (layerId) {
|
|
@@ -96,22 +158,24 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
96
158
|
return info;
|
|
97
159
|
}
|
|
98
160
|
|
|
99
|
-
filterSubLayer({layer, viewport}) {
|
|
100
|
-
|
|
161
|
+
filterSubLayer({layer, viewport}: FilterContext): boolean {
|
|
162
|
+
// All sublayers will have a tile prop
|
|
163
|
+
const {tile} = layer.props as unknown as {tile: Tile3D};
|
|
101
164
|
const {id: viewportId} = viewport;
|
|
102
165
|
return tile.selected && tile.viewportIds.includes(viewportId);
|
|
103
166
|
}
|
|
104
167
|
|
|
105
|
-
_updateAutoHighlight(info) {
|
|
168
|
+
protected _updateAutoHighlight(info: PickingInfo): void {
|
|
106
169
|
if (info.sourceLayer) {
|
|
107
170
|
info.sourceLayer.updateAutoHighlight(info);
|
|
108
171
|
}
|
|
109
172
|
}
|
|
110
173
|
|
|
111
|
-
async _loadTileset(tilesetUrl) {
|
|
174
|
+
private async _loadTileset(tilesetUrl) {
|
|
112
175
|
const {loadOptions = {}} = this.props;
|
|
113
176
|
|
|
114
177
|
// TODO: deprecate `loader` in v9.0
|
|
178
|
+
// @ts-ignore
|
|
115
179
|
let loader = this.props.loader || this.props.loaders;
|
|
116
180
|
if (Array.isArray(loader)) {
|
|
117
181
|
loader = loader[0];
|
|
@@ -134,7 +198,7 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
134
198
|
const tileset3d = new Tileset3D(tilesetJson, {
|
|
135
199
|
onTileLoad: this._onTileLoad.bind(this),
|
|
136
200
|
onTileUnload: this._onTileUnload.bind(this),
|
|
137
|
-
|
|
201
|
+
onTileError: this.props.onTileError,
|
|
138
202
|
...options
|
|
139
203
|
});
|
|
140
204
|
|
|
@@ -147,20 +211,23 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
147
211
|
this.props.onTilesetLoad(tileset3d);
|
|
148
212
|
}
|
|
149
213
|
|
|
150
|
-
_onTileLoad(tileHeader) {
|
|
214
|
+
private _onTileLoad(tileHeader: Tile3D): void {
|
|
151
215
|
const {lastUpdatedViewports} = this.state;
|
|
152
216
|
this.props.onTileLoad(tileHeader);
|
|
153
217
|
this._updateTileset(lastUpdatedViewports);
|
|
154
218
|
this.setNeedsUpdate();
|
|
155
219
|
}
|
|
156
220
|
|
|
157
|
-
_onTileUnload(tileHeader) {
|
|
221
|
+
private _onTileUnload(tileHeader: Tile3D): void {
|
|
158
222
|
// Was cleaned up from tileset cache. We no longer need to track it.
|
|
159
223
|
delete this.state.layerMap[tileHeader.id];
|
|
160
224
|
this.props.onTileUnload(tileHeader);
|
|
161
225
|
}
|
|
162
226
|
|
|
163
|
-
_updateTileset(viewports) {
|
|
227
|
+
private _updateTileset(viewports: {[viewportId: string]: Viewport} | null): void {
|
|
228
|
+
if (!viewports) {
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
164
231
|
const {tileset3d} = this.state;
|
|
165
232
|
const {timeline} = this.context;
|
|
166
233
|
const viewportsNumber = Object.keys(viewports).length;
|
|
@@ -175,24 +242,30 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
175
242
|
});
|
|
176
243
|
}
|
|
177
244
|
|
|
178
|
-
_getSubLayer(
|
|
245
|
+
private _getSubLayer(
|
|
246
|
+
tileHeader: Tile3D,
|
|
247
|
+
oldLayer?: Layer
|
|
248
|
+
): MeshLayer<DataT> | PointCloudLayer<DataT> | ScenegraphLayer<DataT> | null {
|
|
179
249
|
if (!tileHeader.content) {
|
|
180
250
|
return null;
|
|
181
251
|
}
|
|
182
252
|
|
|
183
253
|
switch (tileHeader.type) {
|
|
184
254
|
case TILE_TYPE.POINTCLOUD:
|
|
185
|
-
return this._makePointCloudLayer(tileHeader, oldLayer);
|
|
255
|
+
return this._makePointCloudLayer(tileHeader, oldLayer as PointCloudLayer<DataT>);
|
|
186
256
|
case TILE_TYPE.SCENEGRAPH:
|
|
187
|
-
return this._make3DModelLayer(tileHeader
|
|
257
|
+
return this._make3DModelLayer(tileHeader);
|
|
188
258
|
case TILE_TYPE.MESH:
|
|
189
|
-
return this._makeSimpleMeshLayer(tileHeader, oldLayer);
|
|
259
|
+
return this._makeSimpleMeshLayer(tileHeader, oldLayer as MeshLayer<DataT>);
|
|
190
260
|
default:
|
|
191
261
|
throw new Error(`Tile3DLayer: Failed to render layer of type ${tileHeader.content.type}`);
|
|
192
262
|
}
|
|
193
263
|
}
|
|
194
264
|
|
|
195
|
-
_makePointCloudLayer(
|
|
265
|
+
private _makePointCloudLayer(
|
|
266
|
+
tileHeader: Tile3D,
|
|
267
|
+
oldLayer?: PointCloudLayer<DataT>
|
|
268
|
+
): PointCloudLayer<DataT> | null {
|
|
196
269
|
const {attributes, pointCount, constantRGBA, cartographicOrigin, modelMatrix} =
|
|
197
270
|
tileHeader.content;
|
|
198
271
|
const {positions, normals, colors} = attributes;
|
|
@@ -233,7 +306,7 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
233
306
|
);
|
|
234
307
|
}
|
|
235
308
|
|
|
236
|
-
_make3DModelLayer(tileHeader) {
|
|
309
|
+
private _make3DModelLayer(tileHeader: Tile3D): ScenegraphLayer<DataT> {
|
|
237
310
|
const {gltf, instances, cartographicOrigin, modelMatrix} = tileHeader.content;
|
|
238
311
|
|
|
239
312
|
const SubLayerClass = this.getSubLayerClass('scenegraph', ScenegraphLayer);
|
|
@@ -261,7 +334,7 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
261
334
|
);
|
|
262
335
|
}
|
|
263
336
|
|
|
264
|
-
_makeSimpleMeshLayer(tileHeader, oldLayer) {
|
|
337
|
+
private _makeSimpleMeshLayer(tileHeader: Tile3D, oldLayer?: MeshLayer<DataT>): MeshLayer<DataT> {
|
|
265
338
|
const content = tileHeader.content;
|
|
266
339
|
const {
|
|
267
340
|
attributes,
|
|
@@ -282,7 +355,7 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
282
355
|
indices
|
|
283
356
|
});
|
|
284
357
|
|
|
285
|
-
const SubLayerClass = this.getSubLayerClass('mesh',
|
|
358
|
+
const SubLayerClass = this.getSubLayerClass('mesh', MeshLayer);
|
|
286
359
|
|
|
287
360
|
return new SubLayerClass(
|
|
288
361
|
this.getSubLayerProps({
|
|
@@ -304,13 +377,14 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
304
377
|
);
|
|
305
378
|
}
|
|
306
379
|
|
|
307
|
-
renderLayers() {
|
|
380
|
+
renderLayers(): Layer | null | LayersList {
|
|
308
381
|
const {tileset3d, layerMap} = this.state;
|
|
309
382
|
if (!tileset3d) {
|
|
310
383
|
return null;
|
|
311
384
|
}
|
|
312
385
|
|
|
313
|
-
|
|
386
|
+
// loaders.gl doesn't provide a type for tileset3d.tiles
|
|
387
|
+
return (tileset3d.tiles as Tile3D[])
|
|
314
388
|
.map(tile => {
|
|
315
389
|
const layerCache = (layerMap[tile.id] = layerMap[tile.id] || {tile});
|
|
316
390
|
let {layer} = layerCache;
|
|
@@ -332,8 +406,8 @@ export default class Tile3DLayer extends CompositeLayer {
|
|
|
332
406
|
}
|
|
333
407
|
}
|
|
334
408
|
|
|
335
|
-
function getMeshGeometry(contentAttributes) {
|
|
336
|
-
const attributes = {};
|
|
409
|
+
function getMeshGeometry(contentAttributes: MeshAttributes): MeshAttributes {
|
|
410
|
+
const attributes: MeshAttributes = {};
|
|
337
411
|
attributes.positions = {
|
|
338
412
|
...contentAttributes.positions,
|
|
339
413
|
value: new Float32Array(contentAttributes.positions.value)
|
|
@@ -352,6 +426,3 @@ function getMeshGeometry(contentAttributes) {
|
|
|
352
426
|
}
|
|
353
427
|
return attributes;
|
|
354
428
|
}
|
|
355
|
-
|
|
356
|
-
Tile3DLayer.layerName = 'Tile3DLayer';
|
|
357
|
-
Tile3DLayer.defaultProps = defaultProps;
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
UpdateParameters,
|
|
7
7
|
PickingInfo,
|
|
8
8
|
GetPickingInfoParams,
|
|
9
|
+
DefaultProps,
|
|
9
10
|
_flatten as flatten
|
|
10
11
|
} from '@deck.gl/core';
|
|
11
12
|
import {GeoJsonLayer} from '@deck.gl/layers';
|
|
@@ -16,9 +17,9 @@ import Tileset2D, {RefinementStrategy, STRATEGY_DEFAULT, Tileset2DProps} from '.
|
|
|
16
17
|
import {TileLoadProps, ZRange} from './types';
|
|
17
18
|
import {urlType, getURLFromTemplate} from './utils';
|
|
18
19
|
|
|
19
|
-
const defaultProps = {
|
|
20
|
+
const defaultProps: DefaultProps<TileLayerProps> = {
|
|
20
21
|
TilesetClass: Tileset2D,
|
|
21
|
-
data: [],
|
|
22
|
+
data: {type: 'data', value: []},
|
|
22
23
|
dataComparator: urlType.equals,
|
|
23
24
|
renderSubLayers: {type: 'function', value: props => new GeoJsonLayer(props), compare: false},
|
|
24
25
|
getTileData: {type: 'function', optional: true, value: null, compare: false},
|
|
@@ -41,7 +42,7 @@ const defaultProps = {
|
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
/** All props supported by the TileLayer */
|
|
44
|
-
export type TileLayerProps<DataT = any> =
|
|
45
|
+
export type TileLayerProps<DataT = any> = CompositeLayerProps<any> & _TileLayerProps<DataT>;
|
|
45
46
|
|
|
46
47
|
/** Props added by the TileLayer */
|
|
47
48
|
type _TileLayerProps<DataT> = {
|
|
@@ -63,10 +64,10 @@ type _TileLayerProps<DataT> = {
|
|
|
63
64
|
/**
|
|
64
65
|
* If supplied, `getTileData` is called to retrieve the data of each tile.
|
|
65
66
|
*/
|
|
66
|
-
getTileData?: (props: TileLoadProps) => Promise<DataT> | DataT;
|
|
67
|
+
getTileData?: ((props: TileLoadProps) => Promise<DataT> | DataT) | null;
|
|
67
68
|
|
|
68
69
|
/** Called when all tiles in the current viewport are loaded. */
|
|
69
|
-
onViewportLoad?: (tiles: Tile2DHeader<DataT>[]) => void;
|
|
70
|
+
onViewportLoad?: ((tiles: Tile2DHeader<DataT>[]) => void) | null;
|
|
70
71
|
|
|
71
72
|
/** Called when a tile successfully loads. */
|
|
72
73
|
onTileLoad?: (tile: Tile2DHeader<DataT>) => void;
|
|
@@ -49,7 +49,6 @@ const STRATEGIES = {
|
|
|
49
49
|
|
|
50
50
|
export type Tileset2DProps = Pick<
|
|
51
51
|
Required<TileLayerProps>,
|
|
52
|
-
| 'getTileData'
|
|
53
52
|
| 'tileSize'
|
|
54
53
|
| 'maxCacheSize'
|
|
55
54
|
| 'maxCacheByteSize'
|
|
@@ -60,6 +59,7 @@ export type Tileset2DProps = Pick<
|
|
|
60
59
|
| 'maxRequests'
|
|
61
60
|
| 'zoomOffset'
|
|
62
61
|
> & {
|
|
62
|
+
getTileData: NonNullable<TileLayerProps['getTileData']>;
|
|
63
63
|
onTileLoad: (tile: Tile2DHeader) => void;
|
|
64
64
|
onTileUnload: (tile: Tile2DHeader) => void;
|
|
65
65
|
onTileError: (error: any, tile: Tile2DHeader) => void;
|
|
@@ -19,14 +19,14 @@
|
|
|
19
19
|
// THE SOFTWARE.
|
|
20
20
|
|
|
21
21
|
import type {NumericArray} from '@math.gl/core';
|
|
22
|
-
import {AccessorFunction} from '@deck.gl/core';
|
|
22
|
+
import {AccessorFunction, DefaultProps} from '@deck.gl/core';
|
|
23
23
|
import {PathLayer, PathLayerProps} from '@deck.gl/layers';
|
|
24
24
|
|
|
25
|
-
const defaultProps = {
|
|
25
|
+
const defaultProps: DefaultProps<TripsLayerProps> = {
|
|
26
26
|
fadeTrail: true,
|
|
27
27
|
trailLength: {type: 'number', value: 120, min: 0},
|
|
28
28
|
currentTime: {type: 'number', value: 0, min: 0},
|
|
29
|
-
getTimestamps: {type: 'accessor', value:
|
|
29
|
+
getTimestamps: {type: 'accessor', value: d => d.timestamps}
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
/** All properties supported by TripsLayer. */
|
|
@@ -60,7 +60,7 @@ export default class TripsLayer<DataT = any, ExtraProps = {}> extends PathLayer<
|
|
|
60
60
|
Required<_TripsLayerProps> & ExtraProps
|
|
61
61
|
> {
|
|
62
62
|
static layerName = 'TripsLayer';
|
|
63
|
-
static defaultProps
|
|
63
|
+
static defaultProps = defaultProps;
|
|
64
64
|
|
|
65
65
|
getShaders() {
|
|
66
66
|
const shaders = super.getShaders();
|
|
@@ -1,45 +1,10 @@
|
|
|
1
|
-
import { CompositeLayer, CompositeLayerProps, Layer, LayersList } from '@deck.gl/core/typed';
|
|
1
|
+
import { CompositeLayer, CompositeLayerProps, Layer, LayersList, DefaultProps } from '@deck.gl/core/typed';
|
|
2
2
|
import { PolygonLayerProps } from '@deck.gl/layers/typed';
|
|
3
3
|
/** All properties supported by GeoCellLayer. */
|
|
4
4
|
export declare type GeoCellLayerProps<DataT = any> = PolygonLayerProps<DataT> & CompositeLayerProps<DataT>;
|
|
5
5
|
export default class GeoCellLayer<DataT = any, ExtraProps = {}> extends CompositeLayer<Required<GeoCellLayerProps<DataT>> & ExtraProps> {
|
|
6
6
|
static layerName: string;
|
|
7
|
-
static defaultProps:
|
|
8
|
-
stroked: boolean;
|
|
9
|
-
filled: boolean;
|
|
10
|
-
extruded: boolean;
|
|
11
|
-
elevationScale: number;
|
|
12
|
-
wireframe: boolean;
|
|
13
|
-
_normalize: boolean;
|
|
14
|
-
_windingOrder: string;
|
|
15
|
-
lineWidthUnits: string;
|
|
16
|
-
lineWidthScale: number;
|
|
17
|
-
lineWidthMinPixels: number;
|
|
18
|
-
lineWidthMaxPixels: number;
|
|
19
|
-
lineJointRounded: boolean;
|
|
20
|
-
lineMiterLimit: number;
|
|
21
|
-
getPolygon: {
|
|
22
|
-
type: string;
|
|
23
|
-
value: (f: any) => any;
|
|
24
|
-
};
|
|
25
|
-
getFillColor: {
|
|
26
|
-
type: string;
|
|
27
|
-
value: number[];
|
|
28
|
-
};
|
|
29
|
-
getLineColor: {
|
|
30
|
-
type: string;
|
|
31
|
-
value: number[];
|
|
32
|
-
};
|
|
33
|
-
getLineWidth: {
|
|
34
|
-
type: string;
|
|
35
|
-
value: number;
|
|
36
|
-
};
|
|
37
|
-
getElevation: {
|
|
38
|
-
type: string;
|
|
39
|
-
value: number;
|
|
40
|
-
};
|
|
41
|
-
material: boolean;
|
|
42
|
-
};
|
|
7
|
+
static defaultProps: DefaultProps<GeoCellLayerProps<any>>;
|
|
43
8
|
/** Implement to generate props to create geometry. */
|
|
44
9
|
indexToBounds(): Partial<GeoCellLayer['props']> | null;
|
|
45
10
|
renderLayers(): Layer | null | LayersList;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"GeoCellLayer.d.ts","sourceRoot":"","sources":["../../src/geo-cell-layer/GeoCellLayer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,cAAc,EAAE,mBAAmB,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAC,MAAM,eAAe,CAAC;AACnG,OAAO,EAAe,iBAAiB,EAAC,MAAM,iBAAiB,CAAC;AAMhE,gDAAgD;AAChD,oBAAY,iBAAiB,CAAC,KAAK,GAAG,GAAG,IAAI,iBAAiB,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAEnG,MAAM,CAAC,OAAO,OAAO,YAAY,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,cAAc,CACpF,QAAQ,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAChD;IACC,MAAM,CAAC,SAAS,SAAkB;IAClC,MAAM,CAAC,YAAY,uCAAgB;IAEnC,sDAAsD;IACtD,aAAa,IAAI,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI;IAItD,YAAY,IAAI,KAAK,GAAG,IAAI,GAAG,UAAU;CA+D1C"}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { ArcLayer, ArcLayerProps } from '@deck.gl/layers/typed';
|
|
2
|
+
/** All properties supported by GreatCircleLayer. */
|
|
3
|
+
export declare type GreatCircleLayerProps<DataT = any> = ArcLayerProps<DataT>;
|
|
4
|
+
/** @deprecated Use ArcLayer with `greatCircle: true` instead */
|
|
5
|
+
export default class GreatCircleLayer<DataT = any, ExtraProps = {}> extends ArcLayer<DataT, ExtraProps> {
|
|
6
|
+
static layerName: string;
|
|
7
|
+
static defaultProps: any;
|
|
3
8
|
}
|
|
4
|
-
declare namespace GreatCircleLayer {
|
|
5
|
-
const layerName: string;
|
|
6
|
-
namespace defaultProps {
|
|
7
|
-
namespace getHeight {
|
|
8
|
-
const type: string;
|
|
9
|
-
const value: number;
|
|
10
|
-
}
|
|
11
|
-
const greatCircle: boolean;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export default GreatCircleLayer;
|
|
15
|
-
import { ArcLayer } from '@deck.gl/layers/typed';
|
|
16
9
|
//# sourceMappingURL=great-circle-layer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"great-circle-layer.d.ts","sourceRoot":"","sources":["../../src/great-circle-layer/great-circle-layer.
|
|
1
|
+
{"version":3,"file":"great-circle-layer.d.ts","sourceRoot":"","sources":["../../src/great-circle-layer/great-circle-layer.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAC,QAAQ,EAAE,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAOxD,oDAAoD;AACpD,oBAAY,qBAAqB,CAAC,KAAK,GAAG,GAAG,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC;AAItE,gEAAgE;AAChE,MAAM,CAAC,OAAO,OAAO,gBAAgB,CAAC,KAAK,GAAG,GAAG,EAAE,UAAU,GAAG,EAAE,CAAE,SAAQ,QAAQ,CAClF,KAAK,EACL,UAAU,CACX;IACC,MAAM,CAAC,SAAS,SAAsB;IACtC,MAAM,CAAC,YAAY,EAAE,GAAG,CAAgB;CACzC"}
|