@tomorrowevening/hermes 0.0.136 → 0.0.137
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/hermes.cjs.js +19 -19
- package/dist/hermes.es.js +1916 -1979
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/types/core/Application.d.ts +63 -27
- package/types/editor/ThreeEditor.d.ts +13 -11
- package/types/editor/multiView/MultiView.d.ts +120 -117
- package/types/editor/sidePanel/Accordion.d.ts +13 -11
- package/types/editor/sidePanel/DebugData.d.ts +27 -24
- package/types/editor/sidePanel/inspector/InspectorGroup.d.ts +26 -23
- package/types/editor/sidePanel/inspector/SceneInspector.d.ts +7 -5
- package/types/editor/sidePanel/inspector/utils/InspectAnimation.d.ts +10 -8
- package/types/editor/sidePanel/inspector/utils/InspectCamera.d.ts +4 -3
- package/types/editor/sidePanel/inspector/utils/InspectLight.d.ts +4 -3
- package/types/editor/sidePanel/inspector/utils/InspectMaterial.d.ts +10 -9
- package/types/editor/sidePanel/inspector/utils/InspectRenderer.d.ts +31 -28
- package/types/editor/sidePanel/inspector/utils/InspectTransform.d.ts +30 -27
- package/types/editor/sidePanel/types.d.ts +120 -116
- package/types/editor/tools/Transform.d.ts +25 -23
- package/types/editor/tools/splineEditor/index.d.ts +29 -27
- package/types/index.d.ts +33 -35
- package/types/utils/detectSettings.d.ts +16 -16
- package/types/core/RemoteController.d.ts +0 -9
- package/types/editor/global.d.ts +0 -28
@@ -1,24 +1,27 @@
|
|
1
|
-
import { Component, ReactNode, RefObject } from 'react';
|
2
|
-
import
|
3
|
-
import
|
4
|
-
import
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
static
|
15
|
-
static
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
1
|
+
import { Component, ReactNode, RefObject } from 'react';
|
2
|
+
import Application from '@/core/Application';
|
3
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
4
|
+
import { GroupData } from '@/core/types';
|
5
|
+
import InspectorGroup from './inspector/InspectorGroup';
|
6
|
+
interface DebugDataProps {
|
7
|
+
app: Application;
|
8
|
+
three: RemoteThree;
|
9
|
+
}
|
10
|
+
type DebugDataState = {
|
11
|
+
lastUpdate: number;
|
12
|
+
};
|
13
|
+
export default class DebugData extends Component<DebugDataProps, DebugDataState> {
|
14
|
+
static instance: DebugData;
|
15
|
+
static groups: JSX.Element[];
|
16
|
+
static groupsRefs: RefObject<InspectorGroup>[];
|
17
|
+
static groupTitles: string[];
|
18
|
+
static app: Application;
|
19
|
+
constructor(props: DebugDataProps);
|
20
|
+
componentWillUnmount(): void;
|
21
|
+
render(): ReactNode;
|
22
|
+
private addGroup;
|
23
|
+
private removeGroup;
|
24
|
+
static addEditorGroup(data: GroupData): RefObject<InspectorGroup> | null;
|
25
|
+
static removeEditorGroup(name: string): void;
|
26
|
+
}
|
27
|
+
export {};
|
@@ -1,23 +1,26 @@
|
|
1
|
-
import { Component, ReactNode, RefObject } from 'react';
|
2
|
-
import { InspectorFieldProps } from './InspectorField';
|
3
|
-
import { GroupData } from '@/core/types';
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
1
|
+
import { Component, ReactNode, RefObject } from 'react';
|
2
|
+
import { InspectorFieldProps } from './InspectorField';
|
3
|
+
import { GroupData } from '@/core/types';
|
4
|
+
import Application from '@/core/Application';
|
5
|
+
export interface InspectorGroupProps {
|
6
|
+
app: Application;
|
7
|
+
title: string;
|
8
|
+
expanded?: boolean;
|
9
|
+
items: InspectorFieldProps[] | InspectorGroupProps[];
|
10
|
+
onToggle?: (value: boolean) => void;
|
11
|
+
}
|
12
|
+
type InspectorGroupState = {
|
13
|
+
lastUpdated: number;
|
14
|
+
};
|
15
|
+
export default class InspectorGroup extends Component<InspectorGroupProps, InspectorGroupState> {
|
16
|
+
subgroupNames: string[];
|
17
|
+
subgroupElements: JSX.Element[];
|
18
|
+
valueOverrides: Map<string, any>;
|
19
|
+
app: Application;
|
20
|
+
constructor(props: InspectorGroupProps);
|
21
|
+
addGroup(data: GroupData): RefObject<InspectorGroup>;
|
22
|
+
removeGroup(name: string): void;
|
23
|
+
setField(name: string, value: any): void;
|
24
|
+
render(): ReactNode;
|
25
|
+
}
|
26
|
+
export {};
|
@@ -1,5 +1,7 @@
|
|
1
|
-
import
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
import Application from '@/core/Application';
|
2
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
3
|
+
export interface SceneInspectorProps {
|
4
|
+
app: Application;
|
5
|
+
three: RemoteThree;
|
6
|
+
}
|
7
|
+
export default function SceneInspector(props: SceneInspectorProps): null;
|
@@ -1,8 +1,10 @@
|
|
1
|
-
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
-
import { RemoteObject } from '../../types';
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
+
import { RemoteObject } from '../../types';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
type InspectAnimationProps = {
|
5
|
+
app: Application;
|
6
|
+
object: RemoteObject;
|
7
|
+
three: RemoteThree;
|
8
|
+
};
|
9
|
+
export default function InspectAnimation(props: InspectAnimationProps): import("react/jsx-runtime").JSX.Element;
|
10
|
+
export {};
|
@@ -1,3 +1,4 @@
|
|
1
|
-
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
-
import { RemoteObject } from '../../types';
|
3
|
-
|
1
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
+
import { RemoteObject } from '../../types';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
export declare function InspectCamera(object: RemoteObject, app: Application, three: RemoteThree): any;
|
@@ -1,3 +1,4 @@
|
|
1
|
-
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
-
import { RemoteObject } from '../../types';
|
3
|
-
|
1
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
2
|
+
import { RemoteObject } from '../../types';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
export declare function InspectLight(object: RemoteObject, app: Application, three: RemoteThree): import("react/jsx-runtime").JSX.Element;
|
@@ -1,9 +1,10 @@
|
|
1
|
-
import { RemoteMaterial, RemoteObject } from '../../types';
|
2
|
-
import RemoteThree from '@/core/remote/RemoteThree';
|
3
|
-
|
4
|
-
export declare function
|
5
|
-
export declare function
|
6
|
-
export declare function
|
7
|
-
export declare function
|
8
|
-
export declare function
|
9
|
-
export declare function
|
1
|
+
import { RemoteMaterial, RemoteObject } from '../../types';
|
2
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
export declare function acceptedMaterialNames(name: string): boolean;
|
5
|
+
export declare function imageNames(name: string): string;
|
6
|
+
export declare function prettyName(name: string): string;
|
7
|
+
export declare function clampedNames(name: string): boolean;
|
8
|
+
export declare function uploadLocalImage(): Promise<string>;
|
9
|
+
export declare function inspectMaterialItems(material: RemoteMaterial, object: RemoteObject, three: RemoteThree): any[];
|
10
|
+
export declare function InspectMaterial(object: RemoteObject, app: Application, three: RemoteThree): any;
|
@@ -1,28 +1,31 @@
|
|
1
|
-
import { Component, ReactNode } from 'react';
|
2
|
-
import
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
private
|
14
|
-
private
|
15
|
-
private
|
16
|
-
private
|
17
|
-
private
|
18
|
-
private
|
19
|
-
private
|
20
|
-
private
|
21
|
-
|
22
|
-
|
23
|
-
private
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
1
|
+
import { Component, ReactNode } from 'react';
|
2
|
+
import Application from '@/core/Application';
|
3
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
4
|
+
type InspectRendererProps = {
|
5
|
+
app: Application;
|
6
|
+
three: RemoteThree;
|
7
|
+
};
|
8
|
+
type InspectRendererState = {
|
9
|
+
expanded: boolean;
|
10
|
+
lastUpdated: number;
|
11
|
+
};
|
12
|
+
export default class InspectRenderer extends Component<InspectRendererProps, InspectRendererState> {
|
13
|
+
private app;
|
14
|
+
private autoClear;
|
15
|
+
private autoClearColor;
|
16
|
+
private autoClearDepth;
|
17
|
+
private autoClearStencil;
|
18
|
+
private outputColorSpace;
|
19
|
+
private localClippingEnabled;
|
20
|
+
private clearColor;
|
21
|
+
private clearAlpha;
|
22
|
+
private toneMapping;
|
23
|
+
private toneMappingExposure;
|
24
|
+
constructor(props: InspectRendererProps);
|
25
|
+
componentwillunmount(): void;
|
26
|
+
private onAddRenderer;
|
27
|
+
render(): ReactNode;
|
28
|
+
private saveExpanded;
|
29
|
+
get expandedName(): string;
|
30
|
+
}
|
31
|
+
export {};
|
@@ -1,27 +1,30 @@
|
|
1
|
-
import { Euler, Matrix4, Vector3 } from 'three';
|
2
|
-
import { Component, ReactNode } from 'react';
|
3
|
-
import { RemoteObject } from '../../types';
|
4
|
-
import RemoteThree from '@/core/remote/RemoteThree';
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
1
|
+
import { Euler, Matrix4, Vector3 } from 'three';
|
2
|
+
import { Component, ReactNode } from 'react';
|
3
|
+
import { RemoteObject } from '../../types';
|
4
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
5
|
+
import Application from '@/core/Application';
|
6
|
+
type InspectTransformProps = {
|
7
|
+
app: Application;
|
8
|
+
object: RemoteObject;
|
9
|
+
three: RemoteThree;
|
10
|
+
};
|
11
|
+
type InspectTransformState = {
|
12
|
+
lastUpdated: number;
|
13
|
+
expanded: boolean;
|
14
|
+
};
|
15
|
+
export declare class InspectTransform extends Component<InspectTransformProps, InspectTransformState> {
|
16
|
+
static instance: InspectTransform;
|
17
|
+
app: Application;
|
18
|
+
matrix: Matrix4;
|
19
|
+
position: Vector3;
|
20
|
+
rotation: Euler;
|
21
|
+
scale: Vector3;
|
22
|
+
open: boolean;
|
23
|
+
constructor(props: InspectTransformProps);
|
24
|
+
update(): void;
|
25
|
+
render(): ReactNode;
|
26
|
+
private updateTransform;
|
27
|
+
private saveExpanded;
|
28
|
+
get expandedName(): string;
|
29
|
+
}
|
30
|
+
export {};
|
@@ -1,116 +1,120 @@
|
|
1
|
-
import
|
2
|
-
import
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
1
|
+
import Application from '@/core/Application';
|
2
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
3
|
+
import { Color } from 'three';
|
4
|
+
export interface CoreComponentProps {
|
5
|
+
app: Application;
|
6
|
+
class?: string;
|
7
|
+
three: RemoteThree;
|
8
|
+
}
|
9
|
+
export interface ChildObjectProps extends CoreComponentProps {
|
10
|
+
app: Application;
|
11
|
+
child?: RemoteObject;
|
12
|
+
scene?: RemoteObject;
|
13
|
+
three: RemoteThree;
|
14
|
+
}
|
15
|
+
export interface SidePanelState {
|
16
|
+
app: Application;
|
17
|
+
scene?: RemoteObject;
|
18
|
+
three: RemoteThree;
|
19
|
+
}
|
20
|
+
export interface MinimumObject {
|
21
|
+
name: string;
|
22
|
+
uuid: string;
|
23
|
+
type: string;
|
24
|
+
children: MinimumObject[];
|
25
|
+
}
|
26
|
+
export interface RemoteMaterial {
|
27
|
+
blending: number;
|
28
|
+
blendSrc: number;
|
29
|
+
blendDst: number;
|
30
|
+
blendEquation: number;
|
31
|
+
blendColor: Color;
|
32
|
+
blendAlpha: number;
|
33
|
+
depthFunc: number;
|
34
|
+
depthTest: boolean;
|
35
|
+
depthWrite: boolean;
|
36
|
+
stencilWriteMask: number;
|
37
|
+
stencilFunc: number;
|
38
|
+
stencilRef: number;
|
39
|
+
stencilFuncMask: number;
|
40
|
+
stencilFail: number;
|
41
|
+
stencilZFail: number;
|
42
|
+
stencilZPass: number;
|
43
|
+
stencilWrite: boolean;
|
44
|
+
clipIntersection: boolean;
|
45
|
+
polygonOffset: boolean;
|
46
|
+
polygonOffsetFactor: number;
|
47
|
+
polygonOffsetUnits: number;
|
48
|
+
dithering: boolean;
|
49
|
+
name: string;
|
50
|
+
opacity: number;
|
51
|
+
premultipliedAlpha: boolean;
|
52
|
+
side: number;
|
53
|
+
toneMapped: boolean;
|
54
|
+
transparent: boolean;
|
55
|
+
type: string;
|
56
|
+
uuid: string;
|
57
|
+
vertexColors: boolean;
|
58
|
+
defines: any;
|
59
|
+
extensions: any;
|
60
|
+
uniforms: any;
|
61
|
+
anisotropy: number;
|
62
|
+
attenuationDistance: number;
|
63
|
+
clearcoat: number;
|
64
|
+
dispersion: number;
|
65
|
+
iridescence: number;
|
66
|
+
sheen: number;
|
67
|
+
gradientMap: any;
|
68
|
+
color?: Color;
|
69
|
+
attenuationColor?: Color;
|
70
|
+
sheenColor?: Color;
|
71
|
+
specularColor?: Color;
|
72
|
+
}
|
73
|
+
export interface AnimationClipInfo {
|
74
|
+
name: string;
|
75
|
+
duration: number;
|
76
|
+
blendMode: number;
|
77
|
+
}
|
78
|
+
export interface PerspectiveCameraInfo {
|
79
|
+
fov: number;
|
80
|
+
zoom: number;
|
81
|
+
near: number;
|
82
|
+
far: number;
|
83
|
+
focus: number;
|
84
|
+
aspect: number;
|
85
|
+
filmGauge: number;
|
86
|
+
filmOffset: number;
|
87
|
+
}
|
88
|
+
export interface OrthographicCameraInfo {
|
89
|
+
zoom: number;
|
90
|
+
near: number;
|
91
|
+
far: number;
|
92
|
+
left: number;
|
93
|
+
right: number;
|
94
|
+
top: number;
|
95
|
+
bottom: number;
|
96
|
+
}
|
97
|
+
export interface LightInfo {
|
98
|
+
color: Color;
|
99
|
+
intensity: number;
|
100
|
+
decay?: number;
|
101
|
+
distance?: number;
|
102
|
+
width?: number;
|
103
|
+
height?: number;
|
104
|
+
angle?: number;
|
105
|
+
penumbra?: number;
|
106
|
+
groundColor?: Color;
|
107
|
+
}
|
108
|
+
export interface RemoteObject {
|
109
|
+
name: string;
|
110
|
+
uuid: string;
|
111
|
+
type: string;
|
112
|
+
visible: boolean;
|
113
|
+
matrix: number[];
|
114
|
+
animations: AnimationClipInfo[];
|
115
|
+
material?: RemoteMaterial | RemoteMaterial[];
|
116
|
+
perspectiveCameraInfo?: PerspectiveCameraInfo;
|
117
|
+
orthographicCameraInfo?: OrthographicCameraInfo;
|
118
|
+
lightInfo?: LightInfo;
|
119
|
+
children: RemoteObject[];
|
120
|
+
}
|
@@ -1,23 +1,25 @@
|
|
1
|
-
import { Camera, EventDispatcher } from 'three';
|
2
|
-
import { TransformControls } from 'three/examples/jsm/controls/TransformControls';
|
3
|
-
import
|
4
|
-
|
5
|
-
|
6
|
-
static
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
1
|
+
import { Camera, EventDispatcher } from 'three';
|
2
|
+
import { TransformControls } from 'three/examples/jsm/controls/TransformControls';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
import RemoteThree from '@/core/remote/RemoteThree';
|
5
|
+
export default class Transform extends EventDispatcher {
|
6
|
+
static DRAG_START: string;
|
7
|
+
static DRAG_END: string;
|
8
|
+
private static _instance;
|
9
|
+
app: Application;
|
10
|
+
three: RemoteThree;
|
11
|
+
activeCamera: Camera;
|
12
|
+
controls: Map<string, TransformControls>;
|
13
|
+
private visibility;
|
14
|
+
setApp(app: Application, three: RemoteThree): void;
|
15
|
+
clear(): void;
|
16
|
+
add(name: string): TransformControls;
|
17
|
+
get(name: string): TransformControls | undefined;
|
18
|
+
remove(name: string): boolean;
|
19
|
+
enabled(value: boolean): void;
|
20
|
+
updateCamera(camera: Camera, element: HTMLElement): void;
|
21
|
+
show(): void;
|
22
|
+
hide(): void;
|
23
|
+
private setScene;
|
24
|
+
static get instance(): Transform;
|
25
|
+
}
|
@@ -1,27 +1,29 @@
|
|
1
|
-
import { Camera, CatmullRomCurve3, Object3D, Vector3 } from 'three';
|
2
|
-
import Spline from './Spline';
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
1
|
+
import { Camera, CatmullRomCurve3, Object3D, Vector3 } from 'three';
|
2
|
+
import Spline from './Spline';
|
3
|
+
import Application from '@/core/Application';
|
4
|
+
export type SplineJSON = {
|
5
|
+
name: string;
|
6
|
+
points: Array<number[]>;
|
7
|
+
tension: number;
|
8
|
+
closed: boolean;
|
9
|
+
subdivide: number;
|
10
|
+
type: string;
|
11
|
+
};
|
12
|
+
export default class SplineEditor extends Object3D {
|
13
|
+
defaultScale: number;
|
14
|
+
private _camera;
|
15
|
+
private group;
|
16
|
+
private app;
|
17
|
+
constructor(camera: Camera, app: Application);
|
18
|
+
initDebug(): void;
|
19
|
+
dispose(): void;
|
20
|
+
addSpline(spline: Spline): void;
|
21
|
+
createSpline: (defaultPoints?: Array<Vector3>) => Spline;
|
22
|
+
createSplineFromArray: (points: Array<number[]>) => Spline;
|
23
|
+
createSplineFromCatmullRom: (curve: CatmullRomCurve3) => Spline;
|
24
|
+
createSplineFromJSON: (data: SplineJSON) => Spline;
|
25
|
+
showPoints: (visible?: boolean) => void;
|
26
|
+
private onAddSpline;
|
27
|
+
get camera(): Camera;
|
28
|
+
set camera(value: Camera);
|
29
|
+
}
|