angular-three-postprocessing 1.6.0 → 2.0.0-beta.3
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/README.md +4 -12
- package/effect-composer.d.ts +53 -0
- package/effect.d.ts +24 -0
- package/effects/bloom/bloom.d.ts +8 -0
- package/effects/{lib/brightness-contrast → brightness-contrast}/brightness-contrast.d.ts +1 -2
- package/effects/{lib/color-depth → color-depth}/color-depth.d.ts +1 -2
- package/effects/{lib/depth → depth}/depth.d.ts +1 -2
- package/effects/{lib/dot-screen → dot-screen}/dot-screen.d.ts +1 -2
- package/effects/{lib/hue-saturation → hue-saturation}/hue-saturation.d.ts +1 -2
- package/effects/index.d.ts +16 -14
- package/effects/lut/lut.d.ts +19 -0
- package/effects/{lib/noise → noise}/noise.d.ts +2 -3
- package/effects/{lib/scanline → scanline}/scanline.d.ts +2 -3
- package/effects/{lib/sepia → sepia}/sepia.d.ts +1 -2
- package/effects/shock-wave/shock-wave.d.ts +7 -0
- package/effects/smaa/smaa.d.ts +7 -0
- package/effects/ssao/ssao.d.ts +38 -0
- package/effects/tilt-shift/tilt-shift.d.ts +8 -0
- package/effects/tone-mapping/tone-mapping.d.ts +7 -0
- package/effects/{lib/vignette → vignette}/vignette.d.ts +1 -2
- package/esm2022/angular-three-postprocessing.mjs +1 -1
- package/esm2022/effect-composer.mjs +242 -0
- package/esm2022/effect.mjs +79 -0
- package/esm2022/effects/angular-three-postprocessing-effects.mjs +1 -1
- package/esm2022/effects/bloom/bloom.mjs +34 -0
- package/esm2022/effects/brightness-contrast/brightness-contrast.mjs +30 -0
- package/esm2022/effects/color-depth/color-depth.mjs +30 -0
- package/esm2022/effects/depth/depth.mjs +30 -0
- package/esm2022/effects/dot-screen/dot-screen.mjs +30 -0
- package/esm2022/effects/hue-saturation/hue-saturation.mjs +30 -0
- package/esm2022/effects/index.mjs +17 -15
- package/esm2022/effects/lut/lut.mjs +77 -0
- package/esm2022/effects/noise/noise.mjs +34 -0
- package/esm2022/effects/scanline/scanline.mjs +34 -0
- package/esm2022/effects/sepia/sepia.mjs +30 -0
- package/esm2022/effects/shock-wave/shock-wave.mjs +30 -0
- package/esm2022/effects/smaa/smaa.mjs +30 -0
- package/esm2022/effects/ssao/ssao.mjs +189 -0
- package/esm2022/effects/tilt-shift/tilt-shift.mjs +34 -0
- package/esm2022/effects/tone-mapping/tone-mapping.mjs +30 -0
- package/esm2022/effects/vignette/vignette.mjs +30 -0
- package/esm2022/index.mjs +3 -3
- package/fesm2022/angular-three-postprocessing-effects.mjs +359 -224
- package/fesm2022/angular-three-postprocessing-effects.mjs.map +1 -1
- package/fesm2022/angular-three-postprocessing.mjs +163 -162
- package/fesm2022/angular-three-postprocessing.mjs.map +1 -1
- package/index.d.ts +2 -2
- package/package.json +6 -14
- package/plugin/package.json +1 -1
- package/plugin/src/generators/init/compat.js.map +1 -1
- package/plugin/src/generators/init/init.d.ts +1 -1
- package/plugin/src/generators/init/init.js +14 -18
- package/plugin/src/generators/init/init.js.map +1 -1
- package/plugin/src/index.js.map +1 -1
- package/effects/lib/bloom/bloom.d.ts +0 -9
- package/effects/lib/lut/lut.d.ts +0 -13
- package/effects/lib/ssao/ssao.d.ts +0 -13
- package/effects/lib/tilt-shift/tilt-shift.d.ts +0 -9
- package/effects/lib/tone-mapping/tone-mapping.d.ts +0 -8
- package/esm2022/effects/lib/bloom/bloom.mjs +0 -44
- package/esm2022/effects/lib/brightness-contrast/brightness-contrast.mjs +0 -29
- package/esm2022/effects/lib/color-depth/color-depth.mjs +0 -29
- package/esm2022/effects/lib/depth/depth.mjs +0 -29
- package/esm2022/effects/lib/dot-screen/dot-screen.mjs +0 -29
- package/esm2022/effects/lib/hue-saturation/hue-saturation.mjs +0 -29
- package/esm2022/effects/lib/lut/lut.mjs +0 -60
- package/esm2022/effects/lib/noise/noise.mjs +0 -33
- package/esm2022/effects/lib/scanline/scanline.mjs +0 -33
- package/esm2022/effects/lib/sepia/sepia.mjs +0 -29
- package/esm2022/effects/lib/ssao/ssao.mjs +0 -102
- package/esm2022/effects/lib/tilt-shift/tilt-shift.mjs +0 -43
- package/esm2022/effects/lib/tone-mapping/tone-mapping.mjs +0 -39
- package/esm2022/effects/lib/vignette/vignette.mjs +0 -29
- package/esm2022/lib/effect-composer.mjs +0 -241
- package/esm2022/lib/effect.mjs +0 -80
- package/esm2022/selection/angular-three-postprocessing-selection.mjs +0 -5
- package/esm2022/selection/index.mjs +0 -3
- package/esm2022/selection/lib/select.mjs +0 -69
- package/esm2022/selection/lib/selection.mjs +0 -44
- package/fesm2022/angular-three-postprocessing-selection.mjs +0 -114
- package/fesm2022/angular-three-postprocessing-selection.mjs.map +0 -1
- package/lib/effect-composer.d.ts +0 -39
- package/lib/effect.d.ts +0 -22
- package/selection/README.md +0 -3
- package/selection/index.d.ts +0 -2
- package/selection/lib/select.d.ts +0 -14
- package/selection/lib/selection.d.ts +0 -18
package/README.md
CHANGED
|
@@ -1,15 +1,7 @@
|
|
|
1
|
-
#
|
|
1
|
+
# postprocessing
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This library was generated with [Nx](https://nx.dev).
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
ng add angular-three-postprocessing
|
|
7
|
-
```
|
|
5
|
+
## Running unit tests
|
|
8
6
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
Read more about Angular Three Postprocessing usages in [TBD: Documentations](#)
|
|
12
|
-
|
|
13
|
-
## Contributions
|
|
14
|
-
|
|
15
|
-
Contributions are welcomed
|
|
7
|
+
Run `nx test postprocessing` to execute the unit tests.
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { InjectionToken, Signal } from '@angular/core';
|
|
2
|
+
import { NgtSignalStore } from 'angular-three';
|
|
3
|
+
import { DepthDownsamplingPass, EffectComposer, NormalPass } from 'postprocessing';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
export interface NgtpEffectComposerState {
|
|
7
|
+
enabled: boolean;
|
|
8
|
+
depthBuffer?: boolean;
|
|
9
|
+
disableNormalPass?: boolean;
|
|
10
|
+
stencilBuffer?: boolean;
|
|
11
|
+
autoClear: boolean;
|
|
12
|
+
resolutionScale?: number;
|
|
13
|
+
multisampling: number;
|
|
14
|
+
frameBufferType: THREE.TextureDataType;
|
|
15
|
+
renderPriority: number;
|
|
16
|
+
camera?: THREE.Camera;
|
|
17
|
+
scene?: THREE.Scene;
|
|
18
|
+
}
|
|
19
|
+
export interface NgtpEffectComposerApi {
|
|
20
|
+
composer: EffectComposer;
|
|
21
|
+
normalPass: NormalPass | null;
|
|
22
|
+
downSamplingPass: DepthDownsamplingPass | null;
|
|
23
|
+
camera: THREE.Camera;
|
|
24
|
+
scene: THREE.Scene;
|
|
25
|
+
resolutionScale?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare const NGTP_EFFECT_COMPOSER_API: InjectionToken<Signal<NgtpEffectComposerApi>>;
|
|
28
|
+
export declare class NgtpEffectComposer extends NgtSignalStore<NgtpEffectComposerState> {
|
|
29
|
+
#private;
|
|
30
|
+
readonly composerRef: import("angular-three").NgtInjectedRef<THREE.Group>;
|
|
31
|
+
set enabled(enabled: boolean);
|
|
32
|
+
set depthBuffer(depthBuffer: boolean);
|
|
33
|
+
set disableNormalPass(disableNormalPass: boolean);
|
|
34
|
+
set stencilBuffer(stencilBuffer: boolean);
|
|
35
|
+
set autoClear(autoClear: boolean);
|
|
36
|
+
set resolutionScale(resolutionScale: number);
|
|
37
|
+
set multisampling(multisampling: number);
|
|
38
|
+
set frameBufferType(frameBufferType: THREE.TextureDataType);
|
|
39
|
+
set renderPriority(renderPriority: number);
|
|
40
|
+
set camera(camera: THREE.Camera);
|
|
41
|
+
set scene(scene: THREE.Scene);
|
|
42
|
+
readonly api: Signal<{
|
|
43
|
+
composer: EffectComposer;
|
|
44
|
+
normalPass: NormalPass | null;
|
|
45
|
+
downSamplingPass: DepthDownsamplingPass | null;
|
|
46
|
+
resolutionScale: number | undefined;
|
|
47
|
+
camera: THREE.Camera;
|
|
48
|
+
scene: THREE.Scene;
|
|
49
|
+
}>;
|
|
50
|
+
constructor();
|
|
51
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpEffectComposer, never>;
|
|
52
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpEffectComposer, "ngtp-effect-composer", never, { "enabled": { "alias": "enabled"; "required": false; }; "depthBuffer": { "alias": "depthBuffer"; "required": false; }; "disableNormalPass": { "alias": "disableNormalPass"; "required": false; }; "stencilBuffer": { "alias": "stencilBuffer"; "required": false; }; "autoClear": { "alias": "autoClear"; "required": false; }; "resolutionScale": { "alias": "resolutionScale"; "required": false; }; "multisampling": { "alias": "multisampling"; "required": false; }; "frameBufferType": { "alias": "frameBufferType"; "required": false; }; "renderPriority": { "alias": "renderPriority"; "required": false; }; "camera": { "alias": "camera"; "required": false; }; "scene": { "alias": "scene"; "required": false; }; }, {}, never, ["*"], true, never>;
|
|
53
|
+
}
|
package/effect.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { NgtSignalStore, NgtStore } from 'angular-three';
|
|
2
|
+
import { BlendFunction, Effect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare abstract class NgtpEffect<T extends Effect> extends NgtSignalStore<{
|
|
5
|
+
blendFunction?: BlendFunction;
|
|
6
|
+
opacity?: number;
|
|
7
|
+
}> {
|
|
8
|
+
#private;
|
|
9
|
+
effectRef: import("angular-three").NgtInjectedRef<T>;
|
|
10
|
+
set blendFunction(blendFunction: BlendFunction);
|
|
11
|
+
set opacity(opacity: number);
|
|
12
|
+
protected defaultBlendFunction: BlendFunction;
|
|
13
|
+
protected nativeArgs: () => never[];
|
|
14
|
+
readonly effectBlendFunction: import("@angular/core").Signal<BlendFunction | undefined>;
|
|
15
|
+
readonly effectOpacity: import("@angular/core").Signal<number | undefined>;
|
|
16
|
+
protected readonly store: NgtStore;
|
|
17
|
+
protected readonly camera: import("@angular/core").Signal<import("angular-three").NgtCameraManual>;
|
|
18
|
+
protected readonly args: import("@angular/core").Signal<{
|
|
19
|
+
[x: string]: any;
|
|
20
|
+
}[]>;
|
|
21
|
+
constructor();
|
|
22
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpEffect<any>, never>;
|
|
23
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgtpEffect<any>, never, never, { "effectRef": { "alias": "effectRef"; "required": false; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "opacity": { "alias": "opacity"; "required": false; }; }, {}, never, never, false, never>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NgtpEffect } from 'angular-three-postprocessing';
|
|
2
|
+
import { BlendFunction, BloomEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtpBloom extends NgtpEffect<BloomEffect> {
|
|
5
|
+
defaultBlendFunction: BlendFunction;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpBloom, never>;
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBloom, "ngtp-bloom", never, {}, {}, never, ["*"], true, never>;
|
|
8
|
+
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { BrightnessContrastEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpBrightnessContrast extends NgtpEffect<BrightnessContrastEffect> {
|
|
5
|
-
get effectConstructor(): typeof BrightnessContrastEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpBrightnessContrast, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBrightnessContrast, "ngtp-brightness-contrast", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpBrightnessContrast, "ngtp-brightness-contrast", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { ColorDepthEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpColorDepth extends NgtpEffect<ColorDepthEffect> {
|
|
5
|
-
get effectConstructor(): typeof ColorDepthEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpColorDepth, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpColorDepth, "ngtp-color-depth", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpColorDepth, "ngtp-color-depth", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { DepthEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpDepth extends NgtpEffect<DepthEffect> {
|
|
5
|
-
get effectConstructor(): typeof DepthEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpDepth, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDepth, "ngtp-depth", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDepth, "ngtp-depth", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { DotScreenEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpDotScreen extends NgtpEffect<DotScreenEffect> {
|
|
5
|
-
get effectConstructor(): typeof DotScreenEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpDotScreen, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDotScreen, "ngtp-dot-screen", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpDotScreen, "ngtp-dot-screen", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { HueSaturationEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpHueSaturation extends NgtpEffect<HueSaturationEffect> {
|
|
5
|
-
get effectConstructor(): typeof HueSaturationEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpHueSaturation, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpHueSaturation, "ngtp-hue-saturation", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpHueSaturation, "ngtp-hue-saturation", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
package/effects/index.d.ts
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
5
|
-
export * from './
|
|
6
|
-
export * from './
|
|
7
|
-
export * from './
|
|
8
|
-
export * from './
|
|
9
|
-
export * from './
|
|
10
|
-
export * from './
|
|
11
|
-
export * from './
|
|
12
|
-
export * from './
|
|
13
|
-
export * from './
|
|
14
|
-
export * from './
|
|
1
|
+
export * from './bloom/bloom';
|
|
2
|
+
export * from './brightness-contrast/brightness-contrast';
|
|
3
|
+
export * from './color-depth/color-depth';
|
|
4
|
+
export * from './depth/depth';
|
|
5
|
+
export * from './dot-screen/dot-screen';
|
|
6
|
+
export * from './hue-saturation/hue-saturation';
|
|
7
|
+
export * from './lut/lut';
|
|
8
|
+
export * from './noise/noise';
|
|
9
|
+
export * from './scanline/scanline';
|
|
10
|
+
export * from './sepia/sepia';
|
|
11
|
+
export * from './shock-wave/shock-wave';
|
|
12
|
+
export * from './smaa/smaa';
|
|
13
|
+
export * from './ssao/ssao';
|
|
14
|
+
export * from './tilt-shift/tilt-shift';
|
|
15
|
+
export * from './tone-mapping/tone-mapping';
|
|
16
|
+
export * from './vignette/vignette';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { NgtSignalStore } from 'angular-three';
|
|
2
|
+
import { BlendFunction, LUT3DEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export interface NgtpLUTState {
|
|
5
|
+
lut: THREE.Texture;
|
|
6
|
+
blendFunction?: BlendFunction;
|
|
7
|
+
tetrahedralInterpolation?: boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare class NgtpLUT extends NgtSignalStore<NgtpLUTState> {
|
|
10
|
+
#private;
|
|
11
|
+
effectRef: import("angular-three").NgtInjectedRef<LUT3DEffect>;
|
|
12
|
+
set lut(lut: THREE.Texture);
|
|
13
|
+
set blendFunction(blendFunction: BlendFunction);
|
|
14
|
+
set tetrahedralInterpolation(tetrahedralInterpolation: boolean);
|
|
15
|
+
readonly effect: import("@angular/core").Signal<LUT3DEffect>;
|
|
16
|
+
constructor();
|
|
17
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpLUT, never>;
|
|
18
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpLUT, "ngtp-lut", never, { "effectRef": { "alias": "effectRef"; "required": false; }; "lut": { "alias": "lut"; "required": true; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "tetrahedralInterpolation": { "alias": "tetrahedralInterpolation"; "required": false; }; }, {}, never, never, true, never>;
|
|
19
|
+
}
|
|
@@ -2,8 +2,7 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { BlendFunction, NoiseEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpNoise extends NgtpEffect<NoiseEffect> {
|
|
5
|
-
|
|
6
|
-
defaultBlendMode: BlendFunction;
|
|
5
|
+
defaultBlendFunction: BlendFunction;
|
|
7
6
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpNoise, never>;
|
|
8
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpNoise, "ngtp-noise", never, {
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpNoise, "ngtp-noise", never, {}, {}, never, ["*"], true, never>;
|
|
9
8
|
}
|
|
@@ -2,8 +2,7 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { BlendFunction, ScanlineEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpScanline extends NgtpEffect<ScanlineEffect> {
|
|
5
|
-
|
|
6
|
-
defaultBlendMode: BlendFunction;
|
|
5
|
+
defaultBlendFunction: BlendFunction;
|
|
7
6
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpScanline, never>;
|
|
8
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpScanline, "ngtp-scanline", never, {
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpScanline, "ngtp-scanline", never, {}, {}, never, ["*"], true, never>;
|
|
9
8
|
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { SepiaEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpSepia extends NgtpEffect<SepiaEffect> {
|
|
5
|
-
get effectConstructor(): typeof SepiaEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSepia, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSepia, "ngtp-sepia", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSepia, "ngtp-sepia", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NgtpEffect } from 'angular-three-postprocessing';
|
|
2
|
+
import { ShockWaveEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtpShockWave extends NgtpEffect<ShockWaveEffect> {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpShockWave, never>;
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpShockWave, "ngtp-noise", never, {}, {}, never, ["*"], true, never>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NgtpEffect } from 'angular-three-postprocessing';
|
|
2
|
+
import { SMAAEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtpSMAA extends NgtpEffect<SMAAEffect> {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSMAA, never>;
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSMAA, "ngtp-SMAA", never, {}, {}, never, ["*"], true, never>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { NgtSignalStore } from 'angular-three';
|
|
2
|
+
import { BlendFunction, SSAOEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export type NgtpSSAOState = NonNullable<ConstructorParameters<typeof SSAOEffect>[2]>;
|
|
5
|
+
export declare class NgtpSSAO extends NgtSignalStore<NgtpSSAOState> {
|
|
6
|
+
#private;
|
|
7
|
+
effectRef: import("angular-three").NgtInjectedRef<SSAOEffect>;
|
|
8
|
+
set blendFunction(blendFunction: BlendFunction);
|
|
9
|
+
set distanceScaling(distanceScaling: boolean);
|
|
10
|
+
set depthAwareUpsampling(depthAwareUpsampling: boolean);
|
|
11
|
+
set normalDepthBuffer(normalDepthBuffer: THREE.Texture);
|
|
12
|
+
set samples(samples: number);
|
|
13
|
+
set rings(rings: number);
|
|
14
|
+
set worldDistanceThreshold(worldDistanceThreshold: number);
|
|
15
|
+
set worldDistanceFalloff(worldDistanceFalloff: number);
|
|
16
|
+
set worldProximityThreshold(worldProximityThreshold: number);
|
|
17
|
+
set worldProximityFalloff(worldProximityFalloff: number);
|
|
18
|
+
set distanceThreshold(distanceThreshold: number);
|
|
19
|
+
set distanceFalloff(distanceFalloff: number);
|
|
20
|
+
set rangeThreshold(rangeThreshold: number);
|
|
21
|
+
set rangeFalloff(rangeFalloff: number);
|
|
22
|
+
set minRadiusScale(minRadiusScale: number);
|
|
23
|
+
set luminanceInfluence(luminanceInfluence: number);
|
|
24
|
+
set radius(radius: number);
|
|
25
|
+
set intensity(intensity: number);
|
|
26
|
+
set bias(bias: number);
|
|
27
|
+
set fade(fade: number);
|
|
28
|
+
set color(color: THREE.Color);
|
|
29
|
+
set resolutionScale(resolutionScale: number);
|
|
30
|
+
set resolutionX(resolutionX: number);
|
|
31
|
+
set resolutionY(resolutionY: number);
|
|
32
|
+
set width(width: number);
|
|
33
|
+
set height(height: number);
|
|
34
|
+
readonly effect: import("@angular/core").Signal<{}>;
|
|
35
|
+
constructor();
|
|
36
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpSSAO, never>;
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpSSAO, "ngtp-SSAO", never, { "effectRef": { "alias": "effectRef"; "required": false; }; "blendFunction": { "alias": "blendFunction"; "required": false; }; "distanceScaling": { "alias": "distanceScaling"; "required": false; }; "depthAwareUpsampling": { "alias": "depthAwareUpsampling"; "required": false; }; "normalDepthBuffer": { "alias": "normalDepthBuffer"; "required": false; }; "samples": { "alias": "samples"; "required": false; }; "rings": { "alias": "rings"; "required": false; }; "worldDistanceThreshold": { "alias": "worldDistanceThreshold"; "required": false; }; "worldDistanceFalloff": { "alias": "worldDistanceFalloff"; "required": false; }; "worldProximityThreshold": { "alias": "worldProximityThreshold"; "required": false; }; "worldProximityFalloff": { "alias": "worldProximityFalloff"; "required": false; }; "distanceThreshold": { "alias": "distanceThreshold"; "required": false; }; "distanceFalloff": { "alias": "distanceFalloff"; "required": false; }; "rangeThreshold": { "alias": "rangeThreshold"; "required": false; }; "rangeFalloff": { "alias": "rangeFalloff"; "required": false; }; "minRadiusScale": { "alias": "minRadiusScale"; "required": false; }; "luminanceInfluence": { "alias": "luminanceInfluence"; "required": false; }; "radius": { "alias": "radius"; "required": false; }; "intensity": { "alias": "intensity"; "required": false; }; "bias": { "alias": "bias"; "required": false; }; "fade": { "alias": "fade"; "required": false; }; "color": { "alias": "color"; "required": false; }; "resolutionScale": { "alias": "resolutionScale"; "required": false; }; "resolutionX": { "alias": "resolutionX"; "required": false; }; "resolutionY": { "alias": "resolutionY"; "required": false; }; "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; }, {}, never, never, true, never>;
|
|
38
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { NgtpEffect } from 'angular-three-postprocessing';
|
|
2
|
+
import { BlendFunction, TiltShiftEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtpTiltShift extends NgtpEffect<TiltShiftEffect> {
|
|
5
|
+
defaultBlendFunction: BlendFunction;
|
|
6
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpTiltShift, never>;
|
|
7
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpTiltShift, "ngtp-tilt-shift", never, {}, {}, never, ["*"], true, never>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NgtpEffect } from 'angular-three-postprocessing';
|
|
2
|
+
import { ToneMappingEffect } from 'postprocessing';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class NgtpToneMapping extends NgtpEffect<ToneMappingEffect> {
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpToneMapping, never>;
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpToneMapping, "ngtp-tone-mapping", never, {}, {}, never, ["*"], true, never>;
|
|
7
|
+
}
|
|
@@ -2,7 +2,6 @@ import { NgtpEffect } from 'angular-three-postprocessing';
|
|
|
2
2
|
import { VignetteEffect } from 'postprocessing';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export declare class NgtpVignette extends NgtpEffect<VignetteEffect> {
|
|
5
|
-
get effectConstructor(): typeof VignetteEffect;
|
|
6
5
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgtpVignette, never>;
|
|
7
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, {
|
|
6
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<NgtpVignette, "ngtp-vignette", never, {}, {}, never, ["*"], true, never>;
|
|
8
7
|
}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Generated bundle index. Do not edit.
|
|
3
3
|
*/
|
|
4
4
|
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10aHJlZS1wb3N0cHJvY2Vzc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMvcG9zdHByb2Nlc3Npbmcvc3JjL2FuZ3VsYXItdGhyZWUtcG9zdHByb2Nlc3NpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0=
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import { CUSTOM_ELEMENTS_SCHEMA, Component, InjectionToken, Input, computed, effect, inject, } from '@angular/core';
|
|
2
|
+
import { NgtSignalStore, NgtStore, extend, injectBeforeRender, injectNgtRef, requestAnimationInInjectionContext, } from 'angular-three';
|
|
3
|
+
import { DepthDownsamplingPass, EffectComposer, EffectPass, NormalPass, RenderPass } from 'postprocessing';
|
|
4
|
+
import * as THREE from 'three';
|
|
5
|
+
import { Group } from 'three';
|
|
6
|
+
import { isWebGL2Available } from 'three-stdlib';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
extend({ Group });
|
|
9
|
+
export const NGTP_EFFECT_COMPOSER_API = new InjectionToken('NgtpEffectComposer API');
|
|
10
|
+
class NgtpEffectComposer extends NgtSignalStore {
|
|
11
|
+
set enabled(enabled) {
|
|
12
|
+
this.set({ enabled });
|
|
13
|
+
}
|
|
14
|
+
set depthBuffer(depthBuffer) {
|
|
15
|
+
this.set({ depthBuffer });
|
|
16
|
+
}
|
|
17
|
+
set disableNormalPass(disableNormalPass) {
|
|
18
|
+
this.set({ disableNormalPass });
|
|
19
|
+
}
|
|
20
|
+
set stencilBuffer(stencilBuffer) {
|
|
21
|
+
this.set({ stencilBuffer });
|
|
22
|
+
}
|
|
23
|
+
set autoClear(autoClear) {
|
|
24
|
+
this.set({ autoClear });
|
|
25
|
+
}
|
|
26
|
+
set resolutionScale(resolutionScale) {
|
|
27
|
+
this.set({ resolutionScale });
|
|
28
|
+
}
|
|
29
|
+
set multisampling(multisampling) {
|
|
30
|
+
this.set({ multisampling });
|
|
31
|
+
}
|
|
32
|
+
set frameBufferType(frameBufferType) {
|
|
33
|
+
this.set({ frameBufferType });
|
|
34
|
+
}
|
|
35
|
+
set renderPriority(renderPriority) {
|
|
36
|
+
this.set({ renderPriority });
|
|
37
|
+
}
|
|
38
|
+
set camera(camera) {
|
|
39
|
+
this.set({ camera });
|
|
40
|
+
}
|
|
41
|
+
set scene(scene) {
|
|
42
|
+
this.set({ scene });
|
|
43
|
+
}
|
|
44
|
+
#store;
|
|
45
|
+
#gl;
|
|
46
|
+
#size;
|
|
47
|
+
#defaultScene;
|
|
48
|
+
#defaultCamera;
|
|
49
|
+
#scene;
|
|
50
|
+
#camera;
|
|
51
|
+
#depthBuffer;
|
|
52
|
+
#stencilBuffer;
|
|
53
|
+
#multisampling;
|
|
54
|
+
#frameBufferType;
|
|
55
|
+
#disableNormalPass;
|
|
56
|
+
#resolutionScale;
|
|
57
|
+
#activeScene;
|
|
58
|
+
#activeCamera;
|
|
59
|
+
#composerEntities;
|
|
60
|
+
constructor() {
|
|
61
|
+
super({
|
|
62
|
+
enabled: true,
|
|
63
|
+
renderPriority: 1,
|
|
64
|
+
autoClear: true,
|
|
65
|
+
multisampling: 8,
|
|
66
|
+
frameBufferType: THREE.HalfFloatType,
|
|
67
|
+
});
|
|
68
|
+
this.composerRef = injectNgtRef();
|
|
69
|
+
this.#store = inject(NgtStore);
|
|
70
|
+
this.#gl = this.#store.select('gl');
|
|
71
|
+
this.#size = this.#store.select('size');
|
|
72
|
+
this.#defaultScene = this.#store.select('scene');
|
|
73
|
+
this.#defaultCamera = this.#store.select('camera');
|
|
74
|
+
this.#scene = this.select('scene');
|
|
75
|
+
this.#camera = this.select('camera');
|
|
76
|
+
this.#depthBuffer = this.select('depthBuffer');
|
|
77
|
+
this.#stencilBuffer = this.select('stencilBuffer');
|
|
78
|
+
this.#multisampling = this.select('multisampling');
|
|
79
|
+
this.#frameBufferType = this.select('frameBufferType');
|
|
80
|
+
this.#disableNormalPass = this.select('disableNormalPass');
|
|
81
|
+
this.#resolutionScale = this.select('resolutionScale');
|
|
82
|
+
this.#activeScene = computed(() => this.#scene() || this.#defaultScene());
|
|
83
|
+
this.#activeCamera = computed(() => this.#camera() || this.#defaultCamera());
|
|
84
|
+
this.#composerEntities = computed(() => {
|
|
85
|
+
const gl = this.#gl();
|
|
86
|
+
const camera = this.#activeCamera();
|
|
87
|
+
const scene = this.#activeScene();
|
|
88
|
+
const depthBuffer = this.#depthBuffer();
|
|
89
|
+
const stencilBuffer = this.#stencilBuffer();
|
|
90
|
+
const multisampling = this.#multisampling();
|
|
91
|
+
const frameBufferType = this.#frameBufferType();
|
|
92
|
+
const disableNormalPass = this.#disableNormalPass();
|
|
93
|
+
const resolutionScale = this.#resolutionScale();
|
|
94
|
+
const webGL2Available = isWebGL2Available();
|
|
95
|
+
// Initialize composer
|
|
96
|
+
const effectComposer = new EffectComposer(gl, {
|
|
97
|
+
depthBuffer,
|
|
98
|
+
stencilBuffer,
|
|
99
|
+
multisampling: multisampling > 0 && webGL2Available ? multisampling : 0,
|
|
100
|
+
frameBufferType,
|
|
101
|
+
});
|
|
102
|
+
// Add render pass
|
|
103
|
+
effectComposer.addPass(new RenderPass(scene, camera));
|
|
104
|
+
// Create normal pass
|
|
105
|
+
let downSamplingPass = null;
|
|
106
|
+
let normalPass = null;
|
|
107
|
+
if (!disableNormalPass) {
|
|
108
|
+
normalPass = new NormalPass(scene, camera);
|
|
109
|
+
normalPass.enabled = false;
|
|
110
|
+
effectComposer.addPass(normalPass);
|
|
111
|
+
if (resolutionScale !== undefined && webGL2Available) {
|
|
112
|
+
downSamplingPass = new DepthDownsamplingPass({ normalBuffer: normalPass.texture, resolutionScale });
|
|
113
|
+
downSamplingPass.enabled = false;
|
|
114
|
+
effectComposer.addPass(downSamplingPass);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return { effectComposer, normalPass, downSamplingPass };
|
|
118
|
+
});
|
|
119
|
+
this.api = computed(() => {
|
|
120
|
+
const { effectComposer, normalPass, downSamplingPass } = this.#composerEntities();
|
|
121
|
+
return {
|
|
122
|
+
composer: effectComposer,
|
|
123
|
+
normalPass,
|
|
124
|
+
downSamplingPass,
|
|
125
|
+
resolutionScale: this.#resolutionScale(),
|
|
126
|
+
camera: this.#activeCamera(),
|
|
127
|
+
scene: this.#activeScene(),
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
requestAnimationInInjectionContext(() => {
|
|
131
|
+
this.#setComposerSize();
|
|
132
|
+
this.#updateEffectPasses();
|
|
133
|
+
this.#setBeforeRender();
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
#setComposerSize() {
|
|
137
|
+
const trigger = computed(() => ({ composer: this.#composerEntities().effectComposer, size: this.#size() }));
|
|
138
|
+
effect(() => {
|
|
139
|
+
const { composer, size } = trigger();
|
|
140
|
+
if (!composer)
|
|
141
|
+
return;
|
|
142
|
+
composer.setSize(size.width, size.height);
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
#updateEffectPasses() {
|
|
146
|
+
const trigger = computed(() => ({
|
|
147
|
+
composerEntities: this.#composerEntities(),
|
|
148
|
+
instance: this.composerRef.nativeElement,
|
|
149
|
+
children: this.composerRef.children('nonObjects')(),
|
|
150
|
+
camera: this.#activeCamera(),
|
|
151
|
+
}));
|
|
152
|
+
effect((onCleanup) => {
|
|
153
|
+
const { composerEntities: { effectComposer, normalPass, downSamplingPass }, instance, children, camera, } = trigger();
|
|
154
|
+
let effectPass;
|
|
155
|
+
if (instance && children.length && effectComposer) {
|
|
156
|
+
effectPass = new EffectPass(camera, ...children);
|
|
157
|
+
effectPass.renderToScreen = true;
|
|
158
|
+
effectComposer.addPass(effectPass);
|
|
159
|
+
if (normalPass)
|
|
160
|
+
normalPass.enabled = true;
|
|
161
|
+
if (downSamplingPass)
|
|
162
|
+
downSamplingPass.enabled = true;
|
|
163
|
+
}
|
|
164
|
+
onCleanup(() => {
|
|
165
|
+
if (effectPass)
|
|
166
|
+
effectComposer?.removePass(effectPass);
|
|
167
|
+
if (normalPass)
|
|
168
|
+
normalPass.enabled = false;
|
|
169
|
+
if (downSamplingPass)
|
|
170
|
+
downSamplingPass.enabled = false;
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
#setBeforeRender() {
|
|
175
|
+
injectBeforeRender(({ delta }) => {
|
|
176
|
+
const enabled = this.get('enabled');
|
|
177
|
+
const autoClear = this.get('autoClear');
|
|
178
|
+
const gl = this.#store.get('gl');
|
|
179
|
+
const { effectComposer } = this.#composerEntities();
|
|
180
|
+
if (enabled && effectComposer) {
|
|
181
|
+
gl.autoClear = autoClear;
|
|
182
|
+
effectComposer.render(delta);
|
|
183
|
+
}
|
|
184
|
+
}, { priority: this.get('enabled') ? this.get('renderPriority') : 0 });
|
|
185
|
+
}
|
|
186
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtpEffectComposer, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
187
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.0", type: NgtpEffectComposer, isStandalone: true, selector: "ngtp-effect-composer", inputs: { enabled: "enabled", depthBuffer: "depthBuffer", disableNormalPass: "disableNormalPass", stencilBuffer: "stencilBuffer", autoClear: "autoClear", resolutionScale: "resolutionScale", multisampling: "multisampling", frameBufferType: "frameBufferType", renderPriority: "renderPriority", camera: "camera", scene: "scene" }, providers: [
|
|
188
|
+
{
|
|
189
|
+
provide: NGTP_EFFECT_COMPOSER_API,
|
|
190
|
+
useFactory: (composer) => composer.api,
|
|
191
|
+
deps: [NgtpEffectComposer],
|
|
192
|
+
},
|
|
193
|
+
], usesInheritance: true, ngImport: i0, template: `
|
|
194
|
+
<ngt-group [ref]="composerRef">
|
|
195
|
+
<ng-content />
|
|
196
|
+
</ngt-group>
|
|
197
|
+
`, isInline: true }); }
|
|
198
|
+
}
|
|
199
|
+
export { NgtpEffectComposer };
|
|
200
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.0", ngImport: i0, type: NgtpEffectComposer, decorators: [{
|
|
201
|
+
type: Component,
|
|
202
|
+
args: [{
|
|
203
|
+
selector: 'ngtp-effect-composer',
|
|
204
|
+
standalone: true,
|
|
205
|
+
template: `
|
|
206
|
+
<ngt-group [ref]="composerRef">
|
|
207
|
+
<ng-content />
|
|
208
|
+
</ngt-group>
|
|
209
|
+
`,
|
|
210
|
+
providers: [
|
|
211
|
+
{
|
|
212
|
+
provide: NGTP_EFFECT_COMPOSER_API,
|
|
213
|
+
useFactory: (composer) => composer.api,
|
|
214
|
+
deps: [NgtpEffectComposer],
|
|
215
|
+
},
|
|
216
|
+
],
|
|
217
|
+
schemas: [CUSTOM_ELEMENTS_SCHEMA],
|
|
218
|
+
}]
|
|
219
|
+
}], ctorParameters: function () { return []; }, propDecorators: { enabled: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], depthBuffer: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], disableNormalPass: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], stencilBuffer: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], autoClear: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}], resolutionScale: [{
|
|
230
|
+
type: Input
|
|
231
|
+
}], multisampling: [{
|
|
232
|
+
type: Input
|
|
233
|
+
}], frameBufferType: [{
|
|
234
|
+
type: Input
|
|
235
|
+
}], renderPriority: [{
|
|
236
|
+
type: Input
|
|
237
|
+
}], camera: [{
|
|
238
|
+
type: Input
|
|
239
|
+
}], scene: [{
|
|
240
|
+
type: Input
|
|
241
|
+
}] } });
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LWNvbXBvc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy9wb3N0cHJvY2Vzc2luZy9zcmMvZWZmZWN0LWNvbXBvc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsU0FBUyxFQUNULGNBQWMsRUFDZCxLQUFLLEVBRUwsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGNBQWMsRUFDZCxRQUFRLEVBQ1IsTUFBTSxFQUNOLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osa0NBQWtDLEdBQ3JDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRyxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQzlCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFakQsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQXlCbEIsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxjQUFjLENBQWdDLHdCQUF3QixDQUFDLENBQUM7QUFFcEgsTUFpQmEsa0JBQW1CLFNBQVEsY0FBdUM7SUFHM0UsSUFBYSxPQUFPLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQWEsV0FBVyxDQUFDLFdBQW9CO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxJQUFhLGlCQUFpQixDQUFDLGlCQUEwQjtR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RSxDQUFDLHNCQUFzQixDQUFDO2lCQUNwQzswRUFJZ0IsT0FBTztzQkFBbkIsS0FBSztnQkFJTyxXQUFXO3NCQUF2QixLQUFLO2dCQUlPLGlCQUFpQjtzQkFBN0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLFNBQVM7c0JBQXJCLEtBQUs7Z0JBSU8sZUFBZTtzQkFBM0IsS0FBSztnQkFJTyxhQUFhO3NCQUF6QixLQUFLO2dCQUlPLGVBQWU7c0JBQTNCLEtBQUs7Z0JBSU8sY0FBYztzQkFBMUIsS0FBSztnQkFJTyxNQUFNO3NCQUFsQixLQUFLO2dCQUlPLEtBQUs7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENVU1RPTV9FTEVNRU5UU19TQ0hFTUEsXG4gICAgQ29tcG9uZW50LFxuICAgIEluamVjdGlvblRva2VuLFxuICAgIElucHV0LFxuICAgIFNpZ25hbCxcbiAgICBjb21wdXRlZCxcbiAgICBlZmZlY3QsXG4gICAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgTmd0U2lnbmFsU3RvcmUsXG4gICAgTmd0U3RvcmUsXG4gICAgZXh0ZW5kLFxuICAgIGluamVjdEJlZm9yZVJlbmRlcixcbiAgICBpbmplY3ROZ3RSZWYsXG4gICAgcmVxdWVzdEFuaW1hdGlvbkluSW5qZWN0aW9uQ29udGV4dCxcbn0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBEZXB0aERvd25zYW1wbGluZ1Bhc3MsIEVmZmVjdENvbXBvc2VyLCBFZmZlY3RQYXNzLCBOb3JtYWxQYXNzLCBSZW5kZXJQYXNzIH0gZnJvbSAncG9zdHByb2Nlc3NpbmcnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tICd0aHJlZSc7XG5pbXBvcnQgeyBpc1dlYkdMMkF2YWlsYWJsZSB9IGZyb20gJ3RocmVlLXN0ZGxpYic7XG5cbmV4dGVuZCh7IEdyb3VwIH0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndHBFZmZlY3RDb21wb3NlclN0YXRlIHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGRlcHRoQnVmZmVyPzogYm9vbGVhbjtcbiAgICBkaXNhYmxlTm9ybWFsUGFzcz86IGJvb2xlYW47XG4gICAgc3RlbmNpbEJ1ZmZlcj86IGJvb2xlYW47XG4gICAgYXV0b0NsZWFyOiBib29sZWFuO1xuICAgIHJlc29sdXRpb25TY2FsZT86IG51bWJlcjtcbiAgICBtdWx0aXNhbXBsaW5nOiBudW1iZXI7XG4gICAgZnJhbWVCdWZmZXJUeXBlOiBUSFJFRS5UZXh0dXJlRGF0YVR5cGU7XG4gICAgcmVuZGVyUHJpb3JpdHk6IG51bWJlcjtcbiAgICBjYW1lcmE/OiBUSFJFRS5DYW1lcmE7XG4gICAgc2NlbmU/OiBUSFJFRS5TY2VuZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RwRWZmZWN0Q29tcG9zZXJBcGkge1xuICAgIGNvbXBvc2VyOiBFZmZlY3RDb21wb3NlcjtcbiAgICBub3JtYWxQYXNzOiBOb3JtYWxQYXNzIHwgbnVsbDtcbiAgICBkb3duU2FtcGxpbmdQYXNzOiBEZXB0aERvd25zYW1wbGluZ1Bhc3MgfCBudWxsO1xuICAgIGNhbWVyYTogVEhSRUUuQ2FtZXJhO1xuICAgIHNjZW5lOiBUSFJFRS5TY2VuZTtcbiAgICByZXNvbHV0aW9uU2NhbGU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBOR1RQX0VGRkVDVF9DT01QT1NFUl9BUEkgPSBuZXcgSW5qZWN0aW9uVG9rZW48U2lnbmFsPE5ndHBFZmZlY3RDb21wb3NlckFwaT4+KCdOZ3RwRWZmZWN0Q29tcG9zZXIgQVBJJyk7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbmd0cC1lZmZlY3QtY29tcG9zZXInLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPG5ndC1ncm91cCBbcmVmXT1cImNvbXBvc2VyUmVmXCI+XG4gICAgICAgICAgICA8bmctY29udGVudCAvPlxuICAgICAgICA8L25ndC1ncm91cD5cbiAgICBgLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR1RQX0VGRkVDVF9DT01QT1NFUl9BUEksXG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoY29tcG9zZXI6IE5ndHBFZmZlY3RDb21wb3NlcikgPT4gY29tcG9zZXIuYXBpLFxuICAgICAgICAgICAgZGVwczogW05ndHBFZmZlY3RDb21wb3Nlcl0sXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndHBFZmZlY3RDb21wb3NlciBleHRlbmRzIE5ndFNpZ25hbFN0b3JlPE5ndHBFZmZlY3RDb21wb3NlclN0YXRlPiB7XG4gICAgcmVhZG9ubHkgY29tcG9zZXJSZWYgPSBpbmplY3ROZ3RSZWY8VEhSRUUuR3JvdXA+KCk7XG5cbiAgICBASW5wdXQoKSBzZXQgZW5hYmxlZChlbmFibGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgZW5hYmxlZCB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGVwdGhCdWZmZXIoZGVwdGhCdWZmZXI6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkZXB0aEJ1ZmZlciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgZGlzYWJsZU5vcm1hbFBhc3MoZGlzYWJsZU5vcm1hbFBhc3M6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zZXQoeyBkaXNhYmxlTm9ybWFsUGFzcyB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgc3RlbmNpbEJ1ZmZlcihzdGVuY2lsQnVmZmVyOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgc3RlbmNpbEJ1ZmZlciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgYXV0b0NsZWFyKGF1dG9DbGVhcjogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNldCh7IGF1dG9DbGVhciB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgcmVzb2x1dGlvblNjYWxlKHJlc29sdXRpb25TY2FsZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgcmVzb2x1dGlvblNjYWxlIH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBtdWx0aXNhbXBsaW5nKG11bHRpc2FtcGxpbmc6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IG11bHRpc2FtcGxpbmcgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IGZyYW1lQnVmZmVyVHlwZShmcmFtZUJ1ZmZlclR5cGU6IFRIUkVFLlRleHR1cmVEYXRhVHlwZSkge1xuICAgICAgICB0aGlzLnNldCh7IGZyYW1lQnVmZmVyVHlwZSB9KTtcbiAgICB9XG5cbiAgICBASW5wdXQoKSBzZXQgcmVuZGVyUHJpb3JpdHkocmVuZGVyUHJpb3JpdHk6IG51bWJlcikge1xuICAgICAgICB0aGlzLnNldCh7IHJlbmRlclByaW9yaXR5IH0pO1xuICAgIH1cblxuICAgIEBJbnB1dCgpIHNldCBjYW1lcmEoY2FtZXJhOiBUSFJFRS5DYW1lcmEpIHtcbiAgICAgICAgdGhpcy5zZXQoeyBjYW1lcmEgfSk7XG4gICAgfVxuXG4gICAgQElucHV0KCkgc2V0IHNjZW5lKHNjZW5lOiBUSFJFRS5TY2VuZSkge1xuICAgICAgICB0aGlzLnNldCh7IHNjZW5lIH0pO1xuICAgIH1cblxuICAgIHJlYWRvbmx5ICNzdG9yZSA9IGluamVjdChOZ3RTdG9yZSk7XG4gICAgcmVhZG9ubHkgI2dsID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdnbCcpO1xuICAgIHJlYWRvbmx5ICNzaXplID0gdGhpcy4jc3RvcmUuc2VsZWN0KCdzaXplJyk7XG4gICAgcmVhZG9ubHkgI2RlZmF1bHRTY2VuZSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnc2NlbmUnKTtcbiAgICByZWFkb25seSAjZGVmYXVsdENhbWVyYSA9IHRoaXMuI3N0b3JlLnNlbGVjdCgnY2FtZXJhJyk7XG5cbiAgICByZWFkb25seSAjc2NlbmUgPSB0aGlzLnNlbGVjdCgnc2NlbmUnKTtcbiAgICByZWFkb25seSAjY2FtZXJhID0gdGhpcy5zZWxlY3QoJ2NhbWVyYScpO1xuXG4gICAgcmVhZG9ubHkgI2RlcHRoQnVmZmVyID0gdGhpcy5zZWxlY3QoJ2RlcHRoQnVmZmVyJyk7XG4gICAgcmVhZG9ubHkgI3N0ZW5jaWxCdWZmZXIgPSB0aGlzLnNlbGVjdCgnc3RlbmNpbEJ1ZmZlcicpO1xuICAgIHJlYWRvbmx5ICNtdWx0aXNhbXBsaW5nID0gdGhpcy5zZWxlY3QoJ211bHRpc2FtcGxpbmcnKTtcbiAgICByZWFkb25seSAjZnJhbWVCdWZmZXJUeXBlID0gdGhpcy5zZWxlY3QoJ2ZyYW1lQnVmZmVyVHlwZScpO1xuICAgIHJlYWRvbmx5ICNkaXNhYmxlTm9ybWFsUGFzcyA9IHRoaXMuc2VsZWN0KCdkaXNhYmxlTm9ybWFsUGFzcycpO1xuICAgIHJlYWRvbmx5ICNyZXNvbHV0aW9uU2NhbGUgPSB0aGlzLnNlbGVjdCgncmVzb2x1dGlvblNjYWxlJyk7XG5cbiAgICByZWFkb25seSAjYWN0aXZlU2NlbmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLiNzY2VuZSgpIHx8IHRoaXMuI2RlZmF1bHRTY2VuZSgpKTtcbiAgICByZWFkb25seSAjYWN0aXZlQ2FtZXJhID0gY29tcHV0ZWQoKCkgPT4gdGhpcy4jY2FtZXJhKCkgfHwgdGhpcy4jZGVmYXVsdENhbWVyYSgpKTtcblxuICAgIHJlYWRvbmx5ICNjb21wb3NlckVudGl0aWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBnbCA9IHRoaXMuI2dsKCk7XG4gICAgICAgIGNvbnN0IGNhbWVyYSA9IHRoaXMuI2FjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBjb25zdCBzY2VuZSA9IHRoaXMuI2FjdGl2ZVNjZW5lKCk7XG4gICAgICAgIGNvbnN0IGRlcHRoQnVmZmVyID0gdGhpcy4jZGVwdGhCdWZmZXIoKTtcbiAgICAgICAgY29uc3Qgc3RlbmNpbEJ1ZmZlciA9IHRoaXMuI3N0ZW5jaWxCdWZmZXIoKTtcbiAgICAgICAgY29uc3QgbXVsdGlzYW1wbGluZyA9IHRoaXMuI211bHRpc2FtcGxpbmcoKTtcbiAgICAgICAgY29uc3QgZnJhbWVCdWZmZXJUeXBlID0gdGhpcy4jZnJhbWVCdWZmZXJUeXBlKCk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVOb3JtYWxQYXNzID0gdGhpcy4jZGlzYWJsZU5vcm1hbFBhc3MoKTtcbiAgICAgICAgY29uc3QgcmVzb2x1dGlvblNjYWxlID0gdGhpcy4jcmVzb2x1dGlvblNjYWxlKCk7XG5cbiAgICAgICAgY29uc3Qgd2ViR0wyQXZhaWxhYmxlID0gaXNXZWJHTDJBdmFpbGFibGUoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb21wb3NlclxuICAgICAgICBjb25zdCBlZmZlY3RDb21wb3NlciA9IG5ldyBFZmZlY3RDb21wb3NlcihnbCwge1xuICAgICAgICAgICAgZGVwdGhCdWZmZXIsXG4gICAgICAgICAgICBzdGVuY2lsQnVmZmVyLFxuICAgICAgICAgICAgbXVsdGlzYW1wbGluZzogbXVsdGlzYW1wbGluZyA+IDAgJiYgd2ViR0wyQXZhaWxhYmxlID8gbXVsdGlzYW1wbGluZyA6IDAsXG4gICAgICAgICAgICBmcmFtZUJ1ZmZlclR5cGUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFkZCByZW5kZXIgcGFzc1xuICAgICAgICBlZmZlY3RDb21wb3Nlci5hZGRQYXNzKG5ldyBSZW5kZXJQYXNzKHNjZW5lLCBjYW1lcmEpKTtcblxuICAgICAgICAvLyBDcmVhdGUgbm9ybWFsIHBhc3NcbiAgICAgICAgbGV0IGRvd25TYW1wbGluZ1Bhc3MgPSBudWxsO1xuICAgICAgICBsZXQgbm9ybWFsUGFzcyA9IG51bGw7XG4gICAgICAgIGlmICghZGlzYWJsZU5vcm1hbFBhc3MpIHtcbiAgICAgICAgICAgIG5vcm1hbFBhc3MgPSBuZXcgTm9ybWFsUGFzcyhzY2VuZSwgY2FtZXJhKTtcbiAgICAgICAgICAgIG5vcm1hbFBhc3MuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZWZmZWN0Q29tcG9zZXIuYWRkUGFzcyhub3JtYWxQYXNzKTtcbiAgICAgICAgICAgIGlmIChyZXNvbHV0aW9uU2NhbGUgIT09IHVuZGVmaW5lZCAmJiB3ZWJHTDJBdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICBkb3duU2FtcGxpbmdQYXNzID0gbmV3IERlcHRoRG93bnNhbXBsaW5nUGFzcyh7IG5vcm1hbEJ1ZmZlcjogbm9ybWFsUGFzcy50ZXh0dXJlLCByZXNvbHV0aW9uU2NhbGUgfSk7XG4gICAgICAgICAgICAgICAgZG93blNhbXBsaW5nUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZWZmZWN0Q29tcG9zZXIuYWRkUGFzcyhkb3duU2FtcGxpbmdQYXNzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGVmZmVjdENvbXBvc2VyLCBub3JtYWxQYXNzLCBkb3duU2FtcGxpbmdQYXNzIH07XG4gICAgfSk7XG5cbiAgICByZWFkb25seSBhcGkgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZWZmZWN0Q29tcG9zZXIsIG5vcm1hbFBhc3MsIGRvd25TYW1wbGluZ1Bhc3MgfSA9IHRoaXMuI2NvbXBvc2VyRW50aXRpZXMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbXBvc2VyOiBlZmZlY3RDb21wb3NlcixcbiAgICAgICAgICAgIG5vcm1hbFBhc3MsXG4gICAgICAgICAgICBkb3duU2FtcGxpbmdQYXNzLFxuICAgICAgICAgICAgcmVzb2x1dGlvblNjYWxlOiB0aGlzLiNyZXNvbHV0aW9uU2NhbGUoKSxcbiAgICAgICAgICAgIGNhbWVyYTogdGhpcy4jYWN0aXZlQ2FtZXJhKCksXG4gICAgICAgICAgICBzY2VuZTogdGhpcy4jYWN0aXZlU2NlbmUoKSxcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgcmVuZGVyUHJpb3JpdHk6IDEsXG4gICAgICAgICAgICBhdXRvQ2xlYXI6IHRydWUsXG4gICAgICAgICAgICBtdWx0aXNhbXBsaW5nOiA4LFxuICAgICAgICAgICAgZnJhbWVCdWZmZXJUeXBlOiBUSFJFRS5IYWxmRmxvYXRUeXBlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkluSW5qZWN0aW9uQ29udGV4dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLiNzZXRDb21wb3NlclNpemUoKTtcbiAgICAgICAgICAgIHRoaXMuI3VwZGF0ZUVmZmVjdFBhc3NlcygpO1xuICAgICAgICAgICAgdGhpcy4jc2V0QmVmb3JlUmVuZGVyKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICNzZXRDb21wb3NlclNpemUoKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb21wdXRlZCgoKSA9PiAoeyBjb21wb3NlcjogdGhpcy4jY29tcG9zZXJFbnRpdGllcygpLmVmZmVjdENvbXBvc2VyLCBzaXplOiB0aGlzLiNzaXplKCkgfSkpO1xuICAgICAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb21wb3Nlciwgc2l6ZSB9ID0gdHJpZ2dlcigpO1xuICAgICAgICAgICAgaWYgKCFjb21wb3NlcikgcmV0dXJuO1xuICAgICAgICAgICAgY29tcG9zZXIuc2V0U2l6ZShzaXplLndpZHRoLCBzaXplLmhlaWdodCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgICN1cGRhdGVFZmZlY3RQYXNzZXMoKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXIgPSBjb21wdXRlZCgoKSA9PiAoe1xuICAgICAgICAgICAgY29tcG9zZXJFbnRpdGllczogdGhpcy4jY29tcG9zZXJFbnRpdGllcygpLFxuICAgICAgICAgICAgaW5zdGFuY2U6IHRoaXMuY29tcG9zZXJSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLmNvbXBvc2VyUmVmLmNoaWxkcmVuKCdub25PYmplY3RzJykoKSxcbiAgICAgICAgICAgIGNhbWVyYTogdGhpcy4jYWN0aXZlQ2FtZXJhKCksXG4gICAgICAgIH0pKTtcbiAgICAgICAgZWZmZWN0KChvbkNsZWFudXApID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgICBjb21wb3NlckVudGl0aWVzOiB7IGVmZmVjdENvbXBvc2VyLCBub3JtYWxQYXNzLCBkb3duU2FtcGxpbmdQYXNzIH0sXG4gICAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgY2FtZXJhLFxuICAgICAgICAgICAgfSA9IHRyaWdnZXIoKTtcblxuICAgICAgICAgICAgbGV0IGVmZmVjdFBhc3M6IEVmZmVjdFBhc3M7XG4gICAgICAgICAgICBpZiAoaW5zdGFuY2UgJiYgY2hpbGRyZW4ubGVuZ3RoICYmIGVmZmVjdENvbXBvc2VyKSB7XG4gICAgICAgICAgICAgICAgZWZmZWN0UGFzcyA9IG5ldyBFZmZlY3RQYXNzKGNhbWVyYSwgLi4uY2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgIGVmZmVjdFBhc3MucmVuZGVyVG9TY3JlZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGVmZmVjdENvbXBvc2VyLmFkZFBhc3MoZWZmZWN0UGFzcyk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbFBhc3MpIG5vcm1hbFBhc3MuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKGRvd25TYW1wbGluZ1Bhc3MpIGRvd25TYW1wbGluZ1Bhc3MuZW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVmZmVjdFBhc3MpIGVmZmVjdENvbXBvc2VyPy5yZW1vdmVQYXNzKGVmZmVjdFBhc3MpO1xuICAgICAgICAgICAgICAgIGlmIChub3JtYWxQYXNzKSBub3JtYWxQYXNzLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZG93blNhbXBsaW5nUGFzcykgZG93blNhbXBsaW5nUGFzcy5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgI3NldEJlZm9yZVJlbmRlcigpIHtcbiAgICAgICAgaW5qZWN0QmVmb3JlUmVuZGVyKFxuICAgICAgICAgICAgKHsgZGVsdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVuYWJsZWQgPSB0aGlzLmdldCgnZW5hYmxlZCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9DbGVhciA9IHRoaXMuZ2V0KCdhdXRvQ2xlYXInKTtcbiAgICAgICAgICAgICAgICBjb25zdCBnbCA9IHRoaXMuI3N0b3JlLmdldCgnZ2wnKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGVmZmVjdENvbXBvc2VyIH0gPSB0aGlzLiNjb21wb3NlckVudGl0aWVzKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQgJiYgZWZmZWN0Q29tcG9zZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2wuYXV0b0NsZWFyID0gYXV0b0NsZWFyO1xuICAgICAgICAgICAgICAgICAgICBlZmZlY3RDb21wb3Nlci5yZW5kZXIoZGVsdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHByaW9yaXR5OiB0aGlzLmdldCgnZW5hYmxlZCcpID8gdGhpcy5nZXQoJ3JlbmRlclByaW9yaXR5JykgOiAwIH1cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=
|